Register DRM file-private owned PASIDs in the RFC PASID fpriv lookup
table.
This establishes:
PASID -> amdgpu_fpriv
for DRM file-private PASIDs.
Registration is done after the eventfd and context managers are
initialized because future process-scoped event delivery is expected to
route through:
PASID -> fpriv -> eventfd_mgr
Cc: Alex Deucher <[email protected]>
Cc: Christian König <[email protected]>
Signed-off-by: Srinivasan Shanmugam <[email protected]>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 12 ++++++++
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 41 +++++++++++++++++++++++++
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 6 ++++
3 files changed, 59 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index cacdc99b3ad6..333d6b5239bc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -1542,6 +1542,16 @@ int amdgpu_driver_open_kms(struct drm_device *dev,
struct drm_file *file_priv)
amdgpu_evf_mgr_init(&fpriv->evf_mgr);
amdgpu_ctx_mgr_init(&fpriv->ctx_mgr, adev);
+ /*
+ * Publish PASID ownership only after fpriv-owned
+ * event state exists.
+ */
+ r = amdgpu_pasid_fpriv_register(adev,
+ fpriv->vm.pasid,
+ fpriv);
+ if (r)
+ goto error_vm;
+
file_priv->driver_priv = fpriv;
goto out_suspend;
@@ -1584,6 +1594,8 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
pm_runtime_get_sync(dev->dev);
+ amdgpu_pasid_fpriv_unregister(adev, fpriv->vm.pasid);
+
if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_UVD) != NULL)
amdgpu_uvd_free_handles(adev, file_priv);
if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCE) != NULL)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 3141ae1383b0..5f1b285b8445 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2892,6 +2892,47 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev)
amdgpu_pasid_mgr_cleanup();
}
+/**
+ * amdgpu_pasid_fpriv_register - register PASID ownership
+ * @adev: amdgpu device
+ * @pasid: PASID to register
+ * @fpriv: DRM file-private owner
+ *
+ * Register the DRM file-private owner associated with @pasid.
+ *
+ * This RFC mapping is intended for process-scoped event delivery
+ * paths such as EVENTFD and WAIT_EVENT.
+ *
+ * Returns:
+ * 0 on success, negative error code on failure.
+ */
+int amdgpu_pasid_fpriv_register(struct amdgpu_device *adev,
+ u32 pasid,
+ struct amdgpu_fpriv *fpriv)
+{
+ if (!pasid || !fpriv)
+ return -EINVAL;
+
+ return xa_insert(&adev->vm_manager.pasid_fprivs,
+ pasid, fpriv, GFP_KERNEL);
+}
+
+/**
+ * amdgpu_pasid_fpriv_unregister - unregister PASID ownership
+ * @adev: amdgpu device
+ * @pasid: PASID to unregister
+ *
+ * Remove the DRM file-private owner associated with @pasid.
+ */
+void amdgpu_pasid_fpriv_unregister(struct amdgpu_device *adev,
+ u32 pasid)
+{
+ if (!pasid)
+ return;
+
+ xa_erase(&adev->vm_manager.pasid_fprivs, pasid);
+}
+
/**
* amdgpu_vm_ioctl - Manages VMID reservation for vm hubs.
*
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index 5318e833bd97..333bf14cce6e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -513,6 +513,12 @@ extern const struct amdgpu_vm_update_funcs
amdgpu_vm_sdma_funcs;
void amdgpu_vm_manager_init(struct amdgpu_device *adev);
void amdgpu_vm_manager_fini(struct amdgpu_device *adev);
+int amdgpu_pasid_fpriv_register(struct amdgpu_device *adev,
+ u32 pasid,
+ struct amdgpu_fpriv *fpriv);
+void amdgpu_pasid_fpriv_unregister(struct amdgpu_device *adev,
+ u32 pasid);
+
long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout);
int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, int32_t
xcp_id, uint32_t pasid);
int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm);
--
2.34.1