diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index b8b6c4a..4445364 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -27,7 +27,7 @@ /* * Authors: Thomas Hellstrom */ - +#include #include #include #include @@ -138,6 +138,9 @@ static void ttm_tt_free_page_directory(struct ttm_tt *ttm) static struct page *ttm_tt_alloc_page(unsigned page_flags) { gfp_t gfp_flags = GFP_USER; + void *addr; + dma_addr_t phys; + struct page *page; if (page_flags & TTM_PAGE_FLAG_ZERO_ALLOC) gfp_flags |= __GFP_ZERO; @@ -147,7 +150,24 @@ static struct page *ttm_tt_alloc_page(unsigned page_flags) else gfp_flags |= __GFP_HIGHMEM; - return alloc_page(gfp_flags); + addr = dma_alloc_coherent(NULL, PAGE_SIZE, &phys, gfp_flags); + BUG_ON(!addr); + page = virt_to_page(addr); + get_page(page); + return page; +} + +static void ttm_tt_free_page(struct page *page) +{ + void *addr; + + if (page == NULL) + return; + + put_page(page); + addr = page_address(page); + + dma_free_coherent(NULL, PAGE_SIZE, addr, virt_to_bus(addr)); } static void ttm_tt_free_user_pages(struct ttm_tt *ttm) @@ -180,7 +200,7 @@ static void ttm_tt_free_user_pages(struct ttm_tt *ttm) ttm->pages[i] = NULL; ttm_mem_global_free(ttm->bdev->mem_glob, PAGE_SIZE, false); - put_page(page); + ttm_tt_free_page(page); } ttm->state = tt_unpopulated; ttm->first_himem_page = ttm->num_pages; @@ -218,7 +238,7 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index) } return p; out_err: - put_page(p); + ttm_tt_free_page(p); return NULL; } diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index a68829d..e57e442 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -524,7 +524,7 @@ extern void ttm_tt_destroy(struct ttm_tt *ttm); extern void ttm_tt_unbind(struct ttm_tt *ttm); /** - * ttm_ttm_destroy: + * ttm_tt_get_page: * * @ttm: The struct ttm_tt. * @index: Index of the desired page.