The mgmt heap is a block of shared FB memory between the GSP firmware and the vGPU host. It is used for supporting vGPU RPCs, vGPU logging. To access the data structures of vGPU RPCs and vGPU logging, the mgmt heap FB memory needs to mapped into BAR1 and the region in the BAR1 is required to be mapped into CPU vaddr. Map the mgmt heap FB memory into BAR1 and map the related BAR1 region into CPU vaddr. Initialize the pointers to the mgmt heap FB memory. Signed-off-by: Zhi Wang <zhiw@xxxxxxxxxx> --- drivers/vfio/pci/nvidia-vgpu/pf.h | 6 ++++++ drivers/vfio/pci/nvidia-vgpu/vgpu.c | 23 ++++++++++++++++++++++ drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c | 26 +++++++++++++++++++++++++ drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h | 17 +++++++++++++++- 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/drivers/vfio/pci/nvidia-vgpu/pf.h b/drivers/vfio/pci/nvidia-vgpu/pf.h index ce2728ce969b..167296ba7e3d 100644 --- a/drivers/vfio/pci/nvidia-vgpu/pf.h +++ b/drivers/vfio/pci/nvidia-vgpu/pf.h @@ -103,4 +103,10 @@ static inline int nvidia_vgpu_mgr_init_handle(struct pci_dev *pdev, #define nvidia_vgpu_mgr_free_fbmem(m, h) \ ((m)->handle.ops->free_fbmem(h)) +#define nvidia_vgpu_mgr_bar1_map_mem(m, mem, info) \ + ((m)->handle.ops->bar1_map_mem(mem, info)) + +#define nvidia_vgpu_mgr_bar1_unmap_mem(m, mem) \ + ((m)->handle.ops->bar1_unmap_mem(mem)) + #endif diff --git a/drivers/vfio/pci/nvidia-vgpu/vgpu.c b/drivers/vfio/pci/nvidia-vgpu/vgpu.c index 53c2da0645b3..4c106a9803f6 100644 --- a/drivers/vfio/pci/nvidia-vgpu/vgpu.c +++ b/drivers/vfio/pci/nvidia-vgpu/vgpu.c @@ -177,10 +177,14 @@ static void clean_mgmt_heap(struct nvidia_vgpu *vgpu) struct nvidia_vgpu_mgr *vgpu_mgr = vgpu->vgpu_mgr; struct nvidia_vgpu_mgmt *mgmt = &vgpu->mgmt; + nvidia_vgpu_mgr_bar1_unmap_mem(vgpu_mgr, mgmt->heap_mem); + vgpu_debug(vgpu, "free mgmt heap, offset 0x%llx size 0x%llx\n", mgmt->heap_mem->addr, mgmt->heap_mem->size); nvidia_vgpu_mgr_free_fbmem(vgpu_mgr, mgmt->heap_mem); + mgmt->init_task_log_vaddr = mgmt->vgpu_task_log_vaddr = NULL; + mgmt->ctrl_vaddr = mgmt->kernel_log_vaddr = NULL; mgmt->heap_mem = NULL; } @@ -191,7 +195,9 @@ static int setup_mgmt_heap(struct nvidia_vgpu *vgpu) struct nvidia_vgpu_info *info = &vgpu->info; struct nvidia_vgpu_type *vgpu_type = info->vgpu_type; struct nvidia_vgpu_alloc_fbmem_info alloc_info = {0}; + struct nvidia_vgpu_map_mem_info map_info = {0}; struct nvidia_vgpu_mem *mem; + int ret; alloc_info.size = vgpu_type->gsp_heap_size; @@ -203,6 +209,23 @@ static int setup_mgmt_heap(struct nvidia_vgpu *vgpu) vgpu_debug(vgpu, "mgmt heap offset 0x%llx size 0x%llx\n", mem->addr, mem->size); + map_info.map_size = vgpu_mgr->comm_buff_size; + + ret = nvidia_vgpu_mgr_bar1_map_mem(vgpu_mgr, mem, &map_info); + if (ret) { + nvidia_vgpu_mgr_free_fbmem(vgpu_mgr, mem); + return ret; + } + + vgpu_debug(vgpu, "mgmt heap mapped\n"); + + mgmt->ctrl_vaddr = mem->bar1_vaddr; + mgmt->init_task_log_vaddr = mgmt->ctrl_vaddr + + vgpu_mgr->init_task_log_offset; + mgmt->vgpu_task_log_vaddr = mgmt->init_task_log_vaddr + + vgpu_mgr->init_task_log_size; + mgmt->kernel_log_vaddr = mgmt->vgpu_task_log_vaddr + + vgpu_mgr->vgpu_task_log_size; mgmt->heap_mem = mem; return 0; } diff --git a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c index e8b670308b21..cf5dd9a8e258 100644 --- a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c +++ b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.c @@ -154,6 +154,30 @@ static int setup_chid_alloc_bitmap(struct nvidia_vgpu_mgr *vgpu_mgr) return 0; } +static void init_gsp_rm_constraints(struct nvidia_vgpu_mgr *vgpu_mgr) +{ + vgpu_mgr->comm_buff_size = (3 * SZ_4K) + SZ_2M + SZ_4K + SZ_128K + SZ_256K + SZ_64K; + vgpu_mgr->init_task_log_offset = (3 * SZ_4K) + SZ_2M + SZ_4K; + vgpu_mgr->init_task_log_size = SZ_128K; + vgpu_mgr->vgpu_task_log_size = SZ_256K; + vgpu_mgr->kernel_log_size = SZ_64K; + + vgpu_mgr_debug(vgpu_mgr, "[GSP RM constraint] comm_buff_size 0x%llx\n", + vgpu_mgr->comm_buff_size); + + vgpu_mgr_debug(vgpu_mgr, "[GSP RM constraint] init_task_log_offset 0x%llx\n", + vgpu_mgr->init_task_log_offset); + + vgpu_mgr_debug(vgpu_mgr, "[GSP RM constraint] init_task_log size 0x%llx\n", + vgpu_mgr->init_task_log_size); + + vgpu_mgr_debug(vgpu_mgr, "[GSP RM constraint] vgpu_task_log size 0x%llx\n", + vgpu_mgr->vgpu_task_log_size); + + vgpu_mgr_debug(vgpu_mgr, "[GSP RM constraint] kernel_log size 0x%llx\n", + vgpu_mgr->kernel_log_size); +} + static int init_vgpu_mgr(struct nvidia_vgpu_mgr *vgpu_mgr) { int ret; @@ -178,6 +202,8 @@ static int init_vgpu_mgr(struct nvidia_vgpu_mgr *vgpu_mgr) vgpu_mgr_debug(vgpu_mgr, "[core driver] total fbmem size 0x%llx\n", vgpu_mgr->total_fbmem_size); + init_gsp_rm_constraints(vgpu_mgr); + return vgpu_mgr->use_chid_alloc_bitmap ? setup_chid_alloc_bitmap(vgpu_mgr) : 0; } diff --git a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h index facecd060856..9a3af35e5eee 100644 --- a/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h +++ b/drivers/vfio/pci/nvidia-vgpu/vgpu_mgr.h @@ -51,7 +51,10 @@ struct nvidia_vgpu_chid { struct nvidia_vgpu_mgmt { struct nvidia_vgpu_mem *heap_mem; - /* more to come */ + void __iomem *ctrl_vaddr; + void __iomem *init_task_log_vaddr; + void __iomem *vgpu_task_log_vaddr; + void __iomem *kernel_log_vaddr; }; /** @@ -91,6 +94,11 @@ struct nvidia_vgpu { * @total_fbmem_size: total FB memory size * @vmmu_segment_size: VMMU segment size * @ecc_enabled: ECC is enabled in the GPU + * @comm_buff_size: communication buffer size of mgmt heap + * @init_task_log_offset: offset of init task log in mgmt heap + * @init_task_log_size: size of init task size in mgmt heap + * @vgpu_task_log_size: size of vgpu task log size in mgmt heap + * @kernel_log_size: size of kernel log size in mgmt heap * @vgpu_major: vGPU major version * @vgpu_minor: vGPU minor version * @vgpu_list_lock: lock to protect vGPU list @@ -114,6 +122,13 @@ struct nvidia_vgpu_mgr { u64 vmmu_segment_size; bool ecc_enabled; + /* GSP RM constraints */ + u64 comm_buff_size; + u64 init_task_log_offset; + u64 init_task_log_size; + u64 vgpu_task_log_size; + u64 kernel_log_size; + u64 vgpu_major; u64 vgpu_minor; -- 2.34.1