|
@@ -1536,7 +1536,7 @@ static bool is_valid_std_cap_offset(uint8_t pos)
|
|
pos <= (PCI_CFG_SPACE_SIZE - PCI_CAP_SIZEOF));
|
|
pos <= (PCI_CFG_SPACE_SIZE - PCI_CAP_SIZEOF));
|
|
}
|
|
}
|
|
|
|
|
|
-static int vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
|
|
|
|
+static bool vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
{
|
|
{
|
|
ERRP_GUARD();
|
|
ERRP_GUARD();
|
|
PCIDevice *pdev = &vdev->pdev;
|
|
PCIDevice *pdev = &vdev->pdev;
|
|
@@ -1545,18 +1545,18 @@ static int vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
uint8_t tmp;
|
|
uint8_t tmp;
|
|
|
|
|
|
if (vdev->nv_gpudirect_clique == 0xFF) {
|
|
if (vdev->nv_gpudirect_clique == 0xFF) {
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
if (!vfio_pci_is(vdev, PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID)) {
|
|
if (!vfio_pci_is(vdev, PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID)) {
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: invalid device vendor");
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: invalid device vendor");
|
|
- return -EINVAL;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
if (pci_get_byte(pdev->config + PCI_CLASS_DEVICE + 1) !=
|
|
if (pci_get_byte(pdev->config + PCI_CLASS_DEVICE + 1) !=
|
|
PCI_BASE_CLASS_DISPLAY) {
|
|
PCI_BASE_CLASS_DISPLAY) {
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: unsupported PCI class");
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: unsupported PCI class");
|
|
- return -EINVAL;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1572,7 +1572,7 @@ static int vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
vdev->config_offset + PCI_CAPABILITY_LIST);
|
|
vdev->config_offset + PCI_CAPABILITY_LIST);
|
|
if (ret != 1 || !is_valid_std_cap_offset(tmp)) {
|
|
if (ret != 1 || !is_valid_std_cap_offset(tmp)) {
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: error getting cap list");
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: error getting cap list");
|
|
- return -EINVAL;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
do {
|
|
do {
|
|
@@ -1590,13 +1590,13 @@ static int vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
pos = 0xD4;
|
|
pos = 0xD4;
|
|
} else {
|
|
} else {
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: invalid config space");
|
|
error_setg(errp, "NVIDIA GPUDirect Clique ID: invalid config space");
|
|
- return -EINVAL;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
ret = pci_add_capability(pdev, PCI_CAP_ID_VNDR, pos, 8, errp);
|
|
ret = pci_add_capability(pdev, PCI_CAP_ID_VNDR, pos, 8, errp);
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
error_prepend(errp, "Failed to add NVIDIA GPUDirect cap: ");
|
|
error_prepend(errp, "Failed to add NVIDIA GPUDirect cap: ");
|
|
- return ret;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
memset(vdev->emulated_config_bits + pos, 0xFF, 8);
|
|
memset(vdev->emulated_config_bits + pos, 0xFF, 8);
|
|
@@ -1608,7 +1608,7 @@ static int vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
pci_set_byte(pdev->config + pos++, vdev->nv_gpudirect_clique << 3);
|
|
pci_set_byte(pdev->config + pos++, vdev->nv_gpudirect_clique << 3);
|
|
pci_set_byte(pdev->config + pos, 0);
|
|
pci_set_byte(pdev->config + pos, 0);
|
|
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1629,7 +1629,7 @@ static int vfio_add_nv_gpudirect_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
*/
|
|
*/
|
|
#define VMD_SHADOW_CAP_VER 1
|
|
#define VMD_SHADOW_CAP_VER 1
|
|
#define VMD_SHADOW_CAP_LEN 24
|
|
#define VMD_SHADOW_CAP_LEN 24
|
|
-static int vfio_add_vmd_shadow_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
|
|
|
|
+static bool vfio_add_vmd_shadow_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
{
|
|
{
|
|
ERRP_GUARD();
|
|
ERRP_GUARD();
|
|
uint8_t membar_phys[16];
|
|
uint8_t membar_phys[16];
|
|
@@ -1639,7 +1639,7 @@ static int vfio_add_vmd_shadow_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, 0x467F) ||
|
|
vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, 0x467F) ||
|
|
vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, 0x4C3D) ||
|
|
vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, 0x4C3D) ||
|
|
vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, 0x9A0B))) {
|
|
vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, 0x9A0B))) {
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
ret = pread(vdev->vbasedev.fd, membar_phys, 16,
|
|
ret = pread(vdev->vbasedev.fd, membar_phys, 16,
|
|
@@ -1647,14 +1647,14 @@ static int vfio_add_vmd_shadow_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
if (ret != 16) {
|
|
if (ret != 16) {
|
|
error_report("VMD %s cannot read MEMBARs (%d)",
|
|
error_report("VMD %s cannot read MEMBARs (%d)",
|
|
vdev->vbasedev.name, ret);
|
|
vdev->vbasedev.name, ret);
|
|
- return -EFAULT;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
ret = pci_add_capability(&vdev->pdev, PCI_CAP_ID_VNDR, pos,
|
|
ret = pci_add_capability(&vdev->pdev, PCI_CAP_ID_VNDR, pos,
|
|
VMD_SHADOW_CAP_LEN, errp);
|
|
VMD_SHADOW_CAP_LEN, errp);
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
error_prepend(errp, "Failed to add VMD MEMBAR Shadow cap: ");
|
|
error_prepend(errp, "Failed to add VMD MEMBAR Shadow cap: ");
|
|
- return ret;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
memset(vdev->emulated_config_bits + pos, 0xFF, VMD_SHADOW_CAP_LEN);
|
|
memset(vdev->emulated_config_bits + pos, 0xFF, VMD_SHADOW_CAP_LEN);
|
|
@@ -1664,22 +1664,18 @@ static int vfio_add_vmd_shadow_cap(VFIOPCIDevice *vdev, Error **errp)
|
|
pci_set_long(vdev->pdev.config + pos, 0x53484457); /* SHDW */
|
|
pci_set_long(vdev->pdev.config + pos, 0x53484457); /* SHDW */
|
|
memcpy(vdev->pdev.config + pos + 4, membar_phys, 16);
|
|
memcpy(vdev->pdev.config + pos + 4, membar_phys, 16);
|
|
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
-int vfio_add_virt_caps(VFIOPCIDevice *vdev, Error **errp)
|
|
|
|
|
|
+bool vfio_add_virt_caps(VFIOPCIDevice *vdev, Error **errp)
|
|
{
|
|
{
|
|
- int ret;
|
|
|
|
-
|
|
|
|
- ret = vfio_add_nv_gpudirect_cap(vdev, errp);
|
|
|
|
- if (ret) {
|
|
|
|
- return ret;
|
|
|
|
|
|
+ if (!vfio_add_nv_gpudirect_cap(vdev, errp)) {
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
- ret = vfio_add_vmd_shadow_cap(vdev, errp);
|
|
|
|
- if (ret) {
|
|
|
|
- return ret;
|
|
|
|
|
|
+ if (!vfio_add_vmd_shadow_cap(vdev, errp)) {
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return true;
|
|
}
|
|
}
|