aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
diff options
context:
space:
mode:
authorChunming Zhou <David1.Zhou@amd.com>2016-07-26 02:13:21 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-16 10:40:01 -0400
commite7893c4bd34b9d2f942d77666656efaa084a3f87 (patch)
tree526fb34d81ea8e1538bc65a8f2e259273c98e924 /drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
parentf4a7f127d9151683ca806f1c73cfbc72f268d62e (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.c48
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:
380 return r; 380 return r;
381} 381}
382 382
383static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
384 unsigned long size, int byte_align,
385 struct amdgpu_bo *bo)
386{
387 struct ttm_placement placement = {0};
388 struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1];
389 int r;
390
391 if (bo->shadow)
392 return 0;
393
394 bo->flags |= AMDGPU_GEM_CREATE_SHADOW;
395 memset(&placements, 0,
396 (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place));
397
398 amdgpu_ttm_placement_init(adev, &placement,
399 placements, AMDGPU_GEM_DOMAIN_GTT,
400 AMDGPU_GEM_CREATE_CPU_GTT_USWC);
401
402 r = amdgpu_bo_create_restricted(adev, size, byte_align, true,
403 AMDGPU_GEM_DOMAIN_GTT,
404 AMDGPU_GEM_CREATE_CPU_GTT_USWC,
405 NULL, &placement,
406 bo->tbo.resv,
407 &bo->shadow);
408 if (!r)
409 bo->shadow->parent = amdgpu_bo_ref(bo);
410
411 return r;
412}
413
383int amdgpu_bo_create(struct amdgpu_device *adev, 414int amdgpu_bo_create(struct amdgpu_device *adev,
384 unsigned long size, int byte_align, 415 unsigned long size, int byte_align,
385 bool kernel, u32 domain, u64 flags, 416 bool kernel, u32 domain, u64 flags,
@@ -389,6 +420,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
389{ 420{
390 struct ttm_placement placement = {0}; 421 struct ttm_placement placement = {0};
391 struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; 422 struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1];
423 int r;
392 424
393 memset(&placements, 0, 425 memset(&placements, 0,
394 (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place)); 426 (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place));
@@ -396,9 +428,19 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
396 amdgpu_ttm_placement_init(adev, &placement, 428 amdgpu_ttm_placement_init(adev, &placement,
397 placements, domain, flags); 429 placements, domain, flags);
398 430
399 return amdgpu_bo_create_restricted(adev, size, byte_align, kernel, 431 r = amdgpu_bo_create_restricted(adev, size, byte_align, kernel,
400 domain, flags, sg, &placement, 432 domain, flags, sg, &placement,
401 resv, bo_ptr); 433 resv, bo_ptr);
434 if (r)
435 return r;
436
437 if (flags & AMDGPU_GEM_CREATE_SHADOW) {
438 r = amdgpu_bo_create_shadow(adev, size, byte_align, (*bo_ptr));
439 if (r)
440 amdgpu_bo_unref(bo_ptr);
441 }
442
443 return r;
402} 444}
403 445
404int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) 446int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)