[Skiboot] [PATCH] FSP: Handle DPO initiated CEC shutdown with FSP in RR
Ananth N Mavinakayanahalli
ananth at in.ibm.com
Fri Nov 6 20:40:44 AEDT 2015
In a scenario where the DPO has been initiated, but the FSP then went into
reset before the CEC power down came in, OPAL may not give up the link since
it may never see the PSI interrupt. So, if we are in dpo_pending and an FSP
reset is detected via the DISR, give up the PSI link voluntarily.
Tested-by: Vipin K Parashar <vipin at linux.vnet.ibm.com>
Signed-off-by: Ananth N Mavinakayanahalli <ananth at in.ibm.com>
---
hw/fsp/fsp-dpo.c | 2 +-
hw/fsp/fsp.c | 20 +++++++++++++++++---
include/fsp.h | 1 +
3 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/hw/fsp/fsp-dpo.c b/hw/fsp/fsp-dpo.c
index 8c7c296..f6fadc5 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 ab625a5..b53c3f0 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 4e247cc..a61bd58 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);
More information about the Skiboot
mailing list