diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_object.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 63 | 
1 files changed, 42 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 6c717b257d6d..480c87d8edc5 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c @@ -46,16 +46,6 @@ static void radeon_bo_clear_surface_reg(struct radeon_bo *bo);   * function are calling it.   */ -static void radeon_bo_clear_va(struct radeon_bo *bo) -{ -	struct radeon_bo_va *bo_va, *tmp; - -	list_for_each_entry_safe(bo_va, tmp, &bo->va, bo_list) { -		/* remove from all vm address space */ -		radeon_vm_bo_rmv(bo->rdev, bo_va); -	} -} -  static void radeon_update_memory_usage(struct radeon_bo *bo,  				       unsigned mem_type, int sign)  { @@ -90,7 +80,7 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)  	list_del_init(&bo->list);  	mutex_unlock(&bo->rdev->gem.mutex);  	radeon_bo_clear_surface_reg(bo); -	radeon_bo_clear_va(bo); +	WARN_ON(!list_empty(&bo->va));  	drm_gem_object_release(&bo->gem_base);  	kfree(bo);  } @@ -114,15 +104,23 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)  		rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |  					TTM_PL_FLAG_VRAM;  	if (domain & RADEON_GEM_DOMAIN_GTT) { -		if (rbo->rdev->flags & RADEON_IS_AGP) { -			rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT; +		if (rbo->flags & RADEON_GEM_GTT_UC) { +			rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_TT; +		} else if ((rbo->flags & RADEON_GEM_GTT_WC) || +			   (rbo->rdev->flags & RADEON_IS_AGP)) { +			rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | +				TTM_PL_FLAG_TT;  		} else {  			rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;  		}  	}  	if (domain & RADEON_GEM_DOMAIN_CPU) { -		if (rbo->rdev->flags & RADEON_IS_AGP) { -			rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_SYSTEM; +		if (rbo->flags & RADEON_GEM_GTT_UC) { +			rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_SYSTEM; +		} else if ((rbo->flags & RADEON_GEM_GTT_WC) || +		    rbo->rdev->flags & RADEON_IS_AGP) { +			rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | +				TTM_PL_FLAG_SYSTEM;  		} else {  			rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM;  		} @@ -146,7 +144,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)  int radeon_bo_create(struct radeon_device *rdev,  		     unsigned long size, int byte_align, bool kernel, u32 domain, -		     struct sg_table *sg, struct radeon_bo **bo_ptr) +		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)  {  	struct radeon_bo *bo;  	enum ttm_bo_type type; @@ -183,6 +181,12 @@ int radeon_bo_create(struct radeon_device *rdev,  	bo->initial_domain = domain & (RADEON_GEM_DOMAIN_VRAM |  	                               RADEON_GEM_DOMAIN_GTT |  	                               RADEON_GEM_DOMAIN_CPU); + +	bo->flags = flags; +	/* PCI GART is always snooped */ +	if (!(rdev->flags & RADEON_IS_PCIE)) +		bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC); +  	radeon_ttm_placement_from_domain(bo, domain);  	/* Kernel allocation are uninterruptible */  	down_read(&rdev->pm.mclk_lock); @@ -232,6 +236,15 @@ void radeon_bo_kunmap(struct radeon_bo *bo)  	ttm_bo_kunmap(&bo->kmap);  } +struct radeon_bo *radeon_bo_ref(struct radeon_bo *bo) +{ +	if (bo == NULL) +		return NULL; + +	ttm_bo_reference(&bo->tbo); +	return bo; +} +  void radeon_bo_unref(struct radeon_bo **bo)  {  	struct ttm_buffer_object *tbo; @@ -241,9 +254,7 @@ void radeon_bo_unref(struct radeon_bo **bo)  		return;  	rdev = (*bo)->rdev;  	tbo = &((*bo)->tbo); -	down_read(&rdev->pm.mclk_lock);  	ttm_bo_unref(&tbo); -	up_read(&rdev->pm.mclk_lock);  	if (tbo == NULL)  		*bo = NULL;  } @@ -292,9 +303,13 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,  		bo->pin_count = 1;  		if (gpu_addr != NULL)  			*gpu_addr = radeon_bo_gpu_offset(bo); -	} -	if (unlikely(r != 0)) +		if (domain == RADEON_GEM_DOMAIN_VRAM) +			bo->rdev->vram_pin_size += radeon_bo_size(bo); +		else +			bo->rdev->gart_pin_size += radeon_bo_size(bo); +	} else {  		dev_err(bo->rdev->dev, "%p pin failed\n", bo); +	}  	return r;  } @@ -317,8 +332,14 @@ int radeon_bo_unpin(struct radeon_bo *bo)  	for (i = 0; i < bo->placement.num_placement; i++)  		bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;  	r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); -	if (unlikely(r != 0)) +	if (likely(r == 0)) { +		if (bo->tbo.mem.mem_type == TTM_PL_VRAM) +			bo->rdev->vram_pin_size -= radeon_bo_size(bo); +		else +			bo->rdev->gart_pin_size -= radeon_bo_size(bo); +	} else {  		dev_err(bo->rdev->dev, "%p validate failed for unpin\n", bo); +	}  	return r;  }  |