summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStewart Smith <stewart@linux.vnet.ibm.com>2015-11-12 16:07:33 +1100
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-11-12 16:07:33 +1100
commitf8e7d23dca7928af8305a43a3348796174cbfc9d (patch)
tree938567d91bd05c3fd9b1920b43778bdd5b8f3031
parent881455a1b62fd78ac1e513de1aad001827578157 (diff)
parent42d5d04758b4aa30e83e741a489f25592d4ad896 (diff)
downloadtalos-skiboot-f8e7d23dca7928af8305a43a3348796174cbfc9d.tar.gz
talos-skiboot-f8e7d23dca7928af8305a43a3348796174cbfc9d.zip
Merge branch 'stable'
-rw-r--r--hw/fsp/fsp-dpo.c2
-rw-r--r--hw/fsp/fsp.c20
-rw-r--r--include/fsp.h1
3 files changed, 19 insertions, 4 deletions
diff --git a/hw/fsp/fsp-dpo.c b/hw/fsp/fsp-dpo.c
index 8c7c296c..f6fadc5d 100644
--- a/hw/fsp/fsp-dpo.c
+++ b/hw/fsp/fsp-dpo.c
@@ -29,7 +29,7 @@
#define DPO_CMD_SGN_BYTE1 0x20 /* Byte[1] signature */
#define DPO_TIMEOUT 2700 /* 45 minutes in seconds */
-static bool fsp_dpo_pending;
+bool fsp_dpo_pending;
static unsigned long fsp_dpo_init_tb;
/*
diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c
index ab625a55..b53c3f00 100644
--- a/hw/fsp/fsp.c
+++ b/hw/fsp/fsp.c
@@ -666,9 +666,23 @@ static void fsp_handle_errors(struct fsp *fsp)
if (fsp->state == fsp_mbx_rr)
return;
- prlog(PR_NOTICE, "FSP #%d: FSP in Reset."
- " Waiting for PSI interrupt\n",
- fsp->index);
+ if (fsp_dpo_pending) {
+ /*
+ * If we are about to process a reset when DPO
+ * is pending, its possible that the host has
+ * gone down, and OPAL is on its way down and
+ * hence will not see the subsequent PSI interrupt.
+ * So, just give up the link here.
+ */
+ prlog(PR_NOTICE, "FSP #%d: FSP reset with DPO pending."
+ " Giving up PSI link\n",
+ fsp->index);
+ psi_disable_link(psi);
+ } else {
+ prlog(PR_NOTICE, "FSP #%d: FSP in Reset."
+ " Waiting for PSI interrupt\n",
+ fsp->index);
+ }
fsp_start_rr(fsp);
}
diff --git a/include/fsp.h b/include/fsp.h
index 4e247cc6..a61bd58e 100644
--- a/include/fsp.h
+++ b/include/fsp.h
@@ -823,6 +823,7 @@ extern void fsp_epow_init(void);
/* DPO */
extern void fsp_dpo_init(void);
+extern bool fsp_dpo_pending;
/* Chiptod */
extern void fsp_chiptod_init(void);
OpenPOWER on IntegriCloud