Commit be3800f5 authored by James Zhu's avatar James Zhu Committed by Alex Deucher

drm/amdgpu: find partition ID when open device

Find partition ID when open device from render device minor.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarJames Zhu <James.Zhu@amd.com>
Reviewed-and-tested-by: Philip Yang<Philip.Yang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2c1c7ba4
...@@ -467,6 +467,8 @@ struct amdgpu_fpriv { ...@@ -467,6 +467,8 @@ struct amdgpu_fpriv {
struct mutex bo_list_lock; struct mutex bo_list_lock;
struct idr bo_list_handles; struct idr bo_list_handles;
struct amdgpu_ctx_mgr ctx_mgr; 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); int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv);
......
...@@ -1223,6 +1223,10 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) ...@@ -1223,6 +1223,10 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
goto out_suspend; goto out_suspend;
} }
r = amdgpu_xcp_open_device(adev, fpriv, file_priv);
if (r)
return r;
pasid = amdgpu_pasid_alloc(16); pasid = amdgpu_pasid_alloc(16);
if (pasid < 0) { if (pasid < 0) {
dev_warn(adev->dev, "No more PASIDs available!"); dev_warn(adev->dev, "No more PASIDs available!");
......
...@@ -335,3 +335,32 @@ void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev) ...@@ -335,3 +335,32 @@ void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev)
drm_dev_unplug(adev->xcp_mgr->xcp[i].ddev); 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;
}
...@@ -119,6 +119,9 @@ int amdgpu_xcp_get_inst_details(struct amdgpu_xcp *xcp, ...@@ -119,6 +119,9 @@ int amdgpu_xcp_get_inst_details(struct amdgpu_xcp *xcp,
int amdgpu_xcp_dev_register(struct amdgpu_device *adev, int amdgpu_xcp_dev_register(struct amdgpu_device *adev,
const struct pci_device_id *ent); const struct pci_device_id *ent);
void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev); 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) static inline int amdgpu_xcp_get_num_xcp(struct amdgpu_xcp_mgr *xcp_mgr)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment