Subversion Repositories Kolibri OS

Rev

Rev 6283 | Rev 6320 | 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
 
6283 serge 14
#include 
5354 serge 15
2338 Serge 16
 
6283 serge 17
void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb);
18
void init_system_cursors(struct drm_device *dev);
19
2338 Serge 20
 
6283 serge 21
22
 
5354 serge 23
2338 Serge 24
 
5354 serge 25
u32 cmd_offset;
26
2340 Serge 27
 
2351 Serge 28
int  sna_init();
29
30
 
3031 serge 31
{
32
    static char name[4];
33
34
 
35
    name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xE0) >> 5) + '@';
36
    name[2] = (x[1] & 0x1F) + '@';
37
    name[3] = 0;
38
39
 
40
}
41
42
 
6088 serge 43
{
44
    struct drm_display_mode  *mode;
45
    int count = 0;
46
47
 
48
        count++;
49
50
 
51
};
52
53
 
6283 serge 54
{
55
    struct drm_i915_private *dev_priv = dev->dev_private;
56
    struct intel_fbdev     *ifbdev = dev_priv->fbdev;
57
    struct intel_framebuffer *intel_fb = ifbdev->fb;
58
    struct drm_framebuffer *fb = &intel_fb->base;
59
    struct drm_i915_gem_object *obj = NULL;
60
    int stride, size;
61
62
 
63
64
 
65
66
 
67
    {
68
        int gen3size;
69
70
 
71
            for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1);
72
        else
73
            stride = ALIGN(stride, 512);
74
        size = stride * ALIGN(mode->vdisplay, 8);
75
76
 
77
        {
78
            for (gen3size = 1024*1024; gen3size < size; gen3size <<= 1);
79
            size = gen3size;
80
        }
81
        else
82
            size = ALIGN(size, 4096);
83
    }
84
    else
85
    {
86
        stride = ALIGN(stride, 64);
87
        size = stride * ALIGN(mode->vdisplay, 2);
88
    }
89
90
 
6296 serge 91
6283 serge 92
 
93
    {
94
        struct drm_mode_fb_cmd2 mode_cmd = {};
95
        int ret;
96
97
 
98
        drm_framebuffer_remove(fb);
99
        ifbdev->fb = NULL;
100
        fb = NULL;
101
        DRM_DEBUG_KMS("create new framebuffer\n");
102
103
 
104
        mode_cmd.height = mode->vdisplay;
105
106
 
107
        mode_cmd.pixel_format = DRM_FORMAT_XRGB8888;
108
109
 
110
111
 
112
        * important and we should probably use that space with FBC or other
113
        * features. */
114
        if (size * 2 < dev_priv->gtt.stolen_usable_size)
115
            obj = i915_gem_object_create_stolen(dev, size);
116
        if (obj == NULL)
117
            obj = i915_gem_alloc_object(dev, size);
118
        if (!obj) {
119
            DRM_ERROR("failed to allocate framebuffer\n");
120
            ret = -ENOMEM;
121
            goto out;
122
        }
123
124
 
125
        if (IS_ERR(fb)) {
126
            ret = PTR_ERR(fb);
127
            goto out_unref;
128
        }
129
130
 
131
        ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL, NULL, NULL);
132
        if (ret) {
133
            DRM_ERROR("failed to pin obj: %d\n", ret);
134
            goto out_fb;
135
        }
136
        mutex_unlock(&dev->struct_mutex);
137
        ifbdev->fb = to_intel_framebuffer(fb);
138
    }
139
140
 
141
142
 
143
    {
144
        obj->tiling_mode = I915_TILING_X;
145
        fb->modifier[0]  = I915_FORMAT_MOD_X_TILED;
146
        obj->fence_dirty = true;
147
        obj->stride      = stride;
148
    };
149
150
 
6296 serge 151
    {
152
        int ret;
153
154
 
155
        idr_preload(GFP_KERNEL);
156
        ret = idr_alloc(&dev->object_name_idr, &obj->base, 1, 0, GFP_NOWAIT);
157
        idr_preload_end();
158
        mutex_unlock(&dev->object_name_lock);
159
        obj->base.name = ret;
160
        obj->base.handle_count++;
161
        DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, obj->base.name );
162
    }
163
164
 
6283 serge 165
    fb->height = mode->vdisplay;
166
167
 
168
    fb->pitches[1]  =
169
    fb->pitches[2]  =
170
    fb->pitches[3]  = stride;
171
172
 
173
    fb->depth = 24;
174
LEAVE();
175
    return fb;
176
177
 
178
    drm_framebuffer_remove(fb);
179
out_unref:
180
    drm_gem_object_unreference(&obj->base);
181
out:
182
    mutex_unlock(&dev->struct_mutex);
183
    return NULL;
184
}
185
186
 
5060 serge 187
                    struct drm_crtc *crtc, videomode_t *reqmode, bool strict)
