diff options
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_agp_backend.c')
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_agp_backend.c | 115 | 
1 files changed, 58 insertions, 57 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c index f999e36f30b..764be36397f 100644 --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c @@ -29,10 +29,13 @@   *          Keith Packard.   */ -#include "ttm/ttm_module.h" -#include "ttm/ttm_bo_driver.h" +#define pr_fmt(fmt) "[TTM] " fmt + +#include <drm/ttm/ttm_module.h> +#include <drm/ttm/ttm_bo_driver.h> +#include <drm/ttm/ttm_page_alloc.h>  #ifdef TTM_HAS_AGP -#include "ttm/ttm_placement.h" +#include <drm/ttm/ttm_placement.h>  #include <linux/agp_backend.h>  #include <linux/module.h>  #include <linux/slab.h> @@ -40,99 +43,77 @@  #include <asm/agp.h>  struct ttm_agp_backend { -	struct ttm_backend backend; +	struct ttm_tt ttm;  	struct agp_memory *mem;  	struct agp_bridge_data *bridge;  }; -static int ttm_agp_populate(struct ttm_backend *backend, -			    unsigned long num_pages, struct page **pages, -			    struct page *dummy_read_page) +static int ttm_agp_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)  { -	struct ttm_agp_backend *agp_be = -	    container_of(backend, struct ttm_agp_backend, backend); -	struct page **cur_page, **last_page = pages + num_pages; +	struct ttm_agp_backend *agp_be = container_of(ttm, struct ttm_agp_backend, ttm); +	struct drm_mm_node *node = bo_mem->mm_node;  	struct agp_memory *mem; +	int ret, cached = (bo_mem->placement & TTM_PL_FLAG_CACHED); +	unsigned i; -	mem = agp_allocate_memory(agp_be->bridge, num_pages, AGP_USER_MEMORY); +	mem = agp_allocate_memory(agp_be->bridge, ttm->num_pages, AGP_USER_MEMORY);  	if (unlikely(mem == NULL))  		return -ENOMEM;  	mem->page_count = 0; -	for (cur_page = pages; cur_page < last_page; ++cur_page) { -		struct page *page = *cur_page; +	for (i = 0; i < ttm->num_pages; i++) { +		struct page *page = ttm->pages[i]; +  		if (!page) -			page = dummy_read_page; +			page = ttm->dummy_read_page;  		mem->pages[mem->page_count++] = page;  	}  	agp_be->mem = mem; -	return 0; -} - -static int ttm_agp_bind(struct ttm_backend *backend, struct ttm_mem_reg *bo_mem) -{ -	struct ttm_agp_backend *agp_be = -	    container_of(backend, struct ttm_agp_backend, backend); -	struct drm_mm_node *node = bo_mem->mm_node; -	struct agp_memory *mem = agp_be->mem; -	int cached = (bo_mem->placement & TTM_PL_FLAG_CACHED); -	int ret;  	mem->is_flushed = 1;  	mem->type = (cached) ? AGP_USER_CACHED_MEMORY : AGP_USER_MEMORY;  	ret = agp_bind_memory(mem, node->start);  	if (ret) -		printk(KERN_ERR TTM_PFX "AGP Bind memory failed.\n"); +		pr_err("AGP Bind memory failed\n");  	return ret;  } -static int ttm_agp_unbind(struct ttm_backend *backend) +static int ttm_agp_unbind(struct ttm_tt *ttm)  { -	struct ttm_agp_backend *agp_be = -	    container_of(backend, struct ttm_agp_backend, backend); - -	if (agp_be->mem->is_bound) -		return agp_unbind_memory(agp_be->mem); -	else -		return 0; -} +	struct ttm_agp_backend *agp_be = container_of(ttm, struct ttm_agp_backend, ttm); -static void ttm_agp_clear(struct ttm_backend *backend) -{ -	struct ttm_agp_backend *agp_be = -	    container_of(backend, struct ttm_agp_backend, backend); -	struct agp_memory *mem = agp_be->mem; - -	if (mem) { -		ttm_agp_unbind(backend); -		agp_free_memory(mem); +	if (agp_be->mem) { +		if (agp_be->mem->is_bound) +			return agp_unbind_memory(agp_be->mem); +		agp_free_memory(agp_be->mem); +		agp_be->mem = NULL;  	} -	agp_be->mem = NULL; +	return 0;  } -static void ttm_agp_destroy(struct ttm_backend *backend) +static void ttm_agp_destroy(struct ttm_tt *ttm)  { -	struct ttm_agp_backend *agp_be = -	    container_of(backend, struct ttm_agp_backend, backend); +	struct ttm_agp_backend *agp_be = container_of(ttm, struct ttm_agp_backend, ttm);  	if (agp_be->mem) -		ttm_agp_clear(backend); +		ttm_agp_unbind(ttm); +	ttm_tt_fini(ttm);  	kfree(agp_be);  }  static struct ttm_backend_func ttm_agp_func = { -	.populate = ttm_agp_populate, -	.clear = ttm_agp_clear,  	.bind = ttm_agp_bind,  	.unbind = ttm_agp_unbind,  	.destroy = ttm_agp_destroy,  }; -struct ttm_backend *ttm_agp_backend_init(struct ttm_bo_device *bdev, -					 struct agp_bridge_data *bridge) +struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev, +				 struct agp_bridge_data *bridge, +				 unsigned long size, uint32_t page_flags, +				 struct page *dummy_read_page)  {  	struct ttm_agp_backend *agp_be; @@ -142,10 +123,30 @@ struct ttm_backend *ttm_agp_backend_init(struct ttm_bo_device *bdev,  	agp_be->mem = NULL;  	agp_be->bridge = bridge; -	agp_be->backend.func = &ttm_agp_func; -	agp_be->backend.bdev = bdev; -	return &agp_be->backend; +	agp_be->ttm.func = &ttm_agp_func; + +	if (ttm_tt_init(&agp_be->ttm, bdev, size, page_flags, dummy_read_page)) { +		kfree(agp_be); +		return NULL; +	} + +	return &agp_be->ttm; +} +EXPORT_SYMBOL(ttm_agp_tt_create); + +int ttm_agp_tt_populate(struct ttm_tt *ttm) +{ +	if (ttm->state != tt_unpopulated) +		return 0; + +	return ttm_pool_populate(ttm); +} +EXPORT_SYMBOL(ttm_agp_tt_populate); + +void ttm_agp_tt_unpopulate(struct ttm_tt *ttm) +{ +	ttm_pool_unpopulate(ttm);  } -EXPORT_SYMBOL(ttm_agp_backend_init); +EXPORT_SYMBOL(ttm_agp_tt_unpopulate);  #endif  | 
