Rev 3037 | Rev 3051 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3037 | Rev 3039 | ||
---|---|---|---|
Line 34... | Line 34... | ||
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 | ||
Line 38... | Line 38... | ||
38 | DRM_DEBUG("%s freec %d pages\n", __FUNCTION__, bitmap->page_count); |
38 | DRM_DEBUG("%s release %d pages\n", __FUNCTION__, bitmap->page_count); |
Line 39... | Line 39... | ||
39 | 39 | ||
40 | free(pages); |
40 | free(pages); |
41 | }; |
41 | }; |
42 | UserFree(bitmap->uaddr); |
42 | UserFree(bitmap->uaddr); |
Line 50... | Line 50... | ||
50 | 50 | ||
Line 51... | Line 51... | ||
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 | page_count = obj->base.size / PAGE_SIZE; |
55 | page_count = obj->base.size / PAGE_SIZE; |
55 | BUG_ON(obj->allocated_pages == NULL); |
56 | BUG_ON(obj->allocated_pages == NULL); |
56 | BUG_ON(obj->pages.page != NULL); |
57 | BUG_ON(obj->pages.page != NULL); |
Line 57... | Line 58... | ||
57 | 58 | ||
Line 303... | Line 304... | ||
303 | return 0; |
304 | return 0; |
304 | }; |
305 | }; |
Line -... | Line 306... | ||
- | 306 | ||
- | 307 | ||
- | 308 | int resize_surface(struct io_call_14 *pbitmap) |
|
- | 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 | ||
- | 318 | ||
- | 319 | if(unlikely(pbitmap->handle == 0)) |
|
- | 320 | return -1; |
|
- | 321 | ||
- | 322 | bitmap = (bitmap_t*)hmm_get_data(&bm_mm, pbitmap->handle); |
|
- | 323 | ||
- | 324 | if(unlikely(bitmap==NULL)) |
|
- | 325 | return -1; |
|
- | 326 | ||
- | 327 | if( pbitmap->new_width > bitmap->max_width || |
|
- | 328 | pbitmap->new_height > bitmap->max_height) |
|
- | 329 | return -1; |
|
- | 330 | ||
- | 331 | width = pbitmap->new_width; |
|
- | 332 | height = pbitmap->new_height; |
|
- | 333 | ||
- | 334 | pitch = ALIGN(width*4,64); |
|
- | 335 | size = roundup(pitch * height, PAGE_SIZE); |
|
- | 336 | page_count = size/PAGE_SIZE; |
|
- | 337 | ||
- | 338 | DRM_DEBUG("new width %d height %d pitch %d size %d\n", |
|
- | 339 | width, height, pitch, size); |
|
- | 340 | ||
- | 341 | if( page_count == bitmap->page_count ) |
|
- | 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 | pages = bitmap->obj->allocated_pages; |
|
- | 352 | ||
- | 353 | DRM_DEBUG("old pages %d new_pages %d vaddr %x\n", |
|
- | 354 | bitmap->page_count, page_count, vaddr); |
|
- | 355 | ||
- | 356 | for(i = bitmap->page_count; i < page_count; i++, vaddr+= PAGE_SIZE) |
|
- | 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 | DRM_DEBUG("%s alloc %d pages\n", __FUNCTION__, |
|
- | 366 | page_count - bitmap->page_count); |
|
- | 367 | ||
- | 368 | // mutex_lock(&main_device->struct_mutex); |
|
- | 369 | ||
- | 370 | i915_gem_object_unpin(bitmap->obj); |
|
- | 371 | i915_gem_object_unbind(bitmap->obj); |
|
- | 372 | bitmap->obj->base.size = size; |
|
- | 373 | bitmap->obj->pages.nents = page_count; |
|
- | 374 | ||
- | 375 | ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true); |
|
- | 376 | if (ret) |
|
- | 377 | goto err4; |
|
- | 378 | // mutex_unlock(&main_device->struct_mutex); |
|
- | 379 | ||
- | 380 | bitmap->page_count = page_count; |
|
- | 381 | bitmap->width = width; |
|
- | 382 | bitmap->height = height; |
|
- | 383 | bitmap->pitch = pitch; |
|
- | 384 | bitmap->gaddr = bitmap->obj->gtt_offset; |
|
- | 385 | }; |
|
- | 386 | ||
- | 387 | if(ret != 0 ) |
|
- | 388 | { |
|
- | 389 | pbitmap->data = NULL; |
|
- | 390 | pbitmap->pitch = 0; |
|
- | 391 | ||
- | 392 | dbgprintf("%s fail\n", __FUNCTION__); |
|
- | 393 | return ret; |
|
- | 394 | }; |
|
- | 395 | ||
- | 396 | pbitmap->data = bitmap->uaddr; |
|
- | 397 | pbitmap->pitch = bitmap->pitch; |
|
- | 398 | ||
- | 399 | return 0; |
|
- | 400 | ||
- | 401 | err4: |
|
- | 402 | while (i-- > bitmap->page_count) |
|
- | 403 | FreePage(pages[i]); |
|
- | 404 | ||
Line 305... | Line 405... | ||
305 | 405 | return -1; |
|
306 | 406 | }; |
|
307 | 407 |