Subversion Repositories Kolibri OS

Rev

Rev 6088 | Rev 6131 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2340 Serge 1
 
2
3
 
5060 serge 4
#include 
5
#include "i915_drv.h"
2338 Serge 6
#include "intel_drv.h"
7
#include 
8
#include 
9
#include 
10
11
 
12
13
 
2340 Serge 14
#include 
5354 serge 15
2338 Serge 16
 
17
 
5354 serge 18
struct drm_i915_gem_object *main_fb_obj;
4560 Serge 19
struct drm_framebuffer     *main_framebuffer;
6084 serge 20
2338 Serge 21
 
5354 serge 22
u32 cmd_offset;
23
2340 Serge 24
 
2351 Serge 25
int  sna_init();
26
27
 
2338 Serge 28
static void       __stdcall move_cursor_kms(cursor_t *cursor, int x, int y);
29
30
 
31
{};
32
33
 
34
{};
35
36
 
6088 serge 37
4560 Serge 38
 
3031 serge 39
{
40
    static char name[4];
41
42
 
43
    name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xE0) >> 5) + '@';
44
    name[2] = (x[1] & 0x1F) + '@';
45
    name[3] = 0;
46
47
 
48
}
49
50
 
6088 serge 51
{
52
    struct drm_display_mode  *mode;
53
    int count = 0;
54
55
 
56
        count++;
57
58
 
59
};
60
61
 
5060 serge 62
                    struct drm_crtc *crtc, videomode_t *reqmode, bool strict)
63
{
3031 serge 64
    struct drm_i915_private *dev_priv   = dev->dev_private;
5060 serge 65
3031 serge 66
 
67
    struct drm_display_mode *mode       = NULL, *tmpmode;
68
    struct drm_connector    *tmpc;
6088 serge 69
    struct drm_framebuffer  *fb         = NULL;
3031 serge 70
    struct drm_mode_set     set;
71
    const char *con_name;
4371 Serge 72
    unsigned hdisplay, vdisplay;
3031 serge 73
    int stride;
4557 Serge 74
    int ret;
3031 serge 75
76
 
5060 serge 77
3031 serge 78
 
6088 serge 79
    {
80
        const struct drm_connector_funcs *f = tmpc->funcs;
81
        if(tmpc == connector)
82
            continue;
83
        f->dpms(tmpc, DRM_MODE_DPMS_OFF);
84
    };
85
86
 
3031 serge 87
    {
88
        if( (tmpmode->hdisplay == reqmode->width)  &&
5060 serge 89
            (tmpmode->vdisplay == reqmode->height) &&
90
            (drm_mode_vrefresh(tmpmode) == reqmode->freq) )
3031 serge 91
        {
92
            mode = tmpmode;
93
            goto do_set;
94
        }
95
    };
96
97
 
98
    {
99
        list_for_each_entry(tmpmode, &connector->modes, head)
100
        {
101
            if( (tmpmode->hdisplay == reqmode->width)  &&
5060 serge 102
                (tmpmode->vdisplay == reqmode->height) )
103
            {
3031 serge 104
                mode = tmpmode;
105
                goto do_set;
106
            }
107
        };
108
    };
109
110
 
3037 serge 111
3031 serge 112
 
113
114
 
115
116
 
6088 serge 117
 
5060 serge 118
3031 serge 119
 
6088 serge 120
121
 
122
    DRM_DEBUG_KMS("Manufacturer: %s Model %x Serial Number %u\n",
123
            manufacturer_name(con_edid + 0x08),
124
            (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
125
            (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
126
            + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
127
128
 
5060 serge 129
              reqmode->width, reqmode->height, crtc->base.id,
3031 serge 130
              con_name);
5060 serge 131
3031 serge 132
 
133
134
 
135
    vdisplay = mode->vdisplay;
136
137
 
6084 serge 138
//        swap(hdisplay, vdisplay);
139
3031 serge 140
 
5060 serge 141
    if(fb == NULL)
6084 serge 142
        fb = main_framebuffer;
143
3031 serge 144
 
145
    fb->height = reqmode->height;
146
147
 
6084 serge 148
4280 Serge 149
 
5060 serge 150
    {
151
        if(IS_GEN3(dev))
4557 Serge 152
            for (stride = 512; stride < reqmode->width * 4; stride <<= 1);
153
        else
154
            stride = ALIGN(reqmode->width * 4, 512);
155
    }
156
    else
157
    {
158
        stride = ALIGN(reqmode->width * 4, 64);
159
    }
160
4280 Serge 161
 
4557 Serge 162
    fb->pitches[1]  =
163
    fb->pitches[2]  =
164
    fb->pitches[3]  = stride;
165
166
 
4560 Serge 167
4557 Serge 168
 
3031 serge 169
    fb->depth = 24;
170
171
 
172
    os_display->crtc = crtc;
173
174
 
4560 Serge 175
4280 Serge 176
 
6084 serge 177
            fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format);
178
179
 
3031 serge 180
    set.x = 0;
181
    set.y = 0;
182
    set.mode = mode;
183
    set.connectors = &connector;
184
    set.num_connectors = 1;
185
    set.fb = fb;
186
187
 
5060 serge 188
189
 
3031 serge 190
    {
191
        os_display->width    = fb->width;
192
        os_display->height   = fb->height;
193
        os_display->vrefresh = drm_mode_vrefresh(mode);
194
195
 
196
197
 
3037 serge 198
                       fb->width, fb->height, fb->pitches[0]);
3031 serge 199
    }
200
    else
201
        DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
202
                   fb->width, fb->height, crtc);
