@@ -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
@@ -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:
@@ -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);
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@nvidia.com> --- 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(+)