aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-03-13 05:13:39 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:54:01 -0400
commit80f95c579d800fa22e9e57ecb3d50b9e93bc1f82 (patch)
tree833a2a919c669f013318bf84397230f9553afe83 /drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
parentdc54d3d1744d23ed0b345fd8bc1c493b74e8df44 (diff)
drm/amdgpu: add a VM mapping replace operation v2
Add a new operation to replace mappings in a VM with a new one. v2: Fix Jerry's comment, separate out clear operation. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index b311b389bd5a..c71c087727b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -544,7 +544,8 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
544 if (r) 544 if (r)
545 goto error; 545 goto error;
546 546
547 if (operation == AMDGPU_VA_OP_MAP) 547 if (operation == AMDGPU_VA_OP_MAP ||
548 operation == AMDGPU_VA_OP_REPLACE)
548 r = amdgpu_vm_bo_update(adev, bo_va, false); 549 r = amdgpu_vm_bo_update(adev, bo_va, false);
549 550
550error: 551error:
@@ -595,6 +596,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
595 case AMDGPU_VA_OP_MAP: 596 case AMDGPU_VA_OP_MAP:
596 case AMDGPU_VA_OP_UNMAP: 597 case AMDGPU_VA_OP_UNMAP:
597 case AMDGPU_VA_OP_CLEAR: 598 case AMDGPU_VA_OP_CLEAR:
599 case AMDGPU_VA_OP_REPLACE:
598 break; 600 break;
599 default: 601 default:
600 dev_err(&dev->pdev->dev, "unsupported operation %d\n", 602 dev_err(&dev->pdev->dev, "unsupported operation %d\n",
@@ -656,6 +658,17 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
656 args->va_address, 658 args->va_address,
657 args->map_size); 659 args->map_size);
658 break; 660 break;
661 case AMDGPU_VA_OP_REPLACE:
662 r = amdgpu_vm_alloc_pts(adev, bo_va->vm, args->va_address,
663 args->map_size);
664 if (r)
665 goto error_backoff;
666
667 va_flags = amdgpu_vm_get_pte_flags(adev, args->flags);
668 r = amdgpu_vm_bo_replace_map(adev, bo_va, args->va_address,
669 args->offset_in_bo, args->map_size,
670 va_flags);
671 break;
659 default: 672 default:
660 break; 673 break;
661 } 674 }