diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c')
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 135 | 
1 files changed, 28 insertions, 107 deletions
| diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c index e899a936a42a..b84ecc6d6611 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c @@ -92,6 +92,13 @@ static const struct ttm_place gmr_vram_placement_flags[] = {  	}  }; +static const struct ttm_place vmw_sys_placement_flags = { +	.fpfn = 0, +	.lpfn = 0, +	.mem_type = VMW_PL_SYSTEM, +	.flags = 0 +}; +  struct ttm_placement vmw_vram_gmr_placement = {  	.num_placement = 2,  	.placement = vram_gmr_placement_flags, @@ -113,28 +120,11 @@ struct ttm_placement vmw_sys_placement = {  	.busy_placement = &sys_placement_flags  }; -static const struct ttm_place evictable_placement_flags[] = { -	{ -		.fpfn = 0, -		.lpfn = 0, -		.mem_type = TTM_PL_SYSTEM, -		.flags = 0 -	}, { -		.fpfn = 0, -		.lpfn = 0, -		.mem_type = TTM_PL_VRAM, -		.flags = 0 -	}, { -		.fpfn = 0, -		.lpfn = 0, -		.mem_type = VMW_PL_GMR, -		.flags = 0 -	}, { -		.fpfn = 0, -		.lpfn = 0, -		.mem_type = VMW_PL_MOB, -		.flags = 0 -	} +struct ttm_placement vmw_pt_sys_placement = { +	.num_placement = 1, +	.placement = &vmw_sys_placement_flags, +	.num_busy_placement = 1, +	.busy_placement = &vmw_sys_placement_flags  };  static const struct ttm_place nonfixed_placement_flags[] = { @@ -156,13 +146,6 @@ static const struct ttm_place nonfixed_placement_flags[] = {  	}  }; -struct ttm_placement vmw_evictable_placement = { -	.num_placement = 4, -	.placement = evictable_placement_flags, -	.num_busy_placement = 1, -	.busy_placement = &sys_placement_flags -}; -  struct ttm_placement vmw_srf_placement = {  	.num_placement = 1,  	.num_busy_placement = 2, @@ -184,19 +167,6 @@ struct ttm_placement vmw_nonfixed_placement = {  	.busy_placement = &sys_placement_flags  }; -struct vmw_ttm_tt { -	struct ttm_tt dma_ttm; -	struct vmw_private *dev_priv; -	int gmr_id; -	struct vmw_mob *mob; -	int mem_type; -	struct sg_table sgt; -	struct vmw_sg_table vsgt; -	uint64_t sg_alloc_size; -	bool mapped; -	bool bound; -}; -  const size_t vmw_tt_size = sizeof(struct vmw_ttm_tt);  /** @@ -317,17 +287,8 @@ static int vmw_ttm_map_for_dma(struct vmw_ttm_tt *vmw_tt)  static int vmw_ttm_map_dma(struct vmw_ttm_tt *vmw_tt)  {  	struct vmw_private *dev_priv = vmw_tt->dev_priv; -	struct ttm_mem_global *glob = vmw_mem_glob(dev_priv);  	struct vmw_sg_table *vsgt = &vmw_tt->vsgt; -	struct ttm_operation_ctx ctx = { -		.interruptible = true, -		.no_wait_gpu = false -	}; -	struct vmw_piter iter; -	dma_addr_t old;  	int ret = 0; -	static size_t sgl_size; -	static size_t sgt_size;  	if (vmw_tt->mapped)  		return 0; @@ -336,20 +297,12 @@ static int vmw_ttm_map_dma(struct vmw_ttm_tt *vmw_tt)  	vsgt->pages = vmw_tt->dma_ttm.pages;  	vsgt->num_pages = vmw_tt->dma_ttm.num_pages;  	vsgt->addrs = vmw_tt->dma_ttm.dma_address; -	vsgt->sgt = &vmw_tt->sgt; +	vsgt->sgt = NULL;  	switch (dev_priv->map_mode) {  	case vmw_dma_map_bind:  	case vmw_dma_map_populate: -		if (unlikely(!sgl_size)) { -			sgl_size = ttm_round_pot(sizeof(struct scatterlist)); -			sgt_size = ttm_round_pot(sizeof(struct sg_table)); -		} -		vmw_tt->sg_alloc_size = sgt_size + sgl_size * vsgt->num_pages; -		ret = ttm_mem_global_alloc(glob, vmw_tt->sg_alloc_size, &ctx); -		if (unlikely(ret != 0)) -			return ret; - +		vsgt->sgt = &vmw_tt->sgt;  		ret = sg_alloc_table_from_pages_segment(  			&vmw_tt->sgt, vsgt->pages, vsgt->num_pages, 0,  			(unsigned long)vsgt->num_pages << PAGE_SHIFT, @@ -357,15 +310,6 @@ static int vmw_ttm_map_dma(struct vmw_ttm_tt *vmw_tt)  		if (ret)  			goto out_sg_alloc_fail; -		if (vsgt->num_pages > vmw_tt->sgt.orig_nents) { -			uint64_t over_alloc = -				sgl_size * (vsgt->num_pages - -					    vmw_tt->sgt.orig_nents); - -			ttm_mem_global_free(glob, over_alloc); -			vmw_tt->sg_alloc_size -= over_alloc; -		} -  		ret = vmw_ttm_map_for_dma(vmw_tt);  		if (unlikely(ret != 0))  			goto out_map_fail; @@ -375,16 +319,6 @@ static int vmw_ttm_map_dma(struct vmw_ttm_tt *vmw_tt)  		break;  	} -	old = ~((dma_addr_t) 0); -	vmw_tt->vsgt.num_regions = 0; -	for (vmw_piter_start(&iter, vsgt, 0); vmw_piter_next(&iter);) { -		dma_addr_t cur = vmw_piter_dma_addr(&iter); - -		if (cur != old + PAGE_SIZE) -			vmw_tt->vsgt.num_regions++; -		old = cur; -	} -  	vmw_tt->mapped = true;  	return 0; @@ -392,7 +326,6 @@ out_map_fail:  	sg_free_table(vmw_tt->vsgt.sgt);  	vmw_tt->vsgt.sgt = NULL;  out_sg_alloc_fail: -	ttm_mem_global_free(glob, vmw_tt->sg_alloc_size);  	return ret;  } @@ -418,8 +351,6 @@ static void vmw_ttm_unmap_dma(struct vmw_ttm_tt *vmw_tt)  		vmw_ttm_unmap_from_dma(vmw_tt);  		sg_free_table(vmw_tt->vsgt.sgt);  		vmw_tt->vsgt.sgt = NULL; -		ttm_mem_global_free(vmw_mem_glob(dev_priv), -				    vmw_tt->sg_alloc_size);  		break;  	default:  		break; @@ -484,6 +415,9 @@ static int vmw_ttm_bind(struct ttm_device *bdev,  				    &vmw_be->vsgt, ttm->num_pages,  				    vmw_be->gmr_id);  		break; +	case VMW_PL_SYSTEM: +		/* Nothing to be done for a system bind */ +		break;  	default:  		BUG();  	} @@ -507,6 +441,8 @@ static void vmw_ttm_unbind(struct ttm_device *bdev,  	case VMW_PL_MOB:  		vmw_mob_unbind(vmw_be->dev_priv, vmw_be->mob);  		break; +	case VMW_PL_SYSTEM: +		break;  	default:  		BUG();  	} @@ -534,7 +470,6 @@ static void vmw_ttm_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)  static int vmw_ttm_populate(struct ttm_device *bdev,  			    struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)  { -	unsigned int i;  	int ret;  	/* TODO: maybe completely drop this ? */ @@ -542,22 +477,7 @@ static int vmw_ttm_populate(struct ttm_device *bdev,  		return 0;  	ret = ttm_pool_alloc(&bdev->pool, ttm, ctx); -	if (ret) -		return ret; - -	for (i = 0; i < ttm->num_pages; ++i) { -		ret = ttm_mem_global_alloc_page(&ttm_mem_glob, ttm->pages[i], -						PAGE_SIZE, ctx); -		if (ret) -			goto error; -	} -	return 0; -error: -	while (i--) -		ttm_mem_global_free_page(&ttm_mem_glob, ttm->pages[i], -					 PAGE_SIZE); -	ttm_pool_free(&bdev->pool, ttm);  	return ret;  } @@ -566,7 +486,6 @@ static void vmw_ttm_unpopulate(struct ttm_device *bdev,  {  	struct vmw_ttm_tt *vmw_tt = container_of(ttm, struct vmw_ttm_tt,  						 dma_ttm); -	unsigned int i;  	vmw_ttm_unbind(bdev, ttm); @@ -577,10 +496,6 @@ static void vmw_ttm_unpopulate(struct ttm_device *bdev,  	vmw_ttm_unmap_dma(vmw_tt); -	for (i = 0; i < ttm->num_pages; ++i) -		ttm_mem_global_free_page(&ttm_mem_glob, ttm->pages[i], -					 PAGE_SIZE); -  	ttm_pool_free(&bdev->pool, ttm);  } @@ -624,6 +539,7 @@ static int vmw_ttm_io_mem_reserve(struct ttm_device *bdev, struct ttm_resource *  	switch (mem->mem_type) {  	case TTM_PL_SYSTEM: +	case VMW_PL_SYSTEM:  	case VMW_PL_GMR:  	case VMW_PL_MOB:  		return 0; @@ -670,6 +586,11 @@ static void vmw_swap_notify(struct ttm_buffer_object *bo)  	(void) ttm_bo_wait(bo, false, false);  } +static bool vmw_memtype_is_system(uint32_t mem_type) +{ +	return mem_type == TTM_PL_SYSTEM || mem_type == VMW_PL_SYSTEM; +} +  static int vmw_move(struct ttm_buffer_object *bo,  		    bool evict,  		    struct ttm_operation_ctx *ctx, @@ -680,7 +601,7 @@ static int vmw_move(struct ttm_buffer_object *bo,  	struct ttm_resource_manager *new_man = ttm_manager_type(bo->bdev, new_mem->mem_type);  	int ret; -	if (new_man->use_tt && new_mem->mem_type != TTM_PL_SYSTEM) { +	if (new_man->use_tt && !vmw_memtype_is_system(new_mem->mem_type)) {  		ret = vmw_ttm_bind(bo->bdev, bo->ttm, new_mem);  		if (ret)  			return ret; @@ -689,7 +610,7 @@ static int vmw_move(struct ttm_buffer_object *bo,  	vmw_move_notify(bo, bo->resource, new_mem);  	if (old_man->use_tt && new_man->use_tt) { -		if (bo->resource->mem_type == TTM_PL_SYSTEM) { +		if (vmw_memtype_is_system(bo->resource->mem_type)) {  			ttm_bo_move_null(bo, new_mem);  			return 0;  		} @@ -736,7 +657,7 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,  	int ret;  	ret = vmw_bo_create_kernel(dev_priv, bo_size, -				   &vmw_sys_placement, +				   &vmw_pt_sys_placement,  				   &bo);  	if (unlikely(ret != 0))  		return ret; |