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