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