xref: /openbmc/u-boot/drivers/ddr/fsl/ddr4_dimm_params.c (revision 34e026f9b1eb3bcffb38e7787c2e6eac0e88ba85)
1*34e026f9SYork Sun /*
2*34e026f9SYork Sun  * Copyright 2014 Freescale Semiconductor, Inc.
3*34e026f9SYork Sun  *
4*34e026f9SYork Sun  * calculate the organization and timing parameter
5*34e026f9SYork Sun  * from ddr3 spd, please refer to the spec
6*34e026f9SYork Sun  * JEDEC standard No.21-C 4_01_02_12R23A.pdf
7*34e026f9SYork Sun  *
8*34e026f9SYork Sun  *
9*34e026f9SYork Sun  */
10*34e026f9SYork Sun 
11*34e026f9SYork Sun #include <common.h>
12*34e026f9SYork Sun #include <fsl_ddr_sdram.h>
13*34e026f9SYork Sun 
14*34e026f9SYork Sun #include <fsl_ddr.h>
15*34e026f9SYork Sun 
16*34e026f9SYork Sun /*
17*34e026f9SYork Sun  * Calculate the Density of each Physical Rank.
18*34e026f9SYork Sun  * Returned size is in bytes.
19*34e026f9SYork Sun  *
20*34e026f9SYork Sun  * Total DIMM size =
21*34e026f9SYork Sun  * sdram capacity(bit) / 8 * primary bus width / sdram width
22*34e026f9SYork Sun  *                     * Logical Ranks per DIMM
23*34e026f9SYork Sun  *
24*34e026f9SYork Sun  * where: sdram capacity  = spd byte4[3:0]
25*34e026f9SYork Sun  *        primary bus width = spd byte13[2:0]
26*34e026f9SYork Sun  *        sdram width = spd byte12[2:0]
27*34e026f9SYork Sun  *        Logical Ranks per DIMM = spd byte12[5:3] for SDP, DDP, QDP
28*34e026f9SYork Sun  *                                 spd byte12{5:3] * spd byte6[6:4] for 3DS
29*34e026f9SYork Sun  *
30*34e026f9SYork Sun  * To simplify each rank size = total DIMM size / Number of Package Ranks
31*34e026f9SYork Sun  * where Number of Package Ranks = spd byte12[5:3]
32*34e026f9SYork Sun  *
33*34e026f9SYork Sun  * SPD byte4 - sdram density and banks
34*34e026f9SYork Sun  *	bit[3:0]	size(bit)	size(byte)
35*34e026f9SYork Sun  *	0000		256Mb		32MB
36*34e026f9SYork Sun  *	0001		512Mb		64MB
37*34e026f9SYork Sun  *	0010		1Gb		128MB
38*34e026f9SYork Sun  *	0011		2Gb		256MB
39*34e026f9SYork Sun  *	0100		4Gb		512MB
40*34e026f9SYork Sun  *	0101		8Gb		1GB
41*34e026f9SYork Sun  *	0110		16Gb		2GB
42*34e026f9SYork Sun  *      0111		32Gb		4GB
43*34e026f9SYork Sun  *
44*34e026f9SYork Sun  * SPD byte13 - module memory bus width
45*34e026f9SYork Sun  *	bit[2:0]	primary bus width
46*34e026f9SYork Sun  *	000		8bits
47*34e026f9SYork Sun  *	001		16bits
48*34e026f9SYork Sun  *	010		32bits
49*34e026f9SYork Sun  *	011		64bits
50*34e026f9SYork Sun  *
51*34e026f9SYork Sun  * SPD byte12 - module organization
52*34e026f9SYork Sun  *	bit[2:0]	sdram device width
53*34e026f9SYork Sun  *	000		4bits
54*34e026f9SYork Sun  *	001		8bits
55*34e026f9SYork Sun  *	010		16bits
56*34e026f9SYork Sun  *	011		32bits
57*34e026f9SYork Sun  *
58*34e026f9SYork Sun  * SPD byte12 - module organization
59*34e026f9SYork Sun  *	bit[5:3]	number of package ranks per DIMM
60*34e026f9SYork Sun  *	000		1
61*34e026f9SYork Sun  *	001		2
62*34e026f9SYork Sun  *	010		3
63*34e026f9SYork Sun  *	011		4
64*34e026f9SYork Sun  *
65*34e026f9SYork Sun  * SPD byte6 - SDRAM package type
66*34e026f9SYork Sun  *	bit[6:4]	Die count
67*34e026f9SYork Sun  *	000		1
68*34e026f9SYork Sun  *	001		2
69*34e026f9SYork Sun  *	010		3
70*34e026f9SYork Sun  *	011		4
71*34e026f9SYork Sun  *	100		5
72*34e026f9SYork Sun  *	101		6
73*34e026f9SYork Sun  *	110		7
74*34e026f9SYork Sun  *	111		8
75*34e026f9SYork Sun  *
76*34e026f9SYork Sun  * SPD byte6 - SRAM package type
77*34e026f9SYork Sun  *	bit[1:0]	Signal loading
78*34e026f9SYork Sun  *	00		Not specified
79*34e026f9SYork Sun  *	01		Multi load stack
80*34e026f9SYork Sun  *	10		Sigle load stack (3DS)
81*34e026f9SYork Sun  *	11		Reserved
82*34e026f9SYork Sun  */
83*34e026f9SYork Sun static unsigned long long
84*34e026f9SYork Sun compute_ranksize(const struct ddr4_spd_eeprom_s *spd)
85*34e026f9SYork Sun {
86*34e026f9SYork Sun 	unsigned long long bsize;
87*34e026f9SYork Sun 
88*34e026f9SYork Sun 	int nbit_sdram_cap_bsize = 0;
89*34e026f9SYork Sun 	int nbit_primary_bus_width = 0;
90*34e026f9SYork Sun 	int nbit_sdram_width = 0;
91*34e026f9SYork Sun 	int die_count = 0;
92*34e026f9SYork Sun 	bool package_3ds;
93*34e026f9SYork Sun 
94*34e026f9SYork Sun 	if ((spd->density_banks & 0xf) <= 7)
95*34e026f9SYork Sun 		nbit_sdram_cap_bsize = (spd->density_banks & 0xf) + 28;
96*34e026f9SYork Sun 	if ((spd->bus_width & 0x7) < 4)
97*34e026f9SYork Sun 		nbit_primary_bus_width = (spd->bus_width & 0x7) + 3;
98*34e026f9SYork Sun 	if ((spd->organization & 0x7) < 4)
99*34e026f9SYork Sun 		nbit_sdram_width = (spd->organization & 0x7) + 2;
100*34e026f9SYork Sun 	package_3ds = (spd->package_type & 0x3) == 0x2;
101*34e026f9SYork Sun 	if (package_3ds)
102*34e026f9SYork Sun 		die_count = (spd->package_type >> 4) & 0x7;
103*34e026f9SYork Sun 
104*34e026f9SYork Sun 	bsize = 1ULL << (nbit_sdram_cap_bsize - 3 +
105*34e026f9SYork Sun 			 nbit_primary_bus_width - nbit_sdram_width +
106*34e026f9SYork Sun 			 die_count);
107*34e026f9SYork Sun 
108*34e026f9SYork Sun 	debug("DDR: DDR III rank density = 0x%16llx\n", bsize);
109*34e026f9SYork Sun 
110*34e026f9SYork Sun 	return bsize;
111*34e026f9SYork Sun }
112*34e026f9SYork Sun 
113*34e026f9SYork Sun #define spd_to_ps(mtb, ftb)	\
114*34e026f9SYork Sun 	(mtb * pdimm->mtb_ps + (ftb * pdimm->ftb_10th_ps) / 10)
115*34e026f9SYork Sun /*
116*34e026f9SYork Sun  * ddr_compute_dimm_parameters for DDR3 SPD
117*34e026f9SYork Sun  *
118*34e026f9SYork Sun  * Compute DIMM parameters based upon the SPD information in spd.
119*34e026f9SYork Sun  * Writes the results to the dimm_params_t structure pointed by pdimm.
120*34e026f9SYork Sun  *
121*34e026f9SYork Sun  */
122*34e026f9SYork Sun unsigned int
123*34e026f9SYork Sun ddr_compute_dimm_parameters(const generic_spd_eeprom_t *spd,
124*34e026f9SYork Sun 			    dimm_params_t *pdimm,
125*34e026f9SYork Sun 			    unsigned int dimm_number)
126*34e026f9SYork Sun {
127*34e026f9SYork Sun 	unsigned int retval;
128*34e026f9SYork Sun 	int i;
129*34e026f9SYork Sun 
130*34e026f9SYork Sun 	if (spd->mem_type) {
131*34e026f9SYork Sun 		if (spd->mem_type != SPD_MEMTYPE_DDR4) {
132*34e026f9SYork Sun 			printf("DIMM %u: is not a DDR4 SPD.\n", dimm_number);
133*34e026f9SYork Sun 			return 1;
134*34e026f9SYork Sun 		}
135*34e026f9SYork Sun 	} else {
136*34e026f9SYork Sun 		memset(pdimm, 0, sizeof(dimm_params_t));
137*34e026f9SYork Sun 		return 1;
138*34e026f9SYork Sun 	}
139*34e026f9SYork Sun 
140*34e026f9SYork Sun 	retval = ddr4_spd_check(spd);
141*34e026f9SYork Sun 	if (retval) {
142*34e026f9SYork Sun 		printf("DIMM %u: failed checksum\n", dimm_number);
143*34e026f9SYork Sun 		return 2;
144*34e026f9SYork Sun 	}
145*34e026f9SYork Sun 
146*34e026f9SYork Sun 	/*
147*34e026f9SYork Sun 	 * The part name in ASCII in the SPD EEPROM is not null terminated.
148*34e026f9SYork Sun 	 * Guarantee null termination here by presetting all bytes to 0
149*34e026f9SYork Sun 	 * and copying the part name in ASCII from the SPD onto it
150*34e026f9SYork Sun 	 */
151*34e026f9SYork Sun 	memset(pdimm->mpart, 0, sizeof(pdimm->mpart));
152*34e026f9SYork Sun 	if ((spd->info_size_crc & 0xF) > 2)
153*34e026f9SYork Sun 		memcpy(pdimm->mpart, spd->mpart, sizeof(pdimm->mpart) - 1);
154*34e026f9SYork Sun 
155*34e026f9SYork Sun 	/* DIMM organization parameters */
156*34e026f9SYork Sun 	pdimm->n_ranks = ((spd->organization >> 3) & 0x7) + 1;
157*34e026f9SYork Sun 	pdimm->rank_density = compute_ranksize(spd);
158*34e026f9SYork Sun 	pdimm->capacity = pdimm->n_ranks * pdimm->rank_density;
159*34e026f9SYork Sun 	pdimm->primary_sdram_width = 1 << (3 + (spd->bus_width & 0x7));
160*34e026f9SYork Sun 	if ((spd->bus_width >> 3) & 0x3)
161*34e026f9SYork Sun 		pdimm->ec_sdram_width = 8;
162*34e026f9SYork Sun 	else
163*34e026f9SYork Sun 		pdimm->ec_sdram_width = 0;
164*34e026f9SYork Sun 	pdimm->data_width = pdimm->primary_sdram_width
165*34e026f9SYork Sun 			  + pdimm->ec_sdram_width;
166*34e026f9SYork Sun 	pdimm->device_width = 1 << ((spd->organization & 0x7) + 2);
167*34e026f9SYork Sun 
168*34e026f9SYork Sun 	/* These are the types defined by the JEDEC DDR3 SPD spec */
169*34e026f9SYork Sun 	pdimm->mirrored_dimm = 0;
170*34e026f9SYork Sun 	pdimm->registered_dimm = 0;
171*34e026f9SYork Sun 	switch (spd->module_type & DDR3_SPD_MODULETYPE_MASK) {
172*34e026f9SYork Sun 	case DDR3_SPD_MODULETYPE_RDIMM:
173*34e026f9SYork Sun 		/* Registered/buffered DIMMs */
174*34e026f9SYork Sun 		pdimm->registered_dimm = 1;
175*34e026f9SYork Sun 		break;
176*34e026f9SYork Sun 
177*34e026f9SYork Sun 	case DDR3_SPD_MODULETYPE_UDIMM:
178*34e026f9SYork Sun 	case DDR3_SPD_MODULETYPE_SO_DIMM:
179*34e026f9SYork Sun 		/* Unbuffered DIMMs */
180*34e026f9SYork Sun 		if (spd->mod_section.unbuffered.addr_mapping & 0x1)
181*34e026f9SYork Sun 			pdimm->mirrored_dimm = 1;
182*34e026f9SYork Sun 		break;
183*34e026f9SYork Sun 
184*34e026f9SYork Sun 	default:
185*34e026f9SYork Sun 		printf("unknown module_type 0x%02X\n", spd->module_type);
186*34e026f9SYork Sun 		return 1;
187*34e026f9SYork Sun 	}
188*34e026f9SYork Sun 
189*34e026f9SYork Sun 	/* SDRAM device parameters */
190*34e026f9SYork Sun 	pdimm->n_row_addr = ((spd->addressing >> 3) & 0x7) + 12;
191*34e026f9SYork Sun 	pdimm->n_col_addr = (spd->addressing & 0x7) + 9;
192*34e026f9SYork Sun 	pdimm->bank_addr_bits = (spd->density_banks >> 4) & 0x3;
193*34e026f9SYork Sun 	pdimm->bank_group_bits = (spd->density_banks >> 6) & 0x3;
194*34e026f9SYork Sun 
195*34e026f9SYork Sun 	/*
196*34e026f9SYork Sun 	 * The SPD spec has not the ECC bit,
197*34e026f9SYork Sun 	 * We consider the DIMM as ECC capability
198*34e026f9SYork Sun 	 * when the extension bus exist
199*34e026f9SYork Sun 	 */
200*34e026f9SYork Sun 	if (pdimm->ec_sdram_width)
201*34e026f9SYork Sun 		pdimm->edc_config = 0x02;
202*34e026f9SYork Sun 	else
203*34e026f9SYork Sun 		pdimm->edc_config = 0x00;
204*34e026f9SYork Sun 
205*34e026f9SYork Sun 	/*
206*34e026f9SYork Sun 	 * The SPD spec has not the burst length byte
207*34e026f9SYork Sun 	 * but DDR4 spec has nature BL8 and BC4,
208*34e026f9SYork Sun 	 * BL8 -bit3, BC4 -bit2
209*34e026f9SYork Sun 	 */
210*34e026f9SYork Sun 	pdimm->burst_lengths_bitmask = 0x0c;
211*34e026f9SYork Sun 	pdimm->row_density = __ilog2(pdimm->rank_density);
212*34e026f9SYork Sun 
213*34e026f9SYork Sun 	/* MTB - medium timebase
214*34e026f9SYork Sun 	 * The MTB in the SPD spec is 125ps,
215*34e026f9SYork Sun 	 *
216*34e026f9SYork Sun 	 * FTB - fine timebase
217*34e026f9SYork Sun 	 * use 1/10th of ps as our unit to avoid floating point
218*34e026f9SYork Sun 	 * eg, 10 for 1ps, 25 for 2.5ps, 50 for 5ps
219*34e026f9SYork Sun 	 */
220*34e026f9SYork Sun 	if ((spd->timebases & 0xf) == 0x0) {
221*34e026f9SYork Sun 		pdimm->mtb_ps = 125;
222*34e026f9SYork Sun 		pdimm->ftb_10th_ps = 10;
223*34e026f9SYork Sun 
224*34e026f9SYork Sun 	} else {
225*34e026f9SYork Sun 		printf("Unknown Timebases\n");
226*34e026f9SYork Sun 	}
227*34e026f9SYork Sun 
228*34e026f9SYork Sun 	/* sdram minimum cycle time */
229*34e026f9SYork Sun 	pdimm->tckmin_x_ps = spd_to_ps(spd->tck_min, spd->fine_tck_min);
230*34e026f9SYork Sun 
231*34e026f9SYork Sun 	/* sdram max cycle time */
232*34e026f9SYork Sun 	pdimm->tckmax_ps = spd_to_ps(spd->tck_max, spd->fine_tck_max);
233*34e026f9SYork Sun 
234*34e026f9SYork Sun 	/*
235*34e026f9SYork Sun 	 * CAS latency supported
236*34e026f9SYork Sun 	 * bit0 - CL7
237*34e026f9SYork Sun 	 * bit4 - CL11
238*34e026f9SYork Sun 	 * bit8 - CL15
239*34e026f9SYork Sun 	 * bit12- CL19
240*34e026f9SYork Sun 	 * bit16- CL23
241*34e026f9SYork Sun 	 */
242*34e026f9SYork Sun 	pdimm->caslat_x  = (spd->caslat_b1 << 7)	|
243*34e026f9SYork Sun 			   (spd->caslat_b2 << 15)	|
244*34e026f9SYork Sun 			   (spd->caslat_b3 << 23);
245*34e026f9SYork Sun 
246*34e026f9SYork Sun 	BUG_ON(spd->caslat_b4 != 0);
247*34e026f9SYork Sun 
248*34e026f9SYork Sun 	/*
249*34e026f9SYork Sun 	 * min CAS latency time
250*34e026f9SYork Sun 	 */
251*34e026f9SYork Sun 	pdimm->taa_ps = spd_to_ps(spd->taa_min, spd->fine_taa_min);
252*34e026f9SYork Sun 
253*34e026f9SYork Sun 	/*
254*34e026f9SYork Sun 	 * min RAS to CAS delay time
255*34e026f9SYork Sun 	 */
256*34e026f9SYork Sun 	pdimm->trcd_ps = spd_to_ps(spd->trcd_min, spd->fine_trcd_min);
257*34e026f9SYork Sun 
258*34e026f9SYork Sun 	/*
259*34e026f9SYork Sun 	 * Min Row Precharge Delay Time
260*34e026f9SYork Sun 	 */
261*34e026f9SYork Sun 	pdimm->trp_ps = spd_to_ps(spd->trp_min, spd->fine_trp_min);
262*34e026f9SYork Sun 
263*34e026f9SYork Sun 	/* min active to precharge delay time */
264*34e026f9SYork Sun 	pdimm->tras_ps = (((spd->tras_trc_ext & 0xf) << 8) +
265*34e026f9SYork Sun 			  spd->tras_min_lsb) * pdimm->mtb_ps;
266*34e026f9SYork Sun 
267*34e026f9SYork Sun 	/* min active to actice/refresh delay time */
268*34e026f9SYork Sun 	pdimm->trc_ps = spd_to_ps((((spd->tras_trc_ext & 0xf0) << 4) +
269*34e026f9SYork Sun 				   spd->trc_min_lsb), spd->fine_trc_min);
270*34e026f9SYork Sun 	/* Min Refresh Recovery Delay Time */
271*34e026f9SYork Sun 	pdimm->trfc1_ps = ((spd->trfc1_min_msb << 8) | (spd->trfc1_min_lsb)) *
272*34e026f9SYork Sun 		       pdimm->mtb_ps;
273*34e026f9SYork Sun 	pdimm->trfc2_ps = ((spd->trfc2_min_msb << 8) | (spd->trfc2_min_lsb)) *
274*34e026f9SYork Sun 		       pdimm->mtb_ps;
275*34e026f9SYork Sun 	pdimm->trfc4_ps = ((spd->trfc4_min_msb << 8) | (spd->trfc4_min_lsb)) *
276*34e026f9SYork Sun 			pdimm->mtb_ps;
277*34e026f9SYork Sun 	/* min four active window delay time */
278*34e026f9SYork Sun 	pdimm->tfaw_ps = (((spd->tfaw_msb & 0xf) << 8) | spd->tfaw_min) *
279*34e026f9SYork Sun 			pdimm->mtb_ps;
280*34e026f9SYork Sun 
281*34e026f9SYork Sun 	/* min row active to row active delay time, different bank group */
282*34e026f9SYork Sun 	pdimm->trrds_ps = spd_to_ps(spd->trrds_min, spd->fine_trrds_min);
283*34e026f9SYork Sun 	/* min row active to row active delay time, same bank group */
284*34e026f9SYork Sun 	pdimm->trrdl_ps = spd_to_ps(spd->trrdl_min, spd->fine_trrdl_min);
285*34e026f9SYork Sun 	/* min CAS to CAS Delay Time (tCCD_Lmin), same bank group */
286*34e026f9SYork Sun 	pdimm->tccdl_ps = spd_to_ps(spd->tccdl_min, spd->fine_tccdl_min);
287*34e026f9SYork Sun 
288*34e026f9SYork Sun 	/*
289*34e026f9SYork Sun 	 * Average periodic refresh interval
290*34e026f9SYork Sun 	 * tREFI = 7.8 us at normal temperature range
291*34e026f9SYork Sun 	 */
292*34e026f9SYork Sun 	pdimm->refresh_rate_ps = 7800000;
293*34e026f9SYork Sun 
294*34e026f9SYork Sun 	for (i = 0; i < 18; i++)
295*34e026f9SYork Sun 		pdimm->dq_mapping[i] = spd->mapping[i];
296*34e026f9SYork Sun 
297*34e026f9SYork Sun 	pdimm->dq_mapping_ors = ((spd->mapping[0] >> 6) & 0x3) == 0 ? 1 : 0;
298*34e026f9SYork Sun 
299*34e026f9SYork Sun 	return 0;
300*34e026f9SYork Sun }
301