e8117bb4ed7f350e9c530a45b29adc259f9b1dd2
[lunaix-os.git] / lunaix-os / arch / generic / includes / asm-generic / isrm.h
1 /**
2  * @file irqm.h
3  * @author Lunaixsky
4  * @brief ISR Manager, managing the interrupt service routine allocations
5  * @version 0.1
6  * @date 2022-10-18
7  *
8  * @copyright Copyright (c) 2022
9  *
10  */
11 #ifndef __LUNAIX_ISRM_H
12 #define __LUNAIX_ISRM_H
13
14 #include <lunaix/types.h>
15 #include <lunaix/hart_state.h>
16
17 #include <hal/devtree.h>
18
19 typedef void (*isr_cb)(const struct hart_state*);
20
21 typedef struct {
22     ptr_t msi_addr;
23     reg_t msi_data;
24     int mapped_iv;
25 } msi_vector_t;
26 #define msi_addr(msiv)   ((msiv).msi_addr)
27 #define msi_data(msiv)   ((msiv).msi_data)
28 #define msi_vect(msiv)   ((msiv).mapped_iv)
29
30 void
31 isrm_init();
32
33 /**
34  * @brief Release a iv resource
35  *
36  * @param iv
37  */
38 void
39 isrm_ivfree(int iv);
40
41 /**
42  * @brief Allocate an iv resource for os services
43  *
44  * @param iv
45  */
46 int
47 isrm_ivosalloc(isr_cb handler);
48
49 /**
50  * @brief Allocate an iv resource for external events
51  *
52  * @param iv
53  */
54 int
55 isrm_ivexalloc(isr_cb handler);
56
57 /**
58  * @brief Allocate an iv resource for MSI use
59  *
60  * @param iv
61  */
62 msi_vector_t
63 isrm_msialloc(isr_cb handler);
64
65 /**
66  * @brief Bind the iv according to given device tree node
67  *
68  * @param node
69  */
70 int
71 isrm_bind_dtnode(struct dt_intr_node* node);
72
73 /**
74  * @brief Get the handler associated with the given iv
75  *
76  * @param iv
77  * @return isr_cb
78  */
79 isr_cb
80 isrm_get(int iv);
81
82 ptr_t
83 isrm_get_payload(const struct hart_state*);
84
85 void
86 isrm_set_payload(int iv, ptr_t);
87
88 /**
89  * @brief Notify end of interrupt event
90  *
91  * @param id
92  */
93 void
94 isrm_notify_eoi(cpu_t id, int iv);
95
96 /**
97  * @brief Notify end of scheduling event
98  *
99  * @param id
100  */
101 void
102 isrm_notify_eos(cpu_t id);
103
104 #endif /* __LUNAIX_ISRM_H */