203
204
 
6084 serge 205
206
 
3031 serge 207
}
208
209
 
6088 serge 210
                       struct drm_connector *connector, struct drm_display_mode *mode)
211
{
2338 Serge 212
    struct drm_i915_private *dev_priv = dev->dev_private;
6088 serge 213
    struct drm_connector    *tmpc;
214
    struct drm_mode_config  *config   = &dev->mode_config;
215
    struct drm_framebuffer  *fb       = NULL;
216
    struct drm_mode_set     set;
217
    char  con_edid[128];
218
    int stride;
219
    int ret;
220
2338 Serge 221
 
6088 serge 222
223
 
224
    {
2338 Serge 225
        const struct drm_connector_funcs *f = tmpc->funcs;
6088 serge 226
        if(tmpc == connector)
227
            continue;
228
        f->dpms(tmpc, DRM_MODE_DPMS_OFF);
229
    };
2338 Serge 230
6088 serge 231
 
232
233
 
234
    if(fb == NULL)
235
        fb = main_framebuffer;
236
237
 
238
    fb->height = mode->vdisplay;;
239
240
 
241
242
 
243
    {
244
        if(IS_GEN3(dev))
245
            for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1);
246
        else
247
            stride = ALIGN(mode->hdisplay * 4, 512);
248
    }
249
    else
250
    {
251
        stride = ALIGN(mode->hdisplay * 4, 64);
252
    }
253
254
 
255
    fb->pitches[1]  =
256
    fb->pitches[2]  =
257
    fb->pitches[3]  = stride;
258
259
 
260
261
 
262
    fb->depth = 24;
263
264
 
265
266
 
267
268
 
269
    DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n"
270
                  "monitor: %s model %x serial number %u\n",
271
                fb->width, fb->height,
272
                connector->encoder->crtc->base.id, connector->name,
273
                manufacturer_name(con_edid + 0x08),
274
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
275
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
276
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
277
278
 
279
            fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format);
280
281
 
282
    set.x = 0;
283
    set.y = 0;
284
    set.mode = mode;
285
    set.connectors = &connector;
286
    set.num_connectors = 1;
287
    set.fb = fb;
288
289
 
290
    if ( !ret )
291
    {
292
        struct drm_crtc *crtc = os_display->crtc;
293
294
 
295
        os_display->height   = fb->height;
296
        os_display->vrefresh = drm_mode_vrefresh(mode);
297
298
 
299
300
 
301
        os_display->crtc = connector->encoder->crtc;
302
        os_display->supported_modes = count_connector_modes(connector);
303
304
 
305
        crtc->cursor_y = os_display->height/2;
306
307
 
308
309
 
310
                       fb->width, fb->height, fb->pitches[0]);
311
    }
312
    else
313
        DRM_ERROR(" failed to set mode %d_%d on crtc %p\n",
314
                   fb->width, fb->height, connector->encoder->crtc);
315
316
 
317
318
 
319
}
320
321
 
322
{
323
    struct drm_display_mode *mode;
324
    int retval;
325
326
 
327
    if(mode == NULL)
328
        return EINVAL;
329
330
 
331
332
 
333
    return retval;
334
};
2338 Serge 335
336
 
5060 serge 337
{
3031 serge 338
    struct drm_crtc *tmp_crtc;
5060 serge 339
    int crtc_mask = 1;
340
3031 serge 341
 
5060 serge 342
    {
3031 serge 343
        if (encoder->possible_crtcs & crtc_mask)
5060 serge 344
        {
6084 serge 345
            encoder->crtc = tmp_crtc;
5060 serge 346
            DRM_DEBUG_KMS("use CRTC %p ID %d\n", tmp_crtc, tmp_crtc->base.id);
347
            return tmp_crtc;
348
        };
349
        crtc_mask <<= 1;
350
    };
3031 serge 351
    return NULL;
5060 serge 352
};
3031 serge 353
354
 
6088 serge 355
{
2338 Serge 356
    const struct drm_connector_helper_funcs *connector_funcs;
6088 serge 357
    struct drm_encoder   *encoder;
4560 Serge 358
    struct drm_crtc      *crtc;
5060 serge 359
2338 Serge 360
 
6088 serge 361
        return -EINVAL;
362
363
 
364
365
 
366
    {
367
        connector_funcs = connector->helper_private;
368
        encoder = connector_funcs->best_encoder(connector);
369
370
 
371
        {
372
            DRM_DEBUG_KMS("CONNECTOR %s ID: %d no active encoders\n",
373
            connector->name, connector->base.id);
374
            return -EINVAL;
375
        };
376
    }
377
378
 
379
    if(crtc == NULL)
380
        crtc = get_possible_crtc(dev, encoder);
381
382
 
383
    {
384
        encoder->crtc = crtc;
385
        return 0;
386
    }
387
    else
388
        DRM_DEBUG_KMS("No CRTC for encoder %d\n", encoder->base.id);
389
    return -EINVAL;
390
}
391
392
 
