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