Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6320 | serge | 1 | /* |
2 | * Copyright © 2008-2012 Intel Corporation |
||
3 | * |
||
4 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
5 | * copy of this software and associated documentation files (the "Software"), |
||
6 | * to deal in the Software without restriction, including without limitation |
||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
8 | * and/or sell copies of the Software, and to permit persons to whom the |
||
9 | * Software is furnished to do so, subject to the following conditions: |
||
10 | * |
||
11 | * The above copyright notice and this permission notice (including the next |
||
12 | * paragraph) shall be included in all copies or substantial portions of the |
||
13 | * Software. |
||
14 | * |
||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
18 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||
19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||
20 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
||
21 | * IN THE SOFTWARE. |
||
22 | * |
||
23 | * Authors: |
||
24 | * Eric Anholt |
||
25 | * Chris Wilson |
||
26 | * |
||
27 | */ |
||
28 | |||
29 | #include |
||
30 | #include |
||
31 | #include |
||
32 | #include "intel_drv.h" |
||
33 | #include "i915_drv.h" |
||
34 | |||
35 | static addr_t dummy_fb_page; |
||
36 | static struct kos_framebuffer *fake_fb; |
||
37 | |||
38 | int fake_framebuffer_create() |
||
39 | { |
||
40 | struct kos_framebuffer *kfb; |
||
41 | addr_t dummy_table; |
||
42 | addr_t *pt_addr; |
||
43 | int pde, pte; |
||
44 | |||
45 | kfb = kzalloc(sizeof(struct kos_framebuffer),0); |
||
46 | if(kfb == NULL) |
||
47 | goto err_0; |
||
48 | |||
49 | dummy_fb_page = AllocPage(); |
||
50 | if(dummy_fb_page == 0) |
||
51 | goto err_1; |
||
52 | |||
53 | for(pde = 0; pde < 8; pde++) |
||
54 | { |
||
55 | dummy_table = AllocPage(); |
||
56 | if(dummy_table == 0) |
||
57 | goto err_2; |
||
58 | |||
59 | kfb->pde[pde] = dummy_table|PG_UW; |
||
60 | |||
61 | pt_addr = kmap_atomic((struct page*)dummy_table); |
||
62 | for(pte = 0; pte < 1024; pte++) |
||
63 | pt_addr[pte] = dummy_fb_page|PG_UW; |
||
64 | kunmap_atomic(pt_addr); |
||
65 | }; |
||
66 | |||
67 | fake_fb = kfb; |
||
68 | |||
69 | return 0; |
||
70 | |||
71 | err_2: |
||
72 | for(pte = 0; pte < pde; pte++) |
||
73 | FreePage(kfb->pde[pte]); |
||
74 | FreePage(dummy_fb_page); |
||
75 | err_1: |
||
76 | kfree(kfb); |
||
77 | err_0: |
||
78 | return -ENOMEM; |
||
79 | }; |
||
80 | |||
81 | int kolibri_framebuffer_init(void *param) |
||
82 | { |
||
83 | struct intel_framebuffer *intel_fb = param; |
||
84 | struct kos_framebuffer *kfb; |
||
85 | addr_t dummy_table; |
||
86 | addr_t *pt_addr = NULL; |
||
87 | int pde, pte; |
||
88 | |||
89 | kfb = kzalloc(sizeof(struct kos_framebuffer),0); |
||
90 | if(kfb == NULL) |
||
91 | goto err_0; |
||
92 | |||
93 | kfb->private = intel_fb; |
||
94 | |||
95 | for(pde = 0; pde < 8; pde++) |
||
96 | { |
||
97 | dummy_table = AllocPage(); |
||
98 | if(dummy_table == 0) |
||
99 | goto err_1; |
||
100 | |||
101 | kfb->pde[pde] = dummy_table|PG_UW; |
||
102 | |||
103 | pt_addr = kmap_atomic((struct page*)dummy_table); |
||
104 | for(pte = 0; pte < 1024; pte++) |
||
105 | pt_addr[pte] = dummy_fb_page|PG_UW; |
||
106 | kunmap_atomic(pt_addr); |
||
107 | }; |
||
108 | |||
109 | intel_fb->private = kfb; |
||
110 | |||
111 | return 0; |
||
112 | err_1: |
||
113 | for(pte = 0; pte < pde; pte++) |
||
114 | FreePage(kfb->pde[pte]); |
||
115 | kfree(kfb); |
||
116 | err_0: |
||
117 | return -ENOMEM; |
||
118 | }; |
||
119 | |||
120 | void kolibri_framebuffer_update(struct drm_device *dev, struct kos_framebuffer *kfb) |
||
121 | { |
||
122 | struct drm_i915_private *dev_priv = dev->dev_private; |
||
123 | struct intel_framebuffer *intel_fb = kfb->private; |
||
124 | addr_t *pt_addr = NULL; |
||
125 | int pte = 0; |
||
126 | int pde = 0; |
||
127 | int num_pages; |
||
128 | addr_t pfn; |
||
129 | |||
130 | num_pages = intel_fb->obj->base.size/4096; |
||
131 | pfn = dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(intel_fb->obj); |
||
132 | |||
133 | while(num_pages) |
||
134 | { |
||
135 | if (pt_addr == NULL) |
||
136 | { |
||
137 | addr_t pt = kfb->pde[pde] & 0xFFFFF000; |
||
138 | pde++; |
||
139 | pt_addr = kmap_atomic((struct page*)pt); |
||
140 | } |
||
141 | pt_addr[pte] = pfn|PG_UW|PG_WRITEC; |
||
142 | pfn+= 4096; |
||
143 | num_pages--; |
||
144 | if (++pte == 1024) |
||
145 | { |
||
146 | kunmap_atomic(pt_addr); |
||
147 | pt_addr = NULL; |
||
148 | if (pde == 8) |
||
149 | break; |
||
150 | pte = 0; |
||
151 | } |
||
152 | } |
||
153 | |||
154 | if(pt_addr) |
||
155 | { |
||
156 | for(; pte < 1024; pte++) |
||
157 | pt_addr[pte] = dummy_fb_page|PG_UW; |
||
158 | kunmap_atomic(pt_addr); |
||
159 | }; |
||
160 | |||
161 | for(; pde < 8; pde++) |
||
162 | { |
||
163 | addr_t pt = kfb->pde[pde] & 0xFFFFF000; |
||
164 | pt_addr = kmap_atomic((struct page*)pt); |
||
165 | for(pte = 0; pte < 1024; pte++) |
||
166 | pt_addr[pte] = dummy_fb_page|PG_UW; |
||
167 | kunmap_atomic(pt_addr); |
||
168 | } |
||
169 | }; |
||
170 | |||
171 | void set_fake_framebuffer() |
||
172 | { |
||
173 | sysSetFramebuffer(fake_fb); |
||
174 | }>>>>>>>>> |