Subversion Repositories Kolibri OS

Rev

Rev 4293 | Rev 4389 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4293 Rev 4371
Line 106... Line 106...
106
    struct drm_crtc         *crtc;
106
    struct drm_crtc         *crtc;
107
    struct drm_encoder      *encoder;
107
    struct drm_encoder      *encoder;
108
    struct drm_i915_gem_object *fb_obj;
108
    struct drm_i915_gem_object *fb_obj;
109
    struct drm_mode_set     set;
109
    struct drm_mode_set     set;
110
    char *con_name;
110
    const char *con_name;
111
    char *enc_name;
111
    const char *enc_name;
112
    unsigned hdisplay, vdisplay;
112
    unsigned hdisplay, vdisplay;
113
    int ret;
113
    int ret;
114
 
114
 
Line 115... Line 115...
115
    mutex_lock(&dev->mode_config.mutex);
115
    mutex_lock(&dev->mode_config.mutex);
Line 261... Line 261...
261
 
261
 
Line 262... Line 262...
262
    return def_connector;
262
    return def_connector;
263
};
263
};
Line 264... Line -...
264
 
-
 
265
 
264
 
266
int init_display_kms(struct drm_device *dev, videomode_t *usermode)
265
struct drm_connector *get_active_connector(struct drm_device *dev)
267
{
266
{
268
    struct drm_connector    *connector;
267
    struct drm_connector *tmp = NULL;
269
    struct drm_connector_helper_funcs *connector_funcs;
268
    struct drm_connector_helper_funcs *connector_funcs;
270
    struct drm_encoder      *encoder;
-
 
271
    struct drm_crtc         *crtc = NULL;
-
 
272
    struct drm_framebuffer  *fb;
-
 
273
 
-
 
274
    cursor_t  *cursor;
-
 
275
    u32_t      ifl;
-
 
Line 276... Line -...
276
    int        err;
-
 
277
 
-
 
278
    ENTER();
-
 
279
 
-
 
280
    mutex_lock(&dev->mode_config.mutex);
269
    struct drm_encoder      *encoder;
281
 
270
 
282
    list_for_each_entry(connector, &dev->mode_config.connector_list, head)
271
    list_for_each_entry(tmp, &dev->mode_config.connector_list, head)
283
    {
272
    {
Line 284... Line 273...
284
        if( connector->status != connector_status_connected)
273
        if( tmp->status != connector_status_connected)
285
            continue;
274
            continue;
286
 
275
 
287
        connector_funcs = connector->helper_private;
276
        connector_funcs = tmp->helper_private;
288
        encoder = connector_funcs->best_encoder(connector);
277
        encoder = connector_funcs->best_encoder(tmp);
289
        if( encoder == NULL)
278
        if( encoder == NULL)
290
        {
279
        {
291
            DRM_DEBUG_KMS("CONNECTOR %x ID: %d no active encoders\n",
280
            DRM_DEBUG_KMS("CONNECTOR %x ID: %d no active encoders\n",
-
 
281
                      tmp, tmp->base.id);
292
                      connector, connector->base.id);
282
            continue;
293
            continue;
-
 
Line 294... Line 283...
294
        }
283
        };
295
        connector->encoder = encoder;
-
 
296
        crtc = encoder->crtc;
284
 
297
 
285
        tmp->encoder = encoder;
298
        DRM_DEBUG_KMS("CONNECTOR %p ID:%d status:%d ENCODER %x CRTC %p ID:%d\n",
-
 
299
               connector, connector->base.id,
-
 
Line 300... Line -...
300
               connector->status, connector->encoder,
-
 
301
               crtc, crtc->base.id );
-
 
302
        break;
-
 
303
    };
-
 
304
 
286
 
305
    if(connector == NULL)
287
        DRM_DEBUG_KMS("CONNECTOR %p ID:%d status:%d ENCODER %x CRTC %p ID:%d\n",
Line 306... Line 288...
306
    {
288
               tmp, tmp->base.id, tmp->status, tmp->encoder,
-
 
289
               tmp->encoder->crtc, tmp->encoder->crtc->base.id );
Line 307... Line 290...
307
        DRM_DEBUG_KMS("No active connectors!\n");
290
 
308
        mutex_unlock(&dev->mode_config.mutex);
291
        return tmp;
309
        return -1;
292
    };
310
    };
293
 
Line 311... Line 294...
311
 
294
    return NULL;
312
    dbgprintf("CRTC %p\n", crtc);
295
}
313
 
-
 
314
    if(crtc == NULL)
296
 
315
    {
297
struct drm_crtc *get_possible_crtc(struct drm_device *dev, struct drm_encoder *encoder)
316
        struct drm_crtc *tmp_crtc;
-
 
317
        int crtc_mask = 1;
298
    {
318
 
299
        struct drm_crtc *tmp_crtc;
319
        list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head)
300
        int crtc_mask = 1;
320
        {
301
 
321
            dbgprintf("tmp_crtc %p\n", tmp_crtc);
302
        list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head)
322
            if (encoder->possible_crtcs & crtc_mask)
303
        {
-
 
304
            if (encoder->possible_crtcs & crtc_mask)
323
            {
305
            {
Line -... Line 306...
-
 
306
            encoder->crtc = tmp_crtc;
-
 
307
            dbgprintf("CRTC %p\n", tmp_crtc);
-
 
308
            return tmp_crtc;
-
 
309
            };
-
 
310
            crtc_mask <<= 1;
-
 
311
        };
-
 
312
    return NULL;
-
 
313
    };
-
 
314
 
-
 
315
int get_boot_mode(struct drm_connector *connector, videomode_t *usermode)
-
 
316
{
-
 
317
    struct drm_display_mode *mode;
-
 
318
 
-
 
319
    list_for_each_entry(mode, &connector->modes, head)
-
 
320
    {
-
 
321
        dbgprintf("check mode w:%d h:%d %dHz\n",
-
 
322
                drm_mode_width(mode), drm_mode_height(mode),
-
 
323
                drm_mode_vrefresh(mode));
-
 
324
 
-
 
325
        if( os_display->width  == drm_mode_width(mode)  &&
-
 
326
            os_display->height == drm_mode_height(mode) &&
-
 
327
            drm_mode_vrefresh(mode) == 60)
-
 
328
        {
-
 
329
            usermode->width  = os_display->width;
-
 
330
            usermode->height = os_display->height;
-
 
331
            usermode->freq   = 60;
-
 
332
            return 1;
-
 
333
        }
-
 
334
    }
-
 
335
    return 0;
-
 
336
}
-
 
337
 
-
 
338
int init_display_kms(struct drm_device *dev, videomode_t *usermode)
-
 
339
{
-
 
340
    struct drm_connector    *connector;
-
 
341
    struct drm_connector_helper_funcs *connector_funcs;
-
 
342
    struct drm_encoder      *encoder;
-
 
343
    struct drm_crtc         *crtc;
-
 
344
    struct drm_framebuffer  *fb;
-
 
345
 
-
 
346
    cursor_t  *cursor;
-
 
347
    u32_t      ifl;
-
 
348
    int        err;
-
 
349
 
-
 
350
    ENTER();
-
 
351
 
-
 
352
    mutex_lock(&dev->mode_config.mutex);
-
 
353
 
-
 
354
    connector = get_active_connector(dev) ;
-
 
355
    if(connector == NULL)
-
 
356
    {
-
 
357
        DRM_DEBUG_KMS("No active connectors!\n");
-
 
358
        mutex_unlock(&dev->mode_config.mutex);
324
                crtc = tmp_crtc;
359
        return -1;
Line 325... Line 360...
325
                encoder->crtc = crtc;
360
    };
326
                dbgprintf("CRTC %p\n", crtc);
361
 
327
                break;
362
    encoder = connector->encoder;
Line 375... Line 410...
375
 
410
 
Line 376... Line 411...
376
    if( (usermode->width == 0) ||
411
    if( (usermode->width == 0) ||
377
        (usermode->height == 0))
412
        (usermode->height == 0))
378
    {
413
    {
379
        struct drm_display_mode *mode;
-
 
380
 
-
 
381
        list_for_each_entry(mode, &connector->modes, head)
414
        if( !get_boot_mode(connector, usermode))
382
        {
415
        {
383
            dbgprintf("check mode w:%d h:%d %dHz\n",
-
 
384
                    drm_mode_width(mode), drm_mode_height(mode),
-
 
385
                    drm_mode_vrefresh(mode));
-
 
386
 
-
 
387
            if( os_display->width  == drm_mode_width(mode)  &&
-
 
388
                os_display->height == drm_mode_height(mode) &&
-
 
389
                drm_mode_vrefresh(mode) == 60)
416
        struct drm_display_mode *mode;
390
            {
-
 
391
                usermode->width  = os_display->width;
-
 
392
                usermode->height = os_display->height;
-
 
393
                usermode->freq   = 60;
-
 
394
                break;
-
 
395
 
-
 
396
            }
-
 
397
        }
-
 
Line 398... Line -...
398
 
-
 
399
        if( usermode->width  == 0 ||
-
 
400
            usermode->height == 0)
-
 
401
        {
417
 
402
            mode = list_entry(connector->modes.next, typeof(*mode), head);
-
 
403
 
418
            mode = list_entry(connector->modes.next, typeof(*mode), head);
404
            usermode->width  = drm_mode_width(mode);
419
            usermode->width  = drm_mode_width(mode);
405
            usermode->height = drm_mode_height(mode);
420
            usermode->height = drm_mode_height(mode);
406
            usermode->freq   = drm_mode_vrefresh(mode);
421
            usermode->freq   = drm_mode_vrefresh(mode);
407
        };
422
        };
Line 481... Line 496...
481
};
496
};
482
 
497
 
Line 483... Line 498...
483
void i915_dpms(struct drm_device *dev, int mode)
498
void i915_dpms(struct drm_device *dev, int mode)
484
{
499
{
485
    struct drm_connector_funcs *f = os_display->connector->funcs;
500
    const struct drm_connector_funcs *f = os_display->connector->funcs;
Line 486... Line 501...
486
 
501
 
487
    f->dpms(os_display->connector, mode);
502
    f->dpms(os_display->connector, mode);
Line 488... Line 503...
488
};
503
};
Line 682... Line 697...
682
    move_cursor_kms(cursor, intel_crtc->cursor_x, intel_crtc->cursor_y);
697
    move_cursor_kms(cursor, intel_crtc->cursor_x, intel_crtc->cursor_y);
683
    return old;
698
    return old;
684
};
699
};
Line 685... Line 700...
685
 
700
 
686
struct sna_fb
701
int i915_fbinfo(struct drm_i915_fb_info *fb)
687
{
-
 
688
    uint32_t  width;
-
 
689
    uint32_t  height;
-
 
690
    uint32_t  pitch;
702
{
691
    uint32_t  tiling;
-
 
Line 692... Line 703...
692
};
703
    struct drm_i915_gem_object *obj = get_fb_obj();
693
 
-
 
694
int i915_fbinfo(struct sna_fb *fb)
704
 
695
{
705
    fb->name   = obj->base.name;
696
    fb->width  = os_display->width;
706
    fb->width  = os_display->width;
697
    fb->height = os_display->height;
707
    fb->height = os_display->height;
Line 698... Line 708...
698
    fb->pitch  = os_display->pitch;
708
    fb->pitch  = obj->stride;
699
    fb->tiling = 0;
709
    fb->tiling = obj->tiling_mode;
-
 
710
 
Line 700... Line 711...
700
 
711
    return 0;
701
    return 0;
712
}
702
};
713
 
703
 
714
 
704
typedef struct
715
typedef struct
705
{
716
{
706
    int left;
717
    int left;
Line 707... Line -...
707
    int top;
-
 
708
    int right;
-
 
709
    int bottom;
-
 
710
}rect_t;
-
 
711
 
-
 
712
struct drm_i915_mask {
-
 
713
    __u32 handle;
-
 
714
    __u32 width;
-
 
Line 715... Line 718...
715
    __u32 height;
718
    int top;
Line 716... Line 719...
716
    __u32 bo_size;
719
    int right;
717
    __u32 bo_pitch;
720
    int bottom;
Line 738... Line 741...
738
    struct drm_gem_object *obj;
741
    struct drm_gem_object *obj;
739
    static unsigned int mask_seqno[256];
742
    static unsigned int mask_seqno[256];
740
    rect_t winrc;
743
    rect_t winrc;
741
    u32    slot;
744
    u32    slot;
742
    int    ret;
745
    int    ret=0;
743
 
746
 
Line 744... Line 747...
744
     if(mask->handle == -2)
747
     if(mask->handle == -2)
745
     {
748
     {
746
        printf("%s handle %d\n", __FUNCTION__, mask->handle);
749
        printf("%s handle %d\n", __FUNCTION__, mask->handle);
747
        return 0;
750
        return 0;
Line 786... Line 789...
786
        u32 ifl;
789
        u32 ifl;
787
 
790
 
Line 788... Line 791...
788
        ret = i915_mutex_lock_interruptible(dev);
791
        ret = i915_mutex_lock_interruptible(dev);
789
        if (ret)
792
        if (ret)
790
            return ret;
793
            goto err1;
Line 791... Line 794...
791
 
794
 
792
        ret = i915_gem_object_set_to_cpu_domain(to_intel_bo(obj), true);
795
        ret = i915_gem_object_set_to_cpu_domain(to_intel_bo(obj), true);
793
        if(ret !=0 )
796
        if(ret !=0 )
794
        {
797
        {
795
            dbgprintf("%s fail\n", __FUNCTION__);
798
            dbgprintf("%s: i915_gem_object_set_to_cpu_domain failed\n", __FUNCTION__);
796
            return ret;
799
            goto err2;
Line 797... Line 800...
797
        };
800
        };
Line 798... Line 801...
798
 
801
 
Line 884... Line 887...
884
                }
887
                }
885
            };
888
            };
886
        };
889
        };
887
        safe_sti(ifl);
890
        safe_sti(ifl);
888
    }
891
 
889
 
-
 
Line 890... Line 892...
890
    drm_gem_object_unreference(obj);
892
        ret = i915_gem_object_set_to_gtt_domain(to_intel_bo(obj), false);
-
 
893
        if(ret != 0 )
-
 
894
        {
-
 
895
            dbgprintf("%s: i915_gem_object_set_to_gtt_domain failed\n", __FUNCTION__);
-
 
896
        };
-
 
897
    }
Line -... Line 898...
-
 
898
 
891
 
899
err2:
-
 
900
    mutex_unlock(&dev->struct_mutex);
-
 
901
err1:
Line 892... Line 902...
892
    mutex_unlock(&dev->struct_mutex);
902
    drm_gem_object_unreference(obj);
893
 
903