mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
spapr: Remove support for NVIDIA V100 GPU with NVLink2
NVLink2 support was removed from the PPC PowerNV platform and VFIO in
Linux 5.13 with commits :
562d1e207d32 ("powerpc/powernv: remove the nvlink support")
b392a1989170 ("vfio/pci: remove vfio_pci_nvlink2")
This was 2.5 years ago. Do the same in QEMU with a revert of commit
ec132efaa8
("spapr: Support NVIDIA V100 GPU with NVLink2"). Some
adjustements are required on the NUMA part.
Cc: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
Message-ID: <20230918091717.149950-1-clg@kaod.org>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
527b238329
commit
44fa20c928
11 changed files with 14 additions and 708 deletions
|
@ -1610,121 +1610,6 @@ static int vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int vfio_pci_nvidia_v100_ram_init(VFIOPCIDevice *vdev, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
void *p;
|
||||
struct vfio_region_info *nv2reg = NULL;
|
||||
struct vfio_info_cap_header *hdr;
|
||||
struct vfio_region_info_cap_nvlink2_ssatgt *cap;
|
||||
VFIOQuirk *quirk;
|
||||
|
||||
ret = vfio_get_dev_region_info(&vdev->vbasedev,
|
||||
VFIO_REGION_TYPE_PCI_VENDOR_TYPE |
|
||||
PCI_VENDOR_ID_NVIDIA,
|
||||
VFIO_REGION_SUBTYPE_NVIDIA_NVLINK2_RAM,
|
||||
&nv2reg);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
hdr = vfio_get_region_info_cap(nv2reg, VFIO_REGION_INFO_CAP_NVLINK2_SSATGT);
|
||||
if (!hdr) {
|
||||
ret = -ENODEV;
|
||||
goto free_exit;
|
||||
}
|
||||
cap = (void *) hdr;
|
||||
|
||||
p = mmap(NULL, nv2reg->size, PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED, vdev->vbasedev.fd, nv2reg->offset);
|
||||
if (p == MAP_FAILED) {
|
||||
ret = -errno;
|
||||
goto free_exit;
|
||||
}
|
||||
|
||||
quirk = vfio_quirk_alloc(1);
|
||||
memory_region_init_ram_ptr(&quirk->mem[0], OBJECT(vdev), "nvlink2-mr",
|
||||
nv2reg->size, p);
|
||||
QLIST_INSERT_HEAD(&vdev->bars[0].quirks, quirk, next);
|
||||
|
||||
object_property_add_uint64_ptr(OBJECT(vdev), "nvlink2-tgt",
|
||||
(uint64_t *) &cap->tgt,
|
||||
OBJ_PROP_FLAG_READ);
|
||||
trace_vfio_pci_nvidia_gpu_setup_quirk(vdev->vbasedev.name, cap->tgt,
|
||||
nv2reg->size);
|
||||
free_exit:
|
||||
g_free(nv2reg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int vfio_pci_nvlink2_init(VFIOPCIDevice *vdev, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
void *p;
|
||||
struct vfio_region_info *atsdreg = NULL;
|
||||
struct vfio_info_cap_header *hdr;
|
||||
struct vfio_region_info_cap_nvlink2_ssatgt *captgt;
|
||||
struct vfio_region_info_cap_nvlink2_lnkspd *capspeed;
|
||||
VFIOQuirk *quirk;
|
||||
|
||||
ret = vfio_get_dev_region_info(&vdev->vbasedev,
|
||||
VFIO_REGION_TYPE_PCI_VENDOR_TYPE |
|
||||
PCI_VENDOR_ID_IBM,
|
||||
VFIO_REGION_SUBTYPE_IBM_NVLINK2_ATSD,
|
||||
&atsdreg);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
hdr = vfio_get_region_info_cap(atsdreg,
|
||||
VFIO_REGION_INFO_CAP_NVLINK2_SSATGT);
|
||||
if (!hdr) {
|
||||
ret = -ENODEV;
|
||||
goto free_exit;
|
||||
}
|
||||
captgt = (void *) hdr;
|
||||
|
||||
hdr = vfio_get_region_info_cap(atsdreg,
|
||||
VFIO_REGION_INFO_CAP_NVLINK2_LNKSPD);
|
||||
if (!hdr) {
|
||||
ret = -ENODEV;
|
||||
goto free_exit;
|
||||
}
|
||||
capspeed = (void *) hdr;
|
||||
|
||||
/* Some NVLink bridges may not have assigned ATSD */
|
||||
if (atsdreg->size) {
|
||||
p = mmap(NULL, atsdreg->size, PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED, vdev->vbasedev.fd, atsdreg->offset);
|
||||
if (p == MAP_FAILED) {
|
||||
ret = -errno;
|
||||
goto free_exit;
|
||||
}
|
||||
|
||||
quirk = vfio_quirk_alloc(1);
|
||||
memory_region_init_ram_device_ptr(&quirk->mem[0], OBJECT(vdev),
|
||||
"nvlink2-atsd-mr", atsdreg->size, p);
|
||||
QLIST_INSERT_HEAD(&vdev->bars[0].quirks, quirk, next);
|
||||
}
|
||||
|
||||
object_property_add_uint64_ptr(OBJECT(vdev), "nvlink2-tgt",
|
||||
(uint64_t *) &captgt->tgt,
|
||||
OBJ_PROP_FLAG_READ);
|
||||
trace_vfio_pci_nvlink2_setup_quirk_ssatgt(vdev->vbasedev.name, captgt->tgt,
|
||||
atsdreg->size);
|
||||
|
||||
object_property_add_uint32_ptr(OBJECT(vdev), "nvlink2-link-speed",
|
||||
&capspeed->link_speed,
|
||||
OBJ_PROP_FLAG_READ);
|
||||
trace_vfio_pci_nvlink2_setup_quirk_lnkspd(vdev->vbasedev.name,
|
||||
capspeed->link_speed);
|
||||
free_exit:
|
||||
g_free(atsdreg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* The VMD endpoint provides a real PCIe domain to the guest and the guest
|
||||
* kernel performs enumeration of the VMD sub-device domain. Guest transactions
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue