Subversion Repositories Kolibri OS

Rev

Rev 3033 | Rev 3039 | 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
 
2338 Serge 4
#include "drm.h"
5
#include "i915_drm.h"
6
#include "i915_drv.h"
7
#include "intel_drv.h"
8
9
 
10
#include 
11
#include 
12
#include 
13
#include 
14
15
 
16
17
 
3033 serge 18
#include "bitmap.h"
2340 Serge 19
2338 Serge 20
 
2351 Serge 21
2338 Serge 22
 
2351 Serge 23
 
2338 Serge 24
{
25
    kobj_t     header;
26
27
 
28
    uint32_t   hot_x;
29
    uint32_t   hot_y;
30
31
 
32
    struct drm_i915_gem_object  *cobj;
33
}cursor_t;
34
35
 
36
#define CURSOR_HEIGHT 64
37
38
 
39
 
40
{
41
    int  x;
42
    int  y;
43
    int  width;
44
    int  height;
45
    int  bpp;
46
    int  vrefresh;
47
    int  pitch;
48
    int  lfb;
49
50
 
51
    struct drm_device    *ddev;
52
    struct drm_connector *connector;
53
    struct drm_crtc      *crtc;
54
55
 
56
57
 
58
    int       (*init_cursor)(cursor_t*);
59
    cursor_t* (__stdcall *select_cursor)(cursor_t*);
60
    void      (*show_cursor)(int show);
61
    void      (__stdcall *move_cursor)(cursor_t *cursor, int x, int y);
62
    void      (__stdcall *restore_cursor)(int x, int y);
63
    void      (*disable_mouse)(void);
64
    u32  mask_seqno;
2361 Serge 65
    u32  check_mouse;
3031 serge 66
    u32  check_m_pixel;
67
68
 
2338 Serge 69
70
 
71
 
72
73
 
2340 Serge 74
u32_t cmd_offset;
75
76
 
2351 Serge 77
int  sna_init();
78
79
 
2338 Serge 80
static cursor_t*  __stdcall select_cursor_kms(cursor_t *cursor);
81
static void       __stdcall move_cursor_kms(cursor_t *cursor, int x, int y);
82
83
 
84
{};
85
86
 
87
{};
88
89
 
3031 serge 90
{
91
    static char name[4];
92
93
 
94
    name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xE0) >> 5) + '@';
95
    name[2] = (x[1] & 0x1F) + '@';
96
    name[3] = 0;
97
98
 
99
}
100
101
 
102
              videomode_t *reqmode, bool strict)
103
{
104
    drm_i915_private_t      *dev_priv   = dev->dev_private;
105
    struct drm_fb_helper    *fb_helper  = &dev_priv->fbdev->helper;
106
107
 
108
    struct drm_display_mode *mode       = NULL, *tmpmode;
109
    struct drm_framebuffer  *fb         = NULL;
110
    struct drm_crtc         *crtc;
111
    struct drm_encoder      *encoder;
112
    struct drm_mode_set     set;
113
    char *con_name;
114
    char *enc_name;
115
    unsigned hdisplay, vdisplay;
116
    int ret;
117
118
 
119
120
 
121
    {
122
        if( (drm_mode_width(tmpmode)    == reqmode->width)  &&
123
            (drm_mode_height(tmpmode)   == reqmode->height) &&
124
            (drm_mode_vrefresh(tmpmode) == reqmode->freq) )
125
        {
126
            mode = tmpmode;
127
            goto do_set;
128
        }
129
    };
130
131
 
132
    {
133
        list_for_each_entry(tmpmode, &connector->modes, head)
134
        {
135
            if( (drm_mode_width(tmpmode)  == reqmode->width)  &&
136
                (drm_mode_height(tmpmode) == reqmode->height) )
137
            {
138
                mode = tmpmode;
139
                goto do_set;
140
            }
141
        };
142
    };
143
144
 
3037 serge 145
3031 serge 146
 
147
148
 
149
150
 
151
 
152
    crtc = encoder->crtc;
153
154
 
155
    enc_name = drm_get_encoder_name(encoder);
156
157
 
158
              reqmode->width, reqmode->height, crtc->base.id,
159
              con_name, enc_name);
160
161
 
162
163
 
164
    vdisplay = mode->vdisplay;
165
166
 
167
        swap(hdisplay, vdisplay);
168
169
 
170
171
 
172
    fb->height = reqmode->height;
173
    fb->pitches[0]  = ALIGN(reqmode->width * 4, 64);
174
    fb->pitches[1]  = ALIGN(reqmode->width * 4, 64);
175
    fb->pitches[2]  = ALIGN(reqmode->width * 4, 64);
176
    fb->pitches[3]  = ALIGN(reqmode->width * 4, 64);
177
178
 
179
    fb->depth = 24;
180
181
 
182
    crtc->enabled = true;
183
    os_display->crtc = crtc;
184
185
 
186
    set.x = 0;
187
    set.y = 0;
188
    set.mode = mode;
189
    set.connectors = &connector;
190
    set.num_connectors = 1;
191
    set.fb = fb;
192
    ret = crtc->funcs->set_config(&set);
