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