add support to MSI based on either SPI or LPI.
[lunaix-os.git] / lunaix-os / arch / aarch64 / includes / asm / soc / gic.h
1 #ifndef __LUNAIX_GIC_H
2 #define __LUNAIX_GIC_H
3
4 #include <lunaix/types.h>
5 #include <lunaix/ds/bitmap.h>
6 #include <lunaix/ds/hashtable.h>
7
8 #include <hal/devtree.h>
9
10 #include <asm/aa64_gic.h>
11 #include <asm-generic/isrm.h>
12
13 #define NR_CPU      1
14 #define gic_bmp     PREP_BITMAP(gicreg_t, gic_intr, BMP_ORIENT_LSB)
15
16 #define INITID_SGI_BASE     0
17 #define INITID_SGI_END      15
18
19 #define INITID_PPI_BASE     16
20 #define INITID_PPI_END      31
21
22 #define INITID_SPI_BASE     32
23 #define INITID_SPI_END      1019
24
25 #define INITID_SPEC_BASE    1020
26 #define INITID_SPEC_END     1023
27
28 #define INITID_ePPI_BASE    1056
29 #define INITID_ePPI_END     1119
30
31 #define INITID_eSPI_BASE    4096
32 #define INITID_eSPI_END     5119
33
34 #define INITID_LPI_BASE     8192
35
36 #define INITID_SPI_NR       (INITID_SPEC_BASE - INITID_SPI_BASE)
37
38 enum gic_int_type
39 {
40     GIC_IDL,
41     GIC_LPI,
42     GIC_SPI,
43     GIC_PPI,
44     GIC_SGI,
45     GIC_RSV
46 } compact;
47
48 enum gic_tri_type
49 {
50     GIC_TRIG_EDGE,
51     GIC_TRIG_LEVEL
52 } compact;
53
54 enum gic_grp_type
55 {
56     GIC_G0,
57     GIC_G1S,
58     GIC_G1NS
59 } compact;
60
61 DECLARE_BITMAP(gic_bmp);
62
63 struct gic_int_param
64 {
65     enum gic_int_type class;
66     enum gic_tri_type trigger;
67     enum gic_grp_type group;
68     unsigned int priority;
69     int cpu_id;
70     bool as_nmi;
71     bool ext_range;
72 };
73
74 struct gic_intcfg {
75     enum gic_int_type class;
76     enum gic_tri_type trigger;
77     enum gic_grp_type group;
78     bool as_nmi;
79 };
80
81 struct gic_idomain
82 {
83     DECLARE_HASHTABLE(recs, 32);
84     BITMAP(gic_bmp) ivmap;
85     unsigned int base;
86     bool extended;
87 };
88
89 struct gic_interrupt
90 {
91     struct hlist_node node;
92
93     struct gic_idomain* domain;
94     
95     unsigned int intid;
96     struct gic_intcfg config;
97     
98     isr_cb handler;
99     void* payload;
100 };
101
102 struct gic_distributor
103 {
104     BITMAP(gic_bmp) group;
105     BITMAP(gic_bmp) grpmod;
106     BITMAP(gic_bmp) enable;
107     BITMAP(gic_bmp) disable;
108     BITMAP(gic_bmp) icfg;
109     BITMAP(gic_bmp) nmi;
110 };
111
112 struct gic_rd
113 {
114     gicreg_t base[FRAME_LEN];
115     gicreg_t sgi_base[FRAME_LEN];
116 } compact align(4);
117
118 struct gic_cpuif
119 {
120     gicreg_t base[FRAME_LEN];
121 } compact align(4);
122
123 #define gic_reg64(base, index) (*(gicreg64_t*)(&base[index]))
124 #define gic_regptr(base, index) (__ptr(&base[index]))
125
126 struct gic_pe
127 {
128     struct gic_interrupt* active;
129     reg_t iar_val;
130     unsigned int priority;
131
132     struct gic_rd* _rd;
133     struct gic_cpuif* _if;
134
135     struct gic_distributor rdist;
136
137     struct {
138         struct gic_idomain* local_ints;
139         struct gic_idomain* eppi;
140     } idomain;
141
142     struct {
143         unsigned int affinity;
144         unsigned int ppi_nr;
145         bool eppi_ready;
146     };
147 };
148
149 struct gic_its
150 {
151     gicreg_t base[FRAME_LEN];        // control regs
152     gicreg_t trn_space[FRAME_LEN];   // translation space
153 } compact align(4);
154
155 struct gic_its_v41
156 {
157     gicreg_t base[FRAME_LEN];        // control regs
158     gicreg_t trn_space[FRAME_LEN];   // translation space
159     gicreg_t vsgi_space[FRAME_LEN];  // vSGI space (v4.1+)
160 } compact align(4);
161
162 typedef unsigned char lpi_entry_t;
163
164 struct arm_gic
165 {
166     unsigned int max_intid;
167     struct gic_pe pes[NR_CPU];
168
169     struct {
170         unsigned int lpi_nr;
171         unsigned int spi_nr;
172         unsigned int espi_nr;
173         bool lpi_ready;
174         bool nmi_ready;
175         bool has_espi;
176         bool msi_via_spi;
177     };
178
179     struct {
180         gicreg_t* dist_base;
181         union {
182             struct gic_its* its;
183             struct gic_its_v41* its_v41;
184         };
185     } mmrs;
186
187     struct {
188         ptr_t prop_pa;
189         lpi_entry_t* prop_table;
190         
191         ptr_t pend;
192         BITMAP(gic_bmp) pendings;
193     } lpi_tables;
194
195     struct gic_distributor dist;
196     struct gic_distributor dist_e;
197
198     struct {
199         struct gic_idomain* lpi;
200         struct gic_idomain* spi;
201         struct gic_idomain* espi;
202     } idomain;
203
204     struct dt_node* gic_node;
205 };
206
207 #endif /* __LUNAIX_GIC_H */