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

Reply via email to