/* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2022 Ventana Micro Systems Inc. * * Authors: * Anup Patel */ #include #include 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); }