193
    mutex_unlock(&dev->mode_config.mutex);
194
195
 
196
    {
197
        os_display->width    = fb->width;
198
        os_display->height   = fb->height;
199
        os_display->pitch    = fb->pitches[0];
200
        os_display->vrefresh = drm_mode_vrefresh(mode);
201
202
 
203
204
 
3037 serge 205
                       fb->width, fb->height, fb->pitches[0]);
3031 serge 206
    }
207
    else
208
        DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
209
                   fb->width, fb->height, crtc);
210
211
 
212
 
213
}
214
215
 
2338 Serge 216
{
217
    struct drm_display_mode  *mode;
218
    int count = 0;
219
220
 
221
    {
222
        count++;
223
    };
224
    return count;
225
};
226
227
 
3031 serge 228
{
229
    struct drm_connector  *connector;
230
    struct drm_connector_helper_funcs *connector_funcs;
231
232
 
233
234
 
235
    {
236
        struct drm_encoder  *encoder;
237
        struct drm_crtc     *crtc;
238
239
 
240
            continue;
241
242
 
243
        encoder = connector_funcs->best_encoder(connector);
244
        if( encoder == NULL)
245
            continue;
246
247
 
248
249
 
250
251
 
3037 serge 252
                   connector, connector->base.id,
3031 serge 253
                   connector->status, connector->encoder,
254
                   crtc);
255
256
 
257
//            continue;
258
259
 
260
261
 
262
    };
263
264
 
265
};
266
267
 
268
 
2338 Serge 269
{
270
    struct drm_connector    *connector;
271
    struct drm_connector_helper_funcs *connector_funcs;
272
    struct drm_encoder      *encoder;
273
    struct drm_crtc         *crtc = NULL;
274
    struct drm_framebuffer  *fb;
275
276
 
277
    u32_t      ifl;
278
    int        err;
3033 serge 279
2338 Serge 280
 
281
    {
282
        if( connector->status != connector_status_connected)
283
            continue;
284
285
 
286
        encoder = connector_funcs->best_encoder(connector);
287
        if( encoder == NULL)
288
        {
289
            DRM_DEBUG_KMS("CONNECTOR %x ID: %d no active encoders\n",
3037 serge 290
                      connector, connector->base.id);
2338 Serge 291
            continue;
292
        }
293
        connector->encoder = encoder;
294
        crtc = encoder->crtc;
3031 serge 295
2338 Serge 296
 
3037 serge 297
               connector, connector->base.id,
2338 Serge 298
               connector->status, connector->encoder,
299
               crtc, crtc->base.id );
3031 serge 300
2338 Serge 301
 
302
    };
303
304
 
305
    {
306
        DRM_ERROR("No active connectors!\n");
3037 serge 307
        return -1;
2338 Serge 308
    };
309
310
 
311
    {
312
        struct drm_crtc *tmp_crtc;
313
        int crtc_mask = 1;
314
315
 
316
        {
317
            if (encoder->possible_crtcs & crtc_mask)
318
            {
319
                crtc = tmp_crtc;
320
                encoder->crtc = crtc;
321
                break;
322
            };
323
            crtc_mask <<= 1;
324
        };
325
    };
326
327
 
328
    {
329
        DRM_ERROR("No CRTC for encoder %d\n", encoder->base.id);
3037 serge 330
        return -1;
2338 Serge 331
    };
332
333
 
334
 
335
336
 
337
    os_display->ddev = dev;
338
    os_display->connector = connector;
339
    os_display->crtc = crtc;
340
341
 
342
343
 
344
 
345
    {
346
        struct intel_crtc *intel_crtc = to_intel_crtc(os_display->crtc);
347
348
 
349
        {
350
            init_cursor(cursor);
351
        };
352
353
 
354
        os_display->init_cursor    = init_cursor;
355
        os_display->select_cursor  = select_cursor_kms;
356
        os_display->show_cursor    = NULL;
357
        os_display->move_cursor    = move_cursor_kms;
358
        os_display->restore_cursor = restore_cursor;
359
        os_display->disable_mouse  = disable_mouse;
360
361
 
362
        intel_crtc->cursor_y = os_display->height/2;
363
364
 
365
    };
366
    safe_sti(ifl);
367
368
 
2351 Serge 369
370
 
2342 Serge 371
2340 Serge 372
 
2338 Serge 373
};
374
375
 
376
 
377
{
378
    int err = -1;
379
380
 
3031 serge 381
2338 Serge 382
 
383
    {
384
        *count = os_display->supported_modes;
385
        err = 0;
386
    }
387
    else if( mode != NULL )
388
    {
389
        struct drm_display_mode  *drmmode;
390
        int i = 0;
391
392
 
393
            *count = os_display->supported_modes;
394
395
 
396
        {
397
            if( i < *count)
398
            {
399
                mode->width  = drm_mode_width(drmmode);
400
                mode->height = drm_mode_height(drmmode);
401
                mode->bpp    = 32;
402
                mode->freq   = drm_mode_vrefresh(drmmode);
403
                i++;
404
                mode++;
405
            }
406
            else break;
407
        };
408
        *count = i;
409
        err = 0;
410
    };
411
    return err;
412
};
413
414
 
