drm/ttm: flip over the range manager to self allocated nodes
[linux-2.6-microblaze.git] / drivers / gpu / drm / ttm / ttm_resource.c
index 59e2b71..2a51ace 100644 (file)
 #include <drm/ttm/ttm_resource.h>
 #include <drm/ttm/ttm_bo_driver.h>
 
-int ttm_resource_alloc(struct ttm_buffer_object *bo,
-                      const struct ttm_place *place,
-                      struct ttm_resource *res)
+void ttm_resource_init(struct ttm_buffer_object *bo,
+                       const struct ttm_place *place,
+                       struct ttm_resource *res)
 {
-       struct ttm_resource_manager *man =
-               ttm_manager_type(bo->bdev, place->mem_type);
-
        res->mm_node = NULL;
        res->start = 0;
        res->num_pages = PFN_UP(bo->base.size);
@@ -41,18 +38,44 @@ int ttm_resource_alloc(struct ttm_buffer_object *bo,
        res->bus.offset = 0;
        res->bus.is_iomem = false;
        res->bus.caching = ttm_cached;
-
-       return man->func->alloc(man, bo, place, res);
 }
+EXPORT_SYMBOL(ttm_resource_init);
 
-void ttm_resource_free(struct ttm_buffer_object *bo, struct ttm_resource *res)
+int ttm_resource_alloc(struct ttm_buffer_object *bo,
+                      const struct ttm_place *place,
+                      struct ttm_resource **res_ptr)
 {
        struct ttm_resource_manager *man =
-               ttm_manager_type(bo->bdev, res->mem_type);
+               ttm_manager_type(bo->bdev, place->mem_type);
+       struct ttm_resource *res;
+       int r;
+
+       res = kmalloc(sizeof(*res), GFP_KERNEL);
+       if (!res)
+               return -ENOMEM;
+
+       ttm_resource_init(bo, place, res);
+       r = man->func->alloc(man, bo, place, res);
+       if (r) {
+               kfree(res);
+               return r;
+       }
 
-       man->func->free(man, res);
-       res->mm_node = NULL;
-       res->mem_type = TTM_PL_SYSTEM;
+       *res_ptr = res;
+       return 0;
+}
+
+void ttm_resource_free(struct ttm_buffer_object *bo, struct ttm_resource **res)
+{
+       struct ttm_resource_manager *man;
+
+       if (!*res)
+               return;
+
+       man = ttm_manager_type(bo->bdev, (*res)->mem_type);
+       man->func->free(man, *res);
+       kfree(*res);
+       *res = NULL;
 }
 EXPORT_SYMBOL(ttm_resource_free);