Skip to content

Commit

Permalink
hw/pci/pci_host: Allow PCI host to bypass iommu
Browse files Browse the repository at this point in the history
Add a new bypass_iommu property for PCI host and use it to check
whether devices attached to the PCI root bus will bypass iommu.
In pci_device_iommu_address_space(), check the property and
avoid getting iommu address space for devices bypass iommu.

Signed-off-by: Xingang Wang <wangxingang5@huawei.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Message-Id: <1625748919-52456-2-git-send-email-wangxingang5@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Xingang Wang authored and mstsirkin committed Jul 13, 2021
1 parent 47b34b5 commit 2828486
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 1 deletion.
18 changes: 17 additions & 1 deletion hw/pci/pci.c
Expand Up @@ -416,6 +416,22 @@ const char *pci_root_bus_path(PCIDevice *dev)
return rootbus->qbus.name;
}

bool pci_bus_bypass_iommu(PCIBus *bus)
{
PCIBus *rootbus = bus;
PCIHostState *host_bridge;

if (!pci_bus_is_root(bus)) {
rootbus = pci_device_root_bus(bus->parent_dev);
}

host_bridge = PCI_HOST_BRIDGE(rootbus->qbus.parent);

assert(host_bridge->bus == rootbus);

return host_bridge->bypass_iommu;
}

static void pci_root_bus_init(PCIBus *bus, DeviceState *parent,
MemoryRegion *address_space_mem,
MemoryRegion *address_space_io,
Expand Down Expand Up @@ -2718,7 +2734,7 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice *dev)

iommu_bus = parent_bus;
}
if (iommu_bus && iommu_bus->iommu_fn) {
if (!pci_bus_bypass_iommu(bus) && iommu_bus && iommu_bus->iommu_fn) {
return iommu_bus->iommu_fn(bus, iommu_bus->iommu_opaque, devfn);
}
return &address_space_memory;
Expand Down
1 change: 1 addition & 0 deletions hw/pci/pci_host.c
Expand Up @@ -222,6 +222,7 @@ const VMStateDescription vmstate_pcihost = {
static Property pci_host_properties_common[] = {
DEFINE_PROP_BOOL("x-config-reg-migration-enabled", PCIHostState,
mig_enabled, true),
DEFINE_PROP_BOOL("bypass-iommu", PCIHostState, bypass_iommu, false),
DEFINE_PROP_END_OF_LIST(),
};

Expand Down
1 change: 1 addition & 0 deletions include/hw/pci/pci.h
Expand Up @@ -480,6 +480,7 @@ void pci_for_each_bus(PCIBus *bus,

PCIBus *pci_device_root_bus(const PCIDevice *d);
const char *pci_root_bus_path(PCIDevice *dev);
bool pci_bus_bypass_iommu(PCIBus *bus);
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn);
int pci_qdev_find_device(const char *id, PCIDevice **pdev);
void pci_bus_get_w64_range(PCIBus *bus, Range *range);
Expand Down
1 change: 1 addition & 0 deletions include/hw/pci/pci_host.h
Expand Up @@ -43,6 +43,7 @@ struct PCIHostState {
uint32_t config_reg;
bool mig_enabled;
PCIBus *bus;
bool bypass_iommu;

QLIST_ENTRY(PCIHostState) next;
};
Expand Down

0 comments on commit 2828486

Please sign in to comment.