415
{
416
    int err = -1;
417
418
 
3031 serge 419
//               mode->width, mode->height, mode->freq);
420
2338 Serge 421
 
422
        (mode->height != 0)  &&
423
        (mode->freq   != 0 ) &&
424
        ( (mode->width   != os_display->width)  ||
425
          (mode->height  != os_display->height) ||
426
          (mode->freq    != os_display->vrefresh) ) )
427
    {
428
        if( set_mode(os_display->ddev, os_display->connector, mode, true) )
429
            err = 0;
430
    };
431
432
 
433
};
434
435
 
436
{
437
    list_del(&cursor->list);
3037 serge 438
2342 Serge 439
 
3037 serge 440
441
 
442
    drm_gem_object_unreference(&cursor->cobj->base);
443
    mutex_unlock(&main_device->struct_mutex);
444
445
 
2338 Serge 446
};
447
448
 
449
{
450
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
451
    struct drm_i915_gem_object *obj;
452
    uint32_t *bits;
453
    uint32_t *src;
454
    void     *mapped;
3037 serge 455
2338 Serge 456
 
457
    int       ret;
458
459
 
460
    {
461
        bits = (uint32_t*)KernelAlloc(CURSOR_WIDTH*CURSOR_HEIGHT*4);
462
        if (unlikely(bits == NULL))
463
            return ENOMEM;
464
        cursor->cobj = (struct drm_i915_gem_object *)GetPgAddr(bits);
465
    }
466
    else
467
    {
468
        obj = i915_gem_alloc_object(os_display->ddev, CURSOR_WIDTH*CURSOR_HEIGHT*4);
469
        if (unlikely(obj == NULL))
470
            return -ENOMEM;
471
472
 
3031 serge 473
        if (ret) {
2338 Serge 474
            drm_gem_object_unreference(&obj->base);
2344 Serge 475
            return ret;
2338 Serge 476
        }
477
478
 
479
 * GTT space is continuous. I guarantee it.                           */
480
481
 
3037 serge 482
                    CURSOR_WIDTH*CURSOR_HEIGHT*4, PG_SW);
2338 Serge 483
484
 
485
        {
486
            i915_gem_object_unpin(obj);
2344 Serge 487
            drm_gem_object_unreference(&obj->base);
488
            return -ENOMEM;
2338 Serge 489
        };
490
        cursor->cobj = obj;
491
    };
492
493
 
494
495
 
496
    {
497
        for(j = 0; j < 32; j++)
498
            *bits++ = *src++;
499
        for(j = 32; j < CURSOR_WIDTH; j++)
500
            *bits++ = 0;
501
    }
502
    for(i = 0; i < CURSOR_WIDTH*(CURSOR_HEIGHT-32); i++)
503
        *bits++ = 0;
504
505
 
3037 serge 506
507
 
2338 Serge 508
509
 
2340 Serge 510
2338 Serge 511
 
512
513
 
514
515
 
516
}
517
518
 
519
 
520
{
521
    struct drm_device *dev = crtc->dev;
522
    struct drm_i915_private *dev_priv = dev->dev_private;
523
    struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
524
    int pipe = intel_crtc->pipe;
525
    bool visible = base != 0;
526
527
 
528
        uint32_t cntl = I915_READ(CURCNTR(pipe));
529
        if (base) {
530
            cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
531
            cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
532
            cntl |= pipe << 28; /* Connect to correct pipe */
533
        } else {
534
            cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE);
535
            cntl |= CURSOR_MODE_DISABLE;
536
        }
537
        I915_WRITE(CURCNTR(pipe), cntl);
538
539
 
540
    }
541
    /* and commit changes on next vblank */
542
    I915_WRITE(CURBASE(pipe), base);
543
}
544
545
 
