xref: /OK3568_Linux_fs/kernel/drivers/bus/omap_l3_smx.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * OMAP3XXX L3 Interconnect Driver header
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2011 Texas Corporation
6*4882a593Smuzhiyun  *	Felipe Balbi <balbi@ti.com>
7*4882a593Smuzhiyun  *	Santosh Shilimkar <santosh.shilimkar@ti.com>
8*4882a593Smuzhiyun  *	sricharan <r.sricharan@ti.com>
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun #ifndef __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H
11*4882a593Smuzhiyun #define __ARCH_ARM_MACH_OMAP2_L3_INTERCONNECT_3XXX_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* Register definitions. All 64-bit wide */
14*4882a593Smuzhiyun #define L3_COMPONENT			0x000
15*4882a593Smuzhiyun #define L3_CORE				0x018
16*4882a593Smuzhiyun #define L3_AGENT_CONTROL		0x020
17*4882a593Smuzhiyun #define L3_AGENT_STATUS			0x028
18*4882a593Smuzhiyun #define L3_ERROR_LOG			0x058
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define L3_ERROR_LOG_MULTI		(1 << 31)
21*4882a593Smuzhiyun #define L3_ERROR_LOG_SECONDARY		(1 << 30)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define L3_ERROR_LOG_ADDR		0x060
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /* Register definitions for Sideband Interconnect */
26*4882a593Smuzhiyun #define L3_SI_CONTROL			0x020
27*4882a593Smuzhiyun #define L3_SI_FLAG_STATUS_0		0x510
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun static const u64 shift = 1;
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define L3_STATUS_0_MPUIA_BRST		(shift << 0)
32*4882a593Smuzhiyun #define L3_STATUS_0_MPUIA_RSP		(shift << 1)
33*4882a593Smuzhiyun #define L3_STATUS_0_MPUIA_INBAND	(shift << 2)
34*4882a593Smuzhiyun #define L3_STATUS_0_IVAIA_BRST		(shift << 6)
35*4882a593Smuzhiyun #define L3_STATUS_0_IVAIA_RSP		(shift << 7)
36*4882a593Smuzhiyun #define L3_STATUS_0_IVAIA_INBAND	(shift << 8)
37*4882a593Smuzhiyun #define L3_STATUS_0_SGXIA_BRST		(shift << 9)
38*4882a593Smuzhiyun #define L3_STATUS_0_SGXIA_RSP		(shift << 10)
39*4882a593Smuzhiyun #define L3_STATUS_0_SGXIA_MERROR	(shift << 11)
40*4882a593Smuzhiyun #define L3_STATUS_0_CAMIA_BRST		(shift << 12)
41*4882a593Smuzhiyun #define L3_STATUS_0_CAMIA_RSP		(shift << 13)
42*4882a593Smuzhiyun #define L3_STATUS_0_CAMIA_INBAND	(shift << 14)
43*4882a593Smuzhiyun #define L3_STATUS_0_DISPIA_BRST		(shift << 15)
44*4882a593Smuzhiyun #define L3_STATUS_0_DISPIA_RSP		(shift << 16)
45*4882a593Smuzhiyun #define L3_STATUS_0_DMARDIA_BRST	(shift << 18)
46*4882a593Smuzhiyun #define L3_STATUS_0_DMARDIA_RSP		(shift << 19)
47*4882a593Smuzhiyun #define L3_STATUS_0_DMAWRIA_BRST	(shift << 21)
48*4882a593Smuzhiyun #define L3_STATUS_0_DMAWRIA_RSP		(shift << 22)
49*4882a593Smuzhiyun #define L3_STATUS_0_USBOTGIA_BRST	(shift << 24)
50*4882a593Smuzhiyun #define L3_STATUS_0_USBOTGIA_RSP	(shift << 25)
51*4882a593Smuzhiyun #define L3_STATUS_0_USBOTGIA_INBAND	(shift << 26)
52*4882a593Smuzhiyun #define L3_STATUS_0_USBHOSTIA_BRST	(shift << 27)
53*4882a593Smuzhiyun #define L3_STATUS_0_USBHOSTIA_INBAND	(shift << 28)
54*4882a593Smuzhiyun #define L3_STATUS_0_SMSTA_REQ		(shift << 48)
55*4882a593Smuzhiyun #define L3_STATUS_0_GPMCTA_REQ		(shift << 49)
56*4882a593Smuzhiyun #define L3_STATUS_0_OCMRAMTA_REQ	(shift << 50)
57*4882a593Smuzhiyun #define L3_STATUS_0_OCMROMTA_REQ	(shift << 51)
58*4882a593Smuzhiyun #define L3_STATUS_0_IVATA_REQ		(shift << 54)
59*4882a593Smuzhiyun #define L3_STATUS_0_SGXTA_REQ		(shift << 55)
60*4882a593Smuzhiyun #define L3_STATUS_0_SGXTA_SERROR	(shift << 56)
61*4882a593Smuzhiyun #define L3_STATUS_0_GPMCTA_SERROR	(shift << 57)
62*4882a593Smuzhiyun #define L3_STATUS_0_L4CORETA_REQ	(shift << 58)
63*4882a593Smuzhiyun #define L3_STATUS_0_L4PERTA_REQ		(shift << 59)
64*4882a593Smuzhiyun #define L3_STATUS_0_L4EMUTA_REQ		(shift << 60)
65*4882a593Smuzhiyun #define L3_STATUS_0_MAD2DTA_REQ		(shift << 61)
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define L3_STATUS_0_TIMEOUT_MASK	(L3_STATUS_0_MPUIA_BRST		\
68*4882a593Smuzhiyun 					| L3_STATUS_0_MPUIA_RSP		\
69*4882a593Smuzhiyun 					| L3_STATUS_0_IVAIA_BRST	\
70*4882a593Smuzhiyun 					| L3_STATUS_0_IVAIA_RSP		\
71*4882a593Smuzhiyun 					| L3_STATUS_0_SGXIA_BRST	\
72*4882a593Smuzhiyun 					| L3_STATUS_0_SGXIA_RSP		\
73*4882a593Smuzhiyun 					| L3_STATUS_0_CAMIA_BRST	\
74*4882a593Smuzhiyun 					| L3_STATUS_0_CAMIA_RSP		\
75*4882a593Smuzhiyun 					| L3_STATUS_0_DISPIA_BRST	\
76*4882a593Smuzhiyun 					| L3_STATUS_0_DISPIA_RSP	\
77*4882a593Smuzhiyun 					| L3_STATUS_0_DMARDIA_BRST	\
78*4882a593Smuzhiyun 					| L3_STATUS_0_DMARDIA_RSP	\
79*4882a593Smuzhiyun 					| L3_STATUS_0_DMAWRIA_BRST	\
80*4882a593Smuzhiyun 					| L3_STATUS_0_DMAWRIA_RSP	\
81*4882a593Smuzhiyun 					| L3_STATUS_0_USBOTGIA_BRST	\
82*4882a593Smuzhiyun 					| L3_STATUS_0_USBOTGIA_RSP	\
83*4882a593Smuzhiyun 					| L3_STATUS_0_USBHOSTIA_BRST	\
84*4882a593Smuzhiyun 					| L3_STATUS_0_SMSTA_REQ		\
85*4882a593Smuzhiyun 					| L3_STATUS_0_GPMCTA_REQ	\
86*4882a593Smuzhiyun 					| L3_STATUS_0_OCMRAMTA_REQ	\
87*4882a593Smuzhiyun 					| L3_STATUS_0_OCMROMTA_REQ	\
88*4882a593Smuzhiyun 					| L3_STATUS_0_IVATA_REQ		\
89*4882a593Smuzhiyun 					| L3_STATUS_0_SGXTA_REQ		\
90*4882a593Smuzhiyun 					| L3_STATUS_0_L4CORETA_REQ	\
91*4882a593Smuzhiyun 					| L3_STATUS_0_L4PERTA_REQ	\
92*4882a593Smuzhiyun 					| L3_STATUS_0_L4EMUTA_REQ	\
93*4882a593Smuzhiyun 					| L3_STATUS_0_MAD2DTA_REQ)
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define L3_SI_FLAG_STATUS_1		0x530
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #define L3_STATUS_1_MPU_DATAIA		(1 << 0)
98*4882a593Smuzhiyun #define L3_STATUS_1_DAPIA0		(1 << 3)
99*4882a593Smuzhiyun #define L3_STATUS_1_DAPIA1		(1 << 4)
100*4882a593Smuzhiyun #define L3_STATUS_1_IVAIA		(1 << 6)
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define L3_PM_ERROR_LOG			0x020
103*4882a593Smuzhiyun #define L3_PM_CONTROL			0x028
104*4882a593Smuzhiyun #define L3_PM_ERROR_CLEAR_SINGLE	0x030
105*4882a593Smuzhiyun #define L3_PM_ERROR_CLEAR_MULTI		0x038
106*4882a593Smuzhiyun #define L3_PM_REQ_INFO_PERMISSION(n)	(0x048 + (0x020 * n))
107*4882a593Smuzhiyun #define L3_PM_READ_PERMISSION(n)	(0x050 + (0x020 * n))
108*4882a593Smuzhiyun #define L3_PM_WRITE_PERMISSION(n)	(0x058 + (0x020 * n))
109*4882a593Smuzhiyun #define L3_PM_ADDR_MATCH(n)		(0x060 + (0x020 * n))
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun /* L3 error log bit fields. Common for IA and TA */
112*4882a593Smuzhiyun #define L3_ERROR_LOG_CODE		24
113*4882a593Smuzhiyun #define L3_ERROR_LOG_INITID		8
114*4882a593Smuzhiyun #define L3_ERROR_LOG_CMD		0
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* L3 agent status bit fields. */
117*4882a593Smuzhiyun #define L3_AGENT_STATUS_CLEAR_IA	0x10000000
118*4882a593Smuzhiyun #define L3_AGENT_STATUS_CLEAR_TA	0x01000000
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define OMAP34xx_IRQ_L3_APP		10
121*4882a593Smuzhiyun #define L3_APPLICATION_ERROR		0x0
122*4882a593Smuzhiyun #define L3_DEBUG_ERROR			0x1
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun enum omap3_l3_initiator_id {
125*4882a593Smuzhiyun 	/* LCD has 1 ID */
126*4882a593Smuzhiyun 	OMAP_L3_LCD = 29,
127*4882a593Smuzhiyun 	/* SAD2D has 1 ID */
128*4882a593Smuzhiyun 	OMAP_L3_SAD2D = 28,
129*4882a593Smuzhiyun 	/* MPU has 5 IDs */
130*4882a593Smuzhiyun 	OMAP_L3_IA_MPU_SS_1 = 27,
131*4882a593Smuzhiyun 	OMAP_L3_IA_MPU_SS_2 = 26,
132*4882a593Smuzhiyun 	OMAP_L3_IA_MPU_SS_3 = 25,
133*4882a593Smuzhiyun 	OMAP_L3_IA_MPU_SS_4 = 24,
134*4882a593Smuzhiyun 	OMAP_L3_IA_MPU_SS_5 = 23,
135*4882a593Smuzhiyun 	/* IVA2.2 SS has 3 IDs*/
136*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_1 = 22,
137*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_2 = 21,
138*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_3 = 20,
139*4882a593Smuzhiyun 	/* IVA 2.2 SS DMA has 6 IDS */
140*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_DMA_1 = 19,
141*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_DMA_2 = 18,
142*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_DMA_3 = 17,
143*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_DMA_4 = 16,
144*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_DMA_5 = 15,
145*4882a593Smuzhiyun 	OMAP_L3_IA_IVA_SS_DMA_6 = 14,
146*4882a593Smuzhiyun 	/* SGX has 1 ID */
147*4882a593Smuzhiyun 	OMAP_L3_IA_SGX = 13,
148*4882a593Smuzhiyun 	/* CAM has 3 ID */
149*4882a593Smuzhiyun 	OMAP_L3_IA_CAM_1 = 12,
150*4882a593Smuzhiyun 	OMAP_L3_IA_CAM_2 = 11,
151*4882a593Smuzhiyun 	OMAP_L3_IA_CAM_3 = 10,
152*4882a593Smuzhiyun 	/* DAP has 1 ID */
153*4882a593Smuzhiyun 	OMAP_L3_IA_DAP = 9,
154*4882a593Smuzhiyun 	/* SDMA WR has 2 IDs */
155*4882a593Smuzhiyun 	OMAP_L3_SDMA_WR_1 = 8,
156*4882a593Smuzhiyun 	OMAP_L3_SDMA_WR_2 = 7,
157*4882a593Smuzhiyun 	/* SDMA RD has 4 IDs */
158*4882a593Smuzhiyun 	OMAP_L3_SDMA_RD_1 = 6,
159*4882a593Smuzhiyun 	OMAP_L3_SDMA_RD_2 = 5,
160*4882a593Smuzhiyun 	OMAP_L3_SDMA_RD_3 = 4,
161*4882a593Smuzhiyun 	OMAP_L3_SDMA_RD_4 = 3,
162*4882a593Smuzhiyun 	/* HSUSB OTG has 1 ID */
163*4882a593Smuzhiyun 	OMAP_L3_USBOTG = 2,
164*4882a593Smuzhiyun 	/* HSUSB HOST has 1 ID */
165*4882a593Smuzhiyun 	OMAP_L3_USBHOST = 1,
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun enum omap3_l3_code {
169*4882a593Smuzhiyun 	OMAP_L3_CODE_NOERROR = 0,
170*4882a593Smuzhiyun 	OMAP_L3_CODE_UNSUP_CMD = 1,
171*4882a593Smuzhiyun 	OMAP_L3_CODE_ADDR_HOLE = 2,
172*4882a593Smuzhiyun 	OMAP_L3_CODE_PROTECT_VIOLATION = 3,
173*4882a593Smuzhiyun 	OMAP_L3_CODE_IN_BAND_ERR = 4,
174*4882a593Smuzhiyun 	/* codes 5 and 6 are reserved */
175*4882a593Smuzhiyun 	OMAP_L3_CODE_REQ_TOUT_NOT_ACCEPT = 7,
176*4882a593Smuzhiyun 	OMAP_L3_CODE_REQ_TOUT_NO_RESP = 8,
177*4882a593Smuzhiyun 	/* codes 9 - 15 are also reserved */
178*4882a593Smuzhiyun };
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun struct omap3_l3 {
181*4882a593Smuzhiyun 	struct device *dev;
182*4882a593Smuzhiyun 	struct clk *ick;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	/* memory base*/
185*4882a593Smuzhiyun 	void __iomem *rt;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	int debug_irq;
188*4882a593Smuzhiyun 	int app_irq;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	/* true when and inband functional error occurs */
191*4882a593Smuzhiyun 	unsigned inband:1;
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun /* offsets for l3 agents in order with the Flag status register */
195*4882a593Smuzhiyun static unsigned int omap3_l3_app_bases[] = {
196*4882a593Smuzhiyun 	/* MPU IA */
197*4882a593Smuzhiyun 	0x1400,
198*4882a593Smuzhiyun 	0x1400,
199*4882a593Smuzhiyun 	0x1400,
200*4882a593Smuzhiyun 	/* RESERVED */
201*4882a593Smuzhiyun 	0,
202*4882a593Smuzhiyun 	0,
203*4882a593Smuzhiyun 	0,
204*4882a593Smuzhiyun 	/* IVA 2.2 IA */
205*4882a593Smuzhiyun 	0x1800,
206*4882a593Smuzhiyun 	0x1800,
207*4882a593Smuzhiyun 	0x1800,
208*4882a593Smuzhiyun 	/* SGX IA */
209*4882a593Smuzhiyun 	0x1c00,
210*4882a593Smuzhiyun 	0x1c00,
211*4882a593Smuzhiyun 	/* RESERVED */
212*4882a593Smuzhiyun 	0,
213*4882a593Smuzhiyun 	/* CAMERA IA */
214*4882a593Smuzhiyun 	0x5800,
215*4882a593Smuzhiyun 	0x5800,
216*4882a593Smuzhiyun 	0x5800,
217*4882a593Smuzhiyun 	/* DISPLAY IA */
218*4882a593Smuzhiyun 	0x5400,
219*4882a593Smuzhiyun 	0x5400,
220*4882a593Smuzhiyun 	/* RESERVED */
221*4882a593Smuzhiyun 	0,
222*4882a593Smuzhiyun 	/*SDMA RD IA */
223*4882a593Smuzhiyun 	0x4c00,
224*4882a593Smuzhiyun 	0x4c00,
225*4882a593Smuzhiyun 	/* RESERVED */
226*4882a593Smuzhiyun 	0,
227*4882a593Smuzhiyun 	/* SDMA WR IA */
228*4882a593Smuzhiyun 	0x5000,
229*4882a593Smuzhiyun 	0x5000,
230*4882a593Smuzhiyun 	/* RESERVED */
231*4882a593Smuzhiyun 	0,
232*4882a593Smuzhiyun 	/* USB OTG IA */
233*4882a593Smuzhiyun 	0x4400,
234*4882a593Smuzhiyun 	0x4400,
235*4882a593Smuzhiyun 	0x4400,
236*4882a593Smuzhiyun 	/* USB HOST IA */
237*4882a593Smuzhiyun 	0x4000,
238*4882a593Smuzhiyun 	0x4000,
239*4882a593Smuzhiyun 	/* RESERVED */
240*4882a593Smuzhiyun 	0,
241*4882a593Smuzhiyun 	0,
242*4882a593Smuzhiyun 	0,
243*4882a593Smuzhiyun 	0,
244*4882a593Smuzhiyun 	/* SAD2D IA */
245*4882a593Smuzhiyun 	0x3000,
246*4882a593Smuzhiyun 	0x3000,
247*4882a593Smuzhiyun 	0x3000,
248*4882a593Smuzhiyun 	/* RESERVED */
249*4882a593Smuzhiyun 	0,
250*4882a593Smuzhiyun 	0,
251*4882a593Smuzhiyun 	0,
252*4882a593Smuzhiyun 	0,
253*4882a593Smuzhiyun 	0,
254*4882a593Smuzhiyun 	0,
255*4882a593Smuzhiyun 	0,
256*4882a593Smuzhiyun 	0,
257*4882a593Smuzhiyun 	0,
258*4882a593Smuzhiyun 	0,
259*4882a593Smuzhiyun 	0,
260*4882a593Smuzhiyun 	0,
261*4882a593Smuzhiyun 	/* SMA TA */
262*4882a593Smuzhiyun 	0x2000,
263*4882a593Smuzhiyun 	/* GPMC TA */
264*4882a593Smuzhiyun 	0x2400,
265*4882a593Smuzhiyun 	/* OCM RAM TA */
266*4882a593Smuzhiyun 	0x2800,
267*4882a593Smuzhiyun 	/* OCM ROM TA */
268*4882a593Smuzhiyun 	0x2C00,
269*4882a593Smuzhiyun 	/* L4 CORE TA */
270*4882a593Smuzhiyun 	0x6800,
271*4882a593Smuzhiyun 	/* L4 PER TA */
272*4882a593Smuzhiyun 	0x6c00,
273*4882a593Smuzhiyun 	/* IVA 2.2 TA */
274*4882a593Smuzhiyun 	0x6000,
275*4882a593Smuzhiyun 	/* SGX TA */
276*4882a593Smuzhiyun 	0x6400,
277*4882a593Smuzhiyun 	/* L4 EMU TA */
278*4882a593Smuzhiyun 	0x7000,
279*4882a593Smuzhiyun 	/* GPMC TA */
280*4882a593Smuzhiyun 	0x2400,
281*4882a593Smuzhiyun 	/* L4 CORE TA */
282*4882a593Smuzhiyun 	0x6800,
283*4882a593Smuzhiyun 	/* L4 PER TA */
284*4882a593Smuzhiyun 	0x6c00,
285*4882a593Smuzhiyun 	/* L4 EMU TA */
286*4882a593Smuzhiyun 	0x7000,
287*4882a593Smuzhiyun 	/* MAD2D TA */
288*4882a593Smuzhiyun 	0x3400,
289*4882a593Smuzhiyun 	/* RESERVED */
290*4882a593Smuzhiyun 	0,
291*4882a593Smuzhiyun 	0,
292*4882a593Smuzhiyun };
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun static unsigned int omap3_l3_debug_bases[] = {
295*4882a593Smuzhiyun 	/* MPU DATA IA */
296*4882a593Smuzhiyun 	0x1400,
297*4882a593Smuzhiyun 	/* RESERVED */
298*4882a593Smuzhiyun 	0,
299*4882a593Smuzhiyun 	0,
300*4882a593Smuzhiyun 	/* DAP IA */
301*4882a593Smuzhiyun 	0x5c00,
302*4882a593Smuzhiyun 	0x5c00,
303*4882a593Smuzhiyun 	/* RESERVED */
304*4882a593Smuzhiyun 	0,
305*4882a593Smuzhiyun 	/* IVA 2.2 IA */
306*4882a593Smuzhiyun 	0x1800,
307*4882a593Smuzhiyun 	/* REST RESERVED */
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun static u32 *omap3_l3_bases[] = {
311*4882a593Smuzhiyun 	omap3_l3_app_bases,
312*4882a593Smuzhiyun 	omap3_l3_debug_bases,
313*4882a593Smuzhiyun };
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun /*
316*4882a593Smuzhiyun  * REVISIT define __raw_readll/__raw_writell here, but move them to
317*4882a593Smuzhiyun  * <asm/io.h> at some point
318*4882a593Smuzhiyun  */
319*4882a593Smuzhiyun #define __raw_writell(v, a)	(__chk_io_ptr(a), \
320*4882a593Smuzhiyun 				*(volatile u64 __force *)(a) = (v))
321*4882a593Smuzhiyun #define __raw_readll(a)		(__chk_io_ptr(a), \
322*4882a593Smuzhiyun 				*(volatile u64 __force *)(a))
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun #endif
325