aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorGavin Shan <gwshan@linux.vnet.ibm.com>2014-10-01 03:07:51 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2014-10-14 20:27:19 -0400
commitd2cfbcd7c8136bc4d944eb64f7f0479dd2b129b8 (patch)
tree3443a50744df70b7d15a79d0cf1048b75d290682 /arch/powerpc
parent8a6b3710ccc33da1fd5c85144ad3db01c4457552 (diff)
powerpc/powernv: Drop config requests in EEH accessors
It's bad idea to access the PCI config registers of the adapters, which is experiencing reset. It leads to recursive EEH error without exception. The patch drops PCI config requests in EEH accessors if the PE has been marked to accept PCI config requests, for example during PE reseet time. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/platforms/powernv/eeh-powernv.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c
index 3e89cbf55885..04e42f78a37a 100644
--- a/arch/powerpc/platforms/powernv/eeh-powernv.c
+++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
@@ -383,6 +383,39 @@ static int powernv_eeh_err_inject(struct eeh_pe *pe, int type, int func,
383 return ret; 383 return ret;
384} 384}
385 385
386static inline bool powernv_eeh_cfg_blocked(struct device_node *dn)
387{
388 struct eeh_dev *edev = of_node_to_eeh_dev(dn);
389
390 if (!edev || !edev->pe)
391 return false;
392
393 if (edev->pe->state & EEH_PE_CFG_BLOCKED)
394 return true;
395
396 return false;
397}
398
399static int powernv_eeh_read_config(struct device_node *dn,
400 int where, int size, u32 *val)
401{
402 if (powernv_eeh_cfg_blocked(dn)) {
403 *val = 0xFFFFFFFF;
404 return PCIBIOS_SET_FAILED;
405 }
406
407 return pnv_pci_cfg_read(dn, where, size, val);
408}
409
410static int powernv_eeh_write_config(struct device_node *dn,
411 int where, int size, u32 val)
412{
413 if (powernv_eeh_cfg_blocked(dn))
414 return PCIBIOS_SET_FAILED;
415
416 return pnv_pci_cfg_write(dn, where, size, val);
417}
418
386/** 419/**
387 * powernv_eeh_next_error - Retrieve next EEH error to handle 420 * powernv_eeh_next_error - Retrieve next EEH error to handle
388 * @pe: Affected PE 421 * @pe: Affected PE
@@ -440,8 +473,8 @@ static struct eeh_ops powernv_eeh_ops = {
440 .get_log = powernv_eeh_get_log, 473 .get_log = powernv_eeh_get_log,
441 .configure_bridge = powernv_eeh_configure_bridge, 474 .configure_bridge = powernv_eeh_configure_bridge,
442 .err_inject = powernv_eeh_err_inject, 475 .err_inject = powernv_eeh_err_inject,
443 .read_config = pnv_pci_cfg_read, 476 .read_config = powernv_eeh_read_config,
444 .write_config = pnv_pci_cfg_write, 477 .write_config = powernv_eeh_write_config,
445 .next_error = powernv_eeh_next_error, 478 .next_error = powernv_eeh_next_error,
446 .restore_config = powernv_eeh_restore_config 479 .restore_config = powernv_eeh_restore_config
447}; 480};