diff options
author | Anup Patel <apatel@ventanamicro.com> | 2022-02-18 20:48:41 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2022-02-28 07:13:12 +0300 |
commit | f3f4604c196dea70b0bb64aba747aa6d7a9e244f (patch) | |
tree | fb57357531b34399cb0b5e2a77f280ebee781c44 /lib/sbi/sbi_irqchip.c | |
parent | f2ccf2f783b43e8ca2b42cdeade7663599284a86 (diff) | |
download | opensbi-f3f4604c196dea70b0bb64aba747aa6d7a9e244f.tar.xz |
lib: sbi: Add a simple external interrupt handling framework
Currently, the external interrupt handling is scattered between
sbi_init and sbi_trap. This patch moves all external interrupt
handling into a simple framework called sbi_irqchip.
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Xiang W <wxjstz@126.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Diffstat (limited to 'lib/sbi/sbi_irqchip.c')
-rw-r--r-- | lib/sbi/sbi_irqchip.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/sbi/sbi_irqchip.c b/lib/sbi/sbi_irqchip.c new file mode 100644 index 0000000..24128be --- /dev/null +++ b/lib/sbi/sbi_irqchip.c @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2022 Ventana Micro Systems Inc. + * + * Authors: + * Anup Patel <apatel@ventanamicro.com> + */ + +#include <sbi/sbi_irqchip.h> +#include <sbi/sbi_platform.h> + +static int default_irqfn(struct sbi_trap_regs *regs) +{ + return SBI_ENODEV; +} + +static int (*ext_irqfn)(struct sbi_trap_regs *regs) = default_irqfn; + +void sbi_irqchip_set_irqfn(int (*fn)(struct sbi_trap_regs *regs)) +{ + if (fn) + ext_irqfn = fn; +} + +int sbi_irqchip_process(struct sbi_trap_regs *regs) +{ + return ext_irqfn(regs); +} + +int sbi_irqchip_init(struct sbi_scratch *scratch, bool cold_boot) +{ + int rc; + const struct sbi_platform *plat = sbi_platform_ptr(scratch); + + rc = sbi_platform_irqchip_init(plat, cold_boot); + if (rc) + return rc; + + if (ext_irqfn != default_irqfn) + csr_set(CSR_MIE, MIP_MEIP); + + return 0; +} + +void sbi_irqchip_exit(struct sbi_scratch *scratch) +{ + const struct sbi_platform *plat = sbi_platform_ptr(scratch); + + if (ext_irqfn != default_irqfn) + csr_clear(CSR_MIE, MIP_MEIP); + + sbi_platform_irqchip_exit(plat); +} |