aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFelix Kuehling <Felix.Kuehling@amd.com>2018-02-06 20:32:39 -0500
committerOded Gabbay <oded.gabbay@gmail.com>2018-02-06 20:32:39 -0500
commit4c660c8fbbf7b0d65a402f51e5f30a246cf3c44c (patch)
tree441252c68edab2ecff5ee27bceae0e2440edae1a /drivers
parenta46a2cd103a863724d668c86dca86bd0d93a19e4 (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.c55
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c1
-rw-r--r--drivers/gpu/drm/amd/include/kgd_kfd_interface.h8
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
370int 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
418err_ib_sched:
419 dma_fence_put(f);
420 amdgpu_job_free(job);
421err:
422 return ret;
423}
424
370bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid) 425bool 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);
124void amdgpu_amdkfd_device_init(struct amdgpu_device *adev); 124void amdgpu_amdkfd_device_init(struct amdgpu_device *adev);
125void amdgpu_amdkfd_device_fini(struct amdgpu_device *adev); 125void amdgpu_amdkfd_device_fini(struct amdgpu_device *adev);
126 126
127int 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
127struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void); 131struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void);
128struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void); 132struct 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
222struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void) 223struct 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
182struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void) 183struct 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/**