xref: /kvm-unit-tests/lib/arm64/asm/gic-v3-its.h (revision 64260a5fb31b8b91a76f85ee156c265e5dfa0b1b)
1ba74b106SEric Auger /*
2ba74b106SEric Auger  * All ITS* defines are lifted from include/linux/irqchip/arm-gic-v3.h
3ba74b106SEric Auger  *
4ba74b106SEric Auger  * Copyright (C) 2020, Red Hat Inc, Eric Auger <eric.auger@redhat.com>
5ba74b106SEric Auger  *
6ba74b106SEric Auger  * This work is licensed under the terms of the GNU LGPL, version 2.
7ba74b106SEric Auger  */
8ba74b106SEric Auger #ifndef _ASMARM64_GIC_V3_ITS_H_
9ba74b106SEric Auger #define _ASMARM64_GIC_V3_ITS_H_
10ba74b106SEric Auger 
11ba74b106SEric Auger #ifndef _ASMARM_GIC_H_
12ba74b106SEric Auger #error Do not directly include <asm/gic-v3-its.h>. Include <asm/gic.h>
13ba74b106SEric Auger #endif
14ba74b106SEric Auger 
15ba74b106SEric Auger struct its_typer {
16ba74b106SEric Auger 	unsigned int ite_size;
17ba74b106SEric Auger 	unsigned int eventid_bits;
18ba74b106SEric Auger 	unsigned int deviceid_bits;
19ba74b106SEric Auger 	unsigned int collid_bits;
20ba74b106SEric Auger 	bool pta;
21ba74b106SEric Auger 	bool phys_lpi;
22ba74b106SEric Auger 	bool virt_lpi;
23ba74b106SEric Auger };
24ba74b106SEric Auger 
25ba74b106SEric Auger struct its_baser {
26ba74b106SEric Auger 	int index;
27ba74b106SEric Auger 	size_t psz;
28ba74b106SEric Auger 	int esz;
29ba74b106SEric Auger 	bool indirect;
30ba74b106SEric Auger 	void *table_addr;
31ba74b106SEric Auger };
32ba74b106SEric Auger 
33ba74b106SEric Auger #define GITS_BASER_NR_REGS		8
340c87bc34SEric Auger #define GITS_MAX_DEVICES		8
350c87bc34SEric Auger #define GITS_MAX_COLLECTIONS		8
360c87bc34SEric Auger 
370c87bc34SEric Auger struct its_device {
380c87bc34SEric Auger 	u32 device_id;	/* device ID */
390c87bc34SEric Auger 	u32 nr_ites;	/* Max Interrupt Translation Entries */
400c87bc34SEric Auger 	void *itt;	/* Interrupt Translation Table GVA */
410c87bc34SEric Auger };
420c87bc34SEric Auger 
430c87bc34SEric Auger struct its_collection {
440c87bc34SEric Auger 	u64 target_address;
450c87bc34SEric Auger 	u16 col_id;
460c87bc34SEric Auger };
47ba74b106SEric Auger 
48ba74b106SEric Auger struct its_data {
49ba74b106SEric Auger 	void *base;
50ba74b106SEric Auger 	struct its_typer typer;
51ba74b106SEric Auger 	struct its_baser device_baser;
52ba74b106SEric Auger 	struct its_baser coll_baser;
53ba74b106SEric Auger 	struct its_cmd_block *cmd_base;
54ba74b106SEric Auger 	struct its_cmd_block *cmd_write;
550c87bc34SEric Auger 	struct its_device devices[GITS_MAX_DEVICES];
560c87bc34SEric Auger 	u32 nr_devices;		/* Allocated Devices */
570c87bc34SEric Auger 	struct its_collection collections[GITS_MAX_COLLECTIONS];
580c87bc34SEric Auger 	u16 nr_collections;	/* Allocated Collections */
59ba74b106SEric Auger };
60ba74b106SEric Auger 
61ba74b106SEric Auger extern struct its_data its_data;
62ba74b106SEric Auger 
63ba74b106SEric Auger #define gicv3_its_base()		(its_data.base)
64ba74b106SEric Auger 
65ba74b106SEric Auger #define GITS_CTLR			0x0000
66ba74b106SEric Auger #define GITS_IIDR			0x0004
67ba74b106SEric Auger #define GITS_TYPER			0x0008
68ba74b106SEric Auger #define GITS_CBASER			0x0080
69ba74b106SEric Auger #define GITS_CWRITER			0x0088
70ba74b106SEric Auger #define GITS_CREADR			0x0090
71ba74b106SEric Auger #define GITS_BASER			0x0100
72ba74b106SEric Auger 
73ba74b106SEric Auger #define GITS_TYPER_PLPIS		BIT(0)
74ba74b106SEric Auger #define GITS_TYPER_VLPIS		BIT(1)
75ba74b106SEric Auger #define GITS_TYPER_ITT_ENTRY_SIZE	GENMASK_ULL(7, 4)
76ba74b106SEric Auger #define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT	4
77ba74b106SEric Auger #define GITS_TYPER_IDBITS		GENMASK_ULL(12, 8)
78ba74b106SEric Auger #define GITS_TYPER_IDBITS_SHIFT		8
79ba74b106SEric Auger #define GITS_TYPER_DEVBITS		GENMASK_ULL(17, 13)
80ba74b106SEric Auger #define GITS_TYPER_DEVBITS_SHIFT	13
81ba74b106SEric Auger #define GITS_TYPER_PTA			BIT(19)
82ba74b106SEric Auger #define GITS_TYPER_CIDBITS		GENMASK_ULL(35, 32)
83ba74b106SEric Auger #define GITS_TYPER_CIDBITS_SHIFT	32
84ba74b106SEric Auger #define GITS_TYPER_CIL			BIT(36)
85ba74b106SEric Auger 
86ba74b106SEric Auger #define GITS_CTLR_ENABLE		(1U << 0)
87ba74b106SEric Auger 
88ba74b106SEric Auger #define GITS_CBASER_VALID		(1UL << 63)
89ba74b106SEric Auger 
90ba74b106SEric Auger #define GITS_BASER_VALID		BIT(63)
91ba74b106SEric Auger #define GITS_BASER_INDIRECT		BIT(62)
92ba74b106SEric Auger #define GITS_BASER_TYPE_SHIFT		(56)
93ba74b106SEric Auger #define GITS_BASER_TYPE(r)		(((r) >> GITS_BASER_TYPE_SHIFT) & 7)
94ba74b106SEric Auger #define GITS_BASER_ENTRY_SIZE_SHIFT	(48)
95ba74b106SEric Auger #define GITS_BASER_ENTRY_SIZE(r)	((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0x1f) + 1)
96ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_SHIFT	(8)
97ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_4K		(0UL << GITS_BASER_PAGE_SIZE_SHIFT)
98ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_16K	(1UL << GITS_BASER_PAGE_SIZE_SHIFT)
99ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_64K	(2UL << GITS_BASER_PAGE_SIZE_SHIFT)
100ba74b106SEric Auger #define GITS_BASER_PAGE_SIZE_MASK	(3UL << GITS_BASER_PAGE_SIZE_SHIFT)
101ba74b106SEric Auger #define GITS_BASER_PAGES_MAX		256
102ba74b106SEric Auger #define GITS_BASER_PAGES_SHIFT		(0)
103ba74b106SEric Auger #define GITS_BASER_NR_PAGES(r)		(((r) & 0xff) + 1)
104ba74b106SEric Auger #define GITS_BASER_PHYS_ADDR_MASK	0xFFFFFFFFF000
105ba74b106SEric Auger #define GITS_BASER_TYPE_NONE		0
106ba74b106SEric Auger #define GITS_BASER_TYPE_DEVICE		1
107ba74b106SEric Auger #define GITS_BASER_TYPE_COLLECTION	4
108ba74b106SEric Auger 
109d62ae917SEric Auger /*
110d62ae917SEric Auger  * ITS commands
111d62ae917SEric Auger  */
112d62ae917SEric Auger #define GITS_CMD_MAPD			0x08
113d62ae917SEric Auger #define GITS_CMD_MAPC			0x09
114d62ae917SEric Auger #define GITS_CMD_MAPTI			0x0a
115d62ae917SEric Auger #define GITS_CMD_MAPI			0x0b
116d62ae917SEric Auger #define GITS_CMD_MOVI			0x01
117d62ae917SEric Auger #define GITS_CMD_DISCARD		0x0f
118d62ae917SEric Auger #define GITS_CMD_INV			0x0c
119d62ae917SEric Auger #define GITS_CMD_MOVALL			0x0e
120d62ae917SEric Auger #define GITS_CMD_INVALL			0x0d
121d62ae917SEric Auger #define GITS_CMD_INT			0x03
122d62ae917SEric Auger #define GITS_CMD_CLEAR			0x04
123d62ae917SEric Auger #define GITS_CMD_SYNC			0x05
124d62ae917SEric Auger 
125d62ae917SEric Auger struct its_cmd_block {
126d62ae917SEric Auger 	u64 raw_cmd[4];
127d62ae917SEric Auger };
128d62ae917SEric Auger 
129ba74b106SEric Auger extern void its_parse_typer(void);
130ba74b106SEric Auger extern void its_init(void);
131ba74b106SEric Auger extern int its_baser_lookup(int i, struct its_baser *baser);
13280374e12SEric Auger extern void its_enable_defaults(void);
1330c87bc34SEric Auger extern struct its_device *its_create_device(u32 dev_id, int nr_ites);
1340c87bc34SEric Auger extern struct its_collection *its_create_collection(u16 col_id, u32 target_pe);
135ba74b106SEric Auger 
136d62ae917SEric Auger extern void __its_send_mapd(struct its_device *dev, int valid, bool verbose);
137d62ae917SEric Auger extern void __its_send_mapc(struct its_collection *col, int valid, bool verbose);
138d62ae917SEric Auger extern void __its_send_mapti(struct its_device *dev, u32 irq_id, u32 event_id,
139d62ae917SEric Auger 			     struct its_collection *col, bool verbose);
140d62ae917SEric Auger extern void __its_send_int(struct its_device *dev, u32 event_id, bool verbose);
141d62ae917SEric Auger extern void __its_send_inv(struct its_device *dev, u32 event_id, bool verbose);
142d62ae917SEric Auger extern void __its_send_discard(struct its_device *dev, u32 event_id, bool verbose);
143d62ae917SEric Auger extern void __its_send_clear(struct its_device *dev, u32 event_id, bool verbose);
144d62ae917SEric Auger extern void __its_send_invall(struct its_collection *col, bool verbose);
145d62ae917SEric Auger extern void __its_send_movi(struct its_device *dev, struct its_collection *col,
146d62ae917SEric Auger 			    u32 id, bool verbose);
147d62ae917SEric Auger extern void __its_send_sync(struct its_collection *col, bool verbose);
148d62ae917SEric Auger 
149d62ae917SEric Auger #define its_send_mapd(dev, valid)			__its_send_mapd(dev, valid, true)
150d62ae917SEric Auger #define its_send_mapc(col, valid)			__its_send_mapc(col, valid, true)
151d62ae917SEric Auger #define its_send_mapti(dev, irqid, eventid, col)	__its_send_mapti(dev, irqid, eventid, col, true)
152d62ae917SEric Auger #define its_send_int(dev, eventid)			__its_send_int(dev, eventid, true)
153d62ae917SEric Auger #define its_send_inv(dev, eventid)			__its_send_inv(dev, eventid, true)
154d62ae917SEric Auger #define its_send_discard(dev, eventid)			__its_send_discard(dev, eventid, true)
155d62ae917SEric Auger #define its_send_clear(dev, eventid)			__its_send_clear(dev, eventid, true)
156d62ae917SEric Auger #define its_send_invall(col)				__its_send_invall(col, true)
157d62ae917SEric Auger #define its_send_movi(dev, col, id)			__its_send_movi(dev, col, id, true)
158d62ae917SEric Auger #define its_send_sync(col)				__its_send_sync(col, true)
159d62ae917SEric Auger 
160d62ae917SEric Auger #define its_send_mapd_nv(dev, valid)			__its_send_mapd(dev, valid, false)
161d62ae917SEric Auger #define its_send_mapc_nv(col, valid)			__its_send_mapc(col, valid, false)
162d62ae917SEric Auger #define its_send_mapti_nv(dev, irqid, eventid, col)	__its_send_mapti(dev, irqid, eventid, col, false)
163d62ae917SEric Auger #define its_send_int_nv(dev, eventid)			__its_send_int(dev, eventid, false)
164d62ae917SEric Auger #define its_send_inv_nv(dev, eventid)			__its_send_inv(dev, eventid, false)
165d62ae917SEric Auger #define its_send_discard_nv(dev, eventid)		__its_send_discard(dev, eventid, false)
166d62ae917SEric Auger #define its_send_clear_nv(dev, eventid)			__its_send_clear(dev, eventidn false)
167d62ae917SEric Auger #define its_send_invall_nv(col)				__its_send_invall(col, false)
168d62ae917SEric Auger #define its_send_movi_nv(dev, col, id)			__its_send_movi(dev, col, id, false)
169d62ae917SEric Auger #define its_send_sync_nv(col)				__its_send_sync(col, false)
170d62ae917SEric Auger 
171*64260a5fSEric Auger extern struct its_device *its_get_device(u32 id);
172*64260a5fSEric Auger extern struct its_collection *its_get_collection(u32 id);
173*64260a5fSEric Auger 
174ba74b106SEric Auger #endif /* _ASMARM64_GIC_V3_ITS_H_ */
175