134e026f9SYork Sun /* 2c0c32af0SYork Sun * Copyright 2014-2016 Freescale Semiconductor, Inc. 3c0c32af0SYork Sun * Copyright 2017-2018 NXP Semiconductor 4c0c32af0SYork Sun * 5c0c32af0SYork Sun * SPDX-License-Identifier: GPL-2.0+ 634e026f9SYork Sun * 734e026f9SYork Sun * calculate the organization and timing parameter 834e026f9SYork Sun * from ddr3 spd, please refer to the spec 934e026f9SYork Sun * JEDEC standard No.21-C 4_01_02_12R23A.pdf 1034e026f9SYork Sun * 1134e026f9SYork Sun * 1234e026f9SYork Sun */ 1334e026f9SYork Sun 1434e026f9SYork Sun #include <common.h> 1534e026f9SYork Sun #include <fsl_ddr_sdram.h> 1634e026f9SYork Sun 1734e026f9SYork Sun #include <fsl_ddr.h> 1834e026f9SYork Sun 1934e026f9SYork Sun /* 2034e026f9SYork Sun * Calculate the Density of each Physical Rank. 2134e026f9SYork Sun * Returned size is in bytes. 2234e026f9SYork Sun * 2334e026f9SYork Sun * Total DIMM size = 2434e026f9SYork Sun * sdram capacity(bit) / 8 * primary bus width / sdram width 2534e026f9SYork Sun * * Logical Ranks per DIMM 2634e026f9SYork Sun * 2734e026f9SYork Sun * where: sdram capacity = spd byte4[3:0] 2834e026f9SYork Sun * primary bus width = spd byte13[2:0] 2934e026f9SYork Sun * sdram width = spd byte12[2:0] 3034e026f9SYork Sun * Logical Ranks per DIMM = spd byte12[5:3] for SDP, DDP, QDP 3134e026f9SYork Sun * spd byte12{5:3] * spd byte6[6:4] for 3DS 3234e026f9SYork Sun * 3334e026f9SYork Sun * To simplify each rank size = total DIMM size / Number of Package Ranks 3434e026f9SYork Sun * where Number of Package Ranks = spd byte12[5:3] 3534e026f9SYork Sun * 3634e026f9SYork Sun * SPD byte4 - sdram density and banks 3734e026f9SYork Sun * bit[3:0] size(bit) size(byte) 3834e026f9SYork Sun * 0000 256Mb 32MB 3934e026f9SYork Sun * 0001 512Mb 64MB 4034e026f9SYork Sun * 0010 1Gb 128MB 4134e026f9SYork Sun * 0011 2Gb 256MB 4234e026f9SYork Sun * 0100 4Gb 512MB 4334e026f9SYork Sun * 0101 8Gb 1GB 4434e026f9SYork Sun * 0110 16Gb 2GB 4534e026f9SYork Sun * 0111 32Gb 4GB 4634e026f9SYork Sun * 4734e026f9SYork Sun * SPD byte13 - module memory bus width 4834e026f9SYork Sun * bit[2:0] primary bus width 4934e026f9SYork Sun * 000 8bits 5034e026f9SYork Sun * 001 16bits 5134e026f9SYork Sun * 010 32bits 5234e026f9SYork Sun * 011 64bits 5334e026f9SYork Sun * 5434e026f9SYork Sun * SPD byte12 - module organization 5534e026f9SYork Sun * bit[2:0] sdram device width 5634e026f9SYork Sun * 000 4bits 5734e026f9SYork Sun * 001 8bits 5834e026f9SYork Sun * 010 16bits 5934e026f9SYork Sun * 011 32bits 6034e026f9SYork Sun * 6134e026f9SYork Sun * SPD byte12 - module organization 6234e026f9SYork Sun * bit[5:3] number of package ranks per DIMM 6334e026f9SYork Sun * 000 1 6434e026f9SYork Sun * 001 2 6534e026f9SYork Sun * 010 3 6634e026f9SYork Sun * 011 4 6734e026f9SYork Sun * 6834e026f9SYork Sun * SPD byte6 - SDRAM package type 6934e026f9SYork Sun * bit[6:4] Die count 7034e026f9SYork Sun * 000 1 7134e026f9SYork Sun * 001 2 7234e026f9SYork Sun * 010 3 7334e026f9SYork Sun * 011 4 7434e026f9SYork Sun * 100 5 7534e026f9SYork Sun * 101 6 7634e026f9SYork Sun * 110 7 7734e026f9SYork Sun * 111 8 7834e026f9SYork Sun * 7934e026f9SYork Sun * SPD byte6 - SRAM package type 8034e026f9SYork Sun * bit[1:0] Signal loading 8134e026f9SYork Sun * 00 Not specified 8234e026f9SYork Sun * 01 Multi load stack 8334e026f9SYork Sun * 10 Sigle load stack (3DS) 8434e026f9SYork Sun * 11 Reserved 8534e026f9SYork Sun */ 8634e026f9SYork Sun static unsigned long long 8734e026f9SYork Sun compute_ranksize(const struct ddr4_spd_eeprom_s *spd) 8834e026f9SYork Sun { 8934e026f9SYork Sun unsigned long long bsize; 9034e026f9SYork Sun 9134e026f9SYork Sun int nbit_sdram_cap_bsize = 0; 9234e026f9SYork Sun int nbit_primary_bus_width = 0; 9334e026f9SYork Sun int nbit_sdram_width = 0; 9434e026f9SYork Sun int die_count = 0; 9534e026f9SYork Sun bool package_3ds; 9634e026f9SYork Sun 9734e026f9SYork Sun if ((spd->density_banks & 0xf) <= 7) 9834e026f9SYork Sun nbit_sdram_cap_bsize = (spd->density_banks & 0xf) + 28; 9934e026f9SYork Sun if ((spd->bus_width & 0x7) < 4) 10034e026f9SYork Sun nbit_primary_bus_width = (spd->bus_width & 0x7) + 3; 10134e026f9SYork Sun if ((spd->organization & 0x7) < 4) 10234e026f9SYork Sun nbit_sdram_width = (spd->organization & 0x7) + 2; 10334e026f9SYork Sun package_3ds = (spd->package_type & 0x3) == 0x2; 104c0c32af0SYork Sun if ((spd->package_type & 0x80) && !package_3ds) { /* other than 3DS */ 105c0c32af0SYork Sun printf("Warning: not supported SDRAM package type\n"); 106c0c32af0SYork Sun return 0; 107c0c32af0SYork Sun } 10834e026f9SYork Sun if (package_3ds) 10934e026f9SYork Sun die_count = (spd->package_type >> 4) & 0x7; 11034e026f9SYork Sun 11134e026f9SYork Sun bsize = 1ULL << (nbit_sdram_cap_bsize - 3 + 11234e026f9SYork Sun nbit_primary_bus_width - nbit_sdram_width + 11334e026f9SYork Sun die_count); 11434e026f9SYork Sun 115c0c32af0SYork Sun debug("DDR: DDR rank density = 0x%16llx\n", bsize); 11634e026f9SYork Sun 11734e026f9SYork Sun return bsize; 11834e026f9SYork Sun } 11934e026f9SYork Sun 12034e026f9SYork Sun #define spd_to_ps(mtb, ftb) \ 12134e026f9SYork Sun (mtb * pdimm->mtb_ps + (ftb * pdimm->ftb_10th_ps) / 10) 12234e026f9SYork Sun /* 1231d71efbbSYork Sun * ddr_compute_dimm_parameters for DDR4 SPD 12434e026f9SYork Sun * 12534e026f9SYork Sun * Compute DIMM parameters based upon the SPD information in spd. 12634e026f9SYork Sun * Writes the results to the dimm_params_t structure pointed by pdimm. 12734e026f9SYork Sun * 12834e026f9SYork Sun */ 12903e664d8SYork Sun unsigned int ddr_compute_dimm_parameters(const unsigned int ctrl_num, 13003e664d8SYork Sun const generic_spd_eeprom_t *spd, 13134e026f9SYork Sun dimm_params_t *pdimm, 13234e026f9SYork Sun unsigned int dimm_number) 13334e026f9SYork Sun { 13434e026f9SYork Sun unsigned int retval; 13534e026f9SYork Sun int i; 136789b3447SYork Sun const u8 udimm_rc_e_dq[18] = { 137789b3447SYork Sun 0x0c, 0x2c, 0x15, 0x35, 0x15, 0x35, 0x0b, 0x2c, 0x15, 138789b3447SYork Sun 0x35, 0x0b, 0x35, 0x0b, 0x2c, 0x0b, 0x35, 0x15, 0x36 139789b3447SYork Sun }; 140789b3447SYork Sun int spd_error = 0; 141789b3447SYork Sun u8 *ptr; 142*564e9383SYork Sun u8 val; 14334e026f9SYork Sun 14434e026f9SYork Sun if (spd->mem_type) { 14534e026f9SYork Sun if (spd->mem_type != SPD_MEMTYPE_DDR4) { 1466b95be22SYork Sun printf("Ctrl %u DIMM %u: is not a DDR4 SPD.\n", 1476b95be22SYork Sun ctrl_num, dimm_number); 14834e026f9SYork Sun return 1; 14934e026f9SYork Sun } 15034e026f9SYork Sun } else { 15134e026f9SYork Sun memset(pdimm, 0, sizeof(dimm_params_t)); 15234e026f9SYork Sun return 1; 15334e026f9SYork Sun } 15434e026f9SYork Sun 15534e026f9SYork Sun retval = ddr4_spd_check(spd); 15634e026f9SYork Sun if (retval) { 15734e026f9SYork Sun printf("DIMM %u: failed checksum\n", dimm_number); 15834e026f9SYork Sun return 2; 15934e026f9SYork Sun } 16034e026f9SYork Sun 16134e026f9SYork Sun /* 16234e026f9SYork Sun * The part name in ASCII in the SPD EEPROM is not null terminated. 16334e026f9SYork Sun * Guarantee null termination here by presetting all bytes to 0 16434e026f9SYork Sun * and copying the part name in ASCII from the SPD onto it 16534e026f9SYork Sun */ 16634e026f9SYork Sun memset(pdimm->mpart, 0, sizeof(pdimm->mpart)); 16734e026f9SYork Sun if ((spd->info_size_crc & 0xF) > 2) 16834e026f9SYork Sun memcpy(pdimm->mpart, spd->mpart, sizeof(pdimm->mpart) - 1); 16934e026f9SYork Sun 17034e026f9SYork Sun /* DIMM organization parameters */ 17134e026f9SYork Sun pdimm->n_ranks = ((spd->organization >> 3) & 0x7) + 1; 17234e026f9SYork Sun pdimm->rank_density = compute_ranksize(spd); 17334e026f9SYork Sun pdimm->capacity = pdimm->n_ranks * pdimm->rank_density; 174c0c32af0SYork Sun pdimm->die_density = spd->density_banks & 0xf; 17534e026f9SYork Sun pdimm->primary_sdram_width = 1 << (3 + (spd->bus_width & 0x7)); 17634e026f9SYork Sun if ((spd->bus_width >> 3) & 0x3) 17734e026f9SYork Sun pdimm->ec_sdram_width = 8; 17834e026f9SYork Sun else 17934e026f9SYork Sun pdimm->ec_sdram_width = 0; 18034e026f9SYork Sun pdimm->data_width = pdimm->primary_sdram_width 18134e026f9SYork Sun + pdimm->ec_sdram_width; 18234e026f9SYork Sun pdimm->device_width = 1 << ((spd->organization & 0x7) + 2); 183c0c32af0SYork Sun pdimm->package_3ds = (spd->package_type & 0x3) == 0x2 ? 184c0c32af0SYork Sun (spd->package_type >> 4) & 0x7 : 0; 18534e026f9SYork Sun 1861d71efbbSYork Sun /* These are the types defined by the JEDEC SPD spec */ 18734e026f9SYork Sun pdimm->mirrored_dimm = 0; 18834e026f9SYork Sun pdimm->registered_dimm = 0; 1891d71efbbSYork Sun switch (spd->module_type & DDR4_SPD_MODULETYPE_MASK) { 1901d71efbbSYork Sun case DDR4_SPD_MODULETYPE_RDIMM: 19134e026f9SYork Sun /* Registered/buffered DIMMs */ 19234e026f9SYork Sun pdimm->registered_dimm = 1; 193426230a6SYork Sun if (spd->mod_section.registered.reg_map & 0x1) 194426230a6SYork Sun pdimm->mirrored_dimm = 1; 195*564e9383SYork Sun val = spd->mod_section.registered.ca_stren; 196*564e9383SYork Sun pdimm->rcw[3] = val >> 4; 197*564e9383SYork Sun pdimm->rcw[4] = ((val & 0x3) << 2) | ((val & 0xc) >> 2); 198*564e9383SYork Sun val = spd->mod_section.registered.clk_stren; 199*564e9383SYork Sun pdimm->rcw[5] = ((val & 0x3) << 2) | ((val & 0xc) >> 2); 200*564e9383SYork Sun /* Not all in SPD. For convience only. Boards may overwrite. */ 201*564e9383SYork Sun pdimm->rcw[6] = 0xf; 202*564e9383SYork Sun /* 203*564e9383SYork Sun * A17 only used for 16Gb and above devices. 204*564e9383SYork Sun * C[2:0] only used for 3DS. 205*564e9383SYork Sun */ 206*564e9383SYork Sun pdimm->rcw[8] = pdimm->die_density >= 0x6 ? 0x0 : 0x8 | 207*564e9383SYork Sun (pdimm->package_3ds > 0x3 ? 0x0 : 208*564e9383SYork Sun (pdimm->package_3ds > 0x1 ? 0x1 : 209*564e9383SYork Sun (pdimm->package_3ds > 0 ? 0x2 : 0x3))); 210*564e9383SYork Sun if (pdimm->package_3ds || pdimm->n_ranks != 4) 211*564e9383SYork Sun pdimm->rcw[13] = 0xc; 212*564e9383SYork Sun else 213*564e9383SYork Sun pdimm->rcw[13] = 0xd; /* Fix encoded by board */ 214*564e9383SYork Sun 21534e026f9SYork Sun break; 21634e026f9SYork Sun 2171d71efbbSYork Sun case DDR4_SPD_MODULETYPE_UDIMM: 2181d71efbbSYork Sun case DDR4_SPD_MODULETYPE_SO_DIMM: 21934e026f9SYork Sun /* Unbuffered DIMMs */ 22034e026f9SYork Sun if (spd->mod_section.unbuffered.addr_mapping & 0x1) 22134e026f9SYork Sun pdimm->mirrored_dimm = 1; 222789b3447SYork Sun if ((spd->mod_section.unbuffered.mod_height & 0xe0) == 0 && 223789b3447SYork Sun (spd->mod_section.unbuffered.ref_raw_card == 0x04)) { 224789b3447SYork Sun /* Fix SPD error found on DIMMs with raw card E0 */ 225789b3447SYork Sun for (i = 0; i < 18; i++) { 226789b3447SYork Sun if (spd->mapping[i] == udimm_rc_e_dq[i]) 227789b3447SYork Sun continue; 228789b3447SYork Sun spd_error = 1; 229789b3447SYork Sun debug("SPD byte %d: 0x%x, should be 0x%x\n", 230789b3447SYork Sun 60 + i, spd->mapping[i], 231789b3447SYork Sun udimm_rc_e_dq[i]); 232789b3447SYork Sun ptr = (u8 *)&spd->mapping[i]; 233789b3447SYork Sun *ptr = udimm_rc_e_dq[i]; 234789b3447SYork Sun } 235789b3447SYork Sun if (spd_error) 236789b3447SYork Sun puts("SPD DQ mapping error fixed\n"); 237789b3447SYork Sun } 23834e026f9SYork Sun break; 23934e026f9SYork Sun 24034e026f9SYork Sun default: 24134e026f9SYork Sun printf("unknown module_type 0x%02X\n", spd->module_type); 24234e026f9SYork Sun return 1; 24334e026f9SYork Sun } 24434e026f9SYork Sun 24534e026f9SYork Sun /* SDRAM device parameters */ 24634e026f9SYork Sun pdimm->n_row_addr = ((spd->addressing >> 3) & 0x7) + 12; 24734e026f9SYork Sun pdimm->n_col_addr = (spd->addressing & 0x7) + 9; 24834e026f9SYork Sun pdimm->bank_addr_bits = (spd->density_banks >> 4) & 0x3; 24934e026f9SYork Sun pdimm->bank_group_bits = (spd->density_banks >> 6) & 0x3; 25034e026f9SYork Sun 25134e026f9SYork Sun /* 25234e026f9SYork Sun * The SPD spec has not the ECC bit, 25334e026f9SYork Sun * We consider the DIMM as ECC capability 25434e026f9SYork Sun * when the extension bus exist 25534e026f9SYork Sun */ 25634e026f9SYork Sun if (pdimm->ec_sdram_width) 25734e026f9SYork Sun pdimm->edc_config = 0x02; 25834e026f9SYork Sun else 25934e026f9SYork Sun pdimm->edc_config = 0x00; 26034e026f9SYork Sun 26134e026f9SYork Sun /* 26234e026f9SYork Sun * The SPD spec has not the burst length byte 26334e026f9SYork Sun * but DDR4 spec has nature BL8 and BC4, 26434e026f9SYork Sun * BL8 -bit3, BC4 -bit2 26534e026f9SYork Sun */ 26634e026f9SYork Sun pdimm->burst_lengths_bitmask = 0x0c; 26734e026f9SYork Sun pdimm->row_density = __ilog2(pdimm->rank_density); 26834e026f9SYork Sun 26934e026f9SYork Sun /* MTB - medium timebase 27034e026f9SYork Sun * The MTB in the SPD spec is 125ps, 27134e026f9SYork Sun * 27234e026f9SYork Sun * FTB - fine timebase 27334e026f9SYork Sun * use 1/10th of ps as our unit to avoid floating point 27434e026f9SYork Sun * eg, 10 for 1ps, 25 for 2.5ps, 50 for 5ps 27534e026f9SYork Sun */ 27634e026f9SYork Sun if ((spd->timebases & 0xf) == 0x0) { 27734e026f9SYork Sun pdimm->mtb_ps = 125; 27834e026f9SYork Sun pdimm->ftb_10th_ps = 10; 27934e026f9SYork Sun 28034e026f9SYork Sun } else { 28134e026f9SYork Sun printf("Unknown Timebases\n"); 28234e026f9SYork Sun } 28334e026f9SYork Sun 28434e026f9SYork Sun /* sdram minimum cycle time */ 28534e026f9SYork Sun pdimm->tckmin_x_ps = spd_to_ps(spd->tck_min, spd->fine_tck_min); 28634e026f9SYork Sun 28734e026f9SYork Sun /* sdram max cycle time */ 28834e026f9SYork Sun pdimm->tckmax_ps = spd_to_ps(spd->tck_max, spd->fine_tck_max); 28934e026f9SYork Sun 29034e026f9SYork Sun /* 29134e026f9SYork Sun * CAS latency supported 29234e026f9SYork Sun * bit0 - CL7 29334e026f9SYork Sun * bit4 - CL11 29434e026f9SYork Sun * bit8 - CL15 29534e026f9SYork Sun * bit12- CL19 29634e026f9SYork Sun * bit16- CL23 29734e026f9SYork Sun */ 29834e026f9SYork Sun pdimm->caslat_x = (spd->caslat_b1 << 7) | 29934e026f9SYork Sun (spd->caslat_b2 << 15) | 30034e026f9SYork Sun (spd->caslat_b3 << 23); 30134e026f9SYork Sun 30234e026f9SYork Sun BUG_ON(spd->caslat_b4 != 0); 30334e026f9SYork Sun 30434e026f9SYork Sun /* 30534e026f9SYork Sun * min CAS latency time 30634e026f9SYork Sun */ 30734e026f9SYork Sun pdimm->taa_ps = spd_to_ps(spd->taa_min, spd->fine_taa_min); 30834e026f9SYork Sun 30934e026f9SYork Sun /* 31034e026f9SYork Sun * min RAS to CAS delay time 31134e026f9SYork Sun */ 31234e026f9SYork Sun pdimm->trcd_ps = spd_to_ps(spd->trcd_min, spd->fine_trcd_min); 31334e026f9SYork Sun 31434e026f9SYork Sun /* 31534e026f9SYork Sun * Min Row Precharge Delay Time 31634e026f9SYork Sun */ 31734e026f9SYork Sun pdimm->trp_ps = spd_to_ps(spd->trp_min, spd->fine_trp_min); 31834e026f9SYork Sun 31934e026f9SYork Sun /* min active to precharge delay time */ 32034e026f9SYork Sun pdimm->tras_ps = (((spd->tras_trc_ext & 0xf) << 8) + 32134e026f9SYork Sun spd->tras_min_lsb) * pdimm->mtb_ps; 32234e026f9SYork Sun 32334e026f9SYork Sun /* min active to actice/refresh delay time */ 32434e026f9SYork Sun pdimm->trc_ps = spd_to_ps((((spd->tras_trc_ext & 0xf0) << 4) + 32534e026f9SYork Sun spd->trc_min_lsb), spd->fine_trc_min); 32634e026f9SYork Sun /* Min Refresh Recovery Delay Time */ 32734e026f9SYork Sun pdimm->trfc1_ps = ((spd->trfc1_min_msb << 8) | (spd->trfc1_min_lsb)) * 32834e026f9SYork Sun pdimm->mtb_ps; 32934e026f9SYork Sun pdimm->trfc2_ps = ((spd->trfc2_min_msb << 8) | (spd->trfc2_min_lsb)) * 33034e026f9SYork Sun pdimm->mtb_ps; 33134e026f9SYork Sun pdimm->trfc4_ps = ((spd->trfc4_min_msb << 8) | (spd->trfc4_min_lsb)) * 33234e026f9SYork Sun pdimm->mtb_ps; 33334e026f9SYork Sun /* min four active window delay time */ 33434e026f9SYork Sun pdimm->tfaw_ps = (((spd->tfaw_msb & 0xf) << 8) | spd->tfaw_min) * 33534e026f9SYork Sun pdimm->mtb_ps; 33634e026f9SYork Sun 33734e026f9SYork Sun /* min row active to row active delay time, different bank group */ 33834e026f9SYork Sun pdimm->trrds_ps = spd_to_ps(spd->trrds_min, spd->fine_trrds_min); 33934e026f9SYork Sun /* min row active to row active delay time, same bank group */ 34034e026f9SYork Sun pdimm->trrdl_ps = spd_to_ps(spd->trrdl_min, spd->fine_trrdl_min); 34134e026f9SYork Sun /* min CAS to CAS Delay Time (tCCD_Lmin), same bank group */ 34234e026f9SYork Sun pdimm->tccdl_ps = spd_to_ps(spd->tccdl_min, spd->fine_tccdl_min); 34334e026f9SYork Sun 344c0c32af0SYork Sun if (pdimm->package_3ds) { 345c0c32af0SYork Sun if (pdimm->die_density <= 0x4) { 346c0c32af0SYork Sun pdimm->trfc_slr_ps = 260000; 347c0c32af0SYork Sun } else if (pdimm->die_density <= 0x5) { 348c0c32af0SYork Sun pdimm->trfc_slr_ps = 350000; 349c0c32af0SYork Sun } else { 350c0c32af0SYork Sun printf("WARN: Unsupported logical rank density 0x%x\n", 351c0c32af0SYork Sun pdimm->die_density); 352c0c32af0SYork Sun } 353c0c32af0SYork Sun } 354c0c32af0SYork Sun 35534e026f9SYork Sun /* 35634e026f9SYork Sun * Average periodic refresh interval 35734e026f9SYork Sun * tREFI = 7.8 us at normal temperature range 35834e026f9SYork Sun */ 35934e026f9SYork Sun pdimm->refresh_rate_ps = 7800000; 36034e026f9SYork Sun 36134e026f9SYork Sun for (i = 0; i < 18; i++) 36234e026f9SYork Sun pdimm->dq_mapping[i] = spd->mapping[i]; 36334e026f9SYork Sun 36434e026f9SYork Sun pdimm->dq_mapping_ors = ((spd->mapping[0] >> 6) & 0x3) == 0 ? 1 : 0; 36534e026f9SYork Sun 36634e026f9SYork Sun return 0; 36734e026f9SYork Sun } 368