546
{
547
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
548
    struct intel_crtc *intel_crtc = to_intel_crtc(os_display->crtc);
549
    u32 base, pos;
550
    bool visible;
551
552
 
553
554
 
555
    intel_crtc->cursor_y = y;
556
557
 
558
    y = y - cursor->hot_y;
559
560
 
561
 
562
563
 
564
    if (x >= os_display->width)
565
        base = 0;
566
567
 
568
        base = 0;
569
570
 
571
    {
572
        if (x + intel_crtc->cursor_width < 0)
573
            base = 0;
574
575
 
576
        x = -x;
577
    }
578
    pos |= x << CURSOR_X_SHIFT;
579
580
 
581
    {
582
        if (y + intel_crtc->cursor_height < 0)
583
            base = 0;
584
585
 
586
        y = -y;
587
    }
588
    pos |= y << CURSOR_Y_SHIFT;
589
590
 
591
    if (!visible && !intel_crtc->cursor_visible)
592
        return;
593
594
 
595
//    if (IS_845G(dev) || IS_I865G(dev))
596
//        i845_update_cursor(crtc, base);
597
//    else
598
        i9xx_update_cursor(os_display->crtc, base);
599
600
 
601
602
 
603
 
604
{
605
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
606
    struct intel_crtc *intel_crtc = to_intel_crtc(os_display->crtc);
607
    cursor_t *old;
608
609
 
610
    os_display->cursor = cursor;
611
612
 
613
       intel_crtc->cursor_addr = cursor->cobj->gtt_offset;
614
    else
615
        intel_crtc->cursor_addr = (addr_t)cursor->cobj;
2352 Serge 616
2338 Serge 617
 
618
    intel_crtc->cursor_height = 32;
619
620
 
621
    return old;
622
};
623
624
 
2340 Serge 625
 
626
 
2342 Serge 627
 
3033 serge 628
 
629
630
 
631
 
2342 Serge 632
{
2338 Serge 633
    int left;
2342 Serge 634
    int top;
635
    int right;
636
    int bottom;
637
}rect_t;
638
2338 Serge 639
 
2342 Serge 640
 
641
642
 
643
644
 
645
646
 
647
{
648
    u32_t   addr;
649
650
 
651
    addr+= sizeof(display_t);            /*  shoot me  */
652
    return *(u32_t*)addr;
653
}
654
655
 
3033 serge 656
#define XY_SRC_COPY_BLT_CMD         ((2<<29)|(0x53<<22)|6)
657
#define XY_SRC_COPY_CHROMA_CMD     ((2<<29)|(0x73<<22)|8)
2342 Serge 658
#define ROP_COPY_SRC               0xCC
659
#define FORMAT8888                 3
660
661
 
3033 serge 662
#define BLT_WRITE_RGB               (1<<20)
663
664
 
665
 
666
 
2342 Serge 667
668
 
669
 
3037 serge 670
 
3033 serge 671
i915_gem_execbuffer_retire_commands(struct drm_device *dev,
672
                    struct drm_file *file,
3037 serge 673
                    struct intel_ring_buffer *ring)
3033 serge 674
{
675
    /* Unconditionally force add_request to emit a full flush. */
3037 serge 676
    ring->gpu_caches_dirty = true;
677
3033 serge 678
 
679
    (void)i915_add_request(ring, file, NULL);
3037 serge 680
}
3033 serge 681
682
 
2342 Serge 683
               int src_x, int src_y, u32 w, u32 h)
684
{
685
    drm_i915_private_t *dev_priv = main_device->dev_private;
2340 Serge 686
    struct intel_ring_buffer *ring;
687
    struct context *context;
3033 serge 688
2338 Serge 689
 
2342 Serge 690
    rect_t     winrc;
691
    clip_t     dst_clip;
692
    clip_t     src_clip;
693
    u32_t      width;
694
    u32_t      height;
695
2338 Serge 696
 
2342 Serge 697
    u32_t      offset;
698
    u8         slot;
699
    int      n=0;
2340 Serge 700
    int        ret;
3037 serge 701
2338 Serge 702
 
2342 Serge 703
        return -1;
704
2338 Serge 705
 
3033 serge 706
2338 Serge 707
 
2342 Serge 708
        return -1;
709
2338 Serge 710
 
3033 serge 711
    if(unlikely(context == NULL))
712
        return -1;
713
2338 Serge 714
 
2342 Serge 715
2338 Serge 716
 
2342 Serge 717
    dst_clip.ymin   = 0;
718
    dst_clip.xmax   = winrc.right-winrc.left-1;
719
    dst_clip.ymax   = winrc.bottom -winrc.top-1;
3037 serge 720
2338 Serge 721
 
2342 Serge 722
    src_clip.ymin   = 0;
723
    src_clip.xmax   = bitmap->width  - 1;
724
    src_clip.ymax   = bitmap->height - 1;
725
2338 Serge 726
 
2342 Serge 727
    height = h;
728
2338 Serge 729
 
2342 Serge 730
                  &src_clip, &src_x, &src_y,
731
                  &width, &height) )
732
        return 0;
733
2340 Serge 734
 
2342 Serge 735
    dst_y+= winrc.top;
736
2340 Serge 737
 
2342 Serge 738
2340 Serge 739
 
2342 Serge 740
2340 Serge 741
 
2342 Serge 742
#if 0
743
        static v4si write_mask = {0xFF000000, 0xFF000000,
744
                                  0xFF000000, 0xFF000000};
745
2340 Serge 746
 
2342 Serge 747
        u8* dst_offset;
748
2340 Serge 749
 
2342 Serge 750
        src_offset += (u32)bitmap->uaddr;
751
2340 Serge 752
 
2342 Serge 753
        dst_offset+= get_display_map();
754
2340 Serge 755
 
2342 Serge 756
2340 Serge 757
 
2342 Serge 758
        "movdqa     %[write_mask],  %%xmm7    \n"
759
        "movd       %[slot_mask],   %%xmm6    \n"
760
        "punpckldq  %%xmm6, %%xmm6            \n"
761
        "punpcklqdq %%xmm6, %%xmm6            \n"
762
        :: [write_mask] "m" (write_mask),
763
           [slot_mask]  "g" (slot_mask)
764
        :"xmm7", "xmm6");
765
2340 Serge 766
 
