1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (C) 2018 Marvell International Ltd. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * https://spdx.org/licenses 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <drivers/delay_timer.h> 9*91f16700Schasinglulu #include <lib/mmio.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <armada_common.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu /* 14*91f16700Schasinglulu * If bootrom is currently at BLE there's no need to include the memory 15*91f16700Schasinglulu * maps structure at this point 16*91f16700Schasinglulu */ 17*91f16700Schasinglulu #include <mvebu_def.h> 18*91f16700Schasinglulu #ifndef IMAGE_BLE 19*91f16700Schasinglulu 20*91f16700Schasinglulu /***************************************************************************** 21*91f16700Schasinglulu * GPIO Configuration 22*91f16700Schasinglulu ***************************************************************************** 23*91f16700Schasinglulu */ 24*91f16700Schasinglulu #define MPP_CONTROL_REGISTER 0xf2440018 25*91f16700Schasinglulu #define MPP_CONTROL_MPP_SEL_52_MASK 0xf0000 26*91f16700Schasinglulu #define GPIO_DATA_OUT1_REGISTER 0xf2440140 27*91f16700Schasinglulu #define GPIO_DATA_OUT_EN_CTRL1_REGISTER 0xf2440144 28*91f16700Schasinglulu #define GPIO52_MASK 0x100000 29*91f16700Schasinglulu 30*91f16700Schasinglulu /* Reset PCIe via GPIO number 52 */ 31*91f16700Schasinglulu int marvell_gpio_config(void) 32*91f16700Schasinglulu { 33*91f16700Schasinglulu uint32_t reg; 34*91f16700Schasinglulu 35*91f16700Schasinglulu reg = mmio_read_32(MPP_CONTROL_REGISTER); 36*91f16700Schasinglulu reg |= MPP_CONTROL_MPP_SEL_52_MASK; 37*91f16700Schasinglulu mmio_write_32(MPP_CONTROL_REGISTER, reg); 38*91f16700Schasinglulu 39*91f16700Schasinglulu reg = mmio_read_32(GPIO_DATA_OUT1_REGISTER); 40*91f16700Schasinglulu reg |= GPIO52_MASK; 41*91f16700Schasinglulu mmio_write_32(GPIO_DATA_OUT1_REGISTER, reg); 42*91f16700Schasinglulu 43*91f16700Schasinglulu reg = mmio_read_32(GPIO_DATA_OUT_EN_CTRL1_REGISTER); 44*91f16700Schasinglulu reg &= ~GPIO52_MASK; 45*91f16700Schasinglulu mmio_write_32(GPIO_DATA_OUT_EN_CTRL1_REGISTER, reg); 46*91f16700Schasinglulu udelay(100); 47*91f16700Schasinglulu 48*91f16700Schasinglulu return 0; 49*91f16700Schasinglulu } 50*91f16700Schasinglulu 51*91f16700Schasinglulu /***************************************************************************** 52*91f16700Schasinglulu * AMB Configuration 53*91f16700Schasinglulu ***************************************************************************** 54*91f16700Schasinglulu */ 55*91f16700Schasinglulu struct addr_map_win amb_memory_map[] = { 56*91f16700Schasinglulu /* CP1 SPI1 CS0 Direct Mode access */ 57*91f16700Schasinglulu {0xf900, 0x1000000, AMB_SPI1_CS0_ID}, 58*91f16700Schasinglulu }; 59*91f16700Schasinglulu 60*91f16700Schasinglulu int marvell_get_amb_memory_map(struct addr_map_win **win, uint32_t *size, 61*91f16700Schasinglulu uintptr_t base) 62*91f16700Schasinglulu { 63*91f16700Schasinglulu *win = amb_memory_map; 64*91f16700Schasinglulu if (*win == NULL) 65*91f16700Schasinglulu *size = 0; 66*91f16700Schasinglulu else 67*91f16700Schasinglulu *size = ARRAY_SIZE(amb_memory_map); 68*91f16700Schasinglulu 69*91f16700Schasinglulu return 0; 70*91f16700Schasinglulu } 71*91f16700Schasinglulu #endif 72*91f16700Schasinglulu 73*91f16700Schasinglulu /***************************************************************************** 74*91f16700Schasinglulu * IO WIN Configuration 75*91f16700Schasinglulu ***************************************************************************** 76*91f16700Schasinglulu */ 77*91f16700Schasinglulu struct addr_map_win io_win_memory_map[] = { 78*91f16700Schasinglulu /* CP1 (MCI0) internal regs */ 79*91f16700Schasinglulu {0x00000000f4000000, 0x2000000, MCI_0_TID}, 80*91f16700Schasinglulu #ifndef IMAGE_BLE 81*91f16700Schasinglulu /* PCIe0 and SPI1_CS0 (RUNIT) on CP1*/ 82*91f16700Schasinglulu {0x00000000f9000000, 0x2000000, MCI_0_TID}, 83*91f16700Schasinglulu /* PCIe1 on CP1*/ 84*91f16700Schasinglulu {0x00000000fb000000, 0x1000000, MCI_0_TID}, 85*91f16700Schasinglulu /* PCIe2 on CP1*/ 86*91f16700Schasinglulu {0x00000000fc000000, 0x1000000, MCI_0_TID}, 87*91f16700Schasinglulu /* MCI 0 indirect window */ 88*91f16700Schasinglulu {MVEBU_MCI_REG_BASE_REMAP(0), 0x100000, MCI_0_TID}, 89*91f16700Schasinglulu /* MCI 1 indirect window */ 90*91f16700Schasinglulu {MVEBU_MCI_REG_BASE_REMAP(1), 0x100000, MCI_1_TID}, 91*91f16700Schasinglulu #endif 92*91f16700Schasinglulu }; 93*91f16700Schasinglulu 94*91f16700Schasinglulu uint32_t marvell_get_io_win_gcr_target(int ap_index) 95*91f16700Schasinglulu { 96*91f16700Schasinglulu return PIDI_TID; 97*91f16700Schasinglulu } 98*91f16700Schasinglulu 99*91f16700Schasinglulu int marvell_get_io_win_memory_map(int ap_index, struct addr_map_win **win, 100*91f16700Schasinglulu uint32_t *size) 101*91f16700Schasinglulu { 102*91f16700Schasinglulu *win = io_win_memory_map; 103*91f16700Schasinglulu if (*win == NULL) 104*91f16700Schasinglulu *size = 0; 105*91f16700Schasinglulu else 106*91f16700Schasinglulu *size = ARRAY_SIZE(io_win_memory_map); 107*91f16700Schasinglulu 108*91f16700Schasinglulu return 0; 109*91f16700Schasinglulu } 110*91f16700Schasinglulu 111*91f16700Schasinglulu #ifndef IMAGE_BLE 112*91f16700Schasinglulu /***************************************************************************** 113*91f16700Schasinglulu * IOB Configuration 114*91f16700Schasinglulu ***************************************************************************** 115*91f16700Schasinglulu */ 116*91f16700Schasinglulu struct addr_map_win iob_memory_map_cp0[] = { 117*91f16700Schasinglulu /* CP0 */ 118*91f16700Schasinglulu /* PEX1_X1 window */ 119*91f16700Schasinglulu {0x00000000f7000000, 0x1000000, PEX1_TID}, 120*91f16700Schasinglulu /* PEX2_X1 window */ 121*91f16700Schasinglulu {0x00000000f8000000, 0x1000000, PEX2_TID}, 122*91f16700Schasinglulu /* PEX0_X4 window */ 123*91f16700Schasinglulu {0x00000000f6000000, 0x1000000, PEX0_TID}, 124*91f16700Schasinglulu {0x00000000c0000000, 0x30000000, PEX0_TID}, 125*91f16700Schasinglulu {0x0000000800000000, 0x100000000, PEX0_TID}, 126*91f16700Schasinglulu }; 127*91f16700Schasinglulu 128*91f16700Schasinglulu struct addr_map_win iob_memory_map_cp1[] = { 129*91f16700Schasinglulu /* CP1 */ 130*91f16700Schasinglulu /* SPI1_CS0 (RUNIT) window */ 131*91f16700Schasinglulu {0x00000000f9000000, 0x1000000, RUNIT_TID}, 132*91f16700Schasinglulu /* PEX1_X1 window */ 133*91f16700Schasinglulu {0x00000000fb000000, 0x1000000, PEX1_TID}, 134*91f16700Schasinglulu /* PEX2_X1 window */ 135*91f16700Schasinglulu {0x00000000fc000000, 0x1000000, PEX2_TID}, 136*91f16700Schasinglulu /* PEX0_X4 window */ 137*91f16700Schasinglulu {0x00000000fa000000, 0x1000000, PEX0_TID} 138*91f16700Schasinglulu }; 139*91f16700Schasinglulu 140*91f16700Schasinglulu int marvell_get_iob_memory_map(struct addr_map_win **win, uint32_t *size, 141*91f16700Schasinglulu uintptr_t base) 142*91f16700Schasinglulu { 143*91f16700Schasinglulu switch (base) { 144*91f16700Schasinglulu case MVEBU_CP_REGS_BASE(0): 145*91f16700Schasinglulu *win = iob_memory_map_cp0; 146*91f16700Schasinglulu *size = ARRAY_SIZE(iob_memory_map_cp0); 147*91f16700Schasinglulu return 0; 148*91f16700Schasinglulu case MVEBU_CP_REGS_BASE(1): 149*91f16700Schasinglulu *win = iob_memory_map_cp1; 150*91f16700Schasinglulu *size = ARRAY_SIZE(iob_memory_map_cp1); 151*91f16700Schasinglulu return 0; 152*91f16700Schasinglulu default: 153*91f16700Schasinglulu *size = 0; 154*91f16700Schasinglulu *win = 0; 155*91f16700Schasinglulu return 1; 156*91f16700Schasinglulu } 157*91f16700Schasinglulu } 158*91f16700Schasinglulu #endif 159*91f16700Schasinglulu 160*91f16700Schasinglulu /***************************************************************************** 161*91f16700Schasinglulu * CCU Configuration 162*91f16700Schasinglulu ***************************************************************************** 163*91f16700Schasinglulu */ 164*91f16700Schasinglulu struct addr_map_win ccu_memory_map[] = { 165*91f16700Schasinglulu #ifdef IMAGE_BLE 166*91f16700Schasinglulu {0x00000000f2000000, 0x4000000, IO_0_TID}, /* IO window */ 167*91f16700Schasinglulu #else 168*91f16700Schasinglulu #if LLC_SRAM 169*91f16700Schasinglulu {PLAT_MARVELL_LLC_SRAM_BASE, PLAT_MARVELL_LLC_SRAM_SIZE, SRAM_TID}, 170*91f16700Schasinglulu #endif 171*91f16700Schasinglulu {0x00000000f2000000, 0xe000000, IO_0_TID}, /* IO window */ 172*91f16700Schasinglulu {0x00000000c0000000, 0x30000000, IO_0_TID}, /* IO window */ 173*91f16700Schasinglulu {0x0000000800000000, 0x100000000, IO_0_TID}, /* IO window */ 174*91f16700Schasinglulu #endif 175*91f16700Schasinglulu }; 176*91f16700Schasinglulu 177*91f16700Schasinglulu uint32_t marvell_get_ccu_gcr_target(int ap) 178*91f16700Schasinglulu { 179*91f16700Schasinglulu return DRAM_0_TID; 180*91f16700Schasinglulu } 181*91f16700Schasinglulu 182*91f16700Schasinglulu int marvell_get_ccu_memory_map(int ap_index, struct addr_map_win **win, 183*91f16700Schasinglulu uint32_t *size) 184*91f16700Schasinglulu { 185*91f16700Schasinglulu *win = ccu_memory_map; 186*91f16700Schasinglulu *size = ARRAY_SIZE(ccu_memory_map); 187*91f16700Schasinglulu 188*91f16700Schasinglulu return 0; 189*91f16700Schasinglulu } 190*91f16700Schasinglulu 191*91f16700Schasinglulu /* In reference to #ifndef IMAGE_BLE, this part is used for BLE only. */ 192*91f16700Schasinglulu 193*91f16700Schasinglulu /***************************************************************************** 194*91f16700Schasinglulu * SKIP IMAGE Configuration 195*91f16700Schasinglulu ***************************************************************************** 196*91f16700Schasinglulu */ 197*91f16700Schasinglulu void *plat_marvell_get_skip_image_data(void) 198*91f16700Schasinglulu { 199*91f16700Schasinglulu /* No recovery button on A8k-MCBIN board */ 200*91f16700Schasinglulu return NULL; 201*91f16700Schasinglulu } 202