188
{
3031 serge 189
    struct drm_i915_private *dev_priv = dev->dev_private;
6296 serge 190
    struct drm_mode_config  *config   = &dev->mode_config;
191
    struct drm_display_mode *mode     = NULL, *tmpmode;
192
    struct drm_connector    *tmpc;
6088 serge 193
    struct drm_framebuffer  *fb       = NULL;
6296 serge 194
    struct drm_mode_set     set;
3031 serge 195
    char  con_edid[128];
6283 serge 196
    int ret;
3031 serge 197
198
 
5060 serge 199
3031 serge 200
 
6088 serge 201
    {
202
        const struct drm_connector_funcs *f = tmpc->funcs;
203
        if(tmpc == connector)
204
            continue;
205
        f->dpms(tmpc, DRM_MODE_DPMS_OFF);
206
    };
207
208
 
3031 serge 209
    {
210
        if( (tmpmode->hdisplay == reqmode->width)  &&
5060 serge 211
            (tmpmode->vdisplay == reqmode->height) &&
212
            (drm_mode_vrefresh(tmpmode) == reqmode->freq) )
3031 serge 213
        {
214
            mode = tmpmode;
215
            goto do_set;
216
        }
217
    };
218
219
 
220
    {
221
        list_for_each_entry(tmpmode, &connector->modes, head)
222
        {
223
            if( (tmpmode->hdisplay == reqmode->width)  &&
5060 serge 224
                (tmpmode->vdisplay == reqmode->height) )
225
            {
3031 serge 226
                mode = tmpmode;
227
                goto do_set;
228
            }
229
        };
230
    };
231
232
 
6283 serge 233
    drm_modeset_unlock_all(dev);
234
    DRM_ERROR("%s failed\n", __FUNCTION__);
3037 serge 235
    return -1;
3031 serge 236
237
 
238
239
 
6283 serge 240
6088 serge 241
 
6283 serge 242
    if(fb == NULL)
243
    {
244
        DRM_ERROR("%s failed\n", __FUNCTION__);
245
        return -1;
246
    };
247
    drm_framebuffer_reference(fb);
248
3031 serge 249
 
6283 serge 250
6088 serge 251
 
252
6283 serge 253
 
254
                  "monitor: %s model %x serial number %u\n",
255
                mode->hdisplay, mode->vdisplay,
256
                crtc->base.id, connector->name,
257
                manufacturer_name(con_edid + 0x08),
6296 serge 258
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
259
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
260
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
261
6088 serge 262
 
3031 serge 263
264
 
265
    os_display->crtc = crtc;
266
267
 
6283 serge 268
            fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format);
6084 serge 269
270
 
3031 serge 271
    set.x = 0;
272
    set.y = 0;
273
    set.mode = mode;
274
    set.connectors = &connector;
275
    set.num_connectors = 1;
276
    set.fb = fb;
277
278
 
5060 serge 279
280
 
3031 serge 281
    {
282
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
6283 serge 283
        struct kos_framebuffer *kfb = intel_fb->private;
284
        kolibri_framebuffer_update(dev_priv, kfb);
285
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
286
287
 
288
        os_display->height   = mode->vdisplay;
289
        os_display->vrefresh = drm_mode_vrefresh(mode);
3031 serge 290
        sysSetFramebuffer(intel_fb->private);
6283 serge 291
        sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]);
292
3031 serge 293
 
6283 serge 294
        os_display->crtc = connector->encoder->crtc;
295
        os_display->supported_modes = count_connector_modes(connector);
296
3031 serge 297
 
6283 serge 298
        crtc->cursor_y = os_display->height/2;
299
300
 
301
302
 
3037 serge 303
                       mode->hdisplay, mode->vdisplay, fb->pitches[0]);
6283 serge 304
    }
3031 serge 305
    else
306
        DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
307
                   fb->width, fb->height, crtc);
308
309
 
6283 serge 310
    drm_modeset_unlock_all(dev);
6084 serge 311
312
 
3031 serge 313
}
314
315
 
6088 serge 316
                       struct drm_connector *connector, struct drm_display_mode *mode)
317
{
2338 Serge 318
    struct drm_i915_private *dev_priv = dev->dev_private;
6088 serge 319
    struct drm_connector    *tmpc;
320
    struct drm_mode_config  *config   = &dev->mode_config;
321
    struct drm_framebuffer  *fb       = NULL;
322
    struct drm_mode_set     set;
323
    struct drm_crtc *crtc = NULL;
6283 serge 324
325
 
6088 serge 326
    int stride;
327
    int ret;
328
2338 Serge 329
 
6283 serge 330
    if(fb == NULL)
331
    {
332
        DRM_ERROR("%s failed\n", __FUNCTION__);
333
        return -1;
334
    };
335
    drm_framebuffer_reference(fb);
336
337
 
6088 serge 338
339
 
340
    {
2338 Serge 341
        const struct drm_connector_funcs *f = tmpc->funcs;
6088 serge 342
        if(tmpc == connector)
343
            continue;
344
        f->dpms(tmpc, DRM_MODE_DPMS_OFF);
345
    };
2338 Serge 346
6088 serge 347
 
6283 serge 348
6088 serge 349
 
350
    DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n"
351
                  "monitor: %s model %x serial number %u\n",
352
                mode->hdisplay, mode->vdisplay,
6283 serge 353
                connector->encoder->crtc->base.id, connector->name,
6088 serge 354
                manufacturer_name(con_edid + 0x08),
355
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
356
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
357
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
358
359
 
6283 serge 360
361
 
362
    os_display->crtc = crtc;
363
364
 
6088 serge 365
            fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format);
366
367
 
6283 serge 368
    set.x = 0;
6088 serge 369
    set.y = 0;
370
    set.mode = mode;
371
    set.connectors = &connector;
372
    set.num_connectors = 1;
373
    set.fb = fb;
