xref: /freebsd-src/sys/arm/include/pl310.h (revision 2ff63af9b88c7413b7d71715b5532625752a248e)
1cf1a573fSOleksandr Tymoshenko /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3af3dc4a7SPedro F. Giffuni  *
4cf1a573fSOleksandr Tymoshenko  * Copyright (c) 2012 Olivier Houchard.  All rights reserved.
5cf1a573fSOleksandr Tymoshenko  *
6cf1a573fSOleksandr Tymoshenko  * Redistribution and use in source and binary forms, with or without
7cf1a573fSOleksandr Tymoshenko  * modification, are permitted provided that the following conditions
8cf1a573fSOleksandr Tymoshenko  * are met:
9cf1a573fSOleksandr Tymoshenko  * 1. Redistributions of source code must retain the above copyright
10cf1a573fSOleksandr Tymoshenko  *    notice, this list of conditions and the following disclaimer.
11cf1a573fSOleksandr Tymoshenko  * 2. Redistributions in binary form must reproduce the above copyright
12cf1a573fSOleksandr Tymoshenko  *    notice, this list of conditions and the following disclaimer in the
13cf1a573fSOleksandr Tymoshenko  *    documentation and/or other materials provided with the distribution.
14cf1a573fSOleksandr Tymoshenko  *
15cf1a573fSOleksandr Tymoshenko  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16cf1a573fSOleksandr Tymoshenko  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17cf1a573fSOleksandr Tymoshenko  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18cf1a573fSOleksandr Tymoshenko  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19cf1a573fSOleksandr Tymoshenko  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20cf1a573fSOleksandr Tymoshenko  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21cf1a573fSOleksandr Tymoshenko  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22cf1a573fSOleksandr Tymoshenko  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23cf1a573fSOleksandr Tymoshenko  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24cf1a573fSOleksandr Tymoshenko  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25cf1a573fSOleksandr Tymoshenko  */
26cf1a573fSOleksandr Tymoshenko 
27cf1a573fSOleksandr Tymoshenko /*
28cf1a573fSOleksandr Tymoshenko  */
29cf1a573fSOleksandr Tymoshenko 
30cf1a573fSOleksandr Tymoshenko #ifndef PL310_H_
31cf1a573fSOleksandr Tymoshenko #define PL310_H_
327c5338d7SOleksandr Tymoshenko 
337c5338d7SOleksandr Tymoshenko /**
347c5338d7SOleksandr Tymoshenko  *	PL310 - L2 Cache Controller register offsets.
357c5338d7SOleksandr Tymoshenko  *
367c5338d7SOleksandr Tymoshenko  */
377c5338d7SOleksandr Tymoshenko #define PL310_CACHE_ID			0x000
387c5338d7SOleksandr Tymoshenko #define 	CACHE_ID_RELEASE_SHIFT		0
397c5338d7SOleksandr Tymoshenko #define 	CACHE_ID_RELEASE_MASK		0x3f
405c9e1017SAndrew Turner #define 	CACHE_ID_RELEASE_r0p0		0x00
415c9e1017SAndrew Turner #define 	CACHE_ID_RELEASE_r1p0		0x02
425c9e1017SAndrew Turner #define 	CACHE_ID_RELEASE_r2p0		0x04
435c9e1017SAndrew Turner #define 	CACHE_ID_RELEASE_r3p0		0x05
445c9e1017SAndrew Turner #define 	CACHE_ID_RELEASE_r3p1		0x06
455c9e1017SAndrew Turner #define 	CACHE_ID_RELEASE_r3p2		0x08
465c9e1017SAndrew Turner #define 	CACHE_ID_RELEASE_r3p3		0x09
477c5338d7SOleksandr Tymoshenko #define 	CACHE_ID_PARTNUM_SHIFT		6
487c5338d7SOleksandr Tymoshenko #define 	CACHE_ID_PARTNUM_MASK		0xf
495c9e1017SAndrew Turner #define 	CACHE_ID_PARTNUM_VALUE		0x3
507c5338d7SOleksandr Tymoshenko #define PL310_CACHE_TYPE		0x004
517c5338d7SOleksandr Tymoshenko #define PL310_CTRL			0x100
527c5338d7SOleksandr Tymoshenko #define		CTRL_ENABLED			0x01
537c5338d7SOleksandr Tymoshenko #define		CTRL_DISABLED			0x00
547c5338d7SOleksandr Tymoshenko #define PL310_AUX_CTRL			0x104
557c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_MASK			0xc0000fff
567c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_ASSOCIATIVITY_SHIFT	16
577c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_WAY_SIZE_SHIFT		17
587c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_WAY_SIZE_MASK		(0x7 << 17)
597c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_SHARE_OVERRIDE		(1 << 22)
607c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_NS_LOCKDOWN		(1 << 26)
617c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_NS_INT_CTRL		(1 << 27)
627c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_DATA_PREFETCH		(1 << 28)
637c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_INSTR_PREFETCH		(1 << 29)
647c5338d7SOleksandr Tymoshenko #define 	AUX_CTRL_EARLY_BRESP		(1 << 30)
65334b9c79SIan Lepore #define PL310_TAG_RAM_CTRL			0x108
66334b9c79SIan Lepore #define PL310_DATA_RAM_CTRL			0x10C
67334b9c79SIan Lepore #define		RAM_CTRL_WRITE_SHIFT		8
68334b9c79SIan Lepore #define		RAM_CTRL_WRITE_MASK		(0x7 << 8)
69334b9c79SIan Lepore #define		RAM_CTRL_READ_SHIFT		4
70334b9c79SIan Lepore #define		RAM_CTRL_READ_MASK		(0x7 << 4)
71334b9c79SIan Lepore #define		RAM_CTRL_SETUP_SHIFT		0
72334b9c79SIan Lepore #define		RAM_CTRL_SETUP_MASK		(0x7 << 0)
737c5338d7SOleksandr Tymoshenko #define PL310_EVENT_COUNTER_CTRL	0x200
747c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CTRL_ENABLED	(1 << 0)
757c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CTRL_C0_RESET	(1 << 1)
767c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CTRL_C1_RESET	(1 << 2)
777c5338d7SOleksandr Tymoshenko #define PL310_EVENT_COUNTER1_CONF	0x204
787c5338d7SOleksandr Tymoshenko #define PL310_EVENT_COUNTER0_CONF	0x208
797c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_NOINTR	0
807c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_INCR		1
817c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_OVFW		2
827c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_NOEV		(0 << 2)
837c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_CO		(1 << 2)
847c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_DRHIT	(2 << 2)
857c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_DRREQ	(3 << 2)
867c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_DWHIT	(4 << 2)
877c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_DWREQ	(5 << 2)
887c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_DWTREQ	(6 << 2)
897c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_DIRHIT	(7 << 2)
907c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_DIRREQ	(8 << 2)
917c5338d7SOleksandr Tymoshenko #define		EVENT_COUNTER_CONF_WA		(9 << 2)
927c5338d7SOleksandr Tymoshenko #define PL310_EVENT_COUNTER1_VAL	0x20C
937c5338d7SOleksandr Tymoshenko #define PL310_EVENT_COUNTER0_VAL	0x210
947c5338d7SOleksandr Tymoshenko #define PL310_INTR_MASK			0x214
957c5338d7SOleksandr Tymoshenko #define PL310_MASKED_INTR_STAT		0x218
967c5338d7SOleksandr Tymoshenko #define PL310_RAW_INTR_STAT		0x21C
977c5338d7SOleksandr Tymoshenko #define PL310_INTR_CLEAR		0x220
987c5338d7SOleksandr Tymoshenko #define		INTR_MASK_ALL			((1 << 9) - 1)
997c5338d7SOleksandr Tymoshenko #define		INTR_MASK_ECNTR			(1 << 0)
1007c5338d7SOleksandr Tymoshenko #define		INTR_MASK_PARRT			(1 << 1)
1017c5338d7SOleksandr Tymoshenko #define		INTR_MASK_PARRD			(1 << 2)
1027c5338d7SOleksandr Tymoshenko #define		INTR_MASK_ERRWT			(1 << 3)
1037c5338d7SOleksandr Tymoshenko #define		INTR_MASK_ERRWD			(1 << 4)
1047c5338d7SOleksandr Tymoshenko #define		INTR_MASK_ERRRT			(1 << 5)
1057c5338d7SOleksandr Tymoshenko #define		INTR_MASK_ERRRD			(1 << 6)
1067c5338d7SOleksandr Tymoshenko #define		INTR_MASK_SLVERR		(1 << 7)
1077c5338d7SOleksandr Tymoshenko #define		INTR_MASK_DECERR		(1 << 8)
1087c5338d7SOleksandr Tymoshenko #define PL310_CACHE_SYNC		0x730
1097c5338d7SOleksandr Tymoshenko #define PL310_INV_LINE_PA		0x770
1107c5338d7SOleksandr Tymoshenko #define PL310_INV_WAY			0x77C
1117c5338d7SOleksandr Tymoshenko #define PL310_CLEAN_LINE_PA		0x7B0
1127c5338d7SOleksandr Tymoshenko #define PL310_CLEAN_LINE_IDX		0x7B8
1137c5338d7SOleksandr Tymoshenko #define PL310_CLEAN_WAY			0x7BC
1147c5338d7SOleksandr Tymoshenko #define PL310_CLEAN_INV_LINE_PA		0x7F0
1157c5338d7SOleksandr Tymoshenko #define PL310_CLEAN_INV_LINE_IDX	0x7F8
1167c5338d7SOleksandr Tymoshenko #define PL310_CLEAN_INV_WAY		0x7FC
1177c5338d7SOleksandr Tymoshenko #define PL310_LOCKDOWN_D_WAY(x)		(0x900 + ((x) * 8))
1187c5338d7SOleksandr Tymoshenko #define PL310_LOCKDOWN_I_WAY(x)		(0x904 + ((x) * 8))
1197c5338d7SOleksandr Tymoshenko #define PL310_LOCKDOWN_LINE_ENABLE	0x950
1207c5338d7SOleksandr Tymoshenko #define PL310_UNLOCK_ALL_LINES_WAY	0x954
1217c5338d7SOleksandr Tymoshenko #define PL310_ADDR_FILTER_STAR		0xC00
1227c5338d7SOleksandr Tymoshenko #define PL310_ADDR_FILTER_END		0xC04
1237c5338d7SOleksandr Tymoshenko #define PL310_DEBUG_CTRL		0xF40
1247b413882SIan Lepore #define		DEBUG_CTRL_DISABLE_LINEFILL	(1 << 0)
1257b413882SIan Lepore #define		DEBUG_CTRL_DISABLE_WRITEBACK	(1 << 1)
126334b9c79SIan Lepore #define		DEBUG_CTRL_SPNIDEN		(1 << 2)
1277c5338d7SOleksandr Tymoshenko #define PL310_PREFETCH_CTRL		0xF60
1287c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_OFFSET_MASK	(0x1f)
1297c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_NOTSAMEID		(1 << 21)
1307c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_INCR_DL		(1 << 23)
1317c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_PREFETCH_DROP	(1 << 24)
1327c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_DL_ON_WRAP	(1 << 27)
1337c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_DATA_PREFETCH	(1 << 28)
1347c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_INSTR_PREFETCH	(1 << 29)
1357c5338d7SOleksandr Tymoshenko #define		PREFETCH_CTRL_DL		(1 << 30)
136185bf88eSEd Maste #define PL310_POWER_CTRL		0xF80
137803b7f05SZbigniew Bodek #define		POWER_CTRL_ENABLE_GATING	(1 << 1)
138803b7f05SZbigniew Bodek #define		POWER_CTRL_ENABLE_STANDBY	(1 << 0)
1397c5338d7SOleksandr Tymoshenko 
14059866d11SIan Lepore struct intr_config_hook;
14159866d11SIan Lepore 
142cf1a573fSOleksandr Tymoshenko struct pl310_softc {
1437c5338d7SOleksandr Tymoshenko 	device_t	sc_dev;
144cf1a573fSOleksandr Tymoshenko 	struct resource *sc_mem_res;
1457c5338d7SOleksandr Tymoshenko 	struct resource *sc_irq_res;
1467c5338d7SOleksandr Tymoshenko 	void*		sc_irq_h;
1477c5338d7SOleksandr Tymoshenko 	int		sc_enabled;
1487c5338d7SOleksandr Tymoshenko 	struct mtx	sc_mtx;
149a4244dbfSAndrew Turner 	u_int		sc_rtl_revision;
15059866d11SIan Lepore 	struct intr_config_hook *sc_ich;
1518cbc8d3dSZbigniew Bodek 	boolean_t	sc_io_coherent;
152cf1a573fSOleksandr Tymoshenko };
153cf1a573fSOleksandr Tymoshenko 
1547c5338d7SOleksandr Tymoshenko /**
1557c5338d7SOleksandr Tymoshenko  *	pl310_read4 - read a 32-bit value from the PL310 registers
1567c5338d7SOleksandr Tymoshenko  *	pl310_write4 - write a 32-bit value from the PL310 registers
1577c5338d7SOleksandr Tymoshenko  *	@off: byte offset within the register set to read from
1587c5338d7SOleksandr Tymoshenko  *	@val: the value to write into the register
1597c5338d7SOleksandr Tymoshenko  *
1607c5338d7SOleksandr Tymoshenko  *
1617c5338d7SOleksandr Tymoshenko  *	LOCKING:
1627c5338d7SOleksandr Tymoshenko  *	None
1637c5338d7SOleksandr Tymoshenko  *
1647c5338d7SOleksandr Tymoshenko  *	RETURNS:
1657c5338d7SOleksandr Tymoshenko  *	nothing in case of write function, if read function returns the value read.
1667c5338d7SOleksandr Tymoshenko  */
1677c5338d7SOleksandr Tymoshenko static __inline uint32_t
pl310_read4(struct pl310_softc * sc,bus_size_t off)1687c5338d7SOleksandr Tymoshenko pl310_read4(struct pl310_softc *sc, bus_size_t off)
1697c5338d7SOleksandr Tymoshenko {
1707c5338d7SOleksandr Tymoshenko 
1717c5338d7SOleksandr Tymoshenko 	return bus_read_4(sc->sc_mem_res, off);
1727c5338d7SOleksandr Tymoshenko }
1737c5338d7SOleksandr Tymoshenko 
1747c5338d7SOleksandr Tymoshenko static __inline void
pl310_write4(struct pl310_softc * sc,bus_size_t off,uint32_t val)1757c5338d7SOleksandr Tymoshenko pl310_write4(struct pl310_softc *sc, bus_size_t off, uint32_t val)
1767c5338d7SOleksandr Tymoshenko {
1777c5338d7SOleksandr Tymoshenko 
1787c5338d7SOleksandr Tymoshenko 	bus_write_4(sc->sc_mem_res, off, val);
1797c5338d7SOleksandr Tymoshenko }
1807c5338d7SOleksandr Tymoshenko 
181334b9c79SIan Lepore void pl310_set_ram_latency(struct pl310_softc *sc, uint32_t which_reg,
182334b9c79SIan Lepore     uint32_t read, uint32_t write, uint32_t setup);
18388b3694bSIan Lepore 
18475f48c23SAndrew Turner #ifndef PLATFORM
1857c5338d7SOleksandr Tymoshenko void platform_pl310_init(struct pl310_softc *);
1867c5338d7SOleksandr Tymoshenko void platform_pl310_write_ctrl(struct pl310_softc *, uint32_t);
1877c5338d7SOleksandr Tymoshenko void platform_pl310_write_debug(struct pl310_softc *, uint32_t);
18875f48c23SAndrew Turner #endif
189cf1a573fSOleksandr Tymoshenko 
190cf1a573fSOleksandr Tymoshenko #endif /* PL310_H_ */
191