1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (C) 2021 Sartura Ltd. 3*91f16700Schasinglulu * Copyright (C) 2021 Globalscale technologies, Inc. 4*91f16700Schasinglulu * Copyright (C) 2021 Marvell International Ltd. 5*91f16700Schasinglulu * 6*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 7*91f16700Schasinglulu * https://spdx.org/licenses 8*91f16700Schasinglulu */ 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <arch_helpers.h> 11*91f16700Schasinglulu #include <common/debug.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <mv_ddr_if.h> 14*91f16700Schasinglulu #include <plat_marvell.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu /* 17*91f16700Schasinglulu * This function may modify the default DRAM parameters 18*91f16700Schasinglulu * based on information received from SPD or bootloader 19*91f16700Schasinglulu * configuration located on non volatile storage 20*91f16700Schasinglulu */ 21*91f16700Schasinglulu void plat_marvell_dram_update_topology(void) 22*91f16700Schasinglulu { 23*91f16700Schasinglulu } 24*91f16700Schasinglulu 25*91f16700Schasinglulu /* 26*91f16700Schasinglulu * This struct provides the DRAM training code with 27*91f16700Schasinglulu * the appropriate board DRAM configuration 28*91f16700Schasinglulu */ 29*91f16700Schasinglulu #if DDR_TOPOLOGY == 0 30*91f16700Schasinglulu static struct mv_ddr_topology_map board_topology_map_2g = { 31*91f16700Schasinglulu /* 1CS 4Gb x4 devices of Samsung K4A4G085WF */ 32*91f16700Schasinglulu DEBUG_LEVEL_ERROR, 33*91f16700Schasinglulu 0x1, /* active interfaces */ 34*91f16700Schasinglulu /* cs_mask, mirror, dqs_swap, ck_swap X subphys */ 35*91f16700Schasinglulu { { { {0x1, 0x2, 0, 0}, 36*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 37*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 38*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 39*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 40*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 41*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 42*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 43*91f16700Schasinglulu {0x1, 0x2, 0, 0} }, 44*91f16700Schasinglulu SPEED_BIN_DDR_2400R, /* speed_bin */ 45*91f16700Schasinglulu MV_DDR_DEV_WIDTH_8BIT, /* sdram device width */ 46*91f16700Schasinglulu MV_DDR_DIE_CAP_4GBIT, /* die capacity */ 47*91f16700Schasinglulu MV_DDR_FREQ_SAR, /* frequency */ 48*91f16700Schasinglulu 0, 0, /* cas_l, cas_wl */ 49*91f16700Schasinglulu MV_DDR_TEMP_LOW} }, /* temperature */ 50*91f16700Schasinglulu BUS_MASK_32BIT, /* subphys mask */ 51*91f16700Schasinglulu MV_DDR_CFG_DEFAULT, /* ddr configuration data source */ 52*91f16700Schasinglulu NOT_COMBINED, /* ddr twin-die combined*/ 53*91f16700Schasinglulu { {0} }, /* raw spd data */ 54*91f16700Schasinglulu {0}, /* timing parameters */ 55*91f16700Schasinglulu { /* electrical configuration */ 56*91f16700Schasinglulu { /* memory electrical configuration */ 57*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DISABLE, /* rtt_nom */ 58*91f16700Schasinglulu { 59*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DIV4, /* rtt_park 1cs */ 60*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DIV1 /* rtt_park 2cs */ 61*91f16700Schasinglulu }, 62*91f16700Schasinglulu { 63*91f16700Schasinglulu MV_DDR_RTT_WR_DYN_ODT_OFF, /* rtt_wr 1cs */ 64*91f16700Schasinglulu MV_DDR_RTT_WR_RZQ_DIV2 /* rtt_wr 2cs */ 65*91f16700Schasinglulu }, 66*91f16700Schasinglulu MV_DDR_DIC_RZQ_DIV7 /* dic */ 67*91f16700Schasinglulu }, 68*91f16700Schasinglulu { /* phy electrical configuration */ 69*91f16700Schasinglulu MV_DDR_OHM_30, /* data_drv_p */ 70*91f16700Schasinglulu MV_DDR_OHM_30, /* data_drv_n */ 71*91f16700Schasinglulu MV_DDR_OHM_30, /* ctrl_drv_p */ 72*91f16700Schasinglulu MV_DDR_OHM_30, /* ctrl_drv_n */ 73*91f16700Schasinglulu { 74*91f16700Schasinglulu MV_DDR_OHM_60, /* odt_p 1cs */ 75*91f16700Schasinglulu MV_DDR_OHM_120 /* odt_p 2cs */ 76*91f16700Schasinglulu }, 77*91f16700Schasinglulu { 78*91f16700Schasinglulu MV_DDR_OHM_60, /* odt_n 1cs */ 79*91f16700Schasinglulu MV_DDR_OHM_120 /* odt_n 2cs */ 80*91f16700Schasinglulu }, 81*91f16700Schasinglulu }, 82*91f16700Schasinglulu { /* mac electrical configuration */ 83*91f16700Schasinglulu MV_DDR_ODT_CFG_NORMAL, /* odtcfg_pattern */ 84*91f16700Schasinglulu MV_DDR_ODT_CFG_ALWAYS_ON, /* odtcfg_write */ 85*91f16700Schasinglulu MV_DDR_ODT_CFG_NORMAL, /* odtcfg_read */ 86*91f16700Schasinglulu }, 87*91f16700Schasinglulu } 88*91f16700Schasinglulu }; 89*91f16700Schasinglulu #endif 90*91f16700Schasinglulu 91*91f16700Schasinglulu #if DDR_TOPOLOGY == 1 92*91f16700Schasinglulu static struct mv_ddr_topology_map board_topology_map_4g = { 93*91f16700Schasinglulu /* 1CS 8Gb x4 devices of Samsung K4A8G085WC-BCTD */ 94*91f16700Schasinglulu DEBUG_LEVEL_ERROR, 95*91f16700Schasinglulu 0x1, /* active interfaces */ 96*91f16700Schasinglulu /* cs_mask, mirror, dqs_swap, ck_swap X subphys */ 97*91f16700Schasinglulu { { { {0x1, 0x2, 0, 0}, 98*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 99*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 100*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 101*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 102*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 103*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 104*91f16700Schasinglulu {0x1, 0x2, 0, 0}, 105*91f16700Schasinglulu {0x1, 0x2, 0, 0} }, 106*91f16700Schasinglulu SPEED_BIN_DDR_2400R, /* speed_bin */ 107*91f16700Schasinglulu MV_DDR_DEV_WIDTH_8BIT, /* sdram device width */ 108*91f16700Schasinglulu MV_DDR_DIE_CAP_8GBIT, /* die capacity */ 109*91f16700Schasinglulu MV_DDR_FREQ_SAR, /* frequency */ 110*91f16700Schasinglulu 0, 0, /* cas_l, cas_wl */ 111*91f16700Schasinglulu MV_DDR_TEMP_LOW} }, /* temperature */ 112*91f16700Schasinglulu BUS_MASK_32BIT, /* subphys mask */ 113*91f16700Schasinglulu MV_DDR_CFG_DEFAULT, /* ddr configuration data source */ 114*91f16700Schasinglulu NOT_COMBINED, /* ddr twin-die combined*/ 115*91f16700Schasinglulu { {0} }, /* raw spd data */ 116*91f16700Schasinglulu {0}, /* timing parameters */ 117*91f16700Schasinglulu { /* electrical configuration */ 118*91f16700Schasinglulu { /* memory electrical configuration */ 119*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DISABLE, /* rtt_nom */ 120*91f16700Schasinglulu { 121*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DIV4, /* rtt_park 1cs */ 122*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DIV1 /* rtt_park 2cs */ 123*91f16700Schasinglulu }, 124*91f16700Schasinglulu { 125*91f16700Schasinglulu MV_DDR_RTT_WR_DYN_ODT_OFF, /* rtt_wr 1cs */ 126*91f16700Schasinglulu MV_DDR_RTT_WR_RZQ_DIV2 /* rtt_wr 2cs */ 127*91f16700Schasinglulu }, 128*91f16700Schasinglulu MV_DDR_DIC_RZQ_DIV7 /* dic */ 129*91f16700Schasinglulu }, 130*91f16700Schasinglulu { /* phy electrical configuration */ 131*91f16700Schasinglulu MV_DDR_OHM_30, /* data_drv_p */ 132*91f16700Schasinglulu MV_DDR_OHM_30, /* data_drv_n */ 133*91f16700Schasinglulu MV_DDR_OHM_30, /* ctrl_drv_p */ 134*91f16700Schasinglulu MV_DDR_OHM_30, /* ctrl_drv_n */ 135*91f16700Schasinglulu { 136*91f16700Schasinglulu MV_DDR_OHM_60, /* odt_p 1cs */ 137*91f16700Schasinglulu MV_DDR_OHM_120 /* odt_p 2cs */ 138*91f16700Schasinglulu }, 139*91f16700Schasinglulu { 140*91f16700Schasinglulu MV_DDR_OHM_60, /* odt_n 1cs */ 141*91f16700Schasinglulu MV_DDR_OHM_120 /* odt_n 2cs */ 142*91f16700Schasinglulu }, 143*91f16700Schasinglulu }, 144*91f16700Schasinglulu { /* mac electrical configuration */ 145*91f16700Schasinglulu MV_DDR_ODT_CFG_NORMAL, /* odtcfg_pattern */ 146*91f16700Schasinglulu MV_DDR_ODT_CFG_ALWAYS_ON, /* odtcfg_write */ 147*91f16700Schasinglulu MV_DDR_ODT_CFG_NORMAL, /* odtcfg_read */ 148*91f16700Schasinglulu }, 149*91f16700Schasinglulu } 150*91f16700Schasinglulu }; 151*91f16700Schasinglulu #endif 152*91f16700Schasinglulu 153*91f16700Schasinglulu #if DDR_TOPOLOGY == 2 154*91f16700Schasinglulu static struct mv_ddr_topology_map board_topology_map_8g = { 155*91f16700Schasinglulu /* 2CS 8Gb x8 devices of Micron MT40A1G8WE-083E IT */ 156*91f16700Schasinglulu DEBUG_LEVEL_ERROR, 157*91f16700Schasinglulu 0x1, /* active interfaces */ 158*91f16700Schasinglulu /* cs_mask, mirror, dqs_swap, ck_swap X subphys */ 159*91f16700Schasinglulu { { { {0x3, 0x2, 0, 0}, 160*91f16700Schasinglulu {0x3, 0x2, 0, 0}, 161*91f16700Schasinglulu {0x3, 0x2, 0, 0}, 162*91f16700Schasinglulu {0x3, 0x2, 0, 0}, 163*91f16700Schasinglulu {0x3, 0x2, 0, 0}, 164*91f16700Schasinglulu {0x3, 0x2, 0, 0}, 165*91f16700Schasinglulu {0x3, 0x2, 0, 0}, 166*91f16700Schasinglulu {0x3, 0x2, 0, 0}, 167*91f16700Schasinglulu {0x3, 0x2, 0, 0} }, 168*91f16700Schasinglulu SPEED_BIN_DDR_2400R, /* speed_bin */ 169*91f16700Schasinglulu MV_DDR_DEV_WIDTH_8BIT, /* sdram device width */ 170*91f16700Schasinglulu MV_DDR_DIE_CAP_8GBIT, /* die capacity */ 171*91f16700Schasinglulu MV_DDR_FREQ_SAR, /* frequency */ 172*91f16700Schasinglulu 0, 0, /* cas_l, cas_wl */ 173*91f16700Schasinglulu MV_DDR_TEMP_LOW} }, /* temperature */ 174*91f16700Schasinglulu BUS_MASK_32BIT, /* subphys mask */ 175*91f16700Schasinglulu MV_DDR_CFG_DEFAULT, /* ddr configuration data source */ 176*91f16700Schasinglulu NOT_COMBINED, /* ddr twin-die combined*/ 177*91f16700Schasinglulu { {0} }, /* raw spd data */ 178*91f16700Schasinglulu {0}, /* timing parameters */ 179*91f16700Schasinglulu { /* electrical configuration */ 180*91f16700Schasinglulu { /* memory electrical configuration */ 181*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DISABLE, /* rtt_nom */ 182*91f16700Schasinglulu { 183*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DIV4, /* rtt_park 1cs */ 184*91f16700Schasinglulu MV_DDR_RTT_NOM_PARK_RZQ_DIV1 /* rtt_park 2cs */ 185*91f16700Schasinglulu }, 186*91f16700Schasinglulu { 187*91f16700Schasinglulu MV_DDR_RTT_WR_DYN_ODT_OFF, /* rtt_wr 1cs */ 188*91f16700Schasinglulu MV_DDR_RTT_WR_RZQ_DIV2 /* rtt_wr 2cs */ 189*91f16700Schasinglulu }, 190*91f16700Schasinglulu MV_DDR_DIC_RZQ_DIV7 /* dic */ 191*91f16700Schasinglulu }, 192*91f16700Schasinglulu { /* phy electrical configuration */ 193*91f16700Schasinglulu MV_DDR_OHM_30, /* data_drv_p */ 194*91f16700Schasinglulu MV_DDR_OHM_30, /* data_drv_n */ 195*91f16700Schasinglulu MV_DDR_OHM_30, /* ctrl_drv_p */ 196*91f16700Schasinglulu MV_DDR_OHM_30, /* ctrl_drv_n */ 197*91f16700Schasinglulu { 198*91f16700Schasinglulu MV_DDR_OHM_60, /* odt_p 1cs */ 199*91f16700Schasinglulu MV_DDR_OHM_120 /* odt_p 2cs */ 200*91f16700Schasinglulu }, 201*91f16700Schasinglulu { 202*91f16700Schasinglulu MV_DDR_OHM_60, /* odt_n 1cs */ 203*91f16700Schasinglulu MV_DDR_OHM_120 /* odt_n 2cs */ 204*91f16700Schasinglulu }, 205*91f16700Schasinglulu }, 206*91f16700Schasinglulu { /* mac electrical configuration */ 207*91f16700Schasinglulu MV_DDR_ODT_CFG_NORMAL, /* odtcfg_pattern */ 208*91f16700Schasinglulu MV_DDR_ODT_CFG_ALWAYS_ON, /* odtcfg_write */ 209*91f16700Schasinglulu MV_DDR_ODT_CFG_NORMAL, /* odtcfg_read */ 210*91f16700Schasinglulu }, 211*91f16700Schasinglulu } 212*91f16700Schasinglulu }; 213*91f16700Schasinglulu #endif 214*91f16700Schasinglulu 215*91f16700Schasinglulu struct mv_ddr_topology_map *mv_ddr_topology_map_get(void) 216*91f16700Schasinglulu { 217*91f16700Schasinglulu /* a70x0_mochabin board supports 3 DDR4 models (2G/1CS, 4G/1CS, 8G/2CS) */ 218*91f16700Schasinglulu #if DDR_TOPOLOGY == 0 219*91f16700Schasinglulu return &board_topology_map_2g; 220*91f16700Schasinglulu #elif DDR_TOPOLOGY == 1 221*91f16700Schasinglulu return &board_topology_map_4g; 222*91f16700Schasinglulu #elif DDR_TOPOLOGY == 2 223*91f16700Schasinglulu return &board_topology_map_8g; 224*91f16700Schasinglulu #else 225*91f16700Schasinglulu #error "Unknown DDR topology" 226*91f16700Schasinglulu #endif 227*91f16700Schasinglulu } 228