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

powerpc/eeh: Cleanup EEH_POSTPONED_PROBE

Currently a flag, EEH_POSTPONED_PROBE, is used to prevent an incorrect
message "EEH: No capable adapters found" from being displayed during
the boot of powernv systems.

It is necessary because, on powernv, the call to eeh_probe_devices()
made from eeh_init() is too early and EEH can't yet be enabled. A
second call is made later from eeh_pnv_post_init(), which succeeds.

(On pseries, the first call succeeds because PCI devices are set up
early enough and no second call is made.)

This can be simplified by moving the early call to eeh_probe_devices()
from eeh_init() (where it's seen by both platforms) to
pSeries_final_fixup(), so that each platform only calls
eeh_probe_devices() once, at a point where it can succeed.
This is slightly later in the boot sequence, but but still early
enough and it is now in the same place in the sequence for both
platforms (the pcibios_fixup hook).

The display of the message can be cleaned up as well, by moving it
into eeh_probe_devices().
Signed-off-by: default avatarSam Bobroff <sbobroff@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 473af09b
...@@ -43,7 +43,6 @@ struct pci_dn; ...@@ -43,7 +43,6 @@ struct pci_dn;
#define EEH_VALID_PE_ZERO 0x10 /* PE#0 is valid */ #define EEH_VALID_PE_ZERO 0x10 /* PE#0 is valid */
#define EEH_ENABLE_IO_FOR_LOG 0x20 /* Enable IO for log */ #define EEH_ENABLE_IO_FOR_LOG 0x20 /* Enable IO for log */
#define EEH_EARLY_DUMP_LOG 0x40 /* Dump log immediately */ #define EEH_EARLY_DUMP_LOG 0x40 /* Dump log immediately */
#define EEH_POSTPONED_PROBE 0x80 /* Powernv may postpone device probe */
/* /*
* Delay for PE reset, all in ms * Delay for PE reset, all in ms
......
...@@ -1041,6 +1041,11 @@ void eeh_probe_devices(void) ...@@ -1041,6 +1041,11 @@ void eeh_probe_devices(void)
pdn = hose->pci_data; pdn = hose->pci_data;
traverse_pci_dn(pdn, eeh_ops->probe, NULL); 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");
} }
/** /**
...@@ -1084,18 +1089,7 @@ static int eeh_init(void) ...@@ -1084,18 +1089,7 @@ static int eeh_init(void)
eeh_dev_phb_init_dynamic(hose); eeh_dev_phb_init_dynamic(hose);
/* Initialize EEH event */ /* Initialize EEH event */
ret = eeh_event_init(); return eeh_event_init();
if (ret)
return ret;
eeh_probe_devices();
if (eeh_enabled())
pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n");
else if (!eeh_has_flag(EEH_POSTPONED_PROBE))
pr_info("EEH: No capable adapters found\n");
return ret;
} }
core_initcall_sync(eeh_init); core_initcall_sync(eeh_init);
......
...@@ -223,14 +223,6 @@ int pnv_eeh_post_init(void) ...@@ -223,14 +223,6 @@ int pnv_eeh_post_init(void)
eeh_probe_devices(); eeh_probe_devices();
eeh_addr_cache_build(); eeh_addr_cache_build();
if (eeh_has_flag(EEH_POSTPONED_PROBE)) {
eeh_clear_flag(EEH_POSTPONED_PROBE);
if (eeh_enabled())
pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n");
else
pr_info("EEH: No capable adapters found\n");
}
/* 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));
if (eeh_event_irq < 0) { if (eeh_event_irq < 0) {
...@@ -391,12 +383,6 @@ static void *pnv_eeh_probe(struct pci_dn *pdn, void *data) ...@@ -391,12 +383,6 @@ static void *pnv_eeh_probe(struct pci_dn *pdn, void *data)
if ((pdn->class_code >> 8) == PCI_CLASS_BRIDGE_ISA) if ((pdn->class_code >> 8) == PCI_CLASS_BRIDGE_ISA)
return NULL; return NULL;
/* Skip if we haven't probed yet */
if (phb->ioda.pe_rmap[config_addr] == IODA_INVALID_PE) {
eeh_add_flag(EEH_POSTPONED_PROBE);
return NULL;
}
/* Initialize eeh device */ /* Initialize eeh device */
edev->class_code = pdn->class_code; edev->class_code = pdn->class_code;
edev->mode &= 0xFFFFFF00; edev->mode &= 0xFFFFFF00;
......
...@@ -239,6 +239,7 @@ void __init pSeries_final_fixup(void) ...@@ -239,6 +239,7 @@ void __init pSeries_final_fixup(void)
{ {
pSeries_request_regions(); pSeries_request_regions();
eeh_probe_devices();
eeh_addr_cache_build(); eeh_addr_cache_build();
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
......
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