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