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