bus/pci: support IOVA as VA in PowerVM LPARs
Add IOMMU detection logic for PowerVM LPARs. PowerNV $ cat /proc/cpuinfo ... timebase : 512000000 platform : PowerNV model : 8335-GTW PowerVM LPAR $ cat /proc/cpuinfo ... timebase : 512000000 platform : pSeries model : IBM,9009-22A machine : CHRP IBM,9009-22A MMU : Hash PowerNV KVM Guest $ cat /proc/cpuinfo ... timebase : 512000000 platform : pSeries model : IBM pSeries (emulated by qemu) machine : CHRP IBM pSeries (emulated by qemu) MMU : Radix Signed-off-by: David Christensen <drc@linux.vnet.ibm.com> Reviewed-by: Thinh Tran <thinhtr@linux.vnet.ibm.com>
This commit is contained in:
parent
cc4219d1f0
commit
fc5bffb8b5
@ -549,16 +549,22 @@ bool
|
||||
pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev)
|
||||
{
|
||||
/*
|
||||
* IOMMU is always present on a PowerNV host (IOMMUv2).
|
||||
* IOMMU is also present in a KVM/QEMU VM (IOMMUv1) but is not
|
||||
* currently supported by DPDK. Test for our current environment
|
||||
* and report VA support as appropriate.
|
||||
* All POWER systems support an IOMMU, but only IOMMUv2 supports
|
||||
* IOVA = VA in DPDK. Check contents of /proc/cpuinfo to find the
|
||||
* system.
|
||||
*
|
||||
* Platform | Model | IOMMU | VA? | Comment
|
||||
* ---------+-------+---------+-----+---------------------------------
|
||||
* PowerNV | N/A | IOMMUv2 | Yes | OpenPOWER (Bare Metal)
|
||||
* pSeries | ~qemu | IOMMUv2 | Yes | PowerVM Logical Partition (LPAR)
|
||||
* pSeries | qemu | IOMMUv1 | No | QEMU Virtual Machine
|
||||
*/
|
||||
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
char filename[PATH_MAX] = "/proc/cpuinfo";
|
||||
FILE *fp = fopen(filename, "r");
|
||||
bool pseries = false, powernv = false, qemu = false;
|
||||
bool ret = false;
|
||||
|
||||
if (fp == NULL) {
|
||||
@ -567,20 +573,29 @@ pci_device_iommu_support_va(__rte_unused const struct rte_pci_device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check for a PowerNV platform */
|
||||
/* Check the "platform" and "model" fields */
|
||||
while (getline(&line, &len, fp) != -1) {
|
||||
if (strstr(line, "platform") == NULL)
|
||||
continue;
|
||||
|
||||
if (strstr(line, "PowerNV") != NULL) {
|
||||
RTE_LOG(DEBUG, EAL, "Running on a PowerNV system\n");
|
||||
ret = true;
|
||||
break;
|
||||
if (strstr(line, "platform") != NULL) {
|
||||
if (strstr(line, "PowerNV") != NULL) {
|
||||
RTE_LOG(DEBUG, EAL, "Running on a PowerNV platform\n");
|
||||
powernv = true;
|
||||
} else if (strstr(line, "pSeries") != NULL) {
|
||||
RTE_LOG(DEBUG, EAL, "Running on a pSeries platform\n");
|
||||
pseries = true;
|
||||
}
|
||||
} else if (strstr(line, "model") != NULL) {
|
||||
if (strstr(line, "qemu") != NULL) {
|
||||
RTE_LOG(DEBUG, EAL, "Found qemu emulation\n");
|
||||
qemu = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(line);
|
||||
fclose(fp);
|
||||
|
||||
if (powernv || (pseries && !qemu))
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user