We only use the "if (pool == NULL)" path for right now.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.w...@oracle.com>
---
 drivers/gpu/drm/ttm/ttm_page_alloc.c |   26 +++++++++++++++++++++++---
 1 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c 
b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 6859288..5d09677 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -683,14 +683,22 @@ int ttm_get_pages(struct list_head *pages, int flags,
                        gfp_flags |= GFP_HIGHUSER;
 
                for (r = 0; r < count; ++r) {
-                       p = alloc_page(gfp_flags);
+                       if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) {
+                               void *addr;
+                               addr = dma_alloc_coherent(NULL, PAGE_SIZE,
+                                                       &dma_address[r],
+                                                       gfp_flags);
+                               if (addr == NULL)
+                                       return -ENOMEM;
+                               p = virt_to_page(addr);
+                       } else
+                               p = alloc_page(gfp_flags);
                        if (!p) {
 
                                printk(KERN_ERR TTM_PFX
                                       "Unable to allocate page.");
                                return -ENOMEM;
                        }
-
                        list_add(&p->lru, pages);
                }
                return 0;
@@ -739,12 +747,24 @@ void ttm_put_pages(struct list_head *pages, unsigned 
page_count, int flags,
        unsigned long irq_flags;
        struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
        struct page *p, *tmp;
+       unsigned r;
 
        if (pool == NULL) {
                /* No pool for this memory type so free the pages */
 
+               r = page_count-1;
                list_for_each_entry_safe(p, tmp, pages, lru) {
-                       __free_page(p);
+                       if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) {
+                               void *addr = page_address(p);
+                               WARN_ON(!addr || !dma_address[r]);
+                               if (addr)
+                                       dma_free_coherent(NULL, PAGE_SIZE,
+                                                       addr,
+                                                       dma_address[r]);
+                               dma_address[r] = 0;
+                       } else
+                               __free_page(p);
+                       r--;
                }
                /* Make the pages list empty */
                INIT_LIST_HEAD(pages);
-- 
1.7.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to