f68f01fa5f
This allows multiple instances of SoCs that use the pl310 driver to be built within the same kernel: * Add access to the platform_t object from outside platform.c * Use this with the pl310 driver There is a new platform_pl310 interface to replace the existing code. SoCs need to implement the init method, and if they have special requirements to write to the two registers we care about will also need to implement the write_ctrl and write_debug methods. Differential Revision: https://reviews.freebsd.org/D11546
191 lines
6.5 KiB
C
191 lines
6.5 KiB
C
/*-
|
|
* Copyright (c) 2012 Olivier Houchard. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
|
|
/*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef PL310_H_
|
|
#define PL310_H_
|
|
|
|
/**
|
|
* PL310 - L2 Cache Controller register offsets.
|
|
*
|
|
*/
|
|
#define PL310_CACHE_ID 0x000
|
|
#define CACHE_ID_RELEASE_SHIFT 0
|
|
#define CACHE_ID_RELEASE_MASK 0x3f
|
|
#define CACHE_ID_RELEASE_r0p0 0x00
|
|
#define CACHE_ID_RELEASE_r1p0 0x02
|
|
#define CACHE_ID_RELEASE_r2p0 0x04
|
|
#define CACHE_ID_RELEASE_r3p0 0x05
|
|
#define CACHE_ID_RELEASE_r3p1 0x06
|
|
#define CACHE_ID_RELEASE_r3p2 0x08
|
|
#define CACHE_ID_RELEASE_r3p3 0x09
|
|
#define CACHE_ID_PARTNUM_SHIFT 6
|
|
#define CACHE_ID_PARTNUM_MASK 0xf
|
|
#define CACHE_ID_PARTNUM_VALUE 0x3
|
|
#define PL310_CACHE_TYPE 0x004
|
|
#define PL310_CTRL 0x100
|
|
#define CTRL_ENABLED 0x01
|
|
#define CTRL_DISABLED 0x00
|
|
#define PL310_AUX_CTRL 0x104
|
|
#define AUX_CTRL_MASK 0xc0000fff
|
|
#define AUX_CTRL_ASSOCIATIVITY_SHIFT 16
|
|
#define AUX_CTRL_WAY_SIZE_SHIFT 17
|
|
#define AUX_CTRL_WAY_SIZE_MASK (0x7 << 17)
|
|
#define AUX_CTRL_SHARE_OVERRIDE (1 << 22)
|
|
#define AUX_CTRL_NS_LOCKDOWN (1 << 26)
|
|
#define AUX_CTRL_NS_INT_CTRL (1 << 27)
|
|
#define AUX_CTRL_DATA_PREFETCH (1 << 28)
|
|
#define AUX_CTRL_INSTR_PREFETCH (1 << 29)
|
|
#define AUX_CTRL_EARLY_BRESP (1 << 30)
|
|
#define PL310_TAG_RAM_CTRL 0x108
|
|
#define PL310_DATA_RAM_CTRL 0x10C
|
|
#define RAM_CTRL_WRITE_SHIFT 8
|
|
#define RAM_CTRL_WRITE_MASK (0x7 << 8)
|
|
#define RAM_CTRL_READ_SHIFT 4
|
|
#define RAM_CTRL_READ_MASK (0x7 << 4)
|
|
#define RAM_CTRL_SETUP_SHIFT 0
|
|
#define RAM_CTRL_SETUP_MASK (0x7 << 0)
|
|
#define PL310_EVENT_COUNTER_CTRL 0x200
|
|
#define EVENT_COUNTER_CTRL_ENABLED (1 << 0)
|
|
#define EVENT_COUNTER_CTRL_C0_RESET (1 << 1)
|
|
#define EVENT_COUNTER_CTRL_C1_RESET (1 << 2)
|
|
#define PL310_EVENT_COUNTER1_CONF 0x204
|
|
#define PL310_EVENT_COUNTER0_CONF 0x208
|
|
#define EVENT_COUNTER_CONF_NOINTR 0
|
|
#define EVENT_COUNTER_CONF_INCR 1
|
|
#define EVENT_COUNTER_CONF_OVFW 2
|
|
#define EVENT_COUNTER_CONF_NOEV (0 << 2)
|
|
#define EVENT_COUNTER_CONF_CO (1 << 2)
|
|
#define EVENT_COUNTER_CONF_DRHIT (2 << 2)
|
|
#define EVENT_COUNTER_CONF_DRREQ (3 << 2)
|
|
#define EVENT_COUNTER_CONF_DWHIT (4 << 2)
|
|
#define EVENT_COUNTER_CONF_DWREQ (5 << 2)
|
|
#define EVENT_COUNTER_CONF_DWTREQ (6 << 2)
|
|
#define EVENT_COUNTER_CONF_DIRHIT (7 << 2)
|
|
#define EVENT_COUNTER_CONF_DIRREQ (8 << 2)
|
|
#define EVENT_COUNTER_CONF_WA (9 << 2)
|
|
#define PL310_EVENT_COUNTER1_VAL 0x20C
|
|
#define PL310_EVENT_COUNTER0_VAL 0x210
|
|
#define PL310_INTR_MASK 0x214
|
|
#define PL310_MASKED_INTR_STAT 0x218
|
|
#define PL310_RAW_INTR_STAT 0x21C
|
|
#define PL310_INTR_CLEAR 0x220
|
|
#define INTR_MASK_ALL ((1 << 9) - 1)
|
|
#define INTR_MASK_ECNTR (1 << 0)
|
|
#define INTR_MASK_PARRT (1 << 1)
|
|
#define INTR_MASK_PARRD (1 << 2)
|
|
#define INTR_MASK_ERRWT (1 << 3)
|
|
#define INTR_MASK_ERRWD (1 << 4)
|
|
#define INTR_MASK_ERRRT (1 << 5)
|
|
#define INTR_MASK_ERRRD (1 << 6)
|
|
#define INTR_MASK_SLVERR (1 << 7)
|
|
#define INTR_MASK_DECERR (1 << 8)
|
|
#define PL310_CACHE_SYNC 0x730
|
|
#define PL310_INV_LINE_PA 0x770
|
|
#define PL310_INV_WAY 0x77C
|
|
#define PL310_CLEAN_LINE_PA 0x7B0
|
|
#define PL310_CLEAN_LINE_IDX 0x7B8
|
|
#define PL310_CLEAN_WAY 0x7BC
|
|
#define PL310_CLEAN_INV_LINE_PA 0x7F0
|
|
#define PL310_CLEAN_INV_LINE_IDX 0x7F8
|
|
#define PL310_CLEAN_INV_WAY 0x7FC
|
|
#define PL310_LOCKDOWN_D_WAY(x) (0x900 + ((x) * 8))
|
|
#define PL310_LOCKDOWN_I_WAY(x) (0x904 + ((x) * 8))
|
|
#define PL310_LOCKDOWN_LINE_ENABLE 0x950
|
|
#define PL310_UNLOCK_ALL_LINES_WAY 0x954
|
|
#define PL310_ADDR_FILTER_STAR 0xC00
|
|
#define PL310_ADDR_FILTER_END 0xC04
|
|
#define PL310_DEBUG_CTRL 0xF40
|
|
#define DEBUG_CTRL_DISABLE_LINEFILL (1 << 0)
|
|
#define DEBUG_CTRL_DISABLE_WRITEBACK (1 << 1)
|
|
#define DEBUG_CTRL_SPNIDEN (1 << 2)
|
|
#define PL310_PREFETCH_CTRL 0xF60
|
|
#define PREFETCH_CTRL_OFFSET_MASK (0x1f)
|
|
#define PREFETCH_CTRL_NOTSAMEID (1 << 21)
|
|
#define PREFETCH_CTRL_INCR_DL (1 << 23)
|
|
#define PREFETCH_CTRL_PREFETCH_DROP (1 << 24)
|
|
#define PREFETCH_CTRL_DL_ON_WRAP (1 << 27)
|
|
#define PREFETCH_CTRL_DATA_PREFETCH (1 << 28)
|
|
#define PREFETCH_CTRL_INSTR_PREFETCH (1 << 29)
|
|
#define PREFETCH_CTRL_DL (1 << 30)
|
|
#define PL310_POWER_CTRL 0xF80
|
|
#define POWER_CTRL_ENABLE_GATING (1 << 1)
|
|
#define POWER_CTRL_ENABLE_STANDBY (1 << 0)
|
|
|
|
struct intr_config_hook;
|
|
|
|
struct pl310_softc {
|
|
device_t sc_dev;
|
|
struct resource *sc_mem_res;
|
|
struct resource *sc_irq_res;
|
|
void* sc_irq_h;
|
|
int sc_enabled;
|
|
struct mtx sc_mtx;
|
|
u_int sc_rtl_revision;
|
|
struct intr_config_hook *sc_ich;
|
|
boolean_t sc_io_coherent;
|
|
};
|
|
|
|
/**
|
|
* pl310_read4 - read a 32-bit value from the PL310 registers
|
|
* pl310_write4 - write a 32-bit value from the PL310 registers
|
|
* @off: byte offset within the register set to read from
|
|
* @val: the value to write into the register
|
|
*
|
|
*
|
|
* LOCKING:
|
|
* None
|
|
*
|
|
* RETURNS:
|
|
* nothing in case of write function, if read function returns the value read.
|
|
*/
|
|
static __inline uint32_t
|
|
pl310_read4(struct pl310_softc *sc, bus_size_t off)
|
|
{
|
|
|
|
return bus_read_4(sc->sc_mem_res, off);
|
|
}
|
|
|
|
static __inline void
|
|
pl310_write4(struct pl310_softc *sc, bus_size_t off, uint32_t val)
|
|
{
|
|
|
|
bus_write_4(sc->sc_mem_res, off, val);
|
|
}
|
|
|
|
void pl310_set_ram_latency(struct pl310_softc *sc, uint32_t which_reg,
|
|
uint32_t read, uint32_t write, uint32_t setup);
|
|
|
|
#ifndef PLATFORM
|
|
void platform_pl310_init(struct pl310_softc *);
|
|
void platform_pl310_write_ctrl(struct pl310_softc *, uint32_t);
|
|
void platform_pl310_write_debug(struct pl310_softc *, uint32_t);
|
|
#endif
|
|
|
|
#endif /* PL310_H_ */
|