1*031542fcSKonstantin Porotchkin /* 2*031542fcSKonstantin Porotchkin * Copyright (C) 2018 Marvell International Ltd. 3*031542fcSKonstantin Porotchkin * 4*031542fcSKonstantin Porotchkin * SPDX-License-Identifier: BSD-3-Clause 5*031542fcSKonstantin Porotchkin * https://spdx.org/licenses 6*031542fcSKonstantin Porotchkin */ 7*031542fcSKonstantin Porotchkin 8*031542fcSKonstantin Porotchkin /* CP110 Marvell SoC driver */ 9*031542fcSKonstantin Porotchkin 10*031542fcSKonstantin Porotchkin #include <amb_adec.h> 11*031542fcSKonstantin Porotchkin #include <cp110_setup.h> 12*031542fcSKonstantin Porotchkin #include <debug.h> 13*031542fcSKonstantin Porotchkin #include <delay_timer.h> 14*031542fcSKonstantin Porotchkin #include <iob.h> 15*031542fcSKonstantin Porotchkin #include <plat_marvell.h> 16*031542fcSKonstantin Porotchkin 17*031542fcSKonstantin Porotchkin /* 18*031542fcSKonstantin Porotchkin * AXI Configuration. 19*031542fcSKonstantin Porotchkin */ 20*031542fcSKonstantin Porotchkin 21*031542fcSKonstantin Porotchkin /* Used for Units of CP-110 (e.g. USB device, USB Host, and etc) */ 22*031542fcSKonstantin Porotchkin #define MVEBU_AXI_ATTR_OFFSET (0x441300) 23*031542fcSKonstantin Porotchkin #define MVEBU_AXI_ATTR_REG(index) (MVEBU_AXI_ATTR_OFFSET + \ 24*031542fcSKonstantin Porotchkin 0x4 * index) 25*031542fcSKonstantin Porotchkin 26*031542fcSKonstantin Porotchkin /* AXI Protection bits */ 27*031542fcSKonstantin Porotchkin #define MVEBU_AXI_PROT_OFFSET (0x441200) 28*031542fcSKonstantin Porotchkin 29*031542fcSKonstantin Porotchkin /* AXI Protection regs */ 30*031542fcSKonstantin Porotchkin #define MVEBU_AXI_PROT_REG(index) ((index <= 4) ? \ 31*031542fcSKonstantin Porotchkin (MVEBU_AXI_PROT_OFFSET + \ 32*031542fcSKonstantin Porotchkin 0x4 * index) : \ 33*031542fcSKonstantin Porotchkin (MVEBU_AXI_PROT_OFFSET + 0x18)) 34*031542fcSKonstantin Porotchkin #define MVEBU_AXI_PROT_REGS_NUM (6) 35*031542fcSKonstantin Porotchkin 36*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFGS_OFFSET (0x441900) 37*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFG_REG(index) (MVEBU_SOC_CFGS_OFFSET + \ 38*031542fcSKonstantin Porotchkin 0x4 * index) 39*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFG_REG_NUM (0) 40*031542fcSKonstantin Porotchkin #define MVEBU_SOC_CFG_GLOG_SECURE_EN_MASK (0xE) 41*031542fcSKonstantin Porotchkin 42*031542fcSKonstantin Porotchkin /* SATA3 MBUS to AXI regs */ 43*031542fcSKonstantin Porotchkin #define MVEBU_BRIDGE_WIN_DIS_REG (MVEBU_SOC_CFGS_OFFSET + 0x10) 44*031542fcSKonstantin Porotchkin #define MVEBU_BRIDGE_WIN_DIS_OFF (0x0) 45*031542fcSKonstantin Porotchkin 46*031542fcSKonstantin Porotchkin /* SATA3 MBUS to AXI regs */ 47*031542fcSKonstantin Porotchkin #define MVEBU_SATA_M2A_AXI_PORT_CTRL_REG (0x54ff04) 48*031542fcSKonstantin Porotchkin 49*031542fcSKonstantin Porotchkin /* AXI to MBUS bridge registers */ 50*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_OFFSET (0x13ff00) 51*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_REG(win) (MVEBU_AMB_IP_OFFSET + \ 52*031542fcSKonstantin Porotchkin (win * 0x8)) 53*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_EN_OFFSET 0 54*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_EN_MASK \ 55*031542fcSKonstantin Porotchkin (0x1 << MVEBU_AMB_IP_BRIDGE_WIN_EN_OFFSET) 56*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_SIZE_OFFSET 16 57*031542fcSKonstantin Porotchkin #define MVEBU_AMB_IP_BRIDGE_WIN_SIZE_MASK \ 58*031542fcSKonstantin Porotchkin (0xffff << MVEBU_AMB_IP_BRIDGE_WIN_SIZE_OFFSET) 59*031542fcSKonstantin Porotchkin 60*031542fcSKonstantin Porotchkin #define MVEBU_SAMPLE_AT_RESET_REG (0x440600) 61*031542fcSKonstantin Porotchkin #define SAR_PCIE1_CLK_CFG_OFFSET 31 62*031542fcSKonstantin Porotchkin #define SAR_PCIE1_CLK_CFG_MASK (0x1 << SAR_PCIE1_CLK_CFG_OFFSET) 63*031542fcSKonstantin Porotchkin #define SAR_PCIE0_CLK_CFG_OFFSET 30 64*031542fcSKonstantin Porotchkin #define SAR_PCIE0_CLK_CFG_MASK (0x1 << SAR_PCIE0_CLK_CFG_OFFSET) 65*031542fcSKonstantin Porotchkin #define SAR_I2C_INIT_EN_OFFSET 24 66*031542fcSKonstantin Porotchkin #define SAR_I2C_INIT_EN_MASK (1 << SAR_I2C_INIT_EN_OFFSET) 67*031542fcSKonstantin Porotchkin 68*031542fcSKonstantin Porotchkin /******************************************************************************* 69*031542fcSKonstantin Porotchkin * PCIE clock buffer control 70*031542fcSKonstantin Porotchkin ******************************************************************************/ 71*031542fcSKonstantin Porotchkin #define MVEBU_PCIE_REF_CLK_BUF_CTRL (0x4404F0) 72*031542fcSKonstantin Porotchkin #define PCIE1_REFCLK_BUFF_SOURCE 0x800 73*031542fcSKonstantin Porotchkin #define PCIE0_REFCLK_BUFF_SOURCE 0x400 74*031542fcSKonstantin Porotchkin 75*031542fcSKonstantin Porotchkin /******************************************************************************* 76*031542fcSKonstantin Porotchkin * MSS Device Push Set Register 77*031542fcSKonstantin Porotchkin ******************************************************************************/ 78*031542fcSKonstantin Porotchkin #define MVEBU_CP_MSS_DPSHSR_REG (0x280040) 79*031542fcSKonstantin Porotchkin #define MSS_DPSHSR_REG_PCIE_CLK_SEL 0x8 80*031542fcSKonstantin Porotchkin 81*031542fcSKonstantin Porotchkin /******************************************************************************* 82*031542fcSKonstantin Porotchkin * RTC Configuration 83*031542fcSKonstantin Porotchkin ******************************************************************************/ 84*031542fcSKonstantin Porotchkin #define MVEBU_RTC_BASE (0x284000) 85*031542fcSKonstantin Porotchkin #define MVEBU_RTC_STATUS_REG (MVEBU_RTC_BASE + 0x0) 86*031542fcSKonstantin Porotchkin #define MVEBU_RTC_STATUS_ALARM1_MASK 0x1 87*031542fcSKonstantin Porotchkin #define MVEBU_RTC_STATUS_ALARM2_MASK 0x2 88*031542fcSKonstantin Porotchkin #define MVEBU_RTC_IRQ_1_CONFIG_REG (MVEBU_RTC_BASE + 0x4) 89*031542fcSKonstantin Porotchkin #define MVEBU_RTC_IRQ_2_CONFIG_REG (MVEBU_RTC_BASE + 0x8) 90*031542fcSKonstantin Porotchkin #define MVEBU_RTC_TIME_REG (MVEBU_RTC_BASE + 0xC) 91*031542fcSKonstantin Porotchkin #define MVEBU_RTC_ALARM_1_REG (MVEBU_RTC_BASE + 0x10) 92*031542fcSKonstantin Porotchkin #define MVEBU_RTC_ALARM_2_REG (MVEBU_RTC_BASE + 0x14) 93*031542fcSKonstantin Porotchkin #define MVEBU_RTC_CCR_REG (MVEBU_RTC_BASE + 0x18) 94*031542fcSKonstantin Porotchkin #define MVEBU_RTC_NOMINAL_TIMING 0x2000 95*031542fcSKonstantin Porotchkin #define MVEBU_RTC_NOMINAL_TIMING_MASK 0x7FFF 96*031542fcSKonstantin Porotchkin #define MVEBU_RTC_TEST_CONFIG_REG (MVEBU_RTC_BASE + 0x1C) 97*031542fcSKonstantin Porotchkin #define MVEBU_RTC_BRIDGE_TIMING_CTRL0_REG (MVEBU_RTC_BASE + 0x80) 98*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_PERIOD_MASK 0xFFFF 99*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_PERIOD_DEFAULT 0x3FF 100*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_SETUP_OFFS 16 101*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_SETUP_MASK 0xFFFF0000 102*031542fcSKonstantin Porotchkin #define MVEBU_RTC_WRCLK_SETUP_DEFAULT 0x29 103*031542fcSKonstantin Porotchkin #define MVEBU_RTC_BRIDGE_TIMING_CTRL1_REG (MVEBU_RTC_BASE + 0x84) 104*031542fcSKonstantin Porotchkin #define MVEBU_RTC_READ_OUTPUT_DELAY_MASK 0xFFFF 105*031542fcSKonstantin Porotchkin #define MVEBU_RTC_READ_OUTPUT_DELAY_DEFAULT 0x1F 106*031542fcSKonstantin Porotchkin 107*031542fcSKonstantin Porotchkin enum axi_attr { 108*031542fcSKonstantin Porotchkin AXI_ADUNIT_ATTR = 0, 109*031542fcSKonstantin Porotchkin AXI_COMUNIT_ATTR, 110*031542fcSKonstantin Porotchkin AXI_EIP197_ATTR, 111*031542fcSKonstantin Porotchkin AXI_USB3D_ATTR, 112*031542fcSKonstantin Porotchkin AXI_USB3H0_ATTR, 113*031542fcSKonstantin Porotchkin AXI_USB3H1_ATTR, 114*031542fcSKonstantin Porotchkin AXI_SATA0_ATTR, 115*031542fcSKonstantin Porotchkin AXI_SATA1_ATTR, 116*031542fcSKonstantin Porotchkin AXI_DAP_ATTR, 117*031542fcSKonstantin Porotchkin AXI_DFX_ATTR, 118*031542fcSKonstantin Porotchkin AXI_DBG_TRC_ATTR = 12, 119*031542fcSKonstantin Porotchkin AXI_SDIO_ATTR, 120*031542fcSKonstantin Porotchkin AXI_MSS_ATTR, 121*031542fcSKonstantin Porotchkin AXI_MAX_ATTR, 122*031542fcSKonstantin Porotchkin }; 123*031542fcSKonstantin Porotchkin 124*031542fcSKonstantin Porotchkin /* Most stream IDS are configured centrally in the CP-110 RFU 125*031542fcSKonstantin Porotchkin * but some are configured inside the unit registers 126*031542fcSKonstantin Porotchkin */ 127*031542fcSKonstantin Porotchkin #define RFU_STREAM_ID_BASE (0x450000) 128*031542fcSKonstantin Porotchkin #define USB3H_0_STREAM_ID_REG (RFU_STREAM_ID_BASE + 0xC) 129*031542fcSKonstantin Porotchkin #define USB3H_1_STREAM_ID_REG (RFU_STREAM_ID_BASE + 0x10) 130*031542fcSKonstantin Porotchkin #define SATA_0_STREAM_ID_REG (RFU_STREAM_ID_BASE + 0x14) 131*031542fcSKonstantin Porotchkin #define SATA_1_STREAM_ID_REG (RFU_STREAM_ID_BASE + 0x18) 132*031542fcSKonstantin Porotchkin 133*031542fcSKonstantin Porotchkin #define CP_DMA_0_STREAM_ID_REG (0x6B0010) 134*031542fcSKonstantin Porotchkin #define CP_DMA_1_STREAM_ID_REG (0x6D0010) 135*031542fcSKonstantin Porotchkin 136*031542fcSKonstantin Porotchkin /* We allocate IDs 128-255 for PCIe */ 137*031542fcSKonstantin Porotchkin #define MAX_STREAM_ID (0x80) 138*031542fcSKonstantin Porotchkin 139*031542fcSKonstantin Porotchkin uintptr_t stream_id_reg[] = { 140*031542fcSKonstantin Porotchkin USB3H_0_STREAM_ID_REG, 141*031542fcSKonstantin Porotchkin USB3H_1_STREAM_ID_REG, 142*031542fcSKonstantin Porotchkin CP_DMA_0_STREAM_ID_REG, 143*031542fcSKonstantin Porotchkin CP_DMA_1_STREAM_ID_REG, 144*031542fcSKonstantin Porotchkin SATA_0_STREAM_ID_REG, 145*031542fcSKonstantin Porotchkin SATA_1_STREAM_ID_REG, 146*031542fcSKonstantin Porotchkin 0 147*031542fcSKonstantin Porotchkin }; 148*031542fcSKonstantin Porotchkin 149*031542fcSKonstantin Porotchkin static void cp110_errata_wa_init(uintptr_t base) 150*031542fcSKonstantin Porotchkin { 151*031542fcSKonstantin Porotchkin uint32_t data; 152*031542fcSKonstantin Porotchkin 153*031542fcSKonstantin Porotchkin /* ERRATA GL-4076863: 154*031542fcSKonstantin Porotchkin * Reset value for global_secure_enable inputs must be changed 155*031542fcSKonstantin Porotchkin * from '1' to '0'. 156*031542fcSKonstantin Porotchkin * When asserted, only "secured" transactions can enter IHB 157*031542fcSKonstantin Porotchkin * configuration space. 158*031542fcSKonstantin Porotchkin * However, blocking AXI transactions is performed by IOB. 159*031542fcSKonstantin Porotchkin * Performing it also at IHB/HB complicates programming model. 160*031542fcSKonstantin Porotchkin * 161*031542fcSKonstantin Porotchkin * Enable non-secure access in SOC configuration register 162*031542fcSKonstantin Porotchkin */ 163*031542fcSKonstantin Porotchkin data = mmio_read_32(base + MVEBU_SOC_CFG_REG(MVEBU_SOC_CFG_REG_NUM)); 164*031542fcSKonstantin Porotchkin data &= ~MVEBU_SOC_CFG_GLOG_SECURE_EN_MASK; 165*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_SOC_CFG_REG(MVEBU_SOC_CFG_REG_NUM), data); 166*031542fcSKonstantin Porotchkin } 167*031542fcSKonstantin Porotchkin 168*031542fcSKonstantin Porotchkin static void cp110_pcie_clk_cfg(uintptr_t base) 169*031542fcSKonstantin Porotchkin { 170*031542fcSKonstantin Porotchkin uint32_t pcie0_clk, pcie1_clk, reg; 171*031542fcSKonstantin Porotchkin 172*031542fcSKonstantin Porotchkin /* 173*031542fcSKonstantin Porotchkin * Determine the pcie0/1 clock direction (input/output) from the 174*031542fcSKonstantin Porotchkin * sample at reset. 175*031542fcSKonstantin Porotchkin */ 176*031542fcSKonstantin Porotchkin reg = mmio_read_32(base + MVEBU_SAMPLE_AT_RESET_REG); 177*031542fcSKonstantin Porotchkin pcie0_clk = (reg & SAR_PCIE0_CLK_CFG_MASK) >> SAR_PCIE0_CLK_CFG_OFFSET; 178*031542fcSKonstantin Porotchkin pcie1_clk = (reg & SAR_PCIE1_CLK_CFG_MASK) >> SAR_PCIE1_CLK_CFG_OFFSET; 179*031542fcSKonstantin Porotchkin 180*031542fcSKonstantin Porotchkin /* CP110 revision A2 */ 181*031542fcSKonstantin Porotchkin if (cp110_rev_id_get(base) == MVEBU_CP110_REF_ID_A2) { 182*031542fcSKonstantin Porotchkin /* 183*031542fcSKonstantin Porotchkin * PCIe Reference Clock Buffer Control register must be 184*031542fcSKonstantin Porotchkin * set according to the clock direction (input/output) 185*031542fcSKonstantin Porotchkin */ 186*031542fcSKonstantin Porotchkin reg = mmio_read_32(base + MVEBU_PCIE_REF_CLK_BUF_CTRL); 187*031542fcSKonstantin Porotchkin reg &= ~(PCIE0_REFCLK_BUFF_SOURCE | PCIE1_REFCLK_BUFF_SOURCE); 188*031542fcSKonstantin Porotchkin if (!pcie0_clk) 189*031542fcSKonstantin Porotchkin reg |= PCIE0_REFCLK_BUFF_SOURCE; 190*031542fcSKonstantin Porotchkin if (!pcie1_clk) 191*031542fcSKonstantin Porotchkin reg |= PCIE1_REFCLK_BUFF_SOURCE; 192*031542fcSKonstantin Porotchkin 193*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_PCIE_REF_CLK_BUF_CTRL, reg); 194*031542fcSKonstantin Porotchkin } 195*031542fcSKonstantin Porotchkin 196*031542fcSKonstantin Porotchkin /* CP110 revision A1 */ 197*031542fcSKonstantin Porotchkin if (cp110_rev_id_get(base) == MVEBU_CP110_REF_ID_A1) { 198*031542fcSKonstantin Porotchkin if (!pcie0_clk || !pcie1_clk) { 199*031542fcSKonstantin Porotchkin /* 200*031542fcSKonstantin Porotchkin * if one of the pcie clocks is set to input, 201*031542fcSKonstantin Porotchkin * we need to set mss_push[131] field, otherwise, 202*031542fcSKonstantin Porotchkin * the pcie clock might not work. 203*031542fcSKonstantin Porotchkin */ 204*031542fcSKonstantin Porotchkin reg = mmio_read_32(base + MVEBU_CP_MSS_DPSHSR_REG); 205*031542fcSKonstantin Porotchkin reg |= MSS_DPSHSR_REG_PCIE_CLK_SEL; 206*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_CP_MSS_DPSHSR_REG, reg); 207*031542fcSKonstantin Porotchkin } 208*031542fcSKonstantin Porotchkin } 209*031542fcSKonstantin Porotchkin } 210*031542fcSKonstantin Porotchkin 211*031542fcSKonstantin Porotchkin /* Set a unique stream id for all DMA capable devices */ 212*031542fcSKonstantin Porotchkin static void cp110_stream_id_init(uintptr_t base, uint32_t stream_id) 213*031542fcSKonstantin Porotchkin { 214*031542fcSKonstantin Porotchkin int i = 0; 215*031542fcSKonstantin Porotchkin 216*031542fcSKonstantin Porotchkin while (stream_id_reg[i]) { 217*031542fcSKonstantin Porotchkin if (i > MAX_STREAM_ID_PER_CP) { 218*031542fcSKonstantin Porotchkin NOTICE("Only first %d (maximum) Stream IDs allocated\n", 219*031542fcSKonstantin Porotchkin MAX_STREAM_ID_PER_CP); 220*031542fcSKonstantin Porotchkin return; 221*031542fcSKonstantin Porotchkin } 222*031542fcSKonstantin Porotchkin 223*031542fcSKonstantin Porotchkin if ((stream_id_reg[i] == CP_DMA_0_STREAM_ID_REG) || 224*031542fcSKonstantin Porotchkin (stream_id_reg[i] == CP_DMA_1_STREAM_ID_REG)) 225*031542fcSKonstantin Porotchkin mmio_write_32(base + stream_id_reg[i], 226*031542fcSKonstantin Porotchkin stream_id << 16 | stream_id); 227*031542fcSKonstantin Porotchkin else 228*031542fcSKonstantin Porotchkin mmio_write_32(base + stream_id_reg[i], stream_id); 229*031542fcSKonstantin Porotchkin 230*031542fcSKonstantin Porotchkin /* SATA port 0/1 are in the same SATA unit, and they should use 231*031542fcSKonstantin Porotchkin * the same STREAM ID number 232*031542fcSKonstantin Porotchkin */ 233*031542fcSKonstantin Porotchkin if (stream_id_reg[i] != SATA_0_STREAM_ID_REG) 234*031542fcSKonstantin Porotchkin stream_id++; 235*031542fcSKonstantin Porotchkin 236*031542fcSKonstantin Porotchkin i++; 237*031542fcSKonstantin Porotchkin } 238*031542fcSKonstantin Porotchkin } 239*031542fcSKonstantin Porotchkin 240*031542fcSKonstantin Porotchkin static void cp110_axi_attr_init(uintptr_t base) 241*031542fcSKonstantin Porotchkin { 242*031542fcSKonstantin Porotchkin uint32_t index, data; 243*031542fcSKonstantin Porotchkin 244*031542fcSKonstantin Porotchkin /* Initialize AXI attributes for Armada-7K/8K SoC */ 245*031542fcSKonstantin Porotchkin 246*031542fcSKonstantin Porotchkin /* Go over the AXI attributes and set Ax-Cache and Ax-Domain */ 247*031542fcSKonstantin Porotchkin for (index = 0; index < AXI_MAX_ATTR; index++) { 248*031542fcSKonstantin Porotchkin switch (index) { 249*031542fcSKonstantin Porotchkin /* DFX and MSS unit works with no coherent only - 250*031542fcSKonstantin Porotchkin * there's no option to configure the Ax-Cache and Ax-Domain 251*031542fcSKonstantin Porotchkin */ 252*031542fcSKonstantin Porotchkin case AXI_DFX_ATTR: 253*031542fcSKonstantin Porotchkin case AXI_MSS_ATTR: 254*031542fcSKonstantin Porotchkin continue; 255*031542fcSKonstantin Porotchkin default: 256*031542fcSKonstantin Porotchkin /* Set Ax-Cache as cacheable, no allocate, modifiable, 257*031542fcSKonstantin Porotchkin * bufferable 258*031542fcSKonstantin Porotchkin * The values are different because Read & Write 259*031542fcSKonstantin Porotchkin * definition is different in Ax-Cache 260*031542fcSKonstantin Porotchkin */ 261*031542fcSKonstantin Porotchkin data = mmio_read_32(base + MVEBU_AXI_ATTR_REG(index)); 262*031542fcSKonstantin Porotchkin data &= ~MVEBU_AXI_ATTR_ARCACHE_MASK; 263*031542fcSKonstantin Porotchkin data |= (CACHE_ATTR_WRITE_ALLOC | 264*031542fcSKonstantin Porotchkin CACHE_ATTR_CACHEABLE | 265*031542fcSKonstantin Porotchkin CACHE_ATTR_BUFFERABLE) << 266*031542fcSKonstantin Porotchkin MVEBU_AXI_ATTR_ARCACHE_OFFSET; 267*031542fcSKonstantin Porotchkin data &= ~MVEBU_AXI_ATTR_AWCACHE_MASK; 268*031542fcSKonstantin Porotchkin data |= (CACHE_ATTR_READ_ALLOC | 269*031542fcSKonstantin Porotchkin CACHE_ATTR_CACHEABLE | 270*031542fcSKonstantin Porotchkin CACHE_ATTR_BUFFERABLE) << 271*031542fcSKonstantin Porotchkin MVEBU_AXI_ATTR_AWCACHE_OFFSET; 272*031542fcSKonstantin Porotchkin /* Set Ax-Domain as Outer domain */ 273*031542fcSKonstantin Porotchkin data &= ~MVEBU_AXI_ATTR_ARDOMAIN_MASK; 274*031542fcSKonstantin Porotchkin data |= DOMAIN_OUTER_SHAREABLE << 275*031542fcSKonstantin Porotchkin MVEBU_AXI_ATTR_ARDOMAIN_OFFSET; 276*031542fcSKonstantin Porotchkin data &= ~MVEBU_AXI_ATTR_AWDOMAIN_MASK; 277*031542fcSKonstantin Porotchkin data |= DOMAIN_OUTER_SHAREABLE << 278*031542fcSKonstantin Porotchkin MVEBU_AXI_ATTR_AWDOMAIN_OFFSET; 279*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_AXI_ATTR_REG(index), data); 280*031542fcSKonstantin Porotchkin } 281*031542fcSKonstantin Porotchkin } 282*031542fcSKonstantin Porotchkin 283*031542fcSKonstantin Porotchkin /* SATA IOCC supported, cache attributes 284*031542fcSKonstantin Porotchkin * for SATA MBUS to AXI configuration. 285*031542fcSKonstantin Porotchkin */ 286*031542fcSKonstantin Porotchkin data = mmio_read_32(base + MVEBU_SATA_M2A_AXI_PORT_CTRL_REG); 287*031542fcSKonstantin Porotchkin data &= ~MVEBU_SATA_M2A_AXI_AWCACHE_MASK; 288*031542fcSKonstantin Porotchkin data |= (CACHE_ATTR_WRITE_ALLOC | 289*031542fcSKonstantin Porotchkin CACHE_ATTR_CACHEABLE | 290*031542fcSKonstantin Porotchkin CACHE_ATTR_BUFFERABLE) << 291*031542fcSKonstantin Porotchkin MVEBU_SATA_M2A_AXI_AWCACHE_OFFSET; 292*031542fcSKonstantin Porotchkin data &= ~MVEBU_SATA_M2A_AXI_ARCACHE_MASK; 293*031542fcSKonstantin Porotchkin data |= (CACHE_ATTR_READ_ALLOC | 294*031542fcSKonstantin Porotchkin CACHE_ATTR_CACHEABLE | 295*031542fcSKonstantin Porotchkin CACHE_ATTR_BUFFERABLE) << 296*031542fcSKonstantin Porotchkin MVEBU_SATA_M2A_AXI_ARCACHE_OFFSET; 297*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_SATA_M2A_AXI_PORT_CTRL_REG, data); 298*031542fcSKonstantin Porotchkin 299*031542fcSKonstantin Porotchkin /* Set all IO's AXI attribute to non-secure access. */ 300*031542fcSKonstantin Porotchkin for (index = 0; index < MVEBU_AXI_PROT_REGS_NUM; index++) 301*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_AXI_PROT_REG(index), 302*031542fcSKonstantin Porotchkin DOMAIN_SYSTEM_SHAREABLE); 303*031542fcSKonstantin Porotchkin } 304*031542fcSKonstantin Porotchkin 305*031542fcSKonstantin Porotchkin static void amb_bridge_init(uintptr_t base) 306*031542fcSKonstantin Porotchkin { 307*031542fcSKonstantin Porotchkin uint32_t reg; 308*031542fcSKonstantin Porotchkin 309*031542fcSKonstantin Porotchkin /* Open AMB bridge Window to Access COMPHY/MDIO registers */ 310*031542fcSKonstantin Porotchkin reg = mmio_read_32(base + MVEBU_AMB_IP_BRIDGE_WIN_REG(0)); 311*031542fcSKonstantin Porotchkin reg &= ~(MVEBU_AMB_IP_BRIDGE_WIN_SIZE_MASK | 312*031542fcSKonstantin Porotchkin MVEBU_AMB_IP_BRIDGE_WIN_EN_MASK); 313*031542fcSKonstantin Porotchkin reg |= (0x7ff << MVEBU_AMB_IP_BRIDGE_WIN_SIZE_OFFSET) | 314*031542fcSKonstantin Porotchkin (0x1 << MVEBU_AMB_IP_BRIDGE_WIN_EN_OFFSET); 315*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_AMB_IP_BRIDGE_WIN_REG(0), reg); 316*031542fcSKonstantin Porotchkin } 317*031542fcSKonstantin Porotchkin 318*031542fcSKonstantin Porotchkin static void cp110_rtc_init(uintptr_t base) 319*031542fcSKonstantin Porotchkin { 320*031542fcSKonstantin Porotchkin /* Update MBus timing parameters before accessing RTC registers */ 321*031542fcSKonstantin Porotchkin mmio_clrsetbits_32(base + MVEBU_RTC_BRIDGE_TIMING_CTRL0_REG, 322*031542fcSKonstantin Porotchkin MVEBU_RTC_WRCLK_PERIOD_MASK, 323*031542fcSKonstantin Porotchkin MVEBU_RTC_WRCLK_PERIOD_DEFAULT); 324*031542fcSKonstantin Porotchkin 325*031542fcSKonstantin Porotchkin mmio_clrsetbits_32(base + MVEBU_RTC_BRIDGE_TIMING_CTRL0_REG, 326*031542fcSKonstantin Porotchkin MVEBU_RTC_WRCLK_SETUP_MASK, 327*031542fcSKonstantin Porotchkin MVEBU_RTC_WRCLK_SETUP_DEFAULT << 328*031542fcSKonstantin Porotchkin MVEBU_RTC_WRCLK_SETUP_OFFS); 329*031542fcSKonstantin Porotchkin 330*031542fcSKonstantin Porotchkin mmio_clrsetbits_32(base + MVEBU_RTC_BRIDGE_TIMING_CTRL1_REG, 331*031542fcSKonstantin Porotchkin MVEBU_RTC_READ_OUTPUT_DELAY_MASK, 332*031542fcSKonstantin Porotchkin MVEBU_RTC_READ_OUTPUT_DELAY_DEFAULT); 333*031542fcSKonstantin Porotchkin 334*031542fcSKonstantin Porotchkin /* 335*031542fcSKonstantin Porotchkin * Issue reset to the RTC if Clock Correction register 336*031542fcSKonstantin Porotchkin * contents did not sustain the reboot/power-on. 337*031542fcSKonstantin Porotchkin */ 338*031542fcSKonstantin Porotchkin if ((mmio_read_32(base + MVEBU_RTC_CCR_REG) & 339*031542fcSKonstantin Porotchkin MVEBU_RTC_NOMINAL_TIMING_MASK) != MVEBU_RTC_NOMINAL_TIMING) { 340*031542fcSKonstantin Porotchkin /* Reset Test register */ 341*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_TEST_CONFIG_REG, 0); 342*031542fcSKonstantin Porotchkin mdelay(500); 343*031542fcSKonstantin Porotchkin 344*031542fcSKonstantin Porotchkin /* Reset Time register */ 345*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_TIME_REG, 0); 346*031542fcSKonstantin Porotchkin udelay(62); 347*031542fcSKonstantin Porotchkin 348*031542fcSKonstantin Porotchkin /* Reset Status register */ 349*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_STATUS_REG, 350*031542fcSKonstantin Porotchkin (MVEBU_RTC_STATUS_ALARM1_MASK | 351*031542fcSKonstantin Porotchkin MVEBU_RTC_STATUS_ALARM2_MASK)); 352*031542fcSKonstantin Porotchkin udelay(62); 353*031542fcSKonstantin Porotchkin 354*031542fcSKonstantin Porotchkin /* Turn off Int1 and Int2 sources & clear the Alarm count */ 355*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_IRQ_1_CONFIG_REG, 0); 356*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_IRQ_2_CONFIG_REG, 0); 357*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_ALARM_1_REG, 0); 358*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_ALARM_2_REG, 0); 359*031542fcSKonstantin Porotchkin 360*031542fcSKonstantin Porotchkin /* Setup nominal register access timing */ 361*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_CCR_REG, 362*031542fcSKonstantin Porotchkin MVEBU_RTC_NOMINAL_TIMING); 363*031542fcSKonstantin Porotchkin 364*031542fcSKonstantin Porotchkin /* Reset Time register */ 365*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_TIME_REG, 0); 366*031542fcSKonstantin Porotchkin udelay(10); 367*031542fcSKonstantin Porotchkin 368*031542fcSKonstantin Porotchkin /* Reset Status register */ 369*031542fcSKonstantin Porotchkin mmio_write_32(base + MVEBU_RTC_STATUS_REG, 370*031542fcSKonstantin Porotchkin (MVEBU_RTC_STATUS_ALARM1_MASK | 371*031542fcSKonstantin Porotchkin MVEBU_RTC_STATUS_ALARM2_MASK)); 372*031542fcSKonstantin Porotchkin udelay(50); 373*031542fcSKonstantin Porotchkin } 374*031542fcSKonstantin Porotchkin } 375*031542fcSKonstantin Porotchkin 376*031542fcSKonstantin Porotchkin static void cp110_amb_adec_init(uintptr_t base) 377*031542fcSKonstantin Porotchkin { 378*031542fcSKonstantin Porotchkin /* enable AXI-MBUS by clearing "Bridge Windows Disable" */ 379*031542fcSKonstantin Porotchkin mmio_clrbits_32(base + MVEBU_BRIDGE_WIN_DIS_REG, 380*031542fcSKonstantin Porotchkin (1 << MVEBU_BRIDGE_WIN_DIS_OFF)); 381*031542fcSKonstantin Porotchkin 382*031542fcSKonstantin Porotchkin /* configure AXI-MBUS windows for CP */ 383*031542fcSKonstantin Porotchkin init_amb_adec(base); 384*031542fcSKonstantin Porotchkin } 385*031542fcSKonstantin Porotchkin 386*031542fcSKonstantin Porotchkin void cp110_init(uintptr_t cp110_base, uint32_t stream_id) 387*031542fcSKonstantin Porotchkin { 388*031542fcSKonstantin Porotchkin INFO("%s: Initialize CPx - base = %lx\n", __func__, cp110_base); 389*031542fcSKonstantin Porotchkin 390*031542fcSKonstantin Porotchkin /* configure IOB windows for CP0*/ 391*031542fcSKonstantin Porotchkin init_iob(cp110_base); 392*031542fcSKonstantin Porotchkin 393*031542fcSKonstantin Porotchkin /* configure AXI-MBUS windows for CP0*/ 394*031542fcSKonstantin Porotchkin cp110_amb_adec_init(cp110_base); 395*031542fcSKonstantin Porotchkin 396*031542fcSKonstantin Porotchkin /* configure axi for CP0*/ 397*031542fcSKonstantin Porotchkin cp110_axi_attr_init(cp110_base); 398*031542fcSKonstantin Porotchkin 399*031542fcSKonstantin Porotchkin /* Execute SW WA for erratas */ 400*031542fcSKonstantin Porotchkin cp110_errata_wa_init(cp110_base); 401*031542fcSKonstantin Porotchkin 402*031542fcSKonstantin Porotchkin /* Confiure pcie clock according to clock direction */ 403*031542fcSKonstantin Porotchkin cp110_pcie_clk_cfg(cp110_base); 404*031542fcSKonstantin Porotchkin 405*031542fcSKonstantin Porotchkin /* configure stream id for CP0 */ 406*031542fcSKonstantin Porotchkin cp110_stream_id_init(cp110_base, stream_id); 407*031542fcSKonstantin Porotchkin 408*031542fcSKonstantin Porotchkin /* Open AMB bridge for comphy for CP0 & CP1*/ 409*031542fcSKonstantin Porotchkin amb_bridge_init(cp110_base); 410*031542fcSKonstantin Porotchkin 411*031542fcSKonstantin Porotchkin /* Reset RTC if needed */ 412*031542fcSKonstantin Porotchkin cp110_rtc_init(cp110_base); 413*031542fcSKonstantin Porotchkin } 414*031542fcSKonstantin Porotchkin 415*031542fcSKonstantin Porotchkin /* Do the minimal setup required to configure the CP in BLE */ 416*031542fcSKonstantin Porotchkin void cp110_ble_init(uintptr_t cp110_base) 417*031542fcSKonstantin Porotchkin { 418*031542fcSKonstantin Porotchkin #if PCI_EP_SUPPORT 419*031542fcSKonstantin Porotchkin INFO("%s: Initialize CPx - base = %lx\n", __func__, cp110_base); 420*031542fcSKonstantin Porotchkin 421*031542fcSKonstantin Porotchkin amb_bridge_init(cp110_base); 422*031542fcSKonstantin Porotchkin 423*031542fcSKonstantin Porotchkin /* Configure PCIe clock */ 424*031542fcSKonstantin Porotchkin cp110_pcie_clk_cfg(cp110_base); 425*031542fcSKonstantin Porotchkin 426*031542fcSKonstantin Porotchkin /* Configure PCIe endpoint */ 427*031542fcSKonstantin Porotchkin ble_plat_pcie_ep_setup(); 428*031542fcSKonstantin Porotchkin #endif 429*031542fcSKonstantin Porotchkin } 430