aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c48
-rw-r--r--include/uapi/drm/amdgpu_drm.h2
3 files changed, 48 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index c54f5b962b80..26f6028bb72b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -505,6 +505,7 @@ struct amdgpu_bo {
505 struct amdgpu_device *adev; 505 struct amdgpu_device *adev;
506 struct drm_gem_object gem_base; 506 struct drm_gem_object gem_base;
507 struct amdgpu_bo *parent; 507 struct amdgpu_bo *parent;
508 struct amdgpu_bo *shadow;
508 509
509 struct ttm_bo_kmap_obj dma_buf_vmap; 510 struct ttm_bo_kmap_obj dma_buf_vmap;
510 struct amdgpu_mn *mn; 511 struct amdgpu_mn *mn;
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)
diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
index a902a602490b..5aef0b71079b 100644
--- a/include/uapi/drm/amdgpu_drm.h
+++ b/include/uapi/drm/amdgpu_drm.h
@@ -79,6 +79,8 @@ extern "C" {
79#define AMDGPU_GEM_CREATE_CPU_GTT_USWC (1 << 2) 79#define AMDGPU_GEM_CREATE_CPU_GTT_USWC (1 << 2)
80/* Flag that the memory should be in VRAM and cleared */ 80/* Flag that the memory should be in VRAM and cleared */
81#define AMDGPU_GEM_CREATE_VRAM_CLEARED (1 << 3) 81#define AMDGPU_GEM_CREATE_VRAM_CLEARED (1 << 3)
82/* Flag that create shadow bo(GTT) while allocating vram bo */
83#define AMDGPU_GEM_CREATE_SHADOW (1 << 4)
82 84
83struct drm_amdgpu_gem_create_in { 85struct drm_amdgpu_gem_create_in {
84 /** the requested memory size */ 86 /** the requested memory size */