Commit c44e4cca authored by Sam Bobroff's avatar Sam Bobroff Committed by Michael Ellerman

powerpc/eeh: Refactor around eeh_probe_devices()

Now that EEH support for all devices (on PowerNV and pSeries) is
provided by the pcibios bus add device hooks, eeh_probe_devices() and
eeh_addr_cache_build() are redundant and can be removed.

Move the EEH enabled message into it's own function so that it can be
called from multiple places.

Note that previously on pSeries, useless EEH sysfs files were created
for some devices that did not have EEH support and this change
prevents them from being created.
Signed-off-by: default avatarSam Bobroff <sbobroff@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/33b0a6339d5ac88693de092d6fba984f2a5add66.1565930772.git.sbobroff@linux.ibm.com
parent b905f8cd
...@@ -269,13 +269,12 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe); ...@@ -269,13 +269,12 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe);
struct eeh_dev *eeh_dev_init(struct pci_dn *pdn); struct eeh_dev *eeh_dev_init(struct pci_dn *pdn);
void eeh_dev_phb_init_dynamic(struct pci_controller *phb); void eeh_dev_phb_init_dynamic(struct pci_controller *phb);
void eeh_probe_devices(void); void eeh_show_enabled(void);
int __init eeh_ops_register(struct eeh_ops *ops); int __init eeh_ops_register(struct eeh_ops *ops);
int __exit eeh_ops_unregister(const char *name); int __exit eeh_ops_unregister(const char *name);
int eeh_check_failure(const volatile void __iomem *token); int eeh_check_failure(const volatile void __iomem *token);
int eeh_dev_check_failure(struct eeh_dev *edev); int eeh_dev_check_failure(struct eeh_dev *edev);
void eeh_addr_cache_init(void); void eeh_addr_cache_init(void);
void eeh_addr_cache_build(void);
void eeh_add_device_early(struct pci_dn *); void eeh_add_device_early(struct pci_dn *);
void eeh_add_device_tree_early(struct pci_dn *); void eeh_add_device_tree_early(struct pci_dn *);
void eeh_add_device_late(struct pci_dev *); void eeh_add_device_late(struct pci_dev *);
...@@ -317,7 +316,7 @@ static inline bool eeh_enabled(void) ...@@ -317,7 +316,7 @@ static inline bool eeh_enabled(void)
return false; return false;
} }
static inline void eeh_probe_devices(void) { } static inline void eeh_show_enabled(void) { }
static inline void *eeh_dev_init(struct pci_dn *pdn, void *data) static inline void *eeh_dev_init(struct pci_dn *pdn, void *data)
{ {
...@@ -335,8 +334,6 @@ static inline int eeh_check_failure(const volatile void __iomem *token) ...@@ -335,8 +334,6 @@ static inline int eeh_check_failure(const volatile void __iomem *token)
static inline void eeh_addr_cache_init(void) { } static inline void eeh_addr_cache_init(void) { }
static inline void eeh_addr_cache_build(void) { }
static inline void eeh_add_device_early(struct pci_dn *pdn) { } static inline void eeh_add_device_early(struct pci_dn *pdn) { }
static inline void eeh_add_device_tree_early(struct pci_dn *pdn) { } static inline void eeh_add_device_tree_early(struct pci_dn *pdn) { }
......
...@@ -150,6 +150,16 @@ static int __init eeh_setup(char *str) ...@@ -150,6 +150,16 @@ static int __init eeh_setup(char *str)
} }
__setup("eeh=", eeh_setup); __setup("eeh=", eeh_setup);
void eeh_show_enabled(void)
{
if (eeh_has_flag(EEH_FORCE_DISABLED))
pr_info("EEH: Recovery disabled by kernel parameter.\n");
else if (eeh_has_flag(EEH_ENABLED))
pr_info("EEH: Capable adapter found: recovery enabled.\n");
else
pr_info("EEH: No capable adapters found: recovery disabled.\n");
}
/* /*
* This routine captures assorted PCI configuration space data * This routine captures assorted PCI configuration space data
* for the indicated PCI device, and puts them into a buffer * for the indicated PCI device, and puts them into a buffer
...@@ -1063,23 +1073,6 @@ static struct notifier_block eeh_reboot_nb = { ...@@ -1063,23 +1073,6 @@ static struct notifier_block eeh_reboot_nb = {
.notifier_call = eeh_reboot_notifier, .notifier_call = eeh_reboot_notifier,
}; };
void eeh_probe_devices(void)
{
struct pci_controller *hose, *tmp;
struct pci_dn *pdn;
/* Enable EEH for all adapters */
list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
pdn = hose->pci_data;
traverse_pci_dn(pdn, eeh_ops->probe, NULL);
}
if (eeh_enabled())
pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n");
else
pr_info("EEH: No capable adapters found\n");
}
/** /**
* eeh_init - EEH initialization * eeh_init - EEH initialization
* *
......
...@@ -268,38 +268,6 @@ void eeh_addr_cache_init(void) ...@@ -268,38 +268,6 @@ void eeh_addr_cache_init(void)
spin_lock_init(&pci_io_addr_cache_root.piar_lock); spin_lock_init(&pci_io_addr_cache_root.piar_lock);
} }
/**
* eeh_addr_cache_build - Build a cache of I/O addresses
*
* Build a cache of pci i/o addresses. This cache will be used to
* find the pci device that corresponds to a given address.
* This routine scans all pci busses to build the cache.
* Must be run late in boot process, after the pci controllers
* have been scanned for devices (after all device resources are known).
*/
void eeh_addr_cache_build(void)
{
struct pci_dn *pdn;
struct eeh_dev *edev;
struct pci_dev *dev = NULL;
for_each_pci_dev(dev) {
pdn = pci_get_pdn_by_devfn(dev->bus, dev->devfn);
if (!pdn)
continue;
edev = pdn_to_eeh_dev(pdn);
if (!edev)
continue;
dev->dev.archdata.edev = edev;
edev->pdev = dev;
eeh_addr_cache_insert_dev(dev);
eeh_sysfs_add_device(dev);
}
}
static int eeh_addr_cache_show(struct seq_file *s, void *v) static int eeh_addr_cache_show(struct seq_file *s, void *v)
{ {
struct pci_io_addr_range *piar; struct pci_io_addr_range *piar;
......
...@@ -229,9 +229,7 @@ int pnv_eeh_post_init(void) ...@@ -229,9 +229,7 @@ int pnv_eeh_post_init(void)
struct pnv_phb *phb; struct pnv_phb *phb;
int ret = 0; int ret = 0;
/* Probe devices & build address cache */ eeh_show_enabled();
eeh_probe_devices();
eeh_addr_cache_build();
/* Register OPAL event notifier */ /* Register OPAL event notifier */
eeh_event_irq = opal_event_request(ilog2(OPAL_EVENT_PCI_ERROR)); eeh_event_irq = opal_event_request(ilog2(OPAL_EVENT_PCI_ERROR));
......
...@@ -229,8 +229,7 @@ void __init pSeries_final_fixup(void) ...@@ -229,8 +229,7 @@ void __init pSeries_final_fixup(void)
pSeries_request_regions(); pSeries_request_regions();
eeh_probe_devices(); eeh_show_enabled();
eeh_addr_cache_build();
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
ppc_md.pcibios_sriov_enable = pseries_pcibios_sriov_enable; ppc_md.pcibios_sriov_enable = pseries_pcibios_sriov_enable;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment