134e026f9SYork Sun /* 234e026f9SYork Sun * Copyright 2014 Freescale Semiconductor, Inc. 334e026f9SYork Sun * 434e026f9SYork Sun * calculate the organization and timing parameter 534e026f9SYork Sun * from ddr3 spd, please refer to the spec 634e026f9SYork Sun * JEDEC standard No.21-C 4_01_02_12R23A.pdf 734e026f9SYork Sun * 834e026f9SYork Sun * 934e026f9SYork Sun */ 1034e026f9SYork Sun 1134e026f9SYork Sun #include <common.h> 1234e026f9SYork Sun #include <fsl_ddr_sdram.h> 1334e026f9SYork Sun 1434e026f9SYork Sun #include <fsl_ddr.h> 1534e026f9SYork Sun 1634e026f9SYork Sun /* 1734e026f9SYork Sun * Calculate the Density of each Physical Rank. 1834e026f9SYork Sun * Returned size is in bytes. 1934e026f9SYork Sun * 2034e026f9SYork Sun * Total DIMM size = 2134e026f9SYork Sun * sdram capacity(bit) / 8 * primary bus width / sdram width 2234e026f9SYork Sun * * Logical Ranks per DIMM 2334e026f9SYork Sun * 2434e026f9SYork Sun * where: sdram capacity = spd byte4[3:0] 2534e026f9SYork Sun * primary bus width = spd byte13[2:0] 2634e026f9SYork Sun * sdram width = spd byte12[2:0] 2734e026f9SYork Sun * Logical Ranks per DIMM = spd byte12[5:3] for SDP, DDP, QDP 2834e026f9SYork Sun * spd byte12{5:3] * spd byte6[6:4] for 3DS 2934e026f9SYork Sun * 3034e026f9SYork Sun * To simplify each rank size = total DIMM size / Number of Package Ranks 3134e026f9SYork Sun * where Number of Package Ranks = spd byte12[5:3] 3234e026f9SYork Sun * 3334e026f9SYork Sun * SPD byte4 - sdram density and banks 3434e026f9SYork Sun * bit[3:0] size(bit) size(byte) 3534e026f9SYork Sun * 0000 256Mb 32MB 3634e026f9SYork Sun * 0001 512Mb 64MB 3734e026f9SYork Sun * 0010 1Gb 128MB 3834e026f9SYork Sun * 0011 2Gb 256MB 3934e026f9SYork Sun * 0100 4Gb 512MB 4034e026f9SYork Sun * 0101 8Gb 1GB 4134e026f9SYork Sun * 0110 16Gb 2GB 4234e026f9SYork Sun * 0111 32Gb 4GB 4334e026f9SYork Sun * 4434e026f9SYork Sun * SPD byte13 - module memory bus width 4534e026f9SYork Sun * bit[2:0] primary bus width 4634e026f9SYork Sun * 000 8bits 4734e026f9SYork Sun * 001 16bits 4834e026f9SYork Sun * 010 32bits 4934e026f9SYork Sun * 011 64bits 5034e026f9SYork Sun * 5134e026f9SYork Sun * SPD byte12 - module organization 5234e026f9SYork Sun * bit[2:0] sdram device width 5334e026f9SYork Sun * 000 4bits 5434e026f9SYork Sun * 001 8bits 5534e026f9SYork Sun * 010 16bits 5634e026f9SYork Sun * 011 32bits 5734e026f9SYork Sun * 5834e026f9SYork Sun * SPD byte12 - module organization 5934e026f9SYork Sun * bit[5:3] number of package ranks per DIMM 6034e026f9SYork Sun * 000 1 6134e026f9SYork Sun * 001 2 6234e026f9SYork Sun * 010 3 6334e026f9SYork Sun * 011 4 6434e026f9SYork Sun * 6534e026f9SYork Sun * SPD byte6 - SDRAM package type 6634e026f9SYork Sun * bit[6:4] Die count 6734e026f9SYork Sun * 000 1 6834e026f9SYork Sun * 001 2 6934e026f9SYork Sun * 010 3 7034e026f9SYork Sun * 011 4 7134e026f9SYork Sun * 100 5 7234e026f9SYork Sun * 101 6 7334e026f9SYork Sun * 110 7 7434e026f9SYork Sun * 111 8 7534e026f9SYork Sun * 7634e026f9SYork Sun * SPD byte6 - SRAM package type 7734e026f9SYork Sun * bit[1:0] Signal loading 7834e026f9SYork Sun * 00 Not specified 7934e026f9SYork Sun * 01 Multi load stack 8034e026f9SYork Sun * 10 Sigle load stack (3DS) 8134e026f9SYork Sun * 11 Reserved 8234e026f9SYork Sun */ 8334e026f9SYork Sun static unsigned long long 8434e026f9SYork Sun compute_ranksize(const struct ddr4_spd_eeprom_s *spd) 8534e026f9SYork Sun { 8634e026f9SYork Sun unsigned long long bsize; 8734e026f9SYork Sun 8834e026f9SYork Sun int nbit_sdram_cap_bsize = 0; 8934e026f9SYork Sun int nbit_primary_bus_width = 0; 9034e026f9SYork Sun int nbit_sdram_width = 0; 9134e026f9SYork Sun int die_count = 0; 9234e026f9SYork Sun bool package_3ds; 9334e026f9SYork Sun 9434e026f9SYork Sun if ((spd->density_banks & 0xf) <= 7) 9534e026f9SYork Sun nbit_sdram_cap_bsize = (spd->density_banks & 0xf) + 28; 9634e026f9SYork Sun if ((spd->bus_width & 0x7) < 4) 9734e026f9SYork Sun nbit_primary_bus_width = (spd->bus_width & 0x7) + 3; 9834e026f9SYork Sun if ((spd->organization & 0x7) < 4) 9934e026f9SYork Sun nbit_sdram_width = (spd->organization & 0x7) + 2; 10034e026f9SYork Sun package_3ds = (spd->package_type & 0x3) == 0x2; 10134e026f9SYork Sun if (package_3ds) 10234e026f9SYork Sun die_count = (spd->package_type >> 4) & 0x7; 10334e026f9SYork Sun 10434e026f9SYork Sun bsize = 1ULL << (nbit_sdram_cap_bsize - 3 + 10534e026f9SYork Sun nbit_primary_bus_width - nbit_sdram_width + 10634e026f9SYork Sun die_count); 10734e026f9SYork Sun 10834e026f9SYork Sun debug("DDR: DDR III rank density = 0x%16llx\n", bsize); 10934e026f9SYork Sun 11034e026f9SYork Sun return bsize; 11134e026f9SYork Sun } 11234e026f9SYork Sun 11334e026f9SYork Sun #define spd_to_ps(mtb, ftb) \ 11434e026f9SYork Sun (mtb * pdimm->mtb_ps + (ftb * pdimm->ftb_10th_ps) / 10) 11534e026f9SYork Sun /* 1161d71efbbSYork Sun * ddr_compute_dimm_parameters for DDR4 SPD 11734e026f9SYork Sun * 11834e026f9SYork Sun * Compute DIMM parameters based upon the SPD information in spd. 11934e026f9SYork Sun * Writes the results to the dimm_params_t structure pointed by pdimm. 12034e026f9SYork Sun * 12134e026f9SYork Sun */ 12203e664d8SYork Sun unsigned int ddr_compute_dimm_parameters(const unsigned int ctrl_num, 12303e664d8SYork Sun const generic_spd_eeprom_t *spd, 12434e026f9SYork Sun dimm_params_t *pdimm, 12534e026f9SYork Sun unsigned int dimm_number) 12634e026f9SYork Sun { 12734e026f9SYork Sun unsigned int retval; 12834e026f9SYork Sun int i; 129789b3447SYork Sun const u8 udimm_rc_e_dq[18] = { 130789b3447SYork Sun 0x0c, 0x2c, 0x15, 0x35, 0x15, 0x35, 0x0b, 0x2c, 0x15, 131789b3447SYork Sun 0x35, 0x0b, 0x35, 0x0b, 0x2c, 0x0b, 0x35, 0x15, 0x36 132789b3447SYork Sun }; 133789b3447SYork Sun int spd_error = 0; 134789b3447SYork Sun u8 *ptr; 13534e026f9SYork Sun 13634e026f9SYork Sun if (spd->mem_type) { 13734e026f9SYork Sun if (spd->mem_type != SPD_MEMTYPE_DDR4) { 138*6b95be22SYork Sun printf("Ctrl %u DIMM %u: is not a DDR4 SPD.\n", 139*6b95be22SYork Sun ctrl_num, dimm_number); 14034e026f9SYork Sun return 1; 14134e026f9SYork Sun } 14234e026f9SYork Sun } else { 14334e026f9SYork Sun memset(pdimm, 0, sizeof(dimm_params_t)); 14434e026f9SYork Sun return 1; 14534e026f9SYork Sun } 14634e026f9SYork Sun 14734e026f9SYork Sun retval = ddr4_spd_check(spd); 14834e026f9SYork Sun if (retval) { 14934e026f9SYork Sun printf("DIMM %u: failed checksum\n", dimm_number); 15034e026f9SYork Sun return 2; 15134e026f9SYork Sun } 15234e026f9SYork Sun 15334e026f9SYork Sun /* 15434e026f9SYork Sun * The part name in ASCII in the SPD EEPROM is not null terminated. 15534e026f9SYork Sun * Guarantee null termination here by presetting all bytes to 0 15634e026f9SYork Sun * and copying the part name in ASCII from the SPD onto it 15734e026f9SYork Sun */ 15834e026f9SYork Sun memset(pdimm->mpart, 0, sizeof(pdimm->mpart)); 15934e026f9SYork Sun if ((spd->info_size_crc & 0xF) > 2) 16034e026f9SYork Sun memcpy(pdimm->mpart, spd->mpart, sizeof(pdimm->mpart) - 1); 16134e026f9SYork Sun 16234e026f9SYork Sun /* DIMM organization parameters */ 16334e026f9SYork Sun pdimm->n_ranks = ((spd->organization >> 3) & 0x7) + 1; 16434e026f9SYork Sun pdimm->rank_density = compute_ranksize(spd); 16534e026f9SYork Sun pdimm->capacity = pdimm->n_ranks * pdimm->rank_density; 16634e026f9SYork Sun pdimm->primary_sdram_width = 1 << (3 + (spd->bus_width & 0x7)); 16734e026f9SYork Sun if ((spd->bus_width >> 3) & 0x3) 16834e026f9SYork Sun pdimm->ec_sdram_width = 8; 16934e026f9SYork Sun else 17034e026f9SYork Sun pdimm->ec_sdram_width = 0; 17134e026f9SYork Sun pdimm->data_width = pdimm->primary_sdram_width 17234e026f9SYork Sun + pdimm->ec_sdram_width; 17334e026f9SYork Sun pdimm->device_width = 1 << ((spd->organization & 0x7) + 2); 17434e026f9SYork Sun 1751d71efbbSYork Sun /* These are the types defined by the JEDEC SPD spec */ 17634e026f9SYork Sun pdimm->mirrored_dimm = 0; 17734e026f9SYork Sun pdimm->registered_dimm = 0; 1781d71efbbSYork Sun switch (spd->module_type & DDR4_SPD_MODULETYPE_MASK) { 1791d71efbbSYork Sun case DDR4_SPD_MODULETYPE_RDIMM: 18034e026f9SYork Sun /* Registered/buffered DIMMs */ 18134e026f9SYork Sun pdimm->registered_dimm = 1; 18234e026f9SYork Sun break; 18334e026f9SYork Sun 1841d71efbbSYork Sun case DDR4_SPD_MODULETYPE_UDIMM: 1851d71efbbSYork Sun case DDR4_SPD_MODULETYPE_SO_DIMM: 18634e026f9SYork Sun /* Unbuffered DIMMs */ 18734e026f9SYork Sun if (spd->mod_section.unbuffered.addr_mapping & 0x1) 18834e026f9SYork Sun pdimm->mirrored_dimm = 1; 189789b3447SYork Sun if ((spd->mod_section.unbuffered.mod_height & 0xe0) == 0 && 190789b3447SYork Sun (spd->mod_section.unbuffered.ref_raw_card == 0x04)) { 191789b3447SYork Sun /* Fix SPD error found on DIMMs with raw card E0 */ 192789b3447SYork Sun for (i = 0; i < 18; i++) { 193789b3447SYork Sun if (spd->mapping[i] == udimm_rc_e_dq[i]) 194789b3447SYork Sun continue; 195789b3447SYork Sun spd_error = 1; 196789b3447SYork Sun debug("SPD byte %d: 0x%x, should be 0x%x\n", 197789b3447SYork Sun 60 + i, spd->mapping[i], 198789b3447SYork Sun udimm_rc_e_dq[i]); 199789b3447SYork Sun ptr = (u8 *)&spd->mapping[i]; 200789b3447SYork Sun *ptr = udimm_rc_e_dq[i]; 201789b3447SYork Sun } 202789b3447SYork Sun if (spd_error) 203789b3447SYork Sun puts("SPD DQ mapping error fixed\n"); 204789b3447SYork Sun } 20534e026f9SYork Sun break; 20634e026f9SYork Sun 20734e026f9SYork Sun default: 20834e026f9SYork Sun printf("unknown module_type 0x%02X\n", spd->module_type); 20934e026f9SYork Sun return 1; 21034e026f9SYork Sun } 21134e026f9SYork Sun 21234e026f9SYork Sun /* SDRAM device parameters */ 21334e026f9SYork Sun pdimm->n_row_addr = ((spd->addressing >> 3) & 0x7) + 12; 21434e026f9SYork Sun pdimm->n_col_addr = (spd->addressing & 0x7) + 9; 21534e026f9SYork Sun pdimm->bank_addr_bits = (spd->density_banks >> 4) & 0x3; 21634e026f9SYork Sun pdimm->bank_group_bits = (spd->density_banks >> 6) & 0x3; 21734e026f9SYork Sun 21834e026f9SYork Sun /* 21934e026f9SYork Sun * The SPD spec has not the ECC bit, 22034e026f9SYork Sun * We consider the DIMM as ECC capability 22134e026f9SYork Sun * when the extension bus exist 22234e026f9SYork Sun */ 22334e026f9SYork Sun if (pdimm->ec_sdram_width) 22434e026f9SYork Sun pdimm->edc_config = 0x02; 22534e026f9SYork Sun else 22634e026f9SYork Sun pdimm->edc_config = 0x00; 22734e026f9SYork Sun 22834e026f9SYork Sun /* 22934e026f9SYork Sun * The SPD spec has not the burst length byte 23034e026f9SYork Sun * but DDR4 spec has nature BL8 and BC4, 23134e026f9SYork Sun * BL8 -bit3, BC4 -bit2 23234e026f9SYork Sun */ 23334e026f9SYork Sun pdimm->burst_lengths_bitmask = 0x0c; 23434e026f9SYork Sun pdimm->row_density = __ilog2(pdimm->rank_density); 23534e026f9SYork Sun 23634e026f9SYork Sun /* MTB - medium timebase 23734e026f9SYork Sun * The MTB in the SPD spec is 125ps, 23834e026f9SYork Sun * 23934e026f9SYork Sun * FTB - fine timebase 24034e026f9SYork Sun * use 1/10th of ps as our unit to avoid floating point 24134e026f9SYork Sun * eg, 10 for 1ps, 25 for 2.5ps, 50 for 5ps 24234e026f9SYork Sun */ 24334e026f9SYork Sun if ((spd->timebases & 0xf) == 0x0) { 24434e026f9SYork Sun pdimm->mtb_ps = 125; 24534e026f9SYork Sun pdimm->ftb_10th_ps = 10; 24634e026f9SYork Sun 24734e026f9SYork Sun } else { 24834e026f9SYork Sun printf("Unknown Timebases\n"); 24934e026f9SYork Sun } 25034e026f9SYork Sun 25134e026f9SYork Sun /* sdram minimum cycle time */ 25234e026f9SYork Sun pdimm->tckmin_x_ps = spd_to_ps(spd->tck_min, spd->fine_tck_min); 25334e026f9SYork Sun 25434e026f9SYork Sun /* sdram max cycle time */ 25534e026f9SYork Sun pdimm->tckmax_ps = spd_to_ps(spd->tck_max, spd->fine_tck_max); 25634e026f9SYork Sun 25734e026f9SYork Sun /* 25834e026f9SYork Sun * CAS latency supported 25934e026f9SYork Sun * bit0 - CL7 26034e026f9SYork Sun * bit4 - CL11 26134e026f9SYork Sun * bit8 - CL15 26234e026f9SYork Sun * bit12- CL19 26334e026f9SYork Sun * bit16- CL23 26434e026f9SYork Sun */ 26534e026f9SYork Sun pdimm->caslat_x = (spd->caslat_b1 << 7) | 26634e026f9SYork Sun (spd->caslat_b2 << 15) | 26734e026f9SYork Sun (spd->caslat_b3 << 23); 26834e026f9SYork Sun 26934e026f9SYork Sun BUG_ON(spd->caslat_b4 != 0); 27034e026f9SYork Sun 27134e026f9SYork Sun /* 27234e026f9SYork Sun * min CAS latency time 27334e026f9SYork Sun */ 27434e026f9SYork Sun pdimm->taa_ps = spd_to_ps(spd->taa_min, spd->fine_taa_min); 27534e026f9SYork Sun 27634e026f9SYork Sun /* 27734e026f9SYork Sun * min RAS to CAS delay time 27834e026f9SYork Sun */ 27934e026f9SYork Sun pdimm->trcd_ps = spd_to_ps(spd->trcd_min, spd->fine_trcd_min); 28034e026f9SYork Sun 28134e026f9SYork Sun /* 28234e026f9SYork Sun * Min Row Precharge Delay Time 28334e026f9SYork Sun */ 28434e026f9SYork Sun pdimm->trp_ps = spd_to_ps(spd->trp_min, spd->fine_trp_min); 28534e026f9SYork Sun 28634e026f9SYork Sun /* min active to precharge delay time */ 28734e026f9SYork Sun pdimm->tras_ps = (((spd->tras_trc_ext & 0xf) << 8) + 28834e026f9SYork Sun spd->tras_min_lsb) * pdimm->mtb_ps; 28934e026f9SYork Sun 29034e026f9SYork Sun /* min active to actice/refresh delay time */ 29134e026f9SYork Sun pdimm->trc_ps = spd_to_ps((((spd->tras_trc_ext & 0xf0) << 4) + 29234e026f9SYork Sun spd->trc_min_lsb), spd->fine_trc_min); 29334e026f9SYork Sun /* Min Refresh Recovery Delay Time */ 29434e026f9SYork Sun pdimm->trfc1_ps = ((spd->trfc1_min_msb << 8) | (spd->trfc1_min_lsb)) * 29534e026f9SYork Sun pdimm->mtb_ps; 29634e026f9SYork Sun pdimm->trfc2_ps = ((spd->trfc2_min_msb << 8) | (spd->trfc2_min_lsb)) * 29734e026f9SYork Sun pdimm->mtb_ps; 29834e026f9SYork Sun pdimm->trfc4_ps = ((spd->trfc4_min_msb << 8) | (spd->trfc4_min_lsb)) * 29934e026f9SYork Sun pdimm->mtb_ps; 30034e026f9SYork Sun /* min four active window delay time */ 30134e026f9SYork Sun pdimm->tfaw_ps = (((spd->tfaw_msb & 0xf) << 8) | spd->tfaw_min) * 30234e026f9SYork Sun pdimm->mtb_ps; 30334e026f9SYork Sun 30434e026f9SYork Sun /* min row active to row active delay time, different bank group */ 30534e026f9SYork Sun pdimm->trrds_ps = spd_to_ps(spd->trrds_min, spd->fine_trrds_min); 30634e026f9SYork Sun /* min row active to row active delay time, same bank group */ 30734e026f9SYork Sun pdimm->trrdl_ps = spd_to_ps(spd->trrdl_min, spd->fine_trrdl_min); 30834e026f9SYork Sun /* min CAS to CAS Delay Time (tCCD_Lmin), same bank group */ 30934e026f9SYork Sun pdimm->tccdl_ps = spd_to_ps(spd->tccdl_min, spd->fine_tccdl_min); 31034e026f9SYork Sun 31134e026f9SYork Sun /* 31234e026f9SYork Sun * Average periodic refresh interval 31334e026f9SYork Sun * tREFI = 7.8 us at normal temperature range 31434e026f9SYork Sun */ 31534e026f9SYork Sun pdimm->refresh_rate_ps = 7800000; 31634e026f9SYork Sun 31734e026f9SYork Sun for (i = 0; i < 18; i++) 31834e026f9SYork Sun pdimm->dq_mapping[i] = spd->mapping[i]; 31934e026f9SYork Sun 32034e026f9SYork Sun pdimm->dq_mapping_ors = ((spd->mapping[0] >> 6) & 0x3) == 0 ? 1 : 0; 32134e026f9SYork Sun 32234e026f9SYork Sun return 0; 32334e026f9SYork Sun } 324