374
375
 
376
    if ( !ret )
377
    {
378
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
6283 serge 379
        struct kos_framebuffer *kfb = intel_fb->private;
380
        kolibri_framebuffer_update(dev_priv, kfb);
381
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
382
6088 serge 383
 
6283 serge 384
        os_display->height   = mode->vdisplay;
385
        os_display->vrefresh = drm_mode_vrefresh(mode);
6088 serge 386
        sysSetFramebuffer(intel_fb->private);
6283 serge 387
        sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]);
388
6088 serge 389
 
390
        os_display->crtc = connector->encoder->crtc;
391
        os_display->supported_modes = count_connector_modes(connector);
392
393
 
394
        crtc->cursor_y = os_display->height/2;
395
396
 
6283 serge 397
6088 serge 398
 
399
                       mode->hdisplay, mode->vdisplay, fb->pitches[0]);
6283 serge 400
    }
6088 serge 401
    else
402
        DRM_ERROR(" failed to set mode %d_%d on crtc %p\n",
403
                   fb->width, fb->height, connector->encoder->crtc);
404
405
 
6283 serge 406
    drm_modeset_unlock_all(dev);
6088 serge 407
    return ret;
408
}
409
410
 
411
{
412
    struct drm_display_mode *mode;
413
    int retval;
414
415
 
416
    if(mode == NULL)
417
        return EINVAL;
418
419
 
420
421
 
422
    return retval;
423
};
2338 Serge 424
425
 
5060 serge 426
{
3031 serge 427
    struct drm_crtc *tmp_crtc;
5060 serge 428
    int crtc_mask = 1;
429
3031 serge 430
 
5060 serge 431
    {
3031 serge 432
        if (encoder->possible_crtcs & crtc_mask)
5060 serge 433
        {
6084 serge 434
            encoder->crtc = tmp_crtc;
5060 serge 435
            DRM_DEBUG_KMS("use CRTC %p ID %d\n", tmp_crtc, tmp_crtc->base.id);
436
            return tmp_crtc;
437
        };
438
        crtc_mask <<= 1;
439
    };
3031 serge 440
    return NULL;
5060 serge 441
};
3031 serge 442
443
 
6088 serge 444
{
2338 Serge 445
    const struct drm_connector_helper_funcs *connector_funcs;
6088 serge 446
    struct drm_encoder   *encoder;
4560 Serge 447
    struct drm_crtc      *crtc;
5060 serge 448
2338 Serge 449
 
6088 serge 450
        return -EINVAL;
451
452
 
453
454
 
455
    {
456
        connector_funcs = connector->helper_private;
457
        encoder = connector_funcs->best_encoder(connector);
458
459
 
460
        {
461
            DRM_DEBUG_KMS("CONNECTOR %s ID: %d no active encoders\n",
462
            connector->name, connector->base.id);
463
            return -EINVAL;
464
        };
465
        connector->encoder = encoder;
6131 serge 466
    }
6088 serge 467
468
 
469
    if(crtc == NULL)
470
        crtc = get_possible_crtc(dev, encoder);
471
472
 
473
    {
474
        DRM_DEBUG_KMS("%s connector: %p encode: %p crtc: %p\n",__FUNCTION__,
6131 serge 475
               connector, encoder, crtc);
476
        return 0;
6088 serge 477
    }
478
    else
479
        DRM_DEBUG_KMS("No CRTC for encoder %d\n", encoder->base.id);
480
    return -EINVAL;
481
}
482
483
 
484
{
485
    struct drm_connector *connector;
486
487
 
5060 serge 488
    {
2338 Serge 489
        int name_len = __builtin_strlen(connector->name);
6088 serge 490
491
 
492
            continue;
2338 Serge 493
494
 
6088 serge 495
            continue;
496
5060 serge 497
 
6088 serge 498
            return connector;
499
    }
500
    return NULL;
501
}
502
5060 serge 503
 
2338 Serge 504
 
6088 serge 505
                  struct drm_crtc **boot_crtc)
506
{
507
    struct drm_connector *connector;
6103 serge 508
4371 Serge 509
 
6088 serge 510
    {
511
        connector = get_cmdline_connector(dev, i915.cmdline_mode);
512
        if(connector != NULL)
513
        {
5060 serge 514
            *boot_connector = connector;
515
            *boot_crtc = connector->encoder->crtc;
6088 serge 516
            return 0;
5060 serge 517
        }
518
    }
6088 serge 519
5060 serge 520
 
6088 serge 521
    {
522
        if(check_connector(dev, connector) == 0)
523
        {
524
            *boot_connector = connector;
525
            *boot_crtc = connector->encoder->crtc;
526
            return 0;
527
        };
528
    };
2338 Serge 529
530
 
5060 serge 531
};
4398 Serge 532
2338 Serge 533
 
6103 serge 534
 
5060 serge 535
{
4371 Serge 536
    struct drm_display_mode *mode;
537
538
 
539
    {
540
        if( os_display->width  == mode->hdisplay &&
5060 serge 541
            os_display->height == mode->vdisplay &&
542
            drm_mode_vrefresh(mode) == 60)
4371 Serge 543
        {
544
            usermode->width  = os_display->width;
545
            usermode->height = os_display->height;
546
            usermode->freq   = 60;
547
            return 1;
548
        }
549
    }
550
    return 0;
551
}
552
553
 
