Subversion Repositories Kolibri OS

Rev

Rev 6103 | Rev 6283 | 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
        connector->encoder = encoder;
6131 serge 377
    }
6088 serge 378
379
 
380
    if(crtc == NULL)
381
        crtc = get_possible_crtc(dev, encoder);
382
383
 
384
    {
385
        DRM_DEBUG_KMS("%s connector: %p encode: %p crtc: %p\n",__FUNCTION__,
6131 serge 386
               connector, encoder, crtc);
387
        return 0;
6088 serge 388
    }
389
    else
390
        DRM_DEBUG_KMS("No CRTC for encoder %d\n", encoder->base.id);
391
    return -EINVAL;
392
}
393
394
 
395
{
396
    struct drm_connector *connector;
397
398
 
5060 serge 399
    {
2338 Serge 400
        int name_len = __builtin_strlen(connector->name);
6088 serge 401
402
 
403
            continue;
2338 Serge 404
405
 
6088 serge 406
            continue;
407
5060 serge 408
 
6088 serge 409
            return connector;
410
    }
411
    return NULL;
412
}
413
5060 serge 414
 
2338 Serge 415
 
6088 serge 416
                  struct drm_crtc **boot_crtc)
417
{
418
    struct drm_connector *connector;
6103 serge 419
4371 Serge 420
 
6088 serge 421
    {
422
        connector = get_cmdline_connector(dev, i915.cmdline_mode);
423
        if(connector != NULL)
424
        {
5060 serge 425
            *boot_connector = connector;
426
            *boot_crtc = connector->encoder->crtc;
6088 serge 427
            return 0;
5060 serge 428
        }
429
    }
6088 serge 430
5060 serge 431
 
6088 serge 432
    {
433
        if(check_connector(dev, connector) == 0)
434
        {
435
            *boot_connector = connector;
436
            *boot_crtc = connector->encoder->crtc;
437
            return 0;
438
        };
439
    };
2338 Serge 440
441
 
5060 serge 442
};
4398 Serge 443
2338 Serge 444
 
6103 serge 445
 
5060 serge 446
{
4371 Serge 447
    struct drm_display_mode *mode;
448
449
 
450
    {
451
        if( os_display->width  == mode->hdisplay &&
5060 serge 452
            os_display->height == mode->vdisplay &&
453
            drm_mode_vrefresh(mode) == 60)
4371 Serge 454
        {
455
            usermode->width  = os_display->width;
456
            usermode->height = os_display->height;
457
            usermode->freq   = 60;
458
            return 1;
459
        }
460
    }
461
    return 0;
462
}
463
464
 
465
{
466
    struct drm_connector_helper_funcs *connector_funcs;
467
    struct drm_connector    *connector = NULL;
5060 serge 468
    struct drm_crtc         *crtc = NULL;
469
    struct drm_framebuffer  *fb;
4371 Serge 470
471
 
472
    u32      ifl;
5354 serge 473
    int       ret;
6084 serge 474
4371 Serge 475
 
476
    ret = choose_config(dev, &connector, &crtc);
5060 serge 477
    if(ret)
478
    {
4371 Serge 479
        mutex_unlock(&dev->mode_config.mutex);
6088 serge 480
        DRM_DEBUG_KMS("No active connectors!\n");
4371 Serge 481
        return -1;
482
    };
483
484
 
5060 serge 485
    idr_preload(GFP_KERNEL);
486
4371 Serge 487
 
5060 serge 488
        ret = idr_alloc(&dev->object_name_idr, &main_fb_obj->base, 1, 0, GFP_NOWAIT);
489
4371 Serge 490
 
5060 serge 491
        main_fb_obj->base.handle_count++;
6084 serge 492
        DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, main_fb_obj->base.name );
5060 serge 493
    }
494
495
 
496
    mutex_unlock(&dev->object_name_lock);
497
498
 
2338 Serge 499
    os_display->ddev = dev;
500
    os_display->connector = connector;
501
    os_display->crtc = crtc;
502
    os_display->supported_modes = count_connector_modes(connector);
503
    mutex_unlock(&dev->mode_config.mutex);
6088 serge 504
2338 Serge 505
 
