Subversion Repositories Kolibri OS

Rev

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

Rev 6296 Rev 6320
Line 8... Line 8...
8
#include 
8
#include 
9
#include 
9
#include 
10
 
10
 
Line 11... Line 11...
11
#include 
11
#include 
12
 
-
 
13
//#include "bitmap.h"
-
 
14
#include 
12
#include 
Line 15... Line -...
15
 
-
 
16
void  FASTCALL sysSetFramebuffer(void *fb)__asm__("SetFramebuffer");
-
 
17
void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb);
13
 
Line 18... Line -...
18
void init_system_cursors(struct drm_device *dev);
-
 
19
 
-
 
20
addr_t dummy_fb_page;
14
void init_system_cursors(struct drm_device *dev);
Line 21... Line 15...
21
 
15
 
22
display_t *os_display;
16
display_t *os_display;
Line 58... Line 52...
58
    struct drm_framebuffer *fb = &intel_fb->base;
52
    struct drm_framebuffer     *fb = &intel_fb->base;
59
    struct drm_i915_gem_object *obj = NULL;
53
    struct drm_i915_gem_object *obj = NULL;
60
    int stride, size;
54
    int stride, size;
61
 
55
 
Line 62... Line -...
62
ENTER();
-
 
63
 
-
 
64
    stride = mode->hdisplay *4;
56
    stride = mode->hdisplay *4;
Line -... Line 57...
-
 
57
 
-
 
58
    if(IS_GEN3(dev))
-
 
59
        tiling = 0;
65
 
60
 
66
    if(tiling)
61
    if(tiling)
67
    {
62
    {
Line 68... Line -...
68
        int gen3size;
-
 
69
 
-
 
70
        if(IS_GEN3(dev))
-
 
71
            for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1);
63
        int gen3size;
72
        else
64
 
73
            stride = ALIGN(stride, 512);
-
 
74
        size = stride * ALIGN(mode->vdisplay, 8);
-
 
75
 
-
 
76
        if(IS_GEN3(dev))
-
 
77
        {
-
 
78
            for (gen3size = 1024*1024; gen3size < size; gen3size <<= 1);
-
 
79
            size = gen3size;
-
 
80
        }
65
            stride = ALIGN(stride, 512);
81
        else
66
        size = stride * ALIGN(mode->vdisplay, 8);
82
            size = ALIGN(size, 4096);
67
            size = ALIGN(size, 4096);
83
    }
68
    }
84
    else
69
    else
Line 94... Line 79...
94
        struct drm_mode_fb_cmd2 mode_cmd = {};
79
        struct drm_mode_fb_cmd2 mode_cmd = {};
95
        int ret;
80
        int ret;
96
 
81
 
Line 97... Line 82...
97
        DRM_DEBUG_KMS("remove old framebuffer\n");
82
        DRM_DEBUG_KMS("remove old framebuffer\n");
-
 
83
        set_fake_framebuffer();
98
        drm_framebuffer_remove(fb);
84
        drm_framebuffer_remove(fb);
99
        ifbdev->fb = NULL;
85
        ifbdev->fb = NULL;
100
        fb = NULL;
86
        fb = NULL;
101
        DRM_DEBUG_KMS("create new framebuffer\n");
87
        DRM_DEBUG_KMS("create new framebuffer\n");
Line 170... Line 156...
170
    fb->pitches[3]  = stride;
156
    fb->pitches[3]  = stride;
171
 
157
 
Line 172... Line 158...
172
    fb->bits_per_pixel = 32;
158
    fb->bits_per_pixel = 32;
173
    fb->depth = 24;
159
    fb->depth = 24;
174
LEAVE();
160
 
175
    return fb;
161
    return fb;
Line 176... Line 162...
176
 
162
 
177
out_fb:
163
out_fb:
178
    drm_framebuffer_remove(fb);
164
    drm_framebuffer_remove(fb);
Line 280... Line 266...
280
    if ( !ret )
266
    if ( !ret )
