xref: /aosp_15_r20/external/arm-trusted-firmware/include/drivers/nxp/ddr/dimm.h (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright 2021 NXP
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  *
6*54fd6939SJiyong Park  */
7*54fd6939SJiyong Park 
8*54fd6939SJiyong Park #ifndef DIMM_H
9*54fd6939SJiyong Park #define DIMM_H
10*54fd6939SJiyong Park 
11*54fd6939SJiyong Park #define SPD_MEMTYPE_DDR4        0x0C
12*54fd6939SJiyong Park 
13*54fd6939SJiyong Park #define DDR4_SPD_MODULETYPE_MASK        0x0f
14*54fd6939SJiyong Park #define DDR4_SPD_MODULETYPE_EXT         0x00
15*54fd6939SJiyong Park #define DDR4_SPD_RDIMM			0x01
16*54fd6939SJiyong Park #define DDR4_SPD_UDIMM			0x02
17*54fd6939SJiyong Park #define DDR4_SPD_SO_DIMM		0x03
18*54fd6939SJiyong Park #define DDR4_SPD_LRDIMM			0x04
19*54fd6939SJiyong Park #define DDR4_SPD_MINI_RDIMM		0x05
20*54fd6939SJiyong Park #define DDR4_SPD_MINI_UDIMM		0x06
21*54fd6939SJiyong Park #define DDR4_SPD_72B_SO_RDIMM		0x08
22*54fd6939SJiyong Park #define DDR4_SPD_72B_SO_UDIMM		0x09
23*54fd6939SJiyong Park #define DDR4_SPD_16B_SO_DIMM		0x0c
24*54fd6939SJiyong Park #define DDR4_SPD_32B_SO_DIMM		0x0d
25*54fd6939SJiyong Park 
26*54fd6939SJiyong Park #define SPD_SPA0_ADDRESS		0x36
27*54fd6939SJiyong Park #define SPD_SPA1_ADDRESS		0x37
28*54fd6939SJiyong Park 
29*54fd6939SJiyong Park #define spd_to_ps(mtb, ftb)	\
30*54fd6939SJiyong Park 	((mtb) * pdimm->mtb_ps + ((ftb) * pdimm->ftb_10th_ps) / 10)
31*54fd6939SJiyong Park 
32*54fd6939SJiyong Park #ifdef DDR_DEBUG
33*54fd6939SJiyong Park #define dump_spd(spd, len) {				\
34*54fd6939SJiyong Park 	register int i;					\
35*54fd6939SJiyong Park 	register unsigned char *buf = (void *)(spd);	\
36*54fd6939SJiyong Park 							\
37*54fd6939SJiyong Park 	for (i = 0; i < (len); i++) {			\
38*54fd6939SJiyong Park 		print_uint(i);				\
39*54fd6939SJiyong Park 		puts("\t: 0x");				\
40*54fd6939SJiyong Park 		print_hex(buf[i]);			\
41*54fd6939SJiyong Park 		puts("\n");				\
42*54fd6939SJiyong Park 	}						\
43*54fd6939SJiyong Park }
44*54fd6939SJiyong Park #else
45*54fd6939SJiyong Park #define dump_spd(spd, len) {}
46*54fd6939SJiyong Park #endif
47*54fd6939SJiyong Park 
48*54fd6939SJiyong Park /* From JEEC Standard No. 21-C release 23A */
49*54fd6939SJiyong Park struct ddr4_spd {
50*54fd6939SJiyong Park 	/* General Section: Bytes 0-127 */
51*54fd6939SJiyong Park 	unsigned char info_size_crc;	/*  0 # bytes */
52*54fd6939SJiyong Park 	unsigned char spd_rev;		/*  1 Total # bytes of SPD */
53*54fd6939SJiyong Park 	unsigned char mem_type;		/*  2 Key Byte / mem type */
54*54fd6939SJiyong Park 	unsigned char module_type;	/*  3 Key Byte / Module Type */
55*54fd6939SJiyong Park 	unsigned char density_banks;	/*  4 Density and Banks	*/
56*54fd6939SJiyong Park 	unsigned char addressing;	/*  5 Addressing */
57*54fd6939SJiyong Park 	unsigned char package_type;	/*  6 Package type */
58*54fd6939SJiyong Park 	unsigned char opt_feature;	/*  7 Optional features */
59*54fd6939SJiyong Park 	unsigned char thermal_ref;	/*  8 Thermal and refresh */
60*54fd6939SJiyong Park 	unsigned char oth_opt_features;	/*  9 Other optional features */
61*54fd6939SJiyong Park 	unsigned char res_10;		/* 10 Reserved */
62*54fd6939SJiyong Park 	unsigned char module_vdd;	/* 11 Module nominal voltage */
63*54fd6939SJiyong Park 	unsigned char organization;	/* 12 Module Organization */
64*54fd6939SJiyong Park 	unsigned char bus_width;	/* 13 Module Memory Bus Width */
65*54fd6939SJiyong Park 	unsigned char therm_sensor;	/* 14 Module Thermal Sensor */
66*54fd6939SJiyong Park 	unsigned char ext_type;		/* 15 Extended module type */
67*54fd6939SJiyong Park 	unsigned char res_16;
68*54fd6939SJiyong Park 	unsigned char timebases;	/* 17 MTb and FTB */
69*54fd6939SJiyong Park 	unsigned char tck_min;		/* 18 tCKAVGmin */
70*54fd6939SJiyong Park 	unsigned char tck_max;		/* 19 TCKAVGmax */
71*54fd6939SJiyong Park 	unsigned char caslat_b1;	/* 20 CAS latencies, 1st byte */
72*54fd6939SJiyong Park 	unsigned char caslat_b2;	/* 21 CAS latencies, 2nd byte */
73*54fd6939SJiyong Park 	unsigned char caslat_b3;	/* 22 CAS latencies, 3rd byte */
74*54fd6939SJiyong Park 	unsigned char caslat_b4;	/* 23 CAS latencies, 4th byte */
75*54fd6939SJiyong Park 	unsigned char taa_min;		/* 24 Min CAS Latency Time */
76*54fd6939SJiyong Park 	unsigned char trcd_min;		/* 25 Min RAS# to CAS# Delay Time */
77*54fd6939SJiyong Park 	unsigned char trp_min;		/* 26 Min Row Precharge Delay Time */
78*54fd6939SJiyong Park 	unsigned char tras_trc_ext;	/* 27 Upper Nibbles for tRAS and tRC */
79*54fd6939SJiyong Park 	unsigned char tras_min_lsb;	/* 28 tRASmin, lsb */
80*54fd6939SJiyong Park 	unsigned char trc_min_lsb;	/* 29 tRCmin, lsb */
81*54fd6939SJiyong Park 	unsigned char trfc1_min_lsb;	/* 30 Min Refresh Recovery Delay Time */
82*54fd6939SJiyong Park 	unsigned char trfc1_min_msb;	/* 31 Min Refresh Recovery Delay Time */
83*54fd6939SJiyong Park 	unsigned char trfc2_min_lsb;	/* 32 Min Refresh Recovery Delay Time */
84*54fd6939SJiyong Park 	unsigned char trfc2_min_msb;	/* 33 Min Refresh Recovery Delay Time */
85*54fd6939SJiyong Park 	unsigned char trfc4_min_lsb;	/* 34 Min Refresh Recovery Delay Time */
86*54fd6939SJiyong Park 	unsigned char trfc4_min_msb;	/* 35 Min Refresh Recovery Delay Time */
87*54fd6939SJiyong Park 	unsigned char tfaw_msb;		/* 36 Upper Nibble for tFAW */
88*54fd6939SJiyong Park 	unsigned char tfaw_min;		/* 37 tFAW, lsb */
89*54fd6939SJiyong Park 	unsigned char trrds_min;	/* 38 tRRD_Smin, MTB */
90*54fd6939SJiyong Park 	unsigned char trrdl_min;	/* 39 tRRD_Lmin, MTB */
91*54fd6939SJiyong Park 	unsigned char tccdl_min;	/* 40 tCCS_Lmin, MTB */
92*54fd6939SJiyong Park 	unsigned char res_41[60-41];	/* 41 Rserved */
93*54fd6939SJiyong Park 	unsigned char mapping[78-60];	/* 60~77 Connector to SDRAM bit map */
94*54fd6939SJiyong Park 	unsigned char res_78[117-78];	/* 78~116, Reserved */
95*54fd6939SJiyong Park 	signed char fine_tccdl_min;	/* 117 Fine offset for tCCD_Lmin */
96*54fd6939SJiyong Park 	signed char fine_trrdl_min;	/* 118 Fine offset for tRRD_Lmin */
97*54fd6939SJiyong Park 	signed char fine_trrds_min;	/* 119 Fine offset for tRRD_Smin */
98*54fd6939SJiyong Park 	signed char fine_trc_min;	/* 120 Fine offset for tRCmin */
99*54fd6939SJiyong Park 	signed char fine_trp_min;	/* 121 Fine offset for tRPmin */
100*54fd6939SJiyong Park 	signed char fine_trcd_min;	/* 122 Fine offset for tRCDmin */
101*54fd6939SJiyong Park 	signed char fine_taa_min;	/* 123 Fine offset for tAAmin */
102*54fd6939SJiyong Park 	signed char fine_tck_max;	/* 124 Fine offset for tCKAVGmax */
103*54fd6939SJiyong Park 	signed char fine_tck_min;	/* 125 Fine offset for tCKAVGmin */
104*54fd6939SJiyong Park 	/* CRC: Bytes 126-127 */
105*54fd6939SJiyong Park 	unsigned char crc[2];		/* 126-127 SPD CRC */
106*54fd6939SJiyong Park 
107*54fd6939SJiyong Park 	/* Module-Specific Section: Bytes 128-255 */
108*54fd6939SJiyong Park 	union {
109*54fd6939SJiyong Park 		struct {
110*54fd6939SJiyong Park 			/* 128 (Unbuffered) Module Nominal Height */
111*54fd6939SJiyong Park 			unsigned char mod_height;
112*54fd6939SJiyong Park 			/* 129 (Unbuffered) Module Maximum Thickness */
113*54fd6939SJiyong Park 			unsigned char mod_thickness;
114*54fd6939SJiyong Park 			/* 130 (Unbuffered) Reference Raw Card Used */
115*54fd6939SJiyong Park 			unsigned char ref_raw_card;
116*54fd6939SJiyong Park 			/* 131 (Unbuffered) Address Mapping from
117*54fd6939SJiyong Park 			 *     Edge Connector to DRAM
118*54fd6939SJiyong Park 			 */
119*54fd6939SJiyong Park 			unsigned char addr_mapping;
120*54fd6939SJiyong Park 			/* 132~253 (Unbuffered) Reserved */
121*54fd6939SJiyong Park 			unsigned char res_132[254-132];
122*54fd6939SJiyong Park 			/* 254~255 CRC */
123*54fd6939SJiyong Park 			unsigned char crc[2];
124*54fd6939SJiyong Park 		} unbuffered;
125*54fd6939SJiyong Park 		struct {
126*54fd6939SJiyong Park 			/* 128 (Registered) Module Nominal Height */
127*54fd6939SJiyong Park 			unsigned char mod_height;
128*54fd6939SJiyong Park 			/* 129 (Registered) Module Maximum Thickness */
129*54fd6939SJiyong Park 			unsigned char mod_thickness;
130*54fd6939SJiyong Park 			/* 130 (Registered) Reference Raw Card Used */
131*54fd6939SJiyong Park 			unsigned char ref_raw_card;
132*54fd6939SJiyong Park 			/* 131 DIMM Module Attributes */
133*54fd6939SJiyong Park 			unsigned char modu_attr;
134*54fd6939SJiyong Park 			/* 132 RDIMM Thermal Heat Spreader Solution */
135*54fd6939SJiyong Park 			unsigned char thermal;
136*54fd6939SJiyong Park 			/* 133 Register Manufacturer ID Code, LSB */
137*54fd6939SJiyong Park 			unsigned char reg_id_lo;
138*54fd6939SJiyong Park 			/* 134 Register Manufacturer ID Code, MSB */
139*54fd6939SJiyong Park 			unsigned char reg_id_hi;
140*54fd6939SJiyong Park 			/* 135 Register Revision Number */
141*54fd6939SJiyong Park 			unsigned char reg_rev;
142*54fd6939SJiyong Park 			/* 136 Address mapping from register to DRAM */
143*54fd6939SJiyong Park 			unsigned char reg_map;
144*54fd6939SJiyong Park 			unsigned char ca_stren;
145*54fd6939SJiyong Park 			unsigned char clk_stren;
146*54fd6939SJiyong Park 			/* 139~253 Reserved */
147*54fd6939SJiyong Park 			unsigned char res_139[254-139];
148*54fd6939SJiyong Park 			/* 254~255 CRC */
149*54fd6939SJiyong Park 			unsigned char crc[2];
150*54fd6939SJiyong Park 		} registered;
151*54fd6939SJiyong Park 		struct {
152*54fd6939SJiyong Park 			/* 128 (Loadreduced) Module Nominal Height */
153*54fd6939SJiyong Park 			unsigned char mod_height;
154*54fd6939SJiyong Park 			/* 129 (Loadreduced) Module Maximum Thickness */
155*54fd6939SJiyong Park 			unsigned char mod_thickness;
156*54fd6939SJiyong Park 			/* 130 (Loadreduced) Reference Raw Card Used */
157*54fd6939SJiyong Park 			unsigned char ref_raw_card;
158*54fd6939SJiyong Park 			/* 131 DIMM Module Attributes */
159*54fd6939SJiyong Park 			unsigned char modu_attr;
160*54fd6939SJiyong Park 			/* 132 RDIMM Thermal Heat Spreader Solution */
161*54fd6939SJiyong Park 			unsigned char thermal;
162*54fd6939SJiyong Park 			/* 133 Register Manufacturer ID Code, LSB */
163*54fd6939SJiyong Park 			unsigned char reg_id_lo;
164*54fd6939SJiyong Park 			/* 134 Register Manufacturer ID Code, MSB */
165*54fd6939SJiyong Park 			unsigned char reg_id_hi;
166*54fd6939SJiyong Park 			/* 135 Register Revision Number */
167*54fd6939SJiyong Park 			unsigned char reg_rev;
168*54fd6939SJiyong Park 			/* 136 Address mapping from register to DRAM */
169*54fd6939SJiyong Park 			unsigned char reg_map;
170*54fd6939SJiyong Park 			/* 137 Register Output Drive Strength for CMD/Add*/
171*54fd6939SJiyong Park 			unsigned char reg_drv;
172*54fd6939SJiyong Park 			/* 138 Register Output Drive Strength for CK */
173*54fd6939SJiyong Park 			unsigned char reg_drv_ck;
174*54fd6939SJiyong Park 			/* 139 Data Buffer Revision Number */
175*54fd6939SJiyong Park 			unsigned char data_buf_rev;
176*54fd6939SJiyong Park 			/* 140 DRAM VrefDQ for Package Rank 0 */
177*54fd6939SJiyong Park 			unsigned char vrefqe_r0;
178*54fd6939SJiyong Park 			/* 141 DRAM VrefDQ for Package Rank 1 */
179*54fd6939SJiyong Park 			unsigned char vrefqe_r1;
180*54fd6939SJiyong Park 			/* 142 DRAM VrefDQ for Package Rank 2 */
181*54fd6939SJiyong Park 			unsigned char vrefqe_r2;
182*54fd6939SJiyong Park 			/* 143 DRAM VrefDQ for Package Rank 3 */
183*54fd6939SJiyong Park 			unsigned char vrefqe_r3;
184*54fd6939SJiyong Park 			/* 144 Data Buffer VrefDQ for DRAM Interface */
185*54fd6939SJiyong Park 			unsigned char data_intf;
186*54fd6939SJiyong Park 			/*
187*54fd6939SJiyong Park 			 * 145 Data Buffer MDQ Drive Strength and RTT
188*54fd6939SJiyong Park 			 * for data rate <= 1866
189*54fd6939SJiyong Park 			 */
190*54fd6939SJiyong Park 			unsigned char data_drv_1866;
191*54fd6939SJiyong Park 			/*
192*54fd6939SJiyong Park 			 * 146 Data Buffer MDQ Drive Strength and RTT
193*54fd6939SJiyong Park 			 * for 1866 < data rate <= 2400
194*54fd6939SJiyong Park 			 */
195*54fd6939SJiyong Park 			unsigned char data_drv_2400;
196*54fd6939SJiyong Park 			/*
197*54fd6939SJiyong Park 			 * 147 Data Buffer MDQ Drive Strength and RTT
198*54fd6939SJiyong Park 			 * for 2400 < data rate <= 3200
199*54fd6939SJiyong Park 			 */
200*54fd6939SJiyong Park 			unsigned char data_drv_3200;
201*54fd6939SJiyong Park 			/* 148 DRAM Drive Strength */
202*54fd6939SJiyong Park 			unsigned char dram_drv;
203*54fd6939SJiyong Park 			/*
204*54fd6939SJiyong Park 			 * 149 DRAM ODT (RTT_WR, RTT_NOM)
205*54fd6939SJiyong Park 			 * for data rate <= 1866
206*54fd6939SJiyong Park 			 */
207*54fd6939SJiyong Park 			unsigned char dram_odt_1866;
208*54fd6939SJiyong Park 			/*
209*54fd6939SJiyong Park 			 * 150 DRAM ODT (RTT_WR, RTT_NOM)
210*54fd6939SJiyong Park 			 * for 1866 < data rate <= 2400
211*54fd6939SJiyong Park 			 */
212*54fd6939SJiyong Park 			unsigned char dram_odt_2400;
213*54fd6939SJiyong Park 			/*
214*54fd6939SJiyong Park 			 * 151 DRAM ODT (RTT_WR, RTT_NOM)
215*54fd6939SJiyong Park 			 * for 2400 < data rate <= 3200
216*54fd6939SJiyong Park 			 */
217*54fd6939SJiyong Park 			unsigned char dram_odt_3200;
218*54fd6939SJiyong Park 			/*
219*54fd6939SJiyong Park 			 * 152 DRAM ODT (RTT_PARK)
220*54fd6939SJiyong Park 			 * for data rate <= 1866
221*54fd6939SJiyong Park 			 */
222*54fd6939SJiyong Park 			unsigned char dram_odt_park_1866;
223*54fd6939SJiyong Park 			/*
224*54fd6939SJiyong Park 			 * 153 DRAM ODT (RTT_PARK)
225*54fd6939SJiyong Park 			 * for 1866 < data rate <= 2400
226*54fd6939SJiyong Park 			 */
227*54fd6939SJiyong Park 			unsigned char dram_odt_park_2400;
228*54fd6939SJiyong Park 			/*
229*54fd6939SJiyong Park 			 * 154 DRAM ODT (RTT_PARK)
230*54fd6939SJiyong Park 			 * for 2400 < data rate <= 3200
231*54fd6939SJiyong Park 			 */
232*54fd6939SJiyong Park 			unsigned char dram_odt_park_3200;
233*54fd6939SJiyong Park 			unsigned char res_155[254-155];	/* Reserved */
234*54fd6939SJiyong Park 			/* 254~255 CRC */
235*54fd6939SJiyong Park 			unsigned char crc[2];
236*54fd6939SJiyong Park 		} loadreduced;
237*54fd6939SJiyong Park 		unsigned char uc[128]; /* 128-255 Module-Specific Section */
238*54fd6939SJiyong Park 	} mod_section;
239*54fd6939SJiyong Park 
240*54fd6939SJiyong Park 	unsigned char res_256[320-256];	/* 256~319 Reserved */
241*54fd6939SJiyong Park 
242*54fd6939SJiyong Park 	/* Module supplier's data: Byte 320~383 */
243*54fd6939SJiyong Park 	unsigned char mmid_lsb;		/* 320 Module MfgID Code LSB */
244*54fd6939SJiyong Park 	unsigned char mmid_msb;		/* 321 Module MfgID Code MSB */
245*54fd6939SJiyong Park 	unsigned char mloc;		/* 322 Mfg Location */
246*54fd6939SJiyong Park 	unsigned char mdate[2];		/* 323~324 Mfg Date */
247*54fd6939SJiyong Park 	unsigned char sernum[4];	/* 325~328 Module Serial Number */
248*54fd6939SJiyong Park 	unsigned char mpart[20];	/* 329~348 Mfg's Module Part Number */
249*54fd6939SJiyong Park 	unsigned char mrev;		/* 349 Module Revision Code */
250*54fd6939SJiyong Park 	unsigned char dmid_lsb;		/* 350 DRAM MfgID Code LSB */
251*54fd6939SJiyong Park 	unsigned char dmid_msb;		/* 351 DRAM MfgID Code MSB */
252*54fd6939SJiyong Park 	unsigned char stepping;		/* 352 DRAM stepping */
253*54fd6939SJiyong Park 	unsigned char msd[29];		/* 353~381 Mfg's Specific Data */
254*54fd6939SJiyong Park 	unsigned char res_382[2];	/* 382~383 Reserved */
255*54fd6939SJiyong Park };
256*54fd6939SJiyong Park 
257*54fd6939SJiyong Park /* Parameters for a DDR dimm computed from the SPD */
258*54fd6939SJiyong Park struct dimm_params {
259*54fd6939SJiyong Park 	/* DIMM organization parameters */
260*54fd6939SJiyong Park 	char mpart[19];		/* guaranteed null terminated */
261*54fd6939SJiyong Park 
262*54fd6939SJiyong Park 	unsigned int n_ranks;
263*54fd6939SJiyong Park 	unsigned int die_density;
264*54fd6939SJiyong Park 	unsigned long long rank_density;
265*54fd6939SJiyong Park 	unsigned long long capacity;
266*54fd6939SJiyong Park 	unsigned int primary_sdram_width;
267*54fd6939SJiyong Park 	unsigned int ec_sdram_width;
268*54fd6939SJiyong Park 	unsigned int rdimm;
269*54fd6939SJiyong Park 	unsigned int package_3ds;	/* number of dies in 3DS */
270*54fd6939SJiyong Park 	unsigned int device_width;	/* x4, x8, x16 components */
271*54fd6939SJiyong Park 	unsigned int rc;
272*54fd6939SJiyong Park 
273*54fd6939SJiyong Park 	/* SDRAM device parameters */
274*54fd6939SJiyong Park 	unsigned int n_row_addr;
275*54fd6939SJiyong Park 	unsigned int n_col_addr;
276*54fd6939SJiyong Park 	unsigned int edc_config;	/* 0 = none, 1 = parity, 2 = ECC */
277*54fd6939SJiyong Park 	unsigned int bank_addr_bits;
278*54fd6939SJiyong Park 	unsigned int bank_group_bits;
279*54fd6939SJiyong Park 	unsigned int burst_lengths_bitmask;	/* BL=4 bit 2, BL=8 = bit 3 */
280*54fd6939SJiyong Park 
281*54fd6939SJiyong Park 	/* mirrored DIMMs */
282*54fd6939SJiyong Park 	unsigned int mirrored_dimm;	/* only for ddr3 */
283*54fd6939SJiyong Park 
284*54fd6939SJiyong Park 	/* DIMM timing parameters */
285*54fd6939SJiyong Park 
286*54fd6939SJiyong Park 	int mtb_ps;	/* medium timebase ps */
287*54fd6939SJiyong Park 	int ftb_10th_ps; /* fine timebase, in 1/10 ps */
288*54fd6939SJiyong Park 	int taa_ps;	/* minimum CAS latency time */
289*54fd6939SJiyong Park 	int tfaw_ps;	/* four active window delay */
290*54fd6939SJiyong Park 
291*54fd6939SJiyong Park 	/*
292*54fd6939SJiyong Park 	 * SDRAM clock periods
293*54fd6939SJiyong Park 	 * The range for these are 1000-10000 so a short should be sufficient
294*54fd6939SJiyong Park 	 */
295*54fd6939SJiyong Park 	int tckmin_x_ps;
296*54fd6939SJiyong Park 	int tckmax_ps;
297*54fd6939SJiyong Park 
298*54fd6939SJiyong Park 	/* SPD-defined CAS latencies */
299*54fd6939SJiyong Park 	unsigned int caslat_x;
300*54fd6939SJiyong Park 
301*54fd6939SJiyong Park 	/* basic timing parameters */
302*54fd6939SJiyong Park 	int trcd_ps;
303*54fd6939SJiyong Park 	int trp_ps;
304*54fd6939SJiyong Park 	int tras_ps;
305*54fd6939SJiyong Park 
306*54fd6939SJiyong Park 	int trfc1_ps;
307*54fd6939SJiyong Park 	int trfc2_ps;
308*54fd6939SJiyong Park 	int trfc4_ps;
309*54fd6939SJiyong Park 	int trrds_ps;
310*54fd6939SJiyong Park 	int trrdl_ps;
311*54fd6939SJiyong Park 	int tccdl_ps;
312*54fd6939SJiyong Park 	int trfc_slr_ps;
313*54fd6939SJiyong Park 
314*54fd6939SJiyong Park 	int trc_ps;	/* maximum = 254 ns + .75 ns = 254750 ps */
315*54fd6939SJiyong Park 	int twr_ps;	/* 15ns  for all speed bins */
316*54fd6939SJiyong Park 
317*54fd6939SJiyong Park 	unsigned int refresh_rate_ps;
318*54fd6939SJiyong Park 	unsigned int extended_op_srt;
319*54fd6939SJiyong Park 
320*54fd6939SJiyong Park 	/* RDIMM */
321*54fd6939SJiyong Park 	unsigned char rcw[16];	/* Register Control Word 0-15 */
322*54fd6939SJiyong Park 	unsigned int dq_mapping[18];
323*54fd6939SJiyong Park 	unsigned int dq_mapping_ors;
324*54fd6939SJiyong Park };
325*54fd6939SJiyong Park 
326*54fd6939SJiyong Park int read_spd(unsigned char chip, void *buf, int len);
327*54fd6939SJiyong Park int crc16(unsigned char *ptr, int count);
328*54fd6939SJiyong Park int cal_dimm_params(const struct ddr4_spd *spd, struct dimm_params *pdimm);
329*54fd6939SJiyong Park 
330*54fd6939SJiyong Park #endif /* DIMM_H */
331