393
{
394
    struct drm_connector *connector;
395
396
 
5060 serge 397
    {
2338 Serge 398
        int name_len = __builtin_strlen(connector->name);
6088 serge 399
400
 
401
            continue;
2338 Serge 402
403
 
6088 serge 404
            continue;
405
5060 serge 406
 
6088 serge 407
            return connector;
408
    }
409
    return NULL;
410
}
411
5060 serge 412
 
2338 Serge 413
 
6088 serge 414
                  struct drm_crtc **boot_crtc)
415
{
416
    struct drm_connector *connector;
6103 serge 417
4371 Serge 418
 
6088 serge 419
    {
420
        connector = get_cmdline_connector(dev, i915.cmdline_mode);
421
        if(connector != NULL)
422
        {
5060 serge 423
            *boot_connector = connector;
424
            *boot_crtc = connector->encoder->crtc;
6088 serge 425
            return 0;
5060 serge 426
        }
427
    }
6088 serge 428
5060 serge 429
 
6088 serge 430
    {
431
        if(check_connector(dev, connector) == 0)
432
        {
433
            *boot_connector = connector;
434
            *boot_crtc = connector->encoder->crtc;
435
            return 0;
436
        };
437
    };
2338 Serge 438
439
 
5060 serge 440
};
4398 Serge 441
2338 Serge 442
 
6103 serge 443
 
5060 serge 444
{
4371 Serge 445
    struct drm_display_mode *mode;
446
447
 
448
    {
449
        if( os_display->width  == mode->hdisplay &&
5060 serge 450
            os_display->height == mode->vdisplay &&
451
            drm_mode_vrefresh(mode) == 60)
4371 Serge 452
        {
453
            usermode->width  = os_display->width;
454
            usermode->height = os_display->height;
455
            usermode->freq   = 60;
456
            return 1;
457
        }
458
    }
459
    return 0;
460
}
461
462
 
463
{
464
    struct drm_connector_helper_funcs *connector_funcs;
465
    struct drm_connector    *connector = NULL;
5060 serge 466
    struct drm_crtc         *crtc = NULL;
467
    struct drm_framebuffer  *fb;
4371 Serge 468
469
 
470
    u32      ifl;
5354 serge 471
    int       ret;
6084 serge 472
4371 Serge 473
 
474
    ret = choose_config(dev, &connector, &crtc);
5060 serge 475
    if(ret)
476
    {
4371 Serge 477
        mutex_unlock(&dev->mode_config.mutex);
6088 serge 478
        DRM_DEBUG_KMS("No active connectors!\n");
4371 Serge 479
        return -1;
480
    };
481
482
 
5060 serge 483
    idr_preload(GFP_KERNEL);
484
4371 Serge 485
 
5060 serge 486
        ret = idr_alloc(&dev->object_name_idr, &main_fb_obj->base, 1, 0, GFP_NOWAIT);
487
4371 Serge 488
 
5060 serge 489
        main_fb_obj->base.handle_count++;
6084 serge 490
        DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, main_fb_obj->base.name );
5060 serge 491
    }
492
493
 
494
    mutex_unlock(&dev->object_name_lock);
495
496
 
2338 Serge 497
    os_display->ddev = dev;
498
    os_display->connector = connector;
499
    os_display->crtc = crtc;
500
    os_display->supported_modes = count_connector_modes(connector);
501
    mutex_unlock(&dev->mode_config.mutex);
6088 serge 502
2338 Serge 503
 
6088 serge 504
    mutex_lock(&dev->struct_mutex);
505
506
 
2338 Serge 507
    {
508
        list_for_each_entry(cursor, &os_display->cursors, list)
509
        {
510
            init_cursor(cursor);
511
        };
512
513
 
514
        os_display->init_cursor    = init_cursor;
515
        os_display->select_cursor  = select_cursor_kms;
516
        os_display->show_cursor    = NULL;
517
        os_display->move_cursor    = move_cursor_kms;
518
        os_display->restore_cursor = restore_cursor;
519
        os_display->disable_mouse  = disable_mouse;
520
521
 
5060 serge 522
        crtc->cursor_y = os_display->height/2;
523
2338 Serge 524
 
525
    };
526
    safe_sti(ifl);
527
528
 
6088 serge 529
530
 
531
532
 
533
        ret = set_cmdline_mode(dev, connector);
534
535
 
536
    {
4280 Serge 537
        mutex_lock(&dev->mode_config.mutex);
6088 serge 538
539
 
540
            (usermode->height == 0))
