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