[PATCH 7/9] lib: sbi_irqchip: Call driver warm_init from SBI core

Anup Patel anup at brainfault.org
Wed Nov 27 22:11:15 PST 2024


On Tue, Nov 5, 2024 at 9:40 AM Samuel Holland <samuel.holland at sifive.com> wrote:
>
> Currently, each platform keeps track of which irqchip driver is in use
> and calls its warm init function. Since the generic platform may use
> multiple irqchip drivers, it has logic to track an array of drivers.
>
> The code is simplified and made common across platforms by treating warm
> init and exit as properties of the driver, not the platform. Then the
> platform's only role is to select and prepare a driver during cold boot.
>
> For now, only add a .warm_init hook, since none of the existing drivers
> need an .exit hook. It could be added in the future if needed.
>
> Signed-off-by: Samuel Holland <samuel.holland at sifive.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Regards,
Anup

> ---
>
>  include/sbi/sbi_irqchip.h             | 3 +++
>  include/sbi_utils/irqchip/imsic.h     | 2 --
>  include/sbi_utils/irqchip/plic.h      | 2 --
>  lib/sbi/sbi_irqchip.c                 | 9 +++++++++
>  lib/utils/irqchip/fdt_irqchip_aplic.c | 8 +-------
>  lib/utils/irqchip/fdt_irqchip_imsic.c | 2 +-
>  lib/utils/irqchip/fdt_irqchip_plic.c  | 2 +-
>  lib/utils/irqchip/imsic.c             | 3 ++-
>  lib/utils/irqchip/plic.c              | 3 ++-
>  platform/fpga/ariane/platform.c       | 2 +-
>  platform/fpga/openpiton/platform.c    | 2 +-
>  platform/kendryte/k210/platform.c     | 2 +-
>  platform/nuclei/ux600/platform.c      | 2 +-
>  platform/template/platform.c          | 2 +-
>  14 files changed, 24 insertions(+), 20 deletions(-)
>
> diff --git a/include/sbi/sbi_irqchip.h b/include/sbi/sbi_irqchip.h
> index c88b760a..9d26067f 100644
> --- a/include/sbi/sbi_irqchip.h
> +++ b/include/sbi/sbi_irqchip.h
> @@ -19,6 +19,9 @@ struct sbi_scratch;
>  struct sbi_irqchip_device {
>         /** Node in the list of irqchip devices */
>         struct sbi_dlist node;
> +
> +       /** Initialize per-hart state for the current hart */
> +       int (*warm_init)(struct sbi_irqchip_device *dev);
>  };
>
>  /**
> diff --git a/include/sbi_utils/irqchip/imsic.h b/include/sbi_utils/irqchip/imsic.h
> index bc9292d3..353cefec 100644
> --- a/include/sbi_utils/irqchip/imsic.h
> +++ b/include/sbi_utils/irqchip/imsic.h
> @@ -43,8 +43,6 @@ int imsic_get_target_file(u32 hartindex);
>
>  void imsic_local_irqchip_init(void);
>
> -int imsic_warm_irqchip_init(void);
> -
>  int imsic_data_check(struct imsic_data *imsic);
>
>  int imsic_cold_irqchip_init(struct imsic_data *imsic);
> diff --git a/include/sbi_utils/irqchip/plic.h b/include/sbi_utils/irqchip/plic.h
> index 5c638e14..a173871e 100644
> --- a/include/sbi_utils/irqchip/plic.h
> +++ b/include/sbi_utils/irqchip/plic.h
> @@ -42,8 +42,6 @@ void plic_suspend(void);
>
>  void plic_resume(void);
>
> -int plic_warm_irqchip_init(void);
> -
>  int plic_cold_irqchip_init(struct plic_data *plic);
>
>  #endif
> diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c
> index 2ab9d1ff..1aa18b8b 100644
> --- a/lib/sbi/sbi_irqchip.c
> +++ b/lib/sbi/sbi_irqchip.c
> @@ -40,11 +40,20 @@ int sbi_irqchip_init(struct sbi_scratch *scratch, bool cold_boot)
>  {
>         int rc;
>         const struct sbi_platform *plat = sbi_platform_ptr(scratch);
> +       struct sbi_irqchip_device *dev;
>
>         rc = sbi_platform_irqchip_init(plat, cold_boot);
>         if (rc)
>                 return rc;
>
> +       sbi_list_for_each_entry(dev, &irqchip_list, node) {
> +               if (!dev->warm_init)
> +                       continue;
> +               rc = dev->warm_init(dev);
> +               if (rc)
> +                       return rc;
> +       }
> +
>         if (ext_irqfn != default_irqfn)
>                 csr_set(CSR_MIE, MIP_MEIP);
>
> diff --git a/lib/utils/irqchip/fdt_irqchip_aplic.c b/lib/utils/irqchip/fdt_irqchip_aplic.c
> index 6eb6e085..ed6ccf12 100644
> --- a/lib/utils/irqchip/fdt_irqchip_aplic.c
> +++ b/lib/utils/irqchip/fdt_irqchip_aplic.c
> @@ -16,12 +16,6 @@
>  #include <sbi_utils/irqchip/fdt_irqchip.h>
>  #include <sbi_utils/irqchip/aplic.h>
>
> -static int irqchip_aplic_warm_init(void)
> -{
> -       /* Nothing to do here. */
> -       return 0;
> -}
> -
>  static int irqchip_aplic_cold_init(const void *fdt, int nodeoff,
>                                    const struct fdt_match *match)
>  {
> @@ -55,6 +49,6 @@ static const struct fdt_match irqchip_aplic_match[] = {
>  struct fdt_irqchip fdt_irqchip_aplic = {
>         .match_table = irqchip_aplic_match,
>         .cold_init = irqchip_aplic_cold_init,
> -       .warm_init = irqchip_aplic_warm_init,
> +       .warm_init = NULL,
>         .exit = NULL,
>  };
> diff --git a/lib/utils/irqchip/fdt_irqchip_imsic.c b/lib/utils/irqchip/fdt_irqchip_imsic.c
> index ca62b427..63be6007 100644
> --- a/lib/utils/irqchip/fdt_irqchip_imsic.c
> +++ b/lib/utils/irqchip/fdt_irqchip_imsic.c
> @@ -95,5 +95,5 @@ static const struct fdt_match irqchip_imsic_match[] = {
>  struct fdt_irqchip fdt_irqchip_imsic = {
>         .match_table = irqchip_imsic_match,
>         .cold_init = irqchip_imsic_cold_init,
> -       .warm_init = imsic_warm_irqchip_init,
> +       .warm_init = NULL,
>  };
> diff --git a/lib/utils/irqchip/fdt_irqchip_plic.c b/lib/utils/irqchip/fdt_irqchip_plic.c
> index ebde7eec..9066d745 100644
> --- a/lib/utils/irqchip/fdt_irqchip_plic.c
> +++ b/lib/utils/irqchip/fdt_irqchip_plic.c
> @@ -108,6 +108,6 @@ static const struct fdt_match irqchip_plic_match[] = {
>  struct fdt_irqchip fdt_irqchip_plic = {
>         .match_table = irqchip_plic_match,
>         .cold_init = irqchip_plic_cold_init,
> -       .warm_init = plic_warm_irqchip_init,
> +       .warm_init = NULL,
>         .exit = NULL,
>  };
> diff --git a/lib/utils/irqchip/imsic.c b/lib/utils/irqchip/imsic.c
> index a3b2cf09..b5198b43 100644
> --- a/lib/utils/irqchip/imsic.c
> +++ b/lib/utils/irqchip/imsic.c
> @@ -255,7 +255,7 @@ void imsic_local_irqchip_init(void)
>         imsic_local_eix_update(IMSIC_IPI_ID, 1, false, true);
>  }
>
> -int imsic_warm_irqchip_init(void)
> +static int imsic_warm_irqchip_init(struct sbi_irqchip_device *dev)
>  {
>         struct imsic_data *imsic = imsic_get_data(current_hartindex());
>
> @@ -346,6 +346,7 @@ int imsic_data_check(struct imsic_data *imsic)
>  }
>
>  static struct sbi_irqchip_device imsic_device = {
> +       .warm_init      = imsic_warm_irqchip_init,
>  };
>
>  int imsic_cold_irqchip_init(struct imsic_data *imsic)
> diff --git a/lib/utils/irqchip/plic.c b/lib/utils/irqchip/plic.c
> index f9eb7411..7761ae98 100644
> --- a/lib/utils/irqchip/plic.c
> +++ b/lib/utils/irqchip/plic.c
> @@ -190,7 +190,7 @@ void plic_resume(void)
>         plic_delegate(plic);
>  }
>
> -int plic_warm_irqchip_init(void)
> +static int plic_warm_irqchip_init(struct sbi_irqchip_device *dev)
>  {
>         struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
>         const struct plic_data *plic = plic_get_hart_data_ptr(scratch);
> @@ -222,6 +222,7 @@ int plic_warm_irqchip_init(void)
>  }
>
>  static struct sbi_irqchip_device plic_device = {
> +       .warm_init      = plic_warm_irqchip_init,
>  };
>
>  int plic_cold_irqchip_init(struct plic_data *plic)
> diff --git a/platform/fpga/ariane/platform.c b/platform/fpga/ariane/platform.c
> index c4ac0ae6..ab3206cf 100644
> --- a/platform/fpga/ariane/platform.c
> +++ b/platform/fpga/ariane/platform.c
> @@ -110,7 +110,7 @@ static int ariane_irqchip_init(bool cold_boot)
>                         return ret;
>         }
>
> -       return plic_warm_irqchip_init();
> +       return 0;
>  }
>
>  /*
> diff --git a/platform/fpga/openpiton/platform.c b/platform/fpga/openpiton/platform.c
> index 73429f88..13585297 100644
> --- a/platform/fpga/openpiton/platform.c
> +++ b/platform/fpga/openpiton/platform.c
> @@ -143,7 +143,7 @@ static int openpiton_irqchip_init(bool cold_boot)
>                         return ret;
>         }
>
> -       return plic_warm_irqchip_init();
> +       return 0;
>  }
>
>  /*
> diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c
> index e1808d17..ebfab715 100644
> --- a/platform/kendryte/k210/platform.c
> +++ b/platform/kendryte/k210/platform.c
> @@ -146,7 +146,7 @@ static int k210_irqchip_init(bool cold_boot)
>                         return rc;
>         }
>
> -       return plic_warm_irqchip_init();
> +       return 0;
>  }
>
>  static int k210_ipi_init(bool cold_boot)
> diff --git a/platform/nuclei/ux600/platform.c b/platform/nuclei/ux600/platform.c
> index 12657bc0..0a823e0e 100644
> --- a/platform/nuclei/ux600/platform.c
> +++ b/platform/nuclei/ux600/platform.c
> @@ -200,7 +200,7 @@ static int ux600_irqchip_init(bool cold_boot)
>                         return rc;
>         }
>
> -       return plic_warm_irqchip_init();
> +       return 0;
>  }
>
>  static int ux600_ipi_init(bool cold_boot)
> diff --git a/platform/template/platform.c b/platform/template/platform.c
> index 298301a4..a13798d9 100644
> --- a/platform/template/platform.c
> +++ b/platform/template/platform.c
> @@ -100,7 +100,7 @@ static int platform_irqchip_init(bool cold_boot)
>                         return ret;
>         }
>
> -       return plic_warm_irqchip_init();
> +       return 0;
>  }
>
>  /*
> --
> 2.45.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list