sbi_irqchip.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2022 Ventana Micro Systems Inc.
  5. *
  6. * Authors:
  7. * Anup Patel <apatel@ventanamicro.com>
  8. */
  9. #include <sbi/sbi_irqchip.h>
  10. #include <sbi/sbi_platform.h>
  11. static int default_irqfn(struct sbi_trap_regs *regs)
  12. {
  13. return SBI_ENODEV;
  14. }
  15. static int (*ext_irqfn)(struct sbi_trap_regs *regs) = default_irqfn;
  16. void sbi_irqchip_set_irqfn(int (*fn)(struct sbi_trap_regs *regs))
  17. {
  18. if (fn)
  19. ext_irqfn = fn;
  20. }
  21. int sbi_irqchip_process(struct sbi_trap_regs *regs)
  22. {
  23. return ext_irqfn(regs);
  24. }
  25. int sbi_irqchip_init(struct sbi_scratch *scratch, bool cold_boot)
  26. {
  27. int rc;
  28. const struct sbi_platform *plat = sbi_platform_ptr(scratch);
  29. rc = sbi_platform_irqchip_init(plat, cold_boot);
  30. if (rc)
  31. return rc;
  32. if (ext_irqfn != default_irqfn)
  33. csr_set(CSR_MIE, MIP_MEIP);
  34. return 0;
  35. }
  36. void sbi_irqchip_exit(struct sbi_scratch *scratch)
  37. {
  38. const struct sbi_platform *plat = sbi_platform_ptr(scratch);
  39. if (ext_irqfn != default_irqfn)
  40. csr_clear(CSR_MIE, MIP_MEIP);
  41. sbi_platform_irqchip_exit(plat);
  42. }