2342 Serge 767
        {
768
            u32_t tmp_w = width;
769
2340 Serge 770
 
2342 Serge 771
            u8* tmp_dst = dst_offset;
772
2340 Serge 773
 
2342 Serge 774
            dst_offset+= os_display->width;
775
2340 Serge 776
 
2342 Serge 777
            {
778
                __asm__ __volatile__ (
779
                "movq       (%0),   %%xmm0            \n"
780
                "punpcklbw  %%xmm0, %%xmm0            \n"
781
                "movdqa     %%xmm0, %%xmm1            \n"
782
                "punpcklwd  %%xmm0, %%xmm0            \n"
783
                "punpckhwd  %%xmm1, %%xmm1            \n"
784
                "pcmpeqb    %%xmm6, %%xmm0            \n"
785
                "pcmpeqb    %%xmm6, %%xmm1            \n"
786
                "maskmovdqu %%xmm7, %%xmm0            \n"
787
                "addl       $16, %%edi                \n"
788
                "maskmovdqu %%xmm7, %%xmm1            \n"
789
                :: "r" (tmp_dst), "D" (tmp_src)
790
                :"xmm0", "xmm1");
791
                __asm__ __volatile__ ("":::"edi");
792
                tmp_w -= 8;
793
                tmp_src += 32;
794
                tmp_dst += 8;
795
            };
796
2340 Serge 797
 
2342 Serge 798
            {
799
                __asm__ __volatile__ (
800
                "movd       (%0),   %%xmm0            \n"
801
                "punpcklbw  %%xmm0, %%xmm0            \n"
802
                "punpcklwd  %%xmm0, %%xmm0            \n"
803
                "pcmpeqb    %%xmm6, %%xmm0            \n"
804
                "maskmovdqu %%xmm7, %%xmm0            \n"
805
                :: "r" (tmp_dst), "D" (tmp_src)
806
                :"xmm0");
807
                tmp_w -= 4;
808
                tmp_src += 16;
809
                tmp_dst += 4;
810
            };
811
2340 Serge 812
 
2342 Serge 813
            {
814
                *(tmp_src+3) = (*tmp_dst==slot)?0xFF:0x00;
815
                tmp_src+=4;
816
                tmp_dst++;
817
            };
818
        };
819
#else
820
        u8* src_offset;
821
        u8* dst_offset;
822
        u32 ifl;
2351 Serge 823
2340 Serge 824
 
2342 Serge 825
        src_offset += (u32)bitmap->uaddr;
826
2340 Serge 827
 
2342 Serge 828
        dst_offset+= get_display_map();
829
830
 
831
832
 
2351 Serge 833
        while( tmp_h--)
2342 Serge 834
        {
835
            u32_t tmp_w = width;
836
837
 
838
            u8* tmp_dst = dst_offset;
839
840
 
841
            dst_offset+= os_display->width;
842
843
 
844
            {
845
                *(tmp_src+3) = (*tmp_dst==slot)?0xFF:0x00;
846
                tmp_src+=4;
847
                tmp_dst++;
848
            };
849
        };
850
      safe_sti(ifl);
2351 Serge 851
    }
2342 Serge 852
#endif
853
854
 
3033 serge 855
        context->cmd_buffer&= 0xFFFFF000;
856
2342 Serge 857
 
3033 serge 858
2342 Serge 859
 
3033 serge 860
2342 Serge 861
 
862
    cmd |= 3 << 17;
863
864
 
2340 Serge 865
    br13|= ROP_COPY_SRC << 16;
2342 Serge 866
    br13|= FORMAT8888   << 24;
867
2340 Serge 868
 
869
    b[n++] = br13;
870
    b[n++] = (dst_y << 16) | dst_x;                   // left, top
2342 Serge 871
    b[n++] = ((dst_y+height-1)<< 16)|(dst_x+width-1); // bottom, right
872
    b[n++] = 0;                          // destination
873
    b[n++] = (src_y << 16) | src_x;      // source left & top
874
    b[n++] = bitmap->pitch;              // source pitch
875
    b[n++] = bitmap->gaddr;              // source
876
2340 Serge 877
 
2342 Serge 878
    b[n++] = 0x00FFFFFF;                 // Transparency Color High
879
2340 Serge 880
 
881
    if( n & 1)
882
        b[n++] = MI_NOOP;
883
884
 
3033 serge 885
2340 Serge 886
 
3037 serge 887
3033 serge 888
 
3037 serge 889
 
890
891
 
892
893
 
2342 Serge 894
    {
2351 Serge 895
        u32 seqno;
3037 serge 896
        int i;
897
2351 Serge 898
 
2342 Serge 899
//        printf("dispatch...  ");
3033 serge 900
3037 serge 901
 
902
        intel_ring_invalidate_all_caches(ring);
903
904
 
905
//        printf("seqno = %d\n", seqno);
906
907
 
908
            if (seqno < ring->sync_seqno[i]) {
909
            /* The GPU can not handle its semaphore value wrapping,
910
             * so every billion or so execbuffers, we need to stall
911
             * the GPU in order to reset the counters.
912
             */
913
                DRM_DEBUG("wrap seqno\n");
914
915
 
916
                if (ret)
917
                    goto fail;
918
                i915_gem_retire_requests(main_device);
919
920
 
921
            }
922
        }
