diff options
author | Felix Kuehling <Felix.Kuehling@amd.com> | 2019-02-04 17:46:35 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-02-13 17:50:32 -0500 |
commit | e8e32426b1271d3387208c3a6eaf7c166bea9975 (patch) | |
tree | 3b5e4047acc9f3f7e679472f000e448deeb9c6e5 /drivers/gpu/drm/amd | |
parent | 2c11ee6ae5533821cf2c64972d6cb5aa4ab4a46e (diff) |
drm/amdgpu: Add helper to wait for BO fences using a sync object
Creates a temporary sync object to wait for the BO reservation. This
generalizes amdgpu_vm_wait_pd.
Signed-off-by: Felix Kuehling <Felix.Kuehling@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')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 30 |
3 files changed, 28 insertions, 27 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index fd9c4beeaaa4..ec9e45004bff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -1285,6 +1285,30 @@ void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence, | |||
1285 | } | 1285 | } |
1286 | 1286 | ||
1287 | /** | 1287 | /** |
1288 | * amdgpu_sync_wait_resv - Wait for BO reservation fences | ||
1289 | * | ||
1290 | * @bo: buffer object | ||
1291 | * @owner: fence owner | ||
1292 | * @intr: Whether the wait is interruptible | ||
1293 | * | ||
1294 | * Returns: | ||
1295 | * 0 on success, errno otherwise. | ||
1296 | */ | ||
1297 | int amdgpu_bo_sync_wait(struct amdgpu_bo *bo, void *owner, bool intr) | ||
1298 | { | ||
1299 | struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); | ||
1300 | struct amdgpu_sync sync; | ||
1301 | int r; | ||
1302 | |||
1303 | amdgpu_sync_create(&sync); | ||
1304 | amdgpu_sync_resv(adev, &sync, bo->tbo.resv, owner, false); | ||
1305 | r = amdgpu_sync_wait(&sync, intr); | ||
1306 | amdgpu_sync_free(&sync); | ||
1307 | |||
1308 | return r; | ||
1309 | } | ||
1310 | |||
1311 | /** | ||
1288 | * amdgpu_bo_gpu_offset - return GPU offset of bo | 1312 | * amdgpu_bo_gpu_offset - return GPU offset of bo |
1289 | * @bo: amdgpu object for which we query the offset | 1313 | * @bo: amdgpu object for which we query the offset |
1290 | * | 1314 | * |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h index 9291c2f837e9..220a6a7b1bc1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | |||
@@ -266,6 +266,7 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, | |||
266 | int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo); | 266 | int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo); |
267 | void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence, | 267 | void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence, |
268 | bool shared); | 268 | bool shared); |
269 | int amdgpu_bo_sync_wait(struct amdgpu_bo *bo, void *owner, bool intr); | ||
269 | u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo); | 270 | u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo); |
270 | int amdgpu_bo_validate(struct amdgpu_bo *bo); | 271 | int amdgpu_bo_validate(struct amdgpu_bo *bo); |
271 | int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, | 272 | int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 75481cf3348f..3f33286c3cd5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -1332,31 +1332,6 @@ static void amdgpu_vm_cpu_set_ptes(struct amdgpu_pte_update_params *params, | |||
1332 | } | 1332 | } |
1333 | } | 1333 | } |
1334 | 1334 | ||
1335 | |||
1336 | /** | ||
1337 | * amdgpu_vm_wait_pd - Wait for PT BOs to be free. | ||
1338 | * | ||
1339 | * @adev: amdgpu_device pointer | ||
1340 | * @vm: related vm | ||
1341 | * @owner: fence owner | ||
1342 | * | ||
1343 | * Returns: | ||
1344 | * 0 on success, errno otherwise. | ||
1345 | */ | ||
1346 | static int amdgpu_vm_wait_pd(struct amdgpu_device *adev, struct amdgpu_vm *vm, | ||
1347 | void *owner) | ||
1348 | { | ||
1349 | struct amdgpu_sync sync; | ||
1350 | int r; | ||
1351 | |||
1352 | amdgpu_sync_create(&sync); | ||
1353 | amdgpu_sync_resv(adev, &sync, vm->root.base.bo->tbo.resv, owner, false); | ||
1354 | r = amdgpu_sync_wait(&sync, true); | ||
1355 | amdgpu_sync_free(&sync); | ||
1356 | |||
1357 | return r; | ||
1358 | } | ||
1359 | |||
1360 | /** | 1335 | /** |
1361 | * amdgpu_vm_update_func - helper to call update function | 1336 | * amdgpu_vm_update_func - helper to call update function |
1362 | * | 1337 | * |
@@ -1451,7 +1426,8 @@ restart: | |||
1451 | params.adev = adev; | 1426 | params.adev = adev; |
1452 | 1427 | ||
1453 | if (vm->use_cpu_for_update) { | 1428 | if (vm->use_cpu_for_update) { |
1454 | r = amdgpu_vm_wait_pd(adev, vm, AMDGPU_FENCE_OWNER_VM); | 1429 | r = amdgpu_bo_sync_wait(vm->root.base.bo, |
1430 | AMDGPU_FENCE_OWNER_VM, true); | ||
1455 | if (unlikely(r)) | 1431 | if (unlikely(r)) |
1456 | return r; | 1432 | return r; |
1457 | 1433 | ||
@@ -1784,7 +1760,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, | |||
1784 | /* Wait for PT BOs to be idle. PTs share the same resv. object | 1760 | /* Wait for PT BOs to be idle. PTs share the same resv. object |
1785 | * as the root PD BO | 1761 | * as the root PD BO |
1786 | */ | 1762 | */ |
1787 | r = amdgpu_vm_wait_pd(adev, vm, owner); | 1763 | r = amdgpu_bo_sync_wait(vm->root.base.bo, owner, true); |
1788 | if (unlikely(r)) | 1764 | if (unlikely(r)) |
1789 | return r; | 1765 | return r; |
1790 | 1766 | ||