4 #include <lunaix/types.h>
5 #include <lunaix/ds/bitmap.h>
6 #include <lunaix/ds/hashtable.h>
8 #include <hal/devtree.h>
10 #include <asm/aa64_gic.h>
11 #include <asm-generic/isrm.h>
13 // nr of cpus, must be 1
15 #define gic_bmp PREP_BITMAP(gicreg_t, gic_intr, BMP_ORIENT_LSB)
17 #define INITID_SGI_BASE 0
18 #define INITID_SGI_END 15
20 #define INITID_PPI_BASE 16
21 #define INITID_PPI_END 31
23 #define INITID_SPI_BASE 32
24 #define INITID_SPI_END 1019
26 #define INITID_SPEC_BASE 1020
27 #define INITID_SPEC_END 1023
29 #define INITID_ePPI_BASE 1056
30 #define INITID_ePPI_END 1119
32 #define INITID_eSPI_BASE 4096
33 #define INITID_eSPI_END 5119
35 #define INITID_LPI_BASE 8192
37 #define INITID_SPI_NR (INITID_SPEC_BASE - INITID_SPI_BASE)
62 DECLARE_BITMAP(gic_bmp);
66 enum gic_int_type class;
67 enum gic_tri_type trigger;
68 enum gic_grp_type group;
69 unsigned int priority;
70 unsigned int rel_intid;
77 enum gic_int_type class;
78 enum gic_tri_type trigger;
79 enum gic_grp_type group;
85 DECLARE_HASHTABLE(recs, 32);
86 BITMAP(gic_bmp) ivmap;
93 struct hlist_node node;
95 struct gic_idomain* domain;
98 struct gic_intcfg config;
104 struct gic_distributor
106 BITMAP(gic_bmp) group;
107 BITMAP(gic_bmp) grpmod;
108 BITMAP(gic_bmp) enable;
109 BITMAP(gic_bmp) disable;
110 BITMAP(gic_bmp) icfg;
116 gicreg_t base[FRAME_LEN];
117 gicreg_t sgi_base[FRAME_LEN];
122 gicreg_t base[FRAME_LEN];
125 #define gic_reg64(base, index) (*(gicreg64_t*)(&base[index]))
126 #define gic_regptr(base, index) (__ptr(&base[index]))
130 struct gic_interrupt* active;
132 unsigned int priority;
135 struct gic_cpuif* _if;
137 struct gic_distributor rdist;
140 struct gic_idomain* local_ints;
141 struct gic_idomain* eppi;
145 unsigned int affinity;
153 gicreg_t base[FRAME_LEN]; // control regs
154 gicreg_t trn_space[FRAME_LEN]; // translation space
157 struct gic_its_regs_v41
159 gicreg_t base[FRAME_LEN]; // control regs
160 gicreg_t trn_space[FRAME_LEN]; // translation space
161 gicreg_t vsgi_space[FRAME_LEN]; // vSGI space (v4.1+)
164 struct gic_its_cmdqeue
176 struct gic_its_devmap
178 struct hlist_node node;
180 unsigned int next_evtid;
185 struct llist_header its;
188 unsigned int nr_devid;
189 unsigned int nr_evtid;
191 unsigned int sz_itte;
198 struct gic_its_regs* reg;
199 struct gic_its_regs_v41* reg_v41;
205 struct gic_its_cmdqeue *cmd_queue;
210 struct gic_its_cmd *cmds;
214 unsigned int max_cmd;
224 DECLARE_HASHTABLE(devmaps, 8);
227 typedef unsigned char lpi_entry_t;
231 unsigned int max_intid;
232 struct gic_pe pes[NR_CPU];
237 unsigned int espi_nr;
248 struct llist_header its;
252 lpi_entry_t* prop_table;
255 BITMAP(gic_bmp) pendings;
258 struct gic_distributor dist;
259 struct gic_distributor dist_e;
262 struct gic_idomain* lpi;
263 struct gic_idomain* spi;
264 struct gic_idomain* espi;
269 gic_create_from_dt(struct arm_gic* gic, struct dtn* node);
272 gic_decode_specifier(struct gic_int_param* param,
273 struct dtp_val* val, int nr_cells);
276 gic_its_create(struct arm_gic* gic, ptr_t regs);
279 gic_configure_its(struct arm_gic* gic);
281 struct gic_interrupt*
282 gic_install_int(struct gic_int_param* param, isr_cb handler, bool alloc);
285 gic_its_map_lpi(struct gic_its* its,
286 unsigned int devid, unsigned int lpid);
288 #endif /* __LUNAIX_GIC_H */