6088 serge 506
    mutex_lock(&dev->struct_mutex);
507
508
 
2338 Serge 509
    {
510
        list_for_each_entry(cursor, &os_display->cursors, list)
511
        {
512
            init_cursor(cursor);
513
        };
514
515
 
516
        os_display->init_cursor    = init_cursor;
517
        os_display->select_cursor  = select_cursor_kms;
518
        os_display->show_cursor    = NULL;
519
        os_display->move_cursor    = move_cursor_kms;
520
        os_display->restore_cursor = restore_cursor;
521
        os_display->disable_mouse  = disable_mouse;
522
523
 
5060 serge 524
        crtc->cursor_y = os_display->height/2;
525
2338 Serge 526
 
527
    };
528
    safe_sti(ifl);
529
530
 
6088 serge 531
532
 
533
534
 
535
        ret = set_cmdline_mode(dev, connector);
536
537
 
538
    {
4280 Serge 539
        mutex_lock(&dev->mode_config.mutex);
6088 serge 540
541
 
542
            (usermode->height == 0))
543
        {
4371 Serge 544
            if( !get_boot_mode(connector, usermode))
6088 serge 545
            {
546
                struct drm_display_mode *mode;
547
4280 Serge 548
 
6088 serge 549
                usermode->width  = mode->hdisplay;
550
                usermode->height = mode->vdisplay;
551
                usermode->freq   = drm_mode_vrefresh(mode);
552
            };
553
        };
4280 Serge 554
        mutex_unlock(&dev->mode_config.mutex);
6088 serge 555
556
 
557
    };
4280 Serge 558
559
 
3243 Serge 560
    err = init_bitmaps();
2342 Serge 561
#endif
3243 Serge 562
2340 Serge 563
 
6088 serge 564
};
2338 Serge 565
566
 
567
 
6088 serge 568
{
569
    struct drm_connector_helper_funcs *connector_funcs;
570
    struct drm_connector    *connector;
571
    struct drm_cmdline_mode cmd_mode = {0};
6103 serge 572
    struct drm_display_mode *mode;
6088 serge 573
    char *mode_option;
574
    int retval = 0;
575
    char  con_edid[128];
576
577
 
578
        return EINVAL;
579
580
 
581
    connector = get_cmdline_connector(dev, cmdline);
582
    mutex_unlock(&dev->mode_config.mutex);
583
584
 
585
        return EINVAL;
586
587
 
588
    if(mode_option == NULL)
589
        return EINVAL;
590
591
 
592
593
 
594
        return EINVAL;
595
596
 
597
                   connector->name,
598
                   cmd_mode.xres, cmd_mode.yres,
599
                   cmd_mode.refresh_specified ? cmd_mode.refresh : 60,
600
                   cmd_mode.rb ? " reduced blanking" : "",
601
                   cmd_mode.margins ? " with margins" : "",
602
                   cmd_mode.interlace ?  " interlaced" : "");
603
604
 
605
    if(mode == NULL)
606
        return EINVAL;
607
608
 