554
{
555
    struct drm_connector_helper_funcs *connector_funcs;
556
    struct drm_connector    *connector = NULL;
5060 serge 557
    struct drm_crtc         *crtc = NULL;
558
    struct drm_plane *plane;
6283 serge 559
4371 Serge 560
 
6296 serge 561
ENTER();
6283 serge 562
4371 Serge 563
 
6283 serge 564
    {
565
        drm_plane_helper_disable(plane);
566
    };
567
568
 
4371 Serge 569
    ret = choose_config(dev, &connector, &crtc);
5060 serge 570
    if(ret)
571
    {
4371 Serge 572
        mutex_unlock(&dev->mode_config.mutex);
6088 serge 573
        DRM_DEBUG_KMS("No active connectors!\n");
4371 Serge 574
        return -1;
575
    };
576
577
 
6283 serge 578
5060 serge 579
 
2338 Serge 580
    os_display->ddev = dev;
581
    os_display->connector = connector;
582
    os_display->crtc = crtc;
583
    os_display->supported_modes = count_connector_modes(connector);
584
    mutex_unlock(&dev->mode_config.mutex);
6088 serge 585
2338 Serge 586
 
6283 serge 587
6088 serge 588
 
589
590
 
591
        ret = set_cmdline_mode(dev, connector);
592
593
 
594
    {
4280 Serge 595
        mutex_lock(&dev->mode_config.mutex);
6088 serge 596
597
 
598
            (usermode->height == 0))
599
        {
4371 Serge 600
            if( !get_boot_mode(connector, usermode))
6088 serge 601
            {
602
                struct drm_display_mode *mode;
603
4280 Serge 604
 
6088 serge 605
                usermode->width  = mode->hdisplay;
606
                usermode->height = mode->vdisplay;
607
                usermode->freq   = drm_mode_vrefresh(mode);
608
            };
609
        };
4280 Serge 610
        mutex_unlock(&dev->mode_config.mutex);
6088 serge 611
612
 
613
    };
4280 Serge 614
615
 
6283 serge 616
2340 Serge 617
 
6088 serge 618
};
2338 Serge 619
620
 
621
 
6088 serge 622
{
623
    struct drm_connector_helper_funcs *connector_funcs;
624
    struct drm_connector    *connector;
625
    struct drm_cmdline_mode cmd_mode = {0};
6103 serge 626
    struct drm_display_mode *mode;
6088 serge 627
    char *mode_option;
628
    int retval = 0;
629
    char  con_edid[128];
630
631
 
632
        return EINVAL;
633
634
 
635
    connector = get_cmdline_connector(dev, cmdline);
636
    mutex_unlock(&dev->mode_config.mutex);
637
638
 
639
        return EINVAL;
640
641
 
642
    if(mode_option == NULL)
643
        return EINVAL;
644
645
 
646
647
 
648
        return EINVAL;
649
650
 
651
                   connector->name,
652
                   cmd_mode.xres, cmd_mode.yres,
653
                   cmd_mode.refresh_specified ? cmd_mode.refresh : 60,
654
                   cmd_mode.rb ? " reduced blanking" : "",
655
                   cmd_mode.margins ? " with margins" : "",
656
                   cmd_mode.interlace ?  " interlaced" : "");
657
658
 
659
    if(mode == NULL)
660
        return EINVAL;
661
662
 