541
        {
4371 Serge 542
            if( !get_boot_mode(connector, usermode))
6088 serge 543
            {
544
                struct drm_display_mode *mode;
545
4280 Serge 546
 
6088 serge 547
                usermode->width  = mode->hdisplay;
548
                usermode->height = mode->vdisplay;
549
                usermode->freq   = drm_mode_vrefresh(mode);
550
            };
551
        };
4280 Serge 552
        mutex_unlock(&dev->mode_config.mutex);
6088 serge 553
554
 
555
    };
4280 Serge 556
557
 
3243 Serge 558
    err = init_bitmaps();
2342 Serge 559
#endif
3243 Serge 560
2340 Serge 561
 
6088 serge 562
};
2338 Serge 563
564
 
565
 
6088 serge 566
{
567
    struct drm_connector_helper_funcs *connector_funcs;
568
    struct drm_connector    *connector;
569
    struct drm_cmdline_mode cmd_mode = {0};
6103 serge 570
    struct drm_display_mode *mode;
6088 serge 571
    char *mode_option;
572
    int retval = 0;
573
    char  con_edid[128];
574
575
 
576
        return EINVAL;
577
578
 
579
    connector = get_cmdline_connector(dev, cmdline);
580
    mutex_unlock(&dev->mode_config.mutex);
581
582
 
583
        return EINVAL;
584
585
 
586
    if(mode_option == NULL)
587
        return EINVAL;
588
589
 
590
591
 
592
        return EINVAL;
593
594
 
595
                   connector->name,
596
                   cmd_mode.xres, cmd_mode.yres,
597
                   cmd_mode.refresh_specified ? cmd_mode.refresh : 60,
598
                   cmd_mode.rb ? " reduced blanking" : "",
599
                   cmd_mode.margins ? " with margins" : "",
600
                   cmd_mode.interlace ?  " interlaced" : "");
601
602
 
603
    if(mode == NULL)
604
        return EINVAL;
605
606
 
