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 acquire necessary information from GSP, 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/pf.h | 11 +++++++++++ drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c | 8 ++++++++ drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h | 3 +++ 3 files changed, 22 insertions(+) diff --git a/drivers/vfio/pci/nvidia-vgpu/pf.h b/drivers/vfio/pci/nvidia-vgpu/pf.h index e8a11dd29427..044bc3aef5a6 100644 --- a/drivers/vfio/pci/nvidia-vgpu/pf.h +++ b/drivers/vfio/pci/nvidia-vgpu/pf.h @@ -62,4 +62,15 @@ static inline int nvidia_vgpu_mgr_init_handle(struct pci_dev *pdev, __m->handle.ops->get_total_fbmem_size(__m->handle.pf_drvdata); \ }) +#define nvidia_vgpu_mgr_alloc_gsp_client(m, c) ({ \ + typeof(m) __m = (m); \ + __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 3ef81b89c748..1455ca51eca1 100644 --- a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c +++ b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c @@ -16,6 +16,7 @@ static void vgpu_mgr_release(struct kref *kref) if (WARN_ON(atomic_read(&vgpu_mgr->num_vgpus))) return; + nvidia_vgpu_mgr_free_gsp_client(vgpu_mgr, &vgpu_mgr->gsp_client); kvfree(vgpu_mgr); } @@ -140,6 +141,11 @@ static int pf_attach_handle_fn(void *handle, struct nvidia_vgpu_vfio_handle_data if (ret) goto fail_setup_pf_driver_caps; + ret = nvidia_vgpu_mgr_alloc_gsp_client(vgpu_mgr, + &vgpu_mgr->gsp_client); + if (ret) + goto fail_alloc_gsp_client; + ret = init_vgpu_mgr(vgpu_mgr); if (ret) goto fail_init_vgpu_mgr; @@ -157,6 +163,8 @@ static int pf_attach_handle_fn(void *handle, struct nvidia_vgpu_vfio_handle_data fail_init_fn: detach_vgpu_mgr(handle_data); fail_init_vgpu_mgr: + nvidia_vgpu_mgr_free_gsp_client(vgpu_mgr, &vgpu_mgr->gsp_client); +fail_alloc_gsp_client: fail_setup_pf_driver_caps: kvfree(vgpu_mgr); return ret; diff --git a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h index 9fe25b2d8ec1..98dcbb682b92 100644 --- a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h +++ b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h @@ -51,6 +51,7 @@ struct nvidia_vgpu { * @vgpu_list_lock: lock to protect vGPU list * @vgpu_list_head: list head of vGPU list * @num_vgpus: number of vGPUs in the vGPU list + * @gsp_client: the GSP client */ struct nvidia_vgpu_mgr { struct kref refcount; @@ -64,6 +65,8 @@ struct nvidia_vgpu_mgr { struct mutex vgpu_list_lock; struct list_head vgpu_list_head; atomic_t num_vgpus; + + struct nvidia_vgpu_gsp_client gsp_client; }; #define nvidia_vgpu_mgr_for_each_vgpu(vgpu, vgpu_mgr) \ -- 2.34.1