663
    DRM_DEBUG_KMS("connector: %s monitor: %s model %x serial number %u\n",
664
            connector->name,
665
            manufacturer_name(con_edid + 0x08),
666
            (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
667
            (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
668
            + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
669
670
 
671
672
 
673
674
 
675
}
676
677
 
6103 serge 678
{
679
    struct drm_connector *connector;
680
    char  con_edid[128];
681
682
 
683
    list_for_each_entry(connector, &dev->mode_config.connector_list, head)
684
    {
685
        if( connector->status != connector_status_connected)
686
            continue;
687
688
 
689
690
 
691
        {
692
            printf("%s mode %dx%d connected %s model %x serial number %u\n",
693
                   connector->name, os_display->width, os_display->height,
694
                   manufacturer_name(con_edid + 0x08),
695
                   (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
696
                   (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
697
                   + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
698
            continue;
699
        }
700
        else
701
        {
702
            printf("%s connected: %s model %x serial number %u\n",
703
                connector->name, manufacturer_name(con_edid + 0x08),
704
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
705
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
706
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
707
        }
708
    };
709
    mutex_unlock(&dev->mode_config.mutex);
710
}
711
712
 
713
{
714
    struct drm_connector *connector;
715
    struct drm_display_mode  *drmmode;
716
717
 
718
719
 
720
    if(connector == NULL)
721
    {
722
        mutex_unlock(&dev->mode_config.mutex);
723
        return EINVAL;
724
    };
725
726
 
727
728
 
729
    {
730
        printf("%dx%d@%d\n", drmmode->hdisplay, drmmode->vdisplay, drm_mode_vrefresh(drmmode));
731
    };
732
733
 
734
    return 0;
735
};
736
737
 
2338 Serge 738
{
739
    int err = -1;
740
741
 
3031 serge 742
2338 Serge 743
 
744
    {
745
        *count = os_display->supported_modes;
746
        err = 0;
747
    }
748
    else if( mode != NULL )
749
    {
750
        struct drm_display_mode  *drmmode;
751
        int i = 0;
752
753
 
754
            *count = os_display->supported_modes;
755
756
 
757
        {
758
            if( i < *count)
759
            {
760
                mode->width  = drmmode->hdisplay;
5060 serge 761
                mode->height = drmmode->vdisplay;
762
                mode->bpp    = 32;
2338 Serge 763
                mode->freq   = drm_mode_vrefresh(drmmode);
764
                i++;
765
                mode++;
766
            }
767
            else break;
768
        };
769
        *count = i;
770
        err = 0;
771
    };
772
    return err;
773
};
774
775
 
776
{
777
778
 
3031 serge 779
//               mode->width, mode->height, mode->freq);
780
2338 Serge 781
 
782
        (mode->height != 0)  &&
783
        (mode->freq   != 0 ) &&
784
        ( (mode->width   != os_display->width)  ||
785
          (mode->height  != os_display->height) ||
786
          (mode->freq    != os_display->vrefresh) ) )
787
    {
788
        return set_mode(os_display->ddev, os_display->connector, os_display->crtc, mode, true);
5060 serge 789
    };
2338 Serge 790
791
 
5060 serge 792
};
2338 Serge 793
794
 
4126 Serge 795
{
796
    const struct drm_connector_funcs *f = os_display->connector->funcs;
4371 Serge 797
4126 Serge 798
 
799
};
800
801
 
6283 serge 802
 
803
{
2338 Serge 804
    u32 ifl;
6283 serge 805
2342 Serge 806
 
6283 serge 807
    {
808
        struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
809
        struct intel_crtc *crtc = to_intel_crtc(os_display->crtc);
810
        struct kos_framebuffer *kfb = os_display->current_lfb;
811
        struct intel_framebuffer *intel_fb = (struct intel_framebuffer*)kfb->private;
812
        struct drm_i915_gem_object *obj = intel_fb->obj;
813
3037 serge 814
 
6283 serge 815
        fb->width  = os_display->width;
816
        fb->height = os_display->height;
817
        fb->pitch  = obj->stride;
818
        fb->tiling = obj->tiling_mode;
819
        fb->crtc   = crtc->base.base.id;
820
        fb->pipe   = crtc->pipe;
821
    }
822
    safe_sti(ifl);
823
6296 serge 824
 
6283 serge 825
}
826
3037 serge 827
 
6283 serge 828
{
2338 Serge 829
    struct kos_framebuffer *kfb;
6283 serge 830
    addr_t dummy_table;
831
    addr_t *pt_addr = NULL;
832
    int pde;
833
6296 serge 834
 
6283 serge 835
    kfb->private = intel_fb;
836
2338 Serge 837
 
6283 serge 838
    {
839
        dummy_table = AllocPage();
840
        kfb->pde[pde] = dummy_table|PG_UW;
841
2338 Serge 842
 
6283 serge 843
        __builtin_memset(pt_addr,0,4096);
844
        kunmap((struct page*)dummy_table);
845
    };
846
847
 
848
6296 serge 849
 
6283 serge 850
#if 0
851
    struct sg_page_iter sg_iter;
852
    num_pages = obj->base.size/4096;
853
    printf("num_pages %d\n",num_pages);
854
855
 
856
    pde = 0;
857
    pt_addr = NULL;
858
859
 
860
    while (__sg_page_iter_next(&sg_iter))
861
    {
2338 Serge 862
        if (pt_addr == NULL)
6283 serge 863
        {
6296 serge 864
            addr_t pt = AllocPage();
6283 serge 865
            kfb->pde[pde] = pt|PG_UW;
866
            pde++;
867
            pt_addr = kmap_atomic((struct page*)pt);
868
        }
6296 serge 869
        pt_addr[pte] = sg_page_iter_dma_address(&sg_iter)|PG_UW|PG_WRITEC;
6283 serge 870
        if( (pte & 15) == 0)
871
            DRM_DEBUG_KMS("pte %x\n",pt_addr[pte]);
872
        if (++pte == 1024)
873
        {
6296 serge 874
            kunmap_atomic(pt_addr);
6283 serge 875
            pt_addr = NULL;
876
            if (pde == 8)
877
                break;
878
            pte = 0;
879
        }
2338 Serge 880
    }
6296 serge 881
2338 Serge 882
 
6283 serge 883
    {
6296 serge 884
        for(;pte < 1024; pte++)
6283 serge 885
            pt_addr[pte] = dummy_page|PG_UW;
886
        kunmap_atomic(pt_addr);
887
    }
6296 serge 888
#endif
6283 serge 889
};
890
2338 Serge 891
 
6283 serge 892
{
893
    struct intel_framebuffer *intel_fb = kfb->private;
894
    addr_t *pt_addr = NULL;
895
    int pte = 0;
896
    int pde = 0;
897
    int num_pages;
898
    addr_t pfn;
899
ENTER();
900
    num_pages = intel_fb->obj->base.size/4096;
901
    pfn = dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(intel_fb->obj);
902
2338 Serge 903
 
6283 serge 904
    {
6296 serge 905
        if (pt_addr == NULL)
6283 serge 906
        {
907
            addr_t pt = kfb->pde[pde] & 0xFFFFF000;
908
            pde++;
909
            pt_addr = kmap_atomic((struct page*)pt);
910
        }
911
        pt_addr[pte] = pfn|PG_UW|PG_WRITEC;
912
        pfn+= 4096;
913
        num_pages--;
914
        if (++pte == 1024)
915
        {
916
            kunmap_atomic(pt_addr);
917
            pt_addr = NULL;
918
            if (pde == 8)
919
                break;
920
            pte = 0;
921
        }
922
    }
923
2338 Serge 924
 
6283 serge 925
    {
2338 Serge 926
        for(;pte < 1024; pte++)
6283 serge 927
            pt_addr[pte] = dummy_fb_page|PG_UW;
928
        kunmap_atomic(pt_addr);
929
    }
2338 Serge 930
LEAVE();
6283 serge 931
};
2338 Serge 932
933
 
3277 Serge 934
{
935
    int left;
936
    int top;
937
    int right;
938
    int bottom;
939
}rect_t;
940
3263 Serge 941
 
3277 Serge 942
 
943
944
 
945
946
 
947
            struct drm_file *file)
948
{
949
    struct drm_i915_mask *mask = data;
950
    struct drm_gem_object *obj;
951
    static unsigned int mask_seqno[256];
952
    rect_t winrc;
953
    u32    slot;
954
    int    ret=0;
4371 Serge 955
3277 Serge 956
 
957
    if (obj == NULL)
958
        return -ENOENT;
959
960
 
961
        drm_gem_object_unreference_unlocked(obj);
962
        return -EINVAL;
963
    }
964
965
 
966
    {
967
//        static warn_count;
3298 Serge 968
3277 Serge 969
 
3290 Serge 970
        mask->height   = winrc.bottom - winrc.top + 1;
971
        mask->bo_pitch = (mask->width+15) & ~15;
972
973
 
3298 Serge 974
        if(warn_count < 1)
3277 Serge 975
        {
976
            printf("left %d top %d right %d bottom %d\n",
977
                    winrc.left, winrc.top, winrc.right, winrc.bottom);
978
            printf("mask pitch %d data %p\n", mask->bo_pitch, mask->bo_map);
5060 serge 979
            warn_count++;
3277 Serge 980
        };
981
#endif
3298 Serge 982
983
 
4104 Serge 984
3277 Serge 985
 
3290 Serge 986
 
3277 Serge 987
988
 
989
    {
990
        u8* src_offset;
991
        u8* dst_offset;
992
        u32 ifl;
993
994
 
995
        if (ret)
996
            goto err1;
4371 Serge 997
3277 Serge 998
 
999
        if(ret != 0 )
4398 Serge 1000
        {
3277 Serge 1001
            dbgprintf("%s: i915_gem_object_set_to_cpu_domain failed\n", __FUNCTION__);
4371 Serge 1002
            goto err2;
1003
        };
3277 Serge 1004
1005
 
1006
1007
 
1008
1009
 
5354 serge 1010
        src_offset+= winrc.top*os_display->width + winrc.left;
1011
3277 Serge 1012
 
1013
1014
 
5354 serge 1015
3277 Serge 1016
 
1017
        {
1018
            mask_seqno[slot] = os_display->mask_seqno;
1019
1020
 
1021
1022
 
1023
            "movd       %[slot],   %%xmm6         \n"
4560 Serge 1024
            "punpckldq  %%xmm6, %%xmm6            \n"
3277 Serge 1025
            "punpcklqdq %%xmm6, %%xmm6            \n"
1026
            :: [slot]  "m" (slot)
1027
            :"xmm6");
1028
1029
 
1030
            {
1031
                int tmp_w = mask->width;
4398 Serge 1032
3277 Serge 1033
 
1034
                u8* tmp_dst = dst_offset;
1035
1036
 
1037
                dst_offset+= mask->bo_pitch;
1038
1039
 
1040
                {
1041
                    __asm__ __volatile__ (
1042
                    "movdqu     (%0),   %%xmm0            \n"
1043
                    "movdqu   16(%0),   %%xmm1            \n"
1044
                    "movdqu   32(%0),   %%xmm2            \n"
1045
                    "movdqu   48(%0),   %%xmm3            \n"
1046
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1047
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1048
                    "pcmpeqb    %%xmm6, %%xmm2            \n"
1049
                    "pcmpeqb    %%xmm6, %%xmm3            \n"
1050
                    "movdqa     %%xmm0,   (%%edi)         \n"
1051
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1052
                    "movdqa     %%xmm2, 32(%%edi)         \n"
1053
                    "movdqa     %%xmm3, 48(%%edi)         \n"
1054
1055
 
1056
                    :"xmm0","xmm1","xmm2","xmm3");
1057
                    tmp_w -= 64;
1058
                    tmp_src += 64;
1059
                    tmp_dst += 64;
1060
                }
1061
1062
 
1063
                {
1064
                    __asm__ __volatile__ (
1065
                    "movdqu     (%0),   %%xmm0            \n"
1066
                    "movdqu   16(%0),   %%xmm1            \n"
1067
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1068
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1069
                    "movdqa     %%xmm0,   (%%edi)         \n"
1070
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1071
1072
 
1073
                    :"xmm0","xmm1");
1074
                    tmp_w -= 32;
1075
                    tmp_src += 32;
1076
                    tmp_dst += 32;
1077
                }
1078
1079
 
4398 Serge 1080
                {
3277 Serge 1081
                    __asm__ __volatile__ (
1082
                    "movdqu     (%0),   %%xmm0            \n"
1083
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1084
                    "movdqa     %%xmm0,   (%%edi)         \n"
1085
                    :: "r" (tmp_src), "D" (tmp_dst)
1086
                    :"xmm0");
1087
                    tmp_w -= 16;
1088
                    tmp_src += 16;
1089
                    tmp_dst += 16;
1090
                }
1091
4398 Serge 1092
 
1093
                {
1094
                    __asm__ __volatile__ (
1095
                    "movq       (%0),   %%xmm0            \n"
1096
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1097
                    "movq       %%xmm0,   (%%edi)         \n"
1098
                    :: "r" (tmp_src), "D" (tmp_dst)
1099
                    :"xmm0");
1100
                    tmp_w -= 8;
1101
                    tmp_src += 8;
1102
                    tmp_dst += 8;
1103
                }
1104
                if( tmp_w >= 4 )
1105
                {
1106
                    __asm__ __volatile__ (
1107
                    "movd       (%0),   %%xmm0            \n"
1108
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1109
                    "movd       %%xmm0,   (%%edi)         \n"
1110
                    :: "r" (tmp_src), "D" (tmp_dst)
1111
                    :"xmm0");
1112
                    tmp_w -= 4;
1113
                    tmp_src += 4;
1114
                    tmp_dst += 4;
1115
                }
1116
                while(tmp_w--)
1117
                    *tmp_dst++ = (*tmp_src++ == (u8)slot) ? 0xFF:0x00;
1118
            };
3277 Serge 1119
        };
1120
        safe_sti(ifl);
1121
4371 Serge 1122
 
1123
    }
4539 Serge 1124
1125
 
1126
    mutex_unlock(&dev->struct_mutex);
1127
err1:
1128
    drm_gem_object_unreference(obj);
1129
1130
 
1131
}
1132
1133
 
1134
            struct drm_file *file)
1135
{
1136
    struct drm_i915_mask_update *mask = data;
1137
    struct drm_gem_object *obj;
1138
    static unsigned int mask_seqno[256];
1139
    static warn_count;
1140
1141
 
1142
    u32    winw,winh;
1143
    u32    ml,mt,mr,mb;
1144
    u32    slot;
1145
    int    ret = 0;
1146
    slot = *((u8*)CURRENT_TASK);
1147
1148
 
6084 serge 1149
        return 0;
4539 Serge 1150
1151
 
6084 serge 1152
        memset((void*)mask->bo_map,0,mask->width * mask->height);
1153
5367 serge 1154
 
4539 Serge 1155
    win.right+= 1;
1156
    win.bottom+=  1;
1157
1158
 
1159
    winh = win.bottom - win.top;
1160
1161
 
1162
       mask->dy >= winh)
1163
       return 1;
1164
1165
 
1166
    mt = win.top  + mask->dy;
1167
    mr = ml + mask->width;
1168
    mb = mt + mask->height;
1169
1170
 
1171
        mr < win.left   || mb < win.top )
1172
        return 1;
1173
1174
 
1175
        mr = win.right;
1176
1177
 
1178
        mb = win.bottom;
1179
1180
 
1181
    mask->height = mb - mt;
1182
1183
 
1184
        mask->height== 0 )
