123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- /*
- * 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);
- }
|