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