607
    DRM_DEBUG_KMS("connector: %s monitor: %s model %x serial number %u\n",
608
            connector->name,
609
            manufacturer_name(con_edid + 0x08),
610
            (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
611
            (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
612
            + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
613
614
 
615
616
 
617
618
 
619
}
620
621
 
6103 serge 622
{
623
    struct drm_connector *connector;
624
    char  con_edid[128];
625
626
 
627
    list_for_each_entry(connector, &dev->mode_config.connector_list, head)
628
    {
629
        if( connector->status != connector_status_connected)
630
            continue;
631
632
 
633
634
 
635
        {
636
            printf("%s mode %dx%d connected %s model %x serial number %u\n",
637
                   connector->name, os_display->width, os_display->height,
638
                   manufacturer_name(con_edid + 0x08),
639
                   (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
640
                   (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
641
                   + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
642
            continue;
643
        }
644
        else
645
        {
646
            printf("%s connected: %s model %x serial number %u\n",
647
                connector->name, manufacturer_name(con_edid + 0x08),
648
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
649
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
650
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
651
        }
652
    };
653
    mutex_unlock(&dev->mode_config.mutex);
654
}
655
656
 
657
{
658
    struct drm_connector *connector;
659
    struct drm_display_mode  *drmmode;
660
661
 
662
663
 
664
    if(connector == NULL)
665
    {
666
        mutex_unlock(&dev->mode_config.mutex);
667
        return EINVAL;
668
    };
669
670
 
671
672
 
673
    {
674
        printf("%dx%d@%d\n", drmmode->hdisplay, drmmode->vdisplay, drm_mode_vrefresh(drmmode));
675
    };
676
677
 
678
    return 0;
679
};
680
681
 
2338 Serge 682
{
683
    int err = -1;
684
685
 
3031 serge 686
2338 Serge 687
 
688
    {
689
        *count = os_display->supported_modes;
690
        err = 0;
691
    }
692
    else if( mode != NULL )
693
    {
694
        struct drm_display_mode  *drmmode;
695
        int i = 0;
696
697
 
698
            *count = os_display->supported_modes;
699
700
 
701
        {
702
            if( i < *count)
703
            {
704
                mode->width  = drmmode->hdisplay;
5060 serge 705
                mode->height = drmmode->vdisplay;
706
                mode->bpp    = 32;
2338 Serge 707
                mode->freq   = drm_mode_vrefresh(drmmode);
708
                i++;
709
                mode++;
710
            }
711
            else break;
712
        };
713
        *count = i;
714
        err = 0;
715
    };
716
    return err;
717
};
718
719
 
720
{
721
722
 
3031 serge 723
//               mode->width, mode->height, mode->freq);
724
2338 Serge 725
 
726
        (mode->height != 0)  &&
727
        (mode->freq   != 0 ) &&
728
        ( (mode->width   != os_display->width)  ||
729
          (mode->height  != os_display->height) ||
730
          (mode->freq    != os_display->vrefresh) ) )
731
    {
732
        return set_mode(os_display->ddev, os_display->connector, os_display->crtc, mode, true);
5060 serge 733
    };
2338 Serge 734
735
 
5060 serge 736
};
2338 Serge 737
738
 
4126 Serge 739
{
740
    const struct drm_connector_funcs *f = os_display->connector->funcs;
4371 Serge 741
4126 Serge 742
 
743
};
744
745
 
2338 Serge 746
{
747
    struct drm_i915_gem_object *obj = cursor->cobj;
5354 serge 748
    list_del(&cursor->list);
3037 serge 749
2342 Serge 750
 
5060 serge 751
3037 serge 752
 
753
    drm_gem_object_unreference(&obj->base);
5354 serge 754
    mutex_unlock(&main_device->struct_mutex);
3037 serge 755
756
 
2338 Serge 757
};
758
759
 
760
{
761
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
762
    struct drm_i915_gem_object *obj;
763
    uint32_t *bits;
764
    uint32_t *src;
765
    void     *mapped;
3037 serge 766
2338 Serge 767
 
768
    int       ret;
769
770
 
5060 serge 771
    {
2338 Serge 772
        bits = (uint32_t*)KernelAlloc(KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*8);
6084 serge 773
        if (unlikely(bits == NULL))
2338 Serge 774
            return ENOMEM;
775
        cursor->cobj = (struct drm_i915_gem_object *)GetPgAddr(bits);
776
    }
777
    else
778
    {
779
        obj = i915_gem_alloc_object(os_display->ddev, KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4);
5060 serge 780
        if (unlikely(obj == NULL))
2338 Serge 781
            return -ENOMEM;
782
783
 
6084 serge 784
        if (ret) {
2338 Serge 785
            drm_gem_object_unreference(&obj->base);
2344 Serge 786
            return ret;
2338 Serge 787
        }
788
789
 
4104 Serge 790
        if (ret)
791
        {
792
            i915_gem_object_ggtt_unpin(obj);
5060 serge 793
            drm_gem_object_unreference(&obj->base);
4104 Serge 794
            return ret;
795
        }
796
/* You don't need to worry about fragmentation issues.
2338 Serge 797
 * GTT space is continuous. I guarantee it.                           */
798
799
 
4104 Serge 800
                    KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4, PG_SW);
5060 serge 801
2338 Serge 802
 
803
        {
804
            i915_gem_object_ggtt_unpin(obj);
5060 serge 805
            drm_gem_object_unreference(&obj->base);
2344 Serge 806
            return -ENOMEM;
2338 Serge 807
        };
808
        cursor->cobj = obj;
809
    };
810
811
 
812
813
 
814
    {
815
        for(j = 0; j < 32; j++)
816
            *bits++ = *src++;
817
        for(j = 32; j < KMS_CURSOR_WIDTH; j++)
5060 serge 818
            *bits++ = 0;
2338 Serge 819
    }
820
    for(i = 0; i < KMS_CURSOR_WIDTH*(KMS_CURSOR_HEIGHT-32); i++)
5060 serge 821
        *bits++ = 0;
2338 Serge 822
823
 
3037 serge 824
825
 
2338 Serge 826
827
 
2340 Serge 828
2338 Serge 829
 
830
831
 
832
833
 
834
}
835
836
 
837
 
838
{
839
    struct drm_crtc *crtc = os_display->crtc;
4557 Serge 840
    struct drm_plane_state *cursor_state = crtc->cursor->state;
6084 serge 841
842
 
4557 Serge 843
    y-= cursor->hot_y;
844
2338 Serge 845
 
5060 serge 846
	crtc->cursor_y = y;
847
2338 Serge 848
 
6084 serge 849
    cursor_state->crtc_y = y;
850
851
 
5060 serge 852
853
 
2338 Serge 854
855
 
856
{
857
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
858
    struct drm_crtc   *crtc = os_display->crtc;
5060 serge 859
    struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
860
861
 
2338 Serge 862
863
 
864
6088 serge 865
 
866
867
 
2338 Serge 868
869
 
5060 serge 870
       intel_crtc->cursor_addr = i915_gem_obj_ggtt_offset(cursor->cobj);
4104 Serge 871
    else
2338 Serge 872
        intel_crtc->cursor_addr = (addr_t)cursor->cobj;
2352 Serge 873
2338 Serge 874
 
6084 serge 875
	intel_crtc->base.cursor->state->crtc_h = 64;
876
    intel_crtc->base.cursor->state->rotation = 0;
877
    mutex_unlock(&cursor_lock);
6088 serge 878
2338 Serge 879
 
5060 serge 880
    return old;
2338 Serge 881
};
882
883
 
4371 Serge 884
{
3263 Serge 885
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
4389 Serge 886
    struct intel_crtc *crtc = to_intel_crtc(os_display->crtc);
887
    struct drm_i915_gem_object *obj = get_fb_obj();
4371 Serge 888
2340 Serge 889
 
4371 Serge 890
    fb->width  = os_display->width;
3263 Serge 891
    fb->height = os_display->height;
892
    fb->pitch  = obj->stride;
4371 Serge 893
    fb->tiling = obj->tiling_mode;
894
    fb->crtc   = crtc->base.base.id;
4389 Serge 895
    fb->pipe   = crtc->pipe;
896
2340 Serge 897
 
3263 Serge 898
}
4371 Serge 899
3263 Serge 900
 
4371 Serge 901
 
3277 Serge 902
{
903
    int left;
904
    int top;
905
    int right;
906
    int bottom;
907
}rect_t;
908
3263 Serge 909
 
3277 Serge 910
 
911
912
 
913
914
 
915
            struct drm_file *file)
916
{
917
    struct drm_i915_mask *mask = data;
918
    struct drm_gem_object *obj;
919
    static unsigned int mask_seqno[256];
920
    rect_t winrc;
921
    u32    slot;
922
    int    ret=0;
4371 Serge 923
3277 Serge 924
 
925
    if (obj == NULL)
926
        return -ENOENT;
927
928
 
929
        drm_gem_object_unreference_unlocked(obj);
930
        return -EINVAL;
931
    }
932
933
 
934
    {
935
//        static warn_count;
3298 Serge 936
3277 Serge 937
 
3290 Serge 938
        mask->height   = winrc.bottom - winrc.top + 1;
939
        mask->bo_pitch = (mask->width+15) & ~15;
940
941
 
3298 Serge 942
        if(warn_count < 1)
3277 Serge 943
        {
944
            printf("left %d top %d right %d bottom %d\n",
945
                    winrc.left, winrc.top, winrc.right, winrc.bottom);
946
            printf("mask pitch %d data %p\n", mask->bo_pitch, mask->bo_map);
5060 serge 947
            warn_count++;
3277 Serge 948
        };
949
#endif
3298 Serge 950
951
 
4104 Serge 952
3277 Serge 953
 
3290 Serge 954
 
3277 Serge 955
956
 
957
    {
958
        u8* src_offset;
959
        u8* dst_offset;
960
        u32 ifl;
961
962
 
963
        if (ret)
964
            goto err1;
4371 Serge 965
3277 Serge 966
 
967
        if(ret != 0 )
4398 Serge 968
        {
3277 Serge 969
            dbgprintf("%s: i915_gem_object_set_to_cpu_domain failed\n", __FUNCTION__);
4371 Serge 970
            goto err2;
971
        };
3277 Serge 972
973
 
974
975
 
976
977
 
5354 serge 978
        src_offset+= winrc.top*os_display->width + winrc.left;
979
3277 Serge 980
 
981
982
 
5354 serge 983
3277 Serge 984
 
985
        {
986
            mask_seqno[slot] = os_display->mask_seqno;
987
988
 
989
990
 
991
            "movd       %[slot],   %%xmm6         \n"
4560 Serge 992
            "punpckldq  %%xmm6, %%xmm6            \n"
3277 Serge 993
            "punpcklqdq %%xmm6, %%xmm6            \n"
994
            :: [slot]  "m" (slot)
995
            :"xmm6");
996
997
 
998
            {
999
                int tmp_w = mask->width;
4398 Serge 1000
3277 Serge 1001
 
1002
                u8* tmp_dst = dst_offset;
1003
1004
 
1005
                dst_offset+= mask->bo_pitch;
1006
1007
 
1008
                {
1009
                    __asm__ __volatile__ (
1010
                    "movdqu     (%0),   %%xmm0            \n"
1011
                    "movdqu   16(%0),   %%xmm1            \n"
1012
                    "movdqu   32(%0),   %%xmm2            \n"
1013
                    "movdqu   48(%0),   %%xmm3            \n"
1014
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1015
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1016
                    "pcmpeqb    %%xmm6, %%xmm2            \n"
1017
                    "pcmpeqb    %%xmm6, %%xmm3            \n"
1018
                    "movdqa     %%xmm0,   (%%edi)         \n"
1019
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1020
                    "movdqa     %%xmm2, 32(%%edi)         \n"
1021
                    "movdqa     %%xmm3, 48(%%edi)         \n"
1022
1023
 
1024
                    :"xmm0","xmm1","xmm2","xmm3");
1025
                    tmp_w -= 64;
1026
                    tmp_src += 64;
1027
                    tmp_dst += 64;
1028
                }
1029
1030
 
1031
                {
1032
                    __asm__ __volatile__ (
1033
                    "movdqu     (%0),   %%xmm0            \n"
1034
                    "movdqu   16(%0),   %%xmm1            \n"
1035
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1036
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1037
                    "movdqa     %%xmm0,   (%%edi)         \n"
1038
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1039
1040
 
1041
                    :"xmm0","xmm1");
1042
                    tmp_w -= 32;
1043
                    tmp_src += 32;
1044
                    tmp_dst += 32;
1045
                }
1046
1047
 
4398 Serge 1048
                {
3277 Serge 1049
                    __asm__ __volatile__ (
1050
                    "movdqu     (%0),   %%xmm0            \n"
1051
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1052
                    "movdqa     %%xmm0,   (%%edi)         \n"
1053
                    :: "r" (tmp_src), "D" (tmp_dst)
1054
                    :"xmm0");
1055
                    tmp_w -= 16;
1056
                    tmp_src += 16;
1057
                    tmp_dst += 16;
1058
                }
1059
4398 Serge 1060
 
1061
                {
1062
                    __asm__ __volatile__ (
1063
                    "movq       (%0),   %%xmm0            \n"
1064
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1065
                    "movq       %%xmm0,   (%%edi)         \n"
1066
                    :: "r" (tmp_src), "D" (tmp_dst)
1067
                    :"xmm0");
1068
                    tmp_w -= 8;
1069
                    tmp_src += 8;
1070
                    tmp_dst += 8;
1071
                }
1072
                if( tmp_w >= 4 )
1073
                {
1074
                    __asm__ __volatile__ (
1075
                    "movd       (%0),   %%xmm0            \n"
1076
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1077
                    "movd       %%xmm0,   (%%edi)         \n"
1078
                    :: "r" (tmp_src), "D" (tmp_dst)
1079
                    :"xmm0");
1080
                    tmp_w -= 4;
1081
                    tmp_src += 4;
1082
                    tmp_dst += 4;
1083
                }
1084
                while(tmp_w--)
1085
                    *tmp_dst++ = (*tmp_src++ == (u8)slot) ? 0xFF:0x00;
1086
            };
3277 Serge 1087
        };
1088
        safe_sti(ifl);
1089
4371 Serge 1090
 
1091
    }
4539 Serge 1092
1093
 
1094
    mutex_unlock(&dev->struct_mutex);
1095
err1:
1096
    drm_gem_object_unreference(obj);
1097
1098
 
1099
}
1100
1101
 
1102
            struct drm_file *file)
1103
{
1104
    struct drm_i915_mask_update *mask = data;
1105
    struct drm_gem_object *obj;
1106
    static unsigned int mask_seqno[256];
1107
    static warn_count;
1108
1109
 
1110
    u32    winw,winh;
1111
    u32    ml,mt,mr,mb;
1112
    u32    slot;
1113
    int    ret = 0;
1114
    slot = *((u8*)CURRENT_TASK);
1115
1116
 
6084 serge 1117
        return 0;
4539 Serge 1118
1119
 
6084 serge 1120
        memset((void*)mask->bo_map,0,mask->width * mask->height);
1121
5367 serge 1122
 
4539 Serge 1123
    win.right+= 1;
1124
    win.bottom+=  1;
1125
1126
 
1127
    winh = win.bottom - win.top;
1128
1129
 
1130
       mask->dy >= winh)
1131
       return 1;
1132
1133
 
1134
    mt = win.top  + mask->dy;
1135
    mr = ml + mask->width;
1136
    mb = mt + mask->height;
1137
1138
 
1139
        mr < win.left   || mb < win.top )
1140
        return 1;
1141
1142
 
1143
        mr = win.right;
1144
1145
 
1146
        mb = win.bottom;
1147
1148
 
1149
    mask->height = mb - mt;
1150
1151
 
1152
        mask->height== 0 )