1185
        return 1;
1186
1187
 
6131 serge 1188
    if (ret)
1189
        return ret;
1190
1191
 
4539 Serge 1192
    if (obj == NULL)
1193
    {
6131 serge 1194
        ret = -ENOENT;
1195
        goto unlock;
1196
    }
1197
4539 Serge 1198
 
6131 serge 1199
    {
1200
        ret = -ENOENT;
1201
        goto out;
1202
    }
4539 Serge 1203
1204
 
6084 serge 1205
    if(warn_count < 100)
1206
    {
4539 Serge 1207
        printf("left %d top %d right %d bottom %d\n",
1208
                ml, mt, mr, mb);
1209
        warn_count++;
1210
    };
1211
#endif
1212
1213
 
1214
 
1215
1216
 
1217
        u8* src_offset;
1218
        u8* dst_offset;
1219
        u32 ifl;
1220
1221
 
1222
1223
 
5354 serge 1224
        src_offset+= mt*os_display->width + ml;
1225
        dst_offset = (u8*)mask->bo_map;
4539 Serge 1226
1227
 
5354 serge 1228
4539 Serge 1229
 
1230
        {
4371 Serge 1231
            mask_seqno[slot] = os_display->mask_seqno;
4539 Serge 1232
1233
 
1234
1235
 
1236
            "movd       %[slot],   %%xmm6         \n"
1237
            "punpckldq  %%xmm6, %%xmm6            \n"
1238
            "punpcklqdq %%xmm6, %%xmm6            \n"
1239
            :: [slot]  "m" (slot)
1240
            :"xmm6");
