aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms
diff options
context:
space:
mode:
authorGavin Shan <shangw@linux.vnet.ibm.com>2012-02-27 15:03:54 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-03-08 19:09:36 -0500
commite2af155c2aea0e705ed4ef33aedc25e50a788be1 (patch)
treeedb7cbe707163defd874a13c1a1f3aa97100da35 /arch/powerpc/platforms
parentaa1e6374ae11788752535ae0c8c6395c9cad1393 (diff)
powerpc/eeh: pseries platform EEH initialization
The platform specific EEH operations have been abstracted by struct eeh_ops. The individual platroms, including pSeries, needs doing necessary initialization before the platform dependent EEH operations work properly. The patch is addressing that and do necessary platform initialization for pSeries platform. More specificly, it will figure out the tokens of EEH related RTAS calls. Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms')
-rw-r--r--arch/powerpc/platforms/pseries/eeh.c12
-rw-r--r--arch/powerpc/platforms/pseries/eeh_pseries.c55
2 files changed, 67 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c
index b0e3fb0b32a5..bb6de6c97911 100644
--- a/arch/powerpc/platforms/pseries/eeh.c
+++ b/arch/powerpc/platforms/pseries/eeh.c
@@ -1279,6 +1279,18 @@ void __init eeh_init(void)
1279{ 1279{
1280 struct device_node *phb, *np; 1280 struct device_node *phb, *np;
1281 struct eeh_early_enable_info info; 1281 struct eeh_early_enable_info info;
1282 int ret;
1283
1284 /* call platform initialization function */
1285 if (!eeh_ops) {
1286 pr_warning("%s: Platform EEH operation not found\n",
1287 __func__);
1288 return;
1289 } else if ((ret = eeh_ops->init())) {
1290 pr_warning("%s: Failed to call platform init function (%d)\n",
1291 __func__, ret);
1292 return;
1293 }
1282 1294
1283 raw_spin_lock_init(&confirm_error_lock); 1295 raw_spin_lock_init(&confirm_error_lock);
1284 spin_lock_init(&slot_errbuf_lock); 1296 spin_lock_init(&slot_errbuf_lock);
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c
index 61a9050ba969..1a9410a2d452 100644
--- a/arch/powerpc/platforms/pseries/eeh_pseries.c
+++ b/arch/powerpc/platforms/pseries/eeh_pseries.c
@@ -45,6 +45,17 @@
45#include <asm/ppc-pci.h> 45#include <asm/ppc-pci.h>
46#include <asm/rtas.h> 46#include <asm/rtas.h>
47 47
48/* RTAS tokens */
49static int ibm_set_eeh_option;
50static int ibm_set_slot_reset;
51static int ibm_read_slot_reset_state;
52static int ibm_read_slot_reset_state2;
53static int ibm_slot_error_detail;
54static int ibm_get_config_addr_info;
55static int ibm_get_config_addr_info2;
56static int ibm_configure_bridge;
57static int ibm_configure_pe;
58
48/** 59/**
49 * pseries_eeh_init - EEH platform dependent initialization 60 * pseries_eeh_init - EEH platform dependent initialization
50 * 61 *
@@ -52,6 +63,50 @@
52 */ 63 */
53static int pseries_eeh_init(void) 64static int pseries_eeh_init(void)
54{ 65{
66 /* figure out EEH RTAS function call tokens */
67 ibm_set_eeh_option = rtas_token("ibm,set-eeh-option");
68 ibm_set_slot_reset = rtas_token("ibm,set-slot-reset");
69 ibm_read_slot_reset_state2 = rtas_token("ibm,read-slot-reset-state2");
70 ibm_read_slot_reset_state = rtas_token("ibm,read-slot-reset-state");
71 ibm_slot_error_detail = rtas_token("ibm,slot-error-detail");
72 ibm_get_config_addr_info2 = rtas_token("ibm,get-config-addr-info2");
73 ibm_get_config_addr_info = rtas_token("ibm,get-config-addr-info");
74 ibm_configure_pe = rtas_token("ibm,configure-pe");
75 ibm_configure_bridge = rtas_token ("ibm,configure-bridge");
76
77 /* necessary sanity check */
78 if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) {
79 pr_warning("%s: RTAS service <ibm,set-eeh-option> invalid\n",
80 __func__);
81 return -EINVAL;
82 } else if (ibm_set_slot_reset == RTAS_UNKNOWN_SERVICE) {
83 pr_warning("%s: RTAS service <ibm, set-slot-reset> invalid\n",
84 __func__);
85 return -EINVAL;
86 } else if (ibm_read_slot_reset_state2 == RTAS_UNKNOWN_SERVICE &&
87 ibm_read_slot_reset_state == RTAS_UNKNOWN_SERVICE) {
88 pr_warning("%s: RTAS service <ibm,read-slot-reset-state2> and "
89 "<ibm,read-slot-reset-state> invalid\n",
90 __func__);
91 return -EINVAL;
92 } else if (ibm_slot_error_detail == RTAS_UNKNOWN_SERVICE) {
93 pr_warning("%s: RTAS service <ibm,slot-error-detail> invalid\n",
94 __func__);
95 return -EINVAL;
96 } else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE &&
97 ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) {
98 pr_warning("%s: RTAS service <ibm,get-config-addr-info2> and "
99 "<ibm,get-config-addr-info> invalid\n",
100 __func__);
101 return -EINVAL;
102 } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE &&
103 ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) {
104 pr_warning("%s: RTAS service <ibm,configure-pe> and "
105 "<ibm,configure-bridge> invalid\n",
106 __func__);
107 return -EINVAL;
108 }
109
55 return 0; 110 return 0;
56} 111}
57 112