spapr_pci: Fix extended config space accesses
The PAPR PHB acts as a legacy PCI bus but it allows PCIe extended
config space accesses anyway (for pseries-2.9 and newer machine
types).
Introduce a specific PCI bus subtype to inform the common PCI code
about that.
Fixes: c2077e2ca0
Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <155414130834.574858.16502276132110219890.stgit@bahia.lan>
[dwg: Apply fix so we don't rename the default pci bus, breaking everything]
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
1c685a9026
commit
5cf0d326a0
@ -1638,6 +1638,28 @@ static void spapr_phb_unrealize(DeviceState *dev, Error **errp)
|
|||||||
memory_region_del_subregion(get_system_memory(), &sphb->mem32window);
|
memory_region_del_subregion(get_system_memory(), &sphb->mem32window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool spapr_phb_allows_extended_config_space(PCIBus *bus)
|
||||||
|
{
|
||||||
|
SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(BUS(bus)->parent);
|
||||||
|
|
||||||
|
return sphb->pcie_ecs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spapr_phb_root_bus_class_init(ObjectClass *klass, void *data)
|
||||||
|
{
|
||||||
|
PCIBusClass *pbc = PCI_BUS_CLASS(klass);
|
||||||
|
|
||||||
|
pbc->allows_extended_config_space = spapr_phb_allows_extended_config_space;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TYPE_SPAPR_PHB_ROOT_BUS "spapr-pci-host-bridge-root-bus"
|
||||||
|
|
||||||
|
static const TypeInfo spapr_phb_root_bus_info = {
|
||||||
|
.name = TYPE_SPAPR_PHB_ROOT_BUS,
|
||||||
|
.parent = TYPE_PCI_BUS,
|
||||||
|
.class_init = spapr_phb_root_bus_class_init,
|
||||||
|
};
|
||||||
|
|
||||||
static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
|
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
|
||||||
@ -1739,10 +1761,11 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
|||||||
memory_region_add_subregion(get_system_memory(), sphb->io_win_addr,
|
memory_region_add_subregion(get_system_memory(), sphb->io_win_addr,
|
||||||
&sphb->iowindow);
|
&sphb->iowindow);
|
||||||
|
|
||||||
bus = pci_register_root_bus(dev, NULL,
|
bus = pci_register_root_bus(dev, "pci.0",
|
||||||
pci_spapr_set_irq, pci_spapr_map_irq, sphb,
|
pci_spapr_set_irq, pci_spapr_map_irq, sphb,
|
||||||
&sphb->memspace, &sphb->iospace,
|
&sphb->memspace, &sphb->iospace,
|
||||||
PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS);
|
PCI_DEVFN(0, 0), PCI_NUM_PINS,
|
||||||
|
TYPE_SPAPR_PHB_ROOT_BUS);
|
||||||
phb->bus = bus;
|
phb->bus = bus;
|
||||||
qbus_set_hotplug_handler(BUS(phb->bus), OBJECT(sphb), NULL);
|
qbus_set_hotplug_handler(BUS(phb->bus), OBJECT(sphb), NULL);
|
||||||
|
|
||||||
@ -2325,6 +2348,7 @@ void spapr_pci_rtas_init(void)
|
|||||||
static void spapr_pci_register_types(void)
|
static void spapr_pci_register_types(void)
|
||||||
{
|
{
|
||||||
type_register_static(&spapr_phb_info);
|
type_register_static(&spapr_phb_info);
|
||||||
|
type_register_static(&spapr_phb_root_bus_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(spapr_pci_register_types)
|
type_init(spapr_pci_register_types)
|
||||||
|
Loading…
Reference in New Issue
Block a user