xref: /freebsd/sys/arm/include/pl310.h (revision 3f0164abf32b9b761e0a2cb4bdca3a8b84f156d4)
1 /*-
2  * Copyright (c) 2012 Olivier Houchard.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24 
25 
26 /*
27  * $FreeBSD$
28  */
29 
30 #ifndef PL310_H_
31 #define PL310_H_
32 
33 /**
34  *	PL310 - L2 Cache Controller register offsets.
35  *
36  */
37 #define PL310_CACHE_ID			0x000
38 #define 	CACHE_ID_RELEASE_SHIFT		0
39 #define 	CACHE_ID_RELEASE_MASK		0x3f
40 #define 	CACHE_ID_RELEASE_r0p0		0x00
41 #define 	CACHE_ID_RELEASE_r1p0		0x02
42 #define 	CACHE_ID_RELEASE_r2p0		0x04
43 #define 	CACHE_ID_RELEASE_r3p0		0x05
44 #define 	CACHE_ID_RELEASE_r3p1		0x06
45 #define 	CACHE_ID_RELEASE_r3p2		0x08
46 #define 	CACHE_ID_RELEASE_r3p3		0x09
47 #define 	CACHE_ID_PARTNUM_SHIFT		6
48 #define 	CACHE_ID_PARTNUM_MASK		0xf
49 #define 	CACHE_ID_PARTNUM_VALUE		0x3
50 #define PL310_CACHE_TYPE		0x004
51 #define PL310_CTRL			0x100
52 #define		CTRL_ENABLED			0x01
53 #define		CTRL_DISABLED			0x00
54 #define PL310_AUX_CTRL			0x104
55 #define 	AUX_CTRL_MASK			0xc0000fff
56 #define 	AUX_CTRL_ASSOCIATIVITY_SHIFT	16
57 #define 	AUX_CTRL_WAY_SIZE_SHIFT		17
58 #define 	AUX_CTRL_WAY_SIZE_MASK		(0x7 << 17)
59 #define 	AUX_CTRL_SHARE_OVERRIDE		(1 << 22)
60 #define 	AUX_CTRL_NS_LOCKDOWN		(1 << 26)
61 #define 	AUX_CTRL_NS_INT_CTRL		(1 << 27)
62 #define 	AUX_CTRL_DATA_PREFETCH		(1 << 28)
63 #define 	AUX_CTRL_INSTR_PREFETCH		(1 << 29)
64 #define 	AUX_CTRL_EARLY_BRESP		(1 << 30)
65 #define PL310_EVENT_COUNTER_CTRL	0x200
66 #define		EVENT_COUNTER_CTRL_ENABLED	(1 << 0)
67 #define		EVENT_COUNTER_CTRL_C0_RESET	(1 << 1)
68 #define		EVENT_COUNTER_CTRL_C1_RESET	(1 << 2)
69 #define PL310_EVENT_COUNTER1_CONF	0x204
70 #define PL310_EVENT_COUNTER0_CONF	0x208
71 #define		EVENT_COUNTER_CONF_NOINTR	0
72 #define		EVENT_COUNTER_CONF_INCR		1
73 #define		EVENT_COUNTER_CONF_OVFW		2
74 #define		EVENT_COUNTER_CONF_NOEV		(0 << 2)
75 #define		EVENT_COUNTER_CONF_CO		(1 << 2)
76 #define		EVENT_COUNTER_CONF_DRHIT	(2 << 2)
77 #define		EVENT_COUNTER_CONF_DRREQ	(3 << 2)
78 #define		EVENT_COUNTER_CONF_DWHIT	(4 << 2)
79 #define		EVENT_COUNTER_CONF_DWREQ	(5 << 2)
80 #define		EVENT_COUNTER_CONF_DWTREQ	(6 << 2)
81 #define		EVENT_COUNTER_CONF_DIRHIT	(7 << 2)
82 #define		EVENT_COUNTER_CONF_DIRREQ	(8 << 2)
83 #define		EVENT_COUNTER_CONF_WA		(9 << 2)
84 #define PL310_EVENT_COUNTER1_VAL	0x20C
85 #define PL310_EVENT_COUNTER0_VAL	0x210
86 #define PL310_INTR_MASK			0x214
87 #define PL310_MASKED_INTR_STAT		0x218
88 #define PL310_RAW_INTR_STAT		0x21C
89 #define PL310_INTR_CLEAR		0x220
90 #define		INTR_MASK_ALL			((1 << 9) - 1)
91 #define		INTR_MASK_ECNTR			(1 << 0)
92 #define		INTR_MASK_PARRT			(1 << 1)
93 #define		INTR_MASK_PARRD			(1 << 2)
94 #define		INTR_MASK_ERRWT			(1 << 3)
95 #define		INTR_MASK_ERRWD			(1 << 4)
96 #define		INTR_MASK_ERRRT			(1 << 5)
97 #define		INTR_MASK_ERRRD			(1 << 6)
98 #define		INTR_MASK_SLVERR		(1 << 7)
99 #define		INTR_MASK_DECERR		(1 << 8)
100 #define PL310_CACHE_SYNC		0x730
101 #define PL310_INV_LINE_PA		0x770
102 #define PL310_INV_WAY			0x77C
103 #define PL310_CLEAN_LINE_PA		0x7B0
104 #define PL310_CLEAN_LINE_IDX		0x7B8
105 #define PL310_CLEAN_WAY			0x7BC
106 #define PL310_CLEAN_INV_LINE_PA		0x7F0
107 #define PL310_CLEAN_INV_LINE_IDX	0x7F8
108 #define PL310_CLEAN_INV_WAY		0x7FC
109 #define PL310_LOCKDOWN_D_WAY(x)		(0x900 + ((x) * 8))
110 #define PL310_LOCKDOWN_I_WAY(x)		(0x904 + ((x) * 8))
111 #define PL310_LOCKDOWN_LINE_ENABLE	0x950
112 #define PL310_UNLOCK_ALL_LINES_WAY	0x954
113 #define PL310_ADDR_FILTER_STAR		0xC00
114 #define PL310_ADDR_FILTER_END		0xC04
115 #define PL310_DEBUG_CTRL		0xF40
116 #define PL310_PREFETCH_CTRL		0xF60
117 #define		PREFETCH_CTRL_OFFSET_MASK	(0x1f)
118 #define		PREFETCH_CTRL_NOTSAMEID		(1 << 21)
119 #define		PREFETCH_CTRL_INCR_DL		(1 << 23)
120 #define		PREFETCH_CTRL_PREFETCH_DROP	(1 << 24)
121 #define		PREFETCH_CTRL_DL_ON_WRAP	(1 << 27)
122 #define		PREFETCH_CTRL_DATA_PREFETCH	(1 << 28)
123 #define		PREFETCH_CTRL_INSTR_PREFETCH	(1 << 29)
124 #define		PREFETCH_CTRL_DL		(1 << 30)
125 #define PL310_POWER_CTRL		0xF60
126 
127 struct pl310_softc {
128 	device_t	sc_dev;
129 	struct resource *sc_mem_res;
130 	struct resource *sc_irq_res;
131 	void*		sc_irq_h;
132 	int		sc_enabled;
133 	struct mtx	sc_mtx;
134 	u_int		sc_rtl_revision;
135 };
136 
137 /**
138  *	pl310_read4 - read a 32-bit value from the PL310 registers
139  *	pl310_write4 - write a 32-bit value from the PL310 registers
140  *	@off: byte offset within the register set to read from
141  *	@val: the value to write into the register
142  *
143  *
144  *	LOCKING:
145  *	None
146  *
147  *	RETURNS:
148  *	nothing in case of write function, if read function returns the value read.
149  */
150 static __inline uint32_t
151 pl310_read4(struct pl310_softc *sc, bus_size_t off)
152 {
153 
154 	return bus_read_4(sc->sc_mem_res, off);
155 }
156 
157 static __inline void
158 pl310_write4(struct pl310_softc *sc, bus_size_t off, uint32_t val)
159 {
160 
161 	bus_write_4(sc->sc_mem_res, off, val);
162 }
163 
164 void platform_pl310_init(struct pl310_softc *);
165 void platform_pl310_write_ctrl(struct pl310_softc *, uint32_t);
166 void platform_pl310_write_debug(struct pl310_softc *, uint32_t);
167 
168 #endif /* PL310_H_ */
169