xref: /openbmc/u-boot/drivers/ddr/marvell/a38x/mv_ddr_spd.h (revision ca70cbabdcd19bf157ae4fa984559b126071ccff)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * Copyright (C) Marvell International Ltd. and its affiliates
4   */
5  
6  #ifndef _MV_DDR_SPD_H
7  #define _MV_DDR_SPD_H
8  
9  #include "mv_ddr_topology.h"
10  
11  /*
12   * Based on JEDEC Standard No. 21-C, 4.1.2.L-4:
13   * Serial Presence Detect (SPD) for DDR4 SDRAM Modules
14   */
15  
16  /* block 0: base configuration and dram parameters */
17  #define MV_DDR_SPD_DATA_BLOCK0_SIZE		128
18  /* block 1: module specific parameters sub-block */
19  #define MV_DDR_SPD_DATA_BLOCK1M_SIZE		64
20  /* block 1: hybrid memory parameters sub-block */
21  #define MV_DDR_SPD_DATA_BLOCK1H_SIZE		64
22  /* block 2: extended function parameter block */
23  #define MV_DDR_SPD_DATA_BLOCK2E_SIZE		64
24  /* block 2: manufacturing information */
25  #define MV_DDR_SPD_DATA_BLOCK2M_SIZE		64
26  /* block 3: end user programmable */
27  #define MV_DDR_SPD_DATA_BLOCK3_SIZE		128
28  
29  #define MV_DDR_SPD_DEV_TYPE_DDR4		0xc
30  #define MV_DDR_SPD_MODULE_TYPE_UDIMM		0x2
31  #define MV_DDR_SPD_MODULE_TYPE_SO_DIMM		0x3
32  #define MV_DDR_SPD_MODULE_TYPE_MINI_UDIMM	0x6
33  #define MV_DDR_SPD_MODULE_TYPE_72BIT_SO_UDIMM	0x9
34  #define MV_DDR_SPD_MODULE_TYPE_16BIT_SO_DIMM	0xc
35  #define MV_DDR_SPD_MODULE_TYPE_32BIT_SO_DIMM	0xd
36  
37  /*
38   * TODO: For now, the struct contains block 0 & block 1 with module specific
39   * parameters for unbuffered memory module types only.
40   */
41  union mv_ddr_spd_data {
42  	unsigned char all_bytes[MV_DDR_SPD_DATA_BLOCK0_SIZE +
43  				MV_DDR_SPD_DATA_BLOCK1M_SIZE];
44  	struct {
45  		/* block 0 */
46  		union { /* num of bytes used/num of bytes in spd device/crc coverage */
47  			unsigned char all_bits;
48  			struct {
49  				unsigned char spd_bytes_used:4,
50  					spd_bytes_total:3,
51  					reserved:1;
52  			} bit_fields;
53  		} byte_0;
54  		union { /* spd revision */
55  			unsigned char all_bits;
56  			struct {
57  				unsigned char addtions_level:4,
58  					encoding_level:4;
59  			} bit_fields;
60  		} byte_1;
61  		unsigned char  byte_2; /* key_byte/dram device type */
62  		union { /* key byte/module type */
63  			unsigned char all_bits;
64  			struct {
65  				unsigned char module_type:4,
66  					hybrid_media:3,
67  					hybrid:1;
68  			} bit_fields;
69  		} byte_3;
70  		union { /* sdram density & banks */
71  			unsigned char all_bits;
72  			struct {
73  				unsigned char die_capacity:4,
74  					bank_address:2,
75  					bank_group:2;
76  			} bit_fields;
77  		} byte_4;
78  		union { /* sdram addressing */
79  			unsigned char all_bits;
80  			struct {
81  				unsigned char col_address:3,
82  					row_address:3,
83  					reserved:2;
84  			} bit_fields;
85  		} byte_5;
86  		union { /* sdram package type */
87  			unsigned char all_bits;
88  			struct {
89  				unsigned char signal_loading:2,
90  					reserved:2,
91  					die_count:3,
92  					sdram_package_type:1;
93  			} bit_fields;
94  		} byte_6;
95  		union { /* sdram optional features */
96  			unsigned char all_bits;
97  			struct {
98  				unsigned char mac:4, /* max activate count */
99  					t_maw:2, /* max activate window */
100  					reserved:2; /* all 0s */
101  			} bit_fields;
102  		} byte_7;
103  		unsigned char byte_8; /* sdram thermal & refresh options; reserved; 0x00 */
104  		union { /* other sdram optional features */
105  			unsigned char all_bits;
106  			struct {
107  				unsigned char reserved:5, /* all 0s */
108  					soft_ppr:1,
109  					ppr:2; /* post package repair */
110  			} bit_fields;
111  		} byte_9;
112  		union { /* secondary sdram package type */
113  			unsigned char all_bits;
114  			struct {
115  				unsigned char signal_loading:2,
116  					density_ratio:2, /* dram density ratio */
117  					die_count:3,
118  					sdram_package_type:1;
119  			} bit_fields;
120  		} byte_10;
121  		union { /* module nominal voltage, vdd */
122  			unsigned char all_bits;
123  			struct {
124  				unsigned char operable:1,
125  					endurant:1,
126  					reserved:5; /* all 0s */
127  			} bit_fields;
128  		} byte_11;
129  		union { /* module organization*/
130  			unsigned char all_bits;
131  			struct {
132  				unsigned char device_width:3,
133  					dimm_pkg_ranks_num:3, /* package ranks per dimm number */
134  					rank_mix:1,
135  					reserved:1; /* 0 */
136  			} bit_fields;
137  		} byte_12;
138  		union { /* module memory bus width */
139  			unsigned char all_bits;
140  			struct {
141  				unsigned char primary_bus_width:3, /* in bits */
142  					bus_width_ext:2, /* in bits */
143  					reserved:3; /* all 0s */
144  			} bit_fields;
145  		} byte_13;
146  		union { /* module thernal sensor */
147  			unsigned char all_bits;
148  			struct {
149  				unsigned char reserved:7,
150  					thermal_sensor:1;
151  			} bit_fields;
152  		} byte_14;
153  		union { /* extended module type */
154  			unsigned char all_bits;
155  			struct {
156  				unsigned char ext_base_module_type:4,
157  					reserved:4; /* all 0s */
158  			} bit_fields;
159  		} byte_15;
160  		unsigned char byte_16; /* reserved; 0x00 */
161  		union { /* timebases */
162  			unsigned char all_bits;
163  			struct {
164  				unsigned char ftb:2, /* fine timebase */
165  					mtb:2, /* medium timebase */
166  					reserved:4; /* all 0s */
167  			} bit_fields;
168  		} byte_17;
169  		unsigned char byte_18; /* sdram min cycle time (t ck avg min), mtb */
170  		unsigned char byte_19; /* sdram max cycle time (t ck avg max), mtb */
171  		unsigned char byte_20; /* cas latencies supported, first byte */
172  		unsigned char byte_21; /* cas latencies supported, second byte */
173  		unsigned char byte_22; /* cas latencies supported, third byte */
174  		unsigned char byte_23; /* cas latencies supported, fourth byte */
175  		unsigned char byte_24; /* min cas latency time (t aa min), mtb */
176  		unsigned char byte_25; /* min ras to cas delay time (t rcd min), mtb */
177  		unsigned char byte_26; /* min row precharge delay time (t rp min), mtb */
178  		union { /* upper nibbles for t ras min & t rc min */
179  			unsigned char all_bits;
180  			struct {
181  				unsigned char t_ras_min_msn:4, /* t ras min most significant nibble */
182  					t_rc_min_msn:4; /* t rc min most significant nibble */
183  			} bit_fields;
184  		} byte_27;
185  		unsigned char byte_28; /* min active to precharge delay time (t ras min), l-s-byte, mtb */
186  		unsigned char byte_29; /* min active to active/refresh delay time (t rc min), l-s-byte, mtb */
187  		unsigned char byte_30; /* min refresh recovery delay time (t rfc1 min), l-s-byte, mtb */
188  		unsigned char byte_31; /* min refresh recovery delay time (t rfc1 min), m-s-byte, mtb */
189  		unsigned char byte_32; /* min refresh recovery delay time (t rfc2 min), l-s-byte, mtb */
190  		unsigned char byte_33; /* min refresh recovery delay time (t rfc2 min), m-s-byte, mtb */
191  		unsigned char byte_34; /* min refresh recovery delay time (t rfc4 min), l-s-byte, mtb */
192  		unsigned char byte_35; /* min refresh recovery delay time (t rfc4 min), m-s-byte, mtb */
193  		union { /* upper nibble for t faw */
194  			unsigned char all_bits;
195  			struct {
196  				unsigned char t_faw_min_msn:4, /* t faw min most significant nibble */
197  					reserved:4;
198  			} bit_fields;
199  		} byte_36;
200  		unsigned char byte_37; /* min four activate window delay time (t faw min), l-s-byte, mtb */
201  		/* byte 38: min activate to activate delay time (t rrd_s min), diff bank group, mtb */
202  		unsigned char byte_38;
203  		/* byte 39: min activate to activate delay time (t rrd_l min), same bank group, mtb */
204  		unsigned char byte_39;
205  		unsigned char byte_40; /* min cas to cas delay time (t ccd_l min), same bank group, mtb */
206  		union { /* upper nibble for t wr min */
207  			unsigned char all_bits;
208  			struct {
209  				unsigned char t_wr_min_msn:4, /* t wr min most significant nibble */
210  					reserved:4;
211  			} bit_fields;
212  		} byte_41;
213  		unsigned char byte_42; /* min write recovery time (t wr min) */
214  		union { /* upper nibbles for t wtr min */
215  			unsigned char all_bits;
216  			struct {
217  				unsigned char t_wtr_s_min_msn:4, /* t wtr s min most significant nibble */
218  					t_wtr_l_min_msn:4; /* t wtr l min most significant nibble */
219  			} bit_fields;
220  		} byte_43;
221  		unsigned char byte_44; /* min write to read time (t wtr s min), diff bank group, mtb */
222  		unsigned char byte_45; /* min write to read time (t wtr l min), same bank group, mtb */
223  		unsigned char bytes_46_59[14]; /* reserved; all 0s */
224  		unsigned char bytes_60_77[18]; /* TODO: connector to sdram bit mapping */
225  		unsigned char bytes_78_116[39]; /* reserved; all 0s */
226  		/* fine offset for min cas to cas delay time (t ccd_l min), same bank group, ftb */
227  		unsigned char byte_117;
228  		/* fine offset for min activate to activate delay time (t rrd_l min), same bank group, ftb */
229  		unsigned char byte_118;
230  		/* fine offset for min activate to activate delay time (t rrd_s min), diff bank group, ftb */
231  		unsigned char byte_119;
232  		/* fine offset for min active to active/refresh delay time (t rc min), ftb */
233  		unsigned char byte_120;
234  		unsigned char byte_121; /* fine offset for min row precharge delay time (t rp min), ftb */
235  		unsigned char byte_122; /* fine offset for min ras to cas delay time (t rcd min), ftb */
236  		unsigned char byte_123; /* fine offset for min cas latency time (t aa min), ftb */
237  		unsigned char byte_124; /* fine offset for sdram max cycle time (t ck avg max), ftb */
238  		unsigned char byte_125; /* fine offset for sdram min cycle time (t ck avg min), ftb */
239  		unsigned char byte_126; /* crc for base configuration section, l-s-byte */
240  		unsigned char byte_127; /* crc for base configuration section, m-s-byte */
241  		/*
242  		 * block 1: module specific parameters for unbuffered memory module types only
243  		 */
244  		union { /* (unbuffered) raw card extension, module nominal height */
245  			unsigned char all_bits;
246  			struct {
247  				unsigned char nom_height_max:5, /* in mm */
248  					raw_cad_ext:3;
249  			} bit_fields;
250  		} byte_128;
251  		union { /* (unbuffered) module maximum thickness */
252  			unsigned char all_bits;
253  			struct {
254  				unsigned char front_thickness_max:4, /* in mm */
255  					back_thickness_max:4; /* in mm */
256  			} bit_fields;
257  		} byte_129;
258  		union { /* (unbuffered) reference raw card used */
259  			unsigned char all_bits;
260  			struct {
261  				unsigned char ref_raw_card:5,
262  					ref_raw_card_rev:2,
263  					ref_raw_card_ext:1;
264  			} bit_fields;
265  		} byte_130;
266  		union { /* (unbuffered) address mapping from edge connector to dram */
267  			unsigned char all_bits;
268  			struct {
269  				unsigned char rank_1_mapping:1,
270  					reserved:7;
271  			} bit_fields;
272  		} byte_131;
273  		unsigned char bytes_132_191[60]; /* reserved; all 0s */
274  	} byte_fields;
275  };
276  
277  int mv_ddr_spd_timing_calc(union mv_ddr_spd_data *spd_data, unsigned int timing_data[]);
278  enum mv_ddr_dev_width mv_ddr_spd_dev_width_get(union mv_ddr_spd_data *spd_data);
279  enum mv_ddr_die_capacity mv_ddr_spd_die_capacity_get(union mv_ddr_spd_data *spd_data);
280  unsigned char mv_ddr_spd_mem_mirror_get(union mv_ddr_spd_data *spd_data);
281  unsigned char mv_ddr_spd_cs_bit_mask_get(union mv_ddr_spd_data *spd_data);
282  unsigned char mv_ddr_spd_dev_type_get(union mv_ddr_spd_data *spd_data);
283  unsigned char mv_ddr_spd_module_type_get(union mv_ddr_spd_data *spd_data);
284  int mv_ddr_spd_supported_cls_calc(union mv_ddr_spd_data *spd_data);
285  unsigned int mv_ddr_spd_supported_cl_get(unsigned int cl);
286  enum mv_ddr_pkg_rank mv_ddr_spd_pri_bus_width_get(union mv_ddr_spd_data *spd_data);
287  enum mv_ddr_pkg_rank mv_ddr_spd_bus_width_ext_get(union mv_ddr_spd_data *spd_data);
288  
289  #endif /* _MV_DDR_SPD_H */
290