13942d3a8SSheetal Tigadoli /* 23942d3a8SSheetal Tigadoli * Copyright (c) 2015 - 2020, Broadcom 33942d3a8SSheetal Tigadoli * 43942d3a8SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause 53942d3a8SSheetal Tigadoli */ 63942d3a8SSheetal Tigadoli 73942d3a8SSheetal Tigadoli #include <errno.h> 83942d3a8SSheetal Tigadoli 93942d3a8SSheetal Tigadoli #include <common/bl_common.h> 103942d3a8SSheetal Tigadoli #include <common/debug.h> 113942d3a8SSheetal Tigadoli #include <cortex_a72.h> 123942d3a8SSheetal Tigadoli #include <drivers/arm/sp805.h> 133942d3a8SSheetal Tigadoli #include <drivers/console.h> 143942d3a8SSheetal Tigadoli #include <drivers/delay_timer.h> 153942d3a8SSheetal Tigadoli #include <drivers/ti/uart/uart_16550.h> 163942d3a8SSheetal Tigadoli #include <lib/mmio.h> 173942d3a8SSheetal Tigadoli #include <lib/utils_def.h> 183942d3a8SSheetal Tigadoli #include <plat/common/common_def.h> 193942d3a8SSheetal Tigadoli #include <plat/common/platform.h> 203942d3a8SSheetal Tigadoli 213942d3a8SSheetal Tigadoli #include <bl33_info.h> 223942d3a8SSheetal Tigadoli #include <chimp.h> 233942d3a8SSheetal Tigadoli #include <cmn_plat_util.h> 243942d3a8SSheetal Tigadoli #include <dmu.h> 253942d3a8SSheetal Tigadoli #include <fsx.h> 263942d3a8SSheetal Tigadoli #include <iommu.h> 273942d3a8SSheetal Tigadoli #include <ncsi.h> 283942d3a8SSheetal Tigadoli #include <paxb.h> 293942d3a8SSheetal Tigadoli #include <paxc.h> 303942d3a8SSheetal Tigadoli #include <platform_def.h> 313942d3a8SSheetal Tigadoli #include <sdio.h> 323942d3a8SSheetal Tigadoli #include <sr_utils.h> 333942d3a8SSheetal Tigadoli #include <timer_sync.h> 343942d3a8SSheetal Tigadoli 353942d3a8SSheetal Tigadoli /******************************************************************************* 363942d3a8SSheetal Tigadoli * Perform any BL3-1 platform setup common to ARM standard platforms 373942d3a8SSheetal Tigadoli ******************************************************************************/ 383942d3a8SSheetal Tigadoli 393942d3a8SSheetal Tigadoli static void brcm_stingray_gain_qspi_control(void) 403942d3a8SSheetal Tigadoli { 413942d3a8SSheetal Tigadoli if (boot_source_get() != BOOT_SOURCE_QSPI) { 423942d3a8SSheetal Tigadoli if (bcm_chimp_is_nic_mode() && 433942d3a8SSheetal Tigadoli (!bcm_chimp_handshake_done())) { 443942d3a8SSheetal Tigadoli /* 453942d3a8SSheetal Tigadoli * Last chance to wait for ChiMP firmware to report 463942d3a8SSheetal Tigadoli * "I am done" before grabbing the QSPI 473942d3a8SSheetal Tigadoli */ 483942d3a8SSheetal Tigadoli WARN("ChiMP still not booted\n"); 493942d3a8SSheetal Tigadoli #ifndef CHIMP_ALWAYS_NEEDS_QSPI 503942d3a8SSheetal Tigadoli WARN("ChiMP is given the last chance to boot (%d s)\n", 513942d3a8SSheetal Tigadoli CHIMP_HANDSHAKE_TIMEOUT_MS / 1000); 523942d3a8SSheetal Tigadoli 533942d3a8SSheetal Tigadoli if (!bcm_chimp_wait_handshake()) { 543942d3a8SSheetal Tigadoli ERROR("ChiMP failed to boot\n"); 553942d3a8SSheetal Tigadoli } else { 563942d3a8SSheetal Tigadoli INFO("ChiMP booted successfully\n"); 573942d3a8SSheetal Tigadoli } 583942d3a8SSheetal Tigadoli #endif 593942d3a8SSheetal Tigadoli } 603942d3a8SSheetal Tigadoli 613942d3a8SSheetal Tigadoli #ifndef CHIMP_ALWAYS_NEEDS_QSPI 623942d3a8SSheetal Tigadoli INFO("AP grabs QSPI\n"); 633942d3a8SSheetal Tigadoli /* 643942d3a8SSheetal Tigadoli * For QSPI boot sbl/bl1 has already taken care. 653942d3a8SSheetal Tigadoli * For other boot sources QSPI needs to be muxed to 663942d3a8SSheetal Tigadoli * AP for exclusive use 673942d3a8SSheetal Tigadoli */ 683942d3a8SSheetal Tigadoli brcm_stingray_set_qspi_mux(1); 693942d3a8SSheetal Tigadoli INFO("AP (bl31) gained control over QSPI\n"); 703942d3a8SSheetal Tigadoli #endif 713942d3a8SSheetal Tigadoli } 723942d3a8SSheetal Tigadoli } 733942d3a8SSheetal Tigadoli 743942d3a8SSheetal Tigadoli static void brcm_stingray_dma_pl330_init(void) 753942d3a8SSheetal Tigadoli { 763942d3a8SSheetal Tigadoli unsigned int val; 773942d3a8SSheetal Tigadoli 783942d3a8SSheetal Tigadoli VERBOSE("dma pl330 init start\n"); 793942d3a8SSheetal Tigadoli 803942d3a8SSheetal Tigadoli /* Set DMAC boot_manager_ns = 0x1 */ 813942d3a8SSheetal Tigadoli VERBOSE(" - configure boot security state\n"); 823942d3a8SSheetal Tigadoli mmio_setbits_32(DMAC_M0_IDM_IO_CONTROL_DIRECT, BOOT_MANAGER_NS); 833942d3a8SSheetal Tigadoli /* Set boot_peripheral_ns[n:0] = 0xffffffff */ 843942d3a8SSheetal Tigadoli mmio_write_32(ICFG_DMAC_CONFIG_2, BOOT_PERIPHERAL_NS); 853942d3a8SSheetal Tigadoli /* Set boot_irq_ns[n:0] = 0x0000ffff */ 863942d3a8SSheetal Tigadoli mmio_write_32(ICFG_DMAC_CONFIG_3, BOOT_IRQ_NS); 873942d3a8SSheetal Tigadoli 883942d3a8SSheetal Tigadoli /* Set DMAC stream_id */ 893942d3a8SSheetal Tigadoli VERBOSE(" - configure stream_id = 0x6000\n"); 903942d3a8SSheetal Tigadoli val = (DMAC_STREAM_ID << DMAC_SID_SHIFT); 913942d3a8SSheetal Tigadoli mmio_write_32(ICFG_DMAC_SID_ARADDR_CONTROL, val); 923942d3a8SSheetal Tigadoli mmio_write_32(ICFG_DMAC_SID_AWADDR_CONTROL, val); 933942d3a8SSheetal Tigadoli 943942d3a8SSheetal Tigadoli /* Reset DMAC */ 953942d3a8SSheetal Tigadoli VERBOSE(" - reset dma pl330\n"); 963942d3a8SSheetal Tigadoli 973942d3a8SSheetal Tigadoli mmio_setbits_32(DMAC_M0_IDM_RESET_CONTROL, 0x1); 983942d3a8SSheetal Tigadoli udelay(500); 993942d3a8SSheetal Tigadoli 1003942d3a8SSheetal Tigadoli mmio_clrbits_32(DMAC_M0_IDM_RESET_CONTROL, 0x1); 1013942d3a8SSheetal Tigadoli udelay(500); 1023942d3a8SSheetal Tigadoli 1033942d3a8SSheetal Tigadoli INFO("dma pl330 init done\n"); 1043942d3a8SSheetal Tigadoli } 1053942d3a8SSheetal Tigadoli 1063942d3a8SSheetal Tigadoli static void brcm_stingray_spi_pl022_init(uintptr_t idm_reset_control) 1073942d3a8SSheetal Tigadoli { 1083942d3a8SSheetal Tigadoli VERBOSE("spi pl022 init start\n"); 1093942d3a8SSheetal Tigadoli 1103942d3a8SSheetal Tigadoli /* Reset APB SPI bridge */ 1113942d3a8SSheetal Tigadoli VERBOSE(" - reset apb spi bridge\n"); 1123942d3a8SSheetal Tigadoli mmio_setbits_32(idm_reset_control, 0x1); 1133942d3a8SSheetal Tigadoli udelay(500); 1143942d3a8SSheetal Tigadoli 1153942d3a8SSheetal Tigadoli mmio_clrbits_32(idm_reset_control, 0x1); 1163942d3a8SSheetal Tigadoli udelay(500); 1173942d3a8SSheetal Tigadoli 1183942d3a8SSheetal Tigadoli INFO("spi pl022 init done\n"); 1193942d3a8SSheetal Tigadoli } 1203942d3a8SSheetal Tigadoli 1213942d3a8SSheetal Tigadoli #define CDRU_SATA_RESET_N \ 1223942d3a8SSheetal Tigadoli BIT(CDRU_MISC_RESET_CONTROL__CDRU_SATA_RESET_N_R) 1233942d3a8SSheetal Tigadoli #define CDRU_MISC_CLK_SATA \ 1243942d3a8SSheetal Tigadoli BIT(CDRU_MISC_CLK_ENABLE_CONTROL__CDRU_SATA_CLK_EN_R) 1253942d3a8SSheetal Tigadoli #define CCN_CONFIG_CLK_ENABLE (1 << 2) 1263942d3a8SSheetal Tigadoli #define MMU_CONFIG_CLK_ENABLE (0x3F << 16) 1273942d3a8SSheetal Tigadoli 1283942d3a8SSheetal Tigadoli #define SATA_SATA_TOP_CTRL_BUS_CTRL (SATA_BASE + 0x2044) 1293942d3a8SSheetal Tigadoli #define DMA_BIT_CTRL_MASK 0x003 1303942d3a8SSheetal Tigadoli #define DMA_DESCR_ENDIAN_CTRL (DMA_BIT_CTRL_MASK << 0x002) 1313942d3a8SSheetal Tigadoli #define DMA_DATA_ENDIAN_CTRL (DMA_BIT_CTRL_MASK << 0x004) 1323942d3a8SSheetal Tigadoli 1333942d3a8SSheetal Tigadoli #define SATA_PORT_SATA3_PCB_REG8 (SATA_BASE + 0x2320) 1343942d3a8SSheetal Tigadoli #define SATA_PORT_SATA3_PCB_REG11 (SATA_BASE + 0x232c) 1353942d3a8SSheetal Tigadoli #define SATA_PORT_SATA3_PCB_BLOCK_ADDR (SATA_BASE + 0x233c) 1363942d3a8SSheetal Tigadoli 1373942d3a8SSheetal Tigadoli #define SATA3_AFE_TXRX_ACTRL 0x1d0 1383942d3a8SSheetal Tigadoli /* TXDriver swing setting is 800mV */ 1393942d3a8SSheetal Tigadoli #define DFS_SWINGNOPE_VALUE (0x0 << 6) 1403942d3a8SSheetal Tigadoli #define DFS_SWINGNOPE_MASK (0x3 << 6) 1413942d3a8SSheetal Tigadoli 1423942d3a8SSheetal Tigadoli #define DFS_SWINGPE_VALUE (0x1 << 4) 1433942d3a8SSheetal Tigadoli #define DFS_SWINGPE_MASK (0x3 << 4) 1443942d3a8SSheetal Tigadoli 1453942d3a8SSheetal Tigadoli #define DFS_INJSTRENGTH_VALUE (0x0 << 4) 1463942d3a8SSheetal Tigadoli #define DFS_INJSTRENGTH_MASK (0x3 << 4) 1473942d3a8SSheetal Tigadoli 1483942d3a8SSheetal Tigadoli #define DFS_INJEN (0x1 << 3) 1493942d3a8SSheetal Tigadoli 1503942d3a8SSheetal Tigadoli #define SATA_CORE_MEM_CTRL (SATA_BASE + 0x3a08) 1513942d3a8SSheetal Tigadoli #define SATA_CORE_MEM_CTRL_ISO BIT(0) 1523942d3a8SSheetal Tigadoli #define SATA_CORE_MEM_CTRL_ARRPOWEROKIN BIT(1) 1533942d3a8SSheetal Tigadoli #define SATA_CORE_MEM_CTRL_ARRPOWERONIN BIT(2) 1543942d3a8SSheetal Tigadoli #define SATA_CORE_MEM_CTRL_POWEROKIN BIT(3) 1553942d3a8SSheetal Tigadoli #define SATA_CORE_MEM_CTRL_POWERONIN BIT(4) 1563942d3a8SSheetal Tigadoli 1573942d3a8SSheetal Tigadoli #define SATA0_IDM_RESET_CONTROL (SATA_BASE + 0x500800) 1583942d3a8SSheetal Tigadoli #define SATA_APBT0_IDM_IO_CONTROL_DIRECT (SATA_BASE + 0x51a408) 1593942d3a8SSheetal Tigadoli #define IO_CONTROL_DIRECT_CLK_ENABLE BIT(0) 1603942d3a8SSheetal Tigadoli #define SATA_APBT0_IDM_RESET_CONTROL (SATA_BASE + 0x51a800) 1613942d3a8SSheetal Tigadoli #define IDM_RESET_CONTROL_RESET BIT(0) 1623942d3a8SSheetal Tigadoli 1633942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY1 0x6830000c 1643942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY1_FIELD 0xf 1653942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY2 0x68300010 1663942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY2_FIELD 0xf 1673942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY3 0x68300014 1683942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY3_FIELD 0x1 1693942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY4 0x68300018 1703942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY4_FIELD 0x1 1713942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY5 0x6830001c 1723942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY5_FIELD 0xf 1733942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY6 0x68300020 1743942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY6_FIELD 0x1 1753942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY7 0x68300024 1763942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY7_FIELD 0xf 1773942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY8 0x68300028 1783942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY8_FIELD 0xf 1793942d3a8SSheetal Tigadoli #define NIC400_SATA_NOC_SECURITY9 0x6830002c 1803942d3a8SSheetal Tigadoli #define SATA_NOC_SECURITY9_FIELD 0x1 1813942d3a8SSheetal Tigadoli 1823942d3a8SSheetal Tigadoli #define SATA_APBT_IDM_PORT_REG(port, reg) \ 1833942d3a8SSheetal Tigadoli (((port/4) << 12) + reg) 1843942d3a8SSheetal Tigadoli 1853942d3a8SSheetal Tigadoli #define SATA_IDM_PORT_REG(port, reg) ((port << 12) + reg) 1863942d3a8SSheetal Tigadoli 1873942d3a8SSheetal Tigadoli #define SATA_PORT_REG(port, reg) \ 1883942d3a8SSheetal Tigadoli (((port%4) << 16) + ((port/4) << 20) + reg) 1893942d3a8SSheetal Tigadoli 1903942d3a8SSheetal Tigadoli #define MAX_SATA_PORTS 8 1913942d3a8SSheetal Tigadoli #define USE_SATA_PORTS 8 1923942d3a8SSheetal Tigadoli 1933942d3a8SSheetal Tigadoli #ifdef USE_SATA 1943942d3a8SSheetal Tigadoli static const uint8_t sr_b0_sata_port[MAX_SATA_PORTS] = { 1953942d3a8SSheetal Tigadoli 0, 1, 2, 3, 4, 5, 6, 7 1963942d3a8SSheetal Tigadoli }; 1973942d3a8SSheetal Tigadoli 1983942d3a8SSheetal Tigadoli static uint32_t brcm_stingray_get_sata_port(unsigned int port) 1993942d3a8SSheetal Tigadoli { 2003942d3a8SSheetal Tigadoli return sr_b0_sata_port[port]; 2013942d3a8SSheetal Tigadoli } 2023942d3a8SSheetal Tigadoli 2033942d3a8SSheetal Tigadoli static void brcm_stingray_sata_init(void) 2043942d3a8SSheetal Tigadoli { 2053942d3a8SSheetal Tigadoli unsigned int port = 0; 2063942d3a8SSheetal Tigadoli uint32_t sata_port; 2073942d3a8SSheetal Tigadoli 2083942d3a8SSheetal Tigadoli mmio_setbits_32(CDRU_MISC_CLK_ENABLE_CONTROL, 2093942d3a8SSheetal Tigadoli CDRU_MISC_CLK_SATA); 2103942d3a8SSheetal Tigadoli 2113942d3a8SSheetal Tigadoli mmio_clrbits_32(CDRU_MISC_RESET_CONTROL, CDRU_SATA_RESET_N); 2123942d3a8SSheetal Tigadoli mmio_setbits_32(CDRU_MISC_RESET_CONTROL, CDRU_SATA_RESET_N); 2133942d3a8SSheetal Tigadoli 2143942d3a8SSheetal Tigadoli for (port = 0; port < USE_SATA_PORTS; port++) { 2153942d3a8SSheetal Tigadoli 2163942d3a8SSheetal Tigadoli sata_port = brcm_stingray_get_sata_port(port); 2173942d3a8SSheetal Tigadoli mmio_write_32(SATA_APBT_IDM_PORT_REG(sata_port, 2183942d3a8SSheetal Tigadoli SATA_APBT0_IDM_RESET_CONTROL), 2193942d3a8SSheetal Tigadoli 0x0); 2203942d3a8SSheetal Tigadoli mmio_setbits_32(SATA_APBT_IDM_PORT_REG(sata_port, 2213942d3a8SSheetal Tigadoli SATA_APBT0_IDM_IO_CONTROL_DIRECT), 2223942d3a8SSheetal Tigadoli IO_CONTROL_DIRECT_CLK_ENABLE); 2233942d3a8SSheetal Tigadoli mmio_write_32(SATA_IDM_PORT_REG(sata_port, 2243942d3a8SSheetal Tigadoli SATA0_IDM_RESET_CONTROL), 2253942d3a8SSheetal Tigadoli 0x0); 2263942d3a8SSheetal Tigadoli 2273942d3a8SSheetal Tigadoli mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL), 2283942d3a8SSheetal Tigadoli SATA_CORE_MEM_CTRL_ARRPOWERONIN); 2293942d3a8SSheetal Tigadoli mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL), 2303942d3a8SSheetal Tigadoli SATA_CORE_MEM_CTRL_ARRPOWEROKIN); 2313942d3a8SSheetal Tigadoli mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL), 2323942d3a8SSheetal Tigadoli SATA_CORE_MEM_CTRL_POWERONIN); 2333942d3a8SSheetal Tigadoli mmio_setbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL), 2343942d3a8SSheetal Tigadoli SATA_CORE_MEM_CTRL_POWEROKIN); 2353942d3a8SSheetal Tigadoli mmio_clrbits_32(SATA_PORT_REG(sata_port, SATA_CORE_MEM_CTRL), 2363942d3a8SSheetal Tigadoli SATA_CORE_MEM_CTRL_ISO); 2373942d3a8SSheetal Tigadoli 2383942d3a8SSheetal Tigadoli mmio_clrbits_32(SATA_PORT_REG(sata_port, 2393942d3a8SSheetal Tigadoli SATA_SATA_TOP_CTRL_BUS_CTRL), 2403942d3a8SSheetal Tigadoli (DMA_DESCR_ENDIAN_CTRL | DMA_DATA_ENDIAN_CTRL)); 2413942d3a8SSheetal Tigadoli } 2423942d3a8SSheetal Tigadoli 2433942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY1, SATA_NOC_SECURITY1_FIELD); 2443942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY2, SATA_NOC_SECURITY2_FIELD); 2453942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY3, SATA_NOC_SECURITY3_FIELD); 2463942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY4, SATA_NOC_SECURITY4_FIELD); 2473942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY5, SATA_NOC_SECURITY5_FIELD); 2483942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY6, SATA_NOC_SECURITY6_FIELD); 2493942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY7, SATA_NOC_SECURITY7_FIELD); 2503942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY8, SATA_NOC_SECURITY8_FIELD); 2513942d3a8SSheetal Tigadoli mmio_setbits_32(NIC400_SATA_NOC_SECURITY9, SATA_NOC_SECURITY9_FIELD); 2523942d3a8SSheetal Tigadoli 2533942d3a8SSheetal Tigadoli INFO("sata init done\n"); 2543942d3a8SSheetal Tigadoli } 2553942d3a8SSheetal Tigadoli #else 2563942d3a8SSheetal Tigadoli static void poweroff_sata_pll(void) 2573942d3a8SSheetal Tigadoli { 2583942d3a8SSheetal Tigadoli /* 2593942d3a8SSheetal Tigadoli * SATA subsystem is clocked by LCPLL0 which is enabled by 2603942d3a8SSheetal Tigadoli * default by bootrom. Poweroff the PLL if SATA is not used 2613942d3a8SSheetal Tigadoli */ 2623942d3a8SSheetal Tigadoli 2633942d3a8SSheetal Tigadoli /* enable isolation */ 2643942d3a8SSheetal Tigadoli mmio_setbits_32(CRMU_AON_CTRL1, 2653942d3a8SSheetal Tigadoli BIT(CRMU_AON_CTRL1__LCPLL0_ISO_IN)); 2663942d3a8SSheetal Tigadoli 2673942d3a8SSheetal Tigadoli /* Power off the SATA PLL/LDO */ 2683942d3a8SSheetal Tigadoli mmio_clrbits_32(CRMU_AON_CTRL1, 2693942d3a8SSheetal Tigadoli (BIT(CRMU_AON_CTRL1__LCPLL0_PWRON_LDO) | 2703942d3a8SSheetal Tigadoli BIT(CRMU_AON_CTRL1__LCPLL0_PWR_ON))); 2713942d3a8SSheetal Tigadoli } 2723942d3a8SSheetal Tigadoli #endif 2733942d3a8SSheetal Tigadoli 2743942d3a8SSheetal Tigadoli #ifdef USE_AMAC 2753942d3a8SSheetal Tigadoli #ifdef EMULATION_SETUP 2763942d3a8SSheetal Tigadoli #define ICFG_AMAC_STRAP_CONFIG (HSLS_ICFG_REGS_BASE + 0xa5c) 2773942d3a8SSheetal Tigadoli #define ICFG_AMAC_STRAP_DLL_BYPASS (1 << 2) 2783942d3a8SSheetal Tigadoli #endif 2793942d3a8SSheetal Tigadoli #define ICFG_AMAC_MAC_CTRL_REG (HSLS_ICFG_REGS_BASE + 0xa6c) 2803942d3a8SSheetal Tigadoli #define ICFG_AMAC_MAC_FULL_DUPLEX (1 << 1) 2813942d3a8SSheetal Tigadoli #define ICFG_AMAC_RGMII_PHY_CONFIG (HSLS_ICFG_REGS_BASE + 0xa60) 2823942d3a8SSheetal Tigadoli #define ICFG_AMAC_SID_CONTROL (HSLS_ICFG_REGS_BASE + 0xb10) 2833942d3a8SSheetal Tigadoli #define ICFG_AMAC_SID_SHIFT 5 2843942d3a8SSheetal Tigadoli #define ICFG_AMAC_SID_AWADDR_OFFSET 0x0 2853942d3a8SSheetal Tigadoli #define ICFG_AMAC_SID_ARADDR_OFFSET 0x4 2863942d3a8SSheetal Tigadoli #define AMAC_RPHY_1000_DATARATE (1 << 20) 2873942d3a8SSheetal Tigadoli #define AMAC_RPHY_FULL_DUPLEX (1 << 5) 2883942d3a8SSheetal Tigadoli #define AMAC_RPHY_SPEED_OFFSET 2 2893942d3a8SSheetal Tigadoli #define AMAC_RPHY_SPEED_MASK (7 << AMAC_RPHY_SPEED_OFFSET) 2903942d3a8SSheetal Tigadoli #define AMAC_RPHY_1G_SPEED (2 << AMAC_RPHY_SPEED_OFFSET) 2913942d3a8SSheetal Tigadoli #define ICFG_AMAC_MEM_PWR_CTRL (HSLS_ICFG_REGS_BASE + 0xa68) 2923942d3a8SSheetal Tigadoli #define AMAC_ISO BIT(9) 2933942d3a8SSheetal Tigadoli #define AMAC_STDBY BIT(8) 2943942d3a8SSheetal Tigadoli #define AMAC_ARRPOWEROKIN BIT(7) 2953942d3a8SSheetal Tigadoli #define AMAC_ARRPOWERONIN BIT(6) 2963942d3a8SSheetal Tigadoli #define AMAC_POWEROKIN BIT(5) 2973942d3a8SSheetal Tigadoli #define AMAC_POWERONIN BIT(4) 2983942d3a8SSheetal Tigadoli 2993942d3a8SSheetal Tigadoli #define AMAC_IDM0_IO_CONTROL_DIRECT (HSLS_IDM_REGS_BASE + 0x4408) 3003942d3a8SSheetal Tigadoli #define AMAC_IDM0_ARCACHE_OFFSET 16 3013942d3a8SSheetal Tigadoli #define AMAC_IDM0_AWCACHE_OFFSET 7 3023942d3a8SSheetal Tigadoli #define AMAC_IDM0_ARCACHE_MASK (0xF << AMAC_IDM0_ARCACHE_OFFSET) 3033942d3a8SSheetal Tigadoli #define AMAC_IDM0_AWCACHE_MASK (0xF << AMAC_IDM0_AWCACHE_OFFSET) 3043942d3a8SSheetal Tigadoli /* ARCACHE - AWCACHE is 0xB7 for write-back no allocate */ 3053942d3a8SSheetal Tigadoli #define AMAC_IDM0_ARCACHE_VAL (0xb << AMAC_IDM0_ARCACHE_OFFSET) 3063942d3a8SSheetal Tigadoli #define AMAC_IDM0_AWCACHE_VAL (0x7 << AMAC_IDM0_AWCACHE_OFFSET) 3073942d3a8SSheetal Tigadoli 3083942d3a8SSheetal Tigadoli static void brcm_stingray_amac_init(void) 3093942d3a8SSheetal Tigadoli { 3103942d3a8SSheetal Tigadoli unsigned int val; 3113942d3a8SSheetal Tigadoli uintptr_t icfg_amac_sid = ICFG_AMAC_SID_CONTROL; 3123942d3a8SSheetal Tigadoli 3133942d3a8SSheetal Tigadoli VERBOSE("amac init start\n"); 3143942d3a8SSheetal Tigadoli 3153942d3a8SSheetal Tigadoli val = SR_SID_VAL(0x3, 0x0, 0x4) << ICFG_AMAC_SID_SHIFT; 3163942d3a8SSheetal Tigadoli mmio_write_32(icfg_amac_sid + ICFG_AMAC_SID_AWADDR_OFFSET, val); 3173942d3a8SSheetal Tigadoli mmio_write_32(icfg_amac_sid + ICFG_AMAC_SID_ARADDR_OFFSET, val); 3183942d3a8SSheetal Tigadoli 3193942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_ARRPOWEROKIN); 3203942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_ARRPOWERONIN); 3213942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_POWEROKIN); 3223942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_POWERONIN); 3233942d3a8SSheetal Tigadoli mmio_clrbits_32(ICFG_AMAC_MEM_PWR_CTRL, AMAC_ISO); 3243942d3a8SSheetal Tigadoli mmio_write_32(APBR_IDM_RESET_CONTROL, 0x0); 3253942d3a8SSheetal Tigadoli mmio_clrsetbits_32(ICFG_AMAC_RGMII_PHY_CONFIG, AMAC_RPHY_SPEED_MASK, 3263942d3a8SSheetal Tigadoli AMAC_RPHY_1G_SPEED); /*1 Gbps line rate*/ 3273942d3a8SSheetal Tigadoli /* 1000 datarate set */ 3283942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_RGMII_PHY_CONFIG, AMAC_RPHY_1000_DATARATE); 3293942d3a8SSheetal Tigadoli /* full duplex */ 3303942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_RGMII_PHY_CONFIG, AMAC_RPHY_FULL_DUPLEX); 3313942d3a8SSheetal Tigadoli #ifdef EMULATION_SETUP 3323942d3a8SSheetal Tigadoli /* DLL bypass */ 3333942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_STRAP_CONFIG, ICFG_AMAC_STRAP_DLL_BYPASS); 3343942d3a8SSheetal Tigadoli #endif 3353942d3a8SSheetal Tigadoli /* serdes full duplex */ 3363942d3a8SSheetal Tigadoli mmio_setbits_32(ICFG_AMAC_MAC_CTRL_REG, ICFG_AMAC_MAC_FULL_DUPLEX); 3373942d3a8SSheetal Tigadoli mmio_clrsetbits_32(AMAC_IDM0_IO_CONTROL_DIRECT, AMAC_IDM0_ARCACHE_MASK, 3383942d3a8SSheetal Tigadoli AMAC_IDM0_ARCACHE_VAL); 3393942d3a8SSheetal Tigadoli mmio_clrsetbits_32(AMAC_IDM0_IO_CONTROL_DIRECT, AMAC_IDM0_AWCACHE_MASK, 3403942d3a8SSheetal Tigadoli AMAC_IDM0_AWCACHE_VAL); 3413942d3a8SSheetal Tigadoli INFO("amac init done\n"); 3423942d3a8SSheetal Tigadoli } 3433942d3a8SSheetal Tigadoli #endif /* USE_AMAC */ 3443942d3a8SSheetal Tigadoli 3453942d3a8SSheetal Tigadoli static void brcm_stingray_pka_meminit(void) 3463942d3a8SSheetal Tigadoli { 3473942d3a8SSheetal Tigadoli uintptr_t icfg_mem_ctrl = ICFG_PKA_MEM_PWR_CTRL; 3483942d3a8SSheetal Tigadoli 3493942d3a8SSheetal Tigadoli VERBOSE("pka meminit start\n"); 3503942d3a8SSheetal Tigadoli 3513942d3a8SSheetal Tigadoli VERBOSE(" - arrpoweron\n"); 3523942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 3533942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__ARRPOWERONIN); 3543942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 3553942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__ARRPOWERONOUT)) 3563942d3a8SSheetal Tigadoli ; 3573942d3a8SSheetal Tigadoli 3583942d3a8SSheetal Tigadoli VERBOSE(" - arrpowerok\n"); 3593942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 3603942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__ARRPOWEROKIN); 3613942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 3623942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__ARRPOWEROKOUT)) 3633942d3a8SSheetal Tigadoli ; 3643942d3a8SSheetal Tigadoli 3653942d3a8SSheetal Tigadoli VERBOSE(" - poweron\n"); 3663942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 3673942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__POWERONIN); 3683942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 3693942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__POWERONOUT)) 3703942d3a8SSheetal Tigadoli ; 3713942d3a8SSheetal Tigadoli 3723942d3a8SSheetal Tigadoli VERBOSE(" - powerok\n"); 3733942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 3743942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__POWEROKIN); 3753942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 3763942d3a8SSheetal Tigadoli ICFG_PKA_MEM_PWR_CTRL__POWEROKOUT)) 3773942d3a8SSheetal Tigadoli ; 3783942d3a8SSheetal Tigadoli 3793942d3a8SSheetal Tigadoli /* Wait sometime */ 3803942d3a8SSheetal Tigadoli mdelay(1); 3813942d3a8SSheetal Tigadoli 3823942d3a8SSheetal Tigadoli VERBOSE(" - remove isolation\n"); 3833942d3a8SSheetal Tigadoli mmio_clrbits_32(icfg_mem_ctrl, ICFG_PKA_MEM_PWR_CTRL__ISO); 3843942d3a8SSheetal Tigadoli 3853942d3a8SSheetal Tigadoli INFO("pka meminit done\n"); 3863942d3a8SSheetal Tigadoli } 3873942d3a8SSheetal Tigadoli 3883942d3a8SSheetal Tigadoli static void brcm_stingray_smmu_init(void) 3893942d3a8SSheetal Tigadoli { 3903942d3a8SSheetal Tigadoli unsigned int val; 3913942d3a8SSheetal Tigadoli uintptr_t smmu_base = SMMU_BASE; 3923942d3a8SSheetal Tigadoli 3933942d3a8SSheetal Tigadoli VERBOSE("smmu init start\n"); 3943942d3a8SSheetal Tigadoli 3953942d3a8SSheetal Tigadoli /* Configure SCR0 */ 3963942d3a8SSheetal Tigadoli VERBOSE(" - configure scr0\n"); 3973942d3a8SSheetal Tigadoli val = mmio_read_32(smmu_base + 0x0); 3983942d3a8SSheetal Tigadoli val |= (0x1 << 12); 3993942d3a8SSheetal Tigadoli mmio_write_32(smmu_base + 0x0, val); 4003942d3a8SSheetal Tigadoli 4013942d3a8SSheetal Tigadoli /* Reserve context banks for secure masters */ 4023942d3a8SSheetal Tigadoli arm_smmu_reserve_secure_cntxt(); 4033942d3a8SSheetal Tigadoli 4043942d3a8SSheetal Tigadoli /* Print configuration */ 4053942d3a8SSheetal Tigadoli VERBOSE(" - scr0=0x%x scr1=0x%x scr2=0x%x\n", 4063942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x0), 4073942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x4), 4083942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x8)); 4093942d3a8SSheetal Tigadoli 4103942d3a8SSheetal Tigadoli VERBOSE(" - idr0=0x%x idr1=0x%x idr2=0x%x\n", 4113942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x20), 4123942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x24), 4133942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x28)); 4143942d3a8SSheetal Tigadoli 4153942d3a8SSheetal Tigadoli VERBOSE(" - idr3=0x%x idr4=0x%x idr5=0x%x\n", 4163942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x2c), 4173942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x30), 4183942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x34)); 4193942d3a8SSheetal Tigadoli 4203942d3a8SSheetal Tigadoli VERBOSE(" - idr6=0x%x idr7=0x%x\n", 4213942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x38), 4223942d3a8SSheetal Tigadoli mmio_read_32(smmu_base + 0x3c)); 4233942d3a8SSheetal Tigadoli 4243942d3a8SSheetal Tigadoli INFO("smmu init done\n"); 4253942d3a8SSheetal Tigadoli } 4263942d3a8SSheetal Tigadoli 4273942d3a8SSheetal Tigadoli static void brcm_stingray_dma_pl330_meminit(void) 4283942d3a8SSheetal Tigadoli { 4293942d3a8SSheetal Tigadoli uintptr_t icfg_mem_ctrl = ICFG_DMAC_MEM_PWR_CTRL; 4303942d3a8SSheetal Tigadoli 4313942d3a8SSheetal Tigadoli VERBOSE("dmac meminit start\n"); 4323942d3a8SSheetal Tigadoli 4333942d3a8SSheetal Tigadoli VERBOSE(" - arrpoweron\n"); 4343942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 4353942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__ARRPOWERONIN); 4363942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 4373942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__ARRPOWERONOUT)) 4383942d3a8SSheetal Tigadoli ; 4393942d3a8SSheetal Tigadoli 4403942d3a8SSheetal Tigadoli VERBOSE(" - arrpowerok\n"); 4413942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 4423942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__ARRPOWEROKIN); 4433942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 4443942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__ARRPOWEROKOUT)) 4453942d3a8SSheetal Tigadoli ; 4463942d3a8SSheetal Tigadoli 4473942d3a8SSheetal Tigadoli VERBOSE(" - poweron\n"); 4483942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 4493942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__POWERONIN); 4503942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 4513942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__POWERONOUT)) 4523942d3a8SSheetal Tigadoli ; 4533942d3a8SSheetal Tigadoli 4543942d3a8SSheetal Tigadoli VERBOSE(" - powerok\n"); 4553942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 4563942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__POWEROKIN); 4573942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 4583942d3a8SSheetal Tigadoli ICFG_DMAC_MEM_PWR_CTRL__POWEROKOUT)) 4593942d3a8SSheetal Tigadoli ; 4603942d3a8SSheetal Tigadoli 4613942d3a8SSheetal Tigadoli /* Wait sometime */ 4623942d3a8SSheetal Tigadoli mdelay(1); 4633942d3a8SSheetal Tigadoli 4643942d3a8SSheetal Tigadoli VERBOSE(" - remove isolation\n"); 4653942d3a8SSheetal Tigadoli mmio_clrbits_32(icfg_mem_ctrl, ICFG_DMAC_MEM_PWR_CTRL__ISO); 4663942d3a8SSheetal Tigadoli 4673942d3a8SSheetal Tigadoli INFO("dmac meminit done\n"); 4683942d3a8SSheetal Tigadoli } 4693942d3a8SSheetal Tigadoli 4703942d3a8SSheetal Tigadoli /* program the crmu access ranges for allowing non sec access*/ 4713942d3a8SSheetal Tigadoli static void brcm_stingray_crmu_access_init(void) 4723942d3a8SSheetal Tigadoli { 4733942d3a8SSheetal Tigadoli /* Enable 0x6641c001 - 0x6641c701 for non secure access */ 4743942d3a8SSheetal Tigadoli mmio_write_32(CRMU_CORE_ADDR_RANGE0_LOW, 0x6641c001); 4753942d3a8SSheetal Tigadoli mmio_write_32(CRMU_CORE_ADDR_RANGE0_LOW + 0x4, 0x6641c701); 4763942d3a8SSheetal Tigadoli 4773942d3a8SSheetal Tigadoli /* Enable 0x6641d001 - 0x66424b01 for non secure access */ 4783942d3a8SSheetal Tigadoli mmio_write_32(CRMU_CORE_ADDR_RANGE1_LOW, 0x6641d001); 4793942d3a8SSheetal Tigadoli mmio_write_32(CRMU_CORE_ADDR_RANGE1_LOW + 0x4, 0x66424b01); 4803942d3a8SSheetal Tigadoli 4813942d3a8SSheetal Tigadoli /* Enable 0x66425001 - 0x66425f01 for non secure access */ 4823942d3a8SSheetal Tigadoli mmio_write_32(CRMU_CORE_ADDR_RANGE2_LOW, 0x66425001); 4833942d3a8SSheetal Tigadoli mmio_write_32(CRMU_CORE_ADDR_RANGE2_LOW + 0x4, 0x66425f01); 4843942d3a8SSheetal Tigadoli 4853942d3a8SSheetal Tigadoli INFO("crmu access init done\n"); 4863942d3a8SSheetal Tigadoli } 4873942d3a8SSheetal Tigadoli 4883942d3a8SSheetal Tigadoli static void brcm_stingray_scr_init(void) 4893942d3a8SSheetal Tigadoli { 4903942d3a8SSheetal Tigadoli unsigned int val; 4913942d3a8SSheetal Tigadoli uintptr_t scr_base = SCR_BASE; 4923942d3a8SSheetal Tigadoli unsigned int clr_mask = SCR_AXCACHE_CONFIG_MASK; 4933942d3a8SSheetal Tigadoli unsigned int set_mask = SCR_TBUX_AXCACHE_CONFIG; 4943942d3a8SSheetal Tigadoli 4953942d3a8SSheetal Tigadoli VERBOSE("scr init start\n"); 4963942d3a8SSheetal Tigadoli 4973942d3a8SSheetal Tigadoli /* awdomain=0x1 and ardomain=0x1 */ 4983942d3a8SSheetal Tigadoli mmio_clrsetbits_32(scr_base + 0x0, clr_mask, set_mask); 4993942d3a8SSheetal Tigadoli val = mmio_read_32(scr_base + 0x0); 5003942d3a8SSheetal Tigadoli VERBOSE(" - set tbu0_config=0x%x\n", val); 5013942d3a8SSheetal Tigadoli 5023942d3a8SSheetal Tigadoli /* awdomain=0x1 and ardomain=0x1 */ 5033942d3a8SSheetal Tigadoli mmio_clrsetbits_32(scr_base + 0x4, clr_mask, set_mask); 5043942d3a8SSheetal Tigadoli val = mmio_read_32(scr_base + 0x4); 5053942d3a8SSheetal Tigadoli VERBOSE(" - set tbu1_config=0x%x\n", val); 5063942d3a8SSheetal Tigadoli 5073942d3a8SSheetal Tigadoli /* awdomain=0x1 and ardomain=0x1 */ 5083942d3a8SSheetal Tigadoli mmio_clrsetbits_32(scr_base + 0x8, clr_mask, set_mask); 5093942d3a8SSheetal Tigadoli val = mmio_read_32(scr_base + 0x8); 5103942d3a8SSheetal Tigadoli VERBOSE(" - set tbu2_config=0x%x\n", val); 5113942d3a8SSheetal Tigadoli 5123942d3a8SSheetal Tigadoli /* awdomain=0x1 and ardomain=0x1 */ 5133942d3a8SSheetal Tigadoli mmio_clrsetbits_32(scr_base + 0xc, clr_mask, set_mask); 5143942d3a8SSheetal Tigadoli val = mmio_read_32(scr_base + 0xc); 5153942d3a8SSheetal Tigadoli VERBOSE(" - set tbu3_config=0x%x\n", val); 5163942d3a8SSheetal Tigadoli 5173942d3a8SSheetal Tigadoli /* awdomain=0x1 and ardomain=0x1 */ 5183942d3a8SSheetal Tigadoli mmio_clrsetbits_32(scr_base + 0x10, clr_mask, set_mask); 5193942d3a8SSheetal Tigadoli val = mmio_read_32(scr_base + 0x10); 5203942d3a8SSheetal Tigadoli VERBOSE(" - set tbu4_config=0x%x\n", val); 5213942d3a8SSheetal Tigadoli 5223942d3a8SSheetal Tigadoli /* awdomain=0x0 and ardomain=0x0 */ 5233942d3a8SSheetal Tigadoli mmio_clrbits_32(scr_base + 0x14, clr_mask); 5243942d3a8SSheetal Tigadoli val = mmio_read_32(scr_base + 0x14); 5253942d3a8SSheetal Tigadoli VERBOSE(" - set gic_config=0x%x\n", val); 5263942d3a8SSheetal Tigadoli 5273942d3a8SSheetal Tigadoli INFO("scr init done\n"); 5283942d3a8SSheetal Tigadoli } 5293942d3a8SSheetal Tigadoli 5303942d3a8SSheetal Tigadoli static void brcm_stingray_hsls_tzpcprot_init(void) 5313942d3a8SSheetal Tigadoli { 5323942d3a8SSheetal Tigadoli unsigned int val; 5333942d3a8SSheetal Tigadoli uintptr_t tzpcdecprot_base = HSLS_TZPC_BASE; 5343942d3a8SSheetal Tigadoli 5353942d3a8SSheetal Tigadoli VERBOSE("hsls tzpcprot init start\n"); 5363942d3a8SSheetal Tigadoli 5373942d3a8SSheetal Tigadoli /* Treat third-party masters as non-secured */ 5383942d3a8SSheetal Tigadoli val = 0; 5393942d3a8SSheetal Tigadoli val |= BIT(6); /* SDIO1 */ 5403942d3a8SSheetal Tigadoli val |= BIT(5); /* SDIO0 */ 5413942d3a8SSheetal Tigadoli val |= BIT(0); /* AMAC */ 5423942d3a8SSheetal Tigadoli mmio_write_32(tzpcdecprot_base + 0x810, val); 5433942d3a8SSheetal Tigadoli 5443942d3a8SSheetal Tigadoli /* Print TZPC decode status registers */ 5453942d3a8SSheetal Tigadoli VERBOSE(" - tzpcdecprot0=0x%x\n", 5463942d3a8SSheetal Tigadoli mmio_read_32(tzpcdecprot_base + 0x800)); 5473942d3a8SSheetal Tigadoli 5483942d3a8SSheetal Tigadoli VERBOSE(" - tzpcdecprot1=0x%x\n", 5493942d3a8SSheetal Tigadoli mmio_read_32(tzpcdecprot_base + 0x80c)); 5503942d3a8SSheetal Tigadoli 5513942d3a8SSheetal Tigadoli INFO("hsls tzpcprot init done\n"); 5523942d3a8SSheetal Tigadoli } 5533942d3a8SSheetal Tigadoli 5543942d3a8SSheetal Tigadoli #ifdef USE_I2S 5553942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL (HSLS_ICFG_REGS_BASE + 0xaa8) 5563942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__POWERONIN BIT(0) 5573942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__POWEROKIN BIT(1) 5583942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__ARRPOWERONIN BIT(2) 5593942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__ARRPOWEROKIN BIT(3) 5603942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__POWERONOUT BIT(4) 5613942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__POWEROKOUT BIT(5) 5623942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__ARRPOWERONOUT BIT(6) 5633942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__ARRPOWEROKOUT BIT(7) 5643942d3a8SSheetal Tigadoli #define ICFG_AUDIO_POWER_CTRL__ISO BIT(8) 5653942d3a8SSheetal Tigadoli #define ICFG_AUDIO_SID_CONTROL (HSLS_ICFG_REGS_BASE + 0xaf8) 5663942d3a8SSheetal Tigadoli #define ICFG_AUDIO_SID_SHIFT 5 5673942d3a8SSheetal Tigadoli #define ICFG_AUDIO_SID_AWADDR_OFFSET 0x0 5683942d3a8SSheetal Tigadoli #define ICFG_AUDIO_SID_ARADDR_OFFSET 0x4 5693942d3a8SSheetal Tigadoli 5703942d3a8SSheetal Tigadoli #define I2S_RESET_CONTROL (HSLS_IDM_REGS_BASE + 0x1800) 5713942d3a8SSheetal Tigadoli #define I2S_IDM_IO_CONTROL (HSLS_IDM_REGS_BASE + 0x1408) 5723942d3a8SSheetal Tigadoli #define IO_CONTROL_CLK_ENABLE BIT(0) 5733942d3a8SSheetal Tigadoli #define I2S_IDM0_ARCACHE_OFFSET 16 5743942d3a8SSheetal Tigadoli #define I2S_IDM0_AWCACHE_OFFSET 20 5753942d3a8SSheetal Tigadoli #define I2S_IDM0_ARCACHE_MASK (0xF << I2S_IDM0_ARCACHE_OFFSET) 5763942d3a8SSheetal Tigadoli #define I2S_IDM0_AWCACHE_MASK (0xF << I2S_IDM0_AWCACHE_OFFSET) 5773942d3a8SSheetal Tigadoli /* ARCACHE - AWCACHE is 0x22 Normal Non-cacheable Non-bufferable. */ 5783942d3a8SSheetal Tigadoli #define I2S_IDM0_ARCACHE_VAL (0x2 << I2S_IDM0_ARCACHE_OFFSET) 5793942d3a8SSheetal Tigadoli #define I2S_IDM0_AWCACHE_VAL (0x2 << I2S_IDM0_AWCACHE_OFFSET) 5803942d3a8SSheetal Tigadoli 5813942d3a8SSheetal Tigadoli static void brcm_stingray_audio_init(void) 5823942d3a8SSheetal Tigadoli { 5833942d3a8SSheetal Tigadoli unsigned int val; 5843942d3a8SSheetal Tigadoli uintptr_t icfg_mem_ctrl = ICFG_AUDIO_POWER_CTRL; 5853942d3a8SSheetal Tigadoli uintptr_t icfg_audio_sid = ICFG_AUDIO_SID_CONTROL; 5863942d3a8SSheetal Tigadoli 5873942d3a8SSheetal Tigadoli mmio_write_32(I2S_RESET_CONTROL, 0x0); 5883942d3a8SSheetal Tigadoli 5893942d3a8SSheetal Tigadoli mmio_clrsetbits_32(I2S_IDM_IO_CONTROL, I2S_IDM0_ARCACHE_MASK, 5903942d3a8SSheetal Tigadoli I2S_IDM0_ARCACHE_VAL); 5913942d3a8SSheetal Tigadoli 5923942d3a8SSheetal Tigadoli mmio_clrsetbits_32(I2S_IDM_IO_CONTROL, I2S_IDM0_AWCACHE_MASK, 5933942d3a8SSheetal Tigadoli I2S_IDM0_AWCACHE_VAL); 5943942d3a8SSheetal Tigadoli 5953942d3a8SSheetal Tigadoli mmio_setbits_32(I2S_IDM_IO_CONTROL, IO_CONTROL_CLK_ENABLE); 5963942d3a8SSheetal Tigadoli 5973942d3a8SSheetal Tigadoli VERBOSE("audio meminit start\n"); 5983942d3a8SSheetal Tigadoli 5993942d3a8SSheetal Tigadoli VERBOSE(" - configure stream_id = 0x6001\n"); 6003942d3a8SSheetal Tigadoli val = SR_SID_VAL(0x3, 0x0, 0x1) << ICFG_AUDIO_SID_SHIFT; 6013942d3a8SSheetal Tigadoli mmio_write_32(icfg_audio_sid + ICFG_AUDIO_SID_AWADDR_OFFSET, val); 6023942d3a8SSheetal Tigadoli mmio_write_32(icfg_audio_sid + ICFG_AUDIO_SID_ARADDR_OFFSET, val); 6033942d3a8SSheetal Tigadoli 6043942d3a8SSheetal Tigadoli VERBOSE(" - arrpoweron\n"); 6053942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 6063942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__ARRPOWERONIN); 6073942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 6083942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__ARRPOWERONOUT)) 6093942d3a8SSheetal Tigadoli ; 6103942d3a8SSheetal Tigadoli 6113942d3a8SSheetal Tigadoli VERBOSE(" - arrpowerok\n"); 6123942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 6133942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__ARRPOWEROKIN); 6143942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 6153942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__ARRPOWEROKOUT)) 6163942d3a8SSheetal Tigadoli ; 6173942d3a8SSheetal Tigadoli 6183942d3a8SSheetal Tigadoli VERBOSE(" - poweron\n"); 6193942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 6203942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__POWERONIN); 6213942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 6223942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__POWERONOUT)) 6233942d3a8SSheetal Tigadoli ; 6243942d3a8SSheetal Tigadoli 6253942d3a8SSheetal Tigadoli VERBOSE(" - powerok\n"); 6263942d3a8SSheetal Tigadoli mmio_setbits_32(icfg_mem_ctrl, 6273942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__POWEROKIN); 6283942d3a8SSheetal Tigadoli while (!(mmio_read_32(icfg_mem_ctrl) & 6293942d3a8SSheetal Tigadoli ICFG_AUDIO_POWER_CTRL__POWEROKOUT)) 6303942d3a8SSheetal Tigadoli ; 6313942d3a8SSheetal Tigadoli 6323942d3a8SSheetal Tigadoli /* Wait sometime */ 6333942d3a8SSheetal Tigadoli mdelay(1); 6343942d3a8SSheetal Tigadoli 6353942d3a8SSheetal Tigadoli VERBOSE(" - remove isolation\n"); 6363942d3a8SSheetal Tigadoli mmio_clrbits_32(icfg_mem_ctrl, ICFG_AUDIO_POWER_CTRL__ISO); 6373942d3a8SSheetal Tigadoli 6383942d3a8SSheetal Tigadoli INFO("audio meminit done\n"); 6393942d3a8SSheetal Tigadoli } 6403942d3a8SSheetal Tigadoli #endif /* USE_I2S */ 6413942d3a8SSheetal Tigadoli 6423942d3a8SSheetal Tigadoli /* 6433942d3a8SSheetal Tigadoli * These defines do not match the regfile but they are renamed in a way such 6443942d3a8SSheetal Tigadoli * that they are much more readible 6453942d3a8SSheetal Tigadoli */ 6463942d3a8SSheetal Tigadoli 6473942d3a8SSheetal Tigadoli #define SCR_GPV_SMMU_NS (SCR_GPV_BASE + 0x28) 6483942d3a8SSheetal Tigadoli #define SCR_GPV_GIC500_NS (SCR_GPV_BASE + 0x34) 6493942d3a8SSheetal Tigadoli #define HSLS_GPV_NOR_S0_NS (HSLS_GPV_BASE + 0x14) 6503942d3a8SSheetal Tigadoli #define HSLS_GPV_IDM1_NS (HSLS_GPV_BASE + 0x18) 6513942d3a8SSheetal Tigadoli #define HSLS_GPV_IDM2_NS (HSLS_GPV_BASE + 0x1c) 6523942d3a8SSheetal Tigadoli #define HSLS_SDIO0_SLAVE_NS (HSLS_GPV_BASE + 0x20) 6533942d3a8SSheetal Tigadoli #define HSLS_SDIO1_SLAVE_NS (HSLS_GPV_BASE + 0x24) 6543942d3a8SSheetal Tigadoli #define HSLS_GPV_APBY_NS (HSLS_GPV_BASE + 0x2c) 6553942d3a8SSheetal Tigadoli #define HSLS_GPV_APBZ_NS (HSLS_GPV_BASE + 0x30) 6563942d3a8SSheetal Tigadoli #define HSLS_GPV_APBX_NS (HSLS_GPV_BASE + 0x34) 6573942d3a8SSheetal Tigadoli #define HSLS_GPV_APBS_NS (HSLS_GPV_BASE + 0x38) 6583942d3a8SSheetal Tigadoli #define HSLS_GPV_QSPI_S0_NS (HSLS_GPV_BASE + 0x68) 6593942d3a8SSheetal Tigadoli #define HSLS_GPV_APBR_NS (HSLS_GPV_BASE + 0x6c) 6603942d3a8SSheetal Tigadoli #define FS4_CRYPTO_GPV_RM_SLAVE_NS (FS4_CRYPTO_GPV_BASE + 0x8) 6613942d3a8SSheetal Tigadoli #define FS4_CRYPTO_GPV_APB_SWITCH_NS (FS4_CRYPTO_GPV_BASE + 0xc) 6623942d3a8SSheetal Tigadoli #define FS4_RAID_GPV_RM_SLAVE_NS (FS4_RAID_GPV_BASE + 0x8) 6633942d3a8SSheetal Tigadoli #define FS4_RAID_GPV_APB_SWITCH_NS (FS4_RAID_GPV_BASE + 0xc) 6643942d3a8SSheetal Tigadoli #define FS4_CRYPTO_IDM_NS (NIC400_FS_NOC_ROOT + 0x1c) 6653942d3a8SSheetal Tigadoli #define FS4_RAID_IDM_NS (NIC400_FS_NOC_ROOT + 0x28) 6663942d3a8SSheetal Tigadoli 6673942d3a8SSheetal Tigadoli #define FS4_CRYPTO_RING_COUNT 32 6683942d3a8SSheetal Tigadoli #define FS4_CRYPTO_DME_COUNT 10 6693942d3a8SSheetal Tigadoli #define FS4_CRYPTO_AE_COUNT 10 6703942d3a8SSheetal Tigadoli #define FS4_CRYPTO_START_STREAM_ID 0x4000 6713942d3a8SSheetal Tigadoli #define FS4_CRYPTO_MSI_DEVICE_ID 0x4100 6723942d3a8SSheetal Tigadoli 6733942d3a8SSheetal Tigadoli #define FS4_RAID_RING_COUNT 32 6743942d3a8SSheetal Tigadoli #define FS4_RAID_DME_COUNT 8 6753942d3a8SSheetal Tigadoli #define FS4_RAID_AE_COUNT 8 6763942d3a8SSheetal Tigadoli #define FS4_RAID_START_STREAM_ID 0x4200 6773942d3a8SSheetal Tigadoli #define FS4_RAID_MSI_DEVICE_ID 0x4300 6783942d3a8SSheetal Tigadoli 6793942d3a8SSheetal Tigadoli #define FS6_PKI_AXI_SLAVE_NS \ 6803942d3a8SSheetal Tigadoli (NIC400_FS_NOC_ROOT + NIC400_FS_NOC_SECURITY2_OFFSET) 6813942d3a8SSheetal Tigadoli 6823942d3a8SSheetal Tigadoli #define FS6_PKI_AE_DME_APB_NS \ 6833942d3a8SSheetal Tigadoli (NIC400_FS_NOC_ROOT + NIC400_FS_NOC_SECURITY7_OFFSET) 6843942d3a8SSheetal Tigadoli #define FS6_PKI_IDM_IO_CONTROL_DIRECT 0x0 6853942d3a8SSheetal Tigadoli #define FS6_PKI_IDM_RESET_CONTROL 0x0 6863942d3a8SSheetal Tigadoli #define FS6_PKI_RING_COUNT 32 6873942d3a8SSheetal Tigadoli #define FS6_PKI_DME_COUNT 1 6883942d3a8SSheetal Tigadoli #define FS6_PKI_AE_COUNT 4 6893942d3a8SSheetal Tigadoli #define FS6_PKI_START_STREAM_ID 0x4000 6903942d3a8SSheetal Tigadoli #define FS6_PKI_MSI_DEVICE_ID 0x4100 6913942d3a8SSheetal Tigadoli 6923942d3a8SSheetal Tigadoli static void brcm_stingray_security_init(void) 6933942d3a8SSheetal Tigadoli { 6943942d3a8SSheetal Tigadoli unsigned int val; 6953942d3a8SSheetal Tigadoli 6963942d3a8SSheetal Tigadoli val = mmio_read_32(SCR_GPV_SMMU_NS); 6973942d3a8SSheetal Tigadoli val |= BIT(0); /* SMMU NS = 1 */ 6983942d3a8SSheetal Tigadoli mmio_write_32(SCR_GPV_SMMU_NS, val); 6993942d3a8SSheetal Tigadoli 7003942d3a8SSheetal Tigadoli val = mmio_read_32(SCR_GPV_GIC500_NS); 7013942d3a8SSheetal Tigadoli val |= BIT(0); /* GIC-500 NS = 1 */ 7023942d3a8SSheetal Tigadoli mmio_write_32(SCR_GPV_GIC500_NS, val); 7033942d3a8SSheetal Tigadoli 7043942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_NOR_S0_NS); 7053942d3a8SSheetal Tigadoli val |= BIT(0); /* NOR SLAVE NS = 1 */ 7063942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_NOR_S0_NS, val); 7073942d3a8SSheetal Tigadoli 7083942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_IDM1_NS); 7093942d3a8SSheetal Tigadoli val |= BIT(0); /* DMA IDM NS = 1 */ 7103942d3a8SSheetal Tigadoli val |= BIT(1); /* I2S IDM NS = 1 */ 7113942d3a8SSheetal Tigadoli val |= BIT(2); /* AMAC IDM NS = 1 */ 7123942d3a8SSheetal Tigadoli val |= BIT(3); /* SDIO0 IDM NS = 1 */ 7133942d3a8SSheetal Tigadoli val |= BIT(4); /* SDIO1 IDM NS = 1 */ 7143942d3a8SSheetal Tigadoli val |= BIT(5); /* DS_3 IDM NS = 1 */ 7153942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_IDM1_NS, val); 7163942d3a8SSheetal Tigadoli 7173942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_IDM2_NS); 7183942d3a8SSheetal Tigadoli val |= BIT(2); /* QSPI IDM NS = 1 */ 7193942d3a8SSheetal Tigadoli val |= BIT(1); /* NOR IDM NS = 1 */ 7203942d3a8SSheetal Tigadoli val |= BIT(0); /* NAND IDM NS = 1 */ 7213942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_IDM2_NS, val); 7223942d3a8SSheetal Tigadoli 7233942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_APBY_NS); 7243942d3a8SSheetal Tigadoli val |= BIT(10); /* I2S NS = 1 */ 7253942d3a8SSheetal Tigadoli val |= BIT(4); /* IOPAD NS = 1 */ 7263942d3a8SSheetal Tigadoli val |= 0xf; /* UARTx NS = 1 */ 7273942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_APBY_NS, val); 7283942d3a8SSheetal Tigadoli 7293942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_APBZ_NS); 7303942d3a8SSheetal Tigadoli val |= BIT(2); /* RNG NS = 1 */ 7313942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_APBZ_NS, val); 7323942d3a8SSheetal Tigadoli 7333942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_APBS_NS); 7343942d3a8SSheetal Tigadoli val |= 0x3; /* SPIx NS = 1 */ 7353942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_APBS_NS, val); 7363942d3a8SSheetal Tigadoli 7373942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_APBR_NS); 7383942d3a8SSheetal Tigadoli val |= BIT(7); /* QSPI APB NS = 1 */ 7393942d3a8SSheetal Tigadoli val |= BIT(6); /* NAND APB NS = 1 */ 7403942d3a8SSheetal Tigadoli val |= BIT(5); /* NOR APB NS = 1 */ 7413942d3a8SSheetal Tigadoli val |= BIT(4); /* AMAC APB NS = 1 */ 7423942d3a8SSheetal Tigadoli val |= BIT(1); /* DMA S1 APB NS = 1 */ 7433942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_APBR_NS, val); 7443942d3a8SSheetal Tigadoli 7453942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_SDIO0_SLAVE_NS); 7463942d3a8SSheetal Tigadoli val |= BIT(0); /* SDIO0 NS = 1 */ 7473942d3a8SSheetal Tigadoli mmio_write_32(HSLS_SDIO0_SLAVE_NS, val); 7483942d3a8SSheetal Tigadoli 7493942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_SDIO1_SLAVE_NS); 7503942d3a8SSheetal Tigadoli val |= BIT(0); /* SDIO1 NS = 1 */ 7513942d3a8SSheetal Tigadoli mmio_write_32(HSLS_SDIO1_SLAVE_NS, val); 7523942d3a8SSheetal Tigadoli 7533942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_APBX_NS); 7543942d3a8SSheetal Tigadoli val |= BIT(14); /* SMBUS1 NS = 1 */ 7553942d3a8SSheetal Tigadoli val |= BIT(13); /* GPIO NS = 1 */ 7563942d3a8SSheetal Tigadoli val |= BIT(12); /* WDT NS = 1 */ 7573942d3a8SSheetal Tigadoli val |= BIT(11); /* SMBUS0 NS = 1 */ 7583942d3a8SSheetal Tigadoli val |= BIT(10); /* Timer7 NS = 1 */ 7593942d3a8SSheetal Tigadoli val |= BIT(9); /* Timer6 NS = 1 */ 7603942d3a8SSheetal Tigadoli val |= BIT(8); /* Timer5 NS = 1 */ 7613942d3a8SSheetal Tigadoli val |= BIT(7); /* Timer4 NS = 1 */ 7623942d3a8SSheetal Tigadoli val |= BIT(6); /* Timer3 NS = 1 */ 7633942d3a8SSheetal Tigadoli val |= BIT(5); /* Timer2 NS = 1 */ 7643942d3a8SSheetal Tigadoli val |= BIT(4); /* Timer1 NS = 1 */ 7653942d3a8SSheetal Tigadoli val |= BIT(3); /* Timer0 NS = 1 */ 7663942d3a8SSheetal Tigadoli val |= BIT(2); /* MDIO NS = 1 */ 7673942d3a8SSheetal Tigadoli val |= BIT(1); /* PWM NS = 1 */ 7683942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_APBX_NS, val); 7693942d3a8SSheetal Tigadoli 7703942d3a8SSheetal Tigadoli val = mmio_read_32(HSLS_GPV_QSPI_S0_NS); 7713942d3a8SSheetal Tigadoli val |= BIT(0); /* QSPI NS = 1 */ 7723942d3a8SSheetal Tigadoli mmio_write_32(HSLS_GPV_QSPI_S0_NS, val); 7733942d3a8SSheetal Tigadoli 7743942d3a8SSheetal Tigadoli #ifdef USE_FS4 7753942d3a8SSheetal Tigadoli val = 0x1; /* FS4 Crypto rm_slave */ 7763942d3a8SSheetal Tigadoli mmio_write_32(FS4_CRYPTO_GPV_RM_SLAVE_NS, val); 7773942d3a8SSheetal Tigadoli val = 0x1; /* FS4 Crypto apb_switch */ 7783942d3a8SSheetal Tigadoli mmio_write_32(FS4_CRYPTO_GPV_APB_SWITCH_NS, val); 7793942d3a8SSheetal Tigadoli 7803942d3a8SSheetal Tigadoli val = 0x1; /* FS4 Raid rm_slave */ 7813942d3a8SSheetal Tigadoli mmio_write_32(FS4_RAID_GPV_RM_SLAVE_NS, val); 7823942d3a8SSheetal Tigadoli val = 0x1; /* FS4 Raid apb_switch */ 7833942d3a8SSheetal Tigadoli mmio_write_32(FS4_RAID_GPV_APB_SWITCH_NS, val); 7843942d3a8SSheetal Tigadoli 7853942d3a8SSheetal Tigadoli val = 0x1; /* FS4 Crypto IDM */ 7863942d3a8SSheetal Tigadoli mmio_write_32(FS4_CRYPTO_IDM_NS, val); 7873942d3a8SSheetal Tigadoli val = 0x1; /* FS4 RAID IDM */ 7883942d3a8SSheetal Tigadoli mmio_write_32(FS4_RAID_IDM_NS, val); 7893942d3a8SSheetal Tigadoli #endif 7903942d3a8SSheetal Tigadoli 7913942d3a8SSheetal Tigadoli #ifdef BL31_CCN_NONSECURE 7923942d3a8SSheetal Tigadoli /* Enable non-secure access to CCN registers */ 7933942d3a8SSheetal Tigadoli mmio_write_32(OLY_MN_REGISTERS_NODE0_SECURE_ACCESS, 0x1); 7943942d3a8SSheetal Tigadoli #endif 7953942d3a8SSheetal Tigadoli 7963942d3a8SSheetal Tigadoli #ifdef DDR_CTRL_PHY_NONSECURE 7973942d3a8SSheetal Tigadoli mmio_write_32(SCR_NOC_DDR_REGISTER_ACCESS, 0x1); 7983942d3a8SSheetal Tigadoli #endif 7993942d3a8SSheetal Tigadoli 8003942d3a8SSheetal Tigadoli paxc_mhb_ns_init(); 8013942d3a8SSheetal Tigadoli 8023942d3a8SSheetal Tigadoli /* unlock scr idm for non secure access */ 8033942d3a8SSheetal Tigadoli mmio_write_32(SCR_NOC_SECURITY0, 0xffffffff); 8043942d3a8SSheetal Tigadoli 8053942d3a8SSheetal Tigadoli INFO("security init done\r\n"); 8063942d3a8SSheetal Tigadoli } 8073942d3a8SSheetal Tigadoli 8083942d3a8SSheetal Tigadoli void brcm_gpio_pad_ns_init(void) 8093942d3a8SSheetal Tigadoli { 8103942d3a8SSheetal Tigadoli /* configure all GPIO pads for non secure world access*/ 8113942d3a8SSheetal Tigadoli mmio_write_32(GPIO_S_CNTRL_REG, 0xffffffff); /* 128-140 gpio pads */ 8123942d3a8SSheetal Tigadoli mmio_write_32(GPIO_S_CNTRL_REG + 0x4, 0xffffffff); /* 96-127 gpio pad */ 8133942d3a8SSheetal Tigadoli mmio_write_32(GPIO_S_CNTRL_REG + 0x8, 0xffffffff); /* 64-95 gpio pad */ 8143942d3a8SSheetal Tigadoli mmio_write_32(GPIO_S_CNTRL_REG + 0xc, 0xffffffff); /* 32-63 gpio pad */ 8153942d3a8SSheetal Tigadoli mmio_write_32(GPIO_S_CNTRL_REG + 0x10, 0xffffffff); /* 0-31 gpio pad */ 8163942d3a8SSheetal Tigadoli } 8173942d3a8SSheetal Tigadoli 8183942d3a8SSheetal Tigadoli #ifndef USE_DDR 8193942d3a8SSheetal Tigadoli static void brcm_stingray_sram_ns_init(void) 8203942d3a8SSheetal Tigadoli { 8213942d3a8SSheetal Tigadoli uintptr_t sram_root = TZC400_FS_SRAM_ROOT; 8223942d3a8SSheetal Tigadoli uintptr_t noc_root = NIC400_FS_NOC_ROOT; 8233942d3a8SSheetal Tigadoli 8243942d3a8SSheetal Tigadoli mmio_write_32(sram_root + GATE_KEEPER_OFFSET, 1); 8253942d3a8SSheetal Tigadoli mmio_write_32(sram_root + REGION_ATTRIBUTES_0_OFFSET, 0xc0000000); 8263942d3a8SSheetal Tigadoli mmio_write_32(sram_root + REGION_ID_ACCESS_0_OFFSET, 0x00010001); 8273942d3a8SSheetal Tigadoli mmio_write_32(noc_root + NIC400_FS_NOC_SECURITY4_OFFSET, 0x1); 8283942d3a8SSheetal Tigadoli INFO(" stingray sram ns init done.\n"); 8293942d3a8SSheetal Tigadoli } 8303942d3a8SSheetal Tigadoli #endif 8313942d3a8SSheetal Tigadoli 8323942d3a8SSheetal Tigadoli static void ccn_pre_init(void) 8333942d3a8SSheetal Tigadoli { 8343942d3a8SSheetal Tigadoli /* 8353942d3a8SSheetal Tigadoli * Set WFC bit of RN-I nodes where FS4 is connected. 8363942d3a8SSheetal Tigadoli * This is required inorder to wait for read/write requests 8373942d3a8SSheetal Tigadoli * completion acknowledgment. Otherwise FS4 Ring Manager is 8383942d3a8SSheetal Tigadoli * getting stale data because of re-ordering of read/write 8393942d3a8SSheetal Tigadoli * requests at CCN level 8403942d3a8SSheetal Tigadoli */ 8413942d3a8SSheetal Tigadoli mmio_setbits_32(OLY_RNI3PDVM_REGISTERS_NODE8_AUX_CTL, 8423942d3a8SSheetal Tigadoli OLY_RNI3PDVM_REGISTERS_NODE8_AUX_CTL_WFC); 8433942d3a8SSheetal Tigadoli } 8443942d3a8SSheetal Tigadoli 8453942d3a8SSheetal Tigadoli static void ccn_post_init(void) 8463942d3a8SSheetal Tigadoli { 8473942d3a8SSheetal Tigadoli mmio_setbits_32(OLY_HNI_REGISTERS_NODE0_PCIERC_RNI_NODEID_LIST, 8483942d3a8SSheetal Tigadoli SRP_RNI_PCIE_CONNECTED); 8493942d3a8SSheetal Tigadoli mmio_setbits_32(OLY_HNI_REGISTERS_NODE0_SA_AUX_CTL, 8503942d3a8SSheetal Tigadoli SA_AUX_CTL_SER_DEVNE_WR); 8513942d3a8SSheetal Tigadoli 8523942d3a8SSheetal Tigadoli mmio_clrbits_32(OLY_HNI_REGISTERS_NODE0_POS_CONTROL, 8533942d3a8SSheetal Tigadoli POS_CONTROL_HNI_POS_EN); 8543942d3a8SSheetal Tigadoli mmio_clrbits_32(OLY_HNI_REGISTERS_NODE0_SA_AUX_CTL, 8553942d3a8SSheetal Tigadoli SA_AUX_CTL_POS_EARLY_WR_COMP_EN); 8563942d3a8SSheetal Tigadoli } 8573942d3a8SSheetal Tigadoli 8583942d3a8SSheetal Tigadoli #ifndef BL31_BOOT_PRELOADED_SCP 8593942d3a8SSheetal Tigadoli static void crmu_init(void) 8603942d3a8SSheetal Tigadoli { 8613942d3a8SSheetal Tigadoli /* 8623942d3a8SSheetal Tigadoli * Configure CRMU for using SMMU 8633942d3a8SSheetal Tigadoli */ 8643942d3a8SSheetal Tigadoli 8653942d3a8SSheetal Tigadoli /*Program CRMU Stream ID */ 8663942d3a8SSheetal Tigadoli mmio_write_32(CRMU_MASTER_AXI_ARUSER_CONFIG, 8673942d3a8SSheetal Tigadoli (CRMU_STREAM_ID << CRMU_SID_SHIFT)); 8683942d3a8SSheetal Tigadoli mmio_write_32(CRMU_MASTER_AXI_AWUSER_CONFIG, 8693942d3a8SSheetal Tigadoli (CRMU_STREAM_ID << CRMU_SID_SHIFT)); 8703942d3a8SSheetal Tigadoli 8713942d3a8SSheetal Tigadoli /* Create Identity mapping */ 8723942d3a8SSheetal Tigadoli arm_smmu_create_identity_map(DOMAIN_CRMU); 8733942d3a8SSheetal Tigadoli 8743942d3a8SSheetal Tigadoli /* Enable Client Port for Secure Masters*/ 8753942d3a8SSheetal Tigadoli arm_smmu_enable_secure_client_port(); 8763942d3a8SSheetal Tigadoli } 8773942d3a8SSheetal Tigadoli #endif 8783942d3a8SSheetal Tigadoli 8793942d3a8SSheetal Tigadoli static void brcm_fsx_init(void) 8803942d3a8SSheetal Tigadoli { 8813942d3a8SSheetal Tigadoli #if defined(USE_FS4) && defined(USE_FS6) 8823942d3a8SSheetal Tigadoli #error "USE_FS4 and USE_FS6 should not be used together" 8833942d3a8SSheetal Tigadoli #endif 8843942d3a8SSheetal Tigadoli 8853942d3a8SSheetal Tigadoli #ifdef USE_FS4 8863942d3a8SSheetal Tigadoli fsx_init(eFS4_CRYPTO, FS4_CRYPTO_RING_COUNT, FS4_CRYPTO_DME_COUNT, 8873942d3a8SSheetal Tigadoli FS4_CRYPTO_AE_COUNT, FS4_CRYPTO_START_STREAM_ID, 8883942d3a8SSheetal Tigadoli FS4_CRYPTO_MSI_DEVICE_ID, FS4_CRYPTO_IDM_IO_CONTROL_DIRECT, 8893942d3a8SSheetal Tigadoli FS4_CRYPTO_IDM_RESET_CONTROL, FS4_CRYPTO_BASE, 8903942d3a8SSheetal Tigadoli FS4_CRYPTO_DME_BASE); 8913942d3a8SSheetal Tigadoli 8923942d3a8SSheetal Tigadoli fsx_init(eFS4_RAID, FS4_RAID_RING_COUNT, FS4_RAID_DME_COUNT, 8933942d3a8SSheetal Tigadoli FS4_RAID_AE_COUNT, FS4_RAID_START_STREAM_ID, 8943942d3a8SSheetal Tigadoli FS4_RAID_MSI_DEVICE_ID, FS4_RAID_IDM_IO_CONTROL_DIRECT, 8953942d3a8SSheetal Tigadoli FS4_RAID_IDM_RESET_CONTROL, FS4_RAID_BASE, 8963942d3a8SSheetal Tigadoli FS4_RAID_DME_BASE); 8973942d3a8SSheetal Tigadoli 8983942d3a8SSheetal Tigadoli fsx_meminit("raid", 8993942d3a8SSheetal Tigadoli FS4_RAID_IDM_IO_CONTROL_DIRECT, 9003942d3a8SSheetal Tigadoli FS4_RAID_IDM_IO_STATUS); 9013942d3a8SSheetal Tigadoli #endif 9023942d3a8SSheetal Tigadoli } 9033942d3a8SSheetal Tigadoli 9043942d3a8SSheetal Tigadoli static void bcm_bl33_pass_info(void) 9053942d3a8SSheetal Tigadoli { 9063942d3a8SSheetal Tigadoli struct bl33_info *info = (struct bl33_info *)BL33_SHARED_DDR_BASE; 9073942d3a8SSheetal Tigadoli 9083942d3a8SSheetal Tigadoli if (sizeof(*info) > BL33_SHARED_DDR_SIZE) 9093942d3a8SSheetal Tigadoli WARN("bl33 shared area not reserved\n"); 9103942d3a8SSheetal Tigadoli 9113942d3a8SSheetal Tigadoli info->version = BL33_INFO_VERSION; 9123942d3a8SSheetal Tigadoli info->chip.chip_id = PLAT_CHIP_ID_GET; 9133942d3a8SSheetal Tigadoli info->chip.rev_id = PLAT_CHIP_REV_GET; 9143942d3a8SSheetal Tigadoli } 9153942d3a8SSheetal Tigadoli 9163942d3a8SSheetal Tigadoli DEFINE_RENAME_SYSREG_RW_FUNCS(l2ctlr_el1, CORTEX_A72_L2CTLR_EL1) 9173942d3a8SSheetal Tigadoli 9183942d3a8SSheetal Tigadoli void plat_bcm_bl31_early_platform_setup(void *from_bl2, 9193942d3a8SSheetal Tigadoli bl_params_t *plat_params_from_bl2) 9203942d3a8SSheetal Tigadoli { 9213942d3a8SSheetal Tigadoli #ifdef BL31_BOOT_PRELOADED_SCP 9223942d3a8SSheetal Tigadoli image_info_t scp_image_info; 9233942d3a8SSheetal Tigadoli 9243942d3a8SSheetal Tigadoli scp_image_info.image_base = PRELOADED_SCP_BASE; 9253942d3a8SSheetal Tigadoli scp_image_info.image_size = PRELOADED_SCP_SIZE; 926*5703c737SSheetal Tigadoli plat_bcm_bl2_plat_handle_scp_bl2(&scp_image_info); 9273942d3a8SSheetal Tigadoli #endif 9283942d3a8SSheetal Tigadoli /* 9293942d3a8SSheetal Tigadoli * In BL31, logs are saved to DDR and we have much larger space to 9303942d3a8SSheetal Tigadoli * store logs. We can now afford to save all logs >= the 'INFO' level 9313942d3a8SSheetal Tigadoli */ 9323942d3a8SSheetal Tigadoli bcm_elog_init((void *)BCM_ELOG_BL31_BASE, BCM_ELOG_BL31_SIZE, 9333942d3a8SSheetal Tigadoli LOG_LEVEL_INFO); 9343942d3a8SSheetal Tigadoli 9353942d3a8SSheetal Tigadoli INFO("L2CTLR = 0x%lx\n", read_l2ctlr_el1()); 9363942d3a8SSheetal Tigadoli 9373942d3a8SSheetal Tigadoli brcm_timer_sync_init(); 9383942d3a8SSheetal Tigadoli 9393942d3a8SSheetal Tigadoli brcm_stingray_dma_pl330_init(); 9403942d3a8SSheetal Tigadoli 9413942d3a8SSheetal Tigadoli brcm_stingray_dma_pl330_meminit(); 9423942d3a8SSheetal Tigadoli 9433942d3a8SSheetal Tigadoli brcm_stingray_spi_pl022_init(APBS_IDM_IDM_RESET_CONTROL); 9443942d3a8SSheetal Tigadoli 9453942d3a8SSheetal Tigadoli #ifdef USE_AMAC 9463942d3a8SSheetal Tigadoli brcm_stingray_amac_init(); 9473942d3a8SSheetal Tigadoli #endif 9483942d3a8SSheetal Tigadoli 9493942d3a8SSheetal Tigadoli brcm_stingray_sdio_init(); 9503942d3a8SSheetal Tigadoli 9513942d3a8SSheetal Tigadoli #ifdef NCSI_IO_DRIVE_STRENGTH_MA 9523942d3a8SSheetal Tigadoli brcm_stingray_ncsi_init(); 9533942d3a8SSheetal Tigadoli #endif 9543942d3a8SSheetal Tigadoli 9553942d3a8SSheetal Tigadoli #ifdef USE_USB 9563942d3a8SSheetal Tigadoli xhci_phy_init(); 9573942d3a8SSheetal Tigadoli #endif 9583942d3a8SSheetal Tigadoli 9593942d3a8SSheetal Tigadoli #ifdef USE_SATA 9603942d3a8SSheetal Tigadoli brcm_stingray_sata_init(); 9613942d3a8SSheetal Tigadoli #else 9623942d3a8SSheetal Tigadoli poweroff_sata_pll(); 9633942d3a8SSheetal Tigadoli #endif 9643942d3a8SSheetal Tigadoli 9653942d3a8SSheetal Tigadoli ccn_pre_init(); 9663942d3a8SSheetal Tigadoli 9673942d3a8SSheetal Tigadoli brcm_fsx_init(); 9683942d3a8SSheetal Tigadoli 9693942d3a8SSheetal Tigadoli brcm_stingray_smmu_init(); 9703942d3a8SSheetal Tigadoli 9713942d3a8SSheetal Tigadoli brcm_stingray_pka_meminit(); 9723942d3a8SSheetal Tigadoli 9733942d3a8SSheetal Tigadoli brcm_stingray_crmu_access_init(); 9743942d3a8SSheetal Tigadoli 9753942d3a8SSheetal Tigadoli brcm_stingray_scr_init(); 9763942d3a8SSheetal Tigadoli 9773942d3a8SSheetal Tigadoli brcm_stingray_hsls_tzpcprot_init(); 9783942d3a8SSheetal Tigadoli 9793942d3a8SSheetal Tigadoli #ifdef USE_I2S 9803942d3a8SSheetal Tigadoli brcm_stingray_audio_init(); 9813942d3a8SSheetal Tigadoli #endif 9823942d3a8SSheetal Tigadoli 9833942d3a8SSheetal Tigadoli ccn_post_init(); 9843942d3a8SSheetal Tigadoli 9853942d3a8SSheetal Tigadoli paxb_init(); 9863942d3a8SSheetal Tigadoli 9873942d3a8SSheetal Tigadoli paxc_init(); 9883942d3a8SSheetal Tigadoli 9893942d3a8SSheetal Tigadoli #ifndef BL31_BOOT_PRELOADED_SCP 9903942d3a8SSheetal Tigadoli crmu_init(); 9913942d3a8SSheetal Tigadoli #endif 9923942d3a8SSheetal Tigadoli 9933942d3a8SSheetal Tigadoli /* Note: this should be last thing because 9943942d3a8SSheetal Tigadoli * FS4 GPV registers only work after FS4 block 9953942d3a8SSheetal Tigadoli * (i.e. crypto,raid,cop) is out of reset. 9963942d3a8SSheetal Tigadoli */ 9973942d3a8SSheetal Tigadoli brcm_stingray_security_init(); 9983942d3a8SSheetal Tigadoli 9993942d3a8SSheetal Tigadoli brcm_gpio_pad_ns_init(); 10003942d3a8SSheetal Tigadoli 10013942d3a8SSheetal Tigadoli #ifndef USE_DDR 10023942d3a8SSheetal Tigadoli brcm_stingray_sram_ns_init(); 10033942d3a8SSheetal Tigadoli #endif 10043942d3a8SSheetal Tigadoli 10053942d3a8SSheetal Tigadoli #ifdef BL31_FORCE_CPU_FULL_FREQ 10063942d3a8SSheetal Tigadoli bcm_set_ihost_pll_freq(0x0, PLL_FREQ_FULL); 10073942d3a8SSheetal Tigadoli #endif 10083942d3a8SSheetal Tigadoli 10093942d3a8SSheetal Tigadoli brcm_stingray_gain_qspi_control(); 10103942d3a8SSheetal Tigadoli 10113942d3a8SSheetal Tigadoli #ifdef USE_PAXC 10123942d3a8SSheetal Tigadoli /* 10133942d3a8SSheetal Tigadoli * Check that the handshake has occurred and report ChiMP status. 10143942d3a8SSheetal Tigadoli * This is required. Otherwise (especially on Palladium) 10153942d3a8SSheetal Tigadoli * Linux might have booted to the pcie stage whereas 10163942d3a8SSheetal Tigadoli * ChiMP has not yet booted. Note that nic_mode case has already 10173942d3a8SSheetal Tigadoli * been considered above. 10183942d3a8SSheetal Tigadoli */ 10193942d3a8SSheetal Tigadoli if ((boot_source_get() != BOOT_SOURCE_QSPI) && 10203942d3a8SSheetal Tigadoli (!bcm_chimp_is_nic_mode()) && 10213942d3a8SSheetal Tigadoli (!bcm_chimp_wait_handshake()) 10223942d3a8SSheetal Tigadoli ) { 10233942d3a8SSheetal Tigadoli /* Does ChiMP report an error ? */ 10243942d3a8SSheetal Tigadoli uint32_t err; 10253942d3a8SSheetal Tigadoli 10263942d3a8SSheetal Tigadoli err = bcm_chimp_read_ctrl(CHIMP_REG_CTRL_BPE_STAT_REG); 10273942d3a8SSheetal Tigadoli if ((err & CHIMP_ERROR_MASK) == 0) 10283942d3a8SSheetal Tigadoli /* ChiMP has not booted yet, but no error reported */ 10293942d3a8SSheetal Tigadoli WARN("ChiMP not booted yet, but no error reported.\n"); 10303942d3a8SSheetal Tigadoli } 10313942d3a8SSheetal Tigadoli 10323942d3a8SSheetal Tigadoli #if DEBUG 10333942d3a8SSheetal Tigadoli if (boot_source_get() != BOOT_SOURCE_QSPI) 10343942d3a8SSheetal Tigadoli INFO("Current ChiMP Status: 0x%x; bpe_mod reg: 0x%x\n" 10353942d3a8SSheetal Tigadoli "fastboot register: 0x%x; handshake register 0x%x\n", 10363942d3a8SSheetal Tigadoli bcm_chimp_read_ctrl(CHIMP_REG_CTRL_BPE_STAT_REG), 10373942d3a8SSheetal Tigadoli bcm_chimp_read_ctrl(CHIMP_REG_CTRL_BPE_MODE_REG), 10383942d3a8SSheetal Tigadoli bcm_chimp_read_ctrl(CHIMP_REG_CTRL_FSTBOOT_PTR_REG), 10393942d3a8SSheetal Tigadoli bcm_chimp_read(CHIMP_REG_ECO_RESERVED)); 10403942d3a8SSheetal Tigadoli #endif /* DEBUG */ 10413942d3a8SSheetal Tigadoli #endif 10423942d3a8SSheetal Tigadoli 10433942d3a8SSheetal Tigadoli #ifdef FS4_DISABLE_CLOCK 10443942d3a8SSheetal Tigadoli flush_dcache_range( 10453942d3a8SSheetal Tigadoli PLAT_BRCM_TRUSTED_SRAM_BASE, 10463942d3a8SSheetal Tigadoli PLAT_BRCM_TRUSTED_SRAM_SIZE); 10473942d3a8SSheetal Tigadoli fs4_disable_clocks(true, true, true); 10483942d3a8SSheetal Tigadoli #endif 10493942d3a8SSheetal Tigadoli 10503942d3a8SSheetal Tigadoli /* pass information to BL33 through shared DDR region */ 10513942d3a8SSheetal Tigadoli bcm_bl33_pass_info(); 10523942d3a8SSheetal Tigadoli 10533942d3a8SSheetal Tigadoli /* 10543942d3a8SSheetal Tigadoli * We are not yet at the end of BL31, but we can stop log here so we do 10553942d3a8SSheetal Tigadoli * not need to add 'bcm_elog_exit' to the standard BL31 code. The 10563942d3a8SSheetal Tigadoli * benefit of capturing BL31 logs after this is very minimal in a 10573942d3a8SSheetal Tigadoli * production system 10583942d3a8SSheetal Tigadoli */ 10593942d3a8SSheetal Tigadoli bcm_elog_exit(); 10603942d3a8SSheetal Tigadoli 10613942d3a8SSheetal Tigadoli #if !BRCM_DISABLE_TRUSTED_WDOG 10623942d3a8SSheetal Tigadoli /* 10633942d3a8SSheetal Tigadoli * Secure watchdog was started earlier in BL2, now it's time to stop 10643942d3a8SSheetal Tigadoli * it 10653942d3a8SSheetal Tigadoli */ 10663942d3a8SSheetal Tigadoli sp805_stop(ARM_SP805_TWDG_BASE); 10673942d3a8SSheetal Tigadoli #endif 10683942d3a8SSheetal Tigadoli } 1069