Merge branch 'topic/cleanup' into for-linus
[pandora-kernel.git] / drivers / gpu / drm / ttm / ttm_tt.c
index 75dc8bd..b8b6c4a 100644 (file)
@@ -86,10 +86,16 @@ void ttm_tt_cache_flush(struct page *pages[], unsigned long num_pages)
        unsigned long i;
 
        for (i = 0; i < num_pages; ++i) {
-               if (pages[i]) {
-                       unsigned long start = (unsigned long)page_address(pages[i]);
-                       flush_dcache_range(start, start + PAGE_SIZE);
-               }
+               struct page *page = pages[i];
+               void *page_virtual;
+
+               if (unlikely(page == NULL))
+                       continue;
+
+               page_virtual = kmap_atomic(page, KM_USER0);
+               flush_dcache_range((unsigned long) page_virtual,
+                                  (unsigned long) page_virtual + PAGE_SIZE);
+               kunmap_atomic(page_virtual, KM_USER0);
        }
 #else
        if (on_each_cpu(ttm_tt_ipi_handler, NULL, 1) != 0)
@@ -131,10 +137,17 @@ 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;
+
        if (page_flags & TTM_PAGE_FLAG_ZERO_ALLOC)
-               return alloc_page(GFP_HIGHUSER | __GFP_ZERO);
+               gfp_flags |= __GFP_ZERO;
+
+       if (page_flags & TTM_PAGE_FLAG_DMA32)
+               gfp_flags |= __GFP_DMA32;
+       else
+               gfp_flags |= __GFP_HIGHMEM;
 
-       return alloc_page(GFP_HIGHUSER);
+       return alloc_page(gfp_flags);
 }
 
 static void ttm_tt_free_user_pages(struct ttm_tt *ttm)