Use shadow flag to judge which direction to sync. Change-Id: I9b540970d3a24c6aebeaa94c99f66a89134c663d Signed-off-by: Chunming Zhou <David1.Zhou at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 52 ++++++++++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 5 +++ 2 files changed, 57 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 278017d..bc99287 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -443,6 +443,58 @@ int amdgpu_bo_create(struct amdgpu_device *adev, return r; } +int amdgpu_bo_sync_between_bo_and_shadow(struct amdgpu_device *adev, + struct amdgpu_ring *ring, + struct amdgpu_bo *bo, + struct reservation_object *resv, + struct fence **fence) + +{ + struct amdgpu_bo *shadow = bo->shadow; + uint64_t bo_addr, shadow_addr; + int r; + + if (!shadow) + return -EINVAL; + + if (bo->backup_shadow & AMDGPU_BO_SHADOW_TO_NONE) { + DRM_INFO("No need to sync bo and shadow\n"); + return 0; + } + r = amdgpu_bo_pin(bo, bo->prefered_domains, &bo_addr); + if (r) { + DRM_ERROR("Failed to pin bo object\n"); + goto err1; + } + r = amdgpu_bo_pin(bo->shadow, bo->shadow->prefered_domains, &shadow_addr); + if (r) { + DRM_ERROR("Failed to pin bo shadow object\n"); + goto err2; + } + + r = reservation_object_reserve_shared(bo->tbo.resv); + if (r) + goto err3; + + if (bo->backup_shadow & AMDGPU_BO_SHADOW_TO_PARENT) + r = amdgpu_copy_buffer(ring, shadow_addr, bo_addr, + amdgpu_bo_size(bo), resv, fence); + else + r = amdgpu_copy_buffer(ring, bo_addr, shadow_addr, + amdgpu_bo_size(bo), resv, fence); + if (!r) { + amdgpu_bo_fence(bo, *fence, true); + bo->backup_shadow = AMDGPU_BO_SHADOW_TO_NONE; + } +err3: + amdgpu_bo_unpin(bo->shadow); +err2: + amdgpu_bo_unpin(bo); +err1: + + return r; +} + int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) { bool is_iomem; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h index d650b42..68578c4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h @@ -155,6 +155,11 @@ int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo); void amdgpu_bo_fence(struct amdgpu_bo *bo, struct fence *fence, bool shared); u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo); +int amdgpu_bo_sync_between_bo_and_shadow(struct amdgpu_device *adev, + struct amdgpu_ring *ring, + struct amdgpu_bo *bo, + struct reservation_object *resv, + struct fence **fence); /* * sub allocation -- 1.9.1