mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
powerpc/pci: Move PHB discovery for PCI_DN using platforms
Make powernv, pseries, powermac and maple use ppc_mc.discover_phbs. These platforms need to be done together because they all depend on pci_dn's being created from the DT. The pci_dn contains a pointer to the relevant pci_controller so they need to be created after the pci_controller structures are available, but before PCI devices are scanned. Currently this ordering is provided by initcalls and the sequence is: 1. PHBs are discovered (setup_arch) (early boot, pre-initcalls) 2. pci_dn are created from the unflattended DT (core initcall) 3. PHBs are scanned pcibios_init() (subsys initcall) The new ppc_md.discover_phbs() function is also a core_initcall so we can't guarantee ordering between the creation of pci_controllers and the creation of pci_dn's which require a pci_controller. We could use the postcore, or core_sync initcall levels, but it's cleaner to just move the pci_dn setup into the per-PHB inits which occur inside of .discover_phb() for these platforms. This brings the boot-time path in line with the PHB hotplug path that is used for pseries DLPAR operations too. Signed-off-by: Oliver O'Halloran <oohall@gmail.com> [mpe: Squash powermac & maple in to avoid breakage those platforms, convert memblock allocs to use kmalloc to avoid warnings] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20201103043523.916109-2-oohall@gmail.com
This commit is contained in:
committed by
Michael Ellerman
parent
5537fcb319
commit
fbbefb3202
@@ -481,28 +481,6 @@ void pci_devs_phb_init_dynamic(struct pci_controller *phb)
|
||||
pci_traverse_device_nodes(dn, add_pdn, phb);
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_devs_phb_init - Initialize phbs and pci devs under them.
|
||||
*
|
||||
* This routine walks over all phb's (pci-host bridges) on the
|
||||
* system, and sets up assorted pci-related structures
|
||||
* (including pci info in the device node structs) for each
|
||||
* pci device found underneath. This routine runs once,
|
||||
* early in the boot sequence.
|
||||
*/
|
||||
static int __init pci_devs_phb_init(void)
|
||||
{
|
||||
struct pci_controller *phb, *tmp;
|
||||
|
||||
/* This must be done first so the device nodes have valid pci info! */
|
||||
list_for_each_entry_safe(phb, tmp, &hose_list, list_node)
|
||||
pci_devs_phb_init_dynamic(phb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
core_initcall(pci_devs_phb_init);
|
||||
|
||||
static void pci_dev_pdn_setup(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dn *pdn;
|
||||
|
||||
Reference in New Issue
Block a user