aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGavin Shan <shangw@linux.vnet.ibm.com>2014-01-03 04:47:12 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2014-01-14 21:46:46 -0500
commit1d350544d5bf17d835d2850004c64ca51235c771 (patch)
treee6d2d0176e0b7453bd39898c6f4d30b0e182f162
parent8184616f6fcfc98f0ebf083cbf6a43e5efe54e8a (diff)
powerpc/eeh: Add restore_config operation
After reset on the specific PE or PHB, we never configure AER correctly on PowerNV platform. We needn't care it on pSeries platform. The patch introduces additional EEH operation eeh_ops:: restore_config() so that we have chance to configure AER correctly for PowerNV platform. Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/include/asm/eeh.h1
-rw-r--r--arch/powerpc/kernel/eeh_pe.c3
-rw-r--r--arch/powerpc/platforms/powernv/eeh-powernv.c3
-rw-r--r--arch/powerpc/platforms/pseries/eeh_pseries.c4
4 files changed, 9 insertions, 2 deletions
diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h
index d3e5e9bc8f94..7f8adc848cd6 100644
--- a/arch/powerpc/include/asm/eeh.h
+++ b/arch/powerpc/include/asm/eeh.h
@@ -157,6 +157,7 @@ struct eeh_ops {
157 int (*read_config)(struct device_node *dn, int where, int size, u32 *val); 157 int (*read_config)(struct device_node *dn, int where, int size, u32 *val);
158 int (*write_config)(struct device_node *dn, int where, int size, u32 val); 158 int (*write_config)(struct device_node *dn, int where, int size, u32 val);
159 int (*next_error)(struct eeh_pe **pe); 159 int (*next_error)(struct eeh_pe **pe);
160 int (*restore_config)(struct device_node *dn);
160}; 161};
161 162
162extern struct eeh_ops *eeh_ops; 163extern struct eeh_ops *eeh_ops;
diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c
index 1feccd64f955..f0c353fa655a 100644
--- a/arch/powerpc/kernel/eeh_pe.c
+++ b/arch/powerpc/kernel/eeh_pe.c
@@ -736,6 +736,9 @@ static void *eeh_restore_one_device_bars(void *data, void *flag)
736 else 736 else
737 eeh_restore_device_bars(edev, dn); 737 eeh_restore_device_bars(edev, dn);
738 738
739 if (eeh_ops->restore_config)
740 eeh_ops->restore_config(dn);
741
739 return NULL; 742 return NULL;
740} 743}
741 744
diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c
index 73b981438cc5..ab91e6a34afa 100644
--- a/arch/powerpc/platforms/powernv/eeh-powernv.c
+++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
@@ -359,7 +359,8 @@ static struct eeh_ops powernv_eeh_ops = {
359 .configure_bridge = powernv_eeh_configure_bridge, 359 .configure_bridge = powernv_eeh_configure_bridge,
360 .read_config = pnv_pci_cfg_read, 360 .read_config = pnv_pci_cfg_read,
361 .write_config = pnv_pci_cfg_write, 361 .write_config = pnv_pci_cfg_write,
362 .next_error = powernv_eeh_next_error 362 .next_error = powernv_eeh_next_error,
363 .restore_config = NULL
363}; 364};
364 365
365/** 366/**
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c
index ccb633e077b1..9ef3cc8ebc11 100644
--- a/arch/powerpc/platforms/pseries/eeh_pseries.c
+++ b/arch/powerpc/platforms/pseries/eeh_pseries.c
@@ -689,7 +689,9 @@ static struct eeh_ops pseries_eeh_ops = {
689 .get_log = pseries_eeh_get_log, 689 .get_log = pseries_eeh_get_log,
690 .configure_bridge = pseries_eeh_configure_bridge, 690 .configure_bridge = pseries_eeh_configure_bridge,
691 .read_config = pseries_eeh_read_config, 691 .read_config = pseries_eeh_read_config,
692 .write_config = pseries_eeh_write_config 692 .write_config = pseries_eeh_write_config,
693 .next_error = NULL,
694 .restore_config = NULL
693}; 695};
694 696
695/** 697/**