diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2016-07-26 02:13:21 -0400 |
---|---|---|
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: | |||
380 | return r; | 380 | return r; |
381 | } | 381 | } |
382 | 382 | ||
383 | static 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 | |||
383 | int amdgpu_bo_create(struct amdgpu_device *adev, | 414 | int 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 | ||
404 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) | 446 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) |