0d4a15a5ed11e824807f0faec1be4996e8482557
[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 #include <lunaix/device.h>
17
18 #include <hal/devtree.h>
19
20 typedef void (*isr_cb)(const struct hart_state*);
21
22 typedef struct {
23     ptr_t msi_addr;
24     reg_t msi_data;
25     int mapped_iv;
26 } msi_vector_t;
27 #define msi_addr(msiv)   ((msiv).msi_addr)
28 #define msi_data(msiv)   ((msiv).msi_data)
29 #define msi_vect(msiv)   ((msiv).mapped_iv)
30
31 typedef void* msienv_t;
32
33 void
34 isrm_init();
35
36 /**
37  * @brief Release a iv resource
38  *
39  * @param iv
40  */
41 void
42 isrm_ivfree(int iv);
43
44 /**
45  * @brief Begin MSI allocation for given device
46  *
47  * @param iv
48  */
49 msienv_t
50 isrm_msi_start(struct device* dev);
51
52 /**
53  * @brief Query number of msi avaliable for the device
54  */
55 int
56 isrm_msi_avaliable(msienv_t msienv);
57
58 /**
59  * @brief Allocate a msi resource within defined msi resource list
60  *        for the device, indexed by `index`
61  */
62 msi_vector_t
63 isrm_msi_alloc(msienv_t msienv, cpu_t cpu, int index, isr_cb handler);
64
65 /**
66  * @brief Set the sideband information will be used for upcoming
67  *        allocations
68  */
69 void
70 isrm_msi_set_sideband(msienv_t msienv, ptr_t sideband);
71
72 /**
73  * @brief Done MSI allocation
74  */
75 void
76 isrm_msi_done(msienv_t msienv);
77
78 static inline must_inline msi_vector_t
79 isrm_msi_alloc_simple(struct device* dev, cpu_t cpu, isr_cb handler)
80 {   
81     msi_vector_t v;
82     msienv_t env;
83
84     env = isrm_msi_start(dev);
85     v = isrm_msi_alloc(env, cpu, 0, handler);
86     isrm_msi_done(env);
87
88     return v;
89 }
90
91 /**
92  * @brief Bind the iv according to given device tree node
93  *
94  * @param node
95  */
96 int
97 isrm_bind_dtn(struct dtn_intr* node);
98
99 /**
100  * @brief Get the handler associated with the given iv
101  *
102  * @param iv
103  * @return isr_cb
104  */
105 isr_cb
106 isrm_get(int iv);
107
108 ptr_t
109 isrm_get_payload(const struct hart_state*);
110
111 void
112 isrm_set_payload(int iv, ptr_t);
113
114 /**
115  * @brief Notify end of interrupt event
116  *
117  * @param id
118  */
119 void
120 isrm_notify_eoi(cpu_t id, int iv);
121
122 /**
123  * @brief Notify end of scheduling event
124  *
125  * @param id
126  */
127 void
128 isrm_notify_eos(cpu_t id);
129
130 #endif /* __LUNAIX_ISRM_H */