[PATCH 6/9] lib: sbi_irqchip: Register devices during cold init
Anup Patel
anup at brainfault.org
Wed Nov 27 22:08:23 PST 2024
On Tue, Nov 5, 2024 at 9:40 AM Samuel Holland <samuel.holland at sifive.com> wrote:
>
> Have the SBI irqchip core keep track of registered irqchip devices. This
> is useful for any callbacks the irqchip driver may have, such as for
> warm initialization, the external interrupt handler function, and any
> future support for handling external interrupts (beyond IPIs) in M-mode.
>
> This improves on the tracking done in fdt_irqchip.c, as it tracks device
> instances, not just drivers, so callbacks can target a specific device.
>
> 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 | 10 ++++++++++
> lib/sbi/sbi_irqchip.c | 8 ++++++++
> lib/utils/irqchip/aplic.c | 7 +++++++
> lib/utils/irqchip/imsic.c | 6 ++++++
> lib/utils/irqchip/plic.c | 7 +++++++
> 5 files changed, 38 insertions(+)
>
> diff --git a/include/sbi/sbi_irqchip.h b/include/sbi/sbi_irqchip.h
> index 0ed02eb4..c88b760a 100644
> --- a/include/sbi/sbi_irqchip.h
> +++ b/include/sbi/sbi_irqchip.h
> @@ -10,10 +10,17 @@
> #ifndef __SBI_IRQCHIP_H__
> #define __SBI_IRQCHIP_H__
>
> +#include <sbi/sbi_list.h>
> #include <sbi/sbi_types.h>
>
> struct sbi_scratch;
>
> +/** irqchip hardware device */
> +struct sbi_irqchip_device {
> + /** Node in the list of irqchip devices */
> + struct sbi_dlist node;
> +};
> +
> /**
> * Set external interrupt handling function
> *
> @@ -34,6 +41,9 @@ void sbi_irqchip_set_irqfn(int (*fn)(void));
> */
> int sbi_irqchip_process(void);
>
> +/** Register an irqchip device to receive callbacks */
> +void sbi_irqchip_add_device(struct sbi_irqchip_device *dev);
> +
> /** Initialize interrupt controllers */
> int sbi_irqchip_init(struct sbi_scratch *scratch, bool cold_boot);
>
> diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c
> index 0ae604aa..2ab9d1ff 100644
> --- a/lib/sbi/sbi_irqchip.c
> +++ b/lib/sbi/sbi_irqchip.c
> @@ -8,8 +8,11 @@
> */
>
> #include <sbi/sbi_irqchip.h>
> +#include <sbi/sbi_list.h>
> #include <sbi/sbi_platform.h>
>
> +static SBI_LIST_HEAD(irqchip_list);
> +
> static int default_irqfn(void)
> {
> return SBI_ENODEV;
> @@ -28,6 +31,11 @@ int sbi_irqchip_process(void)
> return ext_irqfn();
> }
>
> +void sbi_irqchip_add_device(struct sbi_irqchip_device *dev)
> +{
> + sbi_list_add_tail(&dev->node, &irqchip_list);
> +}
> +
> int sbi_irqchip_init(struct sbi_scratch *scratch, bool cold_boot)
> {
> int rc;
> diff --git a/lib/utils/irqchip/aplic.c b/lib/utils/irqchip/aplic.c
> index 28f2f26d..27371849 100644
> --- a/lib/utils/irqchip/aplic.c
> +++ b/lib/utils/irqchip/aplic.c
> @@ -12,6 +12,7 @@
> #include <sbi/sbi_console.h>
> #include <sbi/sbi_domain.h>
> #include <sbi/sbi_error.h>
> +#include <sbi/sbi_irqchip.h>
> #include <sbi_utils/irqchip/aplic.h>
>
> #define APLIC_MAX_IDC (1UL << 14)
> @@ -165,6 +166,9 @@ static int aplic_check_msicfg(struct aplic_msicfg_data *msicfg)
> return 0;
> }
>
> +static struct sbi_irqchip_device aplic_device = {
> +};
> +
> int aplic_cold_irqchip_init(struct aplic_data *aplic)
> {
> int rc;
> @@ -275,5 +279,8 @@ int aplic_cold_irqchip_init(struct aplic_data *aplic)
> return rc;
> }
>
> + /* Register irqchip device */
> + sbi_irqchip_add_device(&aplic_device);
> +
> return 0;
> }
> diff --git a/lib/utils/irqchip/imsic.c b/lib/utils/irqchip/imsic.c
> index ae8b31e0..a3b2cf09 100644
> --- a/lib/utils/irqchip/imsic.c
> +++ b/lib/utils/irqchip/imsic.c
> @@ -345,6 +345,9 @@ int imsic_data_check(struct imsic_data *imsic)
> return 0;
> }
>
> +static struct sbi_irqchip_device imsic_device = {
> +};
> +
> int imsic_cold_irqchip_init(struct imsic_data *imsic)
> {
> int i, rc;
> @@ -387,6 +390,9 @@ int imsic_cold_irqchip_init(struct imsic_data *imsic)
> return rc;
> }
>
> + /* Register irqchip device */
> + sbi_irqchip_add_device(&imsic_device);
> +
> /* Register IPI device */
> sbi_ipi_set_device(&imsic_ipi_device);
>
> diff --git a/lib/utils/irqchip/plic.c b/lib/utils/irqchip/plic.c
> index ca506c4c..f9eb7411 100644
> --- a/lib/utils/irqchip/plic.c
> +++ b/lib/utils/irqchip/plic.c
> @@ -15,6 +15,7 @@
> #include <sbi/sbi_domain.h>
> #include <sbi/sbi_error.h>
> #include <sbi/sbi_heap.h>
> +#include <sbi/sbi_irqchip.h>
> #include <sbi/sbi_string.h>
> #include <sbi_utils/irqchip/plic.h>
>
> @@ -220,6 +221,9 @@ int plic_warm_irqchip_init(void)
> return 0;
> }
>
> +static struct sbi_irqchip_device plic_device = {
> +};
> +
> int plic_cold_irqchip_init(struct plic_data *plic)
> {
> int i, ret;
> @@ -278,5 +282,8 @@ int plic_cold_irqchip_init(struct plic_data *plic)
> plic_set_hart_data_ptr(sbi_hartindex_to_scratch(i), plic);
> }
>
> + /* Register irqchip device */
> + sbi_irqchip_add_device(&plic_device);
> +
> 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