[Skiboot] [RFC] phb4: Wait for PRD to reset the CAPP Fir during recovery
Frederic Barrat
fbarrat at linux.ibm.com
Wed Oct 17 02:43:35 AEDT 2018
Le 16/10/2018 à 13:32, Vaibhav Jain a écrit :
> During CAPP recovery do_capp_recovery_scoms() will reset the CAPP Fir
> register just after CAPP recovery is completed. This has an
> unintentional side effect of preventing PRD from analyzing and
> reporting this error. If PRD tries to read the CAPP FIR after opal has
> already reset it, then it logs a critical error complaining "No active
> error bits found".
>
> To prevent this from happening we update do_capp_recovery_scoms() to
> wait for CAPP Fir to be reset by PRD just after CAPP recovery
> completes and before we proceed with rest of the CAPP recovery
> sequence. A timeout of 5ms is used to wait for CAPP-Fir reset before
> we reset the register on our own. This is to guard against the
> possibility of Opal PRD daemon crashing/not-running.
>
> Signed-off-by: Vaibhav Jain <vaibhav at linux.ibm.com>
> ---
This looks really odd to me. I think we need to understand why the PRD
is messing with the CAPP FIR.
Fred
> hw/phb4.c | 20 +++++++++++++++++---
> 1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/hw/phb4.c b/hw/phb4.c
> index 10df206b..bb95a953 100644
> --- a/hw/phb4.c
> +++ b/hw/phb4.c
> @@ -3055,7 +3055,24 @@ static int do_capp_recovery_scoms(struct phb4 *p)
>
> /* Check if the recovery failed or passed */
> if (reg & PPC_BIT(1)) {
> +
> + PHBDBG(p, "Waiting for FIR to reset\n");
> +
> + /* Wait for FIR to be reset by PRD */
> + end = mftb() + msecs_to_tb(5);
> + do {
> + xscom_read(p->chip_id, CAPP_FIR + offset, ®);
> + time_wait_us(100);
> + if (tb_compare(mftb(), end) != TB_ABEFOREB) {
> + PHBERR(p, "CAPP: Capp FIR reset Timed-out.\n");
> + break;
> + }
> + } while (reg);
> +
> PHBDBG(p, "Doing CAPP recovery scoms\n");
> + /* clear capp fir */
> + xscom_write(p->chip_id, CAPP_FIR + offset, 0);
> +
> /* disable snoops */
> xscom_write(p->chip_id, SNOOP_CAPI_CONFIG + offset, 0);
> load_capp_ucode(p);
> @@ -3063,9 +3080,6 @@ static int do_capp_recovery_scoms(struct phb4 *p)
> /* clear err rpt reg*/
> xscom_write(p->chip_id, CAPP_ERR_RPT_CLR + offset, 0);
>
> - /* clear capp fir */
> - xscom_write(p->chip_id, CAPP_FIR + offset, 0);
> -
> /* Just reset Bit-0,1 and dont touch any other bit */
> xscom_read(p->chip_id, CAPP_ERR_STATUS_CTRL + offset, ®);
> reg &= ~(PPC_BIT(0) | PPC_BIT(1));
>
More information about the Skiboot
mailing list