blob: 1152f45c099e99cc198be0f72b70974e0b3ad046 [file] [log] [blame]
David Hendricks6638f872015-11-04 14:52:02 -08001/*
2 * Copyright 2015, Google Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials provided
14 * with the distribution.
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
Jack Rosenthal65ea4c32020-04-22 13:59:11 -060032#include <string.h>
33
34#include "lib/math.h"
David Hendricks6638f872015-11-04 14:52:02 -080035#include "lib/nonspd.h"
Jack Rosenthal65ea4c32020-04-22 13:59:11 -060036#include "mosys/log.h"
David Hendricks6638f872015-11-04 14:52:02 -080037
David Hendricks0fa54152016-03-16 15:08:56 -070038const struct nonspd_mem_info elpida_lpddr3_edfa164a2ma_jd_f = {
David Hendricks6638f872015-11-04 14:52:02 -080039 .dram_type = SPD_DRAM_TYPE_LPDDR3,
40 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
41
42 .module_size_mbits = 8192,
43 .num_ranks = 2,
44 .device_width = 32,
45 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
46
47 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
48 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
49
50 .part_num =
51 { 'E', 'D', 'F', 'A', '1', '6', '4', 'A', '2', 'M', 'A', '-',
52 'J', 'D', '-', 'F',},
53};
54
David Hendricks0fa54152016-03-16 15:08:56 -070055const struct nonspd_mem_info hynix_ddr3l_h5tc4g63afr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -080056 .dram_type = SPD_DRAM_TYPE_DDR3,
57 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
58
59 .module_size_mbits = 4096,
60 .num_ranks = 1,
61 .device_width = 16,
62 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
63
64 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
65 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
66
David Hendricks6638f872015-11-04 14:52:02 -080067 .part_num =
68 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'A', 'F', 'R', '-',
69 'P', 'B', 'A'},
70};
71
David Hendricks0fa54152016-03-16 15:08:56 -070072const struct nonspd_mem_info hynix_ddr3l_h5tc4g63cfr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -080073 .dram_type = SPD_DRAM_TYPE_DDR3,
74 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
75
76 .module_size_mbits = 4096,
77 .num_ranks = 1,
78 .device_width = 16,
79 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
80
81 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
82 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
83
David Hendricks6638f872015-11-04 14:52:02 -080084 .part_num =
85 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'C', 'F', 'R', '-',
86 'P', 'B', 'A'},
87};
88
Zheng Pan56c19e52018-10-23 17:01:11 -070089const struct nonspd_mem_info hynix_ddr3l_h5tc4g63efr_rda = {
90 .dram_type = SPD_DRAM_TYPE_DDR3,
91 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
92
93 .module_size_mbits = 4096,
94 .num_ranks = 1,
95 .device_width = 16,
96 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
97
98 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
99 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
100
Zheng Pan56c19e52018-10-23 17:01:11 -0700101 .part_num =
102 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'E', 'F', 'R', '-',
103 'R', 'D', 'A'},
104};
105
David Hendricks0fa54152016-03-16 15:08:56 -0700106const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8gtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800107 .dram_type = SPD_DRAM_TYPE_LPDDR3,
108 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
109
110 .module_size_mbits = 8192,
111 .num_ranks = 1,
112 .device_width = 32,
113 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
114
115 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
116 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
117
118 .part_num =
119 { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'G', 'T', 'M', 'L',
120 'A', 'R', '-', 'N', 'U', 'D',},
121};
122
Milton Chiang5664fe32016-11-29 14:59:49 +0800123const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtalar_nud = {
124 .dram_type = SPD_DRAM_TYPE_LPDDR3,
125 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
126
127 .module_size_mbits = 16384,
128 .num_ranks = 2,
129 .device_width = 32,
130 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
131
132 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
133 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
134
135 .part_num =
136 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'J', 'T', 'A', 'L',
137 'A', 'R', '-', 'N', 'U', 'D',},
138};
139
David Hendricks0fa54152016-03-16 15:08:56 -0700140const struct nonspd_mem_info hynix_ddr3l_h5tc8g63amr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800141 .dram_type = SPD_DRAM_TYPE_DDR3,
142 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
143 .module_size_mbits = 8192,
144 .num_ranks = 2,
145 .device_width = 16,
146 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
147
148 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
149 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
150
David Hendricks6638f872015-11-04 14:52:02 -0800151 .part_num =
152 { 'H', '5', 'T', 'C', '8', 'G', '6', '3', 'A', 'M', 'R', '-',
153 'P', 'B', 'A' },
154};
155
David Hendricks0fa54152016-03-16 15:08:56 -0700156const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbptblbr_nud = {
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800157 .dram_type = SPD_DRAM_TYPE_LPDDR3,
158 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
159
160 .module_size_mbits = 16384,
161 .num_ranks = 2,
162 .device_width = 32,
163 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
164
165 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
166 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
167
168 .part_num =
169 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'P', 'T', 'B', 'L',
170 'B', 'R', '-', 'N', 'U', 'D',},
171};
172
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800173const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbltblar_nud = {
174 .dram_type = SPD_DRAM_TYPE_LPDDR3,
175 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
176
177 .module_size_mbits = 16384,
178 .num_ranks = 2,
179 .device_width = 32,
180 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
181
182 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
183 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
184
185 .part_num =
186 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'L', 'T', 'B', 'L',
187 'A', 'R', '-', 'N', 'U', 'D',},
188};
189
Loop_Wu9ec61642019-01-29 14:28:34 +0800190const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbktmlbr_ntd = {
191 .dram_type = SPD_DRAM_TYPE_LPDDR3,
192 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
193
194 .module_size_mbits = 16384,
195 .num_ranks = 2,
196 .device_width = 32,
197 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
198
199 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
200 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
201
202 .part_num =
203 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'K', 'T', 'M', 'L',
204 'B', 'R', '-', 'N', 'T', 'D',},
205};
206
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800207const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmalhr_nee = {
208 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
209
210 .module_size_mbits = 32768,
211 .num_ranks = 2,
212 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700213 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800214
215 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
216 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
217
218 .part_num =
219 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'A', 'L',
220 'H', 'R', '-', 'N', 'E', 'E'},
221};
222
Eason Lina80ba0a2020-07-15 16:58:24 +0800223const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmmlxr_nee = {
224 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
225
226 .module_size_mbits = 32768,
227 .num_ranks = 2,
228 .device_width = 32,
229 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
230
231 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
232 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
233
234 .part_num =
235 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'M', 'L',
236 'X', 'R', '-', 'N', 'E', 'E'},
237};
238
Bob Moraguesd8e1a692021-01-10 05:28:36 +0000239const struct nonspd_mem_info hynix_lpddr4x_h9hcnnnfammlxr_nee = {
240 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
241
242 .module_size_mbits = 65536,
243 .num_ranks = 2,
244 .device_width = 32,
245 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
246
247 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
248 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
249
250 .part_num =
251 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'F', 'A', 'M', 'M', 'L',
252 'X', 'R', '-', 'N', 'E', 'E' },
253};
254
David Hendricks6638f872015-11-04 14:52:02 -0800255const struct nonspd_mem_info micron_mt41k256m16ha = {
256 .dram_type = SPD_DRAM_TYPE_DDR3,
257 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
258
259 .module_size_mbits = 4096,
260 .num_ranks = 1,
261 .device_width = 16,
262 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
263
264 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
265 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
266
David Hendricks6638f872015-11-04 14:52:02 -0800267 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
268 '1', '6', 'H', 'A', '-', '1', '2', '5' },
269};
270
David Hendricks97303242015-11-11 14:41:40 -0800271const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
272 .dram_type = SPD_DRAM_TYPE_DDR3,
273 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
274
275 .module_size_mbits = 4096,
276 .num_ranks = 1,
277 .device_width = 16,
278 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
279 .ddr_freq = { DDR_667, DDR_800 },
280 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
281 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
282
David Hendricks97303242015-11-11 14:41:40 -0800283 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
284 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
285};
286
Zheng Pan56c19e52018-10-23 17:01:11 -0700287const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
288 .dram_type = SPD_DRAM_TYPE_DDR3,
289 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
290
291 .module_size_mbits = 4096,
292 .num_ranks = 1,
293 .device_width = 16,
294 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
295 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
296 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
297
Zheng Pan56c19e52018-10-23 17:01:11 -0700298 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
299 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
300};
301
Huanhuan Liu22e02562020-10-14 14:57:39 +0800302const struct nonspd_mem_info nanya_lpddr3_nt6cl512t32am_h0 = {
303 .dram_type = SPD_DRAM_TYPE_LPDDR3,
304 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
305
306 .module_size_mbits = 16384,
307 .num_ranks = 2,
308 .device_width = 32,
309 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
310 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
311 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
312
313 .part_num = { 'N', 'T', '6', 'C', 'L', '5', '1', '2',
314 'T', '3', '2', 'A', 'M', '-', 'H', '0' },
315};
316
David Hendricks6638f872015-11-04 14:52:02 -0800317const struct nonspd_mem_info samsung_k4b4g1646d = {
318 .dram_type = SPD_DRAM_TYPE_DDR3,
319 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
320
321 .module_size_mbits = 4096,
322 .num_ranks = 1,
323 .device_width = 16,
324 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
325
326 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
327 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
328
David Hendricks6638f872015-11-04 14:52:02 -0800329 .part_num =
330 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
331 '-', 'B', 'Y', 'K', '0' },
332};
333
334const struct nonspd_mem_info samsung_k4b4g1646e = {
335 .dram_type = SPD_DRAM_TYPE_DDR3,
336 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
337
338 .module_size_mbits = 4096,
339 .num_ranks = 1,
340 .device_width = 16,
341 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
342
343 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
344 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
345
David Hendricks6638f872015-11-04 14:52:02 -0800346 .part_num =
347 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
348 '-', 'B', 'Y', 'K', '0' },
349};
350
Zheng Pan56c19e52018-10-23 17:01:11 -0700351const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
352 .dram_type = SPD_DRAM_TYPE_DDR3,
353 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
354
355 .module_size_mbits = 4096,
356 .num_ranks = 1,
357 .device_width = 16,
358 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
359
360 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
361 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
362
Zheng Pan56c19e52018-10-23 17:01:11 -0700363 .part_num =
364 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
365 '-', 'B', 'Y', 'M', 'A' },
366};
367
David Hendricks0fa54152016-03-16 15:08:56 -0700368const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800369 .dram_type = SPD_DRAM_TYPE_DDR3,
370 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
371
372 .module_size_mbits = 4096,
373 .num_ranks = 1,
374 .device_width = 16,
375 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
376
377 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
378 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
379
David Hendricks6638f872015-11-04 14:52:02 -0800380 .part_num =
381 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
382 'B', 'Y', 'K', '0' },
383};
384
David Hendricks0fa54152016-03-16 15:08:56 -0700385const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800386 .dram_type = SPD_DRAM_TYPE_DDR3,
387 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
388
389 .module_size_mbits = 4096,
390 .num_ranks = 1,
391 .device_width = 16,
392 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
393
394 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
395 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
396
David Hendricks6638f872015-11-04 14:52:02 -0800397 .part_num =
398 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
399 'H', 'Y', 'K', '0' },
400};
401
David Hendricks0fa54152016-03-16 15:08:56 -0700402const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800403 .dram_type = SPD_DRAM_TYPE_DDR3,
404 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
405 .module_size_mbits = 8192,
406 .num_ranks = 2,
407 .device_width = 16,
408 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
409
410 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
411 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
412
David Hendricks6638f872015-11-04 14:52:02 -0800413 .part_num =
414 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
415 'M', 'Y', 'K', '0' },
416};
417
David Hendricks0fa54152016-03-16 15:08:56 -0700418const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800419 .dram_type = SPD_DRAM_TYPE_LPDDR3,
420 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
421
422 .module_size_mbits = 8192,
423 .num_ranks = 2,
424 .device_width = 32,
425 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
426
427 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
428 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
429
430 .part_num =
431 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
432 'A', 'G', 'C', 'E' },
433};
434
Vincent Palatin90af8e62016-05-20 12:12:49 -0700435const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
436 .dram_type = SPD_DRAM_TYPE_LPDDR3,
437 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
438
439 .module_size_mbits = 16384,
440 .num_ranks = 2,
441 .device_width = 32,
442 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
443
444 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
445 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
446
447 .part_num =
448 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
449 'E', 'G', 'C', 'E' },
450};
451
David Hendricks0fa54152016-03-16 15:08:56 -0700452const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800453 .dram_type = SPD_DRAM_TYPE_LPDDR3,
454 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
455
456 .module_size_mbits = 16384,
457 .num_ranks = 2,
458 .device_width = 32,
459 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
460
461 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
462 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
463
464 .part_num =
465 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
466 'E', 'G', 'C', 'E' },
467};
468
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800469const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
470 .dram_type = SPD_DRAM_TYPE_LPDDR3,
471 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
472
473 .module_size_mbits = 16384,
474 .num_ranks = 2,
475 .device_width = 32,
476 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
477
478 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
479 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
480
481 .part_num =
482 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
483 'E', 'G', 'C', 'F' },
484};
485
xuxinxiong6079e222021-02-21 16:10:07 +0800486const struct nonspd_mem_info samsung_lpddr3_k4e6e304ec_egcg = {
487 .dram_type = SPD_DRAM_TYPE_LPDDR3,
488 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
489
490 .module_size_mbits = 16384,
491 .num_ranks = 2,
492 .device_width = 32,
493 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
494
495 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
496 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
497
498 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'C',
499 '-', 'E', 'G', 'C', 'G' },
500};
501
David Hendricks0fa54152016-03-16 15:08:56 -0700502const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800503 .dram_type = SPD_DRAM_TYPE_LPDDR3,
504 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
505
506 .module_size_mbits = 8192,
507 .num_ranks = 2,
508 .device_width = 32,
509 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
510
511 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
512 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
513
514 .part_num =
515 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
516 'E', 'G', 'C', 'E' },
517};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700518
519const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
520 .dram_type = SPD_DRAM_TYPE_LPDDR3,
521 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
522
523 .module_size_mbits = 8192,
524 .num_ranks = 2,
525 .device_width = 32,
526 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
527
528 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
529 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
530
531 .part_num =
532 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
533 'E', 'G', 'C', 'F' },
534};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700535
Huanhuan Liu22e02562020-10-14 14:57:39 +0800536const struct nonspd_mem_info samsung_lpddr3_k4e6e304ed_egcg = {
537 .dram_type = SPD_DRAM_TYPE_LPDDR3,
538 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
539
540 .module_size_mbits = 16384,
541 .num_ranks = 2,
542 .device_width = 32,
543 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
544
545 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
546 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
547
548 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'D', '-',
549 'E', 'G', 'C', 'G' },
550};
551
Loop Wue0fa3212016-12-01 16:25:41 +0800552const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
553 .dram_type = SPD_DRAM_TYPE_LPDDR3,
554 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
555
556 .module_size_mbits = 8192,
557 .num_ranks = 1,
558 .device_width = 32,
559 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
560
561 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
562 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
563
564 .part_num =
565 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
566 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
567};
568
Jack Rosenthal10611d32020-05-06 12:46:38 -0600569const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_10 = {
570 .dram_type = SPD_DRAM_TYPE_LPDDR3,
571 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
572
573 .module_size_mbits = 2048 * 8,
574 .num_ranks = 1,
575 .device_width = 64,
576 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
577
578 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
579 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
580
581 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
582 'D', '1', 'P', 'F', '-', '1', '0' },
583};
584
jiazi Yang5e3d5942017-04-05 22:30:45 -0400585const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_107wtb = {
586 .dram_type = SPD_DRAM_TYPE_LPDDR3,
587 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
588
589 .module_size_mbits = 8192,
590 .num_ranks = 1,
591 .device_width = 32,
592 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
593
594 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
595 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
596
597 .part_num =
598 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
599 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
600};
601
Loop Wue0fa3212016-12-01 16:25:41 +0800602const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
603 .dram_type = SPD_DRAM_TYPE_LPDDR3,
604 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
605
606 .module_size_mbits = 16384,
607 .num_ranks = 2,
608 .device_width = 32,
609 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
610
611 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
612 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
613
614 .part_num =
615 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
616 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
617};
618
Jack Rosenthal1ca003d2020-05-07 09:04:54 -0600619const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_10 = {
620 .dram_type = SPD_DRAM_TYPE_LPDDR3,
621 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
622
623 .module_size_mbits = 4096 * 8,
624 .num_ranks = 2,
625 .device_width = 64,
626 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
627
628 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
629 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
630
631 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2',
632 'D', '2', 'P', 'F', '-', '1', '0' },
633};
634
Kaka Niae6ece42019-02-26 09:55:57 +0800635const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
636 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
637
638 .module_size_mbits = 32768,
639 .num_ranks = 2,
640 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700641 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Kaka Niae6ece42019-02-26 09:55:57 +0800642
643 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
644 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
645
646 .part_num =
647 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '4', 'N',
648 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
649};
650
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700651const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d2np_046wta = {
652 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
653
654 .module_size_mbits = 32768,
655 .num_ranks = 1,
656 .device_width = 32,
657 .ddr_freq = { DDR_2133 },
658
659 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
660 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
661
662 .part_num =
663 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '2', 'N',
664 'P', '-', '4', '6', 'W', 'T', ':', 'A'},
665};
666
667const struct nonspd_mem_info micron_lpddr4x_mt53e2g32d4nq_046wta = {
668 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
669
Paul Huang2fe53be2020-11-17 14:02:55 +0800670 .module_size_mbits = 65536,
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700671 .num_ranks = 2,
672 .device_width = 32,
673 .ddr_freq = { DDR_2133 },
674
675 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
676 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
677
678 .part_num =
679 { 'M', 'T', '5', '3', 'E', '2', 'G', '3', '2', 'D', '4', 'N',
680 'Q', '-', '4', '6', 'W', 'T', ':', 'A'},
681};
682
karen_wuc94b8d32020-07-16 14:54:14 +0800683const struct nonspd_mem_info micron_lpddr4x_mt53d1g32d4dt_046wtd = {
684 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
685
686 .module_size_mbits = 32768,
687 .num_ranks = 2,
688 .device_width = 32,
689 .ddr_freq = { DDR_2133 },
690
691 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
692 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
693
694 .part_num =
695 { 'M', 'T', '5', '3', 'D', '1', 'G', '3', '2', 'D', '4', 'D',
696 'T', '-', '4', '6', 'W', 'T', ':', 'D'},
697};
698
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800699const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8dqksl = {
700 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
701
702 .module_size_mbits = 32768,
703 .num_ranks = 2,
704 .device_width = 32,
705 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
706
707 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
708 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
709
710 .part_num =
711 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'D',
712 'Q', 'K', 'S', 'L'},
713};
714
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +0800715const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8gqfsl_046 = {
716 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
717
718 .module_size_mbits = 32768,
719 .num_ranks = 2,
720 .device_width = 32,
721 .ddr_freq = { DDR_2133 },
722
723 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
724 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
725
726 .part_num =
727 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'G',
728 'Q', 'F', 'S', 'L', '-', '0', '4', '6'},
729};
730
731const struct nonspd_mem_info micron_lpddr4x_mt29vzzzbd9dqkpr_046 = {
732 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
733
734 .module_size_mbits = 32768,
735 .num_ranks = 2,
736 .device_width = 32,
737 .ddr_freq = { DDR_2133 },
738
739 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
740 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
741
742 .part_num =
743 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'B', 'D', '9', 'D',
744 'Q', 'K', 'P', 'R', '-', '0', '4', '6'},
745};
746
Jessy Jiangb558da22021-03-23 10:13:47 +0800747const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad9gqfsm_046 = {
748 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
749
750 .module_size_mbits = 32768,
751 .num_ranks = 2,
752 .device_width = 32,
753 .ddr_freq = { DDR_2133 },
754
755 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
756 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
757
758 .part_num =
759 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '9', 'G',
760 'Q', 'F', 'S', 'M', '-', '0', '4', '6'},
761};
762
Philip Chencccc7042018-09-25 20:31:37 -0700763const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
764 .dram_type = SPD_DRAM_TYPE_LPDDR4,
765
766 .module_size_mbits = 32768,
767 .num_ranks = 2,
768 .device_width = 32,
769 .ddr_freq = { DDR_1355 },
770
771 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
772 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
773
774 .part_num =
775 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
776 'A', 'G', 'C', 'J' },
777};
778
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800779const struct nonspd_mem_info samsung_lpddr4x_kmdh6001da_b422 = {
780 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
781
782 .module_size_mbits = 32768,
783 .num_ranks = 2,
784 .device_width = 32,
785 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
786
787 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
788 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
789
790 .part_num =
791 { 'K', 'M', 'D', 'H', '6', '0', '0', '1', 'D', 'A', '-',
792 'B', '4', '2', '2' },
793};
794
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800795const struct nonspd_mem_info samsung_lpddr4x_kmdp6001da_b425 = {
796 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
797
798 .module_size_mbits = 32768,
799 .num_ranks = 2,
800 .device_width = 32,
801 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
802
803 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
804 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
805
806 .part_num =
807 { 'K', 'M', 'D', 'P', '6', '0', '0', '1', 'D', 'A', '-',
808 'B', '4', '2', '5' },
809};
810
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800811const struct nonspd_mem_info samsung_lpddr4x_kmdv6001da_b620 = {
812 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
813
814 .module_size_mbits = 32768,
815 .num_ranks = 2,
816 .device_width = 32,
817 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
818
819 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
820 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
821
822 .part_num =
823 { 'K', 'M', 'D', 'V', '6', '0', '0', '1', 'D', 'A', '-',
824 'B', '6', '2', '0' },
825};
826
cherish8851df02019-09-01 14:35:55 +0800827const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcl = {
828 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
829
830 .module_size_mbits = 32768,
831 .num_ranks = 2,
832 .device_width = 32,
833 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
834
835 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
836 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
837
838 .part_num =
839 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
840 'M', 'G', 'C', 'L' },
841};
842
Chia-Hsiu Chang065a3c42020-08-27 19:08:13 +0800843const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcr = {
844 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
845
846 .module_size_mbits = 32768,
847 .num_ranks = 2,
848 .device_width = 32,
849 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
850
851 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
852 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
853
854 .part_num =
855 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
856 'M', 'G', 'C', 'R' },
857};
858
Kaka Ni9db5d8a2019-07-05 12:13:33 +0800859const struct nonspd_mem_info sandisk_lpddr4x_sdada4cr_128g = {
860 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
861
862 .module_size_mbits = 32768,
863 .num_ranks = 2,
864 .device_width = 32,
865 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
866
867 .module_mfg_id = { .msb = 0x45, .lsb = 0x00 },
868 .dram_mfg_id = { .msb = 0x45, .lsb = 0x00 },
869
870 .part_num =
871 { 'S', 'D', 'A', 'D', 'A', '4', 'C', 'R', '-', '1', '2',
872 '8', 'G' },
873};
874
Marco Chena18bbb22018-08-13 16:10:55 +0800875// This one is reserved for storing mem info from SMBIOS if no explicit entry
876// was added above.
877static struct nonspd_mem_info part_extracted_from_smbios = {
878 .part_num =
879 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
880};
881
Marco Chena18bbb22018-08-13 16:10:55 +0800882static int transfer_speed_from_smbios_to_nonspd_mem_info(
883 struct smbios_table *table,
884 struct nonspd_mem_info *info)
885{
Rob Barnes06e01462020-09-16 15:04:44 -0600886 uint32_t expected_speed;
887
Marco Chena18bbb22018-08-13 16:10:55 +0800888 for (int index = DDR_333; index < DDR_FREQ_MAX; index++) {
Rob Barnes06e01462020-09-16 15:04:44 -0600889 expected_speed = strtoul(ddr_freq_prettyprint[index], NULL, 10);
890 if (table->data.mem_device.speed >= expected_speed - 1 &&
891 table->data.mem_device.speed <= expected_speed + 1) {
Marco Chena18bbb22018-08-13 16:10:55 +0800892 info->ddr_freq[0] = index;
893 return 0;
894 }
895 }
896
Jack Rosenthal229579c2021-02-04 14:29:25 -0700897 lprintf(LOG_DEBUG, "%s: mem speed %hu in SMBIOS is out of range.",
898 __func__, table->data.mem_device.speed);
Marco Chena18bbb22018-08-13 16:10:55 +0800899 return -1;
900}
901
Jack Rosenthale279bb22020-05-15 17:46:55 -0600902static enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800903{
Jack Rosenthal0eec1a52021-01-12 13:40:07 -0700904 char *part_number = table->string[table->data.mem_device.part_number];
905 static const struct {
906 enum spd_dram_type type;
907 const char *prefix;
908 } part_number_matches[] = {
909 /* Hynix */
910 { SPD_DRAM_TYPE_DDR3, "h5t" },
911 { SPD_DRAM_TYPE_LPDDR3, "h9c" },
912 { SPD_DRAM_TYPE_LPDDR4, "h9h" },
913
914 /* Samsung */
915 { SPD_DRAM_TYPE_DDR3, "k4b" },
916 { SPD_DRAM_TYPE_LPDDR3, "k3q" },
917 { SPD_DRAM_TYPE_LPDDR3, "k4e" },
918 { SPD_DRAM_TYPE_LPDDR4, "k3u" },
919 { SPD_DRAM_TYPE_LPDDR4, "k4f" },
920
921 /* Micron */
922 { SPD_DRAM_TYPE_DDR4, "mt40" },
923 { SPD_DRAM_TYPE_DDR3, "mt41" },
924 { SPD_DRAM_TYPE_LPDDR3, "mt52" },
925 { SPD_DRAM_TYPE_LPDDR4, "mt53" },
926 };
927
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800928 switch (table->data.mem_device.type) {
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800929 case SMBIOS_MEMORY_TYPE_DDR3:
930 return SPD_DRAM_TYPE_DDR3;
931 case SMBIOS_MEMORY_TYPE_DDR4:
932 return SPD_DRAM_TYPE_DDR4;
Paul Fagerburg1f3997c2019-05-17 09:31:29 -0600933 case SMBIOS_MEMORY_TYPE_LPDDR3:
934 return SPD_DRAM_TYPE_LPDDR3;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800935 case SMBIOS_MEMORY_TYPE_LPDDR4:
936 return SPD_DRAM_TYPE_LPDDR4;
Jack Rosenthal78ab5b52021-01-13 16:00:38 -0700937 case SMBIOS_MEMORY_TYPE_OTHER:
Jack Rosenthal0eec1a52021-01-12 13:40:07 -0700938 case SMBIOS_MEMORY_TYPE_UNKNOWN:
939 /* Do our best to figure it out from part numbers */
940 for (size_t i = 0; i < ARRAY_SIZE(part_number_matches); i++) {
941 if (!strncasecmp(part_number,
942 part_number_matches[i].prefix,
943 strlen(part_number_matches[i].prefix)))
944 return part_number_matches[i].type;
945 }
946
947 /* Fall thru */
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800948 default:
949 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
950 __func__, table->data.mem_device.type);
951 return 0;
952 }
953}
954
Marco Chena18bbb22018-08-13 16:10:55 +0800955static int extract_mem_info_from_smbios(
956 struct smbios_table *table,
957 struct nonspd_mem_info *info)
958{
959 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +0800960 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +0800961 uint32_t size;
962
Marco Chen05511cb2018-10-01 08:35:37 +0800963 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +0800964 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +0800965 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +0800966
967 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +0800968 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +0800969 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
970 "Or len of part number %lu is larger then buffer %lu."
971 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +0800972 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +0800973 return -1;
974 }
975
976 size = (table->data.mem_device.size & 0x7fff) * 8;
977 info->module_size_mbits =
978 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
979
Marco Chen05511cb2018-10-01 08:35:37 +0800980 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800981
982 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -0800983 info->num_ranks = table->data.mem_device.attributes & 0xf;
984 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800985
Jack Rosenthal229579c2021-02-04 14:29:25 -0700986 /*
987 * Try to transfer speed info, but ignore errors. Many older
988 * firmware will report invalid speeds, but it does not
989 * actually matter, as nothing in the OS really uses this
990 * information.
991 */
992 transfer_speed_from_smbios_to_nonspd_mem_info(table, info);
993
994 return 0;
Marco Chena18bbb22018-08-13 16:10:55 +0800995}
996
Nick Vaccaroc287faf2020-09-15 13:35:52 -0700997int spd_set_nonspd_info_from_smbios(struct platform_intf *intf, int dimm,
998 const struct nonspd_mem_info **info)
999{
1000 struct smbios_table table;
1001
1002 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table) < 0) {
1003 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n",
1004 __func__);
1005 return -1;
1006 }
1007
1008 /* memory device from SMBIOS is mapped into a nonspd_mem_info */
1009 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios))
1010 return -1;
1011
1012 *info = &part_extracted_from_smbios;
1013
1014 return 0;
1015}