[Skiboot] [PATCH] FSP: Handle DPO initiated CEC shutdown with FSP in RR

Ananth N Mavinakayanahalli ananth at in.ibm.com
Fri Nov 6 21:41:53 AEDT 2015


On Fri, Nov 06, 2015 at 04:05:16PM +0530, Neelesh Gupta wrote:
> Hi Ananth,
> 
> On 11/06/2015 03:10 PM, Ananth N Mavinakayanahalli wrote:
> >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);
> >+		}
> 
> Instead of exporting the dpo variable.. can we register a dpo client
> for RR_EVENT
> with moving this logic there and the function just below
> 'fsp_start_rr()' will do the
> rest ...

I thought of that possibility, but its already too late -- fsp->iopath
is set to -1, and from struct fsp, there will be no way to get to struct
psi. Hence this special case.

Ananth



More information about the Skiboot mailing list