Subversion Repositories Kolibri OS

Rev

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