light-plic.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2022, Liuw <lw312886@alibaba-inc.com>
  4. *
  5. * U-Boot syscon driver for Thead's Platform Level Interrupt Controller (PLIC)
  6. */
  7. #ifndef _LIGHT_PLIC_H
  8. #define _LIGHT_PLIC_H
  9. /*
  10. * M-mode
  11. * hart id: 0, 2, 4, 6
  12. * S-mode
  13. * hart id: 1, 3, 5, 7
  14. */
  15. /* interrupt priority register */
  16. #define PLIC_PRIO_REG(base, id) ((void __iomem *)(base) + 0x00 + (id) * 4)
  17. /* enable register */
  18. #define PLIC_ENABLE_REG(base, hart) ((void __iomem *)(base) + 0x2000 + (hart) * 0x80)
  19. /* pending registr */
  20. #define PLIC_PENDING_REG(base, hart) ((void __iomem *)(base) + 0x1000 + ((hart) / 4) * 4)
  21. /* threshold register */
  22. #define PLIC_THRESHOLD_REG(base, hart) ((void __iomem *)(base) + 0x200000 + (hart) * 0x1000 + 0x00)
  23. /* claim/complete register */
  24. #define PLIC_CLAIM_REG(base, hart) ((void __iomem *)(base) + 0x200000 + (hart) * 0x1000 + 0x04)
  25. #define MAX_IRQ_NUM 256
  26. typedef void (*irq_handler_t)(void);
  27. int irq_handler_register(int irq, irq_handler_t handler);
  28. void arch_local_irq_enable(void);
  29. void arch_local_irq_disable(void);
  30. void irq_enable(int hwirq);
  31. void irq_disable(int hwirq);
  32. void irq_priority_set(int prio);
  33. int plic_init(void);
  34. #endif