Subversion Repositories Kolibri OS

Rev

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