diff options
| author | Chunming Zhou <David1.Zhou@amd.com> | 2016-07-26 14:13:21 +0800 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2016-08-16 10:40:01 -0400 | 
| commit | e7893c4bd34b9d2f942d77666656efaa084a3f87 (patch) | |
| tree | 526fb34d81ea8e1538bc65a8f2e259273c98e924 /drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |
| parent | f4a7f127d9151683ca806f1c73cfbc72f268d62e (diff) | |
drm/amdgpu: add shadow bo support V2
shadow bo is the shadow of a bo, which is always in GTT,
which can be used to backup the original bo.
V2:
reference shadow parent, shadow bo will be freed by who allocted him.
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 48 | 
1 files changed, 45 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index d8e69a7e51f9..278017d3dc3f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -380,6 +380,37 @@ fail_free:  	return r;  } +static int amdgpu_bo_create_shadow(struct amdgpu_device *adev, +				   unsigned long size, int byte_align, +				   struct amdgpu_bo *bo) +{ +	struct ttm_placement placement = {0}; +	struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; +	int r; + +	if (bo->shadow) +		return 0; + +	bo->flags |= AMDGPU_GEM_CREATE_SHADOW; +	memset(&placements, 0, +	       (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place)); + +	amdgpu_ttm_placement_init(adev, &placement, +				  placements, AMDGPU_GEM_DOMAIN_GTT, +				  AMDGPU_GEM_CREATE_CPU_GTT_USWC); + +	r = amdgpu_bo_create_restricted(adev, size, byte_align, true, +					AMDGPU_GEM_DOMAIN_GTT, +					AMDGPU_GEM_CREATE_CPU_GTT_USWC, +					NULL, &placement, +					bo->tbo.resv, +					&bo->shadow); +	if (!r) +		bo->shadow->parent = amdgpu_bo_ref(bo); + +	return r; +} +  int amdgpu_bo_create(struct amdgpu_device *adev,  		     unsigned long size, int byte_align,  		     bool kernel, u32 domain, u64 flags, @@ -389,6 +420,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  {  	struct ttm_placement placement = {0};  	struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; +	int r;  	memset(&placements, 0,  	       (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place)); @@ -396,9 +428,19 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	amdgpu_ttm_placement_init(adev, &placement,  				  placements, domain, flags); -	return amdgpu_bo_create_restricted(adev, size, byte_align, kernel, -					   domain, flags, sg, &placement, -					   resv, bo_ptr); +	r = amdgpu_bo_create_restricted(adev, size, byte_align, kernel, +					domain, flags, sg, &placement, +					resv, bo_ptr); +	if (r) +		return r; + +	if (flags & AMDGPU_GEM_CREATE_SHADOW) { +		r = amdgpu_bo_create_shadow(adev, size, byte_align, (*bo_ptr)); +		if (r) +			amdgpu_bo_unref(bo_ptr); +	} + +	return r;  }  int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)  | 
