KFD also will access GPU registers when loading/unloading drivers, so can't hide the mailbox in mxgpu. Right now, can't find any way to put it into kfd interface, export it into amdgpu. Signed-off-by: Xiangliang Yu <Xiangliang.Yu at amd.com> Signed-off-by: shaoyunl <Shaoyun.Liu at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 4 ++++ drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 4 ++++ drivers/gpu/drm/amd/mxgpu/mxgpu_mb.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 3273d8c..1f152f2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -60,6 +60,8 @@ int amdgpu_driver_unload_kms(struct drm_device *dev) if (adev->rmmio == NULL) goto done_free; + amdgpu_get_gpu(adev); + if (amdgpu_device_is_px(dev)) { pm_runtime_get_sync(dev->dev); pm_runtime_forbid(dev->dev); @@ -139,6 +141,8 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags) pm_runtime_put_autosuspend(dev->dev); } + amdgpu_put_gpu(adev); + out: if (r) { /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h index d6f57a2..97aae31 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h @@ -71,4 +71,8 @@ int amdgpu_vm_map_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm); void amdgpu_vm_unmap_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm); void amdgpu_gfx_ring_emit_meta_data(struct amdgpu_ring *ring, struct amdgpu_vm *vm); + +/* get full gpu access */ +int amdgpu_get_gpu(struct amdgpu_device *adev); +int amdgpu_put_gpu(struct amdgpu_device *adev); #endif diff --git a/drivers/gpu/drm/amd/mxgpu/mxgpu_mb.c b/drivers/gpu/drm/amd/mxgpu/mxgpu_mb.c index b74b501..387246c 100644 --- a/drivers/gpu/drm/amd/mxgpu/mxgpu_mb.c +++ b/drivers/gpu/drm/amd/mxgpu/mxgpu_mb.c @@ -126,3 +126,31 @@ int xgpu_release_full_gpu_access(struct amdgpu_device *adev, bool init) return r; } + +int amdgpu_get_gpu(struct amdgpu_device *adev) +{ + int r = 0; + + if (!adev->priv_data) + return 0; + + r = xgpu_request_full_gpu_access(adev, false); + if (r) + return r; + + return 0; +} + +int amdgpu_put_gpu(struct amdgpu_device *adev) +{ + int r = 0; + + if (!adev->priv_data) + return 0; + + r = xgpu_release_full_gpu_access(adev, true); + if (r) + return r; + + return 0; +} -- 2.7.4