diff options
author | Felix Kuehling <Felix.Kuehling@amd.com> | 2018-02-06 20:32:39 -0500 |
---|---|---|
committer | Oded Gabbay <oded.gabbay@gmail.com> | 2018-02-06 20:32:39 -0500 |
commit | 4c660c8fbbf7b0d65a402f51e5f30a246cf3c44c (patch) | |
tree | 441252c68edab2ecff5ee27bceae0e2440edae1a /drivers | |
parent | a46a2cd103a863724d668c86dca86bd0d93a19e4 (diff) |
drm/amdgpu: Add submit IB function for KFD
This can be used for flushing caches when not using the HWS.
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 55 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 8 |
5 files changed, 69 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 5a881107a15a..8a23aa8f9c73 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |||
@@ -367,6 +367,61 @@ uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd) | |||
367 | return amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); | 367 | return amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); |
368 | } | 368 | } |
369 | 369 | ||
370 | int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, | ||
371 | uint32_t vmid, uint64_t gpu_addr, | ||
372 | uint32_t *ib_cmd, uint32_t ib_len) | ||
373 | { | ||
374 | struct amdgpu_device *adev = (struct amdgpu_device *)kgd; | ||
375 | struct amdgpu_job *job; | ||
376 | struct amdgpu_ib *ib; | ||
377 | struct amdgpu_ring *ring; | ||
378 | struct dma_fence *f = NULL; | ||
379 | int ret; | ||
380 | |||
381 | switch (engine) { | ||
382 | case KGD_ENGINE_MEC1: | ||
383 | ring = &adev->gfx.compute_ring[0]; | ||
384 | break; | ||
385 | case KGD_ENGINE_SDMA1: | ||
386 | ring = &adev->sdma.instance[0].ring; | ||
387 | break; | ||
388 | case KGD_ENGINE_SDMA2: | ||
389 | ring = &adev->sdma.instance[1].ring; | ||
390 | break; | ||
391 | default: | ||
392 | pr_err("Invalid engine in IB submission: %d\n", engine); | ||
393 | ret = -EINVAL; | ||
394 | goto err; | ||
395 | } | ||
396 | |||
397 | ret = amdgpu_job_alloc(adev, 1, &job, NULL); | ||
398 | if (ret) | ||
399 | goto err; | ||
400 | |||
401 | ib = &job->ibs[0]; | ||
402 | memset(ib, 0, sizeof(struct amdgpu_ib)); | ||
403 | |||
404 | ib->gpu_addr = gpu_addr; | ||
405 | ib->ptr = ib_cmd; | ||
406 | ib->length_dw = ib_len; | ||
407 | /* This works for NO_HWS. TODO: need to handle without knowing VMID */ | ||
408 | job->vmid = vmid; | ||
409 | |||
410 | ret = amdgpu_ib_schedule(ring, 1, ib, job, &f); | ||
411 | if (ret) { | ||
412 | DRM_ERROR("amdgpu: failed to schedule IB.\n"); | ||
413 | goto err_ib_sched; | ||
414 | } | ||
415 | |||
416 | ret = dma_fence_wait(f, false); | ||
417 | |||
418 | err_ib_sched: | ||
419 | dma_fence_put(f); | ||
420 | amdgpu_job_free(job); | ||
421 | err: | ||
422 | return ret; | ||
423 | } | ||
424 | |||
370 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) | 425 | bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) |
371 | { | 426 | { |
372 | if (adev->kfd) { | 427 | if (adev->kfd) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index 05a228d60241..d7509b706b26 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | |||
@@ -124,6 +124,10 @@ void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev); | |||
124 | void amdgpu_amdkfd_device_init(struct amdgpu_device *adev); | 124 | void amdgpu_amdkfd_device_init(struct amdgpu_device *adev); |
125 | void amdgpu_amdkfd_device_fini(struct amdgpu_device *adev); | 125 | void amdgpu_amdkfd_device_fini(struct amdgpu_device *adev); |
126 | 126 | ||
127 | int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, | ||
128 | uint32_t vmid, uint64_t gpu_addr, | ||
129 | uint32_t *ib_cmd, uint32_t ib_len); | ||
130 | |||
127 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void); | 131 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void); |
128 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void); | 132 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void); |
129 | 133 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c index 65783d1eddca..7485c376b90e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | |||
@@ -217,6 +217,7 @@ static const struct kfd2kgd_calls kfd2kgd = { | |||
217 | .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos, | 217 | .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos, |
218 | .invalidate_tlbs = invalidate_tlbs, | 218 | .invalidate_tlbs = invalidate_tlbs, |
219 | .invalidate_tlbs_vmid = invalidate_tlbs_vmid, | 219 | .invalidate_tlbs_vmid = invalidate_tlbs_vmid, |
220 | .submit_ib = amdgpu_amdkfd_submit_ib, | ||
220 | }; | 221 | }; |
221 | 222 | ||
222 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void) | 223 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c index 1b5bf1353f0c..7be453494423 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | |||
@@ -177,6 +177,7 @@ static const struct kfd2kgd_calls kfd2kgd = { | |||
177 | .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos, | 177 | .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos, |
178 | .invalidate_tlbs = invalidate_tlbs, | 178 | .invalidate_tlbs = invalidate_tlbs, |
179 | .invalidate_tlbs_vmid = invalidate_tlbs_vmid, | 179 | .invalidate_tlbs_vmid = invalidate_tlbs_vmid, |
180 | .submit_ib = amdgpu_amdkfd_submit_ib, | ||
180 | }; | 181 | }; |
181 | 182 | ||
182 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void) | 183 | struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void) |
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index 5984fec78be4..1e5c22ceb256 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h | |||
@@ -240,6 +240,10 @@ struct tile_config { | |||
240 | * | 240 | * |
241 | * @invalidate_tlbs_vmid: Invalidate TLBs for a specific VMID | 241 | * @invalidate_tlbs_vmid: Invalidate TLBs for a specific VMID |
242 | * | 242 | * |
243 | * @submit_ib: Submits an IB to the engine specified by inserting the | ||
244 | * IB to the corresponding ring (ring type). The IB is executed with the | ||
245 | * specified VMID in a user mode context. | ||
246 | * | ||
243 | * This structure contains function pointers to services that the kgd driver | 247 | * This structure contains function pointers to services that the kgd driver |
244 | * provides to amdkfd driver. | 248 | * provides to amdkfd driver. |
245 | * | 249 | * |
@@ -352,6 +356,10 @@ struct kfd2kgd_calls { | |||
352 | 356 | ||
353 | int (*invalidate_tlbs)(struct kgd_dev *kgd, uint16_t pasid); | 357 | int (*invalidate_tlbs)(struct kgd_dev *kgd, uint16_t pasid); |
354 | int (*invalidate_tlbs_vmid)(struct kgd_dev *kgd, uint16_t vmid); | 358 | int (*invalidate_tlbs_vmid)(struct kgd_dev *kgd, uint16_t vmid); |
359 | |||
360 | int (*submit_ib)(struct kgd_dev *kgd, enum kgd_engine_type engine, | ||
361 | uint32_t vmid, uint64_t gpu_addr, | ||
362 | uint32_t *ib_cmd, uint32_t ib_len); | ||
355 | }; | 363 | }; |
356 | 364 | ||
357 | /** | 365 | /** |