Sprinkle EARLY_DRIVER_MODULE around the tree
Mark some buses as BUS_PASS_BUS, and some resources as BUS_PASS_RESOURCE. This also decouples some resource attachment orderings from being races by device tree ordering, instead relying on the bus pass to provide the ordering. This was originally intended to support multipass suspend/resume, but it's also needed on PowerMacs when using fdt, as the device tree seems to get created in reverse of the OFW tree. Reviewed by: nwhitehorn (long ago) Differential Revision: https://reviews.freebsd.org/D918
This commit is contained in:
parent
f1e0cb5ef1
commit
bfed756af6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=341455
@ -214,7 +214,8 @@ static device_method_t pci_methods[] = {
|
||||
DEFINE_CLASS_0(pci, pci_driver, pci_methods, sizeof(struct pci_softc));
|
||||
|
||||
static devclass_t pci_devclass;
|
||||
DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, NULL);
|
||||
EARLY_DRIVER_MODULE(pci, pcib, pci_driver, pci_devclass, pci_modevent, NULL,
|
||||
BUS_PASS_BUS);
|
||||
MODULE_VERSION(pci, 1);
|
||||
|
||||
static char *pci_vendordata;
|
||||
|
@ -131,7 +131,8 @@ static device_method_t pcib_methods[] = {
|
||||
static devclass_t pcib_devclass;
|
||||
|
||||
DEFINE_CLASS_0(pcib, pcib_driver, pcib_methods, sizeof(struct pcib_softc));
|
||||
DRIVER_MODULE(pcib, pci, pcib_driver, pcib_devclass, NULL, NULL);
|
||||
EARLY_DRIVER_MODULE(pcib, pci, pcib_driver, pcib_devclass, NULL, NULL,
|
||||
BUS_PASS_BUS);
|
||||
|
||||
#if defined(NEW_PCIB) || defined(PCI_HP)
|
||||
SYSCTL_DECL(_hw_pci);
|
||||
|
@ -86,7 +86,8 @@ struct ofw_pcib_softc {
|
||||
|
||||
DEFINE_CLASS_1(pcib, ofw_pcib_pci_driver, ofw_pcib_pci_methods,
|
||||
sizeof(struct ofw_pcib_softc), pcib_driver);
|
||||
DRIVER_MODULE(ofw_pcib, pci, ofw_pcib_pci_driver, pcib_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(ofw_pcib, pci, ofw_pcib_pci_driver, pcib_devclass, 0, 0,
|
||||
BUS_PASS_BUS);
|
||||
|
||||
static int
|
||||
ofw_pcib_pci_probe(device_t dev)
|
||||
|
@ -100,7 +100,8 @@ static devclass_t pci_devclass;
|
||||
|
||||
DEFINE_CLASS_1(pci, ofw_pcibus_driver, ofw_pcibus_methods,
|
||||
sizeof(struct pci_softc), pci_driver);
|
||||
DRIVER_MODULE(ofw_pcibus, pcib, ofw_pcibus_driver, pci_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(ofw_pcibus, pcib, ofw_pcibus_driver, pci_devclass, 0, 0,
|
||||
BUS_PASS_BUS);
|
||||
MODULE_VERSION(ofw_pcibus, 1);
|
||||
MODULE_DEPEND(ofw_pcibus, pci, 1, 1, 1);
|
||||
|
||||
|
@ -95,9 +95,12 @@ static driver_t openpic_ofw_driver = {
|
||||
sizeof(struct openpic_softc),
|
||||
};
|
||||
|
||||
DRIVER_MODULE(openpic, ofwbus, openpic_ofw_driver, openpic_devclass, 0, 0);
|
||||
DRIVER_MODULE(openpic, simplebus, openpic_ofw_driver, openpic_devclass, 0, 0);
|
||||
DRIVER_MODULE(openpic, macio, openpic_ofw_driver, openpic_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(openpic, ofwbus, openpic_ofw_driver, openpic_devclass,
|
||||
0, 0, BUS_PASS_INTERRUPT);
|
||||
EARLY_DRIVER_MODULE(openpic, simplebus, openpic_ofw_driver, openpic_devclass,
|
||||
0, 0, BUS_PASS_INTERRUPT);
|
||||
EARLY_DRIVER_MODULE(openpic, macio, openpic_ofw_driver, openpic_devclass, 0, 0,
|
||||
BUS_PASS_INTERRUPT);
|
||||
|
||||
static int
|
||||
openpic_ofw_probe(device_t dev)
|
||||
|
@ -139,7 +139,8 @@ struct cpcht_softc {
|
||||
static devclass_t cpcht_devclass;
|
||||
DEFINE_CLASS_1(pcib, cpcht_driver, cpcht_methods, sizeof(struct cpcht_softc),
|
||||
ofw_pci_driver);
|
||||
DRIVER_MODULE(cpcht, ofwbus, cpcht_driver, cpcht_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(cpcht, ofwbus, cpcht_driver, cpcht_devclass, 0, 0,
|
||||
BUS_PASS_BUS);
|
||||
|
||||
#define CPCHT_IOPORT_BASE 0xf4000000UL /* Hardwired */
|
||||
#define CPCHT_IOPORT_SIZE 0x00400000UL
|
||||
@ -545,7 +546,8 @@ static driver_t openpic_cpcht_driver = {
|
||||
sizeof(struct openpic_cpcht_softc),
|
||||
};
|
||||
|
||||
DRIVER_MODULE(openpic, unin, openpic_cpcht_driver, openpic_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(openpic, unin, openpic_cpcht_driver, openpic_devclass,
|
||||
0, 0, BUS_PASS_INTERRUPT);
|
||||
|
||||
static int
|
||||
openpic_cpcht_probe(device_t dev)
|
||||
|
@ -125,7 +125,8 @@ static driver_t macgpio_pci_driver = {
|
||||
|
||||
devclass_t macgpio_devclass;
|
||||
|
||||
DRIVER_MODULE(macgpio, macio, macgpio_pci_driver, macgpio_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(macgpio, macio, macgpio_pci_driver, macgpio_devclass, 0, 0,
|
||||
BUS_PASS_BUS);
|
||||
|
||||
struct macgpio_devinfo {
|
||||
struct ofw_bus_devinfo mdi_obdinfo;
|
||||
|
@ -135,7 +135,8 @@ static driver_t macio_pci_driver = {
|
||||
|
||||
devclass_t macio_devclass;
|
||||
|
||||
DRIVER_MODULE(macio, pci, macio_pci_driver, macio_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(macio, pci, macio_pci_driver, macio_devclass, 0, 0,
|
||||
BUS_PASS_BUS);
|
||||
|
||||
/*
|
||||
* PCI ID search table
|
||||
|
@ -153,7 +153,8 @@ static driver_t pmu_driver = {
|
||||
|
||||
static devclass_t pmu_devclass;
|
||||
|
||||
DRIVER_MODULE(pmu, macio, pmu_driver, pmu_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(pmu, macio, pmu_driver, pmu_devclass, 0, 0,
|
||||
BUS_PASS_RESOURCE);
|
||||
DRIVER_MODULE(adb, pmu, adb_driver, adb_devclass, 0, 0);
|
||||
|
||||
static int pmuextint_probe(device_t);
|
||||
@ -175,7 +176,8 @@ static driver_t pmuextint_driver = {
|
||||
|
||||
static devclass_t pmuextint_devclass;
|
||||
|
||||
DRIVER_MODULE(pmuextint, macgpio, pmuextint_driver, pmuextint_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(pmuextint, macgpio, pmuextint_driver, pmuextint_devclass,
|
||||
0, 0, BUS_PASS_RESOURCE);
|
||||
|
||||
/* Make sure uhid is loaded, as it turns off some of the ADB emulation */
|
||||
MODULE_DEPEND(pmu, usb, 1, 1, 1);
|
||||
|
@ -630,7 +630,8 @@ static driver_t doorbell_driver = {
|
||||
|
||||
static devclass_t doorbell_devclass;
|
||||
|
||||
DRIVER_MODULE(smudoorbell, macgpio, doorbell_driver, doorbell_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(smudoorbell, macgpio, doorbell_driver, doorbell_devclass,
|
||||
0, 0, BUS_PASS_SUPPORTDEV);
|
||||
|
||||
static int
|
||||
doorbell_probe(device_t dev)
|
||||
|
@ -146,7 +146,8 @@ static devclass_t unin_chip_devclass;
|
||||
*/
|
||||
static device_t unin_chip;
|
||||
|
||||
DRIVER_MODULE(unin, ofwbus, unin_chip_driver, unin_chip_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(unin, ofwbus, unin_chip_driver, unin_chip_devclass, 0, 0,
|
||||
BUS_PASS_BUS);
|
||||
|
||||
/*
|
||||
* Add an interrupt to the dev's resource list if present
|
||||
|
@ -101,7 +101,8 @@ static devclass_t uninorth_devclass;
|
||||
|
||||
DEFINE_CLASS_1(pcib, uninorth_driver, uninorth_methods,
|
||||
sizeof(struct uninorth_softc), ofw_pci_driver);
|
||||
DRIVER_MODULE(uninorth, ofwbus, uninorth_driver, uninorth_devclass, 0, 0);
|
||||
EARLY_DRIVER_MODULE(uninorth, ofwbus, uninorth_driver, uninorth_devclass, 0, 0,
|
||||
BUS_PASS_BUS);
|
||||
|
||||
static int
|
||||
uninorth_probe(device_t dev)
|
||||
|
Loading…
Reference in New Issue
Block a user