blob: e5e51469f2d8e4ef293f6c87828e971f17fa1c7a [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
32#include "lib/nonspd.h"
33
David Hendricks0fa54152016-03-16 15:08:56 -070034const struct nonspd_mem_info elpida_lpddr3_edfa164a2ma_jd_f = {
David Hendricks6638f872015-11-04 14:52:02 -080035 .dram_type = SPD_DRAM_TYPE_LPDDR3,
36 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
37
38 .module_size_mbits = 8192,
39 .num_ranks = 2,
40 .device_width = 32,
41 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
42
43 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
44 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
45
46 .part_num =
47 { 'E', 'D', 'F', 'A', '1', '6', '4', 'A', '2', 'M', 'A', '-',
48 'J', 'D', '-', 'F',},
49};
50
David Hendricks0fa54152016-03-16 15:08:56 -070051const struct nonspd_mem_info elpida_lpddr3_f8132a3ma_gd_f = {
David Hendricks6638f872015-11-04 14:52:02 -080052 .dram_type = SPD_DRAM_TYPE_LPDDR3,
53 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
54
55 .module_size_mbits = 8192,
56 .num_ranks = 2,
57 .device_width = 32,
58 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
59
60 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
61 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
62
63 .part_num =
64 { 'F', '8', '1', '3', '2', 'A', '3', 'M', 'A', '-', 'G', 'D',
65 '-', 'F',},
66};
67
David Hendricks0fa54152016-03-16 15:08:56 -070068const struct nonspd_mem_info elpida_lpddr3_fa232a2ma_gc_f = {
David Hendricks6638f872015-11-04 14:52:02 -080069 .dram_type = SPD_DRAM_TYPE_LPDDR3,
70 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
71
72 .module_size_mbits = 16384,
73 .num_ranks = 2,
74 .device_width = 32,
75 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
76
77 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
78 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
79
80 .part_num =
81 { 'F', 'A', '2', '3', '2', 'A', '2', 'M', 'A', '-', 'G', 'C',
82 '-', 'F',},
83};
84
David Hendricks0fa54152016-03-16 15:08:56 -070085const struct nonspd_mem_info hynix_ddr3l_h5tc4g63afr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -080086 .dram_type = SPD_DRAM_TYPE_DDR3,
87 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
88
89 .module_size_mbits = 4096,
90 .num_ranks = 1,
91 .device_width = 16,
92 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
93
94 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
95 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
96
97 .serial_num = { 0, 0, 0, 0 },
98 .part_num =
99 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'A', 'F', 'R', '-',
100 'P', 'B', 'A'},
101};
102
David Hendricks0fa54152016-03-16 15:08:56 -0700103const struct nonspd_mem_info hynix_ddr3l_h5tc4g63cfr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800104 .dram_type = SPD_DRAM_TYPE_DDR3,
105 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
106
107 .module_size_mbits = 4096,
108 .num_ranks = 1,
109 .device_width = 16,
110 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
111
112 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
113 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
114
115 .serial_num = { 0, 0, 0, 0 },
116 .part_num =
117 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'C', 'F', 'R', '-',
118 'P', 'B', 'A'},
119};
120
Zheng Pan56c19e52018-10-23 17:01:11 -0700121const struct nonspd_mem_info hynix_ddr3l_h5tc4g63efr_rda = {
122 .dram_type = SPD_DRAM_TYPE_DDR3,
123 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
124
125 .module_size_mbits = 4096,
126 .num_ranks = 1,
127 .device_width = 16,
128 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
129
130 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
131 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
132
133 .serial_num = { 0, 0, 0, 0 },
134 .part_num =
135 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'E', 'F', 'R', '-',
136 'R', 'D', 'A'},
137};
138
David Hendricks0fa54152016-03-16 15:08:56 -0700139const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8gtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800140 .dram_type = SPD_DRAM_TYPE_LPDDR3,
141 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
142
143 .module_size_mbits = 8192,
144 .num_ranks = 1,
145 .device_width = 32,
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
151 .part_num =
152 { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'G', 'T', 'M', 'L',
153 'A', 'R', '-', 'N', 'U', 'D',},
154};
155
Milton Chiang5664fe32016-11-29 14:59:49 +0800156const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtalar_nud = {
157 .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_333, DDR_400, DDR_533, DDR_667, DDR_800 },
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', 'J', 'T', 'A', 'L',
170 'A', 'R', '-', 'N', 'U', 'D',},
171};
172
David Hendricks0fa54152016-03-16 15:08:56 -0700173const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800174 .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_333, DDR_400, DDR_533, DDR_667, DDR_800 },
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', 'J', 'T', 'M', 'L',
187 'A', 'R', '-', 'N', 'U', 'D',},
188};
189
David Hendricks0fa54152016-03-16 15:08:56 -0700190const struct nonspd_mem_info hynix_ddr3l_h5tc8g63amr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800191 .dram_type = SPD_DRAM_TYPE_DDR3,
192 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
193 .module_size_mbits = 8192,
194 .num_ranks = 2,
195 .device_width = 16,
196 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
197
198 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
199 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
200
201 .serial_num = { 0, 0, 0, 0 },
202 .part_num =
203 { 'H', '5', 'T', 'C', '8', 'G', '6', '3', 'A', 'M', 'R', '-',
204 'P', 'B', 'A' },
205};
206
David Hendricks0fa54152016-03-16 15:08:56 -0700207const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbptblbr_nud = {
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800208 .dram_type = SPD_DRAM_TYPE_LPDDR3,
209 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
210
211 .module_size_mbits = 16384,
212 .num_ranks = 2,
213 .device_width = 32,
214 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
215
216 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
217 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
218
219 .part_num =
220 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'P', 'T', 'B', 'L',
221 'B', 'R', '-', 'N', 'U', 'D',},
222};
223
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800224const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbltblar_nud = {
225 .dram_type = SPD_DRAM_TYPE_LPDDR3,
226 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
227
228 .module_size_mbits = 16384,
229 .num_ranks = 2,
230 .device_width = 32,
231 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
232
233 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
234 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
235
236 .part_num =
237 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'L', 'T', 'B', 'L',
238 'A', 'R', '-', 'N', 'U', 'D',},
239};
240
Loop_Wu9ec61642019-01-29 14:28:34 +0800241const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbktmlbr_ntd = {
242 .dram_type = SPD_DRAM_TYPE_LPDDR3,
243 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
244
245 .module_size_mbits = 16384,
246 .num_ranks = 2,
247 .device_width = 32,
248 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
249
250 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
251 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
252
253 .part_num =
254 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'K', 'T', 'M', 'L',
255 'B', 'R', '-', 'N', 'T', 'D',},
256};
257
Kevin Chiu55250dd2016-11-08 17:21:23 +0800258const struct nonspd_mem_info hynix_lpddr4_h9hcnnn8kumlhr = {
259 .dram_type = SPD_DRAM_TYPE_LPDDR4,
260
261 .module_size_mbits = 8192,
262 .num_ranks = 1,
263 .device_width = 32,
264 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
265
266 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
267 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
268
269 .part_num =
270 { 'H', '9', 'H', 'C', 'N', 'N', 'N', '8', 'K', 'U', 'M', 'L',
271 'H', 'R',},
272};
273
274const struct nonspd_mem_info hynix_lpddr4_h9hcnnnbpumlhr = {
275 .dram_type = SPD_DRAM_TYPE_LPDDR4,
276
277 .module_size_mbits = 16384,
278 .num_ranks = 2,
279 .device_width = 32,
280 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
281
282 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
283 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
284
285 .part_num =
286 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'B', 'P', 'U', 'M', 'L',
287 'H', 'R',},
288};
289
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800290const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmalhr_nee = {
291 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
292
293 .module_size_mbits = 32768,
294 .num_ranks = 2,
295 .device_width = 32,
296 .ddr_freq = { DDR_800, DDR_1400, DDR_1600 },
297
298 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
299 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
300
301 .part_num =
302 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'A', 'L',
303 'H', 'R', '-', 'N', 'E', 'E'},
304};
305
David Hendricks6638f872015-11-04 14:52:02 -0800306const struct nonspd_mem_info micron_mt41k256m16ha = {
307 .dram_type = SPD_DRAM_TYPE_DDR3,
308 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
309
310 .module_size_mbits = 4096,
311 .num_ranks = 1,
312 .device_width = 16,
313 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
314
315 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
316 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
317
318 .serial_num = { 0, 0, 0, 0 },
319 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
320 '1', '6', 'H', 'A', '-', '1', '2', '5' },
321};
322
Milton Chiang5664fe32016-11-29 14:59:49 +0800323const struct nonspd_mem_info micron_mt52l256m32d1pf = {
324 .dram_type = SPD_DRAM_TYPE_DDR3,
325 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
326
327 .module_size_mbits = 8192,
328 .num_ranks = 1,
329 .device_width = 32,
330 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
331
332 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
333 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
334
335 .serial_num = { 0, 0, 0, 0 },
336 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M',
337 '3', '2', 'D', '1', 'P', 'F', '-', '0', '9',
338 '3', 'W', 'T', ':', 'B' },
339};
340
341const struct nonspd_mem_info micron_mt52l512m32d2pf = {
342 .dram_type = SPD_DRAM_TYPE_DDR3,
343 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
344
345 .module_size_mbits = 16384,
346 .num_ranks = 2,
347 .device_width = 32,
348 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
349
350 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
351 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
352
353 .serial_num = { 0, 0, 0, 0 },
354 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M',
355 '3', '2', 'D', '2', 'P', 'F', '-', '0', '9',
356 '3', 'W', 'T', ':', 'B' },
357};
358
David Hendricks97303242015-11-11 14:41:40 -0800359const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
360 .dram_type = SPD_DRAM_TYPE_DDR3,
361 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
362
363 .module_size_mbits = 4096,
364 .num_ranks = 1,
365 .device_width = 16,
366 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
367 .ddr_freq = { DDR_667, DDR_800 },
368 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
369 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
370
371 .serial_num = { 0, 0, 0, 0 },
372 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
373 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
374};
375
Zheng Pan56c19e52018-10-23 17:01:11 -0700376const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
377 .dram_type = SPD_DRAM_TYPE_DDR3,
378 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
379
380 .module_size_mbits = 4096,
381 .num_ranks = 1,
382 .device_width = 16,
383 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
384 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
385 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
386
387 .serial_num = { 0, 0, 0, 0 },
388 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
389 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
390};
391
David Hendricks6638f872015-11-04 14:52:02 -0800392const struct nonspd_mem_info samsung_k4b4g1646d = {
393 .dram_type = SPD_DRAM_TYPE_DDR3,
394 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
395
396 .module_size_mbits = 4096,
397 .num_ranks = 1,
398 .device_width = 16,
399 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
400
401 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
402 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
403
404 .serial_num = { 0, 0, 0, 0 },
405 .part_num =
406 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
407 '-', 'B', 'Y', 'K', '0' },
408};
409
410const struct nonspd_mem_info samsung_k4b4g1646e = {
411 .dram_type = SPD_DRAM_TYPE_DDR3,
412 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
413
414 .module_size_mbits = 4096,
415 .num_ranks = 1,
416 .device_width = 16,
417 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
418
419 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
420 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
421
422 .serial_num = { 0, 0, 0, 0 },
423 .part_num =
424 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
425 '-', 'B', 'Y', 'K', '0' },
426};
427
Zheng Pan56c19e52018-10-23 17:01:11 -0700428const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
429 .dram_type = SPD_DRAM_TYPE_DDR3,
430 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
431
432 .module_size_mbits = 4096,
433 .num_ranks = 1,
434 .device_width = 16,
435 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
436
437 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
438 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
439
440 .serial_num = { 0, 0, 0, 0 },
441 .part_num =
442 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
443 '-', 'B', 'Y', 'M', 'A' },
444};
445
David Hendricks0fa54152016-03-16 15:08:56 -0700446const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800447 .dram_type = SPD_DRAM_TYPE_DDR3,
448 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
449
450 .module_size_mbits = 4096,
451 .num_ranks = 1,
452 .device_width = 16,
453 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
454
455 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
456 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
457
458 .serial_num = { 0, 0, 0, 0 },
459 .part_num =
460 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
461 'B', 'Y', 'K', '0' },
462};
463
David Hendricks0fa54152016-03-16 15:08:56 -0700464const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800465 .dram_type = SPD_DRAM_TYPE_DDR3,
466 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
467
468 .module_size_mbits = 4096,
469 .num_ranks = 1,
470 .device_width = 16,
471 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
472
473 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
474 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
475
476 .serial_num = { 0, 0, 0, 0 },
477 .part_num =
478 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
479 'H', 'Y', 'K', '0' },
480};
481
David Hendricks0fa54152016-03-16 15:08:56 -0700482const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800483 .dram_type = SPD_DRAM_TYPE_DDR3,
484 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
485 .module_size_mbits = 8192,
486 .num_ranks = 2,
487 .device_width = 16,
488 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
489
490 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
491 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
492
493 .serial_num = { 0, 0, 0, 0 },
494 .part_num =
495 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
496 'M', 'Y', 'K', '0' },
497};
498
David Hendricks0fa54152016-03-16 15:08:56 -0700499const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800500 .dram_type = SPD_DRAM_TYPE_LPDDR3,
501 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
502
503 .module_size_mbits = 8192,
504 .num_ranks = 2,
505 .device_width = 32,
506 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
507
508 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
509 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
510
511 .part_num =
512 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
513 'A', 'G', 'C', 'E' },
514};
515
Vincent Palatin90af8e62016-05-20 12:12:49 -0700516const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
517 .dram_type = SPD_DRAM_TYPE_LPDDR3,
518 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
519
520 .module_size_mbits = 16384,
521 .num_ranks = 2,
522 .device_width = 32,
523 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
524
525 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
526 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
527
528 .part_num =
529 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
530 'E', 'G', 'C', 'E' },
531};
532
David Hendricks0fa54152016-03-16 15:08:56 -0700533const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800534 .dram_type = SPD_DRAM_TYPE_LPDDR3,
535 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
536
537 .module_size_mbits = 16384,
538 .num_ranks = 2,
539 .device_width = 32,
540 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
541
542 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
543 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
544
545 .part_num =
546 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
547 'E', 'G', 'C', 'E' },
548};
549
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800550const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
551 .dram_type = SPD_DRAM_TYPE_LPDDR3,
552 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
553
554 .module_size_mbits = 16384,
555 .num_ranks = 2,
556 .device_width = 32,
557 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
558
559 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
560 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
561
562 .part_num =
563 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
564 'E', 'G', 'C', 'F' },
565};
566
David Hendricks0fa54152016-03-16 15:08:56 -0700567const struct nonspd_mem_info samsung_lpddr3_k4e8e304ed_egcc = {
David Hendricks6638f872015-11-04 14:52:02 -0800568 .dram_type = SPD_DRAM_TYPE_DDR3,
569 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
570
571 .module_size_mbits = 8192,
572 .num_ranks = 2,
573 .device_width = 32,
574 .ddr_freq = { DDR_533 },
575
576 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
577 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
578
579 .serial_num = { 0, 0, 0, 0 },
580 .part_num =
581 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'D', '-',
582 'E', 'G', 'C', 'C' },
583};
584
David Hendricks0fa54152016-03-16 15:08:56 -0700585const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800586 .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 = 2,
591 .device_width = 32,
592 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
593
594 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
595 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
596
597 .part_num =
598 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
599 'E', 'G', 'C', 'E' },
600};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700601
602const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
603 .dram_type = SPD_DRAM_TYPE_LPDDR3,
604 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
605
606 .module_size_mbits = 8192,
607 .num_ranks = 2,
608 .device_width = 32,
609 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
610
611 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
612 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
613
614 .part_num =
615 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
616 'E', 'G', 'C', 'F' },
617};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700618
Loop Wue0fa3212016-12-01 16:25:41 +0800619const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
620 .dram_type = SPD_DRAM_TYPE_LPDDR3,
621 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
622
623 .module_size_mbits = 8192,
624 .num_ranks = 1,
625 .device_width = 32,
626 .ddr_freq = { 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 =
632 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
633 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
634};
635
jiazi Yang5e3d5942017-04-05 22:30:45 -0400636const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_107wtb = {
637 .dram_type = SPD_DRAM_TYPE_LPDDR3,
638 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
639
640 .module_size_mbits = 8192,
641 .num_ranks = 1,
642 .device_width = 32,
643 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
644
645 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
646 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
647
648 .part_num =
649 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
650 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
651};
652
Loop Wue0fa3212016-12-01 16:25:41 +0800653const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
654 .dram_type = SPD_DRAM_TYPE_LPDDR3,
655 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
656
657 .module_size_mbits = 16384,
658 .num_ranks = 2,
659 .device_width = 32,
660 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
661
662 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
663 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
664
665 .part_num =
666 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
667 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
668};
669
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700670static const struct nonspd_mem_info micron_lpddr4_mt53b256m32d1np = {
671 .dram_type = SPD_DRAM_TYPE_LPDDR4,
672
673 .module_size_mbits = 8192,
674 .num_ranks = 1,
675 .device_width = 32,
676 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
677
678 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
679 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
680
681 .part_num =
682 { 'M', 'T', '5', '3', 'B', '2', '5', '6', 'M', '3', '2', 'D',
683 '1', 'N', 'P'},
684};
685
686static const struct nonspd_mem_info micron_lpddr4_mt53b512m32d2np = {
687 .dram_type = SPD_DRAM_TYPE_LPDDR4,
688
689 .module_size_mbits = 16384,
690 .num_ranks = 2,
691 .device_width = 32,
692 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
693
694 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
695 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
696
697 .part_num =
698 { 'M', 'T', '5', '3', 'B', '5', '1', '2', 'M', '3', '2', 'D',
699 '2', 'N', 'P'},
700};
701
ren kuoc9202c92018-05-14 19:46:20 +0800702static const struct nonspd_mem_info micron_lpddr4_mt53e512m32d2np = {
703 .dram_type = SPD_DRAM_TYPE_LPDDR4,
704
705 .module_size_mbits = 16384,
706 .num_ranks = 2,
707 .device_width = 32,
708 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
709
710 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
711 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
712
713 .part_num =
714 { 'M', 'T', '5', '3', 'E', '5', '1', '2', 'M', '3', '2', 'D',
715 '2', 'N', 'P'},
716};
717
Kaka Niae6ece42019-02-26 09:55:57 +0800718const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
719 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
720
721 .module_size_mbits = 32768,
722 .num_ranks = 2,
723 .device_width = 32,
724 .ddr_freq = { DDR_800, DDR_1400, DDR_1600 },
725
726 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
727 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
728
729 .part_num =
730 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '4', 'N',
731 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
732};
733
Philip Chencccc7042018-09-25 20:31:37 -0700734const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
735 .dram_type = SPD_DRAM_TYPE_LPDDR4,
736
737 .module_size_mbits = 32768,
738 .num_ranks = 2,
739 .device_width = 32,
740 .ddr_freq = { DDR_1355 },
741
742 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
743 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
744
745 .part_num =
746 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
747 'A', 'G', 'C', 'J' },
748};
749
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700750static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgcj = {
751 .dram_type = SPD_DRAM_TYPE_LPDDR4,
752
753 .module_size_mbits = 16384,
754 .num_ranks = 2,
755 .device_width = 32,
756 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
757
758 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
759 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
760
761 .part_num =
762 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
763 'M', 'G', 'C', 'J' },
764};
765
ren kuo500c9c62018-05-24 17:57:50 +0800766static const struct nonspd_mem_info samsung_lpddr4_k4f6e3s4hm_mgcj = {
767 .dram_type = SPD_DRAM_TYPE_LPDDR4,
768
769 .module_size_mbits = 16384,
770 .num_ranks = 1,
771 .device_width = 32,
772 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
773
774 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
775 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
776
777 .part_num =
778 { 'K', '4', 'F', '6', 'E', '3', 'S', '4', 'H', 'M', '-',
779 'M', 'G', 'C', 'J' },
780};
781
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700782static const struct nonspd_mem_info samsung_lpddr4_k4f8e304hb_mgcj = {
783 .dram_type = SPD_DRAM_TYPE_LPDDR4,
784
785 .module_size_mbits = 8192,
786 .num_ranks = 1,
787 .device_width = 32,
788 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
789
790 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
791 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
792
793 .part_num =
794 { 'K', '4', 'F', '8', 'E', '3', '0', '4', 'H', 'B', '-',
795 'M', 'G', 'C', 'J' },
796};
797
798static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgch = {
799 .dram_type = SPD_DRAM_TYPE_LPDDR4,
800
801 .module_size_mbits = 8192,
802 .num_ranks = 1,
803 .device_width = 32,
804 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
805
806 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
807 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
808
809 .part_num =
810 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
811 'M', 'G', 'C', 'H' },
812};
813
Marco Chena18bbb22018-08-13 16:10:55 +0800814// This one is reserved for storing mem info from SMBIOS if no explicit entry
815// was added above.
816static struct nonspd_mem_info part_extracted_from_smbios = {
817 .part_num =
818 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
819};
820
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700821static const struct nonspd_mem_info *nospdmemory[] = {
822 &elpida_lpddr3_edfa164a2ma_jd_f,
823 &elpida_lpddr3_f8132a3ma_gd_f,
824 &elpida_lpddr3_fa232a2ma_gc_f,
825 &hynix_ddr3l_h5tc4g63afr_pba,
826 &hynix_ddr3l_h5tc4g63cfr_pba,
Zheng Pan56c19e52018-10-23 17:01:11 -0700827 &hynix_ddr3l_h5tc4g63efr_rda,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700828 &hynix_lpddr3_h9ccnnn8gtmlar_nud,
Milton Chiang5664fe32016-11-29 14:59:49 +0800829 &hynix_lpddr3_h9ccnnnbjtalar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700830 &hynix_lpddr3_h9ccnnnbjtmlar_nud,
831 &hynix_ddr3l_h5tc8g63amr_pba,
832 &hynix_lpddr3_h9ccnnnbptblbr_nud,
833 &hynix_lpddr3_h9ccnnnbltblar_nud,
Loop_Wu9ec61642019-01-29 14:28:34 +0800834 &hynix_lpddr3_h9ccnnnbktmlbr_ntd,
Kevin Chiu55250dd2016-11-08 17:21:23 +0800835 &hynix_lpddr4_h9hcnnn8kumlhr,
836 &hynix_lpddr4_h9hcnnnbpumlhr,
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800837 &hynix_lpddr4x_h9hcnnncpmalhr_nee,
Marco Chena18bbb22018-08-13 16:10:55 +0800838 &micron_lpddr3_mt52l256m32d1pf_107wtb,
839 &micron_lpddr3_mt52l256m64d2pp_107wtb,
840 &micron_lpddr3_mt52l512m32d2pf_107wtb,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700841 &micron_lpddr4_mt53b256m32d1np,
842 &micron_lpddr4_mt53b512m32d2np,
ren kuoc9202c92018-05-14 19:46:20 +0800843 &micron_lpddr4_mt53e512m32d2np,
Kaka Niae6ece42019-02-26 09:55:57 +0800844 &micron_lpddr4x_mt53e1g32d4nq_046wte,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700845 &micron_mt41k256m16ha,
Milton Chiang5664fe32016-11-29 14:59:49 +0800846 &micron_mt52l256m32d1pf,
847 &micron_mt52l512m32d2pf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700848 &nanya_ddr3l_nt5cc256m16dp_di,
Zheng Pan56c19e52018-10-23 17:01:11 -0700849 &nanya_ddr3l_nt5cc256m16er_ek,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700850 &samsung_k4b4g1646d,
851 &samsung_k4b4g1646e,
Zheng Pan56c19e52018-10-23 17:01:11 -0700852 &samsung_k4b4g1646e_byma,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700853 &samsung_ddr3l_k4b4g1646d_byk0,
854 &samsung_ddr3l_k4b4g1646q_hyk0,
855 &samsung_ddr3l_k4b8g1646q_myk0,
856 &samsung_lpddr3_k3qf2f20em_agce,
857 &samsung_lpddr3_k4e6e304eb_egce,
858 &samsung_lpddr3_k4e6e304ee_egce,
859 &samsung_lpddr3_k4e6e304eb_egcf,
860 &samsung_lpddr3_k4e8e304ed_egcc,
861 &samsung_lpddr3_k4e8e304ee_egce,
862 &samsung_lpddr3_k4e8e324eb_egcf,
Philip Chencccc7042018-09-25 20:31:37 -0700863 &samsung_lpddr4_k3uh5h50mm_agcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700864 &samsung_lpddr4_k4f6e304hb_mgch,
865 &samsung_lpddr4_k4f6e304hb_mgcj,
ren kuo500c9c62018-05-24 17:57:50 +0800866 &samsung_lpddr4_k4f6e3s4hm_mgcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700867 &samsung_lpddr4_k4f8e304hb_mgcj,
868};
869
Marco Chena18bbb22018-08-13 16:10:55 +0800870static int transfer_speed_from_smbios_to_nonspd_mem_info(
871 struct smbios_table *table,
872 struct nonspd_mem_info *info)
873{
874 for (int index = DDR_333; index < DDR_FREQ_MAX; index++) {
875 if (table->data.mem_device.speed == atoi(ddr_freq_prettyprint[index])) {
876 info->ddr_freq[0] = index;
877 return 0;
878 }
879 }
880
881 lprintf(LOG_ERR, "%s: mem speed %hu in SMBIOS is out of range.",
882 __func__, table->data.mem_device.speed);
883 return -1;
884}
885
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800886enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
887{
888 switch (table->data.mem_device.type) {
889 case SMBIOS_MEMORY_TYPE_DDR:
890 return SPD_DRAM_TYPE_DDR;
891 case SMBIOS_MEMORY_TYPE_DDR2:
892 return SPD_DRAM_TYPE_DDR2;
893 case SMBIOS_MEMORY_TYPE_DDR2_FBDIMM:
894 return SPD_DRAM_TYPE_FBDIMM;
895 case SMBIOS_MEMORY_TYPE_DDR3:
896 return SPD_DRAM_TYPE_DDR3;
897 case SMBIOS_MEMORY_TYPE_DDR4:
898 return SPD_DRAM_TYPE_DDR4;
899 case SMBIOS_MEMORY_TYPE_LPDDR4:
900 return SPD_DRAM_TYPE_LPDDR4;
901 default:
902 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
903 __func__, table->data.mem_device.type);
904 return 0;
905 }
906}
907
Marco Chena18bbb22018-08-13 16:10:55 +0800908static int extract_mem_info_from_smbios(
909 struct smbios_table *table,
910 struct nonspd_mem_info *info)
911{
912 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +0800913 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +0800914 uint32_t size;
915
Marco Chen05511cb2018-10-01 08:35:37 +0800916 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +0800917 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +0800918 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +0800919
920 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +0800921 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +0800922 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
923 "Or len of part number %lu is larger then buffer %lu."
924 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +0800925 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +0800926 return -1;
927 }
928
929 size = (table->data.mem_device.size & 0x7fff) * 8;
930 info->module_size_mbits =
931 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
932
Marco Chen05511cb2018-10-01 08:35:37 +0800933 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800934
935 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -0800936 info->num_ranks = table->data.mem_device.attributes & 0xf;
937 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800938
Marco Chena18bbb22018-08-13 16:10:55 +0800939 return transfer_speed_from_smbios_to_nonspd_mem_info(table, info);
940}
941
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700942int spd_set_nonspd_info(struct platform_intf *intf,
943 const struct nonspd_mem_info **info)
944{
945 int dimm = 0, index;
946 struct smbios_table table;
947
948 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table,
949 SMBIOS_LEGACY_ENTRY_BASE,
950 SMBIOS_LEGACY_ENTRY_LEN) < 0) {
951 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n"
952 , __func__);
953 return -1;
954 }
955
956 for (index = 0; index < ARRAY_SIZE(nospdmemory); index++) {
957 if (!strncmp(table.string[table.data.mem_device.part_number],
Brian Norrisd7384fb2018-04-30 11:05:23 -0700958 (const char *)nospdmemory[index]->part_num,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700959 sizeof(nospdmemory[index]->part_num))) {
960 *info = nospdmemory[index];
961 break;
962 }
963 }
964
Marco Chena18bbb22018-08-13 16:10:55 +0800965 if (index < ARRAY_SIZE(nospdmemory)) {
966 return 0;
967 }
968
969 // memory device from SMBIOS is mapped into a nonspd_mem_info.
970 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios)) {
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700971 return -1;
972 }
973
Marco Chena18bbb22018-08-13 16:10:55 +0800974 *info = &part_extracted_from_smbios;
975
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700976 return 0;
977}