Rev 2360 | Rev 3037 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2360 | Rev 2361 | ||
---|---|---|---|
1 | #include |
1 | #include |
2 | #include |
2 | #include |
3 | #include "i915_drm.h" |
3 | #include "i915_drm.h" |
4 | #include "i915_drv.h" |
4 | #include "i915_drv.h" |
5 | #include "intel_drv.h" |
5 | #include "intel_drv.h" |
6 | #include "bitmap.h" |
6 | #include "bitmap.h" |
7 | 7 | ||
8 | #define memmove __builtin_memmove |
8 | #define memmove __builtin_memmove |
9 | 9 | ||
10 | int gem_object_lock(struct drm_i915_gem_object *obj); |
10 | int gem_object_lock(struct drm_i915_gem_object *obj); |
11 | 11 | ||
12 | #define DRIVER_CAPS_0 HW_BIT_BLIT | HW_TEX_BLIT; |
12 | #define DRIVER_CAPS_0 HW_BIT_BLIT | HW_TEX_BLIT; |
13 | #define DRIVER_CAPS_1 0 |
13 | #define DRIVER_CAPS_1 0 |
14 | 14 | ||
15 | extern struct drm_device *main_device; |
15 | extern struct drm_device *main_device; |
16 | 16 | ||
17 | struct hman bm_man; |
17 | struct hman bm_man; |
18 | 18 | ||
19 | void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap) |
19 | void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap) |
20 | { |
20 | { |
21 | printf("destroy bitmap %d\n", bitmap->handle); |
21 | printf("destroy bitmap %d\n", bitmap->handle); |
22 | free_handle(&bm_man, bitmap->handle); |
22 | free_handle(&bm_man, bitmap->handle); |
23 | bitmap->handle = 0; |
23 | bitmap->handle = 0; |
24 | bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT; |
24 | bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT; |
25 | bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
25 | bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
26 | 26 | ||
27 | mutex_lock(&main_device->struct_mutex); |
27 | mutex_lock(&main_device->struct_mutex); |
28 | drm_gem_object_unreference(&bitmap->obj->base); |
28 | drm_gem_object_unreference(&bitmap->obj->base); |
29 | mutex_unlock(&main_device->struct_mutex); |
29 | mutex_unlock(&main_device->struct_mutex); |
30 | 30 | ||
31 | __DestroyObject(bitmap); |
31 | __DestroyObject(bitmap); |
32 | }; |
32 | }; |
33 | 33 | ||
34 | int init_bitmaps() |
34 | int init_bitmaps() |
35 | { |
35 | { |
36 | int ret; |
36 | int ret; |
37 | 37 | ||
38 | ret = init_hman(&bm_man, 1024); |
38 | ret = init_hman(&bm_man, 1024); |
39 | 39 | ||
40 | return ret; |
40 | return ret; |
41 | }; |
41 | }; |
42 | 42 | ||
43 | 43 | ||
44 | int create_surface(struct io_call_10 *pbitmap) |
44 | int create_surface(struct io_call_10 *pbitmap) |
45 | { |
45 | { |
46 | struct drm_i915_gem_object *obj; |
46 | struct drm_i915_gem_object *obj; |
47 | 47 | ||
48 | bitmap_t *bitmap; |
48 | bitmap_t *bitmap; |
49 | u32 handle; |
49 | u32 handle; |
50 | u32 width, max_width; |
50 | u32 width, max_width; |
51 | u32 height, max_height; |
51 | u32 height, max_height; |
52 | u32 size, max_size; |
52 | u32 size, max_size; |
53 | u32 pitch, max_pitch; |
53 | u32 pitch, max_pitch; |
54 | void *uaddr; |
54 | void *uaddr; |
55 | 55 | ||
56 | int ret; |
56 | int ret; |
57 | 57 | ||
58 | pbitmap->handle = 0; |
58 | pbitmap->handle = 0; |
59 | pbitmap->data = (void*)-1; |
59 | pbitmap->data = (void*)-1; |
60 | 60 | ||
61 | width = pbitmap->width; |
61 | width = pbitmap->width; |
62 | height = pbitmap->height; |
62 | height = pbitmap->height; |
63 | 63 | ||
64 | /* |
64 | /* |
65 | if((width==0)||(height==0)||(width>4096)||(height>4096)) |
65 | if((width==0)||(height==0)||(width>4096)||(height>4096)) |
66 | goto err1; |
66 | goto err1; |
67 | 67 | ||
68 | if( ((pbitmap->max_width !=0 ) && |
68 | if( ((pbitmap->max_width !=0 ) && |
69 | (pbitmap->max_width < width)) || |
69 | (pbitmap->max_width < width)) || |
70 | (pbitmap->max_width > 4096) ) |
70 | (pbitmap->max_width > 4096) ) |
71 | goto err1; |
71 | goto err1; |
72 | 72 | ||
73 | if( ((pbitmap->max_height !=0 ) && |
73 | if( ((pbitmap->max_height !=0 ) && |
74 | (pbitmap->max_height < width)) || |
74 | (pbitmap->max_height < width)) || |
75 | (pbitmap->max_height > 4096) ) |
75 | (pbitmap->max_height > 4096) ) |
76 | goto err1; |
76 | goto err1; |
77 | 77 | ||
78 | if( pbitmap->format != 0) |
78 | if( pbitmap->format != 0) |
79 | goto err1; |
79 | goto err1; |
80 | */ |
80 | */ |
81 | 81 | ||
82 | max_width = (pbitmap->max_width ==0) ? width : pbitmap->max_width; |
82 | max_width = (pbitmap->max_width ==0) ? width : pbitmap->max_width; |
83 | max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height; |
83 | max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height; |
84 | 84 | ||
85 | handle = alloc_handle(&bm_man); |
85 | handle = alloc_handle(&bm_man); |
86 | // printf("%s %d\n",__FUNCTION__, handle); |
86 | // printf("%s %d\n",__FUNCTION__, handle); |
87 | 87 | ||
88 | if(handle == 0) |
88 | if(handle == 0) |
89 | goto err1; |
89 | goto err1; |
90 | 90 | ||
91 | bitmap = CreateObject(GetPid(), sizeof(*bitmap)); |
91 | bitmap = CreateObject(GetPid(), sizeof(*bitmap)); |
92 | bitmap->handle = handle; |
92 | // printf("bitmap %x\n", bitmap); |
- | 93 | if( bitmap == NULL) |
|
- | 94 | goto err1; |
|
- | 95 | ||
- | 96 | bitmap->handle = handle; |
|
93 | bitmap->header.destroy = destroy_bitmap; |
97 | bitmap->header.destroy = destroy_bitmap; |
94 | bitmap->obj = NULL; |
98 | bitmap->obj = NULL; |
95 | 99 | ||
96 | // printf("bitmap %x\n", bitmap); |
- | |
97 | if( bitmap == NULL) |
- | |
98 | goto err1; |
- | |
99 | 100 | ||
100 | hman_set_data(&bm_man, handle, bitmap); |
101 | hman_set_data(&bm_man, handle, bitmap); |
101 | 102 | ||
102 | pitch = ALIGN(width*4,64); |
103 | pitch = ALIGN(width*4,64); |
103 | 104 | ||
104 | size = roundup(pitch*height, PAGE_SIZE); |
105 | size = roundup(pitch*height, PAGE_SIZE); |
105 | 106 | ||
106 | // printf("pitch %d size %d\n", pitch, size); |
107 | // printf("pitch %d size %d\n", pitch, size); |
107 | 108 | ||
108 | obj = i915_gem_alloc_object(main_device, size); |
109 | obj = i915_gem_alloc_object(main_device, size); |
109 | if (obj == NULL) |
110 | if (obj == NULL) |
110 | goto err2; |
111 | goto err2; |
111 | 112 | ||
112 | ret = i915_gem_object_pin(obj, 4096, true); |
113 | ret = i915_gem_object_pin(obj, 4096, true); |
113 | if (ret) |
114 | if (ret) |
114 | goto err3; |
115 | goto err3; |
115 | 116 | ||
116 | max_pitch = ALIGN(max_width*4,64); |
117 | max_pitch = ALIGN(max_width*4,64); |
117 | max_size = roundup(max_pitch*max_height, PAGE_SIZE); |
118 | max_size = roundup(max_pitch*max_height, PAGE_SIZE); |
118 | 119 | ||
119 | uaddr = UserAlloc(max_size); |
120 | uaddr = UserAlloc(max_size); |
120 | if( uaddr == NULL) |
121 | if( uaddr == NULL) |
121 | goto err4; |
122 | goto err4; |
122 | else |
123 | else |
123 | { |
124 | { |
124 | u32_t *src, *dst; |
125 | u32_t *src, *dst; |
125 | u32 count, max_count; |
126 | u32 count, max_count; |
126 | 127 | ||
127 | #define page_tabs 0xFDC00000 /* really dirty hack */ |
128 | #define page_tabs 0xFDC00000 /* really dirty hack */ |
128 | 129 | ||
129 | src = (u32_t*)obj->pages; |
130 | src = (u32_t*)obj->pages; |
130 | dst = &((u32_t*)page_tabs)[(u32_t)uaddr >> 12]; |
131 | dst = &((u32_t*)page_tabs)[(u32_t)uaddr >> 12]; |
131 | count = size/4096; |
132 | count = size/4096; |
132 | max_count = max_size/4096 - count; |
133 | max_count = max_size/4096 - count; |
133 | 134 | ||
134 | while(count--) |
135 | while(count--) |
135 | { |
136 | { |
136 | *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page |
137 | *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page |
137 | }; |
138 | }; |
138 | while(max_count--) |
139 | while(max_count--) |
139 | *dst++ = 0; // cleanup unused space |
140 | *dst++ = 0; // cleanup unused space |
140 | } |
141 | } |
141 | 142 | ||
142 | obj->mapped = uaddr ; |
143 | obj->mapped = uaddr ; |
143 | 144 | ||
144 | bitmap->handle = handle; |
145 | bitmap->handle = handle; |
145 | bitmap->uaddr = uaddr; |
146 | bitmap->uaddr = uaddr; |
146 | bitmap->pitch = pitch; |
147 | bitmap->pitch = pitch; |
147 | bitmap->gaddr = obj->gtt_offset; |
148 | bitmap->gaddr = obj->gtt_offset; |
148 | 149 | ||
149 | bitmap->width = width; |
150 | bitmap->width = width; |
150 | bitmap->height = height; |
151 | bitmap->height = height; |
151 | bitmap->max_width = max_width; |
152 | bitmap->max_width = max_width; |
152 | bitmap->max_height = max_height; |
153 | bitmap->max_height = max_height; |
153 | 154 | ||
154 | bitmap->obj = obj; |
155 | bitmap->obj = obj; |
155 | bitmap->header.destroy = destroy_bitmap; |
156 | bitmap->header.destroy = destroy_bitmap; |
156 | 157 | ||
157 | pbitmap->handle = handle; |
158 | pbitmap->handle = handle; |
158 | pbitmap->data = uaddr; |
159 | pbitmap->data = uaddr; |
159 | pbitmap->pitch = pitch; |
160 | pbitmap->pitch = pitch; |
160 | 161 | ||
161 | 162 | ||
162 | printf("%s handle: %d pitch: %d gpu_addr: %x user_addr: %x\n", |
163 | printf("%s handle: %d pitch: %d gpu_addr: %x user_addr: %x\n", |
163 | __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr); |
164 | __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr); |
164 | 165 | ||
165 | return 0; |
166 | return 0; |
166 | 167 | ||
167 | err4: |
168 | err4: |
168 | i915_gem_object_unpin(obj); |
169 | i915_gem_object_unpin(obj); |
169 | err3: |
170 | err3: |
170 | drm_gem_object_unreference(&obj->base); |
171 | drm_gem_object_unreference(&obj->base); |
171 | err2: |
172 | err2: |
172 | free_handle(&bm_man, handle); |
173 | free_handle(&bm_man, handle); |
173 | __DestroyObject(bitmap); |
174 | __DestroyObject(bitmap); |
174 | err1: |
175 | err1: |
175 | return -1; |
176 | return -1; |
176 | 177 | ||
177 | }; |
178 | }; |
178 | 179 | ||
179 | 180 | ||
180 | int lock_surface(struct io_call_12 *pbitmap) |
181 | int lock_surface(struct io_call_12 *pbitmap) |
181 | { |
182 | { |
182 | int ret; |
183 | int ret; |
183 | 184 | ||
184 | drm_i915_private_t *dev_priv = main_device->dev_private; |
185 | drm_i915_private_t *dev_priv = main_device->dev_private; |
185 | 186 | ||
186 | bitmap_t *bitmap; |
187 | bitmap_t *bitmap; |
187 | 188 | ||
188 | if(unlikely(pbitmap->handle == 0)) |
189 | if(unlikely(pbitmap->handle == 0)) |
189 | return -1; |
190 | return -1; |
190 | 191 | ||
191 | bitmap = (bitmap_t*)hman_get_data(&bm_man, pbitmap->handle); |
192 | bitmap = (bitmap_t*)hman_get_data(&bm_man, pbitmap->handle); |
192 | 193 | ||
193 | if(unlikely(bitmap==NULL)) |
194 | if(unlikely(bitmap==NULL)) |
194 | return -1; |
195 | return -1; |
195 | 196 | ||
196 | ret = gem_object_lock(bitmap->obj); |
197 | ret = gem_object_lock(bitmap->obj); |
197 | if(ret !=0 ) |
198 | if(ret !=0 ) |
198 | { |
199 | { |
199 | pbitmap->data = NULL; |
200 | pbitmap->data = NULL; |
200 | pbitmap->pitch = 0; |
201 | pbitmap->pitch = 0; |
201 | 202 | ||
202 | dbgprintf("%s fail\n", __FUNCTION__); |
203 | dbgprintf("%s fail\n", __FUNCTION__); |
203 | return ret; |
204 | return ret; |
204 | }; |
205 | }; |
205 | 206 | ||
206 | pbitmap->data = bitmap->uaddr; |
207 | pbitmap->data = bitmap->uaddr; |
207 | pbitmap->pitch = bitmap->pitch; |
208 | pbitmap->pitch = bitmap->pitch; |
208 | 209 | ||
209 | return 0; |
210 | return 0; |
210 | }; |
211 | }; |
211 | 212 | ||
- | 213 | ||
212 | int init_hman(struct hman *man, u32 count) |
214 | int init_hman(struct hman *man, u32 count) |
213 | { |
215 | { |
214 | u32* data; |
216 | u32* data; |
215 | 217 | ||
216 | data = malloc(count*sizeof(u32*)); |
218 | data = malloc(count*sizeof(u32*)); |
217 | if(data) |
219 | if(data) |
218 | { |
220 | { |
219 | int i; |
221 | int i; |
220 | 222 | ||
221 | for(i=0;i < count-1;) |
223 | for(i=0;i < count-1;) |
222 | data[i] = ++i; |
224 | data[i] = ++i; |
223 | data[i] = 0; |
225 | data[i] = 0; |
224 | 226 | ||
225 | man->table = data; |
227 | man->table = data; |
226 | man->next = 0; |
228 | man->next = 0; |
227 | man->avail = count; |
229 | man->avail = count; |
228 | man->count = count; |
230 | man->count = count; |
229 | 231 | ||
230 | return 0; |
232 | return 0; |
231 | }; |
233 | }; |
232 | return -ENOMEM; |
234 | return -ENOMEM; |
233 | }; |
235 | }; |
234 | 236 | ||
235 | u32 alloc_handle(struct hman *man) |
237 | u32 alloc_handle(struct hman *man) |
236 | { |
238 | { |
237 | u32 handle = 0; |
239 | u32 handle = 0; |
238 | 240 | ||
239 | if(man->avail) |
241 | if(man->avail) |
240 | { |
242 | { |
241 | handle = man->next; |
243 | handle = man->next; |
242 | man->next = man->table[handle]; |
244 | man->next = man->table[handle]; |
243 | man->avail--; |
245 | man->avail--; |
244 | handle++; |
246 | handle++; |
245 | } |
247 | } |
246 | return handle; |
248 | return handle; |
247 | }; |
249 | }; |
248 | 250 | ||
249 | int free_handle(struct hman *man, u32 handle) |
251 | int free_handle(struct hman *man, u32 handle) |
250 | { |
252 | { |
251 | int ret = -1; |
253 | int ret = -1; |
252 | 254 | ||
253 | handle--; |
255 | handle--; |
254 | 256 | ||
255 | if(handle < man->count) |
257 | if(handle < man->count) |
256 | { |
258 | { |
257 | man->table[handle] = man->next; |
259 | man->table[handle] = man->next; |
258 | man->next = handle; |
260 | man->next = handle; |
259 | man->avail++; |
261 | man->avail++; |
260 | ret = 0; |
262 | ret = 0; |
261 | }; |
263 | }; |
262 | 264 | ||
263 | return ret; |
265 | return ret; |
264 | }; |
266 | }; |
265 | 267 | ||
266 | 268 | ||
267 | void *drm_intel_bo_map(struct drm_i915_gem_object *obj, int write_enable) |
269 | void *drm_intel_bo_map(struct drm_i915_gem_object *obj, int write_enable) |
268 | { |
270 | { |
269 | u8 *kaddr; |
271 | u8 *kaddr; |
270 | 272 | ||
271 | kaddr = AllocKernelSpace(obj->base.size); |
273 | kaddr = AllocKernelSpace(obj->base.size); |
272 | if( kaddr != NULL) |
274 | if( kaddr != NULL) |
273 | { |
275 | { |
274 | u32_t *src = (u32_t*)obj->pages; |
276 | u32_t *src = (u32_t*)obj->pages; |
275 | u32_t *dst = &((u32_t*)page_tabs)[(u32_t)kaddr >> 12]; |
277 | u32_t *dst = &((u32_t*)page_tabs)[(u32_t)kaddr >> 12]; |
276 | 278 | ||
277 | u32 count = obj->base.size/4096; |
279 | u32 count = obj->base.size/4096; |
278 | 280 | ||
279 | while(count--) |
281 | while(count--) |
280 | { |
282 | { |
281 | *dst++ = (0xFFFFF000 & *src++) | 0x003 ; |
283 | *dst++ = (0xFFFFF000 & *src++) | 0x003 ; |
282 | }; |
284 | }; |
283 | return kaddr; |
285 | return kaddr; |
284 | }; |
286 | }; |
285 | return NULL; |
287 | return NULL; |
286 | } |
288 | } |
287 | 289 | ||
288 | void destroy_gem_object(uint32_t handle) |
290 | void destroy_gem_object(uint32_t handle) |
289 | { |
291 | { |
290 | struct drm_i915_gem_object *obj = (void*)handle; |
292 | struct drm_i915_gem_object *obj = (void*)handle; |
291 | drm_gem_object_unreference(&obj->base); |
293 | drm_gem_object_unreference(&obj->base); |
292 | 294 | ||
293 | }; |
295 | }; |
294 | 296 | ||
295 | 297 | ||
296 | void write_gem_object(uint32_t handle, u32 offset, u32 size, u8* src) |
298 | void write_gem_object(uint32_t handle, u32 offset, u32 size, u8* src) |
297 | { |
299 | { |
298 | struct drm_i915_gem_object *obj = (void*)handle; |
300 | struct drm_i915_gem_object *obj = (void*)handle; |
299 | u8 *dst; |
301 | u8 *dst; |
300 | int ret; |
302 | int ret; |
301 | 303 | ||
302 | ret = i915_gem_object_pin(obj, 4096, true); |
304 | ret = i915_gem_object_pin(obj, 4096, true); |
303 | if (ret) |
305 | if (ret) |
304 | return; |
306 | return; |
305 | 307 | ||
306 | dst = drm_intel_bo_map(obj, true); |
308 | dst = drm_intel_bo_map(obj, true); |
307 | if( dst != NULL ) |
309 | if( dst != NULL ) |
308 | { |
310 | { |
309 | memmove(dst+offset, src, size); |
311 | memmove(dst+offset, src, size); |
310 | FreeKernelSpace(dst); |
312 | FreeKernelSpace(dst); |
311 | }; |
313 | }; |
312 | }; |
314 | }; |
313 | 315 | ||
314 | u32 get_buffer_offset(uint32_t handle) |
316 | u32 get_buffer_offset(uint32_t handle) |
315 | { |
317 | { |
316 | struct drm_i915_gem_object *obj = (void*)handle; |
318 | struct drm_i915_gem_object *obj = (void*)handle; |
317 | 319 | ||
318 | return obj->gtt_offset; |
320 | return obj->gtt_offset; |
319 | }; |
321 | }; |
320 | 322 | ||
321 | 323 | ||
322 | int get_driver_caps(hwcaps_t *caps) |
324 | int get_driver_caps(hwcaps_t *caps) |
323 | { |
325 | { |
324 | int ret = 0; |
326 | int ret = 0; |
325 | ENTER(); |
327 | ENTER(); |
326 | 328 | ||
327 | switch(caps->idx) |
329 | switch(caps->idx) |
328 | { |
330 | { |
329 | case 0: |
331 | case 0: |
330 | caps->opt[0] = DRIVER_CAPS_0; |
332 | caps->opt[0] = DRIVER_CAPS_0; |
331 | caps->opt[1] = DRIVER_CAPS_1; |
333 | caps->opt[1] = DRIVER_CAPS_1; |
332 | break; |
334 | break; |
333 | 335 | ||
334 | case 1: |
336 | case 1: |
335 | caps->cap1.max_tex_width = 4096; |
337 | caps->cap1.max_tex_width = 4096; |
336 | caps->cap1.max_tex_height = 4096; |
338 | caps->cap1.max_tex_height = 4096; |
337 | break; |
339 | break; |
338 | default: |
340 | default: |
339 | ret = 1; |
341 | ret = 1; |
340 | }; |
342 | }; |
341 | caps->idx = 1; |
343 | caps->idx = 1; |
342 | return ret; |
344 | return ret; |
343 | }>>>> |
345 | }>>>> |