xref: /kvm-unit-tests/lib/arm64/asm/gic-v3-its.h (revision 0c87bc340bedb698201e44c0c8fefb9fed646ede)
1 /*
2  * All ITS* defines are lifted from include/linux/irqchip/arm-gic-v3.h
3  *
4  * Copyright (C) 2020, Red Hat Inc, Eric Auger <eric.auger@redhat.com>
5  *
6  * This work is licensed under the terms of the GNU LGPL, version 2.
7  */
8 #ifndef _ASMARM64_GIC_V3_ITS_H_
9 #define _ASMARM64_GIC_V3_ITS_H_
10 
11 #ifndef _ASMARM_GIC_H_
12 #error Do not directly include <asm/gic-v3-its.h>. Include <asm/gic.h>
13 #endif
14 
15 struct its_typer {
16 	unsigned int ite_size;
17 	unsigned int eventid_bits;
18 	unsigned int deviceid_bits;
19 	unsigned int collid_bits;
20 	bool pta;
21 	bool phys_lpi;
22 	bool virt_lpi;
23 };
24 
25 struct its_baser {
26 	int index;
27 	size_t psz;
28 	int esz;
29 	bool indirect;
30 	void *table_addr;
31 };
32 
33 #define GITS_BASER_NR_REGS		8
34 #define GITS_MAX_DEVICES		8
35 #define GITS_MAX_COLLECTIONS		8
36 
37 struct its_device {
38 	u32 device_id;	/* device ID */
39 	u32 nr_ites;	/* Max Interrupt Translation Entries */
40 	void *itt;	/* Interrupt Translation Table GVA */
41 };
42 
43 struct its_collection {
44 	u64 target_address;
45 	u16 col_id;
46 };
47 
48 struct its_data {
49 	void *base;
50 	struct its_typer typer;
51 	struct its_baser device_baser;
52 	struct its_baser coll_baser;
53 	struct its_cmd_block *cmd_base;
54 	struct its_cmd_block *cmd_write;
55 	struct its_device devices[GITS_MAX_DEVICES];
56 	u32 nr_devices;		/* Allocated Devices */
57 	struct its_collection collections[GITS_MAX_COLLECTIONS];
58 	u16 nr_collections;	/* Allocated Collections */
59 };
60 
61 extern struct its_data its_data;
62 
63 #define gicv3_its_base()		(its_data.base)
64 
65 #define GITS_CTLR			0x0000
66 #define GITS_IIDR			0x0004
67 #define GITS_TYPER			0x0008
68 #define GITS_CBASER			0x0080
69 #define GITS_CWRITER			0x0088
70 #define GITS_CREADR			0x0090
71 #define GITS_BASER			0x0100
72 
73 #define GITS_TYPER_PLPIS		BIT(0)
74 #define GITS_TYPER_VLPIS		BIT(1)
75 #define GITS_TYPER_ITT_ENTRY_SIZE	GENMASK_ULL(7, 4)
76 #define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT	4
77 #define GITS_TYPER_IDBITS		GENMASK_ULL(12, 8)
78 #define GITS_TYPER_IDBITS_SHIFT		8
79 #define GITS_TYPER_DEVBITS		GENMASK_ULL(17, 13)
80 #define GITS_TYPER_DEVBITS_SHIFT	13
81 #define GITS_TYPER_PTA			BIT(19)
82 #define GITS_TYPER_CIDBITS		GENMASK_ULL(35, 32)
83 #define GITS_TYPER_CIDBITS_SHIFT	32
84 #define GITS_TYPER_CIL			BIT(36)
85 
86 #define GITS_CTLR_ENABLE		(1U << 0)
87 
88 #define GITS_CBASER_VALID		(1UL << 63)
89 
90 #define GITS_BASER_VALID		BIT(63)
91 #define GITS_BASER_INDIRECT		BIT(62)
92 #define GITS_BASER_TYPE_SHIFT		(56)
93 #define GITS_BASER_TYPE(r)		(((r) >> GITS_BASER_TYPE_SHIFT) & 7)
94 #define GITS_BASER_ENTRY_SIZE_SHIFT	(48)
95 #define GITS_BASER_ENTRY_SIZE(r)	((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0x1f) + 1)
96 #define GITS_BASER_PAGE_SIZE_SHIFT	(8)
97 #define GITS_BASER_PAGE_SIZE_4K		(0UL << GITS_BASER_PAGE_SIZE_SHIFT)
98 #define GITS_BASER_PAGE_SIZE_16K	(1UL << GITS_BASER_PAGE_SIZE_SHIFT)
99 #define GITS_BASER_PAGE_SIZE_64K	(2UL << GITS_BASER_PAGE_SIZE_SHIFT)
100 #define GITS_BASER_PAGE_SIZE_MASK	(3UL << GITS_BASER_PAGE_SIZE_SHIFT)
101 #define GITS_BASER_PAGES_MAX		256
102 #define GITS_BASER_PAGES_SHIFT		(0)
103 #define GITS_BASER_NR_PAGES(r)		(((r) & 0xff) + 1)
104 #define GITS_BASER_PHYS_ADDR_MASK	0xFFFFFFFFF000
105 #define GITS_BASER_TYPE_NONE		0
106 #define GITS_BASER_TYPE_DEVICE		1
107 #define GITS_BASER_TYPE_COLLECTION	4
108 
109 extern void its_parse_typer(void);
110 extern void its_init(void);
111 extern int its_baser_lookup(int i, struct its_baser *baser);
112 extern void its_enable_defaults(void);
113 extern struct its_device *its_create_device(u32 dev_id, int nr_ites);
114 extern struct its_collection *its_create_collection(u16 col_id, u32 target_pe);
115 
116 #endif /* _ASMARM64_GIC_V3_ITS_H_ */
117