drm/amdgpu: find partition ID when open device
authorJames Zhu <James.Zhu@amd.com>
Tue, 28 Feb 2023 19:16:38 +0000 (14:16 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:59:27 +0000 (09:59 -0400)
Find partition ID when open device from render device minor.

Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: James Zhu <James.Zhu@amd.com>
Reviewed-and-tested-by: Philip Yang<Philip.Yang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h

index eb2fb96..bba8cfe 100644 (file)
@@ -467,6 +467,8 @@ struct amdgpu_fpriv {
        struct mutex            bo_list_lock;
        struct idr              bo_list_handles;
        struct amdgpu_ctx_mgr   ctx_mgr;
+       /** GPU partition selection */
+       uint32_t                xcp_id;
 };
 
 int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv);
index 44997c7..8797185 100644 (file)
@@ -1223,6 +1223,10 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
                goto out_suspend;
        }
 
+       r = amdgpu_xcp_open_device(adev, fpriv, file_priv);
+       if (r)
+               return r;
+
        pasid = amdgpu_pasid_alloc(16);
        if (pasid < 0) {
                dev_warn(adev->dev, "No more PASIDs available!");
index 8b28b18..9b627a8 100644 (file)
@@ -335,3 +335,32 @@ void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev)
                drm_dev_unplug(adev->xcp_mgr->xcp[i].ddev);
 }
 
+int amdgpu_xcp_open_device(struct amdgpu_device *adev,
+                          struct amdgpu_fpriv *fpriv,
+                          struct drm_file *file_priv)
+{
+       int i;
+
+       if (!adev->xcp_mgr)
+               return 0;
+
+       fpriv->xcp_id = ~0;
+       for (i = 0; i < MAX_XCP; ++i) {
+               if (!adev->xcp_mgr->xcp[i].ddev)
+                       break;
+
+               if (file_priv->minor == adev->xcp_mgr->xcp[i].ddev->render) {
+                       if (adev->xcp_mgr->xcp[i].valid == FALSE) {
+                               dev_err(adev->dev, "renderD%d partition %d not valid!",
+                                               file_priv->minor->index, i);
+                               return -ENOENT;
+                       }
+                       dev_dbg(adev->dev, "renderD%d partition %d openned!",
+                                       file_priv->minor->index, i);
+                       fpriv->xcp_id = i;
+                       break;
+               }
+       }
+       return 0;
+}
+
index dad0b98..ad60520 100644 (file)
@@ -119,6 +119,9 @@ int amdgpu_xcp_get_inst_details(struct amdgpu_xcp *xcp,
 int amdgpu_xcp_dev_register(struct amdgpu_device *adev,
                                const struct pci_device_id *ent);
 void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev);
+int amdgpu_xcp_open_device(struct amdgpu_device *adev,
+                          struct amdgpu_fpriv *fpriv,
+                          struct drm_file *file_priv);
 
 static inline int amdgpu_xcp_get_num_xcp(struct amdgpu_xcp_mgr *xcp_mgr)
 {