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