1153
        return 1;
1154
1155
 
1156
    if (obj == NULL)
1157
        return -ENOENT;
1158
1159
 
1160
        drm_gem_object_unreference_unlocked(obj);
1161
        return -EINVAL;
1162
    }
1163
1164
 
6084 serge 1165
    if(warn_count < 100)
1166
    {
4539 Serge 1167
        printf("left %d top %d right %d bottom %d\n",
1168
                ml, mt, mr, mb);
1169
        warn_count++;
1170
    };
1171
#endif
1172
1173
 
1174
 
1175
1176
 
1177
        u8* src_offset;
1178
        u8* dst_offset;
1179
        u32 ifl;
1180
1181
 
1182
        if (ret)
1183
            goto err1;
1184
1185
 
1186
1187
 
5354 serge 1188
        src_offset+= mt*os_display->width + ml;
1189
        dst_offset = (u8*)mask->bo_map;
4539 Serge 1190
1191
 
5354 serge 1192
4539 Serge 1193
 
1194
        {
4371 Serge 1195
            mask_seqno[slot] = os_display->mask_seqno;
4539 Serge 1196
1197
 
1198
1199
 
1200
            "movd       %[slot],   %%xmm6         \n"
1201
            "punpckldq  %%xmm6, %%xmm6            \n"
1202
            "punpcklqdq %%xmm6, %%xmm6            \n"
1203
            :: [slot]  "m" (slot)
1204
            :"xmm6");
