[PATCH 07/13] lib: sbi: Enable mie.MEIE bit for IPIs based on external interrupts.

Atish Patra atishp at atishpatra.org
Tue Feb 8 01:03:36 PST 2022


On Tue, Jan 4, 2022 at 2:13 AM Anup Patel <apatel at ventanamicro.com> wrote:
>
> We can have IPIs based on external interrupts provided by devices
> such as AIA IMSIC so we should enable mie.MEIE bit at appropriate
> places in generic library.
>
> Signed-off-by: Anup Patel <anup at brainfault.org>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
>  lib/sbi/sbi_hsm.c  | 4 ++--
>  lib/sbi/sbi_init.c | 9 ++++++---
>  2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
> index ecd2e45..c4d2c6d 100644
> --- a/lib/sbi/sbi_hsm.c
> +++ b/lib/sbi/sbi_hsm.c
> @@ -113,8 +113,8 @@ static void sbi_hsm_hart_wait(struct sbi_scratch *scratch, u32 hartid)
>         /* Save MIE CSR */
>         saved_mie = csr_read(CSR_MIE);
>
> -       /* Set MSIE bit to receive IPI */
> -       csr_set(CSR_MIE, MIP_MSIP);
> +       /* Set MSIE and MEIE bits to receive IPI */
> +       csr_set(CSR_MIE, MIP_MSIP | MIP_MEIP);
>
>         /* Wait for hart_add call*/
>         while (atomic_read(&hdata->state) != SBI_HSM_STATE_START_PENDING) {
> diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
> index 27d03a7..6876eb2 100644
> --- a/lib/sbi/sbi_init.c
> +++ b/lib/sbi/sbi_init.c
> @@ -165,8 +165,8 @@ static void wait_for_coldboot(struct sbi_scratch *scratch, u32 hartid)
>         /* Save MIE CSR */
>         saved_mie = csr_read(CSR_MIE);
>
> -       /* Set MSIE bit to receive IPI */
> -       csr_set(CSR_MIE, MIP_MSIP);
> +       /* Set MSIE and MEIE bits to receive IPI */
> +       csr_set(CSR_MIE, MIP_MSIP | MIP_MEIP);
>
>         /* Acquire coldboot lock */
>         spin_lock(&coldboot_lock);
> @@ -182,7 +182,7 @@ static void wait_for_coldboot(struct sbi_scratch *scratch, u32 hartid)
>                 do {
>                         wfi();
>                         cmip = csr_read(CSR_MIP);
> -                } while (!(cmip & MIP_MSIP));
> +                } while (!(cmip & (MIP_MSIP | MIP_MEIP)));
>         };
>
>         /* Acquire coldboot lock */
> @@ -276,6 +276,7 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
>                            __func__, rc);
>                 sbi_hart_hang();
>         }
> +       csr_set(CSR_MIE, MIP_MEIP);
>

This is only required for IPIs with IMSIC devices.
Why not do it inside sbi_ipi_init along with MIP_MSIP set ?

>         rc = sbi_ipi_init(scratch, TRUE);
>         if (rc) {
> @@ -376,6 +377,7 @@ static void init_warm_startup(struct sbi_scratch *scratch, u32 hartid)
>         rc = sbi_platform_irqchip_init(plat, FALSE);
>         if (rc)
>                 sbi_hart_hang();
> +       csr_set(CSR_MIE, MIP_MEIP);
>
>         rc = sbi_ipi_init(scratch, FALSE);
>         if (rc)
> @@ -550,6 +552,7 @@ void __noreturn sbi_exit(struct sbi_scratch *scratch)
>
>         sbi_ipi_exit(scratch);
>
> +       csr_clear(CSR_MIE, MIP_MEIP);
>         sbi_platform_irqchip_exit(plat);
>
>         sbi_platform_final_exit(plat);
> --
> 2.25.1
>


-- 
Regards,
Atish



More information about the opensbi mailing list