xref: /arm-trusted-firmware/plat/brcm/board/stingray/src/bl31_setup.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015 - 2021, Broadcom
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <errno.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/bl_common.h>
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include <cortex_a72.h>
12*91f16700Schasinglulu #include <drivers/arm/sp805.h>
13*91f16700Schasinglulu #include <drivers/console.h>
14*91f16700Schasinglulu #include <drivers/delay_timer.h>
15*91f16700Schasinglulu #include <drivers/ti/uart/uart_16550.h>
16*91f16700Schasinglulu #include <lib/mmio.h>
17*91f16700Schasinglulu #include <lib/utils_def.h>
18*91f16700Schasinglulu #include <plat/common/common_def.h>
19*91f16700Schasinglulu #include <plat/common/platform.h>
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #include <bl33_info.h>
22*91f16700Schasinglulu #include <chimp.h>
23*91f16700Schasinglulu #include <cmn_plat_util.h>
24*91f16700Schasinglulu #include <dmu.h>
25*91f16700Schasinglulu #include <fsx.h>
26*91f16700Schasinglulu #include <iommu.h>
27*91f16700Schasinglulu #include <ncsi.h>
28*91f16700Schasinglulu #include <paxb.h>
29*91f16700Schasinglulu #include <paxc.h>
30*91f16700Schasinglulu #include <platform_def.h>
31*91f16700Schasinglulu #ifdef USE_USB
32*91f16700Schasinglulu #include <platform_usb.h>
33*91f16700Schasinglulu #endif
34*91f16700Schasinglulu #include <sdio.h>
35*91f16700Schasinglulu #include <sr_utils.h>
36*91f16700Schasinglulu #include <timer_sync.h>
37*91f16700Schasinglulu 
38*91f16700Schasinglulu /*******************************************************************************
39*91f16700Schasinglulu  * Perform any BL3-1 platform setup common to ARM standard platforms
40*91f16700Schasinglulu  ******************************************************************************/
41*91f16700Schasinglulu 
42*91f16700Schasinglulu static void brcm_stingray_gain_qspi_control(void)
43*91f16700Schasinglulu {
44*91f16700Schasinglulu 	if (boot_source_get() != BOOT_SOURCE_QSPI) {
45*91f16700Schasinglulu 		if (bcm_chimp_is_nic_mode() &&
46*91f16700Schasinglulu 		(!bcm_chimp_handshake_done())) {
47*91f16700Schasinglulu 			/*
48*91f16700Schasinglulu 			 * Last chance to wait for ChiMP firmware to report
49*91f16700Schasinglulu 			 * "I am done" before grabbing the QSPI
50*91f16700Schasinglulu 			 */
51*91f16700Schasinglulu 			WARN("ChiMP still not booted\n");
52*91f16700Schasinglulu #ifndef CHIMP_ALWAYS_NEEDS_QSPI
53*91f16700Schasinglulu 			WARN("ChiMP is given the last chance to boot (%d s)\n",
54*91f16700Schasinglulu 				CHIMP_HANDSHAKE_TIMEOUT_MS / 1000);
55*91f16700Schasinglulu 
56*91f16700Schasinglulu 			if (!bcm_chimp_wait_handshake()) {
57*91f16700Schasinglulu 				ERROR("ChiMP failed to boot\n");
58*91f16700Schasinglulu 			} else {
59*91f16700Schasinglulu 				INFO("ChiMP booted successfully\n");
60*91f16700Schasinglulu 			}
61*91f16700Schasinglulu #endif
62*91f16700Schasinglulu 		}
63*91f16700Schasinglulu 
64*91f16700Schasinglulu #ifndef CHIMP_ALWAYS_NEEDS_QSPI
65*91f16700Schasinglulu 		INFO("AP grabs QSPI\n");
66*91f16700Schasinglulu 		/*
67*91f16700Schasinglulu 		 * For QSPI boot sbl/bl1 has already taken care.
68*91f16700Schasinglulu 		 * For other boot sources QSPI needs to be muxed to
69*91f16700Schasinglulu 		 * AP for exclusive use
70*91f16700Schasinglulu 		 */
71*91f16700Schasinglulu 		brcm_stingray_set_qspi_mux(1);
72*91f16700Schasinglulu 		INFO("AP (bl31) gained control over QSPI\n");
73*91f16700Schasinglulu #endif
74*91f16700Schasinglulu 	}
75*91f16700Schasinglulu }
76*91f16700Schasinglulu 
77*91f16700Schasinglulu static void brcm_stingray_dma_pl330_init(void)
78*91f16700Schasinglulu {
79*91f16700Schasinglulu 	unsigned int val;
80*91f16700Schasinglulu 
81*91f16700Schasinglulu 	VERBOSE("dma pl330 init start\n");
82*91f16700Schasinglulu 
83*91f16700Schasinglulu 	/* Set DMAC boot_manager_ns = 0x1 */
84*91f16700Schasinglulu 	VERBOSE(" - configure boot security state\n");
85*91f16700Schasinglulu 	mmio_setbits_32(DMAC_M0_IDM_IO_CONTROL_DIRECT, BOOT_MANAGER_NS);
86*91f16700Schasinglulu 	/* Set boot_peripheral_ns[n:0] = 0xffffffff */
87*91f16700Schasinglulu 	mmio_write_32(ICFG_DMAC_CONFIG_2, BOOT_PERIPHERAL_NS);
88*91f16700Schasinglulu 	/* Set boot_irq_ns[n:0] = 0x0000ffff */
89*91f16700Schasinglulu 	mmio_write_32(ICFG_DMAC_CONFIG_3, BOOT_IRQ_NS);
90*91f16700Schasinglulu 
91*91f16700Schasinglulu 	/* Set DMAC stream_id */
92*91f16700Schasinglulu 	VERBOSE(" - configure stream_id = 0x6000\n");
93*91f16700Schasinglulu 	val = (DMAC_STREAM_ID << DMAC_SID_SHIFT);
94*91f16700Schasinglulu 	mmio_write_32(ICFG_DMAC_SID_ARADDR_CONTROL, val);
95*91f16700Schasinglulu 	mmio_write_32(ICFG_DMAC_SID_AWADDR_CONTROL, val);
96*91f16700Schasinglulu 
97*91f16700Schasinglulu 	/* Reset DMAC */
98*91f16700Schasinglulu 	VERBOSE(" - reset dma pl330\n");
99*91f16700Schasinglulu 
100*91f16700Schasinglulu 	mmio_setbits_32(DMAC_M0_IDM_RESET_CONTROL, 0x1);
101*91f16700Schasinglulu 	udelay(500);
102*91f16700Schasinglulu 
103*91f16700Schasinglulu 	mmio_clrbits_32(DMAC_M0_IDM_RESET_CONTROL, 0x1);
104*91f16700Schasinglulu 	udelay(500);
105*91f16700Schasinglulu 
106*91f16700Schasinglulu 	INFO("dma pl330 init done\n");
107*91f16700Schasinglulu }
108*91f16700Schasinglulu 
109*91f16700Schasinglulu static void brcm_stingray_spi_pl022_init(uintptr_t idm_reset_control)
110*91f16700Schasinglulu {
111*91f16700Schasinglulu 	VERBOSE("spi pl022 init start\n");
112*91f16700Schasinglulu 
113*91f16700Schasinglulu 	/* Reset APB SPI bridge */
114*91f16700Schasinglulu 	VERBOSE(" - reset apb spi bridge\n");
115*91f16700Schasinglulu 	mmio_setbits_32(idm_reset_control, 0x1);
116*91f16700Schasinglulu 	udelay(500);
117*91f16700Schasinglulu 
118*91f16700Schasinglulu 	mmio_clrbits_32(idm_reset_control, 0x1);
119*91f16700Schasinglulu 	udelay(500);
120*91f16700Schasinglulu 
121*91f16700Schasinglulu 	INFO("spi pl022 init done\n");
122*91f16700Schasinglulu }
123*91f16700Schasinglulu 
124*91f16700Schasinglulu #define CDRU_SATA_RESET_N \
125*91f16700Schasinglulu 	BIT(CDRU_MISC_RESET_CONTROL__CDRU_SATA_RESET_N_R)
126*91f16700Schasinglulu #define CDRU_MISC_CLK_SATA \
127*91f16700Schasinglulu 	BIT(CDRU_MISC_CLK_ENABLE_CONTROL__CDRU_SATA_CLK_EN_R)
128*91f16700Schasinglulu #define CCN_CONFIG_CLK_ENABLE		(1 << 2)
129*91f16700Schasinglulu #define MMU_CONFIG_CLK_ENABLE		(0x3F << 16)
130*91f16700Schasinglulu 
131*91f16700Schasinglulu #define SATA_SATA_TOP_CTRL_BUS_CTRL	(SATA_BASE + 0x2044)
132*91f16700Schasinglulu #define DMA_BIT_CTRL_MASK		0x003
133*91f16700Schasinglulu #define DMA_DESCR_ENDIAN_CTRL		(DMA_BIT_CTRL_MASK << 0x002)
134*91f16700Schasinglulu #define DMA_DATA_ENDIAN_CTRL		(DMA_BIT_CTRL_MASK << 0x004)
135*91f16700Schasinglulu 
136*91f16700Schasinglulu #define SATA_PORT_SATA3_PCB_REG8	(SATA_BASE + 0x2320)
137*91f16700Schasinglulu #define SATA_PORT_SATA3_PCB_REG11	(SATA_BASE + 0x232c)
138*91f16700Schasinglulu #define SATA_PORT_SATA3_PCB_BLOCK_ADDR	(SATA_BASE + 0x233c)
139*91f16700Schasinglulu 
140*91f16700Schasinglulu #define SATA3_AFE_TXRX_ACTRL		0x1d0
141*91f16700Schasinglulu /* TXDriver swing setting is 800mV */
142*91f16700Schasinglulu #define DFS_SWINGNOPE_VALUE		(0x0 << 6)
143*91f16700Schasinglulu #define DFS_SWINGNOPE_MASK		(0x3 << 6)
144*91f16700Schasinglulu 
145*91f16700Schasinglulu #define DFS_SWINGPE_VALUE		(0x1 << 4)
146*91f16700Schasinglulu #define DFS_SWINGPE_MASK		(0x3 << 4)
147*91f16700Schasinglulu 
148*91f16700Schasinglulu #define DFS_INJSTRENGTH_VALUE		(0x0 << 4)
149*91f16700Schasinglulu #define DFS_INJSTRENGTH_MASK		(0x3 << 4)
150*91f16700Schasinglulu 
151*91f16700Schasinglulu #define DFS_INJEN			(0x1 << 3)
152*91f16700Schasinglulu 
153*91f16700Schasinglulu #define SATA_CORE_MEM_CTRL		(SATA_BASE + 0x3a08)
154*91f16700Schasinglulu #define SATA_CORE_MEM_CTRL_ISO		BIT(0)
155*91f16700Schasinglulu #define SATA_CORE_MEM_CTRL_ARRPOWEROKIN	BIT(1)
156*91f16700Schasinglulu #define SATA_CORE_MEM_CTRL_ARRPOWERONIN	BIT(2)
157*91f16700Schasinglulu #define SATA_CORE_MEM_CTRL_POWEROKIN	BIT(3)
158*91f16700Schasinglulu #define SATA_CORE_MEM_CTRL_POWERONIN	BIT(4)
159*91f16700Schasinglulu 
160*91f16700Schasinglulu #define SATA0_IDM_RESET_CONTROL			(SATA_BASE + 0x500800)
161*91f16700Schasinglulu #define SATA_APBT0_IDM_IO_CONTROL_DIRECT	(SATA_BASE + 0x51a408)
162*91f16700Schasinglulu #define IO_CONTROL_DIRECT_CLK_ENABLE		BIT(0)
163*91f16700Schasinglulu #define SATA_APBT0_IDM_RESET_CONTROL		(SATA_BASE + 0x51a800)
164*91f16700Schasinglulu #define IDM_RESET_CONTROL_RESET			BIT(0)
165*91f16700Schasinglulu 
166*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY1	0x6830000c
167*91f16700Schasinglulu #define SATA_NOC_SECURITY1_FIELD	0xf
168*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY2	0x68300010
169*91f16700Schasinglulu #define SATA_NOC_SECURITY2_FIELD	0xf
170*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY3	0x68300014
171*91f16700Schasinglulu #define SATA_NOC_SECURITY3_FIELD	0x1
172*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY4	0x68300018
173*91f16700Schasinglulu #define SATA_NOC_SECURITY4_FIELD	0x1
174*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY5	0x6830001c
175*91f16700Schasinglulu #define SATA_NOC_SECURITY5_FIELD	0xf
176*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY6	0x68300020
177*91f16700Schasinglulu #define SATA_NOC_SECURITY6_FIELD	0x1
178*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY7	0x68300024
179*91f16700Schasinglulu #define SATA_NOC_SECURITY7_FIELD	0xf
180*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY8	0x68300028
181*91f16700Schasinglulu #define SATA_NOC_SECURITY8_FIELD	0xf
182*91f16700Schasinglulu #define NIC400_SATA_NOC_SECURITY9	0x6830002c
183*91f16700Schasinglulu #define SATA_NOC_SECURITY9_FIELD	0x1
184*91f16700Schasinglulu 
185*91f16700Schasinglulu #define SATA_APBT_IDM_PORT_REG(port, reg) \
186*91f16700Schasinglulu 	(((port/4) << 12) + reg)
187*91f16700Schasinglulu 
188*91f16700Schasinglulu #define SATA_IDM_PORT_REG(port, reg)	((port << 12) + reg)
189*91f16700Schasinglulu 
190*91f16700Schasinglulu #define SATA_PORT_REG(port, reg) \
191*91f16700Schasinglulu 	(((port%4) << 16) + ((port/4) << 20) + reg)
192*91f16700Schasinglulu 
193*91f16700Schasinglulu #define MAX_SATA_PORTS	8
194*91f16700Schasinglulu #define USE_SATA_PORTS	8
195*91f16700Schasinglulu 
196*91f16700Schasinglulu #ifdef USE_SATA
197*91f16700Schasinglulu static const uint8_t sr_b0_sata_port[MAX_SATA_PORTS] = {
198*91f16700Schasinglulu 	0, 1, 2, 3, 4, 5, 6, 7
199*91f16700Schasinglulu };
200*91f16700Schasinglulu 
201*91f16700Schasinglulu static uint32_t brcm_stingray_get_sata_port(unsigned int port)
202*91f16700Schasinglulu {
203*91f16700Schasinglulu 	return sr_b0_sata_port[port];
204*91f16700Schasinglulu }
205*91f16700Schasinglulu 
206*91f16700Schasinglulu static void brcm_stingray_sata_init(void)
207*91f16700Schasinglulu {
208*91f16700Schasinglulu 	unsigned int port = 0;
209*91f16700Schasinglulu 	uint32_t sata_port;
210*91f16700Schasinglulu 
211*91f16700Schasinglulu 	mmio_setbits_32(CDRU_MISC_CLK_ENABLE_CONTROL,
212*91f16700Schasinglulu 			CDRU_MISC_CLK_SATA);
213*91f16700Schasinglulu 
214*91f16700Schasinglulu 	mmio_clrbits_32(CDRU_MISC_RESET_CONTROL, CDRU_SATA_RESET_N);
215*91f16700Schasinglulu 	mmio_setbits_32(CDRU_MISC_RESET_CONTROL, CDRU_SATA_RESET_N);
216*91f16700Schasinglulu 
217*91f16700Schasinglulu 	for (port = 0; port < USE_SATA_PORTS; port++) {
218*91f16700Schasinglulu 
219*91f16700Schasinglulu 		sata_port = brcm_stingray_get_sata_port(port);
220*91f16700Schasinglulu 		mmio_write_32(SATA_APBT_IDM_PORT_REG(sata_port,
221*91f16700Schasinglulu 					SATA_APBT0_IDM_RESET_CONTROL),
222*91f16700Schasinglulu 			      0x0);
223*91f16700Schasinglulu 		mmio_setbits_32(SATA_APBT_IDM_PORT_REG(sata_port,
224*91f16700Schasinglulu 					SATA_APBT0_IDM_IO_CONTROL_DIRECT),
225*91f16700Schasinglulu 				IO_CONTROL_DIRECT_CLK_ENABLE);
226*91f16700Schasinglulu 		mmio_write_32(SATA_IDM_PORT_REG(sata_port,
227*91f16700Schasinglulu 						SATA0_IDM_RESET_CONTROL),
228*91f16700Schasinglulu 			      0x0);
229*91f16700Schasinglulu 
230*91f16700Schasinglulu 		mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL),
231*91f16700Schasinglulu 				SATA_CORE_MEM_CTRL_ARRPOWERONIN);
232*91f16700Schasinglulu 		mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL),
233*91f16700Schasinglulu 				SATA_CORE_MEM_CTRL_ARRPOWEROKIN);
234*91f16700Schasinglulu 		mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL),
235*91f16700Schasinglulu 				SATA_CORE_MEM_CTRL_POWERONIN);
236*91f16700Schasinglulu 		mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL),
237*91f16700Schasinglulu 				SATA_CORE_MEM_CTRL_POWEROKIN);
238*91f16700Schasinglulu 		mmio_clrbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL),
239*91f16700Schasinglulu 				SATA_CORE_MEM_CTRL_ISO);
240*91f16700Schasinglulu 
241*91f16700Schasinglulu 		mmio_clrbits_32(SATA_PORT_REG(sata_port,
242*91f16700Schasinglulu 					      SATA_SATA_TOP_CTRL_BUS_CTRL),
243*91f16700Schasinglulu 				(DMA_DESCR_ENDIAN_CTRL | DMA_DATA_ENDIAN_CTRL));
244*91f16700Schasinglulu 	}
245*91f16700Schasinglulu 
246*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY1, SATA_NOC_SECURITY1_FIELD);
247*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY2, SATA_NOC_SECURITY2_FIELD);
248*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY3, SATA_NOC_SECURITY3_FIELD);
249*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY4, SATA_NOC_SECURITY4_FIELD);
250*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY5, SATA_NOC_SECURITY5_FIELD);
251*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY6, SATA_NOC_SECURITY6_FIELD);
252*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY7, SATA_NOC_SECURITY7_FIELD);
253*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY8, SATA_NOC_SECURITY8_FIELD);
254*91f16700Schasinglulu 	mmio_setbits_32(NIC400_SATA_NOC_SECURITY9, SATA_NOC_SECURITY9_FIELD);
255*91f16700Schasinglulu 
256*91f16700Schasinglulu 	INFO("sata init done\n");
257*91f16700Schasinglulu }
258*91f16700Schasinglulu #else
259*91f16700Schasinglulu static void poweroff_sata_pll(void)
260*91f16700Schasinglulu {
261*91f16700Schasinglulu 	/*
262*91f16700Schasinglulu 	 * SATA subsystem is clocked by LCPLL0 which is enabled by
263*91f16700Schasinglulu 	 * default by bootrom. Poweroff the PLL if SATA is not used
264*91f16700Schasinglulu 	 */
265*91f16700Schasinglulu 
266*91f16700Schasinglulu 	/* enable isolation */
267*91f16700Schasinglulu 	mmio_setbits_32(CRMU_AON_CTRL1,
268*91f16700Schasinglulu 			BIT(CRMU_AON_CTRL1__LCPLL0_ISO_IN));
269*91f16700Schasinglulu 
270*91f16700Schasinglulu 	/* Power off the SATA PLL/LDO */
271*91f16700Schasinglulu 	mmio_clrbits_32(CRMU_AON_CTRL1,
272*91f16700Schasinglulu 			(BIT(CRMU_AON_CTRL1__LCPLL0_PWRON_LDO) |
273*91f16700Schasinglulu 			 BIT(CRMU_AON_CTRL1__LCPLL0_PWR_ON)));
274*91f16700Schasinglulu }
275*91f16700Schasinglulu #endif
276*91f16700Schasinglulu 
277*91f16700Schasinglulu #ifdef USE_AMAC
278*91f16700Schasinglulu #ifdef EMULATION_SETUP
279*91f16700Schasinglulu #define ICFG_AMAC_STRAP_CONFIG		(HSLS_ICFG_REGS_BASE + 0xa5c)
280*91f16700Schasinglulu #define ICFG_AMAC_STRAP_DLL_BYPASS	(1 << 2)
281*91f16700Schasinglulu #endif
282*91f16700Schasinglulu #define ICFG_AMAC_MAC_CTRL_REG		(HSLS_ICFG_REGS_BASE + 0xa6c)
283*91f16700Schasinglulu #define ICFG_AMAC_MAC_FULL_DUPLEX	(1 << 1)
284*91f16700Schasinglulu #define ICFG_AMAC_RGMII_PHY_CONFIG	(HSLS_ICFG_REGS_BASE + 0xa60)
285*91f16700Schasinglulu #define ICFG_AMAC_SID_CONTROL		(HSLS_ICFG_REGS_BASE + 0xb10)
286*91f16700Schasinglulu #define ICFG_AMAC_SID_SHIFT		5
287*91f16700Schasinglulu #define ICFG_AMAC_SID_AWADDR_OFFSET	0x0
288*91f16700Schasinglulu #define ICFG_AMAC_SID_ARADDR_OFFSET	0x4
289*91f16700Schasinglulu #define AMAC_RPHY_1000_DATARATE		(1 << 20)
290*91f16700Schasinglulu #define AMAC_RPHY_FULL_DUPLEX		(1 << 5)
291*91f16700Schasinglulu #define AMAC_RPHY_SPEED_OFFSET		2
292*91f16700Schasinglulu #define AMAC_RPHY_SPEED_MASK		(7 << AMAC_RPHY_SPEED_OFFSET)
293*91f16700Schasinglulu #define AMAC_RPHY_1G_SPEED		(2 << AMAC_RPHY_SPEED_OFFSET)
294*91f16700Schasinglulu #define ICFG_AMAC_MEM_PWR_CTRL		(HSLS_ICFG_REGS_BASE + 0xa68)
295*91f16700Schasinglulu #define AMAC_ISO			BIT(9)
296*91f16700Schasinglulu #define AMAC_STDBY			BIT(8)
297*91f16700Schasinglulu #define AMAC_ARRPOWEROKIN		BIT(7)
298*91f16700Schasinglulu #define AMAC_ARRPOWERONIN		BIT(6)
299*91f16700Schasinglulu #define AMAC_POWEROKIN			BIT(5)
300*91f16700Schasinglulu #define AMAC_POWERONIN			BIT(4)
301*91f16700Schasinglulu 
302*91f16700Schasinglulu #define AMAC_IDM0_IO_CONTROL_DIRECT	(HSLS_IDM_REGS_BASE + 0x4408)
303*91f16700Schasinglulu #define AMAC_IDM0_ARCACHE_OFFSET	16
304*91f16700Schasinglulu #define AMAC_IDM0_AWCACHE_OFFSET	7
305*91f16700Schasinglulu #define AMAC_IDM0_ARCACHE_MASK		(0xF << AMAC_IDM0_ARCACHE_OFFSET)
306*91f16700Schasinglulu #define AMAC_IDM0_AWCACHE_MASK		(0xF << AMAC_IDM0_AWCACHE_OFFSET)
307*91f16700Schasinglulu /* ARCACHE - AWCACHE is 0xB7 for write-back no allocate */
308*91f16700Schasinglulu #define AMAC_IDM0_ARCACHE_VAL		(0xb << AMAC_IDM0_ARCACHE_OFFSET)
309*91f16700Schasinglulu #define AMAC_IDM0_AWCACHE_VAL		(0x7 << AMAC_IDM0_AWCACHE_OFFSET)
310*91f16700Schasinglulu 
311*91f16700Schasinglulu static void brcm_stingray_amac_init(void)
312*91f16700Schasinglulu {
313*91f16700Schasinglulu 	unsigned int val;
314*91f16700Schasinglulu 	uintptr_t icfg_amac_sid = ICFG_AMAC_SID_CONTROL;
315*91f16700Schasinglulu 
316*91f16700Schasinglulu 	VERBOSE("amac init start\n");
317*91f16700Schasinglulu 
318*91f16700Schasinglulu 	val = SR_SID_VAL(0x3, 0x0, 0x4) << ICFG_AMAC_SID_SHIFT;
319*91f16700Schasinglulu 	mmio_write_32(icfg_amac_sid + ICFG_AMAC_SID_AWADDR_OFFSET, val);
320*91f16700Schasinglulu 	mmio_write_32(icfg_amac_sid + ICFG_AMAC_SID_ARADDR_OFFSET, val);
321*91f16700Schasinglulu 
322*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_ARRPOWEROKIN);
323*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_ARRPOWERONIN);
324*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_POWEROKIN);
325*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_POWERONIN);
326*91f16700Schasinglulu 	mmio_clrbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_ISO);
327*91f16700Schasinglulu 	mmio_write_32(APBR_IDM_RESET_CONTROL, 0x0);
328*91f16700Schasinglulu 	mmio_clrsetbits_32(ICFG_AMAC_RGMII_PHY_CONFIG, AMAC_RPHY_SPEED_MASK,
329*91f16700Schasinglulu 				AMAC_RPHY_1G_SPEED); /*1 Gbps line rate*/
330*91f16700Schasinglulu 	/* 1000 datarate set */
331*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_RGMII_PHY_CONFIG, AMAC_RPHY_1000_DATARATE);
332*91f16700Schasinglulu 	/* full duplex */
333*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_RGMII_PHY_CONFIG, AMAC_RPHY_FULL_DUPLEX);
334*91f16700Schasinglulu #ifdef EMULATION_SETUP
335*91f16700Schasinglulu 	/* DLL bypass */
336*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_STRAP_CONFIG, ICFG_AMAC_STRAP_DLL_BYPASS);
337*91f16700Schasinglulu #endif
338*91f16700Schasinglulu 	/* serdes full duplex */
339*91f16700Schasinglulu 	mmio_setbits_32(ICFG_AMAC_MAC_CTRL_REG, ICFG_AMAC_MAC_FULL_DUPLEX);
340*91f16700Schasinglulu 	mmio_clrsetbits_32(AMAC_IDM0_IO_CONTROL_DIRECT, AMAC_IDM0_ARCACHE_MASK,
341*91f16700Schasinglulu 				AMAC_IDM0_ARCACHE_VAL);
342*91f16700Schasinglulu 	mmio_clrsetbits_32(AMAC_IDM0_IO_CONTROL_DIRECT, AMAC_IDM0_AWCACHE_MASK,
343*91f16700Schasinglulu 				AMAC_IDM0_AWCACHE_VAL);
344*91f16700Schasinglulu 	INFO("amac init done\n");
345*91f16700Schasinglulu }
346*91f16700Schasinglulu #endif    /* USE_AMAC */
347*91f16700Schasinglulu 
348*91f16700Schasinglulu static void brcm_stingray_pka_meminit(void)
349*91f16700Schasinglulu {
350*91f16700Schasinglulu 	uintptr_t icfg_mem_ctrl = ICFG_PKA_MEM_PWR_CTRL;
351*91f16700Schasinglulu 
352*91f16700Schasinglulu 	VERBOSE("pka meminit start\n");
353*91f16700Schasinglulu 
354*91f16700Schasinglulu 	VERBOSE(" - arrpoweron\n");
355*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
356*91f16700Schasinglulu 			ICFG_PKA_MEM_PWR_CTRL__ARRPOWERONIN);
357*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
358*91f16700Schasinglulu 		 ICFG_PKA_MEM_PWR_CTRL__ARRPOWERONOUT))
359*91f16700Schasinglulu 		;
360*91f16700Schasinglulu 
361*91f16700Schasinglulu 	VERBOSE(" - arrpowerok\n");
362*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
363*91f16700Schasinglulu 			ICFG_PKA_MEM_PWR_CTRL__ARRPOWEROKIN);
364*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
365*91f16700Schasinglulu 		 ICFG_PKA_MEM_PWR_CTRL__ARRPOWEROKOUT))
366*91f16700Schasinglulu 		;
367*91f16700Schasinglulu 
368*91f16700Schasinglulu 	VERBOSE(" - poweron\n");
369*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
370*91f16700Schasinglulu 			ICFG_PKA_MEM_PWR_CTRL__POWERONIN);
371*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
372*91f16700Schasinglulu 		 ICFG_PKA_MEM_PWR_CTRL__POWERONOUT))
373*91f16700Schasinglulu 		;
374*91f16700Schasinglulu 
375*91f16700Schasinglulu 	VERBOSE(" - powerok\n");
376*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
377*91f16700Schasinglulu 			ICFG_PKA_MEM_PWR_CTRL__POWEROKIN);
378*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
379*91f16700Schasinglulu 		 ICFG_PKA_MEM_PWR_CTRL__POWEROKOUT))
380*91f16700Schasinglulu 		;
381*91f16700Schasinglulu 
382*91f16700Schasinglulu 	/* Wait sometime */
383*91f16700Schasinglulu 	mdelay(1);
384*91f16700Schasinglulu 
385*91f16700Schasinglulu 	VERBOSE(" - remove isolation\n");
386*91f16700Schasinglulu 	mmio_clrbits_32(icfg_mem_ctrl, ICFG_PKA_MEM_PWR_CTRL__ISO);
387*91f16700Schasinglulu 
388*91f16700Schasinglulu 	INFO("pka meminit done\n");
389*91f16700Schasinglulu }
390*91f16700Schasinglulu 
391*91f16700Schasinglulu static void brcm_stingray_smmu_init(void)
392*91f16700Schasinglulu {
393*91f16700Schasinglulu 	unsigned int val;
394*91f16700Schasinglulu 	uintptr_t smmu_base = SMMU_BASE;
395*91f16700Schasinglulu 
396*91f16700Schasinglulu 	VERBOSE("smmu init start\n");
397*91f16700Schasinglulu 
398*91f16700Schasinglulu 	/* Configure SCR0 */
399*91f16700Schasinglulu 	VERBOSE(" - configure scr0\n");
400*91f16700Schasinglulu 	val = mmio_read_32(smmu_base + 0x0);
401*91f16700Schasinglulu 	val |= (0x1 << 12);
402*91f16700Schasinglulu 	mmio_write_32(smmu_base + 0x0, val);
403*91f16700Schasinglulu 
404*91f16700Schasinglulu 	/* Reserve context banks for secure masters */
405*91f16700Schasinglulu 	arm_smmu_reserve_secure_cntxt();
406*91f16700Schasinglulu 
407*91f16700Schasinglulu 	/* Print configuration */
408*91f16700Schasinglulu 	VERBOSE(" - scr0=0x%x scr1=0x%x scr2=0x%x\n",
409*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x0),
410*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x4),
411*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x8));
412*91f16700Schasinglulu 
413*91f16700Schasinglulu 	VERBOSE(" - idr0=0x%x idr1=0x%x idr2=0x%x\n",
414*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x20),
415*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x24),
416*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x28));
417*91f16700Schasinglulu 
418*91f16700Schasinglulu 	VERBOSE(" - idr3=0x%x idr4=0x%x idr5=0x%x\n",
419*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x2c),
420*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x30),
421*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x34));
422*91f16700Schasinglulu 
423*91f16700Schasinglulu 	VERBOSE(" - idr6=0x%x idr7=0x%x\n",
424*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x38),
425*91f16700Schasinglulu 		mmio_read_32(smmu_base + 0x3c));
426*91f16700Schasinglulu 
427*91f16700Schasinglulu 	INFO("smmu init done\n");
428*91f16700Schasinglulu }
429*91f16700Schasinglulu 
430*91f16700Schasinglulu static void brcm_stingray_dma_pl330_meminit(void)
431*91f16700Schasinglulu {
432*91f16700Schasinglulu 	uintptr_t icfg_mem_ctrl = ICFG_DMAC_MEM_PWR_CTRL;
433*91f16700Schasinglulu 
434*91f16700Schasinglulu 	VERBOSE("dmac meminit start\n");
435*91f16700Schasinglulu 
436*91f16700Schasinglulu 	VERBOSE(" - arrpoweron\n");
437*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
438*91f16700Schasinglulu 			ICFG_DMAC_MEM_PWR_CTRL__ARRPOWERONIN);
439*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
440*91f16700Schasinglulu 		 ICFG_DMAC_MEM_PWR_CTRL__ARRPOWERONOUT))
441*91f16700Schasinglulu 		;
442*91f16700Schasinglulu 
443*91f16700Schasinglulu 	VERBOSE(" - arrpowerok\n");
444*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
445*91f16700Schasinglulu 			ICFG_DMAC_MEM_PWR_CTRL__ARRPOWEROKIN);
446*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
447*91f16700Schasinglulu 		 ICFG_DMAC_MEM_PWR_CTRL__ARRPOWEROKOUT))
448*91f16700Schasinglulu 		;
449*91f16700Schasinglulu 
450*91f16700Schasinglulu 	VERBOSE(" - poweron\n");
451*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
452*91f16700Schasinglulu 			ICFG_DMAC_MEM_PWR_CTRL__POWERONIN);
453*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
454*91f16700Schasinglulu 		 ICFG_DMAC_MEM_PWR_CTRL__POWERONOUT))
455*91f16700Schasinglulu 		;
456*91f16700Schasinglulu 
457*91f16700Schasinglulu 	VERBOSE(" - powerok\n");
458*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
459*91f16700Schasinglulu 			ICFG_DMAC_MEM_PWR_CTRL__POWEROKIN);
460*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
461*91f16700Schasinglulu 		 ICFG_DMAC_MEM_PWR_CTRL__POWEROKOUT))
462*91f16700Schasinglulu 		;
463*91f16700Schasinglulu 
464*91f16700Schasinglulu 	/* Wait sometime */
465*91f16700Schasinglulu 	mdelay(1);
466*91f16700Schasinglulu 
467*91f16700Schasinglulu 	VERBOSE(" - remove isolation\n");
468*91f16700Schasinglulu 	mmio_clrbits_32(icfg_mem_ctrl, ICFG_DMAC_MEM_PWR_CTRL__ISO);
469*91f16700Schasinglulu 
470*91f16700Schasinglulu 	INFO("dmac meminit done\n");
471*91f16700Schasinglulu }
472*91f16700Schasinglulu 
473*91f16700Schasinglulu /* program the crmu access ranges for allowing non sec access*/
474*91f16700Schasinglulu static void brcm_stingray_crmu_access_init(void)
475*91f16700Schasinglulu {
476*91f16700Schasinglulu 	/* Enable 0x6641c001 - 0x6641c701 for non secure access */
477*91f16700Schasinglulu 	mmio_write_32(CRMU_CORE_ADDR_RANGE0_LOW, 0x6641c001);
478*91f16700Schasinglulu 	mmio_write_32(CRMU_CORE_ADDR_RANGE0_LOW + 0x4, 0x6641c701);
479*91f16700Schasinglulu 
480*91f16700Schasinglulu 	/* Enable 0x6641d001 - 0x66424b01 for non secure access */
481*91f16700Schasinglulu 	mmio_write_32(CRMU_CORE_ADDR_RANGE1_LOW, 0x6641d001);
482*91f16700Schasinglulu 	mmio_write_32(CRMU_CORE_ADDR_RANGE1_LOW + 0x4, 0x66424b01);
483*91f16700Schasinglulu 
484*91f16700Schasinglulu 	/* Enable 0x66425001 - 0x66425f01 for non secure access */
485*91f16700Schasinglulu 	mmio_write_32(CRMU_CORE_ADDR_RANGE2_LOW, 0x66425001);
486*91f16700Schasinglulu 	mmio_write_32(CRMU_CORE_ADDR_RANGE2_LOW + 0x4, 0x66425f01);
487*91f16700Schasinglulu 
488*91f16700Schasinglulu 	INFO("crmu access init done\n");
489*91f16700Schasinglulu }
490*91f16700Schasinglulu 
491*91f16700Schasinglulu static void brcm_stingray_scr_init(void)
492*91f16700Schasinglulu {
493*91f16700Schasinglulu 	unsigned int val;
494*91f16700Schasinglulu 	uintptr_t scr_base = SCR_BASE;
495*91f16700Schasinglulu 	unsigned int clr_mask = SCR_AXCACHE_CONFIG_MASK;
496*91f16700Schasinglulu 	unsigned int set_mask = SCR_TBUX_AXCACHE_CONFIG;
497*91f16700Schasinglulu 
498*91f16700Schasinglulu 	VERBOSE("scr init start\n");
499*91f16700Schasinglulu 
500*91f16700Schasinglulu 	/* awdomain=0x1 and ardomain=0x1 */
501*91f16700Schasinglulu 	mmio_clrsetbits_32(scr_base + 0x0, clr_mask, set_mask);
502*91f16700Schasinglulu 	val = mmio_read_32(scr_base + 0x0);
503*91f16700Schasinglulu 	VERBOSE(" - set tbu0_config=0x%x\n", val);
504*91f16700Schasinglulu 
505*91f16700Schasinglulu 	/* awdomain=0x1 and ardomain=0x1 */
506*91f16700Schasinglulu 	mmio_clrsetbits_32(scr_base + 0x4, clr_mask, set_mask);
507*91f16700Schasinglulu 	val = mmio_read_32(scr_base + 0x4);
508*91f16700Schasinglulu 	VERBOSE(" - set tbu1_config=0x%x\n", val);
509*91f16700Schasinglulu 
510*91f16700Schasinglulu 	/* awdomain=0x1 and ardomain=0x1 */
511*91f16700Schasinglulu 	mmio_clrsetbits_32(scr_base + 0x8, clr_mask, set_mask);
512*91f16700Schasinglulu 	val = mmio_read_32(scr_base + 0x8);
513*91f16700Schasinglulu 	VERBOSE(" - set tbu2_config=0x%x\n", val);
514*91f16700Schasinglulu 
515*91f16700Schasinglulu 	/* awdomain=0x1 and ardomain=0x1 */
516*91f16700Schasinglulu 	mmio_clrsetbits_32(scr_base + 0xc, clr_mask, set_mask);
517*91f16700Schasinglulu 	val = mmio_read_32(scr_base + 0xc);
518*91f16700Schasinglulu 	VERBOSE(" - set tbu3_config=0x%x\n", val);
519*91f16700Schasinglulu 
520*91f16700Schasinglulu 	/* awdomain=0x1 and ardomain=0x1 */
521*91f16700Schasinglulu 	mmio_clrsetbits_32(scr_base + 0x10, clr_mask, set_mask);
522*91f16700Schasinglulu 	val = mmio_read_32(scr_base + 0x10);
523*91f16700Schasinglulu 	VERBOSE(" - set tbu4_config=0x%x\n", val);
524*91f16700Schasinglulu 
525*91f16700Schasinglulu 	/* awdomain=0x0 and ardomain=0x0 */
526*91f16700Schasinglulu 	mmio_clrbits_32(scr_base + 0x14, clr_mask);
527*91f16700Schasinglulu 	val = mmio_read_32(scr_base + 0x14);
528*91f16700Schasinglulu 	VERBOSE(" - set gic_config=0x%x\n", val);
529*91f16700Schasinglulu 
530*91f16700Schasinglulu 	INFO("scr init done\n");
531*91f16700Schasinglulu }
532*91f16700Schasinglulu 
533*91f16700Schasinglulu static void brcm_stingray_hsls_tzpcprot_init(void)
534*91f16700Schasinglulu {
535*91f16700Schasinglulu 	unsigned int val;
536*91f16700Schasinglulu 	uintptr_t tzpcdecprot_base = HSLS_TZPC_BASE;
537*91f16700Schasinglulu 
538*91f16700Schasinglulu 	VERBOSE("hsls tzpcprot init start\n");
539*91f16700Schasinglulu 
540*91f16700Schasinglulu 	/* Treat third-party masters as non-secured */
541*91f16700Schasinglulu 	val = 0;
542*91f16700Schasinglulu 	val |= BIT(6); /* SDIO1 */
543*91f16700Schasinglulu 	val |= BIT(5); /* SDIO0 */
544*91f16700Schasinglulu 	val |= BIT(0); /* AMAC */
545*91f16700Schasinglulu 	mmio_write_32(tzpcdecprot_base + 0x810, val);
546*91f16700Schasinglulu 
547*91f16700Schasinglulu 	/* Print TZPC decode status registers */
548*91f16700Schasinglulu 	VERBOSE(" - tzpcdecprot0=0x%x\n",
549*91f16700Schasinglulu 		mmio_read_32(tzpcdecprot_base + 0x800));
550*91f16700Schasinglulu 
551*91f16700Schasinglulu 	VERBOSE(" - tzpcdecprot1=0x%x\n",
552*91f16700Schasinglulu 		mmio_read_32(tzpcdecprot_base + 0x80c));
553*91f16700Schasinglulu 
554*91f16700Schasinglulu 	INFO("hsls tzpcprot init done\n");
555*91f16700Schasinglulu }
556*91f16700Schasinglulu 
557*91f16700Schasinglulu #ifdef USE_I2S
558*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL			(HSLS_ICFG_REGS_BASE + 0xaa8)
559*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__POWERONIN	BIT(0)
560*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__POWEROKIN	BIT(1)
561*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__ARRPOWERONIN	BIT(2)
562*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__ARRPOWEROKIN	BIT(3)
563*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__POWERONOUT	BIT(4)
564*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__POWEROKOUT	BIT(5)
565*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__ARRPOWERONOUT	BIT(6)
566*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__ARRPOWEROKOUT	BIT(7)
567*91f16700Schasinglulu #define ICFG_AUDIO_POWER_CTRL__ISO		BIT(8)
568*91f16700Schasinglulu #define ICFG_AUDIO_SID_CONTROL			(HSLS_ICFG_REGS_BASE + 0xaf8)
569*91f16700Schasinglulu #define ICFG_AUDIO_SID_SHIFT			5
570*91f16700Schasinglulu #define ICFG_AUDIO_SID_AWADDR_OFFSET		0x0
571*91f16700Schasinglulu #define ICFG_AUDIO_SID_ARADDR_OFFSET		0x4
572*91f16700Schasinglulu 
573*91f16700Schasinglulu #define I2S_RESET_CONTROL        (HSLS_IDM_REGS_BASE + 0x1800)
574*91f16700Schasinglulu #define I2S_IDM_IO_CONTROL       (HSLS_IDM_REGS_BASE + 0x1408)
575*91f16700Schasinglulu #define IO_CONTROL_CLK_ENABLE    BIT(0)
576*91f16700Schasinglulu #define I2S_IDM0_ARCACHE_OFFSET  16
577*91f16700Schasinglulu #define I2S_IDM0_AWCACHE_OFFSET  20
578*91f16700Schasinglulu #define I2S_IDM0_ARCACHE_MASK    (0xF << I2S_IDM0_ARCACHE_OFFSET)
579*91f16700Schasinglulu #define I2S_IDM0_AWCACHE_MASK    (0xF << I2S_IDM0_AWCACHE_OFFSET)
580*91f16700Schasinglulu /* ARCACHE - AWCACHE is 0x22 Normal Non-cacheable Non-bufferable. */
581*91f16700Schasinglulu #define I2S_IDM0_ARCACHE_VAL     (0x2 << I2S_IDM0_ARCACHE_OFFSET)
582*91f16700Schasinglulu #define I2S_IDM0_AWCACHE_VAL     (0x2 << I2S_IDM0_AWCACHE_OFFSET)
583*91f16700Schasinglulu 
584*91f16700Schasinglulu static void brcm_stingray_audio_init(void)
585*91f16700Schasinglulu {
586*91f16700Schasinglulu 	unsigned int val;
587*91f16700Schasinglulu 	uintptr_t icfg_mem_ctrl = ICFG_AUDIO_POWER_CTRL;
588*91f16700Schasinglulu 	uintptr_t icfg_audio_sid = ICFG_AUDIO_SID_CONTROL;
589*91f16700Schasinglulu 
590*91f16700Schasinglulu 	mmio_write_32(I2S_RESET_CONTROL, 0x0);
591*91f16700Schasinglulu 
592*91f16700Schasinglulu 	mmio_clrsetbits_32(I2S_IDM_IO_CONTROL, I2S_IDM0_ARCACHE_MASK,
593*91f16700Schasinglulu 			   I2S_IDM0_ARCACHE_VAL);
594*91f16700Schasinglulu 
595*91f16700Schasinglulu 	mmio_clrsetbits_32(I2S_IDM_IO_CONTROL, I2S_IDM0_AWCACHE_MASK,
596*91f16700Schasinglulu 			   I2S_IDM0_AWCACHE_VAL);
597*91f16700Schasinglulu 
598*91f16700Schasinglulu 	mmio_setbits_32(I2S_IDM_IO_CONTROL, IO_CONTROL_CLK_ENABLE);
599*91f16700Schasinglulu 
600*91f16700Schasinglulu 	VERBOSE("audio meminit start\n");
601*91f16700Schasinglulu 
602*91f16700Schasinglulu 	VERBOSE(" - configure stream_id = 0x6001\n");
603*91f16700Schasinglulu 	val = SR_SID_VAL(0x3, 0x0, 0x1) << ICFG_AUDIO_SID_SHIFT;
604*91f16700Schasinglulu 	mmio_write_32(icfg_audio_sid + ICFG_AUDIO_SID_AWADDR_OFFSET, val);
605*91f16700Schasinglulu 	mmio_write_32(icfg_audio_sid + ICFG_AUDIO_SID_ARADDR_OFFSET, val);
606*91f16700Schasinglulu 
607*91f16700Schasinglulu 	VERBOSE(" - arrpoweron\n");
608*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
609*91f16700Schasinglulu 			ICFG_AUDIO_POWER_CTRL__ARRPOWERONIN);
610*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
611*91f16700Schasinglulu 		 ICFG_AUDIO_POWER_CTRL__ARRPOWERONOUT))
612*91f16700Schasinglulu 		;
613*91f16700Schasinglulu 
614*91f16700Schasinglulu 	VERBOSE(" - arrpowerok\n");
615*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
616*91f16700Schasinglulu 			ICFG_AUDIO_POWER_CTRL__ARRPOWEROKIN);
617*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
618*91f16700Schasinglulu 		 ICFG_AUDIO_POWER_CTRL__ARRPOWEROKOUT))
619*91f16700Schasinglulu 		;
620*91f16700Schasinglulu 
621*91f16700Schasinglulu 	VERBOSE(" - poweron\n");
622*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
623*91f16700Schasinglulu 			ICFG_AUDIO_POWER_CTRL__POWERONIN);
624*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
625*91f16700Schasinglulu 		 ICFG_AUDIO_POWER_CTRL__POWERONOUT))
626*91f16700Schasinglulu 		;
627*91f16700Schasinglulu 
628*91f16700Schasinglulu 	VERBOSE(" - powerok\n");
629*91f16700Schasinglulu 	mmio_setbits_32(icfg_mem_ctrl,
630*91f16700Schasinglulu 			ICFG_AUDIO_POWER_CTRL__POWEROKIN);
631*91f16700Schasinglulu 	while (!(mmio_read_32(icfg_mem_ctrl) &
632*91f16700Schasinglulu 		 ICFG_AUDIO_POWER_CTRL__POWEROKOUT))
633*91f16700Schasinglulu 		;
634*91f16700Schasinglulu 
635*91f16700Schasinglulu 	/* Wait sometime */
636*91f16700Schasinglulu 	mdelay(1);
637*91f16700Schasinglulu 
638*91f16700Schasinglulu 	VERBOSE(" - remove isolation\n");
639*91f16700Schasinglulu 	mmio_clrbits_32(icfg_mem_ctrl, ICFG_AUDIO_POWER_CTRL__ISO);
640*91f16700Schasinglulu 
641*91f16700Schasinglulu 	INFO("audio meminit done\n");
642*91f16700Schasinglulu }
643*91f16700Schasinglulu #endif    /* USE_I2S */
644*91f16700Schasinglulu 
645*91f16700Schasinglulu /*
646*91f16700Schasinglulu  * These defines do not match the regfile but they are renamed in a way such
647*91f16700Schasinglulu  * that they are much more readible
648*91f16700Schasinglulu  */
649*91f16700Schasinglulu 
650*91f16700Schasinglulu #define SCR_GPV_SMMU_NS			(SCR_GPV_BASE + 0x28)
651*91f16700Schasinglulu #define SCR_GPV_GIC500_NS		(SCR_GPV_BASE + 0x34)
652*91f16700Schasinglulu #define HSLS_GPV_NOR_S0_NS		(HSLS_GPV_BASE + 0x14)
653*91f16700Schasinglulu #define HSLS_GPV_IDM1_NS		(HSLS_GPV_BASE + 0x18)
654*91f16700Schasinglulu #define HSLS_GPV_IDM2_NS		(HSLS_GPV_BASE + 0x1c)
655*91f16700Schasinglulu #define HSLS_SDIO0_SLAVE_NS		(HSLS_GPV_BASE + 0x20)
656*91f16700Schasinglulu #define HSLS_SDIO1_SLAVE_NS		(HSLS_GPV_BASE + 0x24)
657*91f16700Schasinglulu #define HSLS_GPV_APBY_NS		(HSLS_GPV_BASE + 0x2c)
658*91f16700Schasinglulu #define HSLS_GPV_APBZ_NS		(HSLS_GPV_BASE + 0x30)
659*91f16700Schasinglulu #define HSLS_GPV_APBX_NS		(HSLS_GPV_BASE + 0x34)
660*91f16700Schasinglulu #define HSLS_GPV_APBS_NS		(HSLS_GPV_BASE + 0x38)
661*91f16700Schasinglulu #define HSLS_GPV_QSPI_S0_NS		(HSLS_GPV_BASE + 0x68)
662*91f16700Schasinglulu #define HSLS_GPV_APBR_NS		(HSLS_GPV_BASE + 0x6c)
663*91f16700Schasinglulu #define FS4_CRYPTO_GPV_RM_SLAVE_NS	(FS4_CRYPTO_GPV_BASE + 0x8)
664*91f16700Schasinglulu #define FS4_CRYPTO_GPV_APB_SWITCH_NS	(FS4_CRYPTO_GPV_BASE + 0xc)
665*91f16700Schasinglulu #define FS4_RAID_GPV_RM_SLAVE_NS	(FS4_RAID_GPV_BASE + 0x8)
666*91f16700Schasinglulu #define FS4_RAID_GPV_APB_SWITCH_NS	(FS4_RAID_GPV_BASE + 0xc)
667*91f16700Schasinglulu #define FS4_CRYPTO_IDM_NS		(NIC400_FS_NOC_ROOT + 0x1c)
668*91f16700Schasinglulu #define FS4_RAID_IDM_NS			(NIC400_FS_NOC_ROOT + 0x28)
669*91f16700Schasinglulu 
670*91f16700Schasinglulu #define FS4_CRYPTO_RING_COUNT          32
671*91f16700Schasinglulu #define FS4_CRYPTO_DME_COUNT           10
672*91f16700Schasinglulu #define FS4_CRYPTO_AE_COUNT            10
673*91f16700Schasinglulu #define FS4_CRYPTO_START_STREAM_ID     0x4000
674*91f16700Schasinglulu #define FS4_CRYPTO_MSI_DEVICE_ID       0x4100
675*91f16700Schasinglulu 
676*91f16700Schasinglulu #define FS4_RAID_RING_COUNT            32
677*91f16700Schasinglulu #define FS4_RAID_DME_COUNT             8
678*91f16700Schasinglulu #define FS4_RAID_AE_COUNT              8
679*91f16700Schasinglulu #define FS4_RAID_START_STREAM_ID       0x4200
680*91f16700Schasinglulu #define FS4_RAID_MSI_DEVICE_ID         0x4300
681*91f16700Schasinglulu 
682*91f16700Schasinglulu #define FS6_PKI_AXI_SLAVE_NS \
683*91f16700Schasinglulu 		(NIC400_FS_NOC_ROOT + NIC400_FS_NOC_SECURITY2_OFFSET)
684*91f16700Schasinglulu 
685*91f16700Schasinglulu #define FS6_PKI_AE_DME_APB_NS \
686*91f16700Schasinglulu 		(NIC400_FS_NOC_ROOT + NIC400_FS_NOC_SECURITY7_OFFSET)
687*91f16700Schasinglulu #define FS6_PKI_IDM_IO_CONTROL_DIRECT	0x0
688*91f16700Schasinglulu #define FS6_PKI_IDM_RESET_CONTROL	0x0
689*91f16700Schasinglulu #define FS6_PKI_RING_COUNT		32
690*91f16700Schasinglulu #define FS6_PKI_DME_COUNT		1
691*91f16700Schasinglulu #define FS6_PKI_AE_COUNT		4
692*91f16700Schasinglulu #define FS6_PKI_START_STREAM_ID		0x4000
693*91f16700Schasinglulu #define FS6_PKI_MSI_DEVICE_ID		0x4100
694*91f16700Schasinglulu 
695*91f16700Schasinglulu static void brcm_stingray_security_init(void)
696*91f16700Schasinglulu {
697*91f16700Schasinglulu 	unsigned int val;
698*91f16700Schasinglulu 
699*91f16700Schasinglulu 	val = mmio_read_32(SCR_GPV_SMMU_NS);
700*91f16700Schasinglulu 	val |= BIT(0);				/* SMMU NS = 1 */
701*91f16700Schasinglulu 	mmio_write_32(SCR_GPV_SMMU_NS, val);
702*91f16700Schasinglulu 
703*91f16700Schasinglulu 	val = mmio_read_32(SCR_GPV_GIC500_NS);
704*91f16700Schasinglulu 	val |= BIT(0);				/* GIC-500 NS = 1 */
705*91f16700Schasinglulu 	mmio_write_32(SCR_GPV_GIC500_NS, val);
706*91f16700Schasinglulu 
707*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_NOR_S0_NS);
708*91f16700Schasinglulu 	val |= BIT(0);				/* NOR SLAVE NS = 1 */
709*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_NOR_S0_NS, val);
710*91f16700Schasinglulu 
711*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_IDM1_NS);
712*91f16700Schasinglulu 	val |= BIT(0);				/* DMA IDM NS = 1 */
713*91f16700Schasinglulu 	val |= BIT(1);				/* I2S IDM NS = 1 */
714*91f16700Schasinglulu 	val |= BIT(2);				/* AMAC IDM NS = 1 */
715*91f16700Schasinglulu 	val |= BIT(3);				/* SDIO0 IDM NS = 1 */
716*91f16700Schasinglulu 	val |= BIT(4);				/* SDIO1 IDM NS = 1 */
717*91f16700Schasinglulu 	val |= BIT(5);				/* DS_3 IDM NS = 1 */
718*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_IDM1_NS, val);
719*91f16700Schasinglulu 
720*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_IDM2_NS);
721*91f16700Schasinglulu 	val |= BIT(2);				/* QSPI IDM NS = 1 */
722*91f16700Schasinglulu 	val |= BIT(1);				/* NOR IDM NS = 1 */
723*91f16700Schasinglulu 	val |= BIT(0);				/* NAND IDM NS = 1 */
724*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_IDM2_NS, val);
725*91f16700Schasinglulu 
726*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_APBY_NS);
727*91f16700Schasinglulu 	val |= BIT(10);				/* I2S NS = 1 */
728*91f16700Schasinglulu 	val |= BIT(4);				/* IOPAD NS = 1 */
729*91f16700Schasinglulu 	val |= 0xf;				/* UARTx NS = 1 */
730*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_APBY_NS, val);
731*91f16700Schasinglulu 
732*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_APBZ_NS);
733*91f16700Schasinglulu 	val |= BIT(2);			/* RNG NS = 1 */
734*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_APBZ_NS, val);
735*91f16700Schasinglulu 
736*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_APBS_NS);
737*91f16700Schasinglulu 	val |= 0x3;				/* SPIx NS = 1 */
738*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_APBS_NS, val);
739*91f16700Schasinglulu 
740*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_APBR_NS);
741*91f16700Schasinglulu 	val |= BIT(7);				/* QSPI APB NS = 1 */
742*91f16700Schasinglulu 	val |= BIT(6);				/* NAND APB NS = 1 */
743*91f16700Schasinglulu 	val |= BIT(5);				/* NOR APB NS = 1 */
744*91f16700Schasinglulu 	val |= BIT(4);				/* AMAC APB NS = 1 */
745*91f16700Schasinglulu 	val |= BIT(1);				/* DMA S1 APB NS = 1 */
746*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_APBR_NS, val);
747*91f16700Schasinglulu 
748*91f16700Schasinglulu 	val = mmio_read_32(HSLS_SDIO0_SLAVE_NS);
749*91f16700Schasinglulu 	val |= BIT(0);				/* SDIO0 NS = 1 */
750*91f16700Schasinglulu 	mmio_write_32(HSLS_SDIO0_SLAVE_NS, val);
751*91f16700Schasinglulu 
752*91f16700Schasinglulu 	val = mmio_read_32(HSLS_SDIO1_SLAVE_NS);
753*91f16700Schasinglulu 	val |= BIT(0);				/* SDIO1 NS = 1 */
754*91f16700Schasinglulu 	mmio_write_32(HSLS_SDIO1_SLAVE_NS, val);
755*91f16700Schasinglulu 
756*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_APBX_NS);
757*91f16700Schasinglulu 	val |= BIT(14);				/* SMBUS1 NS = 1 */
758*91f16700Schasinglulu 	val |= BIT(13);				/* GPIO NS = 1 */
759*91f16700Schasinglulu 	val |= BIT(12);				/* WDT NS = 1 */
760*91f16700Schasinglulu 	val |= BIT(11);				/* SMBUS0 NS = 1 */
761*91f16700Schasinglulu 	val |= BIT(10);				/* Timer7 NS = 1 */
762*91f16700Schasinglulu 	val |= BIT(9);				/* Timer6 NS = 1 */
763*91f16700Schasinglulu 	val |= BIT(8);				/* Timer5 NS = 1 */
764*91f16700Schasinglulu 	val |= BIT(7);				/* Timer4 NS = 1 */
765*91f16700Schasinglulu 	val |= BIT(6);				/* Timer3 NS = 1 */
766*91f16700Schasinglulu 	val |= BIT(5);				/* Timer2 NS = 1 */
767*91f16700Schasinglulu 	val |= BIT(4);				/* Timer1 NS = 1 */
768*91f16700Schasinglulu 	val |= BIT(3);				/* Timer0 NS = 1 */
769*91f16700Schasinglulu 	val |= BIT(2);				/* MDIO NS = 1 */
770*91f16700Schasinglulu 	val |= BIT(1);				/* PWM NS = 1 */
771*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_APBX_NS, val);
772*91f16700Schasinglulu 
773*91f16700Schasinglulu 	val = mmio_read_32(HSLS_GPV_QSPI_S0_NS);
774*91f16700Schasinglulu 	val |= BIT(0);				/* QSPI NS = 1 */
775*91f16700Schasinglulu 	mmio_write_32(HSLS_GPV_QSPI_S0_NS, val);
776*91f16700Schasinglulu 
777*91f16700Schasinglulu #ifdef USE_FS4
778*91f16700Schasinglulu 	val = 0x1;				/* FS4 Crypto rm_slave */
779*91f16700Schasinglulu 	mmio_write_32(FS4_CRYPTO_GPV_RM_SLAVE_NS, val);
780*91f16700Schasinglulu 	val = 0x1;				/* FS4 Crypto apb_switch */
781*91f16700Schasinglulu 	mmio_write_32(FS4_CRYPTO_GPV_APB_SWITCH_NS, val);
782*91f16700Schasinglulu 
783*91f16700Schasinglulu 	val = 0x1;				/* FS4 Raid rm_slave */
784*91f16700Schasinglulu 	mmio_write_32(FS4_RAID_GPV_RM_SLAVE_NS, val);
785*91f16700Schasinglulu 	val = 0x1;				/* FS4 Raid apb_switch */
786*91f16700Schasinglulu 	mmio_write_32(FS4_RAID_GPV_APB_SWITCH_NS, val);
787*91f16700Schasinglulu 
788*91f16700Schasinglulu 	val = 0x1;				/* FS4 Crypto IDM */
789*91f16700Schasinglulu 	mmio_write_32(FS4_CRYPTO_IDM_NS, val);
790*91f16700Schasinglulu 	val = 0x1;				/* FS4 RAID IDM */
791*91f16700Schasinglulu 	mmio_write_32(FS4_RAID_IDM_NS, val);
792*91f16700Schasinglulu #endif
793*91f16700Schasinglulu 
794*91f16700Schasinglulu #ifdef BL31_CCN_NONSECURE
795*91f16700Schasinglulu 	/* Enable non-secure access to CCN registers */
796*91f16700Schasinglulu 	mmio_write_32(OLY_MN_REGISTERS_NODE0_SECURE_ACCESS, 0x1);
797*91f16700Schasinglulu #endif
798*91f16700Schasinglulu 
799*91f16700Schasinglulu #ifdef DDR_CTRL_PHY_NONSECURE
800*91f16700Schasinglulu 	mmio_write_32(SCR_NOC_DDR_REGISTER_ACCESS, 0x1);
801*91f16700Schasinglulu #endif
802*91f16700Schasinglulu 
803*91f16700Schasinglulu 	paxc_mhb_ns_init();
804*91f16700Schasinglulu 
805*91f16700Schasinglulu 	/* unlock scr idm for non secure access */
806*91f16700Schasinglulu 	mmio_write_32(SCR_NOC_SECURITY0, 0xffffffff);
807*91f16700Schasinglulu 
808*91f16700Schasinglulu 	INFO("security init done\r\n");
809*91f16700Schasinglulu }
810*91f16700Schasinglulu 
811*91f16700Schasinglulu void brcm_gpio_pad_ns_init(void)
812*91f16700Schasinglulu {
813*91f16700Schasinglulu 	/* configure all GPIO pads for non secure world access*/
814*91f16700Schasinglulu 	mmio_write_32(GPIO_S_CNTRL_REG, 0xffffffff); /* 128-140 gpio pads */
815*91f16700Schasinglulu 	mmio_write_32(GPIO_S_CNTRL_REG + 0x4, 0xffffffff); /* 96-127 gpio pad */
816*91f16700Schasinglulu 	mmio_write_32(GPIO_S_CNTRL_REG + 0x8, 0xffffffff); /* 64-95 gpio pad */
817*91f16700Schasinglulu 	mmio_write_32(GPIO_S_CNTRL_REG + 0xc, 0xffffffff); /* 32-63 gpio pad */
818*91f16700Schasinglulu 	mmio_write_32(GPIO_S_CNTRL_REG + 0x10, 0xffffffff); /* 0-31 gpio pad */
819*91f16700Schasinglulu }
820*91f16700Schasinglulu 
821*91f16700Schasinglulu #ifndef USE_DDR
822*91f16700Schasinglulu static void brcm_stingray_sram_ns_init(void)
823*91f16700Schasinglulu {
824*91f16700Schasinglulu 	uintptr_t sram_root = TZC400_FS_SRAM_ROOT;
825*91f16700Schasinglulu 	uintptr_t noc_root = NIC400_FS_NOC_ROOT;
826*91f16700Schasinglulu 
827*91f16700Schasinglulu 	mmio_write_32(sram_root + GATE_KEEPER_OFFSET, 1);
828*91f16700Schasinglulu 	mmio_write_32(sram_root + REGION_ATTRIBUTES_0_OFFSET, 0xc0000000);
829*91f16700Schasinglulu 	mmio_write_32(sram_root + REGION_ID_ACCESS_0_OFFSET, 0x00010001);
830*91f16700Schasinglulu 	mmio_write_32(noc_root + NIC400_FS_NOC_SECURITY4_OFFSET, 0x1);
831*91f16700Schasinglulu 	INFO(" stingray sram ns init done.\n");
832*91f16700Schasinglulu }
833*91f16700Schasinglulu #endif
834*91f16700Schasinglulu 
835*91f16700Schasinglulu static void ccn_pre_init(void)
836*91f16700Schasinglulu {
837*91f16700Schasinglulu 	/*
838*91f16700Schasinglulu 	 * Set WFC bit of RN-I nodes where FS4 is connected.
839*91f16700Schasinglulu 	 * This is required inorder to wait for read/write requests
840*91f16700Schasinglulu 	 * completion acknowledgment. Otherwise FS4 Ring Manager is
841*91f16700Schasinglulu 	 * getting stale data because of re-ordering of read/write
842*91f16700Schasinglulu 	 * requests at CCN level
843*91f16700Schasinglulu 	 */
844*91f16700Schasinglulu 	mmio_setbits_32(OLY_RNI3PDVM_REGISTERS_NODE8_AUX_CTL,
845*91f16700Schasinglulu 			OLY_RNI3PDVM_REGISTERS_NODE8_AUX_CTL_WFC);
846*91f16700Schasinglulu }
847*91f16700Schasinglulu 
848*91f16700Schasinglulu static void ccn_post_init(void)
849*91f16700Schasinglulu {
850*91f16700Schasinglulu 	mmio_setbits_32(OLY_HNI_REGISTERS_NODE0_PCIERC_RNI_NODEID_LIST,
851*91f16700Schasinglulu 			SRP_RNI_PCIE_CONNECTED);
852*91f16700Schasinglulu 	mmio_setbits_32(OLY_HNI_REGISTERS_NODE0_SA_AUX_CTL,
853*91f16700Schasinglulu 			SA_AUX_CTL_SER_DEVNE_WR);
854*91f16700Schasinglulu 
855*91f16700Schasinglulu 	mmio_clrbits_32(OLY_HNI_REGISTERS_NODE0_POS_CONTROL,
856*91f16700Schasinglulu 			POS_CONTROL_HNI_POS_EN);
857*91f16700Schasinglulu 	mmio_clrbits_32(OLY_HNI_REGISTERS_NODE0_SA_AUX_CTL,
858*91f16700Schasinglulu 			SA_AUX_CTL_POS_EARLY_WR_COMP_EN);
859*91f16700Schasinglulu }
860*91f16700Schasinglulu 
861*91f16700Schasinglulu #ifndef BL31_BOOT_PRELOADED_SCP
862*91f16700Schasinglulu static void crmu_init(void)
863*91f16700Schasinglulu {
864*91f16700Schasinglulu 	/*
865*91f16700Schasinglulu 	 * Configure CRMU for using SMMU
866*91f16700Schasinglulu 	 */
867*91f16700Schasinglulu 
868*91f16700Schasinglulu 	/*Program CRMU Stream ID */
869*91f16700Schasinglulu 	mmio_write_32(CRMU_MASTER_AXI_ARUSER_CONFIG,
870*91f16700Schasinglulu 			(CRMU_STREAM_ID << CRMU_SID_SHIFT));
871*91f16700Schasinglulu 	mmio_write_32(CRMU_MASTER_AXI_AWUSER_CONFIG,
872*91f16700Schasinglulu 			(CRMU_STREAM_ID << CRMU_SID_SHIFT));
873*91f16700Schasinglulu 
874*91f16700Schasinglulu 	/* Create Identity mapping */
875*91f16700Schasinglulu 	arm_smmu_create_identity_map(DOMAIN_CRMU);
876*91f16700Schasinglulu 
877*91f16700Schasinglulu 	/* Enable Client Port for Secure Masters*/
878*91f16700Schasinglulu 	arm_smmu_enable_secure_client_port();
879*91f16700Schasinglulu }
880*91f16700Schasinglulu #endif
881*91f16700Schasinglulu 
882*91f16700Schasinglulu static void brcm_fsx_init(void)
883*91f16700Schasinglulu {
884*91f16700Schasinglulu #if defined(USE_FS4) && defined(USE_FS6)
885*91f16700Schasinglulu 	#error "USE_FS4 and USE_FS6 should not be used together"
886*91f16700Schasinglulu #endif
887*91f16700Schasinglulu 
888*91f16700Schasinglulu #ifdef USE_FS4
889*91f16700Schasinglulu 	fsx_init(eFS4_CRYPTO, FS4_CRYPTO_RING_COUNT, FS4_CRYPTO_DME_COUNT,
890*91f16700Schasinglulu 		FS4_CRYPTO_AE_COUNT, FS4_CRYPTO_START_STREAM_ID,
891*91f16700Schasinglulu 		FS4_CRYPTO_MSI_DEVICE_ID, FS4_CRYPTO_IDM_IO_CONTROL_DIRECT,
892*91f16700Schasinglulu 		FS4_CRYPTO_IDM_RESET_CONTROL, FS4_CRYPTO_BASE,
893*91f16700Schasinglulu 		FS4_CRYPTO_DME_BASE);
894*91f16700Schasinglulu 
895*91f16700Schasinglulu 	fsx_init(eFS4_RAID, FS4_RAID_RING_COUNT, FS4_RAID_DME_COUNT,
896*91f16700Schasinglulu 		FS4_RAID_AE_COUNT, FS4_RAID_START_STREAM_ID,
897*91f16700Schasinglulu 		FS4_RAID_MSI_DEVICE_ID, FS4_RAID_IDM_IO_CONTROL_DIRECT,
898*91f16700Schasinglulu 		FS4_RAID_IDM_RESET_CONTROL, FS4_RAID_BASE,
899*91f16700Schasinglulu 		FS4_RAID_DME_BASE);
900*91f16700Schasinglulu 
901*91f16700Schasinglulu 	fsx_meminit("raid",
902*91f16700Schasinglulu 		FS4_RAID_IDM_IO_CONTROL_DIRECT,
903*91f16700Schasinglulu 		FS4_RAID_IDM_IO_STATUS);
904*91f16700Schasinglulu #endif
905*91f16700Schasinglulu }
906*91f16700Schasinglulu 
907*91f16700Schasinglulu static void bcm_bl33_pass_info(void)
908*91f16700Schasinglulu {
909*91f16700Schasinglulu 	struct bl33_info *info = (struct bl33_info *)BL33_SHARED_DDR_BASE;
910*91f16700Schasinglulu 
911*91f16700Schasinglulu 	if (sizeof(*info) > BL33_SHARED_DDR_SIZE)
912*91f16700Schasinglulu 		WARN("bl33 shared area not reserved\n");
913*91f16700Schasinglulu 
914*91f16700Schasinglulu 	info->version = BL33_INFO_VERSION;
915*91f16700Schasinglulu 	info->chip.chip_id = PLAT_CHIP_ID_GET;
916*91f16700Schasinglulu 	info->chip.rev_id = PLAT_CHIP_REV_GET;
917*91f16700Schasinglulu }
918*91f16700Schasinglulu 
919*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(l2ctlr_el1, CORTEX_A72_L2CTLR_EL1)
920*91f16700Schasinglulu 
921*91f16700Schasinglulu void plat_bcm_bl31_early_platform_setup(void *from_bl2,
922*91f16700Schasinglulu 					bl_params_t *plat_params_from_bl2)
923*91f16700Schasinglulu {
924*91f16700Schasinglulu #ifdef BL31_BOOT_PRELOADED_SCP
925*91f16700Schasinglulu 	image_info_t scp_image_info;
926*91f16700Schasinglulu 
927*91f16700Schasinglulu 	scp_image_info.image_base = PRELOADED_SCP_BASE;
928*91f16700Schasinglulu 	scp_image_info.image_size = PRELOADED_SCP_SIZE;
929*91f16700Schasinglulu 	plat_bcm_bl2_plat_handle_scp_bl2(&scp_image_info);
930*91f16700Schasinglulu #endif
931*91f16700Schasinglulu 	/*
932*91f16700Schasinglulu 	 * In BL31, logs are saved to DDR and we have much larger space to
933*91f16700Schasinglulu 	 * store logs. We can now afford to save all logs >= the 'INFO' level
934*91f16700Schasinglulu 	 */
935*91f16700Schasinglulu 	bcm_elog_init((void *)BCM_ELOG_BL31_BASE, BCM_ELOG_BL31_SIZE,
936*91f16700Schasinglulu 		      LOG_LEVEL_INFO);
937*91f16700Schasinglulu 
938*91f16700Schasinglulu 	INFO("L2CTLR = 0x%lx\n", read_l2ctlr_el1());
939*91f16700Schasinglulu 
940*91f16700Schasinglulu 	brcm_timer_sync_init();
941*91f16700Schasinglulu 
942*91f16700Schasinglulu 	brcm_stingray_dma_pl330_init();
943*91f16700Schasinglulu 
944*91f16700Schasinglulu 	brcm_stingray_dma_pl330_meminit();
945*91f16700Schasinglulu 
946*91f16700Schasinglulu 	brcm_stingray_spi_pl022_init(APBS_IDM_IDM_RESET_CONTROL);
947*91f16700Schasinglulu 
948*91f16700Schasinglulu #ifdef USE_AMAC
949*91f16700Schasinglulu 	brcm_stingray_amac_init();
950*91f16700Schasinglulu #endif
951*91f16700Schasinglulu 
952*91f16700Schasinglulu 	brcm_stingray_sdio_init();
953*91f16700Schasinglulu 
954*91f16700Schasinglulu #ifdef NCSI_IO_DRIVE_STRENGTH_MA
955*91f16700Schasinglulu 	brcm_stingray_ncsi_init();
956*91f16700Schasinglulu #endif
957*91f16700Schasinglulu 
958*91f16700Schasinglulu #ifdef USE_USB
959*91f16700Schasinglulu 	xhci_phy_init();
960*91f16700Schasinglulu #endif
961*91f16700Schasinglulu 
962*91f16700Schasinglulu #ifdef USE_SATA
963*91f16700Schasinglulu 	brcm_stingray_sata_init();
964*91f16700Schasinglulu #else
965*91f16700Schasinglulu 	poweroff_sata_pll();
966*91f16700Schasinglulu #endif
967*91f16700Schasinglulu 
968*91f16700Schasinglulu 	ccn_pre_init();
969*91f16700Schasinglulu 
970*91f16700Schasinglulu 	brcm_fsx_init();
971*91f16700Schasinglulu 
972*91f16700Schasinglulu 	brcm_stingray_smmu_init();
973*91f16700Schasinglulu 
974*91f16700Schasinglulu 	brcm_stingray_pka_meminit();
975*91f16700Schasinglulu 
976*91f16700Schasinglulu 	brcm_stingray_crmu_access_init();
977*91f16700Schasinglulu 
978*91f16700Schasinglulu 	brcm_stingray_scr_init();
979*91f16700Schasinglulu 
980*91f16700Schasinglulu 	brcm_stingray_hsls_tzpcprot_init();
981*91f16700Schasinglulu 
982*91f16700Schasinglulu #ifdef USE_I2S
983*91f16700Schasinglulu 	brcm_stingray_audio_init();
984*91f16700Schasinglulu #endif
985*91f16700Schasinglulu 
986*91f16700Schasinglulu 	ccn_post_init();
987*91f16700Schasinglulu 
988*91f16700Schasinglulu 	paxb_init();
989*91f16700Schasinglulu 
990*91f16700Schasinglulu 	paxc_init();
991*91f16700Schasinglulu 
992*91f16700Schasinglulu #ifndef BL31_BOOT_PRELOADED_SCP
993*91f16700Schasinglulu 	crmu_init();
994*91f16700Schasinglulu #endif
995*91f16700Schasinglulu 
996*91f16700Schasinglulu 	/* Note: this should be last thing because
997*91f16700Schasinglulu 	 * FS4 GPV registers only work after FS4 block
998*91f16700Schasinglulu 	 * (i.e. crypto,raid,cop) is out of reset.
999*91f16700Schasinglulu 	 */
1000*91f16700Schasinglulu 	brcm_stingray_security_init();
1001*91f16700Schasinglulu 
1002*91f16700Schasinglulu 	brcm_gpio_pad_ns_init();
1003*91f16700Schasinglulu 
1004*91f16700Schasinglulu #ifndef USE_DDR
1005*91f16700Schasinglulu 	brcm_stingray_sram_ns_init();
1006*91f16700Schasinglulu #endif
1007*91f16700Schasinglulu 
1008*91f16700Schasinglulu #ifdef BL31_FORCE_CPU_FULL_FREQ
1009*91f16700Schasinglulu 	bcm_set_ihost_pll_freq(0x0, PLL_FREQ_FULL);
1010*91f16700Schasinglulu #endif
1011*91f16700Schasinglulu 
1012*91f16700Schasinglulu 	brcm_stingray_gain_qspi_control();
1013*91f16700Schasinglulu 
1014*91f16700Schasinglulu #ifdef USE_PAXC
1015*91f16700Schasinglulu 	/*
1016*91f16700Schasinglulu 	 * Check that the handshake has occurred and report ChiMP status.
1017*91f16700Schasinglulu 	 * This is required. Otherwise (especially on Palladium)
1018*91f16700Schasinglulu 	 * Linux might have booted to the pcie stage whereas
1019*91f16700Schasinglulu 	 * ChiMP has not yet booted. Note that nic_mode case has already
1020*91f16700Schasinglulu 	 * been considered above.
1021*91f16700Schasinglulu 	 */
1022*91f16700Schasinglulu 	if ((boot_source_get() != BOOT_SOURCE_QSPI) &&
1023*91f16700Schasinglulu 	    (!bcm_chimp_is_nic_mode()) &&
1024*91f16700Schasinglulu 	    (!bcm_chimp_wait_handshake())
1025*91f16700Schasinglulu 	   ) {
1026*91f16700Schasinglulu 		/* Does ChiMP report an error ? */
1027*91f16700Schasinglulu 		uint32_t err;
1028*91f16700Schasinglulu 
1029*91f16700Schasinglulu 		err = bcm_chimp_read_ctrl(CHIMP_REG_CTRL_BPE_STAT_REG);
1030*91f16700Schasinglulu 		if ((err & CHIMP_ERROR_MASK) == 0)
1031*91f16700Schasinglulu 		/* ChiMP has not booted yet, but no error reported */
1032*91f16700Schasinglulu 			WARN("ChiMP not booted yet, but no error reported.\n");
1033*91f16700Schasinglulu 	}
1034*91f16700Schasinglulu 
1035*91f16700Schasinglulu #if DEBUG
1036*91f16700Schasinglulu 	if (boot_source_get() != BOOT_SOURCE_QSPI)
1037*91f16700Schasinglulu 		INFO("Current ChiMP Status: 0x%x; bpe_mod reg: 0x%x\n"
1038*91f16700Schasinglulu 		     "fastboot register: 0x%x; handshake register 0x%x\n",
1039*91f16700Schasinglulu 		     bcm_chimp_read_ctrl(CHIMP_REG_CTRL_BPE_STAT_REG),
1040*91f16700Schasinglulu 		     bcm_chimp_read_ctrl(CHIMP_REG_CTRL_BPE_MODE_REG),
1041*91f16700Schasinglulu 		     bcm_chimp_read_ctrl(CHIMP_REG_CTRL_FSTBOOT_PTR_REG),
1042*91f16700Schasinglulu 		     bcm_chimp_read(CHIMP_REG_ECO_RESERVED));
1043*91f16700Schasinglulu #endif /* DEBUG */
1044*91f16700Schasinglulu #endif
1045*91f16700Schasinglulu 
1046*91f16700Schasinglulu #ifdef FS4_DISABLE_CLOCK
1047*91f16700Schasinglulu 	flush_dcache_range(
1048*91f16700Schasinglulu 		PLAT_BRCM_TRUSTED_SRAM_BASE,
1049*91f16700Schasinglulu 		PLAT_BRCM_TRUSTED_SRAM_SIZE);
1050*91f16700Schasinglulu 	fs4_disable_clocks(true, true, true);
1051*91f16700Schasinglulu #endif
1052*91f16700Schasinglulu 
1053*91f16700Schasinglulu 	/* pass information to BL33 through shared DDR region */
1054*91f16700Schasinglulu 	bcm_bl33_pass_info();
1055*91f16700Schasinglulu 
1056*91f16700Schasinglulu 	/*
1057*91f16700Schasinglulu 	 * We are not yet at the end of BL31, but we can stop log here so we do
1058*91f16700Schasinglulu 	 * not need to add 'bcm_elog_exit' to the standard BL31 code. The
1059*91f16700Schasinglulu 	 * benefit of capturing BL31 logs after this is very minimal in a
1060*91f16700Schasinglulu 	 * production system
1061*91f16700Schasinglulu 	 */
1062*91f16700Schasinglulu 	bcm_elog_exit();
1063*91f16700Schasinglulu 
1064*91f16700Schasinglulu #if !BRCM_DISABLE_TRUSTED_WDOG
1065*91f16700Schasinglulu 	/*
1066*91f16700Schasinglulu 	 * Secure watchdog was started earlier in BL2, now it's time to stop
1067*91f16700Schasinglulu 	 * it
1068*91f16700Schasinglulu 	 */
1069*91f16700Schasinglulu 	sp805_stop(ARM_SP805_TWDG_BASE);
1070*91f16700Schasinglulu #endif
1071*91f16700Schasinglulu }
1072