blob: a0dde2f706ded51579eba4a066836218bf5b61f1 [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,
David Hendricks6638f872015-11-04 14:52:02 -080045
46 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
47 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
48
49 .part_num =
50 { 'E', 'D', 'F', 'A', '1', '6', '4', 'A', '2', 'M', 'A', '-',
51 'J', 'D', '-', 'F',},
52};
53
David Hendricks0fa54152016-03-16 15:08:56 -070054const struct nonspd_mem_info hynix_ddr3l_h5tc4g63afr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -080055 .dram_type = SPD_DRAM_TYPE_DDR3,
56 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
57
58 .module_size_mbits = 4096,
59 .num_ranks = 1,
60 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -080061
62 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
63 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
64
David Hendricks6638f872015-11-04 14:52:02 -080065 .part_num =
66 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'A', 'F', 'R', '-',
67 'P', 'B', 'A'},
68};
69
David Hendricks0fa54152016-03-16 15:08:56 -070070const struct nonspd_mem_info hynix_ddr3l_h5tc4g63cfr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -080071 .dram_type = SPD_DRAM_TYPE_DDR3,
72 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
73
74 .module_size_mbits = 4096,
75 .num_ranks = 1,
76 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -080077
78 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
79 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
80
David Hendricks6638f872015-11-04 14:52:02 -080081 .part_num =
82 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'C', 'F', 'R', '-',
83 'P', 'B', 'A'},
84};
85
Zheng Pan56c19e52018-10-23 17:01:11 -070086const struct nonspd_mem_info hynix_ddr3l_h5tc4g63efr_rda = {
87 .dram_type = SPD_DRAM_TYPE_DDR3,
88 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
89
90 .module_size_mbits = 4096,
91 .num_ranks = 1,
92 .device_width = 16,
Zheng Pan56c19e52018-10-23 17:01:11 -070093
94 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
95 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
96
Zheng Pan56c19e52018-10-23 17:01:11 -070097 .part_num =
98 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'E', 'F', 'R', '-',
99 'R', 'D', 'A'},
100};
101
David Hendricks0fa54152016-03-16 15:08:56 -0700102const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8gtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800103 .dram_type = SPD_DRAM_TYPE_LPDDR3,
104 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
105
106 .module_size_mbits = 8192,
107 .num_ranks = 1,
108 .device_width = 32,
David Hendricks6638f872015-11-04 14:52:02 -0800109
110 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
111 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
112
113 .part_num =
114 { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'G', 'T', 'M', 'L',
115 'A', 'R', '-', 'N', 'U', 'D',},
116};
117
Milton Chiang5664fe32016-11-29 14:59:49 +0800118const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtalar_nud = {
119 .dram_type = SPD_DRAM_TYPE_LPDDR3,
120 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
121
122 .module_size_mbits = 16384,
123 .num_ranks = 2,
124 .device_width = 32,
Milton Chiang5664fe32016-11-29 14:59:49 +0800125
126 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
127 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
128
129 .part_num =
130 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'J', 'T', 'A', 'L',
131 'A', 'R', '-', 'N', 'U', 'D',},
132};
133
David Hendricks0fa54152016-03-16 15:08:56 -0700134const struct nonspd_mem_info hynix_ddr3l_h5tc8g63amr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800135 .dram_type = SPD_DRAM_TYPE_DDR3,
136 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
137 .module_size_mbits = 8192,
138 .num_ranks = 2,
139 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -0800140
141 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
142 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
143
David Hendricks6638f872015-11-04 14:52:02 -0800144 .part_num =
145 { 'H', '5', 'T', 'C', '8', 'G', '6', '3', 'A', 'M', 'R', '-',
146 'P', 'B', 'A' },
147};
148
David Hendricks0fa54152016-03-16 15:08:56 -0700149const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbptblbr_nud = {
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800150 .dram_type = SPD_DRAM_TYPE_LPDDR3,
151 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
152
153 .module_size_mbits = 16384,
154 .num_ranks = 2,
155 .device_width = 32,
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800156
157 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
158 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
159
160 .part_num =
161 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'P', 'T', 'B', 'L',
162 'B', 'R', '-', 'N', 'U', 'D',},
163};
164
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800165const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbltblar_nud = {
166 .dram_type = SPD_DRAM_TYPE_LPDDR3,
167 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
168
169 .module_size_mbits = 16384,
170 .num_ranks = 2,
171 .device_width = 32,
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800172
173 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
174 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
175
176 .part_num =
177 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'L', 'T', 'B', 'L',
178 'A', 'R', '-', 'N', 'U', 'D',},
179};
180
Loop_Wu9ec61642019-01-29 14:28:34 +0800181const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbktmlbr_ntd = {
182 .dram_type = SPD_DRAM_TYPE_LPDDR3,
183 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
184
185 .module_size_mbits = 16384,
186 .num_ranks = 2,
187 .device_width = 32,
Loop_Wu9ec61642019-01-29 14:28:34 +0800188
189 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
190 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
191
192 .part_num =
193 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'K', 'T', 'M', 'L',
194 'B', 'R', '-', 'N', 'T', 'D',},
195};
196
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800197const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmalhr_nee = {
198 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
199
200 .module_size_mbits = 32768,
201 .num_ranks = 2,
202 .device_width = 32,
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800203
204 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
205 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
206
207 .part_num =
208 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'A', 'L',
209 'H', 'R', '-', 'N', 'E', 'E'},
210};
211
Eason Lina80ba0a2020-07-15 16:58:24 +0800212const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmmlxr_nee = {
213 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
214
215 .module_size_mbits = 32768,
216 .num_ranks = 2,
217 .device_width = 32,
Eason Lina80ba0a2020-07-15 16:58:24 +0800218
219 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
220 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
221
222 .part_num =
223 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'M', 'L',
224 'X', 'R', '-', 'N', 'E', 'E'},
225};
226
Bob Moraguesd8e1a692021-01-10 05:28:36 +0000227const struct nonspd_mem_info hynix_lpddr4x_h9hcnnnfammlxr_nee = {
228 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
229
230 .module_size_mbits = 65536,
231 .num_ranks = 2,
232 .device_width = 32,
Bob Moraguesd8e1a692021-01-10 05:28:36 +0000233
234 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
235 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
236
237 .part_num =
238 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'F', 'A', 'M', 'M', 'L',
239 'X', 'R', '-', 'N', 'E', 'E' },
240};
241
David Hendricks6638f872015-11-04 14:52:02 -0800242const struct nonspd_mem_info micron_mt41k256m16ha = {
243 .dram_type = SPD_DRAM_TYPE_DDR3,
244 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
245
246 .module_size_mbits = 4096,
247 .num_ranks = 1,
248 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -0800249
250 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
251 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
252
David Hendricks6638f872015-11-04 14:52:02 -0800253 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
254 '1', '6', 'H', 'A', '-', '1', '2', '5' },
255};
256
David Hendricks97303242015-11-11 14:41:40 -0800257const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
258 .dram_type = SPD_DRAM_TYPE_DDR3,
259 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
260
261 .module_size_mbits = 4096,
262 .num_ranks = 1,
263 .device_width = 16,
264 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
David Hendricks97303242015-11-11 14:41:40 -0800265 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
266 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
267
David Hendricks97303242015-11-11 14:41:40 -0800268 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
269 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
270};
271
Zheng Pan56c19e52018-10-23 17:01:11 -0700272const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
273 .dram_type = SPD_DRAM_TYPE_DDR3,
274 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
275
276 .module_size_mbits = 4096,
277 .num_ranks = 1,
278 .device_width = 16,
Zheng Pan56c19e52018-10-23 17:01:11 -0700279 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
280 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
281
Zheng Pan56c19e52018-10-23 17:01:11 -0700282 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
283 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
284};
285
Huanhuan Liu22e02562020-10-14 14:57:39 +0800286const struct nonspd_mem_info nanya_lpddr3_nt6cl512t32am_h0 = {
287 .dram_type = SPD_DRAM_TYPE_LPDDR3,
288 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
289
290 .module_size_mbits = 16384,
291 .num_ranks = 2,
292 .device_width = 32,
Huanhuan Liu22e02562020-10-14 14:57:39 +0800293 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
294 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
295
296 .part_num = { 'N', 'T', '6', 'C', 'L', '5', '1', '2',
297 'T', '3', '2', 'A', 'M', '-', 'H', '0' },
298};
299
David Hendricks6638f872015-11-04 14:52:02 -0800300const struct nonspd_mem_info samsung_k4b4g1646d = {
301 .dram_type = SPD_DRAM_TYPE_DDR3,
302 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
303
304 .module_size_mbits = 4096,
305 .num_ranks = 1,
306 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -0800307
308 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
309 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
310
David Hendricks6638f872015-11-04 14:52:02 -0800311 .part_num =
312 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
313 '-', 'B', 'Y', 'K', '0' },
314};
315
316const struct nonspd_mem_info samsung_k4b4g1646e = {
317 .dram_type = SPD_DRAM_TYPE_DDR3,
318 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
319
320 .module_size_mbits = 4096,
321 .num_ranks = 1,
322 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -0800323
324 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
325 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
326
David Hendricks6638f872015-11-04 14:52:02 -0800327 .part_num =
328 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
329 '-', 'B', 'Y', 'K', '0' },
330};
331
Zheng Pan56c19e52018-10-23 17:01:11 -0700332const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
333 .dram_type = SPD_DRAM_TYPE_DDR3,
334 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
335
336 .module_size_mbits = 4096,
337 .num_ranks = 1,
338 .device_width = 16,
Zheng Pan56c19e52018-10-23 17:01:11 -0700339
340 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
341 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
342
Zheng Pan56c19e52018-10-23 17:01:11 -0700343 .part_num =
344 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
345 '-', 'B', 'Y', 'M', 'A' },
346};
347
David Hendricks0fa54152016-03-16 15:08:56 -0700348const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800349 .dram_type = SPD_DRAM_TYPE_DDR3,
350 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
351
352 .module_size_mbits = 4096,
353 .num_ranks = 1,
354 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -0800355
356 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
357 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
358
David Hendricks6638f872015-11-04 14:52:02 -0800359 .part_num =
360 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
361 'B', 'Y', 'K', '0' },
362};
363
David Hendricks0fa54152016-03-16 15:08:56 -0700364const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800365 .dram_type = SPD_DRAM_TYPE_DDR3,
366 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
367
368 .module_size_mbits = 4096,
369 .num_ranks = 1,
370 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -0800371
372 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
373 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
374
David Hendricks6638f872015-11-04 14:52:02 -0800375 .part_num =
376 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
377 'H', 'Y', 'K', '0' },
378};
379
David Hendricks0fa54152016-03-16 15:08:56 -0700380const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800381 .dram_type = SPD_DRAM_TYPE_DDR3,
382 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
383 .module_size_mbits = 8192,
384 .num_ranks = 2,
385 .device_width = 16,
David Hendricks6638f872015-11-04 14:52:02 -0800386
387 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
388 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
389
David Hendricks6638f872015-11-04 14:52:02 -0800390 .part_num =
391 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
392 'M', 'Y', 'K', '0' },
393};
394
David Hendricks0fa54152016-03-16 15:08:56 -0700395const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800396 .dram_type = SPD_DRAM_TYPE_LPDDR3,
397 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
398
399 .module_size_mbits = 8192,
400 .num_ranks = 2,
401 .device_width = 32,
David Hendricks6638f872015-11-04 14:52:02 -0800402
403 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
404 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
405
406 .part_num =
407 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
408 'A', 'G', 'C', 'E' },
409};
410
Vincent Palatin90af8e62016-05-20 12:12:49 -0700411const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
412 .dram_type = SPD_DRAM_TYPE_LPDDR3,
413 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
414
415 .module_size_mbits = 16384,
416 .num_ranks = 2,
417 .device_width = 32,
Vincent Palatin90af8e62016-05-20 12:12:49 -0700418
419 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
420 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
421
422 .part_num =
423 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
424 'E', 'G', 'C', 'E' },
425};
426
David Hendricks0fa54152016-03-16 15:08:56 -0700427const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800428 .dram_type = SPD_DRAM_TYPE_LPDDR3,
429 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
430
431 .module_size_mbits = 16384,
432 .num_ranks = 2,
433 .device_width = 32,
David Hendricks6638f872015-11-04 14:52:02 -0800434
435 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
436 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
437
438 .part_num =
439 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
440 'E', 'G', 'C', 'E' },
441};
442
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800443const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
444 .dram_type = SPD_DRAM_TYPE_LPDDR3,
445 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
446
447 .module_size_mbits = 16384,
448 .num_ranks = 2,
449 .device_width = 32,
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800450
451 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
452 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
453
454 .part_num =
455 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
456 'E', 'G', 'C', 'F' },
457};
458
xuxinxiong6079e222021-02-21 16:10:07 +0800459const struct nonspd_mem_info samsung_lpddr3_k4e6e304ec_egcg = {
460 .dram_type = SPD_DRAM_TYPE_LPDDR3,
461 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
462
463 .module_size_mbits = 16384,
464 .num_ranks = 2,
465 .device_width = 32,
xuxinxiong6079e222021-02-21 16:10:07 +0800466
467 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
468 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
469
470 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'C',
471 '-', 'E', 'G', 'C', 'G' },
472};
473
David Hendricks0fa54152016-03-16 15:08:56 -0700474const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800475 .dram_type = SPD_DRAM_TYPE_LPDDR3,
476 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
477
478 .module_size_mbits = 8192,
479 .num_ranks = 2,
480 .device_width = 32,
David Hendricks6638f872015-11-04 14:52:02 -0800481
482 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
483 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
484
485 .part_num =
486 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
487 'E', 'G', 'C', 'E' },
488};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700489
490const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
491 .dram_type = SPD_DRAM_TYPE_LPDDR3,
492 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
493
494 .module_size_mbits = 8192,
495 .num_ranks = 2,
496 .device_width = 32,
Vincent Palatin90af8e62016-05-20 12:12:49 -0700497
498 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
499 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
500
501 .part_num =
502 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
503 'E', 'G', 'C', 'F' },
504};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700505
Huanhuan Liu22e02562020-10-14 14:57:39 +0800506const struct nonspd_mem_info samsung_lpddr3_k4e6e304ed_egcg = {
507 .dram_type = SPD_DRAM_TYPE_LPDDR3,
508 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
509
510 .module_size_mbits = 16384,
511 .num_ranks = 2,
512 .device_width = 32,
Huanhuan Liu22e02562020-10-14 14:57:39 +0800513
514 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
515 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
516
517 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'D', '-',
518 'E', 'G', 'C', 'G' },
519};
520
Loop Wue0fa3212016-12-01 16:25:41 +0800521const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
522 .dram_type = SPD_DRAM_TYPE_LPDDR3,
523 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
524
525 .module_size_mbits = 8192,
526 .num_ranks = 1,
527 .device_width = 32,
Loop Wue0fa3212016-12-01 16:25:41 +0800528
529 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
530 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
531
532 .part_num =
533 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
534 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
535};
536
Jack Rosenthal10611d32020-05-06 12:46:38 -0600537const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_10 = {
538 .dram_type = SPD_DRAM_TYPE_LPDDR3,
539 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
540
541 .module_size_mbits = 2048 * 8,
542 .num_ranks = 1,
543 .device_width = 64,
Jack Rosenthal10611d32020-05-06 12:46:38 -0600544
545 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
546 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
547
548 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
549 'D', '1', 'P', 'F', '-', '1', '0' },
550};
551
jiazi Yang5e3d5942017-04-05 22:30:45 -0400552const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_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,
jiazi Yang5e3d5942017-04-05 22:30:45 -0400559
560 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
561 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
562
563 .part_num =
564 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
565 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
566};
567
Loop Wue0fa3212016-12-01 16:25:41 +0800568const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
569 .dram_type = SPD_DRAM_TYPE_LPDDR3,
570 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
571
572 .module_size_mbits = 16384,
573 .num_ranks = 2,
574 .device_width = 32,
Loop Wue0fa3212016-12-01 16:25:41 +0800575
576 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
577 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
578
579 .part_num =
580 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
581 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
582};
583
Jack Rosenthal1ca003d2020-05-07 09:04:54 -0600584const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_10 = {
585 .dram_type = SPD_DRAM_TYPE_LPDDR3,
586 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
587
588 .module_size_mbits = 4096 * 8,
589 .num_ranks = 2,
590 .device_width = 64,
Jack Rosenthal1ca003d2020-05-07 09:04:54 -0600591
592 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
593 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
594
595 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2',
596 'D', '2', 'P', 'F', '-', '1', '0' },
597};
598
Kaka Niae6ece42019-02-26 09:55:57 +0800599const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
600 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
601
602 .module_size_mbits = 32768,
603 .num_ranks = 2,
604 .device_width = 32,
Kaka Niae6ece42019-02-26 09:55:57 +0800605
606 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
607 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
608
609 .part_num =
610 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '4', 'N',
611 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
612};
613
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700614const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d2np_046wta = {
615 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
616
617 .module_size_mbits = 32768,
618 .num_ranks = 1,
619 .device_width = 32,
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700620
621 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
622 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
623
624 .part_num =
625 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '2', 'N',
626 'P', '-', '4', '6', 'W', 'T', ':', 'A'},
627};
628
629const struct nonspd_mem_info micron_lpddr4x_mt53e2g32d4nq_046wta = {
630 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
631
Paul Huang2fe53be2020-11-17 14:02:55 +0800632 .module_size_mbits = 65536,
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700633 .num_ranks = 2,
634 .device_width = 32,
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700635
636 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
637 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
638
639 .part_num =
640 { 'M', 'T', '5', '3', 'E', '2', 'G', '3', '2', 'D', '4', 'N',
641 'Q', '-', '4', '6', 'W', 'T', ':', 'A'},
642};
643
karen_wuc94b8d32020-07-16 14:54:14 +0800644const struct nonspd_mem_info micron_lpddr4x_mt53d1g32d4dt_046wtd = {
645 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
646
647 .module_size_mbits = 32768,
648 .num_ranks = 2,
649 .device_width = 32,
karen_wuc94b8d32020-07-16 14:54:14 +0800650
651 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
652 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
653
654 .part_num =
655 { 'M', 'T', '5', '3', 'D', '1', 'G', '3', '2', 'D', '4', 'D',
656 'T', '-', '4', '6', 'W', 'T', ':', 'D'},
657};
658
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800659const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8dqksl = {
660 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
661
662 .module_size_mbits = 32768,
663 .num_ranks = 2,
664 .device_width = 32,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800665
666 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
667 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
668
669 .part_num =
670 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'D',
671 'Q', 'K', 'S', 'L'},
672};
673
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +0800674const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8gqfsl_046 = {
675 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
676
677 .module_size_mbits = 32768,
678 .num_ranks = 2,
679 .device_width = 32,
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +0800680
681 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
682 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
683
684 .part_num =
685 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'G',
686 'Q', 'F', 'S', 'L', '-', '0', '4', '6'},
687};
688
689const struct nonspd_mem_info micron_lpddr4x_mt29vzzzbd9dqkpr_046 = {
690 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
691
692 .module_size_mbits = 32768,
693 .num_ranks = 2,
694 .device_width = 32,
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +0800695
696 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
697 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
698
699 .part_num =
700 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'B', 'D', '9', 'D',
701 'Q', 'K', 'P', 'R', '-', '0', '4', '6'},
702};
703
Jessy Jiangb558da22021-03-23 10:13:47 +0800704const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad9gqfsm_046 = {
705 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
706
707 .module_size_mbits = 32768,
708 .num_ranks = 2,
709 .device_width = 32,
Jessy Jiangb558da22021-03-23 10:13:47 +0800710
711 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
712 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
713
714 .part_num =
715 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '9', 'G',
716 'Q', 'F', 'S', 'M', '-', '0', '4', '6'},
717};
718
Philip Chencccc7042018-09-25 20:31:37 -0700719const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
720 .dram_type = SPD_DRAM_TYPE_LPDDR4,
721
722 .module_size_mbits = 32768,
723 .num_ranks = 2,
724 .device_width = 32,
Philip Chencccc7042018-09-25 20:31:37 -0700725
726 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
727 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
728
729 .part_num =
730 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
731 'A', 'G', 'C', 'J' },
732};
733
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800734const struct nonspd_mem_info samsung_lpddr4x_kmdh6001da_b422 = {
735 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
736
737 .module_size_mbits = 32768,
738 .num_ranks = 2,
739 .device_width = 32,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800740
741 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
742 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
743
744 .part_num =
745 { 'K', 'M', 'D', 'H', '6', '0', '0', '1', 'D', 'A', '-',
746 'B', '4', '2', '2' },
747};
748
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800749const struct nonspd_mem_info samsung_lpddr4x_kmdp6001da_b425 = {
750 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
751
752 .module_size_mbits = 32768,
753 .num_ranks = 2,
754 .device_width = 32,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800755
756 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
757 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
758
759 .part_num =
760 { 'K', 'M', 'D', 'P', '6', '0', '0', '1', 'D', 'A', '-',
761 'B', '4', '2', '5' },
762};
763
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800764const struct nonspd_mem_info samsung_lpddr4x_kmdv6001da_b620 = {
765 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
766
767 .module_size_mbits = 32768,
768 .num_ranks = 2,
769 .device_width = 32,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800770
771 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
772 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
773
774 .part_num =
775 { 'K', 'M', 'D', 'V', '6', '0', '0', '1', 'D', 'A', '-',
776 'B', '6', '2', '0' },
777};
778
cherish8851df02019-09-01 14:35:55 +0800779const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcl = {
780 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
781
782 .module_size_mbits = 32768,
783 .num_ranks = 2,
784 .device_width = 32,
cherish8851df02019-09-01 14:35:55 +0800785
786 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
787 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
788
789 .part_num =
790 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
791 'M', 'G', 'C', 'L' },
792};
793
Chia-Hsiu Chang065a3c42020-08-27 19:08:13 +0800794const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcr = {
795 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
796
797 .module_size_mbits = 32768,
798 .num_ranks = 2,
799 .device_width = 32,
Chia-Hsiu Chang065a3c42020-08-27 19:08:13 +0800800
801 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
802 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
803
804 .part_num =
805 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
806 'M', 'G', 'C', 'R' },
807};
808
Ren Kuofcda40b2021-04-01 15:28:27 +0800809const struct nonspd_mem_info samsung_lpddr4x_k4uce3q4aa_mgcr = {
810 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
811
812 .module_size_mbits = 65536,
813 .num_ranks = 2,
814 .device_width = 32,
815
816 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
817 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
818
819 .part_num =
820 { 'K', '4', 'U', 'C', 'E', '3', 'Q', '4', 'A', 'A', '-',
821 'M', 'G', 'C', 'R' },
822};
823
Kaka Ni9db5d8a2019-07-05 12:13:33 +0800824const struct nonspd_mem_info sandisk_lpddr4x_sdada4cr_128g = {
825 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
826
827 .module_size_mbits = 32768,
828 .num_ranks = 2,
829 .device_width = 32,
Kaka Ni9db5d8a2019-07-05 12:13:33 +0800830
831 .module_mfg_id = { .msb = 0x45, .lsb = 0x00 },
832 .dram_mfg_id = { .msb = 0x45, .lsb = 0x00 },
833
834 .part_num =
835 { 'S', 'D', 'A', 'D', 'A', '4', 'C', 'R', '-', '1', '2',
836 '8', 'G' },
837};
838
Marco Chena18bbb22018-08-13 16:10:55 +0800839// This one is reserved for storing mem info from SMBIOS if no explicit entry
840// was added above.
841static struct nonspd_mem_info part_extracted_from_smbios = {
842 .part_num =
843 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
844};
845
Jack Rosenthale279bb22020-05-15 17:46:55 -0600846static enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800847{
Jack Rosenthal0eec1a52021-01-12 13:40:07 -0700848 char *part_number = table->string[table->data.mem_device.part_number];
849 static const struct {
850 enum spd_dram_type type;
851 const char *prefix;
852 } part_number_matches[] = {
853 /* Hynix */
854 { SPD_DRAM_TYPE_DDR3, "h5t" },
855 { SPD_DRAM_TYPE_LPDDR3, "h9c" },
856 { SPD_DRAM_TYPE_LPDDR4, "h9h" },
857
858 /* Samsung */
859 { SPD_DRAM_TYPE_DDR3, "k4b" },
860 { SPD_DRAM_TYPE_LPDDR3, "k3q" },
861 { SPD_DRAM_TYPE_LPDDR3, "k4e" },
862 { SPD_DRAM_TYPE_LPDDR4, "k3u" },
863 { SPD_DRAM_TYPE_LPDDR4, "k4f" },
864
865 /* Micron */
866 { SPD_DRAM_TYPE_DDR4, "mt40" },
867 { SPD_DRAM_TYPE_DDR3, "mt41" },
868 { SPD_DRAM_TYPE_LPDDR3, "mt52" },
869 { SPD_DRAM_TYPE_LPDDR4, "mt53" },
870 };
871
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800872 switch (table->data.mem_device.type) {
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800873 case SMBIOS_MEMORY_TYPE_DDR3:
874 return SPD_DRAM_TYPE_DDR3;
875 case SMBIOS_MEMORY_TYPE_DDR4:
876 return SPD_DRAM_TYPE_DDR4;
Paul Fagerburg1f3997c2019-05-17 09:31:29 -0600877 case SMBIOS_MEMORY_TYPE_LPDDR3:
878 return SPD_DRAM_TYPE_LPDDR3;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800879 case SMBIOS_MEMORY_TYPE_LPDDR4:
880 return SPD_DRAM_TYPE_LPDDR4;
Jack Rosenthal78ab5b52021-01-13 16:00:38 -0700881 case SMBIOS_MEMORY_TYPE_OTHER:
Jack Rosenthal0eec1a52021-01-12 13:40:07 -0700882 case SMBIOS_MEMORY_TYPE_UNKNOWN:
883 /* Do our best to figure it out from part numbers */
884 for (size_t i = 0; i < ARRAY_SIZE(part_number_matches); i++) {
885 if (!strncasecmp(part_number,
886 part_number_matches[i].prefix,
887 strlen(part_number_matches[i].prefix)))
888 return part_number_matches[i].type;
889 }
890
891 /* Fall thru */
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800892 default:
893 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
894 __func__, table->data.mem_device.type);
895 return 0;
896 }
897}
898
Marco Chena18bbb22018-08-13 16:10:55 +0800899static int extract_mem_info_from_smbios(
900 struct smbios_table *table,
901 struct nonspd_mem_info *info)
902{
903 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +0800904 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +0800905 uint32_t size;
906
Marco Chen05511cb2018-10-01 08:35:37 +0800907 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +0800908 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +0800909 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +0800910
911 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +0800912 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +0800913 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
914 "Or len of part number %lu is larger then buffer %lu."
915 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +0800916 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +0800917 return -1;
918 }
919
920 size = (table->data.mem_device.size & 0x7fff) * 8;
921 info->module_size_mbits =
922 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
923
Marco Chen05511cb2018-10-01 08:35:37 +0800924 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800925
926 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -0800927 info->num_ranks = table->data.mem_device.attributes & 0xf;
928 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -0800929
Jack Rosenthal229579c2021-02-04 14:29:25 -0700930 return 0;
Marco Chena18bbb22018-08-13 16:10:55 +0800931}
932
Nick Vaccaroc287faf2020-09-15 13:35:52 -0700933int spd_set_nonspd_info_from_smbios(struct platform_intf *intf, int dimm,
934 const struct nonspd_mem_info **info)
935{
936 struct smbios_table table;
937
938 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table) < 0) {
939 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n",
940 __func__);
941 return -1;
942 }
943
944 /* memory device from SMBIOS is mapped into a nonspd_mem_info */
945 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios))
946 return -1;
947
948 *info = &part_extracted_from_smbios;
949
950 return 0;
951}