|
@@ -367,6 +367,61 @@ uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd)
|
|
return amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]);
|
|
return amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine,
|
|
|
|
+ uint32_t vmid, uint64_t gpu_addr,
|
|
|
|
+ uint32_t *ib_cmd, uint32_t ib_len)
|
|
|
|
+{
|
|
|
|
+ struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
|
|
|
|
+ struct amdgpu_job *job;
|
|
|
|
+ struct amdgpu_ib *ib;
|
|
|
|
+ struct amdgpu_ring *ring;
|
|
|
|
+ struct dma_fence *f = NULL;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ switch (engine) {
|
|
|
|
+ case KGD_ENGINE_MEC1:
|
|
|
|
+ ring = &adev->gfx.compute_ring[0];
|
|
|
|
+ break;
|
|
|
|
+ case KGD_ENGINE_SDMA1:
|
|
|
|
+ ring = &adev->sdma.instance[0].ring;
|
|
|
|
+ break;
|
|
|
|
+ case KGD_ENGINE_SDMA2:
|
|
|
|
+ ring = &adev->sdma.instance[1].ring;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ pr_err("Invalid engine in IB submission: %d\n", engine);
|
|
|
|
+ ret = -EINVAL;
|
|
|
|
+ goto err;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ret = amdgpu_job_alloc(adev, 1, &job, NULL);
|
|
|
|
+ if (ret)
|
|
|
|
+ goto err;
|
|
|
|
+
|
|
|
|
+ ib = &job->ibs[0];
|
|
|
|
+ memset(ib, 0, sizeof(struct amdgpu_ib));
|
|
|
|
+
|
|
|
|
+ ib->gpu_addr = gpu_addr;
|
|
|
|
+ ib->ptr = ib_cmd;
|
|
|
|
+ ib->length_dw = ib_len;
|
|
|
|
+ /* This works for NO_HWS. TODO: need to handle without knowing VMID */
|
|
|
|
+ job->vmid = vmid;
|
|
|
|
+
|
|
|
|
+ ret = amdgpu_ib_schedule(ring, 1, ib, job, &f);
|
|
|
|
+ if (ret) {
|
|
|
|
+ DRM_ERROR("amdgpu: failed to schedule IB.\n");
|
|
|
|
+ goto err_ib_sched;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ret = dma_fence_wait(f, false);
|
|
|
|
+
|
|
|
|
+err_ib_sched:
|
|
|
|
+ dma_fence_put(f);
|
|
|
|
+ amdgpu_job_free(job);
|
|
|
|
+err:
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid)
|
|
bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid)
|
|
{
|
|
{
|
|
if (adev->kfd) {
|
|
if (adev->kfd) {
|