923
924
 
925
        if (ret)
926
            goto fail;
927
//        printf("done\n");
3033 serge 928
2351 Serge 929
 
3037 serge 930
        bitmap->obj->base.write_domain = bitmap->obj->base.pending_write_domain;
931
        bitmap->obj->fenced_gpu_access = bitmap->obj->pending_fenced_gpu_access;
932
933
 
934
935
 
936
//        printf("retire\n");
3033 serge 937
    }
2351 Serge 938
    else
2342 Serge 939
    {
2351 Serge 940
        ring = &dev_priv->ring[RCS];
2342 Serge 941
        ring->dispatch_execbuffer(ring, offset, n*4);
3033 serge 942
        ring->flush(ring, 0, I915_GEM_DOMAIN_RENDER);
2351 Serge 943
    };
944
2342 Serge 945
 
3037 serge 946
//    bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU;
947
2340 Serge 948
 
3037 serge 949
fail:
2351 Serge 950
    return ret;
3037 serge 951
};
2351 Serge 952
2340 Serge 953
 
2344 Serge 954
 
3033 serge 955
956
 
957
/* For display hotplug interrupt */
2351 Serge 958
static void
959
ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
960
{
961
    if ((dev_priv->irq_mask & mask) != 0) {
962
        dev_priv->irq_mask &= ~mask;
963
        I915_WRITE(DEIMR, dev_priv->irq_mask);
964
        POSTING_READ(DEIMR);
965
    }
966
}
967
2340 Serge 968
 
2351 Serge 969
{
970
    drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
971
    unsigned long irqflags;
972
973
 
974
//        return -EINVAL;
975
976
 
977
    ironlake_enable_display_irq(dev_priv, (pipe == 0) ?
978
                    DE_PIPEA_VBLANK : DE_PIPEB_VBLANK);
979
    spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
980
981
 
2340 Serge 982
}
2351 Serge 983
984
 
985
 
986
 
987
{
988
    drm_i915_private_t *dev_priv = dev->dev_private;
989
    int ret, i, pipe;
990
991
 
992
        dbgprintf("Interrupt enable:    %08x\n",
993
               I915_READ(IER));
994
        dbgprintf("Interrupt identity:  %08x\n",
995
               I915_READ(IIR));
996
        dbgprintf("Interrupt mask:      %08x\n",
997
               I915_READ(IMR));
998
        for_each_pipe(pipe)
999
            dbgprintf("Pipe %c stat:         %08x\n",
1000
                   pipe_name(pipe),
1001
                   I915_READ(PIPESTAT(pipe)));
1002
    } else {
1003
        dbgprintf("North Display Interrupt enable:      %08x\n",
1004
           I915_READ(DEIER));
1005
        dbgprintf("North Display Interrupt identity:    %08x\n",
1006
           I915_READ(DEIIR));
1007
        dbgprintf("North Display Interrupt mask:        %08x\n",
1008
           I915_READ(DEIMR));
1009
        dbgprintf("South Display Interrupt enable:      %08x\n",
1010
           I915_READ(SDEIER));
1011
        dbgprintf("South Display Interrupt identity:    %08x\n",
1012
           I915_READ(SDEIIR));
1013
        dbgprintf("South Display Interrupt mask:        %08x\n",
1014
           I915_READ(SDEIMR));
1015
        dbgprintf("Graphics Interrupt enable:           %08x\n",
1016
           I915_READ(GTIER));
1017
        dbgprintf("Graphics Interrupt identity:         %08x\n",
1018
           I915_READ(GTIIR));
1019
        dbgprintf("Graphics Interrupt mask:             %08x\n",
1020
               I915_READ(GTIMR));
1021
    }
1022
    dbgprintf("Interrupts received: %d\n",
1023
           atomic_read(&dev_priv->irq_received));
1024
    for (i = 0; i < I915_NUM_RINGS; i++) {
1025
        if (IS_GEN6(dev) || IS_GEN7(dev)) {
1026
            printf("Graphics Interrupt mask (%s):       %08x\n",
1027
                   dev_priv->ring[i].name,
1028
                   I915_READ_IMR(&dev_priv->ring[i]));
1029
        }
1030
//        i915_ring_seqno_info(m, &dev_priv->ring[i]);
1031
    }
1032
1033
 
1034
}
1035
1036
 
1037
                     int size)
1038
{
1039
    struct intel_ring_buffer *ring;
1040
    drm_i915_private_t *dev_priv = main_device->dev_private;
1041
    u32 invalidate;
1042
    u32 seqno = 2;
1043
1044
 
1045
//    dbgprintf("execute %x size %d\n", offset, size);
1046
1047
 
1048
//    "mfence \n"
1049
//    "wbinvd \n"
1050
//    "mfence  \n"
1051
//    :::"memory");
1052
1053
 
1054
    ring->dispatch_execbuffer(ring, offset, size);
1055
1056
 
1057
    if (INTEL_INFO(main_device)->gen >= 4)
1058
        invalidate |= I915_GEM_DOMAIN_SAMPLER;
1059
    if (ring->flush(ring, invalidate, 0))
1060
        i915_gem_next_request_seqno(ring);
1061
1062
 
1063
1064
 
1065
1066
 
1067
1068
 
2340 Serge 1069
2351 Serge 1070
 
1071
 
1072
               int src_x, int src_y, u32 w, u32 h)
