add support to MSI based on either SPI or LPI.
[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 #define check_msiv_invalid(msiv)  (msi_vect(msiv) == -1)
30 #define invalid_msi_vector  ((msi_vector_t) { (ptr_t)-1, (reg_t)-1, -1 });
31
32 void
33 isrm_init();
34
35 /**
36  * @brief Release a iv resource
37  *
38  * @param iv
39  */
40 void
41 isrm_ivfree(int iv);
42
43 /**
44  * @brief Allocate an iv resource for os services
45  *
46  * @param iv
47  */
48 int
49 isrm_ivosalloc(isr_cb handler);
50
51 /**
52  * @brief Allocate an iv resource for external events
53  *
54  * @param iv
55  */
56 int
57 isrm_ivexalloc(isr_cb handler);
58
59 /**
60  * @brief Allocate an iv resource for MSI use
61  *
62  * @param iv
63  */
64 msi_vector_t
65 isrm_msialloc(isr_cb handler);
66
67 /**
68  * @brief Bind the iv according to given device tree node
69  *
70  * @param node
71  */
72 int
73 isrm_bind_dtnode(struct dt_intr_node* node);
74
75 /**
76  * @brief Get the handler associated with the given iv
77  *
78  * @param iv
79  * @return isr_cb
80  */
81 isr_cb
82 isrm_get(int iv);
83
84 ptr_t
85 isrm_get_payload(const struct hart_state*);
86
87 void
88 isrm_set_payload(int iv, ptr_t);
89
90 /**
91  * @brief Notify end of interrupt event
92  *
93  * @param id
94  */
95 void
96 isrm_notify_eoi(cpu_t id, int iv);
97
98 /**
99  * @brief Notify end of scheduling event
100  *
101  * @param id
102  */
103 void
104 isrm_notify_eos(cpu_t id);
105
106 #endif /* __LUNAIX_ISRM_H */