[Skiboot] [PATCH] hw/psi-p9: Configure IRQ offset before XIVE notify

Cédric Le Goater clg at kaod.org
Tue Jul 21 17:48:26 AEST 2020


On 7/20/20 6:39 AM, Oliver O'Halloran wrote:
> When configuring the XIVE notification address any currently pending
> interrupts will be delivered once the the valid bit in the BAR is set.
> 
> Currently we enable the notify BAR before we've configured the global
> interrupt number offset for the PSI interrupts. If any PSI interrupt is
> pending at this point we'll send an interrupt trigger notification for
> the wrong interrupt vector. This can potentially cause a checkstop since
> there may not be an EAS / IVT configure for that vector.
> 
> Fix this by fixing the ordering so we setup the offset before the XIVE
> notification address.
> 
> Cc: Cédric Le Goater <clg at kaod.org>
> Signed-off-by: Oliver O'Halloran <oohall at gmail.com>

Reviewed-by: Cédric Le Goater <clg at kaod.org>

> ---
>  hw/psi.c | 20 ++++++++++----------
>  1 file changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/psi.c b/hw/psi.c
> index 339bc28c8c1a..8a0704729015 100644
> --- a/hw/psi.c
> +++ b/hw/psi.c
> @@ -701,16 +701,6 @@ static void psi_init_p9_interrupts(struct psi *psi)
>  	prlog(PR_DEBUG, "PSI[0x%03x]: ESB MMIO at @%p\n",
>  	       psi->chip_id, psi->esb_mmio);
>  
> -	/* Grab and configure the notification port */
> -	val = xive_get_notify_port(psi->chip_id, XIVE_HW_SRC_PSI);
> -	val |= PSIHB_ESB_NOTIF_VALID;
> -	out_be64(psi->regs + PSIHB_ESB_NOTIF_ADDR, val);
> -
> -	/* Setup interrupt offset */
> -	val = xive_get_notify_base(psi->interrupt);
> -	val <<= 32;
> -	out_be64(psi->regs + PSIHB_IVT_OFFSET, val);
> -
>  	/* Register sources */
>  	prlog(PR_DEBUG,
>  	      "PSI[0x%03x]: Interrupts sources registered for P9 DD2.x\n",
> @@ -719,6 +709,16 @@ static void psi_init_p9_interrupts(struct psi *psi)
>  				12, psi->esb_mmio, XIVE_SRC_LSI,
>  				psi, &psi_p9_irq_ops);
>  
> +	/* Setup interrupt offset */
> +	val = xive_get_notify_base(psi->interrupt);
> +	val <<= 32;
> +	out_be64(psi->regs + PSIHB_IVT_OFFSET, val);
> +
> +	/* Grab and configure the notification port */
> +	val = xive_get_notify_port(psi->chip_id, XIVE_HW_SRC_PSI);
> +	val |= PSIHB_ESB_NOTIF_VALID;
> +	out_be64(psi->regs + PSIHB_ESB_NOTIF_ADDR, val);
> +
>  	/* Reset irq handling and switch to ESB mode */
>  	out_be64(psi->regs + PSIHB_INTERRUPT_CONTROL, PSIHB_IRQ_RESET);
>  	out_be64(psi->regs + PSIHB_INTERRUPT_CONTROL, 0);
> 



More information about the Skiboot mailing list