xref: /rk3399_ARM-atf/drivers/marvell/mochi/cp110_setup.c (revision 031542fc24ba48c2f38cb40ab008afb9943aaa74)
1*031542fcSKonstantin Porotchkin /*
2*031542fcSKonstantin Porotchkin  * Copyright (C) 2018 Marvell International Ltd.
3*031542fcSKonstantin Porotchkin  *
4*031542fcSKonstantin Porotchkin  * SPDX-License-Identifier:     BSD-3-Clause
5*031542fcSKonstantin Porotchkin  * https://spdx.org/licenses
6*031542fcSKonstantin Porotchkin  */
7*031542fcSKonstantin Porotchkin 
8*031542fcSKonstantin Porotchkin /* CP110 Marvell SoC driver */
9*031542fcSKonstantin Porotchkin 
10*031542fcSKonstantin Porotchkin #include <amb_adec.h>
11*031542fcSKonstantin Porotchkin #include <cp110_setup.h>
12*031542fcSKonstantin Porotchkin #include <debug.h>
13*031542fcSKonstantin Porotchkin #include <delay_timer.h>
14*031542fcSKonstantin Porotchkin #include <iob.h>
15*031542fcSKonstantin Porotchkin #include <plat_marvell.h>
16*031542fcSKonstantin Porotchkin 
17*031542fcSKonstantin Porotchkin /*
18*031542fcSKonstantin Porotchkin  * AXI Configuration.
19*031542fcSKonstantin Porotchkin  */
20*031542fcSKonstantin Porotchkin 
21*031542fcSKonstantin Porotchkin  /* Used for Units of CP-110 (e.g. USB device, USB Host, and etc) */
22*031542fcSKonstantin Porotchkin #define MVEBU_AXI_ATTR_OFFSET			(0x441300)
23*031542fcSKonstantin Porotchkin #define MVEBU_AXI_ATTR_REG(index)		(MVEBU_AXI_ATTR_OFFSET + \
24*031542fcSKonstantin Porotchkin 							0x4 * index)
25*031542fcSKonstantin Porotchkin 
26*031542fcSKonstantin Porotchkin /* AXI Protection bits */
27*031542fcSKonstantin Porotchkin #define MVEBU_AXI_PROT_OFFSET				(0x441200)
28*031542fcSKonstantin Porotchkin 
29*031542fcSKonstantin Porotchkin /* AXI Protection regs */
30*031542fcSKonstantin Porotchkin #define MVEBU_AXI_PROT_REG(index)		((index <= 4) ? \
31*031542fcSKonstantin Porotchkin 						(MVEBU_AXI_PROT_OFFSET + \
32*031542fcSKonstantin Porotchkin 							0x4 * index) : \
33*031542fcSKonstantin Porotchkin 						(MVEBU_AXI_PROT_OFFSET + 0x18))
34*031542fcSKonstantin Porotchkin #define MVEBU_AXI_PROT_REGS_NUM			(6)
35*031542fcSKonstantin Porotchkin 
36*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFGS_OFFSET			(0x441900)
37*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFG_REG(index)		(MVEBU_SOC_CFGS_OFFSET + \
38*031542fcSKonstantin Porotchkin 							0x4 * index)
39*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFG_REG_NUM			(0)
40*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFG_GLOG_SECURE_EN_MASK	(0xE)
41*031542fcSKonstantin Porotchkin 
42*031542fcSKonstantin Porotchkin /* SATA3 MBUS to AXI regs */
43*031542fcSKonstantin Porotchkin #define MVEBU_BRIDGE_WIN_DIS_REG		(MVEBU_SOC_CFGS_OFFSET + 0x10)
44*031542fcSKonstantin Porotchkin #define MVEBU_BRIDGE_WIN_DIS_OFF		(0x0)
45*031542fcSKonstantin Porotchkin 
46*031542fcSKonstantin Porotchkin /* SATA3 MBUS to AXI regs */
47*031542fcSKonstantin Porotchkin #define MVEBU_SATA_M2A_AXI_PORT_CTRL_REG	(0x54ff04)
48*031542fcSKonstantin Porotchkin 
49*031542fcSKonstantin Porotchkin /* AXI to MBUS bridge registers */
50*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_OFFSET			(0x13ff00)
51*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_REG(win)	(MVEBU_AMB_IP_OFFSET + \
52*031542fcSKonstantin Porotchkin 							(win * 0x8))
53*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_EN_OFFSET	0
54*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_EN_MASK		\
55*031542fcSKonstantin Porotchkin 				(0x1 << MVEBU_AMB_IP_BRIDGE_WIN_EN_OFFSET)
56*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_SIZE_OFFSET	16
57*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_SIZE_MASK	\
58*031542fcSKonstantin Porotchkin 				(0xffff << MVEBU_AMB_IP_BRIDGE_WIN_SIZE_OFFSET)
59*031542fcSKonstantin Porotchkin 
60*031542fcSKonstantin Porotchkin #define MVEBU_SAMPLE_AT_RESET_REG	(0x440600)
61*031542fcSKonstantin Porotchkin #define SAR_PCIE1_CLK_CFG_OFFSET	31
62*031542fcSKonstantin Porotchkin #define SAR_PCIE1_CLK_CFG_MASK		(0x1 << SAR_PCIE1_CLK_CFG_OFFSET)
63*031542fcSKonstantin Porotchkin #define SAR_PCIE0_CLK_CFG_OFFSET	30
64*031542fcSKonstantin Porotchkin #define SAR_PCIE0_CLK_CFG_MASK		(0x1 << SAR_PCIE0_CLK_CFG_OFFSET)
65*031542fcSKonstantin Porotchkin #define SAR_I2C_INIT_EN_OFFSET		24
66*031542fcSKonstantin Porotchkin #define SAR_I2C_INIT_EN_MASK		(1 << SAR_I2C_INIT_EN_OFFSET)
67*031542fcSKonstantin Porotchkin 
68*031542fcSKonstantin Porotchkin /*******************************************************************************
69*031542fcSKonstantin Porotchkin  * PCIE clock buffer control
70*031542fcSKonstantin Porotchkin  ******************************************************************************/
71*031542fcSKonstantin Porotchkin #define MVEBU_PCIE_REF_CLK_BUF_CTRL			(0x4404F0)
72*031542fcSKonstantin Porotchkin #define PCIE1_REFCLK_BUFF_SOURCE			0x800
73*031542fcSKonstantin Porotchkin #define PCIE0_REFCLK_BUFF_SOURCE			0x400
74*031542fcSKonstantin Porotchkin 
75*031542fcSKonstantin Porotchkin /*******************************************************************************
76*031542fcSKonstantin Porotchkin  * MSS Device Push Set Register
77*031542fcSKonstantin Porotchkin  ******************************************************************************/
78*031542fcSKonstantin Porotchkin #define MVEBU_CP_MSS_DPSHSR_REG				(0x280040)
79*031542fcSKonstantin Porotchkin #define MSS_DPSHSR_REG_PCIE_CLK_SEL			0x8
80*031542fcSKonstantin Porotchkin 
81*031542fcSKonstantin Porotchkin /*******************************************************************************
82*031542fcSKonstantin Porotchkin  * RTC Configuration
83*031542fcSKonstantin Porotchkin  ******************************************************************************/
84*031542fcSKonstantin Porotchkin #define MVEBU_RTC_BASE					(0x284000)
85*031542fcSKonstantin Porotchkin #define MVEBU_RTC_STATUS_REG				(MVEBU_RTC_BASE + 0x0)
86*031542fcSKonstantin Porotchkin #define MVEBU_RTC_STATUS_ALARM1_MASK			0x1
87*031542fcSKonstantin Porotchkin #define MVEBU_RTC_STATUS_ALARM2_MASK			0x2
88*031542fcSKonstantin Porotchkin #define MVEBU_RTC_IRQ_1_CONFIG_REG			(MVEBU_RTC_BASE + 0x4)
89*031542fcSKonstantin Porotchkin #define MVEBU_RTC_IRQ_2_CONFIG_REG			(MVEBU_RTC_BASE + 0x8)
90*031542fcSKonstantin Porotchkin #define MVEBU_RTC_TIME_REG				(MVEBU_RTC_BASE + 0xC)
91*031542fcSKonstantin Porotchkin #define MVEBU_RTC_ALARM_1_REG				(MVEBU_RTC_BASE + 0x10)
92*031542fcSKonstantin Porotchkin #define MVEBU_RTC_ALARM_2_REG				(MVEBU_RTC_BASE + 0x14)
93*031542fcSKonstantin Porotchkin #define MVEBU_RTC_CCR_REG				(MVEBU_RTC_BASE + 0x18)
94*031542fcSKonstantin Porotchkin #define MVEBU_RTC_NOMINAL_TIMING			0x2000
95*031542fcSKonstantin Porotchkin #define MVEBU_RTC_NOMINAL_TIMING_MASK			0x7FFF
96*031542fcSKonstantin Porotchkin #define MVEBU_RTC_TEST_CONFIG_REG			(MVEBU_RTC_BASE + 0x1C)
97*031542fcSKonstantin Porotchkin #define MVEBU_RTC_BRIDGE_TIMING_CTRL0_REG		(MVEBU_RTC_BASE + 0x80)
98*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_PERIOD_MASK			0xFFFF
99*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_PERIOD_DEFAULT			0x3FF
100*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_SETUP_OFFS			16
101*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_SETUP_MASK			0xFFFF0000
102*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_SETUP_DEFAULT			0x29
103*031542fcSKonstantin Porotchkin #define MVEBU_RTC_BRIDGE_TIMING_CTRL1_REG		(MVEBU_RTC_BASE + 0x84)
104*031542fcSKonstantin Porotchkin #define MVEBU_RTC_READ_OUTPUT_DELAY_MASK		0xFFFF
105*031542fcSKonstantin Porotchkin #define MVEBU_RTC_READ_OUTPUT_DELAY_DEFAULT		0x1F
106*031542fcSKonstantin Porotchkin 
107*031542fcSKonstantin Porotchkin enum axi_attr {
108*031542fcSKonstantin Porotchkin 	AXI_ADUNIT_ATTR = 0,
109*031542fcSKonstantin Porotchkin 	AXI_COMUNIT_ATTR,
110*031542fcSKonstantin Porotchkin 	AXI_EIP197_ATTR,
111*031542fcSKonstantin Porotchkin 	AXI_USB3D_ATTR,
112*031542fcSKonstantin Porotchkin 	AXI_USB3H0_ATTR,
113*031542fcSKonstantin Porotchkin 	AXI_USB3H1_ATTR,
114*031542fcSKonstantin Porotchkin 	AXI_SATA0_ATTR,
115*031542fcSKonstantin Porotchkin 	AXI_SATA1_ATTR,
116*031542fcSKonstantin Porotchkin 	AXI_DAP_ATTR,
117*031542fcSKonstantin Porotchkin 	AXI_DFX_ATTR,
118*031542fcSKonstantin Porotchkin 	AXI_DBG_TRC_ATTR = 12,
119*031542fcSKonstantin Porotchkin 	AXI_SDIO_ATTR,
120*031542fcSKonstantin Porotchkin 	AXI_MSS_ATTR,
121*031542fcSKonstantin Porotchkin 	AXI_MAX_ATTR,
122*031542fcSKonstantin Porotchkin };
123*031542fcSKonstantin Porotchkin 
124*031542fcSKonstantin Porotchkin /* Most stream IDS are configured centrally in the CP-110 RFU
125*031542fcSKonstantin Porotchkin  * but some are configured inside the unit registers
126*031542fcSKonstantin Porotchkin  */
127*031542fcSKonstantin Porotchkin #define RFU_STREAM_ID_BASE	(0x450000)
128*031542fcSKonstantin Porotchkin #define USB3H_0_STREAM_ID_REG	(RFU_STREAM_ID_BASE + 0xC)
129*031542fcSKonstantin Porotchkin #define USB3H_1_STREAM_ID_REG	(RFU_STREAM_ID_BASE + 0x10)
130*031542fcSKonstantin Porotchkin #define SATA_0_STREAM_ID_REG	(RFU_STREAM_ID_BASE + 0x14)
131*031542fcSKonstantin Porotchkin #define SATA_1_STREAM_ID_REG	(RFU_STREAM_ID_BASE + 0x18)
132*031542fcSKonstantin Porotchkin 
133*031542fcSKonstantin Porotchkin #define CP_DMA_0_STREAM_ID_REG  (0x6B0010)
134*031542fcSKonstantin Porotchkin #define CP_DMA_1_STREAM_ID_REG  (0x6D0010)
135*031542fcSKonstantin Porotchkin 
136*031542fcSKonstantin Porotchkin /* We allocate IDs 128-255 for PCIe */
137*031542fcSKonstantin Porotchkin #define MAX_STREAM_ID		(0x80)
138*031542fcSKonstantin Porotchkin 
139*031542fcSKonstantin Porotchkin uintptr_t stream_id_reg[] = {
140*031542fcSKonstantin Porotchkin 	USB3H_0_STREAM_ID_REG,
141*031542fcSKonstantin Porotchkin 	USB3H_1_STREAM_ID_REG,
142*031542fcSKonstantin Porotchkin 	CP_DMA_0_STREAM_ID_REG,
143*031542fcSKonstantin Porotchkin 	CP_DMA_1_STREAM_ID_REG,
144*031542fcSKonstantin Porotchkin 	SATA_0_STREAM_ID_REG,
145*031542fcSKonstantin Porotchkin 	SATA_1_STREAM_ID_REG,
146*031542fcSKonstantin Porotchkin 	0
147*031542fcSKonstantin Porotchkin };
148*031542fcSKonstantin Porotchkin 
149*031542fcSKonstantin Porotchkin static void cp110_errata_wa_init(uintptr_t base)
150*031542fcSKonstantin Porotchkin {
151*031542fcSKonstantin Porotchkin 	uint32_t data;
152*031542fcSKonstantin Porotchkin 
153*031542fcSKonstantin Porotchkin 	/* ERRATA GL-4076863:
154*031542fcSKonstantin Porotchkin 	 * Reset value for global_secure_enable inputs must be changed
155*031542fcSKonstantin Porotchkin 	 * from '1' to '0'.
156*031542fcSKonstantin Porotchkin 	 * When asserted, only "secured" transactions can enter IHB
157*031542fcSKonstantin Porotchkin 	 * configuration space.
158*031542fcSKonstantin Porotchkin 	 * However, blocking AXI transactions is performed by IOB.
159*031542fcSKonstantin Porotchkin 	 * Performing it also at IHB/HB complicates programming model.
160*031542fcSKonstantin Porotchkin 	 *
161*031542fcSKonstantin Porotchkin 	 * Enable non-secure access in SOC configuration register
162*031542fcSKonstantin Porotchkin 	 */
163*031542fcSKonstantin Porotchkin 	data = mmio_read_32(base + MVEBU_SOC_CFG_REG(MVEBU_SOC_CFG_REG_NUM));
164*031542fcSKonstantin Porotchkin 	data &= ~MVEBU_SOC_CFG_GLOG_SECURE_EN_MASK;
165*031542fcSKonstantin Porotchkin 	mmio_write_32(base + MVEBU_SOC_CFG_REG(MVEBU_SOC_CFG_REG_NUM), data);
166*031542fcSKonstantin Porotchkin }
167*031542fcSKonstantin Porotchkin 
168*031542fcSKonstantin Porotchkin static void cp110_pcie_clk_cfg(uintptr_t base)
169*031542fcSKonstantin Porotchkin {
170*031542fcSKonstantin Porotchkin 	uint32_t pcie0_clk, pcie1_clk, reg;
171*031542fcSKonstantin Porotchkin 
172*031542fcSKonstantin Porotchkin 	/*
173*031542fcSKonstantin Porotchkin 	 * Determine the pcie0/1 clock direction (input/output) from the
174*031542fcSKonstantin Porotchkin 	 * sample at reset.
175*031542fcSKonstantin Porotchkin 	 */
176*031542fcSKonstantin Porotchkin 	reg = mmio_read_32(base + MVEBU_SAMPLE_AT_RESET_REG);
177*031542fcSKonstantin Porotchkin 	pcie0_clk = (reg & SAR_PCIE0_CLK_CFG_MASK) >> SAR_PCIE0_CLK_CFG_OFFSET;
178*031542fcSKonstantin Porotchkin 	pcie1_clk = (reg & SAR_PCIE1_CLK_CFG_MASK) >> SAR_PCIE1_CLK_CFG_OFFSET;
179*031542fcSKonstantin Porotchkin 
180*031542fcSKonstantin Porotchkin 	/* CP110 revision A2 */
181*031542fcSKonstantin Porotchkin 	if (cp110_rev_id_get(base) == MVEBU_CP110_REF_ID_A2) {
182*031542fcSKonstantin Porotchkin 		/*
183*031542fcSKonstantin Porotchkin 		 * PCIe Reference Clock Buffer Control register must be
184*031542fcSKonstantin Porotchkin 		 * set according to the clock direction (input/output)
185*031542fcSKonstantin Porotchkin 		 */
186*031542fcSKonstantin Porotchkin 		reg = mmio_read_32(base + MVEBU_PCIE_REF_CLK_BUF_CTRL);
187*031542fcSKonstantin Porotchkin 		reg &= ~(PCIE0_REFCLK_BUFF_SOURCE | PCIE1_REFCLK_BUFF_SOURCE);
188*031542fcSKonstantin Porotchkin 		if (!pcie0_clk)
189*031542fcSKonstantin Porotchkin 			reg |= PCIE0_REFCLK_BUFF_SOURCE;
190*031542fcSKonstantin Porotchkin 		if (!pcie1_clk)
191*031542fcSKonstantin Porotchkin 			reg |= PCIE1_REFCLK_BUFF_SOURCE;
192*031542fcSKonstantin Porotchkin 
193*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_PCIE_REF_CLK_BUF_CTRL, reg);
194*031542fcSKonstantin Porotchkin 	}
195*031542fcSKonstantin Porotchkin 
196*031542fcSKonstantin Porotchkin 	/* CP110 revision A1 */
197*031542fcSKonstantin Porotchkin 	if (cp110_rev_id_get(base) == MVEBU_CP110_REF_ID_A1) {
198*031542fcSKonstantin Porotchkin 		if (!pcie0_clk || !pcie1_clk) {
199*031542fcSKonstantin Porotchkin 			/*
200*031542fcSKonstantin Porotchkin 			 * if one of the pcie clocks is set to input,
201*031542fcSKonstantin Porotchkin 			 * we need to set mss_push[131] field, otherwise,
202*031542fcSKonstantin Porotchkin 			 * the pcie clock might not work.
203*031542fcSKonstantin Porotchkin 			 */
204*031542fcSKonstantin Porotchkin 			reg = mmio_read_32(base + MVEBU_CP_MSS_DPSHSR_REG);
205*031542fcSKonstantin Porotchkin 			reg |= MSS_DPSHSR_REG_PCIE_CLK_SEL;
206*031542fcSKonstantin Porotchkin 			mmio_write_32(base + MVEBU_CP_MSS_DPSHSR_REG, reg);
207*031542fcSKonstantin Porotchkin 		}
208*031542fcSKonstantin Porotchkin 	}
209*031542fcSKonstantin Porotchkin }
210*031542fcSKonstantin Porotchkin 
211*031542fcSKonstantin Porotchkin /* Set a unique stream id for all DMA capable devices */
212*031542fcSKonstantin Porotchkin static void cp110_stream_id_init(uintptr_t base, uint32_t stream_id)
213*031542fcSKonstantin Porotchkin {
214*031542fcSKonstantin Porotchkin 	int i = 0;
215*031542fcSKonstantin Porotchkin 
216*031542fcSKonstantin Porotchkin 	while (stream_id_reg[i]) {
217*031542fcSKonstantin Porotchkin 		if (i > MAX_STREAM_ID_PER_CP) {
218*031542fcSKonstantin Porotchkin 			NOTICE("Only first %d (maximum) Stream IDs allocated\n",
219*031542fcSKonstantin Porotchkin 			       MAX_STREAM_ID_PER_CP);
220*031542fcSKonstantin Porotchkin 			return;
221*031542fcSKonstantin Porotchkin 		}
222*031542fcSKonstantin Porotchkin 
223*031542fcSKonstantin Porotchkin 		if ((stream_id_reg[i] == CP_DMA_0_STREAM_ID_REG) ||
224*031542fcSKonstantin Porotchkin 		    (stream_id_reg[i] == CP_DMA_1_STREAM_ID_REG))
225*031542fcSKonstantin Porotchkin 			mmio_write_32(base + stream_id_reg[i],
226*031542fcSKonstantin Porotchkin 				      stream_id << 16 |  stream_id);
227*031542fcSKonstantin Porotchkin 		else
228*031542fcSKonstantin Porotchkin 			mmio_write_32(base + stream_id_reg[i], stream_id);
229*031542fcSKonstantin Porotchkin 
230*031542fcSKonstantin Porotchkin 		/* SATA port 0/1 are in the same SATA unit, and they should use
231*031542fcSKonstantin Porotchkin 		 * the same STREAM ID number
232*031542fcSKonstantin Porotchkin 		 */
233*031542fcSKonstantin Porotchkin 		if (stream_id_reg[i] != SATA_0_STREAM_ID_REG)
234*031542fcSKonstantin Porotchkin 			stream_id++;
235*031542fcSKonstantin Porotchkin 
236*031542fcSKonstantin Porotchkin 		i++;
237*031542fcSKonstantin Porotchkin 	}
238*031542fcSKonstantin Porotchkin }
239*031542fcSKonstantin Porotchkin 
240*031542fcSKonstantin Porotchkin static void cp110_axi_attr_init(uintptr_t base)
241*031542fcSKonstantin Porotchkin {
242*031542fcSKonstantin Porotchkin 	uint32_t index, data;
243*031542fcSKonstantin Porotchkin 
244*031542fcSKonstantin Porotchkin 	/* Initialize AXI attributes for Armada-7K/8K SoC */
245*031542fcSKonstantin Porotchkin 
246*031542fcSKonstantin Porotchkin 	/* Go over the AXI attributes and set Ax-Cache and Ax-Domain */
247*031542fcSKonstantin Porotchkin 	for (index = 0; index < AXI_MAX_ATTR; index++) {
248*031542fcSKonstantin Porotchkin 		switch (index) {
249*031542fcSKonstantin Porotchkin 		/* DFX and MSS unit works with no coherent only -
250*031542fcSKonstantin Porotchkin 		 * there's no option to configure the Ax-Cache and Ax-Domain
251*031542fcSKonstantin Porotchkin 		 */
252*031542fcSKonstantin Porotchkin 		case AXI_DFX_ATTR:
253*031542fcSKonstantin Porotchkin 		case AXI_MSS_ATTR:
254*031542fcSKonstantin Porotchkin 			continue;
255*031542fcSKonstantin Porotchkin 		default:
256*031542fcSKonstantin Porotchkin 			/* Set Ax-Cache as cacheable, no allocate, modifiable,
257*031542fcSKonstantin Porotchkin 			 * bufferable
258*031542fcSKonstantin Porotchkin 			 * The values are different because Read & Write
259*031542fcSKonstantin Porotchkin 			 * definition is different in Ax-Cache
260*031542fcSKonstantin Porotchkin 			 */
261*031542fcSKonstantin Porotchkin 			data = mmio_read_32(base + MVEBU_AXI_ATTR_REG(index));
262*031542fcSKonstantin Porotchkin 			data &= ~MVEBU_AXI_ATTR_ARCACHE_MASK;
263*031542fcSKonstantin Porotchkin 			data |= (CACHE_ATTR_WRITE_ALLOC |
264*031542fcSKonstantin Porotchkin 				 CACHE_ATTR_CACHEABLE   |
265*031542fcSKonstantin Porotchkin 				 CACHE_ATTR_BUFFERABLE) <<
266*031542fcSKonstantin Porotchkin 				 MVEBU_AXI_ATTR_ARCACHE_OFFSET;
267*031542fcSKonstantin Porotchkin 			data &= ~MVEBU_AXI_ATTR_AWCACHE_MASK;
268*031542fcSKonstantin Porotchkin 			data |= (CACHE_ATTR_READ_ALLOC |
269*031542fcSKonstantin Porotchkin 				 CACHE_ATTR_CACHEABLE  |
270*031542fcSKonstantin Porotchkin 				 CACHE_ATTR_BUFFERABLE) <<
271*031542fcSKonstantin Porotchkin 				 MVEBU_AXI_ATTR_AWCACHE_OFFSET;
272*031542fcSKonstantin Porotchkin 			/* Set Ax-Domain as Outer domain */
273*031542fcSKonstantin Porotchkin 			data &= ~MVEBU_AXI_ATTR_ARDOMAIN_MASK;
274*031542fcSKonstantin Porotchkin 			data |= DOMAIN_OUTER_SHAREABLE <<
275*031542fcSKonstantin Porotchkin 				MVEBU_AXI_ATTR_ARDOMAIN_OFFSET;
276*031542fcSKonstantin Porotchkin 			data &= ~MVEBU_AXI_ATTR_AWDOMAIN_MASK;
277*031542fcSKonstantin Porotchkin 			data |= DOMAIN_OUTER_SHAREABLE <<
278*031542fcSKonstantin Porotchkin 				MVEBU_AXI_ATTR_AWDOMAIN_OFFSET;
279*031542fcSKonstantin Porotchkin 			mmio_write_32(base + MVEBU_AXI_ATTR_REG(index), data);
280*031542fcSKonstantin Porotchkin 		}
281*031542fcSKonstantin Porotchkin 	}
282*031542fcSKonstantin Porotchkin 
283*031542fcSKonstantin Porotchkin 	/* SATA IOCC supported, cache attributes
284*031542fcSKonstantin Porotchkin 	 * for SATA MBUS to AXI configuration.
285*031542fcSKonstantin Porotchkin 	 */
286*031542fcSKonstantin Porotchkin 	data = mmio_read_32(base + MVEBU_SATA_M2A_AXI_PORT_CTRL_REG);
287*031542fcSKonstantin Porotchkin 	data &= ~MVEBU_SATA_M2A_AXI_AWCACHE_MASK;
288*031542fcSKonstantin Porotchkin 	data |= (CACHE_ATTR_WRITE_ALLOC |
289*031542fcSKonstantin Porotchkin 		 CACHE_ATTR_CACHEABLE   |
290*031542fcSKonstantin Porotchkin 		 CACHE_ATTR_BUFFERABLE) <<
291*031542fcSKonstantin Porotchkin 		 MVEBU_SATA_M2A_AXI_AWCACHE_OFFSET;
292*031542fcSKonstantin Porotchkin 	data &= ~MVEBU_SATA_M2A_AXI_ARCACHE_MASK;
293*031542fcSKonstantin Porotchkin 	data |= (CACHE_ATTR_READ_ALLOC |
294*031542fcSKonstantin Porotchkin 		 CACHE_ATTR_CACHEABLE  |
295*031542fcSKonstantin Porotchkin 		 CACHE_ATTR_BUFFERABLE) <<
296*031542fcSKonstantin Porotchkin 		 MVEBU_SATA_M2A_AXI_ARCACHE_OFFSET;
297*031542fcSKonstantin Porotchkin 	mmio_write_32(base + MVEBU_SATA_M2A_AXI_PORT_CTRL_REG, data);
298*031542fcSKonstantin Porotchkin 
299*031542fcSKonstantin Porotchkin 	/* Set all IO's AXI attribute to non-secure access. */
300*031542fcSKonstantin Porotchkin 	for (index = 0; index < MVEBU_AXI_PROT_REGS_NUM; index++)
301*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_AXI_PROT_REG(index),
302*031542fcSKonstantin Porotchkin 			      DOMAIN_SYSTEM_SHAREABLE);
303*031542fcSKonstantin Porotchkin }
304*031542fcSKonstantin Porotchkin 
305*031542fcSKonstantin Porotchkin static void amb_bridge_init(uintptr_t base)
306*031542fcSKonstantin Porotchkin {
307*031542fcSKonstantin Porotchkin 	uint32_t reg;
308*031542fcSKonstantin Porotchkin 
309*031542fcSKonstantin Porotchkin 	/* Open AMB bridge Window to Access COMPHY/MDIO registers */
310*031542fcSKonstantin Porotchkin 	reg = mmio_read_32(base + MVEBU_AMB_IP_BRIDGE_WIN_REG(0));
311*031542fcSKonstantin Porotchkin 	reg &= ~(MVEBU_AMB_IP_BRIDGE_WIN_SIZE_MASK |
312*031542fcSKonstantin Porotchkin 		 MVEBU_AMB_IP_BRIDGE_WIN_EN_MASK);
313*031542fcSKonstantin Porotchkin 	reg |= (0x7ff << MVEBU_AMB_IP_BRIDGE_WIN_SIZE_OFFSET) |
314*031542fcSKonstantin Porotchkin 	       (0x1 << MVEBU_AMB_IP_BRIDGE_WIN_EN_OFFSET);
315*031542fcSKonstantin Porotchkin 	mmio_write_32(base + MVEBU_AMB_IP_BRIDGE_WIN_REG(0), reg);
316*031542fcSKonstantin Porotchkin }
317*031542fcSKonstantin Porotchkin 
318*031542fcSKonstantin Porotchkin static void cp110_rtc_init(uintptr_t base)
319*031542fcSKonstantin Porotchkin {
320*031542fcSKonstantin Porotchkin 	/* Update MBus timing parameters before accessing RTC registers */
321*031542fcSKonstantin Porotchkin 	mmio_clrsetbits_32(base + MVEBU_RTC_BRIDGE_TIMING_CTRL0_REG,
322*031542fcSKonstantin Porotchkin 			   MVEBU_RTC_WRCLK_PERIOD_MASK,
323*031542fcSKonstantin Porotchkin 			   MVEBU_RTC_WRCLK_PERIOD_DEFAULT);
324*031542fcSKonstantin Porotchkin 
325*031542fcSKonstantin Porotchkin 	mmio_clrsetbits_32(base + MVEBU_RTC_BRIDGE_TIMING_CTRL0_REG,
326*031542fcSKonstantin Porotchkin 			   MVEBU_RTC_WRCLK_SETUP_MASK,
327*031542fcSKonstantin Porotchkin 			   MVEBU_RTC_WRCLK_SETUP_DEFAULT <<
328*031542fcSKonstantin Porotchkin 			   MVEBU_RTC_WRCLK_SETUP_OFFS);
329*031542fcSKonstantin Porotchkin 
330*031542fcSKonstantin Porotchkin 	mmio_clrsetbits_32(base + MVEBU_RTC_BRIDGE_TIMING_CTRL1_REG,
331*031542fcSKonstantin Porotchkin 			   MVEBU_RTC_READ_OUTPUT_DELAY_MASK,
332*031542fcSKonstantin Porotchkin 			   MVEBU_RTC_READ_OUTPUT_DELAY_DEFAULT);
333*031542fcSKonstantin Porotchkin 
334*031542fcSKonstantin Porotchkin 	/*
335*031542fcSKonstantin Porotchkin 	 * Issue reset to the RTC if Clock Correction register
336*031542fcSKonstantin Porotchkin 	 * contents did not sustain the reboot/power-on.
337*031542fcSKonstantin Porotchkin 	 */
338*031542fcSKonstantin Porotchkin 	if ((mmio_read_32(base + MVEBU_RTC_CCR_REG) &
339*031542fcSKonstantin Porotchkin 	    MVEBU_RTC_NOMINAL_TIMING_MASK) != MVEBU_RTC_NOMINAL_TIMING) {
340*031542fcSKonstantin Porotchkin 		/* Reset Test register */
341*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_TEST_CONFIG_REG, 0);
342*031542fcSKonstantin Porotchkin 		mdelay(500);
343*031542fcSKonstantin Porotchkin 
344*031542fcSKonstantin Porotchkin 		/* Reset Time register */
345*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_TIME_REG, 0);
346*031542fcSKonstantin Porotchkin 		udelay(62);
347*031542fcSKonstantin Porotchkin 
348*031542fcSKonstantin Porotchkin 		/* Reset Status register */
349*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_STATUS_REG,
350*031542fcSKonstantin Porotchkin 			      (MVEBU_RTC_STATUS_ALARM1_MASK |
351*031542fcSKonstantin Porotchkin 			      MVEBU_RTC_STATUS_ALARM2_MASK));
352*031542fcSKonstantin Porotchkin 		udelay(62);
353*031542fcSKonstantin Porotchkin 
354*031542fcSKonstantin Porotchkin 		/* Turn off Int1 and Int2 sources & clear the Alarm count */
355*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_IRQ_1_CONFIG_REG, 0);
356*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_IRQ_2_CONFIG_REG, 0);
357*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_ALARM_1_REG, 0);
358*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_ALARM_2_REG, 0);
359*031542fcSKonstantin Porotchkin 
360*031542fcSKonstantin Porotchkin 		/* Setup nominal register access timing */
361*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_CCR_REG,
362*031542fcSKonstantin Porotchkin 			      MVEBU_RTC_NOMINAL_TIMING);
363*031542fcSKonstantin Porotchkin 
364*031542fcSKonstantin Porotchkin 		/* Reset Time register */
365*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_TIME_REG, 0);
366*031542fcSKonstantin Porotchkin 		udelay(10);
367*031542fcSKonstantin Porotchkin 
368*031542fcSKonstantin Porotchkin 		/* Reset Status register */
369*031542fcSKonstantin Porotchkin 		mmio_write_32(base + MVEBU_RTC_STATUS_REG,
370*031542fcSKonstantin Porotchkin 			      (MVEBU_RTC_STATUS_ALARM1_MASK |
371*031542fcSKonstantin Porotchkin 			      MVEBU_RTC_STATUS_ALARM2_MASK));
372*031542fcSKonstantin Porotchkin 		udelay(50);
373*031542fcSKonstantin Porotchkin 	}
374*031542fcSKonstantin Porotchkin }
375*031542fcSKonstantin Porotchkin 
376*031542fcSKonstantin Porotchkin static void cp110_amb_adec_init(uintptr_t base)
377*031542fcSKonstantin Porotchkin {
378*031542fcSKonstantin Porotchkin 	/* enable AXI-MBUS by clearing "Bridge Windows Disable" */
379*031542fcSKonstantin Porotchkin 	mmio_clrbits_32(base + MVEBU_BRIDGE_WIN_DIS_REG,
380*031542fcSKonstantin Porotchkin 			(1 << MVEBU_BRIDGE_WIN_DIS_OFF));
381*031542fcSKonstantin Porotchkin 
382*031542fcSKonstantin Porotchkin 	/* configure AXI-MBUS windows for CP */
383*031542fcSKonstantin Porotchkin 	init_amb_adec(base);
384*031542fcSKonstantin Porotchkin }
385*031542fcSKonstantin Porotchkin 
386*031542fcSKonstantin Porotchkin void cp110_init(uintptr_t cp110_base, uint32_t stream_id)
387*031542fcSKonstantin Porotchkin {
388*031542fcSKonstantin Porotchkin 	INFO("%s: Initialize CPx - base = %lx\n", __func__, cp110_base);
389*031542fcSKonstantin Porotchkin 
390*031542fcSKonstantin Porotchkin 	/* configure IOB windows for CP0*/
391*031542fcSKonstantin Porotchkin 	init_iob(cp110_base);
392*031542fcSKonstantin Porotchkin 
393*031542fcSKonstantin Porotchkin 	/* configure AXI-MBUS windows for CP0*/
394*031542fcSKonstantin Porotchkin 	cp110_amb_adec_init(cp110_base);
395*031542fcSKonstantin Porotchkin 
396*031542fcSKonstantin Porotchkin 	/* configure axi for CP0*/
397*031542fcSKonstantin Porotchkin 	cp110_axi_attr_init(cp110_base);
398*031542fcSKonstantin Porotchkin 
399*031542fcSKonstantin Porotchkin 	/* Execute SW WA for erratas */
400*031542fcSKonstantin Porotchkin 	cp110_errata_wa_init(cp110_base);
401*031542fcSKonstantin Porotchkin 
402*031542fcSKonstantin Porotchkin 	/* Confiure pcie clock according to clock direction */
403*031542fcSKonstantin Porotchkin 	cp110_pcie_clk_cfg(cp110_base);
404*031542fcSKonstantin Porotchkin 
405*031542fcSKonstantin Porotchkin 	/* configure stream id for CP0 */
406*031542fcSKonstantin Porotchkin 	cp110_stream_id_init(cp110_base, stream_id);
407*031542fcSKonstantin Porotchkin 
408*031542fcSKonstantin Porotchkin 	/* Open AMB bridge for comphy for CP0 & CP1*/
409*031542fcSKonstantin Porotchkin 	amb_bridge_init(cp110_base);
410*031542fcSKonstantin Porotchkin 
411*031542fcSKonstantin Porotchkin 	/* Reset RTC if needed */
412*031542fcSKonstantin Porotchkin 	cp110_rtc_init(cp110_base);
413*031542fcSKonstantin Porotchkin }
414*031542fcSKonstantin Porotchkin 
415*031542fcSKonstantin Porotchkin /* Do the minimal setup required to configure the CP in BLE */
416*031542fcSKonstantin Porotchkin void cp110_ble_init(uintptr_t cp110_base)
417*031542fcSKonstantin Porotchkin {
418*031542fcSKonstantin Porotchkin #if PCI_EP_SUPPORT
419*031542fcSKonstantin Porotchkin 	INFO("%s: Initialize CPx - base = %lx\n", __func__, cp110_base);
420*031542fcSKonstantin Porotchkin 
421*031542fcSKonstantin Porotchkin 	amb_bridge_init(cp110_base);
422*031542fcSKonstantin Porotchkin 
423*031542fcSKonstantin Porotchkin 	/* Configure PCIe clock */
424*031542fcSKonstantin Porotchkin 	cp110_pcie_clk_cfg(cp110_base);
425*031542fcSKonstantin Porotchkin 
426*031542fcSKonstantin Porotchkin 	/* Configure PCIe endpoint */
427*031542fcSKonstantin Porotchkin 	ble_plat_pcie_ep_setup();
428*031542fcSKonstantin Porotchkin #endif
429*031542fcSKonstantin Porotchkin }
430