@@ -31,6 +31,19 @@ struct its_baser {
};
#define GITS_BASER_NR_REGS 8
+#define GITS_MAX_DEVICES 8
+#define GITS_MAX_COLLECTIONS 8
+
+struct its_device {
+ u32 device_id; /* device ID */
+ u32 nr_ites; /* Max Interrupt Translation Entries */
+ void *itt; /* Interrupt Translation Table GVA */
+};
+
+struct its_collection {
+ u64 target_address;
+ u16 col_id;
+};
struct its_data {
void *base;
@@ -39,6 +52,10 @@ struct its_data {
struct its_baser coll_baser;
struct its_cmd_block *cmd_base;
struct its_cmd_block *cmd_write;
+ struct its_device devices[GITS_MAX_DEVICES];
+ u32 nr_devices; /* Allocated Devices */
+ struct its_collection collections[GITS_MAX_COLLECTIONS];
+ u16 nr_collections; /* Allocated Collections */
};
extern struct its_data its_data;
@@ -93,5 +110,7 @@ extern void its_parse_typer(void);
extern void its_init(void);
extern int its_baser_lookup(int i, struct its_baser *baser);
extern void its_enable_defaults(void);
+extern struct its_device *its_create_device(u32 dev_id, int nr_ites);
+extern struct its_collection *its_create_collection(u16 col_id, u32 target_pe);
#endif /* _ASMARM64_GIC_V3_ITS_H_ */
@@ -109,3 +109,41 @@ void its_enable_defaults(void)
writel(GITS_CTLR_ENABLE, its_data.base + GITS_CTLR);
}
+
+struct its_device *its_create_device(u32 device_id, int nr_ites)
+{
+ struct its_device *new;
+ unsigned long n;
+
+ assert(its_data.nr_devices < GITS_MAX_DEVICES);
+
+ new = &its_data.devices[its_data.nr_devices];
+
+ new->device_id = device_id;
+ new->nr_ites = nr_ites;
+
+ n = (its_data.typer.ite_size * nr_ites) >> PAGE_SHIFT;
+ new->itt = alloc_pages(get_order(n));
+
+ its_data.nr_devices++;
+ return new;
+}
+
+struct its_collection *its_create_collection(u16 col_id, u32 pe)
+{
+ struct its_collection *new;
+
+ assert(its_data.nr_collections < GITS_MAX_COLLECTIONS);
+
+ new = &its_data.collections[its_data.nr_collections];
+
+ new->col_id = col_id;
+
+ if (its_data.typer.pta)
+ new->target_address = (u64)gicv3_data.redist_base[pe];
+ else
+ new->target_address = pe << 16;
+
+ its_data.nr_collections++;
+ return new;
+}