sPAPRTCETable is handling 2 TCE tables already: 1) guest view of the TCE table - emulated devices use only this table;
2) hardware IOMMU table - VFIO PCI devices use it for actual work but it does not replace 1) and it is not visible to the guest. The initialization of this table is driven by vfio-pci device, DMA map/unmap requests are handled via MemoryListener so there is very little to do in spapr-pci-vfio-host-bridge. This moves VFIO bits to the generic spapr-pci-host-bridge which allows putting emulated and VFIO devices on the same PHB. It is still possible to create multiple PHBs and avoid sharing PHB resouces for emulated and VFIO devices. If there is no VFIO-PCI device attaches, no special ioctls will be called. If there are some VFIO-PCI devices attached, PHB may refuse to attach another VFIO-PCI device if a VFIO container on the host kernel side does not support container sharing. This changes spapr-pci-host-bridge to support properties of spapr-pci-vfio-host-bridge. This makes spapr-pci-vfio-host-bridge type equal to spapr-pci-host-bridge except it has an additional "iommu" property for backward compatibility reasons. This moves PCI device lookup from spapr_phb_vfio_eeh_set_option() to rtas_ibm_set_eeh_option() as we need to know if the device is "vfio-pci" and decide whether to call spapr_phb_vfio_eeh_set_option() or not. Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> --- Changes: v11: * fixed compilation for non-linux case: spapr_pci_vfio.c now always compiles and has stubs when no CONFIG_LINUX * replaced @has_vfio flag with a number of vfio-pci devices v9: * s'iommugroupid shall not be used'iommugroupid is deprecated and will be ignored' in error log v8: * call spapr_phb_vfio_eeh_set_option() on vfio-pci devices only (reported by Gavin) --- hw/ppc/Makefile.objs | 5 +- hw/ppc/spapr_pci.c | 85 +++++++++++------------------- hw/ppc/spapr_pci_vfio.c | 122 +++++++++++++++++++------------------------- include/hw/pci-host/spapr.h | 25 ++++----- 4 files changed, 95 insertions(+), 142 deletions(-) diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs index c8ab06e..6c06fcf 100644 --- a/hw/ppc/Makefile.objs +++ b/hw/ppc/Makefile.objs @@ -3,10 +3,7 @@ obj-y += ppc.o ppc_booke.o # IBM pSeries (sPAPR) obj-$(CONFIG_PSERIES) += spapr.o spapr_vio.o spapr_events.o obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o -obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o -ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy) -obj-y += spapr_pci_vfio.o -endif +obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_pci_vfio.o spapr_rtc.o spapr_drc.o # PowerPC 4xx boards obj-y += ppc405_boards.o ppc4xx_devs.o ppc405_uc.o ppc440_bamboo.o obj-y += ppc4xx_pci.o diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 6df3a46..25ee7d2 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -430,7 +430,6 @@ static void rtas_ibm_set_eeh_option(PowerPCCPU *cpu, target_ulong rets) { sPAPRPHBState *sphb; - sPAPRPHBClass *spc; PCIDevice *pdev; uint32_t addr, option; uint64_t buid; @@ -445,7 +444,7 @@ static void rtas_ibm_set_eeh_option(PowerPCCPU *cpu, option = rtas_ld(args, 3); sphb = spapr_pci_find_phb(spapr, buid); - if (!sphb) { + if (!sphb || (sphb->vfio_num == 0)) { goto param_error_exit; } @@ -455,12 +454,7 @@ static void rtas_ibm_set_eeh_option(PowerPCCPU *cpu, goto param_error_exit; } - spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); - if (!spc->eeh_set_option) { - goto param_error_exit; - } - - ret = spc->eeh_set_option(sphb, addr, option); + ret = spapr_phb_vfio_eeh_set_option(sphb, pdev, option); rtas_st(rets, 0, ret); return; @@ -475,7 +469,6 @@ static void rtas_ibm_get_config_addr_info2(PowerPCCPU *cpu, target_ulong rets) { sPAPRPHBState *sphb; - sPAPRPHBClass *spc; PCIDevice *pdev; uint32_t addr, option; uint64_t buid; @@ -486,12 +479,7 @@ static void rtas_ibm_get_config_addr_info2(PowerPCCPU *cpu, buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); sphb = spapr_pci_find_phb(spapr, buid); - if (!sphb) { - goto param_error_exit; - } - - spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); - if (!spc->eeh_set_option) { + if (!sphb || (sphb->vfio_num == 0)) { goto param_error_exit; } @@ -531,7 +519,6 @@ static void rtas_ibm_read_slot_reset_state2(PowerPCCPU *cpu, target_ulong rets) { sPAPRPHBState *sphb; - sPAPRPHBClass *spc; uint64_t buid; int state, ret; @@ -541,16 +528,11 @@ static void rtas_ibm_read_slot_reset_state2(PowerPCCPU *cpu, buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); sphb = spapr_pci_find_phb(spapr, buid); - if (!sphb) { + if (!sphb || (sphb->vfio_num == 0)) { goto param_error_exit; } - spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); - if (!spc->eeh_get_state) { - goto param_error_exit; - } - - ret = spc->eeh_get_state(sphb, &state); + ret = spapr_phb_vfio_eeh_get_state(sphb, &state); rtas_st(rets, 0, ret); if (ret != RTAS_OUT_SUCCESS) { return; @@ -575,7 +557,6 @@ static void rtas_ibm_set_slot_reset(PowerPCCPU *cpu, target_ulong rets) { sPAPRPHBState *sphb; - sPAPRPHBClass *spc; uint32_t option; uint64_t buid; int ret; @@ -587,16 +568,11 @@ static void rtas_ibm_set_slot_reset(PowerPCCPU *cpu, buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); option = rtas_ld(args, 3); sphb = spapr_pci_find_phb(spapr, buid); - if (!sphb) { + if (!sphb || (sphb->vfio_num == 0)) { goto param_error_exit; } - spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); - if (!spc->eeh_reset) { - goto param_error_exit; - } - - ret = spc->eeh_reset(sphb, option); + ret = spapr_phb_vfio_eeh_reset(sphb, option); rtas_st(rets, 0, ret); return; @@ -611,7 +587,6 @@ static void rtas_ibm_configure_pe(PowerPCCPU *cpu, target_ulong rets) { sPAPRPHBState *sphb; - sPAPRPHBClass *spc; uint64_t buid; int ret; @@ -621,16 +596,11 @@ static void rtas_ibm_configure_pe(PowerPCCPU *cpu, buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); sphb = spapr_pci_find_phb(spapr, buid); - if (!sphb) { + if (!sphb || (sphb->vfio_num == 0)) { goto param_error_exit; } - spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); - if (!spc->eeh_configure) { - goto param_error_exit; - } - - ret = spc->eeh_configure(sphb); + ret = spapr_phb_vfio_eeh_configure(sphb); rtas_st(rets, 0, ret); return; @@ -646,7 +616,6 @@ static void rtas_ibm_slot_error_detail(PowerPCCPU *cpu, target_ulong rets) { sPAPRPHBState *sphb; - sPAPRPHBClass *spc; int option; uint64_t buid; @@ -656,12 +625,7 @@ static void rtas_ibm_slot_error_detail(PowerPCCPU *cpu, buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); sphb = spapr_pci_find_phb(spapr, buid); - if (!sphb) { - goto param_error_exit; - } - - spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); - if (!spc->eeh_set_option) { + if (!sphb || (sphb->vfio_num == 0)) { goto param_error_exit; } @@ -815,6 +779,10 @@ static int spapr_phb_dma_capabilities_update(sPAPRPHBState *sphb) sphb->dma32_window_start = 0; sphb->dma32_window_size = SPAPR_PCI_DMA32_SIZE; + if (sphb->vfio_num > 0) { + spapr_phb_vfio_dma_capabilities_update(sphb); + } + return 0; } @@ -830,7 +798,8 @@ static int spapr_phb_dma_init_window(sPAPRPHBState *sphb, return -1; } - spapr_tce_table_enable(tcet, bus_offset, page_shift, nb_table, false); + spapr_tce_table_enable(tcet, bus_offset, page_shift, nb_table, + sphb->vfio_num > 0); return 0; } @@ -847,9 +816,8 @@ int spapr_phb_dma_reset(sPAPRPHBState *sphb) { int i; sPAPRTCETable *tcet; - sPAPRPHBClass *spc = SPAPR_PCI_HOST_BRIDGE_GET_CLASS(sphb); - spc->dma_capabilities_update(sphb); /* Refresh @has_vfio status */ + spapr_phb_dma_capabilities_update(sphb); for (i = 0; i < SPAPR_PCI_DMA_MAX_WINDOWS; ++i) { tcet = spapr_tce_find_by_liobn(SPAPR_PCI_LIOBN(sphb->index, i)); @@ -858,8 +826,8 @@ int spapr_phb_dma_reset(sPAPRPHBState *sphb) } } - spc->dma_init_window(sphb, SPAPR_PCI_LIOBN(sphb->index, 0), - SPAPR_TCE_PAGE_SHIFT, sphb->dma32_window_size); + spapr_phb_dma_init_window(sphb, SPAPR_PCI_LIOBN(sphb->index, 0), + SPAPR_TCE_PAGE_SHIFT, sphb->dma32_window_size); return 0; } @@ -1277,6 +1245,11 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp) uint64_t msi_window_size = 4096; sPAPRTCETable *tcet; + if ((sphb->iommugroupid != -1) && + object_dynamic_cast(OBJECT(sphb), TYPE_SPAPR_PCI_VFIO_HOST_BRIDGE)) { + error_report("Warning: iommugroupid is deprecated and will be ignored"); + } + if (sphb->index != (uint32_t)-1) { hwaddr windows_base; @@ -1452,6 +1425,9 @@ static void spapr_phb_reset(DeviceState *qdev) { sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(qdev); + if (sphb->vfio_num > 0) { + spapr_phb_vfio_eeh_reenable(sphb); + } spapr_phb_dma_reset(sphb); /* Reset the IOMMU state */ @@ -1576,7 +1552,6 @@ static void spapr_phb_class_init(ObjectClass *klass, void *data) { PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass); - sPAPRPHBClass *spc = SPAPR_PCI_HOST_BRIDGE_CLASS(klass); HotplugHandlerClass *hp = HOTPLUG_HANDLER_CLASS(klass); hc->root_bus_path = spapr_phb_root_bus_path; @@ -1588,8 +1563,6 @@ static void spapr_phb_class_init(ObjectClass *klass, void *data) dc->cannot_instantiate_with_device_add_yet = false; hp->plug = spapr_phb_hot_plug_child; hp->unplug = spapr_phb_hot_unplug_child; - spc->dma_capabilities_update = spapr_phb_dma_capabilities_update; - spc->dma_init_window = spapr_phb_dma_init_window; } static const TypeInfo spapr_phb_info = { @@ -1635,6 +1608,10 @@ static void spapr_populate_pci_devices_dt(PCIBus *bus, PCIDevice *pdev, return; } + if (object_dynamic_cast(OBJECT(pdev), "vfio-pci")) { + ++p->sphb->vfio_num; + } + if ((pci_default_read_config(pdev, PCI_HEADER_TYPE, 1) != PCI_HEADER_TYPE_BRIDGE)) { return; diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c index cf5483a..999ac3a 100644 --- a/hw/ppc/spapr_pci_vfio.c +++ b/hw/ppc/spapr_pci_vfio.c @@ -20,21 +20,22 @@ #include "hw/ppc/spapr.h" #include "hw/pci-host/spapr.h" #include "hw/pci/msix.h" -#include "linux/vfio.h" #include "hw/vfio/vfio.h" +#ifdef CONFIG_LINUX +#include "linux/vfio.h" + static Property spapr_phb_vfio_properties[] = { - DEFINE_PROP_INT32("iommu", sPAPRPHBVFIOState, iommugroupid, -1), + DEFINE_PROP_INT32("iommu", sPAPRPHBState, iommugroupid, -1), DEFINE_PROP_END_OF_LIST(), }; -static int spapr_phb_vfio_dma_capabilities_update(sPAPRPHBState *sphb) +int spapr_phb_vfio_dma_capabilities_update(sPAPRPHBState *sphb) { - sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); struct vfio_iommu_spapr_tce_info info = { .argsz = sizeof(info) }; int ret; - ret = vfio_container_ioctl(&sphb->iommu_as, svphb->iommugroupid, + ret = vfio_container_ioctl(&sphb->iommu_as, sphb->iommugroupid, VFIO_IOMMU_SPAPR_TCE_GET_INFO, &info); if (ret) { return ret; @@ -46,50 +47,27 @@ static int spapr_phb_vfio_dma_capabilities_update(sPAPRPHBState *sphb) return ret; } -static int spapr_phb_vfio_dma_init_window(sPAPRPHBState *sphb, - uint32_t liobn, uint32_t page_shift, - uint64_t window_size) -{ - uint64_t bus_offset = sphb->dma32_window_start; - sPAPRTCETable *tcet = spapr_tce_find_by_liobn(liobn); - spapr_tce_table_enable(tcet, bus_offset, page_shift, - window_size >> page_shift, - true); - - return 0; -} - -static void spapr_phb_vfio_eeh_reenable(sPAPRPHBVFIOState *svphb) +void spapr_phb_vfio_eeh_reenable(sPAPRPHBState *sphb) { struct vfio_eeh_pe_op op = { .argsz = sizeof(op), .op = VFIO_EEH_PE_ENABLE }; - vfio_container_ioctl(&svphb->phb.iommu_as, - svphb->iommugroupid, VFIO_EEH_PE_OP, &op); -} - -static void spapr_phb_vfio_reset(DeviceState *qdev) -{ - sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(qdev); - - spapr_phb_dma_reset(sphb); - /* * The PE might be in frozen state. To reenable the EEH * functionality on it will clean the frozen state, which * ensures that the contained PCI devices will work properly * after reboot. */ - spapr_phb_vfio_eeh_reenable(SPAPR_PCI_VFIO_HOST_BRIDGE(qdev)); + vfio_container_ioctl(&sphb->iommu_as, + sphb->iommugroupid, VFIO_EEH_PE_OP, &op); } -static int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, - unsigned int addr, int option) +int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, + PCIDevice *pdev, int option) { - sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); struct vfio_eeh_pe_op op = { .argsz = sizeof(op) }; int ret; @@ -97,25 +75,9 @@ static int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, case RTAS_EEH_DISABLE: op.op = VFIO_EEH_PE_DISABLE; break; - case RTAS_EEH_ENABLE: { - PCIHostState *phb; - PCIDevice *pdev; - - /* - * The EEH functionality is enabled on basis of PCI device, - * instead of PE. We need check the validity of the PCI - * device address. - */ - phb = PCI_HOST_BRIDGE(sphb); - pdev = pci_find_device(phb->bus, - (addr >> 16) & 0xFF, (addr >> 8) & 0xFF); - if (!pdev) { - return RTAS_OUT_PARAM_ERROR; - } - + case RTAS_EEH_ENABLE: op.op = VFIO_EEH_PE_ENABLE; break; - } case RTAS_EEH_THAW_IO: op.op = VFIO_EEH_PE_UNFREEZE_IO; break; @@ -126,7 +88,7 @@ static int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, return RTAS_OUT_PARAM_ERROR; } - ret = vfio_container_ioctl(&svphb->phb.iommu_as, svphb->iommugroupid, + ret = vfio_container_ioctl(&sphb->iommu_as, sphb->iommugroupid, VFIO_EEH_PE_OP, &op); if (ret < 0) { return RTAS_OUT_HW_ERROR; @@ -135,14 +97,13 @@ static int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, return RTAS_OUT_SUCCESS; } -static int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state) +int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state) { - sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); struct vfio_eeh_pe_op op = { .argsz = sizeof(op) }; int ret; op.op = VFIO_EEH_PE_GET_STATE; - ret = vfio_container_ioctl(&svphb->phb.iommu_as, svphb->iommugroupid, + ret = vfio_container_ioctl(&sphb->iommu_as, sphb->iommugroupid, VFIO_EEH_PE_OP, &op); if (ret < 0) { return RTAS_OUT_PARAM_ERROR; @@ -195,9 +156,8 @@ static void spapr_phb_vfio_eeh_pre_reset(sPAPRPHBState *sphb) pci_for_each_bus(phb->bus, spapr_phb_vfio_eeh_clear_bus_msix, NULL); } -static int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option) +int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option) { - sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); struct vfio_eeh_pe_op op = { .argsz = sizeof(op) }; int ret; @@ -217,7 +177,7 @@ static int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option) return RTAS_OUT_PARAM_ERROR; } - ret = vfio_container_ioctl(&svphb->phb.iommu_as, svphb->iommugroupid, + ret = vfio_container_ioctl(&sphb->iommu_as, sphb->iommugroupid, VFIO_EEH_PE_OP, &op); if (ret < 0) { return RTAS_OUT_HW_ERROR; @@ -226,14 +186,13 @@ static int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option) return RTAS_OUT_SUCCESS; } -static int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb) +int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb) { - sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); struct vfio_eeh_pe_op op = { .argsz = sizeof(op) }; int ret; op.op = VFIO_EEH_PE_CONFIGURE; - ret = vfio_container_ioctl(&svphb->phb.iommu_as, svphb->iommugroupid, + ret = vfio_container_ioctl(&sphb->iommu_as, sphb->iommugroupid, VFIO_EEH_PE_OP, &op); if (ret < 0) { return RTAS_OUT_PARAM_ERROR; @@ -245,22 +204,14 @@ static int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb) static void spapr_phb_vfio_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); - sPAPRPHBClass *spc = SPAPR_PCI_HOST_BRIDGE_CLASS(klass); dc->props = spapr_phb_vfio_properties; - dc->reset = spapr_phb_vfio_reset; - spc->dma_capabilities_update = spapr_phb_vfio_dma_capabilities_update; - spc->dma_init_window = spapr_phb_vfio_dma_init_window; - spc->eeh_set_option = spapr_phb_vfio_eeh_set_option; - spc->eeh_get_state = spapr_phb_vfio_eeh_get_state; - spc->eeh_reset = spapr_phb_vfio_eeh_reset; - spc->eeh_configure = spapr_phb_vfio_eeh_configure; } static const TypeInfo spapr_phb_vfio_info = { .name = TYPE_SPAPR_PCI_VFIO_HOST_BRIDGE, .parent = TYPE_SPAPR_PCI_HOST_BRIDGE, - .instance_size = sizeof(sPAPRPHBVFIOState), + .instance_size = sizeof(sPAPRPHBState), .class_init = spapr_phb_vfio_class_init, .class_size = sizeof(sPAPRPHBClass), }; @@ -271,3 +222,36 @@ static void spapr_pci_vfio_register_types(void) } type_init(spapr_pci_vfio_register_types) + +#else /* !CONFIG_LINUX */ + +int spapr_phb_vfio_dma_capabilities_update(sPAPRPHBState *sphb) +{ + return -1; +} + +int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, + PCIDevice *pdev, int option) +{ + return RTAS_OUT_HW_ERROR; +} + +int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state) +{ + return RTAS_OUT_HW_ERROR; +} + +int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option) +{ + return RTAS_OUT_HW_ERROR; +} + +int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb) +{ + return RTAS_OUT_HW_ERROR; +} + +void spapr_phb_vfio_eeh_reenable(sPAPRPHBState *sphb) +{ +} +#endif diff --git a/include/hw/pci-host/spapr.h b/include/hw/pci-host/spapr.h index fff868e..2819e96 100644 --- a/include/hw/pci-host/spapr.h +++ b/include/hw/pci-host/spapr.h @@ -47,15 +47,6 @@ typedef struct sPAPRPHBVFIOState sPAPRPHBVFIOState; struct sPAPRPHBClass { PCIHostBridgeClass parent_class; - - int (*dma_capabilities_update)(sPAPRPHBState *sphb); - int (*dma_init_window)(sPAPRPHBState *sphb, - uint32_t liobn, uint32_t page_shift, - uint64_t window_size); - int (*eeh_set_option)(sPAPRPHBState *sphb, unsigned int addr, int option); - int (*eeh_get_state)(sPAPRPHBState *sphb, int *state); - int (*eeh_reset)(sPAPRPHBState *sphb, int option); - int (*eeh_configure)(sPAPRPHBState *sphb); }; typedef struct spapr_pci_msi { @@ -95,16 +86,12 @@ struct sPAPRPHBState { uint32_t dma32_window_start; uint32_t dma32_window_size; + unsigned vfio_num; + int32_t iommugroupid; /* obsolete */ QLIST_ENTRY(sPAPRPHBState) list; }; -struct sPAPRPHBVFIOState { - sPAPRPHBState phb; - - int32_t iommugroupid; -}; - #define SPAPR_PCI_MAX_INDEX 255 #define SPAPR_PCI_BASE_BUID 0x800000020000000ULL @@ -149,4 +136,12 @@ int spapr_phb_dma_remove_window(sPAPRPHBState *sphb, sPAPRTCETable *tcet); int spapr_phb_dma_reset(sPAPRPHBState *sphb); +int spapr_phb_vfio_dma_capabilities_update(sPAPRPHBState *sphb); +int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, + PCIDevice *pdev, int option); +int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state); +int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option); +int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb); +void spapr_phb_vfio_eeh_reenable(sPAPRPHBState *sphb); + #endif /* __HW_SPAPR_PCI_H__ */ -- 2.4.0.rc3.8.gfb3e7d5