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: c2077e2ca0da7 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); | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
|     /* 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, | ||||
|                                 &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, | ||||
|                                 &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; | ||||
|     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) | ||||
| { | ||||
|     type_register_static(&spapr_phb_info); | ||||
|     type_register_static(&spapr_phb_root_bus_info); | ||||
| } | ||||
| 
 | ||||
| type_init(spapr_pci_register_types) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Greg Kurz
						Greg Kurz