hw/pci: made pci_bus_is_root a PCIBusClass method
Refactoring it as a method of PCIBusClass will allow different implementations for subclasses. Removed the assumption that the root bus does not have a parent device because is specific only to the default class implementation. Signed-off-by: Marcel Apfelbaum <marcel@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
		
							parent
							
								
									32d9ca15ba
								
							
						
					
					
						commit
						ce6a28ee05
					
				
							
								
								
									
										17
									
								
								hw/pci/pci.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								hw/pci/pci.c
									
									
									
									
									
								
							| @ -88,9 +88,15 @@ static void pci_bus_unrealize(BusState *qbus, Error **errp) | ||||
|     vmstate_unregister(NULL, &vmstate_pcibus, bus); | ||||
| } | ||||
| 
 | ||||
| static bool pcibus_is_root(PCIBus *bus) | ||||
| { | ||||
|     return !bus->parent_dev; | ||||
| } | ||||
| 
 | ||||
| static void pci_bus_class_init(ObjectClass *klass, void *data) | ||||
| { | ||||
|     BusClass *k = BUS_CLASS(klass); | ||||
|     PCIBusClass *pbc = PCI_BUS_CLASS(klass); | ||||
| 
 | ||||
|     k->print_dev = pcibus_dev_print; | ||||
|     k->get_dev_path = pcibus_get_dev_path; | ||||
| @ -98,12 +104,15 @@ static void pci_bus_class_init(ObjectClass *klass, void *data) | ||||
|     k->realize = pci_bus_realize; | ||||
|     k->unrealize = pci_bus_unrealize; | ||||
|     k->reset = pcibus_reset; | ||||
| 
 | ||||
|     pbc->is_root = pcibus_is_root; | ||||
| } | ||||
| 
 | ||||
| static const TypeInfo pci_bus_info = { | ||||
|     .name = TYPE_PCI_BUS, | ||||
|     .parent = TYPE_BUS, | ||||
|     .instance_size = sizeof(PCIBus), | ||||
|     .class_size = sizeof(PCIBusClass), | ||||
|     .class_init = pci_bus_class_init, | ||||
| }; | ||||
| 
 | ||||
| @ -278,7 +287,10 @@ PCIBus *pci_device_root_bus(const PCIDevice *d) | ||||
| { | ||||
|     PCIBus *bus = d->bus; | ||||
| 
 | ||||
|     while ((d = bus->parent_dev) != NULL) { | ||||
|     while (!pci_bus_is_root(bus)) { | ||||
|         d = bus->parent_dev; | ||||
|         assert(d != NULL); | ||||
| 
 | ||||
|         bus = d->bus; | ||||
|     } | ||||
| 
 | ||||
| @ -291,7 +303,6 @@ const char *pci_root_bus_path(PCIDevice *dev) | ||||
|     PCIHostState *host_bridge = PCI_HOST_BRIDGE(rootbus->qbus.parent); | ||||
|     PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_GET_CLASS(host_bridge); | ||||
| 
 | ||||
|     assert(!rootbus->parent_dev); | ||||
|     assert(host_bridge->bus == rootbus); | ||||
| 
 | ||||
|     if (hc->root_bus_path) { | ||||
| @ -325,7 +336,7 @@ bool pci_bus_is_express(PCIBus *bus) | ||||
| 
 | ||||
| bool pci_bus_is_root(PCIBus *bus) | ||||
| { | ||||
|     return !bus->parent_dev; | ||||
|     return PCI_BUS_GET_CLASS(bus)->is_root(bus); | ||||
| } | ||||
| 
 | ||||
| void pci_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *parent, | ||||
|  | ||||
| @ -340,6 +340,8 @@ typedef PCIINTxRoute (*pci_route_irq_fn)(void *opaque, int pin); | ||||
| 
 | ||||
| #define TYPE_PCI_BUS "PCI" | ||||
| #define PCI_BUS(obj) OBJECT_CHECK(PCIBus, (obj), TYPE_PCI_BUS) | ||||
| #define PCI_BUS_CLASS(klass) OBJECT_CLASS_CHECK(PCIBusClass, (klass), TYPE_PCI_BUS) | ||||
| #define PCI_BUS_GET_CLASS(obj) OBJECT_GET_CLASS(PCIBusClass, (obj), TYPE_PCI_BUS) | ||||
| #define TYPE_PCIE_BUS "PCIE" | ||||
| 
 | ||||
| bool pci_bus_is_express(PCIBus *bus); | ||||
|  | ||||
| @ -8,6 +8,14 @@ | ||||
|  * use accessor functions in pci.h, pci_bridge.h | ||||
|  */ | ||||
| 
 | ||||
| typedef struct PCIBusClass { | ||||
|     /*< private >*/ | ||||
|     BusClass parent_class; | ||||
|     /*< public >*/ | ||||
| 
 | ||||
|     bool (*is_root)(PCIBus *bus); | ||||
| } PCIBusClass; | ||||
| 
 | ||||
| struct PCIBus { | ||||
|     BusState qbus; | ||||
|     PCIIOMMUFunc iommu_fn; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Marcel Apfelbaum
						Marcel Apfelbaum