pci: add pci_for_each_bus_depth_first
Useful for ACPI hotplug. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									4d25299cb2
								
							
						
					
					
						commit
						eb0acfdde6
					
				
							
								
								
									
										28
									
								
								hw/pci/pci.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								hw/pci/pci.c
									
									
									
									
									
								
							@ -1704,6 +1704,34 @@ static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num)
 | 
				
			|||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void pci_for_each_bus_depth_first(PCIBus *bus,
 | 
				
			||||||
 | 
					                                  void *(*begin)(PCIBus *bus, void *parent_state),
 | 
				
			||||||
 | 
					                                  void (*end)(PCIBus *bus, void *state),
 | 
				
			||||||
 | 
					                                  void *parent_state)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    PCIBus *sec;
 | 
				
			||||||
 | 
					    void *state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!bus) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (begin) {
 | 
				
			||||||
 | 
					        state = begin(bus, parent_state);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        state = parent_state;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QLIST_FOREACH(sec, &bus->child, sibling) {
 | 
				
			||||||
 | 
					        pci_for_each_bus_depth_first(sec, begin, end, state);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (end) {
 | 
				
			||||||
 | 
					        end(bus, state);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
 | 
					PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    bus = pci_find_bus_nr(bus, bus_num);
 | 
					    bus = pci_find_bus_nr(bus, bus_num);
 | 
				
			||||||
 | 
				
			|||||||
@ -387,6 +387,20 @@ int pci_bus_num(PCIBus *s);
 | 
				
			|||||||
void pci_for_each_device(PCIBus *bus, int bus_num,
 | 
					void pci_for_each_device(PCIBus *bus, int bus_num,
 | 
				
			||||||
                         void (*fn)(PCIBus *bus, PCIDevice *d, void *opaque),
 | 
					                         void (*fn)(PCIBus *bus, PCIDevice *d, void *opaque),
 | 
				
			||||||
                         void *opaque);
 | 
					                         void *opaque);
 | 
				
			||||||
 | 
					void pci_for_each_bus_depth_first(PCIBus *bus,
 | 
				
			||||||
 | 
					                                  void *(*begin)(PCIBus *bus, void *parent_state),
 | 
				
			||||||
 | 
					                                  void (*end)(PCIBus *bus, void *state),
 | 
				
			||||||
 | 
					                                  void *parent_state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Use this wrapper when specific scan order is not required. */
 | 
				
			||||||
 | 
					static inline
 | 
				
			||||||
 | 
					void pci_for_each_bus(PCIBus *bus,
 | 
				
			||||||
 | 
					                      void (*fn)(PCIBus *bus, void *opaque),
 | 
				
			||||||
 | 
					                      void *opaque)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    pci_for_each_bus_depth_first(bus, NULL, fn, opaque);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PCIBus *pci_find_primary_bus(void);
 | 
					PCIBus *pci_find_primary_bus(void);
 | 
				
			||||||
PCIBus *pci_device_root_bus(const PCIDevice *d);
 | 
					PCIBus *pci_device_root_bus(const PCIDevice *d);
 | 
				
			||||||
const char *pci_root_bus_path(PCIDevice *dev);
 | 
					const char *pci_root_bus_path(PCIDevice *dev);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user