281
    {
267
    {
282
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
268
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
283
        struct kos_framebuffer *kfb = intel_fb->private;
269
        struct kos_framebuffer *kfb = intel_fb->private;
284
        kolibri_framebuffer_update(dev_priv, kfb);
270
        kolibri_framebuffer_update(dev, kfb);
285
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
271
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
Line 286... Line 272...
286
 
272
 
287
        os_display->width    = mode->hdisplay;
273
        os_display->width    = mode->hdisplay;
288
        os_display->height   = mode->vdisplay;
274
        os_display->height   = mode->vdisplay;
Line 376... Line 362...
376
    if ( !ret )
362
    if ( !ret )
377
    {
363
    {
378
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
364
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
379
        struct kos_framebuffer *kfb = intel_fb->private;
365
        struct kos_framebuffer *kfb = intel_fb->private;
380
        kolibri_framebuffer_update(dev_priv, kfb);
366
        kolibri_framebuffer_update(dev, kfb);
381
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
367
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
382
 
368
 
Line 383... Line 369...
383
        os_display->width    = mode->hdisplay;
369
        os_display->width    = mode->hdisplay;
384
        os_display->height   = mode->vdisplay;
370
        os_display->height   = mode->vdisplay;
385
        os_display->vrefresh = drm_mode_vrefresh(mode);
371
        os_display->vrefresh = drm_mode_vrefresh(mode);
Line 573... Line 559...
573
        DRM_DEBUG_KMS("No active connectors!\n");
559
        DRM_DEBUG_KMS("No active connectors!\n");
574
        return -1;
560
        return -1;
575
    };
561
    };
576
 
562
 
Line 577... Line -...
577
    dummy_fb_page = AllocPage();
-
 
578
 
-
 
579
    os_display = GetDisplay();
563
    os_display = GetDisplay();
580
    os_display->ddev = dev;
564
    os_display->ddev = dev;
581
    os_display->connector = connector;
565
    os_display->connector = connector;
582
    os_display->crtc = crtc;
566
    os_display->crtc = crtc;
583
    os_display->supported_modes = count_connector_modes(connector);
567
    os_display->supported_modes = count_connector_modes(connector);
Line 813... Line 797...
813
 
797
 
Line 814... Line 798...
814
        fb->name   = obj->base.name;
798
        fb->name   = obj->base.name;
815
        fb->width  = os_display->width;
799
        fb->width  = os_display->width;
816
        fb->height = os_display->height;
800
        fb->height = os_display->height;
817
        fb->pitch  = obj->stride;
801
        fb->pitch  = os_display->lfb_pitch;
818
        fb->tiling = obj->tiling_mode;
802
        fb->tiling = obj->tiling_mode;
819
        fb->crtc   = crtc->base.base.id;
803
        fb->crtc   = crtc->base.base.id;
820
        fb->pipe   = crtc->pipe;
804
        fb->pipe   = crtc->pipe;
821
    }
805
    }
822
    safe_sti(ifl);
806
    safe_sti(ifl);
Line 823... Line 807...
823
 
807
 
824
    return 0;
808
    return 0;
Line 825... Line -...
825
}
-
 
826
 
-
 
827
int kolibri_framebuffer_init(struct intel_framebuffer *intel_fb)
-
 
828
{
-
 
829
    struct kos_framebuffer *kfb;
-
 
830
    addr_t dummy_table;
-
 
831
    addr_t *pt_addr = NULL;
-
 
832
    int pde;
-
 
833
 
-
 
834
    kfb = kzalloc(sizeof(struct kos_framebuffer),0);
-
 
835
    kfb->private = intel_fb;
-
 
836
 
-
 
837
    for(pde = 0; pde < 8; pde++)
-
 
838
    {
-
 
839
        dummy_table = AllocPage();
-
 
840
        kfb->pde[pde] = dummy_table|PG_UW;
-
 
841
 
-
 
842
        pt_addr = kmap((struct page*)dummy_table);
-
 
843
        __builtin_memset(pt_addr,0,4096);
-
 
844
        kunmap((struct page*)dummy_table);
-
 
845
    };
-
 
846
 
-
 
847
    intel_fb->private = kfb;
-
 
848
 
-
 
849
    return 0;
-
 
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
    pte = 0;
-
 
856
    pde = 0;
-
 
857
    pt_addr = NULL;
-
 
858
 
-
 
859
    __sg_page_iter_start(&sg_iter, obj->pages->sgl, sg_nents(obj->pages->sgl), 0);
-
 
860
    while (__sg_page_iter_next(&sg_iter))
-
 
861
    {
-
 
862
        if (pt_addr == NULL)
-
 
863
        {
-
 
864
            addr_t pt = AllocPage();
-
 
865
            kfb->pde[pde] = pt|PG_UW;
-
 
866
            pde++;
-
 
867
            pt_addr = kmap_atomic((struct page*)pt);
-
 
868
        }
-
 
869
        pt_addr[pte] = sg_page_iter_dma_address(&sg_iter)|PG_UW|PG_WRITEC;
-
 
870
        if( (pte & 15) == 0)
-
 
871
            DRM_DEBUG_KMS("pte %x\n",pt_addr[pte]);
-
 
872
        if (++pte == 1024)
-
 
873
        {
-
 
874
            kunmap_atomic(pt_addr);
-
 
875
            pt_addr = NULL;
-
 
876
            if (pde == 8)
-
 
877
                break;
-
 
878
            pte = 0;
-
 
879
        }
-
 
880
    }
-
 
881
 
-
 
882
    if(pt_addr)
-
 
883
    {
-
 
884
        for(;pte < 1024; pte++)
-
 
885
            pt_addr[pte] = dummy_page|PG_UW;
-
 
886
        kunmap_atomic(pt_addr);
-
 
887
    }
-
 
888
#endif
-
 
889
};
-
 
890
 
-
 
891
void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb)
-
 
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
 
-
 
903
    while(num_pages)
-
 
904
    {
-
 
905
        if (pt_addr == NULL)
-
 
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
 
-
 
924
    if(pt_addr)
-
 
925
    {
-
 
926
        for(;pte < 1024; pte++)
-
 
927
            pt_addr[pte] = dummy_fb_page|PG_UW;
-
 
928
        kunmap_atomic(pt_addr);
-
 
929
    }
-
 
Line 930... Line 809...
930
LEAVE();
809
}
931
};
810
 
932
 
811
 
933
typedef struct
812
typedef struct
Line 1409... Line 1288...
1409
{
1288
{
1410
    list_del_init(&wait->task_list);
1289
    list_del_init(&wait->task_list);
1411
    return 1;
1290
    return 1;
1412
}
1291
}
1413
 
1292
 
1414
>
-
 
1415
 
-
 
1416
>
-