[RFC 20/29] vfio/vgpu_mgr: allocate GSP RM client for NVIDIA vGPU manager

Zhi Wang
2024-09-22T12:50:56Z

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(+)

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