mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-24 05:01:03 +02:00
powerpc/eeh: Move EEH initialisation to an arch initcall
The initialisation of EEH mostly happens in a core_initcall_sync initcall, followed by registering a bus notifier later on in an arch_initcall. Anything involving initcall dependecies is mostly incomprehensible unless you've spent a while staring at code so here's the full sequence: ppc_md.setup_arch <-- pci_controllers are created here ...time passes... core_initcall <-- pci_dns are created from DT nodes core_initcall_sync <-- platforms call eeh_init() postcore_initcall <-- PCI bus type is registered postcore_initcall_sync arch_initcall <-- EEH pci_bus notifier registered subsys_initcall <-- PHBs are scanned here There's no real requirement to do the EEH setup at the core_initcall_sync level. It just needs to be done after pci_dn's are created and before we start scanning PHBs. Simplify the flow a bit by moving the platform EEH inititalisation to an arch_initcall so we can fold the bus notifier registration into eeh_init(). Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200918093050.37344-5-oohall@gmail.com
This commit is contained in:
committed by
Michael Ellerman
parent
5d69e46a21
commit
395ee2a2a1
@@ -940,41 +940,6 @@ static struct notifier_block eeh_reboot_nb = {
|
|||||||
.notifier_call = eeh_reboot_notifier,
|
.notifier_call = eeh_reboot_notifier,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* eeh_init - System wide EEH initialization
|
|
||||||
*
|
|
||||||
* It's the platform's job to call this from an arch_initcall().
|
|
||||||
*/
|
|
||||||
int eeh_init(struct eeh_ops *ops)
|
|
||||||
{
|
|
||||||
struct pci_controller *hose, *tmp;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
/* the platform should only initialise EEH once */
|
|
||||||
if (WARN_ON(eeh_ops))
|
|
||||||
return -EEXIST;
|
|
||||||
if (WARN_ON(!ops))
|
|
||||||
return -ENOENT;
|
|
||||||
eeh_ops = ops;
|
|
||||||
|
|
||||||
/* Register reboot notifier */
|
|
||||||
ret = register_reboot_notifier(&eeh_reboot_nb);
|
|
||||||
if (ret) {
|
|
||||||
pr_warn("%s: Failed to register notifier (%d)\n",
|
|
||||||
__func__, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize PHB PEs */
|
|
||||||
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
|
|
||||||
eeh_phb_pe_create(hose);
|
|
||||||
|
|
||||||
eeh_addr_cache_init();
|
|
||||||
|
|
||||||
/* Initialize EEH event */
|
|
||||||
return eeh_event_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eeh_device_notifier(struct notifier_block *nb,
|
static int eeh_device_notifier(struct notifier_block *nb,
|
||||||
unsigned long action, void *data)
|
unsigned long action, void *data)
|
||||||
{
|
{
|
||||||
@@ -999,12 +964,47 @@ static struct notifier_block eeh_device_nb = {
|
|||||||
.notifier_call = eeh_device_notifier,
|
.notifier_call = eeh_device_notifier,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init int eeh_set_bus_notifier(void)
|
/**
|
||||||
|
* eeh_init - System wide EEH initialization
|
||||||
|
*
|
||||||
|
* It's the platform's job to call this from an arch_initcall().
|
||||||
|
*/
|
||||||
|
int eeh_init(struct eeh_ops *ops)
|
||||||
{
|
{
|
||||||
bus_register_notifier(&pci_bus_type, &eeh_device_nb);
|
struct pci_controller *hose, *tmp;
|
||||||
return 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
/* the platform should only initialise EEH once */
|
||||||
|
if (WARN_ON(eeh_ops))
|
||||||
|
return -EEXIST;
|
||||||
|
if (WARN_ON(!ops))
|
||||||
|
return -ENOENT;
|
||||||
|
eeh_ops = ops;
|
||||||
|
|
||||||
|
/* Register reboot notifier */
|
||||||
|
ret = register_reboot_notifier(&eeh_reboot_nb);
|
||||||
|
if (ret) {
|
||||||
|
pr_warn("%s: Failed to register reboot notifier (%d)\n",
|
||||||
|
__func__, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = bus_register_notifier(&pci_bus_type, &eeh_device_nb);
|
||||||
|
if (ret) {
|
||||||
|
pr_warn("%s: Failed to register bus notifier (%d)\n",
|
||||||
|
__func__, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize PHB PEs */
|
||||||
|
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
|
||||||
|
eeh_phb_pe_create(hose);
|
||||||
|
|
||||||
|
eeh_addr_cache_init();
|
||||||
|
|
||||||
|
/* Initialize EEH event */
|
||||||
|
return eeh_event_init();
|
||||||
}
|
}
|
||||||
arch_initcall(eeh_set_bus_notifier);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eeh_probe_device() - Perform EEH initialization for the indicated pci device
|
* eeh_probe_device() - Perform EEH initialization for the indicated pci device
|
||||||
|
@@ -1721,4 +1721,4 @@ static int __init eeh_powernv_init(void)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
machine_core_initcall_sync(powernv, eeh_powernv_init);
|
machine_arch_initcall(powernv, eeh_powernv_init);
|
||||||
|
@@ -985,4 +985,4 @@ static int __init eeh_pseries_init(void)
|
|||||||
ret);
|
ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
machine_core_initcall_sync(pseries, eeh_pseries_init);
|
machine_arch_initcall(pseries, eeh_pseries_init);
|
||||||
|
Reference in New Issue
Block a user