1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2012 Olivier Houchard.  All rights reserved.
  5 *
  6 * Redistribution and use in source and binary forms, with or without
  7 * modification, are permitted provided that the following conditions
  8 * are met:
  9 * 1. Redistributions of source code must retain the above copyright
 10 *    notice, this list of conditions and the following disclaimer.
 11 * 2. Redistributions in binary form must reproduce the above copyright
 12 *    notice, this list of conditions and the following disclaimer in the
 13 *    documentation and/or other materials provided with the distribution.
 14 *
 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 25 */
 26
 27/*
 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_TAG_RAM_CTRL			0x108
 66#define PL310_DATA_RAM_CTRL			0x10C
 67#define		RAM_CTRL_WRITE_SHIFT		8
 68#define		RAM_CTRL_WRITE_MASK		(0x7 << 8)
 69#define		RAM_CTRL_READ_SHIFT		4
 70#define		RAM_CTRL_READ_MASK		(0x7 << 4)
 71#define		RAM_CTRL_SETUP_SHIFT		0
 72#define		RAM_CTRL_SETUP_MASK		(0x7 << 0)
 73#define PL310_EVENT_COUNTER_CTRL	0x200
 74#define		EVENT_COUNTER_CTRL_ENABLED	(1 << 0)
 75#define		EVENT_COUNTER_CTRL_C0_RESET	(1 << 1)
 76#define		EVENT_COUNTER_CTRL_C1_RESET	(1 << 2)
 77#define PL310_EVENT_COUNTER1_CONF	0x204
 78#define PL310_EVENT_COUNTER0_CONF	0x208
 79#define		EVENT_COUNTER_CONF_NOINTR	0
 80#define		EVENT_COUNTER_CONF_INCR		1
 81#define		EVENT_COUNTER_CONF_OVFW		2
 82#define		EVENT_COUNTER_CONF_NOEV		(0 << 2)
 83#define		EVENT_COUNTER_CONF_CO		(1 << 2)
 84#define		EVENT_COUNTER_CONF_DRHIT	(2 << 2)
 85#define		EVENT_COUNTER_CONF_DRREQ	(3 << 2)
 86#define		EVENT_COUNTER_CONF_DWHIT	(4 << 2)
 87#define		EVENT_COUNTER_CONF_DWREQ	(5 << 2)
 88#define		EVENT_COUNTER_CONF_DWTREQ	(6 << 2)
 89#define		EVENT_COUNTER_CONF_DIRHIT	(7 << 2)
 90#define		EVENT_COUNTER_CONF_DIRREQ	(8 << 2)
 91#define		EVENT_COUNTER_CONF_WA		(9 << 2)
 92#define PL310_EVENT_COUNTER1_VAL	0x20C
 93#define PL310_EVENT_COUNTER0_VAL	0x210
 94#define PL310_INTR_MASK			0x214
 95#define PL310_MASKED_INTR_STAT		0x218
 96#define PL310_RAW_INTR_STAT		0x21C
 97#define PL310_INTR_CLEAR		0x220
 98#define		INTR_MASK_ALL			((1 << 9) - 1)
 99#define		INTR_MASK_ECNTR			(1 << 0)
100#define		INTR_MASK_PARRT			(1 << 1)
101#define		INTR_MASK_PARRD			(1 << 2)
102#define		INTR_MASK_ERRWT			(1 << 3)
103#define		INTR_MASK_ERRWD			(1 << 4)
104#define		INTR_MASK_ERRRT			(1 << 5)
105#define		INTR_MASK_ERRRD			(1 << 6)
106#define		INTR_MASK_SLVERR		(1 << 7)
107#define		INTR_MASK_DECERR		(1 << 8)
108#define PL310_CACHE_SYNC		0x730
109#define PL310_INV_LINE_PA		0x770
110#define PL310_INV_WAY			0x77C
111#define PL310_CLEAN_LINE_PA		0x7B0
112#define PL310_CLEAN_LINE_IDX		0x7B8
113#define PL310_CLEAN_WAY			0x7BC
114#define PL310_CLEAN_INV_LINE_PA		0x7F0
115#define PL310_CLEAN_INV_LINE_IDX	0x7F8
116#define PL310_CLEAN_INV_WAY		0x7FC
117#define PL310_LOCKDOWN_D_WAY(x)		(0x900 + ((x) * 8))
118#define PL310_LOCKDOWN_I_WAY(x)		(0x904 + ((x) * 8))
119#define PL310_LOCKDOWN_LINE_ENABLE	0x950
120#define PL310_UNLOCK_ALL_LINES_WAY	0x954
121#define PL310_ADDR_FILTER_STAR		0xC00
122#define PL310_ADDR_FILTER_END		0xC04
123#define PL310_DEBUG_CTRL		0xF40
124#define		DEBUG_CTRL_DISABLE_LINEFILL	(1 << 0)
125#define		DEBUG_CTRL_DISABLE_WRITEBACK	(1 << 1)
126#define		DEBUG_CTRL_SPNIDEN		(1 << 2)
127#define PL310_PREFETCH_CTRL		0xF60
128#define		PREFETCH_CTRL_OFFSET_MASK	(0x1f)
129#define		PREFETCH_CTRL_NOTSAMEID		(1 << 21)
130#define		PREFETCH_CTRL_INCR_DL		(1 << 23)
131#define		PREFETCH_CTRL_PREFETCH_DROP	(1 << 24)
132#define		PREFETCH_CTRL_DL_ON_WRAP	(1 << 27)
133#define		PREFETCH_CTRL_DATA_PREFETCH	(1 << 28)
134#define		PREFETCH_CTRL_INSTR_PREFETCH	(1 << 29)
135#define		PREFETCH_CTRL_DL		(1 << 30)
136#define PL310_POWER_CTRL		0xF80
137#define		POWER_CTRL_ENABLE_GATING	(1 << 1)
138#define		POWER_CTRL_ENABLE_STANDBY	(1 << 0)
139
140struct intr_config_hook;
141
142struct pl310_softc {
143	device_t	sc_dev;
144	struct resource *sc_mem_res;
145	struct resource *sc_irq_res;
146	void*		sc_irq_h;
147	int		sc_enabled;
148	struct mtx	sc_mtx;
149	u_int		sc_rtl_revision;
150	struct intr_config_hook *sc_ich;
151	boolean_t	sc_io_coherent;
152};
153
154/**
155 *	pl310_read4 - read a 32-bit value from the PL310 registers
156 *	pl310_write4 - write a 32-bit value from the PL310 registers
157 *	@off: byte offset within the register set to read from
158 *	@val: the value to write into the register
159 *
160 *
161 *	LOCKING:
162 *	None
163 *
164 *	RETURNS:
165 *	nothing in case of write function, if read function returns the value read.
166 */
167static __inline uint32_t
168pl310_read4(struct pl310_softc *sc, bus_size_t off)
169{
170
171	return bus_read_4(sc->sc_mem_res, off);
172}
173
174static __inline void
175pl310_write4(struct pl310_softc *sc, bus_size_t off, uint32_t val)
176{
177
178	bus_write_4(sc->sc_mem_res, off, val);
179}
180
181void pl310_set_ram_latency(struct pl310_softc *sc, uint32_t which_reg,
182    uint32_t read, uint32_t write, uint32_t setup);
183
184#ifndef PLATFORM
185void platform_pl310_init(struct pl310_softc *);
186void platform_pl310_write_ctrl(struct pl310_softc *, uint32_t);
187void platform_pl310_write_debug(struct pl310_softc *, uint32_t);
188#endif
189
190#endif /* PL310_H_ */