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 | }24); |
1291 | }24); |
1413 | 1292 | ||
1414 | ><24); |
- | |
1415 | - | ||
1416 | >16)|(slot<<24); |
- |