Add a pcib_attach_child() method to manage adding the child "pci" device.
This allows the PCI-PCI bridge driver to save a reference to the child device in its softc. Note that this required moving the "pci" device creation out of acpi_pcib_attach(). Instead, acpi_pcib_attach() is renamed to acpi_pcib_fetch_prt() as it's sole action now is to fetch the PCI interrupt routing table. Differential Revision: https://reviews.freebsd.org/D6021
This commit is contained in:
parent
c91991a2d8
commit
67e7d085ae
@ -126,11 +126,10 @@ prt_attach_devices(ACPI_PCI_ROUTING_TABLE *entry, void *arg)
|
||||
ACPI_ADR_PCI_SLOT(entry->Address), entry->Pin);
|
||||
}
|
||||
|
||||
int
|
||||
acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno)
|
||||
void
|
||||
acpi_pcib_fetch_prt(device_t dev, ACPI_BUFFER *prt)
|
||||
{
|
||||
ACPI_STATUS status;
|
||||
int error;
|
||||
|
||||
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
|
||||
|
||||
@ -148,20 +147,9 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno)
|
||||
acpi_name(acpi_get_handle(dev)), AcpiFormatException(status));
|
||||
|
||||
/*
|
||||
* Attach the PCI bus proper.
|
||||
*/
|
||||
if (device_add_child(dev, "pci", -1) == NULL) {
|
||||
device_printf(device_get_parent(dev), "couldn't attach pci bus\n");
|
||||
return_VALUE(ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now go scan the bus.
|
||||
* Ensure all the link devices are attached.
|
||||
*/
|
||||
prt_walk_table(prt, prt_attach_devices, dev);
|
||||
|
||||
error = bus_generic_attach(dev);
|
||||
return_VALUE(error);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -502,7 +502,13 @@ acpi_pcib_acpi_attach(device_t dev)
|
||||
if (sc->ap_segment == 0 && sc->ap_bus == 0)
|
||||
bus0_seen = 1;
|
||||
|
||||
return (acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_bus));
|
||||
acpi_pcib_fetch_prt(dev, &sc->ap_prt);
|
||||
|
||||
if (device_add_child(dev, "pci", -1) == NULL) {
|
||||
device_printf(device_get_parent(dev), "couldn't attach pci bus\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
return (bus_generic_attach(dev));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -120,7 +120,9 @@ acpi_pcib_pci_attach(device_t dev)
|
||||
pcib_attach_common(dev);
|
||||
sc = device_get_softc(dev);
|
||||
sc->ap_handle = acpi_get_handle(dev);
|
||||
return (acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_pcibsc.bus.sec));
|
||||
acpi_pcib_fetch_prt(dev, &sc->ap_prt);
|
||||
|
||||
return (pcib_attach_child(dev));
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -35,7 +35,7 @@
|
||||
void acpi_pci_link_add_reference(device_t dev, int index, device_t pcib,
|
||||
int slot, int pin);
|
||||
int acpi_pci_link_route_interrupt(device_t dev, int index);
|
||||
int acpi_pcib_attach(device_t bus, ACPI_BUFFER *prt, int busno);
|
||||
void acpi_pcib_fetch_prt(device_t bus, ACPI_BUFFER *prt);
|
||||
int acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
|
||||
ACPI_BUFFER *prtbuf);
|
||||
int acpi_pcib_power_for_sleep(device_t pcib, device_t dev,
|
||||
|
@ -1075,21 +1075,26 @@ pcib_attach_common(device_t dev)
|
||||
}
|
||||
|
||||
int
|
||||
pcib_attach(device_t dev)
|
||||
pcib_attach_child(device_t dev)
|
||||
{
|
||||
struct pcib_softc *sc;
|
||||
device_t child;
|
||||
|
||||
pcib_attach_common(dev);
|
||||
sc = device_get_softc(dev);
|
||||
if (sc->bus.sec != 0) {
|
||||
child = device_add_child(dev, "pci", -1);
|
||||
if (child != NULL)
|
||||
if (sc->bus.sec == 0) {
|
||||
/* no secondary bus; we should have fixed this */
|
||||
return(0);
|
||||
}
|
||||
|
||||
sc->child = device_add_child(dev, "pci", -1);
|
||||
return (bus_generic_attach(dev));
|
||||
}
|
||||
|
||||
/* no secondary bus; we should have fixed this */
|
||||
return(0);
|
||||
int
|
||||
pcib_attach(device_t dev)
|
||||
{
|
||||
|
||||
pcib_attach_common(dev);
|
||||
return (pcib_attach_child(dev));
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -101,6 +101,7 @@ struct pcib_secbus {
|
||||
struct pcib_softc
|
||||
{
|
||||
device_t dev;
|
||||
device_t child;
|
||||
uint32_t flags; /* flags */
|
||||
#define PCIB_SUBTRACTIVE 0x1
|
||||
#define PCIB_DISABLE_MSI 0x2
|
||||
@ -144,6 +145,7 @@ void pcib_setup_secbus(device_t dev, struct pcib_secbus *bus,
|
||||
int min_count);
|
||||
#endif
|
||||
int pcib_attach(device_t dev);
|
||||
int pcib_attach_child(device_t dev);
|
||||
void pcib_attach_common(device_t dev);
|
||||
void pcib_bridge_init(device_t dev);
|
||||
#ifdef NEW_PCIB
|
||||
|
@ -114,10 +114,7 @@ ofw_pcib_pci_attach(device_t dev)
|
||||
sizeof(cell_t));
|
||||
|
||||
pcib_attach_common(dev);
|
||||
|
||||
device_add_child(dev, "pci", -1);
|
||||
|
||||
return (bus_generic_attach(dev));
|
||||
return (pcib_attach_child(dev));
|
||||
}
|
||||
|
||||
static phandle_t
|
||||
|
@ -149,8 +149,7 @@ ofw_pcib_attach(device_t dev)
|
||||
|
||||
ofw_pcib_gen_setup(dev);
|
||||
pcib_attach_common(dev);
|
||||
device_add_child(dev, "pci", -1);
|
||||
return (bus_generic_attach(dev));
|
||||
return (pcib_attach_child(dev));
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user