1205
1206
 
1207
            {
1208
                int tmp_w = mask->width;
1209
1210
 
1211
                u8* tmp_dst = dst_offset;
1212
1213
 
1214
                dst_offset+= mask->bo_pitch;
1215
1216
 
1217
                {
1218
                    __asm__ __volatile__ (
1219
                    "movdqu     (%0),   %%xmm0            \n"
1220
                    "movdqu   16(%0),   %%xmm1            \n"
1221
                    "movdqu   32(%0),   %%xmm2            \n"
1222
                    "movdqu   48(%0),   %%xmm3            \n"
1223
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1224
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1225
                    "pcmpeqb    %%xmm6, %%xmm2            \n"
1226
                    "pcmpeqb    %%xmm6, %%xmm3            \n"
1227
                    "movdqa     %%xmm0,   (%%edi)         \n"
1228
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1229
                    "movdqa     %%xmm2, 32(%%edi)         \n"
1230
                    "movdqa     %%xmm3, 48(%%edi)         \n"
1231
1232
 
1233
                    :"xmm0","xmm1","xmm2","xmm3");
1234
                    tmp_w -= 64;
1235
                    tmp_src += 64;
1236
                    tmp_dst += 64;
1237
                }
1238
1239
 
1240
                {
1241
                    __asm__ __volatile__ (
1242
                    "movdqu     (%0),   %%xmm0            \n"
1243
                    "movdqu   16(%0),   %%xmm1            \n"
1244
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1245
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1246
                    "movdqa     %%xmm0,   (%%edi)         \n"
1247
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1248
1249
 
1250
                    :"xmm0","xmm1");
1251
                    tmp_w -= 32;
1252
                    tmp_src += 32;
1253
                    tmp_dst += 32;
1254
                }
1255
1256
 
1257
                {
1258
                    __asm__ __volatile__ (
1259
                    "movdqu     (%0),   %%xmm0            \n"
1260
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1261
                    "movdqa     %%xmm0,   (%%edi)         \n"
1262
                    :: "r" (tmp_src), "D" (tmp_dst)
1263
                    :"xmm0");
1264
                    tmp_w -= 16;
1265
                    tmp_src += 16;
1266
                    tmp_dst += 16;
1267
                }
1268
1269
 
1270
                {
1271
                    __asm__ __volatile__ (
1272
                    "movq       (%0),   %%xmm0            \n"
1273
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1274
                    "movq       %%xmm0,   (%%edi)         \n"
1275
                    :: "r" (tmp_src), "D" (tmp_dst)
1276
                    :"xmm0");
1277
                    tmp_w -= 8;
1278
                    tmp_src += 8;
1279
                    tmp_dst += 8;
1280
                }
1281
                if( tmp_w >= 4 )
1282
                {
4560 Serge 1283
                    __asm__ __volatile__ (
4539 Serge 1284
                    "movd       (%0),   %%xmm0            \n"
1285
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1286
                    "movd       %%xmm0,   (%%edi)         \n"
1287
                    :: "r" (tmp_src), "D" (tmp_dst)
1288
                    :"xmm0");
1289
                    tmp_w -= 4;
1290
                    tmp_src += 4;
1291
                    tmp_dst += 4;
1292
                }
1293
                while(tmp_w--)
1294
                    *tmp_dst++ = (*tmp_src++ == (u8)slot) ? 0xFF:0x00;
1295
            };