609
    DRM_DEBUG_KMS("connector: %s monitor: %s model %x serial number %u\n",
610
            connector->name,
611
            manufacturer_name(con_edid + 0x08),
612
            (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
613
            (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
614
            + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
615
616
 
617
618
 
619
620
 
621
}
622
623
 
6103 serge 624
{
625
    struct drm_connector *connector;
626
    char  con_edid[128];
627
628
 
629
    list_for_each_entry(connector, &dev->mode_config.connector_list, head)
630
    {
631
        if( connector->status != connector_status_connected)
632
            continue;
633
634
 
635
636
 
637
        {
638
            printf("%s mode %dx%d connected %s model %x serial number %u\n",
639
                   connector->name, os_display->width, os_display->height,
640
                   manufacturer_name(con_edid + 0x08),
641
                   (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
642
                   (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
643
                   + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
644
            continue;
645
        }
646
        else
647
        {
648
            printf("%s connected: %s model %x serial number %u\n",
649
                connector->name, manufacturer_name(con_edid + 0x08),
650
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
651
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
652
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
653
        }
654
    };
655
    mutex_unlock(&dev->mode_config.mutex);
656
}
657
658
 
659
{
660
    struct drm_connector *connector;
661
    struct drm_display_mode  *drmmode;
662
663
 
664
665
 
666
    if(connector == NULL)
667
    {
668
        mutex_unlock(&dev->mode_config.mutex);
669
        return EINVAL;
670
    };
671
672
 
673
674
 
675
    {
676
        printf("%dx%d@%d\n", drmmode->hdisplay, drmmode->vdisplay, drm_mode_vrefresh(drmmode));
677
    };
678
679
 
680
    return 0;
681
};
682
683
 
2338 Serge 684
{
685
    int err = -1;
686
687
 
3031 serge 688
2338 Serge 689
 
690
    {
691
        *count = os_display->supported_modes;
692
        err = 0;
693
    }
694
    else if( mode != NULL )
695
    {
696
        struct drm_display_mode  *drmmode;
697
        int i = 0;
698
699
 
700
            *count = os_display->supported_modes;
701
702
 
703
        {
704
            if( i < *count)
705
            {
706
                mode->width  = drmmode->hdisplay;
5060 serge 707
                mode->height = drmmode->vdisplay;
708
                mode->bpp    = 32;
2338 Serge 709
                mode->freq   = drm_mode_vrefresh(drmmode);
710
                i++;
711
                mode++;
712
            }
713
            else break;
714
        };
715
        *count = i;
716
        err = 0;
717
    };
718
    return err;
719
};
720
721
 
722
{
723
724
 
3031 serge 725
//               mode->width, mode->height, mode->freq);
726
2338 Serge 727
 
728
        (mode->height != 0)  &&
729
        (mode->freq   != 0 ) &&
730
        ( (mode->width   != os_display->width)  ||
731
          (mode->height  != os_display->height) ||
732
          (mode->freq    != os_display->vrefresh) ) )
733
    {
734
        return set_mode(os_display->ddev, os_display->connector, os_display->crtc, mode, true);
5060 serge 735
    };
2338 Serge 736
737
 
5060 serge 738
};
2338 Serge 739
740
 
4126 Serge 741
{
742
    const struct drm_connector_funcs *f = os_display->connector->funcs;
4371 Serge 743
4126 Serge 744
 
745
};
746
747
 
2338 Serge 748
{
749
    struct drm_i915_gem_object *obj = cursor->cobj;
5354 serge 750
    list_del(&cursor->list);
3037 serge 751
2342 Serge 752
 
5060 serge 753
3037 serge 754
 
755
    drm_gem_object_unreference(&obj->base);
5354 serge 756
    mutex_unlock(&main_device->struct_mutex);
3037 serge 757
758
 
2338 Serge 759
};
760
761
 
762
{
763
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
764
    struct drm_i915_gem_object *obj;
765
    uint32_t *bits;
766
    uint32_t *src;
767
    void     *mapped;
3037 serge 768
2338 Serge 769
 
770
    int       ret;
771
772
 
5060 serge 773
    {
2338 Serge 774
        bits = (uint32_t*)KernelAlloc(KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*8);
6084 serge 775
        if (unlikely(bits == NULL))
2338 Serge 776
            return ENOMEM;
777
        cursor->cobj = (struct drm_i915_gem_object *)GetPgAddr(bits);
778
    }
779
    else
780
    {
781
        obj = i915_gem_alloc_object(os_display->ddev, KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4);
5060 serge 782
        if (unlikely(obj == NULL))
2338 Serge 783
            return -ENOMEM;
784
785
 
6084 serge 786
        if (ret) {
2338 Serge 787
            drm_gem_object_unreference(&obj->base);
2344 Serge 788
            return ret;
2338 Serge 789
        }
790
791
 
4104 Serge 792
        if (ret)
793
        {
794
            i915_gem_object_ggtt_unpin(obj);
5060 serge 795
            drm_gem_object_unreference(&obj->base);
4104 Serge 796
            return ret;
797
        }
798
/* You don't need to worry about fragmentation issues.
2338 Serge 799
 * GTT space is continuous. I guarantee it.                           */
800
801
 
4104 Serge 802
                    KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4, PG_SW);
5060 serge 803
2338 Serge 804
 
805
        {
806
            i915_gem_object_ggtt_unpin(obj);
5060 serge 807
            drm_gem_object_unreference(&obj->base);
2344 Serge 808
            return -ENOMEM;
2338 Serge 809
        };
810
        cursor->cobj = obj;
811
    };
812
813
 
814
815
 
816
    {
817
        for(j = 0; j < 32; j++)
818
            *bits++ = *src++;
819
        for(j = 32; j < KMS_CURSOR_WIDTH; j++)
5060 serge 820
            *bits++ = 0;
2338 Serge 821
    }
822
    for(i = 0; i < KMS_CURSOR_WIDTH*(KMS_CURSOR_HEIGHT-32); i++)
5060 serge 823
        *bits++ = 0;
2338 Serge 824
825
 
3037 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
 
6131 serge 1156
    if (ret)
1157
        return ret;
1158
1159
 
4539 Serge 1160
    if (obj == NULL)
1161
    {
6131 serge 1162
        ret = -ENOENT;
1163
        goto unlock;
1164
    }
1165
4539 Serge 1166
 
6131 serge 1167
    {
1168
        ret = -ENOENT;
1169
        goto out;
1170
    }
4539 Serge 1171
1172
 
6084 serge 1173
    if(warn_count < 100)
1174
    {
4539 Serge 1175
        printf("left %d top %d right %d bottom %d\n",
1176
                ml, mt, mr, mb);
1177
        warn_count++;
1178
    };
1179
#endif
1180
1181
 
1182
 
1183
1184
 
1185
        u8* src_offset;
1186
        u8* dst_offset;
1187
        u32 ifl;
1188
1189
 
1190
1191
 
5354 serge 1192
        src_offset+= mt*os_display->width + ml;
1193
        dst_offset = (u8*)mask->bo_map;
4539 Serge 1194
1195
 
5354 serge 1196
4539 Serge 1197
 
1198
        {
4371 Serge 1199
            mask_seqno[slot] = os_display->mask_seqno;
4539 Serge 1200
1201
 
1202
1203
 
1204
            "movd       %[slot],   %%xmm6         \n"
1205
            "punpckldq  %%xmm6, %%xmm6            \n"
1206
            "punpcklqdq %%xmm6, %%xmm6            \n"
1207
            :: [slot]  "m" (slot)
1208
            :"xmm6");
1209
1210
 
1211
            {
1212
                int tmp_w = mask->width;
1213
1214
 
1215
                u8* tmp_dst = dst_offset;
1216
1217
 
1218
                dst_offset+= mask->bo_pitch;
1219
1220
 
1221
                {
1222
                    __asm__ __volatile__ (
1223
                    "movdqu     (%0),   %%xmm0            \n"
1224
                    "movdqu   16(%0),   %%xmm1            \n"
1225
                    "movdqu   32(%0),   %%xmm2            \n"
1226
                    "movdqu   48(%0),   %%xmm3            \n"
1227
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1228
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1229
                    "pcmpeqb    %%xmm6, %%xmm2            \n"
1230
                    "pcmpeqb    %%xmm6, %%xmm3            \n"
1231
                    "movdqa     %%xmm0,   (%%edi)         \n"
1232
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1233
                    "movdqa     %%xmm2, 32(%%edi)         \n"
1234
                    "movdqa     %%xmm3, 48(%%edi)         \n"
1235
1236
 
1237
                    :"xmm0","xmm1","xmm2","xmm3");
1238
                    tmp_w -= 64;
1239
                    tmp_src += 64;
1240
                    tmp_dst += 64;
1241
                }
1242
1243
 
1244
                {
1245
                    __asm__ __volatile__ (
1246
                    "movdqu     (%0),   %%xmm0            \n"
1247
                    "movdqu   16(%0),   %%xmm1            \n"
1248
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1249
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1250
                    "movdqa     %%xmm0,   (%%edi)         \n"
1251
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1252
1253
 
1254
                    :"xmm0","xmm1");
1255
                    tmp_w -= 32;
1256
                    tmp_src += 32;
1257
                    tmp_dst += 32;
1258
                }
1259
1260
 
1261
                {
1262
                    __asm__ __volatile__ (
1263
                    "movdqu     (%0),   %%xmm0            \n"
1264
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1265
                    "movdqa     %%xmm0,   (%%edi)         \n"
1266
                    :: "r" (tmp_src), "D" (tmp_dst)
1267
                    :"xmm0");
1268
                    tmp_w -= 16;
1269
                    tmp_src += 16;
1270
                    tmp_dst += 16;
1271
                }
1272
1273
 
1274
                {
1275
                    __asm__ __volatile__ (
1276
                    "movq       (%0),   %%xmm0            \n"
1277
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1278
                    "movq       %%xmm0,   (%%edi)         \n"
1279
                    :: "r" (tmp_src), "D" (tmp_dst)
1280
                    :"xmm0");
1281
                    tmp_w -= 8;
1282
                    tmp_src += 8;
1283
                    tmp_dst += 8;
1284
                }
1285
                if( tmp_w >= 4 )
1286
                {
4560 Serge 1287
                    __asm__ __volatile__ (
4539 Serge 1288
                    "movd       (%0),   %%xmm0            \n"
1289
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1290
                    "movd       %%xmm0,   (%%edi)         \n"
1291
                    :: "r" (tmp_src), "D" (tmp_dst)
1292
                    :"xmm0");
1293
                    tmp_w -= 4;
1294
                    tmp_src += 4;
1295
                    tmp_dst += 4;
1296
                }
1297
                while(tmp_w--)
1298
                    *tmp_dst++ = (*tmp_src++ == (u8)slot) ? 0xFF:0x00;
1299
            };
1300
        };
4371 Serge 1301
        safe_sti(ifl);
4539 Serge 1302
1303
 
1304
    }
3277 Serge 1305
#endif
4539 Serge 1306
3277 Serge 1307
 
6131 serge 1308
    drm_gem_object_unreference(obj);
3277 Serge 1309
1310
 
6131 serge 1311
    mutex_unlock(&dev->struct_mutex);
1312
1313
 
4371 Serge 1314
}
3277 Serge 1315
1316
 
1317
 
1318
 
2360 Serge 1319
 
3031 serge 1320
2360 Serge 1321
 
3031 serge 1322
{
1323
    u32 tmp = GetTimerTicks();
1324
2360 Serge 1325
 
3031 serge 1326
    ts->tv_nsec = (tmp - ts->tv_sec*100)*10000000;
1327
}
1328
2360 Serge 1329
 
6084 serge 1330
{
3031 serge 1331
    unsigned long flags;
3480 Serge 1332
3031 serge 1333
 
3480 Serge 1334
    spin_lock_irqsave(&q->lock, flags);
1335
    if (list_empty(&wait->task_list))
1336
            __add_wait_queue(q, wait);
1337
    spin_unlock_irqrestore(&q->lock, flags);
1338
}
1339
1340
 
1341
 * finish_wait - clean up after waiting in a queue
1342
 * @q: waitqueue waited on
1343
 * @wait: wait descriptor
1344
 *
1345
 * Sets current thread back to running state and removes
1346
 * the wait descriptor from the given waitqueue if still
1347
 * queued.
1348
 */
1349
void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
1350
{
1351
    unsigned long flags;
1352
1353
 
1354
    /*
1355
     * We can check for list emptiness outside the lock
1356
     * IFF:
1357
     *  - we use the "careful" check that verifies both
1358
     *    the next and prev pointers, so that there cannot
1359
     *    be any half-pending updates in progress on other
1360
     *    CPU's that we haven't seen yet (and that might
1361
     *    still change the stack area.
1362
     * and
1363
     *  - all other users take the lock (ie we can only
1364
     *    have _one_ other CPU that looks at or modifies
1365
     *    the list).
1366
     */
1367
    if (!list_empty_careful(&wait->task_list)) {
1368
            spin_lock_irqsave(&q->lock, flags);
1369
            list_del_init(&wait->task_list);
1370
            spin_unlock_irqrestore(&q->lock, flags);
1371
    }
1372
1373
 
1374
}
1375
1376
 
1377
{
1378
    list_del_init(&wait->task_list);
1379
    return 1;
1380
}
1381
1382
 
1383
 
1384