Rev 2361 | Rev 3037 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2340 | Serge | 1 | |
3033 | serge | 2 | #include |
3 | #include "i915_drv.h" |
||
2340 | Serge | 4 | #include "intel_drv.h" |
5 | #include "hmm.h" |
||
3033 | serge | 6 | #include "bitmap.h" |
2340 | Serge | 7 | |
8 | |||
3033 | serge | 9 | #define DRIVER_CAPS_1 0 |
10 | |||
2352 | Serge | 11 | |
3033 | serge | 12 | |
2352 | Serge | 13 | |
3033 | serge | 14 | |
2351 | Serge | 15 | |
16 | |||
17 | |||
18 | |||
3033 | serge | 19 | |
2342 | Serge | 20 | { |
21 | dma_addr_t *pages = bitmap->obj->allocated_pages;; |
||
3033 | serge | 22 | int i; |
23 | |||
24 | |||
2344 | Serge | 25 | free_handle(&bm_mm, bitmap->handle); |
3033 | serge | 26 | bitmap->handle = 0; |
2344 | Serge | 27 | bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT; |
2351 | Serge | 28 | bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
29 | |||
30 | |||
31 | drm_gem_object_unreference(&bitmap->obj->base); |
||
2344 | Serge | 32 | mutex_unlock(&main_device->struct_mutex); |
2351 | Serge | 33 | |
34 | |||
3033 | serge | 35 | { |
36 | for (i = 0; i < bitmap->page_count; i++) |
||
37 | FreePage(pages[i]); |
||
38 | |||
39 | |||
40 | }; |
||
41 | UserFree(bitmap->uaddr); |
||
42 | __DestroyObject(bitmap); |
||
2342 | Serge | 43 | }; |
44 | |||
45 | |||
3033 | serge | 46 | |
47 | { |
||
2340 | Serge | 48 | int page_count; |
3033 | serge | 49 | |
2340 | Serge | 50 | |
3033 | serge | 51 | * at this point until we release them. |
52 | */ |
||
53 | page_count = obj->base.size / PAGE_SIZE; |
||
54 | BUG_ON(obj->allocated_pages == NULL); |
||
55 | BUG_ON(obj->pages.page != NULL); |
||
56 | |||
2340 | Serge | 57 | |
3033 | serge | 58 | obj->pages.nents = page_count; |
59 | |||
60 | |||
61 | |||
62 | // i915_gem_object_do_bit_17_swizzle(obj); |
||
63 | |||
64 | |||
65 | } |
||
66 | |||
67 | |||
68 | { |
||
69 | int ret, i; |
||
70 | |||
71 | |||
72 | |||
73 | |||
74 | if (ret) { |
||
75 | /* In the event of a disaster, abandon all caches and |
||
76 | * hope for the best. |
||
77 | */ |
||
78 | WARN_ON(ret != -EIO); |
||
79 | i915_gem_clflush_object(obj); |
||
80 | obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU; |
||
81 | } |
||
82 | |||
83 | |||
84 | obj->dirty = 0; |
||
85 | |||
86 | |||
87 | } |
||
88 | |||
89 | |||
90 | .get_pages = bitmap_get_pages_gtt, |
||
91 | .put_pages = bitmap_put_pages_gtt, |
||
92 | }; |
||
2340 | Serge | 93 | |
94 | |||
95 | |||
3033 | serge | 96 | |
97 | struct io_call_10 /* SRV_CREATE_SURFACE */ |
||
98 | { |
||
2340 | Serge | 99 | u32 handle; // ignored |
3033 | serge | 100 | void *data; // ignored |
101 | |||
102 | |||
103 | u32 height; |
||
104 | u32 pitch; // ignored |
||
105 | |||
106 | |||
107 | u32 max_height; |
||
108 | u32 format; // reserved mbz |
||
109 | }; |
||
110 | |||
111 | |||
112 | |||
113 | |||
114 | { |
||
115 | struct drm_i915_gem_object *obj; |
||
2340 | Serge | 116 | |
117 | |||
118 | u32 handle; |
||
119 | u32 width, max_width; |
||
2344 | Serge | 120 | u32 height, max_height; |
121 | u32 size, max_size; |
||
122 | u32 pitch, max_pitch; |
||
123 | void *uaddr; |
||
2340 | Serge | 124 | dma_addr_t *pages; |
3033 | serge | 125 | u32 page_count; |
126 | |||
2340 | Serge | 127 | |
3033 | serge | 128 | |
129 | |||
2340 | Serge | 130 | |
131 | |||
132 | pbitmap->data = (void*)-1; |
||
2344 | Serge | 133 | |
2340 | Serge | 134 | |
2344 | Serge | 135 | height = pbitmap->height; |
2342 | Serge | 136 | |
137 | |||
3033 | serge | 138 | goto err1; |
2340 | Serge | 139 | |
140 | |||
3033 | serge | 141 | if( ((pbitmap->max_width !=0 ) && |
2344 | Serge | 142 | (pbitmap->max_width < width)) || |
143 | (pbitmap->max_width > 4096) ) |
||
144 | goto err1; |
||
145 | |||
146 | |||
147 | (pbitmap->max_height < width)) || |
||
148 | (pbitmap->max_height > 4096) ) |
||
149 | goto err1; |
||
150 | |||
151 | |||
152 | goto err1; |
||
153 | */ |
||
154 | |||
155 | |||
156 | max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height; |
||
157 | |||
158 | |||
3033 | serge | 159 | // printf("%s %d\n",__FUNCTION__, handle); |
2342 | Serge | 160 | |
2340 | Serge | 161 | |
162 | goto err1; |
||
163 | |||
164 | |||
165 | // printf("bitmap %x\n", bitmap); |
||
2361 | Serge | 166 | if( bitmap == NULL) |
167 | goto err2; |
||
3033 | serge | 168 | |
2361 | Serge | 169 | |
2342 | Serge | 170 | bitmap->header.destroy = destroy_bitmap; |
171 | bitmap->obj = NULL; |
||
172 | |||
173 | |||
3033 | serge | 174 | |
2340 | Serge | 175 | |
176 | size = roundup(pitch*height, PAGE_SIZE); |
||
177 | |||
2344 | Serge | 178 | |
2342 | Serge | 179 | |
2340 | Serge | 180 | |
2344 | Serge | 181 | max_size = roundup(max_pitch*max_height, PAGE_SIZE); |
182 | |||
183 | |||
3033 | serge | 184 | |
185 | |||
2344 | Serge | 186 | if( uaddr == NULL) |
2340 | Serge | 187 | goto err3; |
3033 | serge | 188 | else |
2340 | Serge | 189 | { |
190 | u32 max_count; |
||
3033 | serge | 191 | dma_addr_t page; |
192 | char *vaddr = uaddr; |
||
193 | |||
2340 | Serge | 194 | |
3033 | serge | 195 | max_count = max_size/PAGE_SIZE; |
196 | |||
2340 | Serge | 197 | |
3033 | serge | 198 | if( pages == NULL) |
199 | goto err4; |
||
200 | |||
2340 | Serge | 201 | |
3033 | serge | 202 | { |
2340 | Serge | 203 | page = AllocPage(); |
3033 | serge | 204 | if ( page == 0 ) |
205 | goto err4; |
||
206 | pages[i] = page; |
||
207 | |||
208 | |||
209 | }; |
||
2340 | Serge | 210 | bitmap->page_count = page_count; |
3033 | serge | 211 | bitmap->max_count = max_count; |
212 | }; |
||
213 | |||
2340 | Serge | 214 | |
3033 | serge | 215 | if (obj == NULL) |
216 | goto err4; |
||
217 | |||
218 | |||
219 | obj->allocated_pages = pages; |
||
220 | |||
221 | |||
222 | if (ret) |
||
223 | goto err5; |
||
224 | |||
225 | |||
2351 | Serge | 226 | |
227 | |||
2340 | Serge | 228 | bitmap->uaddr = uaddr; |
2344 | Serge | 229 | bitmap->pitch = pitch; |
230 | bitmap->gaddr = obj->gtt_offset; |
||
231 | |||
232 | |||
2340 | Serge | 233 | bitmap->height = height; |
234 | bitmap->max_width = max_width; |
||
2344 | Serge | 235 | bitmap->max_height = max_height; |
236 | |||
237 | |||
2340 | Serge | 238 | bitmap->header.destroy = destroy_bitmap; |
2342 | Serge | 239 | |
2340 | Serge | 240 | |
241 | pbitmap->data = uaddr; |
||
242 | pbitmap->pitch = pitch; |
||
2344 | Serge | 243 | |
2342 | Serge | 244 | |
245 | |||
2344 | Serge | 246 | __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr); |
247 | |||
248 | |||
2340 | Serge | 249 | |
250 | |||
3033 | serge | 251 | mutex_lock(&dev->struct_mutex); |
252 | drm_gem_object_unreference(&obj->base); |
||
253 | mutex_unlock(&dev->struct_mutex); |
||
254 | |||
255 | |||
2340 | Serge | 256 | while (i--) |
3033 | serge | 257 | FreePage(pages[i]); |
258 | free(pages); |
||
259 | UserFree(uaddr); |
||
260 | |||
261 | |||
2340 | Serge | 262 | __DestroyObject(bitmap); |
3033 | serge | 263 | err2: |
2340 | Serge | 264 | free_handle(&bm_mm, handle); |
3033 | serge | 265 | err1: |
2340 | Serge | 266 | return -1; |
267 | }; |
||
268 | |||
269 | |||
270 | |||
2352 | Serge | 271 | { |
272 | int ret; |
||
273 | |||
2344 | Serge | 274 | |
2352 | Serge | 275 | |
276 | |||
277 | return -1; |
||
278 | |||
279 | |||
3033 | serge | 280 | |
2352 | Serge | 281 | |
282 | return -1; |
||
283 | |||
284 | |||
3033 | serge | 285 | |
286 | |||
287 | { |
||
2352 | Serge | 288 | pbitmap->data = NULL; |
289 | pbitmap->pitch = 0; |
||
290 | |||
291 | |||
292 | return ret; |
||
293 | }; |
||
294 | |||
295 | |||
296 | pbitmap->pitch = bitmap->pitch; |
||
297 | |||
298 | |||
299 | }; |
||
300 | |||
301 | |||
2361 | Serge | 302 | |
2340 | Serge | 303 | |
304 | |||
3033 | serge | 305 | { |
306 | int ret; |
||
307 | |||
2340 | Serge | 308 | |
3033 | serge | 309 | |
2340 | Serge | 310 | |
3033 | serge | 311 | }; |
2340 | Serge | 312 | |
313 | |||
314 | |||
315 | |||
3033 | serge | 316 | { |
2340 | Serge | 317 | int ret = 0; |
3033 | serge | 318 | |
2340 | Serge | 319 | |
3033 | serge | 320 | { |
321 | case 0: |
||
322 | caps->opt[0] = DRIVER_CAPS_0; |
||
323 | caps->opt[1] = DRIVER_CAPS_1; |
||
324 | break; |
||
325 | |||
2340 | Serge | 326 | |
3033 | serge | 327 | caps->cap1.max_tex_width = 4096; |
328 | caps->cap1.max_tex_height = 4096; |
||
329 | break; |
||
330 | default: |
||
331 | ret = 1; |
||
332 | }; |
||
2340 | Serge | 333 | caps->idx = 1; |
3033 | serge | 334 | return ret; |
2340 | Serge | 335 | } |
3033 | serge | 336 | |
2340 | Serge | 337 | |
338 | |||
3033 | serge | 339 | { |
2351 | Serge | 340 | printf("destroy context %x\n", context); |
3033 | serge | 341 | |
2351 | Serge | 342 | |
3033 | serge | 343 | |
2351 | Serge | 344 | |
3033 | serge | 345 | drm_gem_object_unreference(&context->obj->base); |
346 | mutex_unlock(&main_device->struct_mutex); |
||
347 | |||
2351 | Serge | 348 | |
3033 | serge | 349 | }; |
350 | |||
2351 | Serge | 351 | |
352 | |||
3033 | serge | 353 | |
2351 | Serge | 354 | |
3033 | serge | 355 | { |
2351 | Serge | 356 | struct context *context; |
3033 | serge | 357 | struct io_call_10 io_10; |
358 | int slot = *((u8*)CURRENT_TASK); |
||
359 | int ret; |
||
2351 | Serge | 360 | |
361 | |||
3033 | serge | 362 | |
2351 | Serge | 363 | |
3033 | serge | 364 | return context; |
365 | |||
366 | |||
367 | printf("context %x\n", context); |
||
368 | if( context != NULL) |
||
369 | { |
||
2351 | Serge | 370 | drm_i915_private_t *dev_priv = dev->dev_private; |
3033 | serge | 371 | struct drm_i915_gem_object *obj; |
372 | |||
2351 | Serge | 373 | |
3033 | serge | 374 | i915_gem_object_pin(obj, 4096, true, true); |
375 | |||
2351 | Serge | 376 | |
3033 | serge | 377 | context->cmd_buffer = MapIoMem((addr_t)obj->pages.page[0], 4096, PG_SW|PG_NOCACHE); |
378 | context->cmd_offset = obj->gtt_offset; |
||
379 | |||
2351 | Serge | 380 | |
3033 | serge | 381 | context->mask = NULL; |
382 | context->seqno = 0; |
||
383 | context->slot = slot; |
||
384 | |||
2351 | Serge | 385 | |
3033 | serge | 386 | }; |
2351 | Serge | 387 | return context; |
3033 | serge | 388 | };>>>> |
389 |