1073
{
1074
    drm_i915_private_t *dev_priv = main_device->dev_private;
1075
1076
 
1077
    bitmap_t   screen;
1078
1079
 
1080
1081
 
1082
//              hbitmap, dst_x, dst_y, src_x, src_y, w, h);
1083
1084
 
1085
        return -1;
1086
1087
 
1088
//    dbgprintf("bitmap %x\n", src_bitmap);
1089
1090
 
1091
        return -1;
1092
1093
 
1094
1095
 
1096
    screen.gaddr  = 0;
1097
    screen.width  = os_display->width;
1098
    screen.height = os_display->height;
1099
    screen.obj    = (void*)-1;
1100
1101
 
1102
1103
 
1104
    dst_y+= winrc.top;
1105
1106
 
1107
1108
 
1109
1110
 
2361 Serge 1111
                  int w, int h, bitmap_t *src_bitmap, int src_x, int src_y,
1112
                  bitmap_t *mask_bitmap);
1113
2360 Serge 1114
 
2361 Serge 1115
 
1116
             int src_x, int src_y, u32 w, u32 h)
1117
{
1118
    drm_i915_private_t *dev_priv = main_device->dev_private;
1119
    struct context *ctx;
1120
1121
 
1122
    bitmap_t   screen;
1123
    int        ret;
1124
1125
 
1126
    rect_t     winrc;
1127
1128
 
1129
//              hbitmap, dst_x, dst_y, src_x, src_y, w, h);
1130
1131
 
1132
        return -1;
1133
1134
 
1135
//    dbgprintf("bitmap %x\n", src_bitmap);
1136
1137
 
1138
        return -1;
1139
1140
 
1141
    if(unlikely(ctx==NULL))
1142
    {
1143
        ret = create_context();
1144
        if(ret!=0)
1145
            return -1;
1146
1147
 
1148
    };
1149
1150
 
1151
1152
 
1153
    dst_x+= winrc.left;
1154
    dst_y+= winrc.top;
1155
1156
 
1157
 
1158
    {
1159
        u8* src_offset;
1160
        u8* dst_offset;
1161
        u32 slot;
3031 serge 1162
        u32 ifl;
2361 Serge 1163
1164
 
1165
        if(ret !=0 )
1166
        {
1167
            dbgprintf("%s fail\n", __FUNCTION__);
1168
            return ret;
1169
        };
1170
1171
 
3031 serge 1172
2361 Serge 1173
 
1174
        mask_bitmap->height = winrc.bottom;
1175
        mask_bitmap->pitch =  ALIGN(w,64);
1176
1177
 
3031 serge 1178
//        slot = 0x01;
1179
1180
 
2361 Serge 1181
1182
 
1183
 
1184
        "movd       %[slot],   %%xmm6    \n"
1185
        "punpckldq  %%xmm6, %%xmm6            \n"
1186
        "punpcklqdq %%xmm6, %%xmm6            \n"
1187
        :: [slot]  "m" (slot)
3031 serge 1188
        :"xmm6");
2361 Serge 1189
1190
 
1191
1192
 
1193
        dst_offset+= get_display_map();
1194
1195
 
1196
1197
 
1198
        while( tmp_h--)
1199
        {
1200
            int tmp_w = mask_bitmap->width;
1201
1202
 
1203
            u8* tmp_dst = dst_offset;
1204
1205
 
1206
            dst_offset+= os_display->width;
1207
1208
 
1209
//            {
1210
//                *(tmp_src) = (*tmp_dst==slot)?0x1:0x00;
1211
//                tmp_src++;
1212
//                tmp_dst++;
1213
//            };
1214
            while(tmp_w >= 64)
1215
            {
1216
                __asm__ __volatile__ (
1217
                "movdqu     (%0),   %%xmm0            \n"
1218
                "movdqu   16(%0),   %%xmm1            \n"
1219
                "movdqu   32(%0),   %%xmm2            \n"
1220
                "movdqu   48(%0),   %%xmm3            \n"
1221
                "pcmpeqb    %%xmm6, %%xmm0            \n"
1222
                "pcmpeqb    %%xmm6, %%xmm1            \n"
1223
                "pcmpeqb    %%xmm6, %%xmm2            \n"
1224
                "pcmpeqb    %%xmm6, %%xmm3            \n"
1225
                "movdqa     %%xmm0,   (%%edi)         \n"
1226
                "movdqa     %%xmm1, 16(%%edi)         \n"
1227
                "movdqa     %%xmm2, 32(%%edi)         \n"
1228
                "movdqa     %%xmm3, 48(%%edi)         \n"
1229
1230
 
1231
                :"xmm0","xmm1","xmm2","xmm3");
1232
                tmp_w -= 64;
1233
                tmp_src += 64;
1234
                tmp_dst += 64;
1235
            }
1236
1237
 
1238
            {
1239
                __asm__ __volatile__ (
1240
                "movdqu     (%0),   %%xmm0            \n"
1241
                "movdqu   16(%0),   %%xmm1            \n"
1242
                "pcmpeqb    %%xmm6, %%xmm0            \n"
1243
                "pcmpeqb    %%xmm6, %%xmm1            \n"
1244
                "movdqa     %%xmm0,   (%%edi)         \n"
1245
                "movdqa     %%xmm1, 16(%%edi)         \n"
1246
1247
 
1248
                :"xmm0","xmm1");
1249
                tmp_w -= 32;
1250
                tmp_src += 32;
1251
                tmp_dst += 32;
1252
            }
1253
1254
 
1255
            {
1256
                __asm__ __volatile__ (
1257
                "movdqu     (%0),   %%xmm0            \n"
1258
                "pcmpeqb    %%xmm6, %%xmm0            \n"
1259
                "movdqa     %%xmm0,   (%%edi)         \n"
1260
                :: "r" (tmp_dst), "D" (tmp_src)
1261
                :"xmm0");
1262
                tmp_w -= 16;
1263
                tmp_src += 16;
1264
                tmp_dst += 16;
1265
            }
1266
        };
1267
      safe_sti(ifl);
1268
      ctx->seqno = os_display->mask_seqno;
1269
    }
