devtree: fix addr/size cells should use parent's
[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     unsigned int rel_intid;
70     int cpu_id;
71     bool as_nmi;
72     bool ext_range;
73 };
74
75 struct gic_intcfg {
76     enum gic_int_type class;
77     enum gic_tri_type trigger;
78     enum gic_grp_type group;
79     bool as_nmi;
80 };
81
82 struct gic_idomain
83 {
84     DECLARE_HASHTABLE(recs, 32);
85     BITMAP(gic_bmp) ivmap;
86     unsigned int base;
87     bool extended;
88 };
89
90 struct gic_interrupt
91 {
92     struct hlist_node node;
93
94     struct gic_idomain* domain;
95     
96     unsigned int intid;
97     struct gic_intcfg config;
98     
99     isr_cb handler;
100     void* payload;
101 };
102
103 struct gic_distributor
104 {
105     BITMAP(gic_bmp) group;
106     BITMAP(gic_bmp) grpmod;
107     BITMAP(gic_bmp) enable;
108     BITMAP(gic_bmp) disable;
109     BITMAP(gic_bmp) icfg;
110     BITMAP(gic_bmp) nmi;
111 };
112
113 struct gic_rd
114 {
115     gicreg_t base[FRAME_LEN];
116     gicreg_t sgi_base[FRAME_LEN];
117 } compact align(4);
118
119 struct gic_cpuif
120 {
121     gicreg_t base[FRAME_LEN];
122 } compact align(4);
123
124 #define gic_reg64(base, index) (*(gicreg64_t*)(&base[index]))
125 #define gic_regptr(base, index) (__ptr(&base[index]))
126
127 struct gic_pe
128 {
129     struct gic_interrupt* active;
130     reg_t iar_val;
131     unsigned int priority;
132
133     struct gic_rd* _rd;
134     struct gic_cpuif* _if;
135
136     struct gic_distributor rdist;
137
138     struct {
139         struct gic_idomain* local_ints;
140         struct gic_idomain* eppi;
141     } idomain;
142
143     struct {
144         unsigned int affinity;
145         unsigned int ppi_nr;
146         bool eppi_ready;
147     };
148 };
149
150 struct gic_its
151 {
152     gicreg_t base[FRAME_LEN];        // control regs
153     gicreg_t trn_space[FRAME_LEN];   // translation space
154 } compact align(4);
155
156 struct gic_its_v41
157 {
158     gicreg_t base[FRAME_LEN];        // control regs
159     gicreg_t trn_space[FRAME_LEN];   // translation space
160     gicreg_t vsgi_space[FRAME_LEN];  // vSGI space (v4.1+)
161 } compact align(4);
162
163 typedef unsigned char lpi_entry_t;
164
165 struct arm_gic
166 {
167     unsigned int max_intid;
168     struct gic_pe pes[NR_CPU];
169
170     struct {
171         unsigned int lpi_nr;
172         unsigned int spi_nr;
173         unsigned int espi_nr;
174         bool lpi_ready;
175         bool nmi_ready;
176         bool has_espi;
177         bool msi_via_spi;
178     };
179
180     struct {
181         gicreg_t* dist_base;
182         union {
183             struct gic_its* its;
184             struct gic_its_v41* its_v41;
185         };
186     } mmrs;
187
188     struct {
189         ptr_t prop_pa;
190         lpi_entry_t* prop_table;
191         
192         ptr_t pend;
193         BITMAP(gic_bmp) pendings;
194     } lpi_tables;
195
196     struct gic_distributor dist;
197     struct gic_distributor dist_e;
198
199     struct {
200         struct gic_idomain* lpi;
201         struct gic_idomain* spi;
202         struct gic_idomain* espi;
203     } idomain;
204 };
205
206 void
207 gic_create_from_dt(struct arm_gic* gic);
208
209 unsigned int;
210 gic_dtprop_interpret(struct gic_int_param* param, 
211                      struct dt_prop_val* val, int width);
212
213 #endif /* __LUNAIX_GIC_H */