Subversion Repositories Kolibri OS

Rev

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