1270
1271
 
1272
    screen.gaddr  = 0;
1273
    screen.width  = os_display->width;
1274
    screen.height = os_display->height;
1275
    screen.obj    = (void*)-1;
1276
1277
 
1278
1279
 
1280
 
1281
                 mask_bitmap);
1282
1283
 
1284
};
1285
1286
 
1287
 
3031 serge 1288
2361 Serge 1289
 
1290
 
1291
 
1292
 
1293
 
1294
 
1295
 
1296
 
2360 Serge 1297
{
1298
    unsigned long irqflags;
1299
1300
 
1301
//               cwq, &cwq->worklist, cwq->worklist.next);
1302
1303
 
1304
1305
 
1306
    {
1307
        struct work_struct *work = list_entry(cwq->worklist.next,
1308
                                        struct work_struct, entry);
1309
        work_func_t f = work->func;
1310
        list_del_init(cwq->worklist.next);
1311
//        dbgprintf("head %x, next %x\n",
1312
//                  &cwq->worklist, cwq->worklist.next);
1313
1314
 
1315
        f(work);
1316
        spin_lock_irqsave(&cwq->lock, irqflags);
1317
    }
1318
1319
 
1320
}
1321
1322
 
1323
 
1324
int __queue_work(struct workqueue_struct *wq,
1325
                         struct work_struct *work)
1326
{
1327
    unsigned long flags;
1328
1329
 
1330
//               wq, work );
1331
1332
 
1333
        return 0;
1334
1335
 
1336
1337
 
1338
        TimerHs(0,0, run_workqueue, wq);
1339
1340
 
1341
1342
 
1343
//    dbgprintf("wq: %x head %x, next %x\n",
1344
//               wq, &wq->worklist, wq->worklist.next);
1345
1346
 
1347
};
1348
1349
 
1350
{
1351
    struct delayed_work *dwork = (struct delayed_work *)__data;
1352
    struct workqueue_struct *wq = dwork->work.data;
1353
1354
 
1355
//               wq, &dwork->work );
1356
1357
 
1358
}
1359
1360
 
1361
 
1362
                        struct delayed_work *dwork, unsigned long delay)
1363
{
1364
    struct work_struct *work = &dwork->work;
1365
1366
 
1367
    TimerHs(0,0, delayed_work_timer_fn, dwork);
1368
    return 1;
1369
}
1370
1371
 
1372
                        struct delayed_work *dwork, unsigned long delay)
1373
{
1374
    u32  flags;
1375
1376
 
1377
//               wq, &dwork->work );
1378
1379
 
1380
        return __queue_work(wq, &dwork->work);
1381
1382
 
1383
}
1384
1385
 
1386
 
1387
                           unsigned int flags,
1388
                           int max_active)
1389
{
1390
    struct workqueue_struct *wq;
1391
1392
 
1393
    if (!wq)
1394
        goto err;
1395
1396
 
1397
1398
 
1399
err:
1400
    return NULL;
1401
}
1402
1403
 
3031 serge 1404
2360 Serge 1405
 
3031 serge 1406
{
1407
    u32 tmp = GetTimerTicks();
1408
2360 Serge 1409
 
3031 serge 1410
    ts->tv_nsec = (tmp - ts->tv_sec*100)*10000000;
1411
}
1412
2360 Serge 1413
 
3031 serge 1414
{
1415
        while (nsec >= NSEC_PER_SEC) {
1416
                nsec -= NSEC_PER_SEC;
1417
                ++sec;
1418
        }
1419
        while (nsec < 0) {
1420
                nsec += NSEC_PER_SEC;
1421
                --sec;
1422
        }
1423
        ts->tv_sec = sec;
1424
        ts->tv_nsec = nsec;
1425
}
1426
2360 Serge 1427
 
3031 serge 1428
 
1429