1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) Marvell International Ltd. and its affiliates 4 */ 5 6 #ifndef _MV_DDR_TOPOLOGY_H 7 #define _MV_DDR_TOPOLOGY_H 8 9 #define MAX_CS_NUM 4 10 11 enum mv_ddr_speed_bin { 12 SPEED_BIN_DDR_800D, 13 SPEED_BIN_DDR_800E, 14 SPEED_BIN_DDR_1066E, 15 SPEED_BIN_DDR_1066F, 16 SPEED_BIN_DDR_1066G, 17 SPEED_BIN_DDR_1333F, 18 SPEED_BIN_DDR_1333G, 19 SPEED_BIN_DDR_1333H, 20 SPEED_BIN_DDR_1333J, 21 SPEED_BIN_DDR_1600G, 22 SPEED_BIN_DDR_1600H, 23 SPEED_BIN_DDR_1600J, 24 SPEED_BIN_DDR_1600K, 25 SPEED_BIN_DDR_1866J, 26 SPEED_BIN_DDR_1866K, 27 SPEED_BIN_DDR_1866L, 28 SPEED_BIN_DDR_1866M, 29 SPEED_BIN_DDR_2133K, 30 SPEED_BIN_DDR_2133L, 31 SPEED_BIN_DDR_2133M, 32 SPEED_BIN_DDR_2133N, 33 34 SPEED_BIN_DDR_1333H_EXT, 35 SPEED_BIN_DDR_1600K_EXT, 36 SPEED_BIN_DDR_1866M_EXT 37 }; 38 39 enum mv_ddr_freq { 40 MV_DDR_FREQ_LOW_FREQ, 41 MV_DDR_FREQ_400, 42 MV_DDR_FREQ_533, 43 MV_DDR_FREQ_667, 44 MV_DDR_FREQ_800, 45 MV_DDR_FREQ_933, 46 MV_DDR_FREQ_1066, 47 MV_DDR_FREQ_311, 48 MV_DDR_FREQ_333, 49 MV_DDR_FREQ_467, 50 MV_DDR_FREQ_850, 51 MV_DDR_FREQ_600, 52 MV_DDR_FREQ_300, 53 MV_DDR_FREQ_900, 54 MV_DDR_FREQ_360, 55 MV_DDR_FREQ_1000, 56 MV_DDR_FREQ_LAST, 57 MV_DDR_FREQ_SAR 58 }; 59 60 enum mv_ddr_speed_bin_timing { 61 SPEED_BIN_TRCD, 62 SPEED_BIN_TRP, 63 SPEED_BIN_TRAS, 64 SPEED_BIN_TRC, 65 SPEED_BIN_TRRD1K, 66 SPEED_BIN_TRRD2K, 67 SPEED_BIN_TPD, 68 SPEED_BIN_TFAW1K, 69 SPEED_BIN_TFAW2K, 70 SPEED_BIN_TWTR, 71 SPEED_BIN_TRTP, 72 SPEED_BIN_TWR, 73 SPEED_BIN_TMOD, 74 SPEED_BIN_TXPDLL, 75 SPEED_BIN_TXSDLL 76 }; 77 78 /* ddr bus masks */ 79 #define BUS_MASK_32BIT 0xf 80 #define BUS_MASK_32BIT_ECC 0x1f 81 #define BUS_MASK_16BIT 0x3 82 #define BUS_MASK_16BIT_ECC 0x13 83 #define BUS_MASK_16BIT_ECC_PUP3 0xb 84 #define MV_DDR_64BIT_BUS_MASK 0xff 85 #define MV_DDR_64BIT_ECC_PUP8_BUS_MASK 0x1ff 86 #define MV_DDR_32BIT_ECC_PUP8_BUS_MASK 0x10f 87 88 #define MV_DDR_CS_BITMASK_1CS 0x1 89 #define MV_DDR_CS_BITMASK_2CS 0x3 90 91 #define MV_DDR_ONE_SPHY_PER_DUNIT 1 92 #define MV_DDR_TWO_SPHY_PER_DUNIT 2 93 94 /* source of ddr configuration data */ 95 enum mv_ddr_cfg_src { 96 MV_DDR_CFG_DEFAULT, /* based on data in mv_ddr_topology_map structure */ 97 MV_DDR_CFG_SPD, /* based on data in spd */ 98 MV_DDR_CFG_USER, /* based on data from user */ 99 MV_DDR_CFG_STATIC, /* based on data from user in register-value format */ 100 MV_DDR_CFG_LAST 101 }; 102 103 enum mv_ddr_temperature { 104 MV_DDR_TEMP_LOW, 105 MV_DDR_TEMP_NORMAL, 106 MV_DDR_TEMP_HIGH 107 }; 108 109 enum mv_ddr_timing { 110 MV_DDR_TIM_DEFAULT, 111 MV_DDR_TIM_1T, 112 MV_DDR_TIM_2T 113 }; 114 115 enum mv_ddr_timing_data { 116 MV_DDR_TCK_AVG_MIN, /* sdram min cycle time (t ck avg min) */ 117 MV_DDR_TAA_MIN, /* min cas latency time (t aa min) */ 118 MV_DDR_TRFC1_MIN, /* min refresh recovery delay time (t rfc1 min) */ 119 MV_DDR_TWR_MIN, /* min write recovery time (t wr min) */ 120 MV_DDR_TRCD_MIN, /* min ras to cas delay time (t rcd min) */ 121 MV_DDR_TRP_MIN, /* min row precharge delay time (t rp min) */ 122 MV_DDR_TRC_MIN, /* min active to active/refresh delay time (t rc min) */ 123 MV_DDR_TRAS_MIN, /* min active to precharge delay time (t ras min) */ 124 MV_DDR_TRRD_S_MIN, /* min activate to activate delay time (t rrd_s min), diff bank group */ 125 MV_DDR_TRRD_L_MIN, /* min activate to activate delay time (t rrd_l min), same bank group */ 126 MV_DDR_TCCD_L_MIN, /* min cas to cas delay time (t ccd_l min), same bank group */ 127 MV_DDR_TFAW_MIN, /* min four activate window delay time (t faw min) */ 128 MV_DDR_TWTR_S_MIN, /* min write to read time (t wtr s min), diff bank group */ 129 MV_DDR_TWTR_L_MIN, /* min write to read time (t wtr l min), same bank group */ 130 MV_DDR_TDATA_LAST 131 }; 132 133 enum mv_ddr_electrical_data { 134 MV_DDR_CK_DLY, 135 MV_DDR_PHY_REG3, 136 MV_DDR_ZPRI_DATA, 137 MV_DDR_ZNRI_DATA, 138 MV_DDR_ZPRI_CTRL, 139 MV_DDR_ZNRI_CTRL, 140 MV_DDR_ZPODT_DATA, 141 MV_DDR_ZNODT_DATA, 142 MV_DDR_ZPODT_CTRL, 143 MV_DDR_ZNODT_CTRL, 144 MV_DDR_DIC, 145 MV_DDR_ODT_CFG, 146 MV_DDR_RTT_NOM, 147 MV_DDR_RTT_WR, 148 MV_DDR_RTT_PARK, 149 MV_DDR_EDATA_LAST 150 }; 151 152 /* memory electrical configuration values */ 153 enum mv_ddr_rtt_nom_park_evalue { 154 MV_DDR_RTT_NOM_PARK_RZQ_DISABLE, 155 MV_DDR_RTT_NOM_PARK_RZQ_DIV4, /* 60-Ohm; RZQ = 240-Ohm */ 156 MV_DDR_RTT_NOM_PARK_RZQ_DIV2, /* 120-Ohm; RZQ = 240-Ohm */ 157 MV_DDR_RTT_NOM_PARK_RZQ_DIV6, /* 40-Ohm; RZQ = 240-Ohm */ 158 MV_DDR_RTT_NOM_PARK_RZQ_DIV1, /* 240-Ohm; RZQ = 240-Ohm */ 159 MV_DDR_RTT_NOM_PARK_RZQ_DIV5, /* 48-Ohm; RZQ = 240-Ohm */ 160 MV_DDR_RTT_NOM_PARK_RZQ_DIV3, /* 80-Ohm; RZQ = 240-Ohm */ 161 MV_DDR_RTT_NOM_PARK_RZQ_DIV7, /* 34-Ohm; RZQ = 240-Ohm */ 162 MV_DDR_RTT_NOM_PARK_RZQ_LAST 163 }; 164 165 enum mv_ddr_rtt_wr_evalue { 166 MV_DDR_RTT_WR_DYN_ODT_OFF, 167 MV_DDR_RTT_WR_RZQ_DIV2, /* 120-Ohm; RZQ = 240-Ohm */ 168 MV_DDR_RTT_WR_RZQ_DIV1, /* 240-Ohm; RZQ = 240-Ohm */ 169 MV_DDR_RTT_WR_HIZ, 170 MV_DDR_RTT_WR_RZQ_DIV3, /* 80-Ohm; RZQ = 240-Ohm */ 171 MV_DDR_RTT_WR_RZQ_LAST 172 }; 173 174 enum mv_ddr_dic_evalue { 175 MV_DDR_DIC_RZQ_DIV7, /* 34-Ohm; RZQ = 240-Ohm */ 176 MV_DDR_DIC_RZQ_DIV5, /* 48-Ohm; RZQ = 240-Ohm */ 177 MV_DDR_DIC_RZQ_LAST 178 }; 179 180 /* phy electrical configuration values */ 181 enum mv_ddr_ohm_evalue { 182 MV_DDR_OHM_20 = 20,/*relevant for Synopsys C/A Drive strength only*/ 183 MV_DDR_OHM_30 = 30, 184 MV_DDR_OHM_40 = 40,/*relevant for Synopsys C/A Drive strength only*/ 185 MV_DDR_OHM_48 = 48, 186 MV_DDR_OHM_60 = 60, 187 MV_DDR_OHM_80 = 80, 188 MV_DDR_OHM_120 = 120, 189 MV_DDR_OHM_240 = 240, 190 MV_DDR_OHM_LAST 191 }; 192 193 /* mac electrical configuration values */ 194 enum mv_ddr_odt_cfg_evalue { 195 MV_DDR_ODT_CFG_NORMAL, 196 MV_DDR_ODT_CFG_ALWAYS_ON, 197 MV_DDR_ODT_CFG_LAST 198 }; 199 200 enum mv_ddr_dev_width { /* sdram device width */ 201 MV_DDR_DEV_WIDTH_4BIT, 202 MV_DDR_DEV_WIDTH_8BIT, 203 MV_DDR_DEV_WIDTH_16BIT, 204 MV_DDR_DEV_WIDTH_32BIT, 205 MV_DDR_DEV_WIDTH_LAST 206 }; 207 208 enum mv_ddr_die_capacity { /* total sdram capacity per die, megabits */ 209 MV_DDR_DIE_CAP_256MBIT, 210 MV_DDR_DIE_CAP_512MBIT = 0, 211 MV_DDR_DIE_CAP_1GBIT, 212 MV_DDR_DIE_CAP_2GBIT, 213 MV_DDR_DIE_CAP_4GBIT, 214 MV_DDR_DIE_CAP_8GBIT, 215 MV_DDR_DIE_CAP_16GBIT, 216 MV_DDR_DIE_CAP_32GBIT, 217 MV_DDR_DIE_CAP_12GBIT, 218 MV_DDR_DIE_CAP_24GBIT, 219 MV_DDR_DIE_CAP_LAST 220 }; 221 222 enum mv_ddr_pkg_rank { /* number of package ranks per dimm */ 223 MV_DDR_PKG_RANK_1, 224 MV_DDR_PKG_RANK_2, 225 MV_DDR_PKG_RANK_3, 226 MV_DDR_PKG_RANK_4, 227 MV_DDR_PKG_RANK_5, 228 MV_DDR_PKG_RANK_6, 229 MV_DDR_PKG_RANK_7, 230 MV_DDR_PKG_RANK_8, 231 MV_DDR_PKG_RANK_LAST 232 }; 233 234 enum mv_ddr_pri_bus_width { /* number of primary bus width bits */ 235 MV_DDR_PRI_BUS_WIDTH_8, 236 MV_DDR_PRI_BUS_WIDTH_16, 237 MV_DDR_PRI_BUS_WIDTH_32, 238 MV_DDR_PRI_BUS_WIDTH_64, 239 MV_DDR_PRI_BUS_WIDTH_LAST 240 }; 241 242 enum mv_ddr_bus_width_ext { /* number of extension bus width bits */ 243 MV_DDR_BUS_WIDTH_EXT_0, 244 MV_DDR_BUS_WIDTH_EXT_8, 245 MV_DDR_BUS_WIDTH_EXT_LAST 246 }; 247 248 enum mv_ddr_die_count { 249 MV_DDR_DIE_CNT_1, 250 MV_DDR_DIE_CNT_2, 251 MV_DDR_DIE_CNT_3, 252 MV_DDR_DIE_CNT_4, 253 MV_DDR_DIE_CNT_5, 254 MV_DDR_DIE_CNT_6, 255 MV_DDR_DIE_CNT_7, 256 MV_DDR_DIE_CNT_8, 257 MV_DDR_DIE_CNT_LAST 258 }; 259 260 #define IS_ACTIVE(mask, id) \ 261 ((mask) & (1 << (id))) 262 263 #define VALIDATE_ACTIVE(mask, id) \ 264 { \ 265 if (IS_ACTIVE(mask, id) == 0) \ 266 continue; \ 267 } 268 269 #define IS_IF_ACTIVE(if_mask, if_id) \ 270 ((if_mask) & (1 << (if_id))) 271 272 #define VALIDATE_IF_ACTIVE(mask, id) \ 273 { \ 274 if (IS_IF_ACTIVE(mask, id) == 0) \ 275 continue; \ 276 } 277 278 #define IS_BUS_ACTIVE(if_mask , if_id) \ 279 (((if_mask) >> (if_id)) & 1) 280 281 #define VALIDATE_BUS_ACTIVE(mask, id) \ 282 { \ 283 if (IS_BUS_ACTIVE(mask, id) == 0) \ 284 continue; \ 285 } 286 287 #define DDR3_IS_ECC_PUP3_MODE(if_mask) \ 288 (((if_mask) == BUS_MASK_16BIT_ECC_PUP3) ? 1 : 0) 289 290 #define DDR3_IS_ECC_PUP4_MODE(if_mask) \ 291 (((if_mask) == BUS_MASK_32BIT_ECC || \ 292 (if_mask) == BUS_MASK_16BIT_ECC) ? 1 : 0) 293 294 #define DDR3_IS_16BIT_DRAM_MODE(mask) \ 295 (((mask) == BUS_MASK_16BIT || \ 296 (mask) == BUS_MASK_16BIT_ECC || \ 297 (mask) == BUS_MASK_16BIT_ECC_PUP3) ? 1 : 0) 298 299 #define DDR3_IS_ECC_PUP8_MODE(if_mask) \ 300 (((if_mask) == MV_DDR_32BIT_ECC_PUP8_BUS_MASK || \ 301 (if_mask) == MV_DDR_64BIT_ECC_PUP8_BUS_MASK) ? 1 : 0) 302 303 #define MV_DDR_IS_64BIT_DRAM_MODE(mask) \ 304 ((((mask) & MV_DDR_64BIT_BUS_MASK) == MV_DDR_64BIT_BUS_MASK) || \ 305 (((mask) & MV_DDR_64BIT_ECC_PUP8_BUS_MASK) == MV_DDR_64BIT_ECC_PUP8_BUS_MASK) ? 1 : 0) 306 307 #define MV_DDR_IS_32BIT_IN_64BIT_DRAM_MODE(mask, sphys) \ 308 (((sphys) == 9) && \ 309 (((mask) == BUS_MASK_32BIT) || \ 310 ((mask) == MV_DDR_32BIT_ECC_PUP8_BUS_MASK)) ? 1 : 0) 311 312 #define MV_DDR_IS_HALF_BUS_DRAM_MODE(mask, sphys) \ 313 (MV_DDR_IS_32BIT_IN_64BIT_DRAM_MODE(mask, sphys) || \ 314 DDR3_IS_16BIT_DRAM_MODE(mask)) 315 316 struct mv_ddr_topology_map *mv_ddr_topology_map_get(void); 317 unsigned int mv_ddr_cl_calc(unsigned int taa_min, unsigned int tclk); 318 unsigned int mv_ddr_cwl_calc(unsigned int tclk); 319 int mv_ddr_topology_map_update(void); 320 unsigned short mv_ddr_bus_bit_mask_get(void); 321 unsigned int mv_ddr_if_bus_width_get(void); 322 unsigned int mv_ddr_cs_num_get(void); 323 int mv_ddr_is_ecc_ena(void); 324 int mv_ddr_ck_delay_get(void); 325 unsigned long long mv_ddr_mem_sz_per_cs_get(void); 326 unsigned long long mv_ddr_mem_sz_get(void); 327 unsigned int mv_ddr_rtt_nom_get(void); 328 unsigned int mv_ddr_rtt_park_get(void); 329 unsigned int mv_ddr_rtt_wr_get(void); 330 unsigned int mv_ddr_dic_get(void); 331 332 #endif /* _MV_DDR_TOPOLOGY_H */ 333