xref: /OK3568_Linux_fs/kernel/arch/nds32/include/asm/l2_cache.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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