A GSP RM client is required when talking to the GSP firmware via GSP RM controls. In order to create vGPUs, NVIDIA vGPU manager requires a GSP RM client to upload vGPU types to GSP. Allocate a dedicated GSP RM client for NVIDIA vGPU manager. Signed-off-by: Zhi Wang <zhiw@xxxxxxxxxx> --- drivers/vfio/pci/nvidia-vgpu/nvkm.h | 9 +++++++++ drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c | 8 ++++++++ drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h | 2 ++ 3 files changed, 19 insertions(+) diff --git a/drivers/vfio/pci/nvidia-vgpu/nvkm.h b/drivers/vfio/pci/nvidia-vgpu/nvkm.h index 4c75431ee1f6..939f3b420bb3 100644 --- a/drivers/vfio/pci/nvidia-vgpu/nvkm.h +++ b/drivers/vfio/pci/nvidia-vgpu/nvkm.h @@ -43,4 +43,13 @@ static inline int nvidia_vgpu_mgr_get_handle(struct pci_dev *pdev, #define nvidia_vgpu_mgr_detach_handle(h) \ (h)->ops->detach_handle((h)->pf_drvdata) +#define nvidia_vgpu_mgr_alloc_gsp_client(m, c) \ + m->handle.ops->alloc_gsp_client(m->handle.pf_drvdata, c) + +#define nvidia_vgpu_mgr_free_gsp_client(m, c) \ + m->handle.ops->free_gsp_client(c) + +#define nvidia_vgpu_mgr_get_gsp_client_handle(m, c) \ + m->handle.ops->get_gsp_client_handle(c) + #endif diff --git a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c index dc2a73f95650..812b7be00bee 100644 --- a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c +++ b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c @@ -12,6 +12,7 @@ static void vgpu_mgr_release(struct kref *kref) struct nvidia_vgpu_mgr *vgpu_mgr = container_of(kref, struct nvidia_vgpu_mgr, refcount); + nvidia_vgpu_mgr_free_gsp_client(vgpu_mgr, &vgpu_mgr->gsp_client); nvidia_vgpu_mgr_detach_handle(&vgpu_mgr->handle); kvfree(vgpu_mgr); } @@ -82,9 +83,16 @@ struct nvidia_vgpu_mgr *nvidia_vgpu_mgr_get(struct pci_dev *dev) kref_init(&vgpu_mgr->refcount); mutex_init(&vgpu_mgr->vgpu_id_lock); + ret = nvidia_vgpu_mgr_alloc_gsp_client(vgpu_mgr, + &vgpu_mgr->gsp_client); + if (ret) + goto fail_alloc_gsp_client; + mutex_unlock(&vgpu_mgr_attach_lock); return vgpu_mgr; +fail_alloc_gsp_client: + nvidia_vgpu_mgr_detach_handle(&vgpu_mgr->handle); fail_attach_handle: kvfree(vgpu_mgr); fail_alloc_vgpu_mgr: diff --git a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h index 2efd96644098..f4416e6ed8f9 100644 --- a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h +++ b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h @@ -32,6 +32,8 @@ struct nvidia_vgpu_mgr { struct mutex vgpu_id_lock; struct nvidia_vgpu *vgpus[NVIDIA_MAX_VGPUS]; atomic_t num_vgpus; + + struct nvidia_vgpu_gsp_client gsp_client; }; struct nvidia_vgpu_mgr *nvidia_vgpu_mgr_get(struct pci_dev *dev); -- 2.34.1