]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/src/interrupt.c
Update RISCC-V-RV32-SiFive_HiFive1_FreedomStudio project to latest tools and metal...
[freertos] / FreeRTOS / Demo / RISC-V_RV32_SiFive_HiFive1_FreedomStudio / freedom-metal / src / interrupt.c
1 /* Copyright 2018 SiFive, Inc */
2 /* SPDX-License-Identifier: Apache-2.0 */
3
4 #include <string.h>
5 #include <metal/interrupt.h>
6 #include <metal/machine.h>
7
8 struct metal_interrupt* metal_interrupt_get_controller (metal_intr_cntrl_type cntrl,
9                                                         int id)
10 {
11     switch (cntrl) {
12     case METAL_CPU_CONTROLLER:
13         break;
14     case METAL_CLINT_CONTROLLER:
15 #ifdef __METAL_DT_RISCV_CLINT0_HANDLE
16         return __METAL_DT_RISCV_CLINT0_HANDLE;
17 #endif
18         break;
19     case METAL_CLIC_CONTROLLER:
20 #ifdef __METAL_DT_SIFIVE_CLIC0_HANDLE
21         return __METAL_DT_SIFIVE_CLIC0_HANDLE;
22 #endif
23         break;
24     case METAL_PLIC_CONTROLLER:
25 #ifdef __METAL_DT_RISCV_PLIC0_HANDLE
26         return __METAL_DT_RISCV_PLIC0_HANDLE;
27 #endif
28         break;
29     }
30     return NULL;
31 }
32
33 extern __inline__ void metal_interrupt_init(struct metal_interrupt *controller);
34
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);
38
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);
42
43 extern __inline__ int metal_interrupt_set_threshold(struct metal_interrupt *controller,
44                                                 unsigned int level);
45 extern __inline__ unsigned int metal_interrupt_get_threshold(struct metal_interrupt *controller);
46
47 extern __inline__ unsigned int metal_interrupt_get_priority(struct metal_interrupt *controller, int id);
48
49 extern __inline__ int metal_interrupt_set_priority(struct metal_interrupt *controller, int id, unsigned int priority);
50
51 extern __inline__ int metal_interrupt_clear(struct metal_interrupt *controller, int id);
52
53 extern __inline__ int metal_interrupt_set(struct metal_interrupt *controller, int id);
54
55 extern __inline__ int metal_interrupt_register_handler(struct metal_interrupt *controller,
56                                                  int id,
57                                                  metal_interrupt_handler_t handler,
58                                                  void *priv);
59
60 extern __inline__ int metal_interrupt_register_vector_handler(struct metal_interrupt *controller,
61                                                 int id,
62                                                 metal_interrupt_vector_handler_t handler,
63                                                 void *priv_data);
64
65 extern __inline__ int metal_interrupt_enable(struct metal_interrupt *controller, int id);
66
67 extern __inline__ int metal_interrupt_disable(struct metal_interrupt *controller, int id);
68
69 extern __inline__ unsigned int metal_interrupt_get_threshold(struct metal_interrupt *controller);
70
71 extern __inline__ int metal_interrupt_set_threshold(struct metal_interrupt *controller, unsigned int threshold);
72
73 extern __inline__ unsigned int metal_interrupt_get_priority(struct metal_interrupt *controller, int id);
74
75 extern __inline__ int metal_interrupt_set_priority(struct metal_interrupt *controller, int id, unsigned int priority);
76
77 extern __inline__ int metal_interrupt_vector_enable(struct metal_interrupt *controller, int id);
78
79 extern __inline__ int metal_interrupt_vector_disable(struct metal_interrupt *controller, int id);
80
81 extern __inline__ int _metal_interrupt_command_request(struct metal_interrupt *controller,
82                                                 int cmd, void *data);