1296
        };
4371 Serge 1297
        safe_sti(ifl);
4539 Serge 1298
1299
 
1300
    }
3277 Serge 1301
#endif
4539 Serge 1302
3277 Serge 1303
 
4371 Serge 1304
    mutex_unlock(&dev->struct_mutex);
1305
err1:
1306
    drm_gem_object_unreference(obj);
3277 Serge 1307
1308
 
4371 Serge 1309
}
3277 Serge 1310
1311
 
1312
 
1313
 
2360 Serge 1314
 
3031 serge 1315
2360 Serge 1316
 
3031 serge 1317
{
1318
    u32 tmp = GetTimerTicks();
1319
2360 Serge 1320
 
3031 serge 1321
    ts->tv_nsec = (tmp - ts->tv_sec*100)*10000000;
1322
}
1323
2360 Serge 1324
 
6084 serge 1325
{
3031 serge 1326
    unsigned long flags;
3480 Serge 1327
3031 serge 1328
 
3480 Serge 1329
    spin_lock_irqsave(&q->lock, flags);
1330
    if (list_empty(&wait->task_list))
1331
            __add_wait_queue(q, wait);
1332
    spin_unlock_irqrestore(&q->lock, flags);
1333
}
1334
1335
 
1336
 * finish_wait - clean up after waiting in a queue
1337
 * @q: waitqueue waited on
1338
 * @wait: wait descriptor
1339
 *
1340
 * Sets current thread back to running state and removes
1341
 * the wait descriptor from the given waitqueue if still
1342
 * queued.
1343
 */
1344
void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
1345
{
1346
    unsigned long flags;
1347
1348
 
1349
    /*
1350
     * We can check for list emptiness outside the lock
1351
     * IFF:
1352
     *  - we use the "careful" check that verifies both
1353
     *    the next and prev pointers, so that there cannot
1354
     *    be any half-pending updates in progress on other
1355
     *    CPU's that we haven't seen yet (and that might
1356
     *    still change the stack area.
1357
     * and
1358
     *  - all other users take the lock (ie we can only
1359
     *    have _one_ other CPU that looks at or modifies
1360
     *    the list).
1361
     */
1362
    if (!list_empty_careful(&wait->task_list)) {
1363
            spin_lock_irqsave(&q->lock, flags);
1364
            list_del_init(&wait->task_list);
1365
            spin_unlock_irqrestore(&q->lock, flags);
1366
    }
1367
1368
 
1369
}
1370
1371
 
1372
{
1373
    list_del_init(&wait->task_list);
1374
    return 1;
1375
}
1376
1377
 
1378
 
1379