1 /* Copyright 2018 SiFive, Inc */
2 /* SPDX-License-Identifier: Apache-2.0 */
5 #include <metal/interrupt.h>
6 #include <metal/machine.h>
8 struct metal_interrupt* metal_interrupt_get_controller (metal_intr_cntrl_type cntrl,
12 case METAL_CPU_CONTROLLER:
14 case METAL_CLINT_CONTROLLER:
15 #ifdef __METAL_DT_RISCV_CLINT0_HANDLE
16 return __METAL_DT_RISCV_CLINT0_HANDLE;
19 case METAL_CLIC_CONTROLLER:
20 #ifdef __METAL_DT_SIFIVE_CLIC0_HANDLE
21 return __METAL_DT_SIFIVE_CLIC0_HANDLE;
24 case METAL_PLIC_CONTROLLER:
25 #ifdef __METAL_DT_RISCV_PLIC0_HANDLE
26 return __METAL_DT_RISCV_PLIC0_HANDLE;
33 extern __inline__ void metal_interrupt_init(struct metal_interrupt *controller);
35 extern __inline__ int metal_interrupt_set_vector_mode(struct metal_interrupt *controller,
36 metal_vector_mode mode);
37 extern __inline__ metal_vector_mode metal_interrupt_get_vector_mode(struct metal_interrupt *controller);
39 extern __inline__ int metal_interrupt_set_privilege(struct metal_interrupt *controller,
40 metal_intr_priv_mode mode);
41 extern __inline__ metal_intr_priv_mode metal_interrupt_get_privilege(struct metal_interrupt *controller);
43 extern __inline__ int metal_interrupt_set_threshold(struct metal_interrupt *controller,
45 extern __inline__ unsigned int metal_interrupt_get_threshold(struct metal_interrupt *controller);
47 extern __inline__ unsigned int metal_interrupt_get_priority(struct metal_interrupt *controller, int id);
49 extern __inline__ int metal_interrupt_set_priority(struct metal_interrupt *controller, int id, unsigned int priority);
51 extern __inline__ int metal_interrupt_clear(struct metal_interrupt *controller, int id);
53 extern __inline__ int metal_interrupt_set(struct metal_interrupt *controller, int id);
55 extern __inline__ int metal_interrupt_register_handler(struct metal_interrupt *controller,
57 metal_interrupt_handler_t handler,
60 extern __inline__ int metal_interrupt_register_vector_handler(struct metal_interrupt *controller,
62 metal_interrupt_vector_handler_t handler,
65 extern __inline__ int metal_interrupt_enable(struct metal_interrupt *controller, int id);
67 extern __inline__ int metal_interrupt_disable(struct metal_interrupt *controller, int id);
69 extern __inline__ unsigned int metal_interrupt_get_threshold(struct metal_interrupt *controller);
71 extern __inline__ int metal_interrupt_set_threshold(struct metal_interrupt *controller, unsigned int threshold);
73 extern __inline__ unsigned int metal_interrupt_get_priority(struct metal_interrupt *controller, int id);
75 extern __inline__ int metal_interrupt_set_priority(struct metal_interrupt *controller, int id, unsigned int priority);
77 extern __inline__ int metal_interrupt_vector_enable(struct metal_interrupt *controller, int id);
79 extern __inline__ int metal_interrupt_vector_disable(struct metal_interrupt *controller, int id);
81 extern __inline__ int _metal_interrupt_command_request(struct metal_interrupt *controller,