1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun // Copyright (C) 2005-2017 Andes Technology Corporation 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef L2_CACHE_H 5*4882a593Smuzhiyun #define L2_CACHE_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun /* CCTL_CMD_OP */ 8*4882a593Smuzhiyun #define L2_CA_CONF_OFF 0x0 9*4882a593Smuzhiyun #define L2_IF_CONF_OFF 0x4 10*4882a593Smuzhiyun #define L2CC_SETUP_OFF 0x8 11*4882a593Smuzhiyun #define L2CC_PROT_OFF 0xC 12*4882a593Smuzhiyun #define L2CC_CTRL_OFF 0x10 13*4882a593Smuzhiyun #define L2_INT_EN_OFF 0x20 14*4882a593Smuzhiyun #define L2_STA_OFF 0x24 15*4882a593Smuzhiyun #define RDERR_ADDR_OFF 0x28 16*4882a593Smuzhiyun #define WRERR_ADDR_OFF 0x2c 17*4882a593Smuzhiyun #define EVDPTERR_ADDR_OFF 0x30 18*4882a593Smuzhiyun #define IMPL3ERR_ADDR_OFF 0x34 19*4882a593Smuzhiyun #define L2_CNT0_CTRL_OFF 0x40 20*4882a593Smuzhiyun #define L2_EVNT_CNT0_OFF 0x44 21*4882a593Smuzhiyun #define L2_CNT1_CTRL_OFF 0x48 22*4882a593Smuzhiyun #define L2_EVNT_CNT1_OFF 0x4c 23*4882a593Smuzhiyun #define L2_CCTL_CMD_OFF 0x60 24*4882a593Smuzhiyun #define L2_CCTL_STATUS_OFF 0x64 25*4882a593Smuzhiyun #define L2_LINE_TAG_OFF 0x68 26*4882a593Smuzhiyun #define L2_LINE_DPT_OFF 0x70 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define CCTL_CMD_L2_IX_INVAL 0x0 29*4882a593Smuzhiyun #define CCTL_CMD_L2_PA_INVAL 0x1 30*4882a593Smuzhiyun #define CCTL_CMD_L2_IX_WB 0x2 31*4882a593Smuzhiyun #define CCTL_CMD_L2_PA_WB 0x3 32*4882a593Smuzhiyun #define CCTL_CMD_L2_PA_WBINVAL 0x5 33*4882a593Smuzhiyun #define CCTL_CMD_L2_SYNC 0xa 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* CCTL_CMD_TYPE */ 36*4882a593Smuzhiyun #define CCTL_SINGLE_CMD 0 37*4882a593Smuzhiyun #define CCTL_BLOCK_CMD 0x10 38*4882a593Smuzhiyun #define CCTL_ALL_CMD 0x10 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /****************************************************************************** 41*4882a593Smuzhiyun * L2_CA_CONF (Cache architecture configuration) 42*4882a593Smuzhiyun *****************************************************************************/ 43*4882a593Smuzhiyun #define L2_CA_CONF_offL2SET 0 44*4882a593Smuzhiyun #define L2_CA_CONF_offL2WAY 4 45*4882a593Smuzhiyun #define L2_CA_CONF_offL2CLSZ 8 46*4882a593Smuzhiyun #define L2_CA_CONF_offL2DW 11 47*4882a593Smuzhiyun #define L2_CA_CONF_offL2PT 14 48*4882a593Smuzhiyun #define L2_CA_CONF_offL2VER 16 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define L2_CA_CONF_mskL2SET (0xFUL << L2_CA_CONF_offL2SET) 51*4882a593Smuzhiyun #define L2_CA_CONF_mskL2WAY (0xFUL << L2_CA_CONF_offL2WAY) 52*4882a593Smuzhiyun #define L2_CA_CONF_mskL2CLSZ (0x7UL << L2_CA_CONF_offL2CLSZ) 53*4882a593Smuzhiyun #define L2_CA_CONF_mskL2DW (0x7UL << L2_CA_CONF_offL2DW) 54*4882a593Smuzhiyun #define L2_CA_CONF_mskL2PT (0x3UL << L2_CA_CONF_offL2PT) 55*4882a593Smuzhiyun #define L2_CA_CONF_mskL2VER (0xFFFFUL << L2_CA_CONF_offL2VER) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /****************************************************************************** 58*4882a593Smuzhiyun * L2CC_SETUP (L2CC Setup register) 59*4882a593Smuzhiyun *****************************************************************************/ 60*4882a593Smuzhiyun #define L2CC_SETUP_offPART 0 61*4882a593Smuzhiyun #define L2CC_SETUP_mskPART (0x3UL << L2CC_SETUP_offPART) 62*4882a593Smuzhiyun #define L2CC_SETUP_offDDLATC 4 63*4882a593Smuzhiyun #define L2CC_SETUP_mskDDLATC (0x3UL << L2CC_SETUP_offDDLATC) 64*4882a593Smuzhiyun #define L2CC_SETUP_offTDLATC 8 65*4882a593Smuzhiyun #define L2CC_SETUP_mskTDLATC (0x3UL << L2CC_SETUP_offTDLATC) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /****************************************************************************** 68*4882a593Smuzhiyun * L2CC_PROT (L2CC Protect register) 69*4882a593Smuzhiyun *****************************************************************************/ 70*4882a593Smuzhiyun #define L2CC_PROT_offMRWEN 31 71*4882a593Smuzhiyun #define L2CC_PROT_mskMRWEN (0x1UL << L2CC_PROT_offMRWEN) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /****************************************************************************** 74*4882a593Smuzhiyun * L2_CCTL_STATUS_Mn (The L2CCTL command working status for Master n) 75*4882a593Smuzhiyun *****************************************************************************/ 76*4882a593Smuzhiyun #define L2CC_CTRL_offEN 31 77*4882a593Smuzhiyun #define L2CC_CTRL_mskEN (0x1UL << L2CC_CTRL_offEN) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /****************************************************************************** 80*4882a593Smuzhiyun * L2_CCTL_STATUS_Mn (The L2CCTL command working status for Master n) 81*4882a593Smuzhiyun *****************************************************************************/ 82*4882a593Smuzhiyun #define L2_CCTL_STATUS_offCMD_COMP 31 83*4882a593Smuzhiyun #define L2_CCTL_STATUS_mskCMD_COMP (0x1 << L2_CCTL_STATUS_offCMD_COMP) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun extern void __iomem *atl2c_base; 86*4882a593Smuzhiyun #include <linux/smp.h> 87*4882a593Smuzhiyun #include <asm/io.h> 88*4882a593Smuzhiyun #include <asm/bitfield.h> 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define L2C_R_REG(offset) readl(atl2c_base + offset) 91*4882a593Smuzhiyun #define L2C_W_REG(offset, value) writel(value, atl2c_base + offset) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #define L2_CMD_RDY() \ 94*4882a593Smuzhiyun do{;}while((L2C_R_REG(L2_CCTL_STATUS_OFF) & L2_CCTL_STATUS_mskCMD_COMP) == 0) 95*4882a593Smuzhiyun L2_CACHE_SET(void)96*4882a593Smuzhiyunstatic inline unsigned long L2_CACHE_SET(void) 97*4882a593Smuzhiyun { 98*4882a593Smuzhiyun return 64 << ((L2C_R_REG(L2_CA_CONF_OFF) & L2_CA_CONF_mskL2SET) >> 99*4882a593Smuzhiyun L2_CA_CONF_offL2SET); 100*4882a593Smuzhiyun } 101*4882a593Smuzhiyun L2_CACHE_WAY(void)102*4882a593Smuzhiyunstatic inline unsigned long L2_CACHE_WAY(void) 103*4882a593Smuzhiyun { 104*4882a593Smuzhiyun return 1 + 105*4882a593Smuzhiyun ((L2C_R_REG(L2_CA_CONF_OFF) & L2_CA_CONF_mskL2WAY) >> 106*4882a593Smuzhiyun L2_CA_CONF_offL2WAY); 107*4882a593Smuzhiyun } 108*4882a593Smuzhiyun L2_CACHE_LINE_SIZE(void)109*4882a593Smuzhiyunstatic inline unsigned long L2_CACHE_LINE_SIZE(void) 110*4882a593Smuzhiyun { 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun return 4 << ((L2C_R_REG(L2_CA_CONF_OFF) & L2_CA_CONF_mskL2CLSZ) >> 113*4882a593Smuzhiyun L2_CA_CONF_offL2CLSZ); 114*4882a593Smuzhiyun } 115*4882a593Smuzhiyun GET_L2CC_CTRL_CPU(unsigned long cpu)116*4882a593Smuzhiyunstatic inline unsigned long GET_L2CC_CTRL_CPU(unsigned long cpu) 117*4882a593Smuzhiyun { 118*4882a593Smuzhiyun if (cpu == smp_processor_id()) 119*4882a593Smuzhiyun return L2C_R_REG(L2CC_CTRL_OFF); 120*4882a593Smuzhiyun return L2C_R_REG(L2CC_CTRL_OFF + (cpu << 8)); 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun SET_L2CC_CTRL_CPU(unsigned long cpu,unsigned long val)123*4882a593Smuzhiyunstatic inline void SET_L2CC_CTRL_CPU(unsigned long cpu, unsigned long val) 124*4882a593Smuzhiyun { 125*4882a593Smuzhiyun if (cpu == smp_processor_id()) 126*4882a593Smuzhiyun L2C_W_REG(L2CC_CTRL_OFF, val); 127*4882a593Smuzhiyun else 128*4882a593Smuzhiyun L2C_W_REG(L2CC_CTRL_OFF + (cpu << 8), val); 129*4882a593Smuzhiyun } 130*4882a593Smuzhiyun GET_L2CC_STATUS_CPU(unsigned long cpu)131*4882a593Smuzhiyunstatic inline unsigned long GET_L2CC_STATUS_CPU(unsigned long cpu) 132*4882a593Smuzhiyun { 133*4882a593Smuzhiyun if (cpu == smp_processor_id()) 134*4882a593Smuzhiyun return L2C_R_REG(L2_CCTL_STATUS_OFF); 135*4882a593Smuzhiyun return L2C_R_REG(L2_CCTL_STATUS_OFF + (cpu << 8)); 136*4882a593Smuzhiyun } 137*4882a593Smuzhiyun #endif 138