Rev 3120 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3120 | Rev 3192 | ||
---|---|---|---|
1 | #include |
1 | #include |
2 | #include |
2 | #include |
3 | #include "radeon.h" |
3 | #include "radeon.h" |
4 | #include "hmm.h" |
4 | #include "hmm.h" |
5 | #include "bitmap.h" |
5 | #include "bitmap.h" |
6 | 6 | ||
7 | //#define DRIVER_CAPS_0 HW_BIT_BLIT |
7 | //#define DRIVER_CAPS_0 HW_BIT_BLIT |
8 | 8 | ||
9 | #define DRIVER_CAPS_0 0 |
9 | #define DRIVER_CAPS_0 0 |
10 | #define DRIVER_CAPS_1 0 |
10 | #define DRIVER_CAPS_1 0 |
11 | 11 | ||
12 | struct context *context_map[256]; |
12 | struct context *context_map[256]; |
13 | 13 | ||
14 | struct hmm bm_mm; |
14 | struct hmm bm_mm; |
15 | 15 | ||
16 | extern struct drm_device *main_drm_device; |
16 | extern struct drm_device *main_drm_device; |
17 | 17 | ||
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 | // dma_addr_t *pages = bitmap->obj->allocated_pages; |
21 | // dma_addr_t *pages = bitmap->obj->allocated_pages; |
22 | int i; |
22 | int i; |
23 | 23 | ||
24 | free_handle(&bm_mm, bitmap->handle); |
24 | free_handle(&bm_mm, bitmap->handle); |
25 | bitmap->handle = 0; |
25 | bitmap->handle = 0; |
26 | // bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT; |
26 | // bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT; |
27 | // bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
27 | // bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
28 | 28 | ||
29 | // mutex_lock(&main_device->struct_mutex); |
29 | // mutex_lock(&main_device->struct_mutex); |
30 | // drm_gem_object_unreference(&bitmap->obj->base); |
30 | // drm_gem_object_unreference(&bitmap->obj->base); |
31 | // mutex_unlock(&main_device->struct_mutex); |
31 | // mutex_unlock(&main_device->struct_mutex); |
32 | 32 | ||
33 | // if(pages != NULL) |
33 | // if(pages != NULL) |
34 | // { |
34 | // { |
35 | // for (i = 0; i < bitmap->page_count; i++) |
35 | // for (i = 0; i < bitmap->page_count; i++) |
36 | // FreePage(pages[i]); |
36 | // FreePage(pages[i]); |
37 | 37 | ||
38 | // DRM_DEBUG("%s release %d pages\n", __FUNCTION__, bitmap->page_count); |
38 | // DRM_DEBUG("%s release %d pages\n", __FUNCTION__, bitmap->page_count); |
39 | 39 | ||
40 | // free(pages); |
40 | // free(pages); |
41 | // }; |
41 | // }; |
42 | UserFree(bitmap->uaddr); |
42 | UserFree(bitmap->uaddr); |
43 | __DestroyObject(bitmap); |
43 | __DestroyObject(bitmap); |
44 | }; |
44 | }; |
45 | 45 | ||
46 | #if 0 |
46 | #if 0 |
47 | static int bitmap_get_pages_gtt(struct drm_i915_gem_object *obj) |
47 | static int bitmap_get_pages_gtt(struct drm_i915_gem_object *obj) |
48 | { |
48 | { |
49 | int page_count; |
49 | int page_count; |
50 | 50 | ||
51 | /* Get the list of pages out of our struct file. They'll be pinned |
51 | /* Get the list of pages out of our struct file. They'll be pinned |
52 | * at this point until we release them. |
52 | * at this point until we release them. |
53 | */ |
53 | */ |
54 | 54 | ||
55 | page_count = obj->base.size / PAGE_SIZE; |
55 | page_count = obj->base.size / PAGE_SIZE; |
56 | BUG_ON(obj->allocated_pages == NULL); |
56 | BUG_ON(obj->allocated_pages == NULL); |
57 | BUG_ON(obj->pages.page != NULL); |
57 | BUG_ON(obj->pages.page != NULL); |
58 | 58 | ||
59 | obj->pages.page = obj->allocated_pages; |
59 | obj->pages.page = obj->allocated_pages; |
60 | obj->pages.nents = page_count; |
60 | obj->pages.nents = page_count; |
61 | 61 | ||
62 | 62 | ||
63 | // if (obj->tiling_mode != I915_TILING_NONE) |
63 | // if (obj->tiling_mode != I915_TILING_NONE) |
64 | // i915_gem_object_do_bit_17_swizzle(obj); |
64 | // i915_gem_object_do_bit_17_swizzle(obj); |
65 | 65 | ||
66 | return 0; |
66 | return 0; |
67 | } |
67 | } |
68 | 68 | ||
69 | static void bitmap_put_pages_gtt(struct drm_i915_gem_object *obj) |
69 | static void bitmap_put_pages_gtt(struct drm_i915_gem_object *obj) |
70 | { |
70 | { |
71 | int ret, i; |
71 | int ret, i; |
72 | 72 | ||
73 | BUG_ON(obj->madv == __I915_MADV_PURGED); |
73 | BUG_ON(obj->madv == __I915_MADV_PURGED); |
74 | 74 | ||
75 | ret = i915_gem_object_set_to_cpu_domain(obj, true); |
75 | ret = i915_gem_object_set_to_cpu_domain(obj, true); |
76 | if (ret) { |
76 | if (ret) { |
77 | /* In the event of a disaster, abandon all caches and |
77 | /* In the event of a disaster, abandon all caches and |
78 | * hope for the best. |
78 | * hope for the best. |
79 | */ |
79 | */ |
80 | WARN_ON(ret != -EIO); |
80 | WARN_ON(ret != -EIO); |
81 | i915_gem_clflush_object(obj); |
81 | i915_gem_clflush_object(obj); |
82 | obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
82 | obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
83 | } |
83 | } |
84 | 84 | ||
85 | if (obj->madv == I915_MADV_DONTNEED) |
85 | if (obj->madv == I915_MADV_DONTNEED) |
86 | obj->dirty = 0; |
86 | obj->dirty = 0; |
87 | 87 | ||
88 | obj->dirty = 0; |
88 | obj->dirty = 0; |
89 | } |
89 | } |
90 | 90 | ||
91 | static const struct drm_i915_gem_object_ops bitmap_object_ops = { |
91 | static const struct drm_i915_gem_object_ops bitmap_object_ops = { |
92 | .get_pages = bitmap_get_pages_gtt, |
92 | .get_pages = bitmap_get_pages_gtt, |
93 | .put_pages = bitmap_put_pages_gtt, |
93 | .put_pages = bitmap_put_pages_gtt, |
94 | }; |
94 | }; |
95 | 95 | ||
96 | 96 | ||
97 | 97 | ||
98 | struct io_call_10 /* SRV_CREATE_SURFACE */ |
98 | struct io_call_10 /* SRV_CREATE_SURFACE */ |
99 | { |
99 | { |
100 | u32 handle; // ignored |
100 | u32 handle; // ignored |
101 | void *data; // ignored |
101 | void *data; // ignored |
102 | 102 | ||
103 | u32 width; |
103 | u32 width; |
104 | u32 height; |
104 | u32 height; |
105 | u32 pitch; // ignored |
105 | u32 pitch; // ignored |
106 | 106 | ||
107 | u32 max_width; |
107 | u32 max_width; |
108 | u32 max_height; |
108 | u32 max_height; |
109 | u32 format; // reserved mbz |
109 | u32 format; // reserved mbz |
110 | }; |
110 | }; |
111 | 111 | ||
112 | #endif |
112 | #endif |
113 | 113 | ||
114 | int create_surface(struct drm_device *dev, struct io_call_10 *pbitmap) |
114 | int create_surface(struct drm_device *dev, struct io_call_10 *pbitmap) |
115 | { |
115 | { |
116 | struct radeon_device *rdev = dev->dev_private; |
116 | struct radeon_device *rdev = dev->dev_private; |
117 | struct radeon_bo *obj = NULL; |
117 | struct radeon_bo *obj = NULL; |
118 | 118 | ||
119 | bitmap_t *bitmap; |
119 | bitmap_t *bitmap; |
120 | u32 handle; |
120 | u32 handle; |
121 | u32 width, max_width; |
121 | u32 width, max_width; |
122 | u32 height, max_height; |
122 | u32 height, max_height; |
123 | u32 size, max_size; |
123 | u32 size, max_size; |
124 | u32 pitch, max_pitch; |
124 | u32 pitch, max_pitch; |
125 | void *uaddr; |
125 | void *uaddr; |
126 | dma_addr_t *pages; |
126 | dma_addr_t *pages; |
127 | u32 page_count; |
127 | u32 page_count; |
128 | 128 | ||
129 | int i; |
129 | int i; |
130 | 130 | ||
131 | int ret; |
131 | int ret; |
132 | 132 | ||
133 | pbitmap->handle = 0; |
133 | pbitmap->handle = 0; |
134 | pbitmap->data = (void*)-1; |
134 | pbitmap->data = (void*)-1; |
135 | 135 | ||
136 | width = pbitmap->width; |
136 | width = pbitmap->width; |
137 | height = pbitmap->height; |
137 | height = pbitmap->height; |
138 | 138 | ||
139 | if((width == 0)||(height == 0)||(width > 4096)||(height > 4096)) |
139 | if((width == 0)||(height == 0)||(width > 4096)||(height > 4096)) |
140 | goto err1; |
140 | goto err1; |
141 | 141 | ||
142 | max_width = (pbitmap->max_width ==0) ? width : pbitmap->max_width; |
142 | max_width = (pbitmap->max_width ==0) ? width : pbitmap->max_width; |
143 | max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height; |
143 | max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height; |
144 | 144 | ||
145 | handle = alloc_handle(&bm_mm); |
145 | handle = alloc_handle(&bm_mm); |
146 | // printf("%s %d\n",__FUNCTION__, handle); |
146 | // printf("%s %d\n",__FUNCTION__, handle); |
147 | 147 | ||
148 | if(handle == 0) |
148 | if(handle == 0) |
149 | goto err1; |
149 | goto err1; |
150 | 150 | ||
151 | bitmap = CreateObject(GetPid(), sizeof(*bitmap)); |
151 | bitmap = CreateObject(GetPid(), sizeof(*bitmap)); |
152 | // printf("bitmap %x\n", bitmap); |
152 | // printf("bitmap %x\n", bitmap); |
153 | if( bitmap == NULL) |
153 | if( bitmap == NULL) |
154 | goto err2; |
154 | goto err2; |
155 | 155 | ||
156 | bitmap->handle = handle; |
156 | bitmap->handle = handle; |
157 | bitmap->header.destroy = destroy_bitmap; |
157 | bitmap->header.destroy = destroy_bitmap; |
158 | bitmap->obj = NULL; |
158 | bitmap->obj = NULL; |
159 | 159 | ||
160 | hmm_set_data(&bm_mm, handle, bitmap); |
160 | hmm_set_data(&bm_mm, handle, bitmap); |
161 | 161 | ||
162 | pitch = ALIGN(width*4,64); |
162 | pitch = ALIGN(width*4,64); |
163 | size = roundup(pitch*height, PAGE_SIZE); |
163 | size = roundup(pitch*height, PAGE_SIZE); |
164 | 164 | ||
165 | // printf("pitch %d size %d\n", pitch, size); |
165 | // printf("pitch %d size %d\n", pitch, size); |
166 | 166 | ||
167 | max_pitch = ALIGN(max_width*4,64); |
167 | max_pitch = ALIGN(max_width*4,64); |
168 | max_size = roundup(max_pitch*max_height, PAGE_SIZE); |
168 | max_size = roundup(max_pitch*max_height, PAGE_SIZE); |
169 | 169 | ||
170 | // printf("max_pitch %d max_size %d\n", max_pitch, max_size); |
170 | // printf("max_pitch %d max_size %d\n", max_pitch, max_size); |
171 | 171 | ||
172 | ret = radeon_bo_create(rdev, size, PAGE_SIZE, false, RADEON_GEM_DOMAIN_GTT, NULL, &obj); |
172 | ret = radeon_bo_create(rdev, size, PAGE_SIZE, false, RADEON_GEM_DOMAIN_GTT, NULL, &obj); |
173 | 173 | ||
174 | if (unlikely(ret != 0)) |
174 | if (unlikely(ret != 0)) |
175 | goto err3; |
175 | goto err3; |
176 | 176 | ||
177 | ret = radeon_bo_reserve(obj, false); |
177 | ret = radeon_bo_reserve(obj, false); |
178 | if (unlikely(ret != 0)) |
178 | if (unlikely(ret != 0)) |
179 | goto err3; |
179 | goto err3; |
180 | 180 | ||
181 | ret = radeon_bo_pin(obj, RADEON_GEM_DOMAIN_GTT, NULL); |
181 | ret = radeon_bo_pin(obj, RADEON_GEM_DOMAIN_GTT, NULL); |
182 | if (unlikely(ret != 0)) |
182 | if (unlikely(ret != 0)) |
183 | goto err3; |
183 | goto err3; |
184 | 184 | ||
185 | ret = radeon_bo_user_map(obj, (void**)&uaddr); |
185 | ret = radeon_bo_user_map(obj, (void**)&uaddr); |
186 | if (unlikely(ret != 0)) |
186 | if (unlikely(ret != 0)) |
187 | goto err3; |
187 | goto err3; |
188 | 188 | ||
189 | bitmap->page_count = size/PAGE_SIZE; |
189 | bitmap->page_count = size/PAGE_SIZE; |
190 | bitmap->max_count = max_size/PAGE_SIZE; |
190 | bitmap->max_count = max_size/PAGE_SIZE; |
191 | 191 | ||
192 | DRM_DEBUG("%s alloc %d pages\n", __FUNCTION__, page_count); |
192 | // DRM_DEBUG("%s alloc %d pages\n", __FUNCTION__, page_count); |
193 | 193 | ||
194 | bitmap->handle = handle; |
194 | bitmap->handle = handle; |
195 | bitmap->uaddr = uaddr; |
195 | bitmap->uaddr = uaddr; |
196 | bitmap->pitch = pitch; |
196 | bitmap->pitch = pitch; |
197 | bitmap->gaddr = radeon_bo_gpu_offset(obj); |
197 | bitmap->gaddr = radeon_bo_gpu_offset(obj); |
198 | 198 | ||
199 | bitmap->width = width; |
199 | bitmap->width = width; |
200 | bitmap->height = height; |
200 | bitmap->height = height; |
201 | bitmap->max_width = max_width; |
201 | bitmap->max_width = max_width; |
202 | bitmap->max_height = max_height; |
202 | bitmap->max_height = max_height; |
203 | 203 | ||
204 | bitmap->obj = obj; |
204 | bitmap->obj = obj; |
205 | bitmap->header.destroy = destroy_bitmap; |
205 | bitmap->header.destroy = destroy_bitmap; |
206 | 206 | ||
207 | pbitmap->handle = handle; |
207 | pbitmap->handle = handle; |
208 | pbitmap->data = uaddr; |
208 | pbitmap->data = uaddr; |
209 | pbitmap->pitch = pitch; |
209 | pbitmap->pitch = pitch; |
210 | 210 | ||
211 | 211 | ||
212 | DRM_DEBUG("%s handle: %d pitch: %d gpu_addr: %x user_addr: %x\n", |
212 | DRM_DEBUG("%s handle: %d pitch: %d gpu_addr: %x user_addr: %x\n", |
213 | __FUNCTION__, handle, pitch, bitmap->gaddr, uaddr); |
213 | __FUNCTION__, handle, pitch, bitmap->gaddr, uaddr); |
214 | 214 | ||
215 | return 0; |
215 | return 0; |
216 | 216 | ||
217 | err5: |
217 | err5: |
218 | // mutex_lock(&dev->struct_mutex); |
218 | // mutex_lock(&dev->struct_mutex); |
219 | // drm_gem_object_unreference(&obj->base); |
219 | // drm_gem_object_unreference(&obj->base); |
220 | // mutex_unlock(&dev->struct_mutex); |
220 | // mutex_unlock(&dev->struct_mutex); |
221 | 221 | ||
222 | err4: |
222 | err4: |
223 | // while (i--) |
223 | // while (i--) |
224 | // FreePage(pages[i]); |
224 | // FreePage(pages[i]); |
225 | // free(pages); |
225 | // free(pages); |
226 | // UserFree(uaddr); |
226 | // UserFree(uaddr); |
227 | 227 | ||
228 | err3: |
228 | err3: |
229 | __DestroyObject(bitmap); |
229 | __DestroyObject(bitmap); |
230 | err2: |
230 | err2: |
231 | free_handle(&bm_mm, handle); |
231 | free_handle(&bm_mm, handle); |
232 | err1: |
232 | err1: |
233 | return -1; |
233 | return -1; |
234 | }; |
234 | }; |
235 | 235 | ||
236 | 236 | ||
237 | int lock_surface(struct io_call_12 *pbitmap) |
237 | int lock_surface(struct io_call_12 *pbitmap) |
238 | { |
238 | { |
239 | int ret; |
239 | int ret; |
240 | 240 | ||
241 | bitmap_t *bitmap; |
241 | bitmap_t *bitmap; |
242 | 242 | ||
243 | if(unlikely(pbitmap->handle == 0)) |
243 | if(unlikely(pbitmap->handle == 0)) |
244 | return -1; |
244 | return -1; |
245 | 245 | ||
246 | bitmap = (bitmap_t*)hmm_get_data(&bm_mm, pbitmap->handle); |
246 | bitmap = (bitmap_t*)hmm_get_data(&bm_mm, pbitmap->handle); |
247 | 247 | ||
248 | if(unlikely(bitmap==NULL)) |
248 | if(unlikely(bitmap==NULL)) |
249 | return -1; |
249 | return -1; |
250 | /* |
250 | /* |
251 | mutex_lock(&main_device->struct_mutex); |
251 | mutex_lock(&main_device->struct_mutex); |
252 | ret = i915_gem_object_set_to_cpu_domain(bitmap->obj, true); |
252 | ret = i915_gem_object_set_to_cpu_domain(bitmap->obj, true); |
253 | mutex_unlock(&main_device->struct_mutex); |
253 | mutex_unlock(&main_device->struct_mutex); |
254 | 254 | ||
255 | if(ret != 0 ) |
255 | if(ret != 0 ) |
256 | { |
256 | { |
257 | pbitmap->data = NULL; |
257 | pbitmap->data = NULL; |
258 | pbitmap->pitch = 0; |
258 | pbitmap->pitch = 0; |
259 | 259 | ||
260 | dbgprintf("%s fail\n", __FUNCTION__); |
260 | dbgprintf("%s fail\n", __FUNCTION__); |
261 | return ret; |
261 | return ret; |
262 | }; |
262 | }; |
263 | */ |
263 | */ |
264 | pbitmap->data = bitmap->uaddr; |
264 | pbitmap->data = bitmap->uaddr; |
265 | pbitmap->pitch = bitmap->pitch; |
265 | pbitmap->pitch = bitmap->pitch; |
266 | 266 | ||
267 | return 0; |
267 | return 0; |
268 | }; |
268 | }; |
269 | 269 | ||
270 | 270 | ||
271 | #if 0 |
271 | #if 0 |
272 | 272 | ||
273 | int resize_surface(struct io_call_14 *pbitmap) |
273 | int resize_surface(struct io_call_14 *pbitmap) |
274 | { |
274 | { |
275 | bitmap_t *bitmap; |
275 | bitmap_t *bitmap; |
276 | dma_addr_t page, *pages; |
276 | dma_addr_t page, *pages; |
277 | u32 size, page_count; |
277 | u32 size, page_count; |
278 | u32 width, height; |
278 | u32 width, height; |
279 | u32 pitch; |
279 | u32 pitch; |
280 | int i; |
280 | int i; |
281 | int ret = 0; |
281 | int ret = 0; |
282 | 282 | ||
283 | 283 | ||
284 | if(unlikely(pbitmap->handle == 0)) |
284 | if(unlikely(pbitmap->handle == 0)) |
285 | return -1; |
285 | return -1; |
286 | 286 | ||
287 | bitmap = (bitmap_t*)hmm_get_data(&bm_mm, pbitmap->handle); |
287 | bitmap = (bitmap_t*)hmm_get_data(&bm_mm, pbitmap->handle); |
288 | 288 | ||
289 | if(unlikely(bitmap==NULL)) |
289 | if(unlikely(bitmap==NULL)) |
290 | return -1; |
290 | return -1; |
291 | 291 | ||
292 | if( pbitmap->new_width > bitmap->max_width || |
292 | if( pbitmap->new_width > bitmap->max_width || |
293 | pbitmap->new_height > bitmap->max_height) |
293 | pbitmap->new_height > bitmap->max_height) |
294 | return -1; |
294 | return -1; |
295 | 295 | ||
296 | width = pbitmap->new_width; |
296 | width = pbitmap->new_width; |
297 | height = pbitmap->new_height; |
297 | height = pbitmap->new_height; |
298 | 298 | ||
299 | pitch = ALIGN(width*4,64); |
299 | pitch = ALIGN(width*4,64); |
300 | size = roundup(pitch * height, PAGE_SIZE); |
300 | size = roundup(pitch * height, PAGE_SIZE); |
301 | page_count = size/PAGE_SIZE; |
301 | page_count = size/PAGE_SIZE; |
302 | 302 | ||
303 | DRM_DEBUG("new width %d height %d pitch %d size %d\n", |
303 | DRM_DEBUG("new width %d height %d pitch %d size %d\n", |
304 | width, height, pitch, size); |
304 | width, height, pitch, size); |
305 | 305 | ||
306 | if(page_count > bitmap->page_count) |
306 | if(page_count > bitmap->page_count) |
307 | { |
307 | { |
308 | char *vaddr = bitmap->uaddr + PAGE_SIZE * bitmap->page_count; |
308 | char *vaddr = bitmap->uaddr + PAGE_SIZE * bitmap->page_count; |
309 | 309 | ||
310 | pages = bitmap->obj->allocated_pages; |
310 | pages = bitmap->obj->allocated_pages; |
311 | 311 | ||
312 | DRM_DEBUG("old pages %d new_pages %d vaddr %x\n", |
312 | DRM_DEBUG("old pages %d new_pages %d vaddr %x\n", |
313 | bitmap->page_count, page_count, vaddr); |
313 | bitmap->page_count, page_count, vaddr); |
314 | 314 | ||
315 | for(i = bitmap->page_count; i < page_count; i++, vaddr+= PAGE_SIZE) |
315 | for(i = bitmap->page_count; i < page_count; i++, vaddr+= PAGE_SIZE) |
316 | { |
316 | { |
317 | page = AllocPage(); |
317 | page = AllocPage(); |
318 | if ( page == 0 ) |
318 | if ( page == 0 ) |
319 | goto err4; |
319 | goto err4; |
320 | pages[i] = page; |
320 | pages[i] = page; |
321 | MapPage(vaddr, page, 0x207); //map as shared page |
321 | MapPage(vaddr, page, 0x207); //map as shared page |
322 | }; |
322 | }; |
323 | 323 | ||
324 | DRM_DEBUG("%s alloc %d pages\n", __FUNCTION__, |
324 | DRM_DEBUG("%s alloc %d pages\n", __FUNCTION__, |
325 | page_count - bitmap->page_count); |
325 | page_count - bitmap->page_count); |
326 | 326 | ||
327 | i915_gem_object_unpin(bitmap->obj); |
327 | i915_gem_object_unpin(bitmap->obj); |
328 | i915_gem_object_unbind(bitmap->obj); |
328 | i915_gem_object_unbind(bitmap->obj); |
329 | bitmap->obj->base.size = size; |
329 | bitmap->obj->base.size = size; |
330 | bitmap->obj->pages.nents = page_count; |
330 | bitmap->obj->pages.nents = page_count; |
331 | 331 | ||
332 | ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true); |
332 | ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true); |
333 | if (ret) |
333 | if (ret) |
334 | goto err4; |
334 | goto err4; |
335 | 335 | ||
336 | bitmap->page_count = page_count; |
336 | bitmap->page_count = page_count; |
337 | bitmap->gaddr = bitmap->obj->gtt_offset; |
337 | bitmap->gaddr = bitmap->obj->gtt_offset; |
338 | } |
338 | } |
339 | else if(page_count < bitmap->page_count) |
339 | else if(page_count < bitmap->page_count) |
340 | { |
340 | { |
341 | char *vaddr = bitmap->uaddr + PAGE_SIZE * page_count; |
341 | char *vaddr = bitmap->uaddr + PAGE_SIZE * page_count; |
342 | 342 | ||
343 | i915_gem_object_unpin(bitmap->obj); |
343 | i915_gem_object_unpin(bitmap->obj); |
344 | i915_gem_object_unbind(bitmap->obj); |
344 | i915_gem_object_unbind(bitmap->obj); |
345 | 345 | ||
346 | pages = bitmap->obj->allocated_pages; |
346 | pages = bitmap->obj->allocated_pages; |
347 | 347 | ||
348 | DRM_DEBUG("old pages %d new_pages %d vaddr %x\n", |
348 | DRM_DEBUG("old pages %d new_pages %d vaddr %x\n", |
349 | bitmap->page_count, page_count, vaddr); |
349 | bitmap->page_count, page_count, vaddr); |
350 | 350 | ||
351 | for(i = page_count; i < bitmap->page_count; i++, vaddr+= PAGE_SIZE) |
351 | for(i = page_count; i < bitmap->page_count; i++, vaddr+= PAGE_SIZE) |
352 | { |
352 | { |
353 | MapPage(vaddr, 0, 0); //unmap |
353 | MapPage(vaddr, 0, 0); //unmap |
354 | 354 | ||
355 | FreePage(pages[i]); |
355 | FreePage(pages[i]); |
356 | pages[i] = 0; |
356 | pages[i] = 0; |
357 | }; |
357 | }; |
358 | 358 | ||
359 | DRM_DEBUG("%s release %d pages\n", __FUNCTION__, |
359 | DRM_DEBUG("%s release %d pages\n", __FUNCTION__, |
360 | bitmap->page_count - page_count); |
360 | bitmap->page_count - page_count); |
361 | 361 | ||
362 | bitmap->obj->base.size = size; |
362 | bitmap->obj->base.size = size; |
363 | bitmap->obj->pages.nents = page_count; |
363 | bitmap->obj->pages.nents = page_count; |
364 | 364 | ||
365 | ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true); |
365 | ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true); |
366 | if (ret) |
366 | if (ret) |
367 | goto err3; |
367 | goto err3; |
368 | 368 | ||
369 | bitmap->page_count = page_count; |
369 | bitmap->page_count = page_count; |
370 | bitmap->gaddr = bitmap->obj->gtt_offset; |
370 | bitmap->gaddr = bitmap->obj->gtt_offset; |
371 | }; |
371 | }; |
372 | 372 | ||
373 | bitmap->width = width; |
373 | bitmap->width = width; |
374 | bitmap->height = height; |
374 | bitmap->height = height; |
375 | bitmap->pitch = pitch; |
375 | bitmap->pitch = pitch; |
376 | 376 | ||
377 | 377 | ||
378 | pbitmap->data = bitmap->uaddr; |
378 | pbitmap->data = bitmap->uaddr; |
379 | pbitmap->pitch = bitmap->pitch; |
379 | pbitmap->pitch = bitmap->pitch; |
380 | 380 | ||
381 | return 0; |
381 | return 0; |
382 | 382 | ||
383 | err4: |
383 | err4: |
384 | while (i-- > bitmap->page_count) |
384 | while (i-- > bitmap->page_count) |
385 | FreePage(pages[i]); |
385 | FreePage(pages[i]); |
386 | 386 | ||
387 | err3: |
387 | err3: |
388 | return -1; |
388 | return -1; |
389 | }; |
389 | }; |
390 | #endif |
390 | #endif |
391 | 391 | ||
392 | 392 | ||
393 | int init_bitmaps() |
393 | int init_bitmaps() |
394 | { |
394 | { |
395 | int ret; |
395 | int ret; |
396 | 396 | ||
397 | ret = init_hmm(&bm_mm, 1024); |
397 | ret = init_hmm(&bm_mm, 1024); |
398 | 398 | ||
399 | return ret; |
399 | return ret; |
400 | }; |
400 | }; |
401 | 401 | ||
402 | 402 | ||
403 | 403 | ||
404 | int get_driver_caps(hwcaps_t *caps) |
404 | int get_driver_caps(hwcaps_t *caps) |
405 | { |
405 | { |
406 | int ret = 0; |
406 | int ret = 0; |
407 | 407 | ||
408 | ENTER(); |
408 | ENTER(); |
409 | switch(caps->idx) |
409 | switch(caps->idx) |
410 | { |
410 | { |
411 | case 0: |
411 | case 0: |
412 | caps->opt[0] = DRIVER_CAPS_0; |
412 | caps->opt[0] = DRIVER_CAPS_0; |
413 | caps->opt[1] = DRIVER_CAPS_1; |
413 | caps->opt[1] = DRIVER_CAPS_1; |
414 | break; |
414 | break; |
415 | 415 | ||
416 | case 1: |
416 | case 1: |
417 | caps->cap1.max_tex_width = 4096; |
417 | caps->cap1.max_tex_width = 4096; |
418 | caps->cap1.max_tex_height = 4096; |
418 | caps->cap1.max_tex_height = 4096; |
419 | break; |
419 | break; |
420 | default: |
420 | default: |
421 | ret = 1; |
421 | ret = 1; |
422 | }; |
422 | }; |
423 | caps->idx = 1; |
423 | caps->idx = 1; |
424 | LEAVE(); |
424 | LEAVE(); |
425 | return ret; |
425 | return ret; |
426 | } |
426 | } |
427 | 427 | ||
428 | 428 | ||
429 | void __attribute__((regparm(1))) destroy_context(struct context *context) |
429 | void __attribute__((regparm(1))) destroy_context(struct context *context) |
430 | { |
430 | { |
431 | struct radeon_device *rdev = main_drm_device->dev_private; |
431 | struct radeon_device *rdev = main_drm_device->dev_private; |
432 | 432 | ||
433 | DRM_DEBUG("destroy context %x\n", context); |
433 | DRM_DEBUG("destroy context %x\n", context); |
434 | 434 | ||
435 | context_map[context->slot] = NULL; |
435 | context_map[context->slot] = NULL; |
436 | 436 | ||
437 | radeon_ib_free(rdev, &context->ib); |
437 | radeon_ib_free(rdev, &context->ib); |
438 | 438 | ||
439 | __DestroyObject(context); |
439 | __DestroyObject(context); |
440 | }; |
440 | }; |
441 | 441 | ||
442 | 442 | ||
443 | #define CURRENT_TASK (0x80003000) |
443 | #define CURRENT_TASK (0x80003000) |
444 | 444 | ||
445 | struct context *get_context(struct drm_device *dev) |
445 | struct context *get_context(struct drm_device *dev) |
446 | { |
446 | { |
447 | struct radeon_device *rdev = dev->dev_private; |
447 | struct radeon_device *rdev = dev->dev_private; |
448 | struct context *context; |
448 | struct context *context; |
449 | struct io_call_10 io_10; |
449 | struct io_call_10 io_10; |
450 | int slot = *((u8*)CURRENT_TASK); |
450 | int slot = *((u8*)CURRENT_TASK); |
451 | int ret; |
451 | int ret; |
452 | 452 | ||
453 | context = context_map[slot]; |
453 | context = context_map[slot]; |
454 | 454 | ||
455 | if( context != NULL) |
455 | if( context != NULL) |
456 | return context; |
456 | return context; |
457 | 457 | ||
458 | context = CreateObject(GetPid(), sizeof(*context)); |
458 | context = CreateObject(GetPid(), sizeof(*context)); |
459 | 459 | ||
460 | if( context != NULL) |
460 | if( context != NULL) |
461 | { |
461 | { |
462 | ret = radeon_ib_get(rdev, RADEON_RING_TYPE_GFX_INDEX, &context->ib, NULL, 4096); |
462 | ret = radeon_ib_get(rdev, RADEON_RING_TYPE_GFX_INDEX, &context->ib, NULL, 4096); |
463 | if (ret) { |
463 | if (ret) { |
464 | DRM_ERROR("radeon: failed to get ib (%d).\n", ret); |
464 | DRM_ERROR("radeon: failed to get ib (%d).\n", ret); |
465 | goto err; |
465 | goto err; |
466 | }; |
466 | }; |
467 | 467 | ||
468 | context->cmd_buffer = context->ib.ptr; |
468 | context->cmd_buffer = context->ib.ptr; |
469 | 469 | ||
470 | context->header.destroy = destroy_context; |
470 | context->header.destroy = destroy_context; |
471 | context->mask = NULL; |
471 | context->mask = NULL; |
472 | context->seqno = 0; |
472 | context->seqno = 0; |
473 | context->slot = slot; |
473 | context->slot = slot; |
474 | 474 | ||
475 | context_map[slot] = context; |
475 | context_map[slot] = context; |
476 | }; |
476 | }; |
477 | return context; |
477 | return context; |
478 | 478 | ||
479 | err: |
479 | err: |
480 | __DestroyObject(context); |
480 | __DestroyObject(context); |
481 | return NULL; |
481 | return NULL; |
482 | };>>>> |
482 | };>>>> |