1241
1242
 
1243
            {
1244
                int tmp_w = mask->width;
1245
1246
 
1247
                u8* tmp_dst = dst_offset;
1248
1249
 
1250
                dst_offset+= mask->bo_pitch;
1251
1252
 
1253
                {
1254
                    __asm__ __volatile__ (
1255
                    "movdqu     (%0),   %%xmm0            \n"
1256
                    "movdqu   16(%0),   %%xmm1            \n"
1257
                    "movdqu   32(%0),   %%xmm2            \n"
1258
                    "movdqu   48(%0),   %%xmm3            \n"
1259
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1260
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1261
                    "pcmpeqb    %%xmm6, %%xmm2            \n"
1262
                    "pcmpeqb    %%xmm6, %%xmm3            \n"
1263
                    "movdqa     %%xmm0,   (%%edi)         \n"
1264
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1265
                    "movdqa     %%xmm2, 32(%%edi)         \n"
1266
                    "movdqa     %%xmm3, 48(%%edi)         \n"
1267
1268
 
1269
                    :"xmm0","xmm1","xmm2","xmm3");
1270
                    tmp_w -= 64;
1271
                    tmp_src += 64;
1272
                    tmp_dst += 64;
1273
                }
1274
1275
 
1276
                {
1277
                    __asm__ __volatile__ (
1278
                    "movdqu     (%0),   %%xmm0            \n"
1279
                    "movdqu   16(%0),   %%xmm1            \n"
1280
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1281
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
1282
                    "movdqa     %%xmm0,   (%%edi)         \n"
1283
                    "movdqa     %%xmm1, 16(%%edi)         \n"
1284
1285
 
1286
                    :"xmm0","xmm1");
1287
                    tmp_w -= 32;
1288
                    tmp_src += 32;
1289
                    tmp_dst += 32;
1290
                }
1291
1292
 
1293
                {
1294
                    __asm__ __volatile__ (
1295
                    "movdqu     (%0),   %%xmm0            \n"
1296
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1297
                    "movdqa     %%xmm0,   (%%edi)         \n"
1298
                    :: "r" (tmp_src), "D" (tmp_dst)
1299
                    :"xmm0");
1300
                    tmp_w -= 16;
1301
                    tmp_src += 16;
1302
                    tmp_dst += 16;
1303
                }
1304
1305
 
1306
                {
1307
                    __asm__ __volatile__ (
1308
                    "movq       (%0),   %%xmm0            \n"
1309
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1310
                    "movq       %%xmm0,   (%%edi)         \n"
1311
                    :: "r" (tmp_src), "D" (tmp_dst)
1312
                    :"xmm0");
1313
                    tmp_w -= 8;
1314
                    tmp_src += 8;
1315
                    tmp_dst += 8;
1316
                }
1317
                if( tmp_w >= 4 )
1318
                {
4560 Serge 1319
                    __asm__ __volatile__ (
4539 Serge 1320
                    "movd       (%0),   %%xmm0            \n"
1321
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
1322
                    "movd       %%xmm0,   (%%edi)         \n"
1323
                    :: "r" (tmp_src), "D" (tmp_dst)
1324
                    :"xmm0");
1325
                    tmp_w -= 4;
1326
                    tmp_src += 4;
1327
                    tmp_dst += 4;
1328
                }
1329
                while(tmp_w--)
1330
                    *tmp_dst++ = (*tmp_src++ == (u8)slot) ? 0xFF:0x00;
1331
            };
