drm/ttm: introduce callback for ttm_tt populate & unpopulate V4
[linux-2.6.git] / drivers / gpu / drm / ttm / ttm_tt.c
index fbc90dc..77f0e6f 100644 (file)
@@ -43,8 +43,6 @@
 #include "ttm/ttm_placement.h"
 #include "ttm/ttm_page_alloc.h"
 
-static int ttm_tt_swapin(struct ttm_tt *ttm);
-
 /**
  * Allocates storage for pointers to the pages that back the ttm.
  */
@@ -63,69 +61,6 @@ static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
        ttm->dma_address = NULL;
 }
 
-static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
-{
-       struct page *p;
-       struct ttm_mem_global *mem_glob = ttm->glob->mem_glob;
-       int ret;
-
-       if (NULL == (p = ttm->pages[index])) {
-
-               ret = ttm_get_pages(&p, ttm->page_flags, ttm->caching_state, 1,
-                                   &ttm->dma_address[index]);
-               if (ret != 0)
-                       return NULL;
-
-               ret = ttm_mem_global_alloc_page(mem_glob, p, false, false);
-               if (unlikely(ret != 0))
-                       goto out_err;
-
-               ttm->pages[index] = p;
-       }
-       return p;
-out_err:
-       ttm_put_pages(&p, 1, ttm->page_flags,
-                     ttm->caching_state, &ttm->dma_address[index]);
-       return NULL;
-}
-
-struct page *ttm_tt_get_page(struct ttm_tt *ttm, int index)
-{
-       int ret;
-
-       if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) {
-               ret = ttm_tt_swapin(ttm);
-               if (unlikely(ret != 0))
-                       return NULL;
-       }
-       return __ttm_tt_get_page(ttm, index);
-}
-
-int ttm_tt_populate(struct ttm_tt *ttm)
-{
-       struct page *page;
-       unsigned long i;
-       int ret;
-
-       if (ttm->state != tt_unpopulated)
-               return 0;
-
-       if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) {
-               ret = ttm_tt_swapin(ttm);
-               if (unlikely(ret != 0))
-                       return ret;
-       }
-
-       for (i = 0; i < ttm->num_pages; ++i) {
-               page = __ttm_tt_get_page(ttm, i);
-               if (!page)
-                       return -ENOMEM;
-       }
-       ttm->state = tt_unbound;
-       return 0;
-}
-EXPORT_SYMBOL(ttm_tt_populate);
-
 #ifdef CONFIG_X86
 static inline int ttm_tt_set_page_caching(struct page *p,
                                          enum ttm_caching_state c_old,
@@ -227,21 +162,6 @@ int ttm_tt_set_placement_caching(struct ttm_tt *ttm, uint32_t placement)
 }
 EXPORT_SYMBOL(ttm_tt_set_placement_caching);
 
-static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
-{
-       unsigned i;
-
-       for (i = 0; i < ttm->num_pages; ++i) {
-               if (ttm->pages[i]) {
-                       ttm_mem_global_free_page(ttm->glob->mem_glob,
-                                                ttm->pages[i]);
-                       ttm_put_pages(&ttm->pages[i], 1, ttm->page_flags,
-                                     ttm->caching_state, &ttm->dma_address[i]);
-               }
-       }
-       ttm->state = tt_unpopulated;
-}
-
 void ttm_tt_destroy(struct ttm_tt *ttm)
 {
        if (unlikely(ttm == NULL))
@@ -252,7 +172,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
        }
 
        if (likely(ttm->pages != NULL)) {
-               ttm_tt_free_alloced_pages(ttm);
+               ttm->bdev->driver->ttm_tt_unpopulate(ttm);
                ttm_tt_free_page_directory(ttm);
        }
 
@@ -307,7 +227,7 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
        if (ttm->state == tt_bound)
                return 0;
 
-       ret = ttm_tt_populate(ttm);
+       ret = ttm->bdev->driver->ttm_tt_populate(ttm);
        if (ret)
                return ret;
 
@@ -321,7 +241,7 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
 }
 EXPORT_SYMBOL(ttm_tt_bind);
 
-static int ttm_tt_swapin(struct ttm_tt *ttm)
+int ttm_tt_swapin(struct ttm_tt *ttm)
 {
        struct address_space *swap_space;
        struct file *swap_storage;
@@ -343,7 +263,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
                        ret = PTR_ERR(from_page);
                        goto out_err;
                }
-               to_page = __ttm_tt_get_page(ttm, i);
+               to_page = ttm->pages[i];
                if (unlikely(to_page == NULL))
                        goto out_err;
 
@@ -364,7 +284,6 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
 
        return 0;
 out_err:
-       ttm_tt_free_alloced_pages(ttm);
        return ret;
 }
 
@@ -416,7 +335,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
                page_cache_release(to_page);
        }
 
-       ttm_tt_free_alloced_pages(ttm);
+       ttm->bdev->driver->ttm_tt_unpopulate(ttm);
        ttm->swap_storage = swap_storage;
        ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
        if (persistent_swap_storage)