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