1332
        };
4371 Serge 1333
        safe_sti(ifl);
4539 Serge 1334
1335
 
1336
    }
3277 Serge 1337
#endif
4539 Serge 1338
3277 Serge 1339
 
6131 serge 1340
    drm_gem_object_unreference(obj);
3277 Serge 1341
1342
 
6131 serge 1343
    mutex_unlock(&dev->struct_mutex);
1344
1345
 
4371 Serge 1346
}
3277 Serge 1347
1348
 
1349
 
1350
 
2360 Serge 1351
 
3031 serge 1352
2360 Serge 1353
 
3031 serge 1354
{
1355
    u32 tmp = GetTimerTicks();
1356
2360 Serge 1357
 
3031 serge 1358
    ts->tv_nsec = (tmp - ts->tv_sec*100)*10000000;
1359
}
1360
2360 Serge 1361
 
6084 serge 1362
{
3031 serge 1363
    unsigned long flags;
3480 Serge 1364
3031 serge 1365
 
3480 Serge 1366
    spin_lock_irqsave(&q->lock, flags);
1367
    if (list_empty(&wait->task_list))
1368
            __add_wait_queue(q, wait);
1369
    spin_unlock_irqrestore(&q->lock, flags);
1370
}
1371
1372
 
1373
 * finish_wait - clean up after waiting in a queue
1374
 * @q: waitqueue waited on
1375
 * @wait: wait descriptor
1376
 *
1377
 * Sets current thread back to running state and removes
1378
 * the wait descriptor from the given waitqueue if still
1379
 * queued.
1380
 */
1381
void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
1382
{
1383
    unsigned long flags;
1384
1385
 
1386
    /*
1387
     * We can check for list emptiness outside the lock
1388
     * IFF:
1389
     *  - we use the "careful" check that verifies both
1390
     *    the next and prev pointers, so that there cannot
1391
     *    be any half-pending updates in progress on other
1392
     *    CPU's that we haven't seen yet (and that might
1393
     *    still change the stack area.
1394
     * and
1395
     *  - all other users take the lock (ie we can only
1396
     *    have _one_ other CPU that looks at or modifies
1397
     *    the list).
1398
     */
1399
    if (!list_empty_careful(&wait->task_list)) {
1400
            spin_lock_irqsave(&q->lock, flags);
1401
            list_del_init(&wait->task_list);
1402
            spin_unlock_irqrestore(&q->lock, flags);
1403
    }
1404
1405
 
1406
}
1407
1408
 
1409
{
1410
    list_del_init(&wait->task_list);
1411
    return 1;
1412
}
1413
1414
 
1415
 
1416