<dd>For mediated devices (<span class="since">Since 3.2.0</span>)
the <code>model</code> attribute specifies the device API which
determines how the host's vfio driver will expose the device to the
- guest. Currently, <code>model='vfio-pci'</code> and
+ guest. Currently, <code>model='vfio-pci'</code>,
<code>model='vfio-ccw'</code> (<span class="since">Since 4.4.0</span>)
+ and <code>model='vfio-ap'</code> (<span class="since">Since 4.9.0</span>)
is supported. <a href="drvnodedev.html#MDEV">MDEV</a> section
provides more information about mediated devices as well as how to
create mediated devices on the host.
<choice>
<value>vfio-pci</value>
<value>vfio-ccw</value>
+ <value>vfio-ap</value>
</choice>
</attribute>
<optional>
}
+static int
+virDomainDefPostParseHostdev(virDomainDefPtr def)
+{
+ size_t i;
+ bool vfioap_found = false;
+
+ /* verify settings of hostdevs vfio-ap */
+ for (i = 0; i < def->nhostdevs; i++) {
+ virDomainHostdevDefPtr hostdev = def->hostdevs[i];
+
+ if (virHostdevIsMdevDevice(hostdev) &&
+ hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
+ if (vfioap_found) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Only one hostdev of model vfio-ap is "
+ "supported"));
+ return -1;
+ }
+ vfioap_found = true;
+ }
+ }
+ return 0;
+}
+
+
/**
* virDomainDriveAddressIsUsedByDisk:
* @def: domain definition containing the disks to check
virDomainDefPostParseGraphics(def);
+ if (virDomainDefPostParseHostdev(def) < 0)
+ return -1;
+
if (virDomainDefPostParseCPU(def) < 0)
return -1;
return -1;
}
break;
+ case VIR_MDEV_MODEL_TYPE_VFIO_AP:
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_AP)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("VFIO AP device assignment is not "
+ "supported by this version of QEMU"));
+ return -1;
+ }
+ break;
case VIR_MDEV_MODEL_TYPE_LAST:
default:
virReportEnumRangeError(virMediatedDeviceModelType,
subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_CCW &&
def->hostdevs[i]->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
def->hostdevs[i]->info->type = type;
+
+ if (virHostdevIsMdevDevice(def->hostdevs[i]) &&
+ subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP)
+ def->hostdevs[i]->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
}
}
VIR_ENUM_IMPL(virMediatedDeviceModel, VIR_MDEV_MODEL_TYPE_LAST,
"vfio-pci",
- "vfio-ccw")
+ "vfio-ccw",
+ "vfio-ap")
static virClassPtr virMediatedDeviceListClass;
typedef enum {
VIR_MDEV_MODEL_TYPE_VFIO_PCI = 0,
VIR_MDEV_MODEL_TYPE_VFIO_CCW = 1,
+ VIR_MDEV_MODEL_TYPE_VFIO_AP = 2,
VIR_MDEV_MODEL_TYPE_LAST
} virMediatedDeviceModelType;