blob: ec9434daf0c5da7eb5d288907ec9e273e79e3835 [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 elpida_lpddr3_f8132a3ma_gd_f = {
David Hendricks6638f872015-11-04 14:52:02 -080056 .dram_type = SPD_DRAM_TYPE_LPDDR3,
57 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
58
59 .module_size_mbits = 8192,
60 .num_ranks = 2,
61 .device_width = 32,
62 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
63
64 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
65 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
66
67 .part_num =
68 { 'F', '8', '1', '3', '2', 'A', '3', 'M', 'A', '-', 'G', 'D',
69 '-', 'F',},
70};
71
David Hendricks0fa54152016-03-16 15:08:56 -070072const struct nonspd_mem_info elpida_lpddr3_fa232a2ma_gc_f = {
David Hendricks6638f872015-11-04 14:52:02 -080073 .dram_type = SPD_DRAM_TYPE_LPDDR3,
74 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
75
76 .module_size_mbits = 16384,
77 .num_ranks = 2,
78 .device_width = 32,
79 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
80
81 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
82 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
83
84 .part_num =
85 { 'F', 'A', '2', '3', '2', 'A', '2', 'M', 'A', '-', 'G', 'C',
86 '-', 'F',},
87};
88
David Hendricks0fa54152016-03-16 15:08:56 -070089const struct nonspd_mem_info hynix_ddr3l_h5tc4g63afr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -080090 .dram_type = SPD_DRAM_TYPE_DDR3,
91 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
92
93 .module_size_mbits = 4096,
94 .num_ranks = 1,
95 .device_width = 16,
96 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
97
98 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
99 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
100
David Hendricks6638f872015-11-04 14:52:02 -0800101 .part_num =
102 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'A', 'F', 'R', '-',
103 'P', 'B', 'A'},
104};
105
David Hendricks0fa54152016-03-16 15:08:56 -0700106const struct nonspd_mem_info hynix_ddr3l_h5tc4g63cfr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800107 .dram_type = SPD_DRAM_TYPE_DDR3,
108 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
109
110 .module_size_mbits = 4096,
111 .num_ranks = 1,
112 .device_width = 16,
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
David Hendricks6638f872015-11-04 14:52:02 -0800118 .part_num =
119 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'C', 'F', 'R', '-',
120 'P', 'B', 'A'},
121};
122
Zheng Pan56c19e52018-10-23 17:01:11 -0700123const struct nonspd_mem_info hynix_ddr3l_h5tc4g63efr_rda = {
124 .dram_type = SPD_DRAM_TYPE_DDR3,
125 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
126
127 .module_size_mbits = 4096,
128 .num_ranks = 1,
129 .device_width = 16,
130 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
131
132 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
133 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
134
Zheng Pan56c19e52018-10-23 17:01:11 -0700135 .part_num =
136 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'E', 'F', 'R', '-',
137 'R', 'D', 'A'},
138};
139
David Hendricks0fa54152016-03-16 15:08:56 -0700140const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8gtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800141 .dram_type = SPD_DRAM_TYPE_LPDDR3,
142 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
143
144 .module_size_mbits = 8192,
145 .num_ranks = 1,
146 .device_width = 32,
147 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
148
149 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
150 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
151
152 .part_num =
153 { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'G', 'T', 'M', 'L',
154 'A', 'R', '-', 'N', 'U', 'D',},
155};
156
Jack Rosenthal956a5b42020-05-06 14:26:32 -0600157const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8jtblar_nud = {
158 .dram_type = SPD_DRAM_TYPE_LPDDR3,
159 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
160
161 .module_size_mbits = 2048 * 8,
162 .num_ranks = 2,
163 .device_width = 64,
164 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
165
166 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
167 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
168
169 .part_num = { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'J', 'T', 'B',
170 'L', 'A', 'R', '-', 'N', 'U', 'D' },
171};
172
Milton Chiang5664fe32016-11-29 14:59:49 +0800173const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtalar_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_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', 'A', 'L',
187 'A', 'R', '-', 'N', 'U', 'D',},
188};
189
David Hendricks0fa54152016-03-16 15:08:56 -0700190const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800191 .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', 'J', 'T', 'M', 'L',
204 'A', 'R', '-', 'N', 'U', 'D',},
205};
206
David Hendricks0fa54152016-03-16 15:08:56 -0700207const struct nonspd_mem_info hynix_ddr3l_h5tc8g63amr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800208 .dram_type = SPD_DRAM_TYPE_DDR3,
209 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
210 .module_size_mbits = 8192,
211 .num_ranks = 2,
212 .device_width = 16,
213 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
214
215 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
216 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
217
David Hendricks6638f872015-11-04 14:52:02 -0800218 .part_num =
219 { 'H', '5', 'T', 'C', '8', 'G', '6', '3', 'A', 'M', 'R', '-',
220 'P', 'B', 'A' },
221};
222
David Hendricks0fa54152016-03-16 15:08:56 -0700223const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbptblbr_nud = {
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800224 .dram_type = SPD_DRAM_TYPE_LPDDR3,
225 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
226
227 .module_size_mbits = 16384,
228 .num_ranks = 2,
229 .device_width = 32,
230 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
231
232 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
233 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
234
235 .part_num =
236 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'P', 'T', 'B', 'L',
237 'B', 'R', '-', 'N', 'U', 'D',},
238};
239
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800240const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbltblar_nud = {
241 .dram_type = SPD_DRAM_TYPE_LPDDR3,
242 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
243
244 .module_size_mbits = 16384,
245 .num_ranks = 2,
246 .device_width = 32,
247 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
248
249 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
250 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
251
252 .part_num =
253 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'L', 'T', 'B', 'L',
254 'A', 'R', '-', 'N', 'U', 'D',},
255};
256
Loop_Wu9ec61642019-01-29 14:28:34 +0800257const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbktmlbr_ntd = {
258 .dram_type = SPD_DRAM_TYPE_LPDDR3,
259 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
260
261 .module_size_mbits = 16384,
262 .num_ranks = 2,
263 .device_width = 32,
264 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
265
266 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
267 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
268
269 .part_num =
270 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'K', 'T', 'M', 'L',
271 'B', 'R', '-', 'N', 'T', 'D',},
272};
273
Jack Rosenthal73a32f32020-05-07 08:24:48 -0600274const struct nonspd_mem_info hynix_lpddr3_h9ccnnncltmlar_nud = {
275 .dram_type = SPD_DRAM_TYPE_LPDDR3,
276 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
277
278 .module_size_mbits = 8192 * 8,
279 .num_ranks = 2,
280 .device_width = 64,
281 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
282
283 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
284 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
285
286 .part_num = { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'C', 'L', 'T', 'M',
287 'L', 'A', 'R', '-', 'N', 'U', 'D' },
288};
289
Jack Rosenthale279bb22020-05-15 17:46:55 -0600290static const struct nonspd_mem_info hynix_lpddr4_h9hcnnn8kumlhr = {
Kevin Chiu55250dd2016-11-08 17:21:23 +0800291 .dram_type = SPD_DRAM_TYPE_LPDDR4,
292
293 .module_size_mbits = 8192,
294 .num_ranks = 1,
295 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700296 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Kevin Chiu55250dd2016-11-08 17:21:23 +0800297
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', '8', 'K', 'U', 'M', 'L',
303 'H', 'R',},
304};
305
Jack Rosenthale279bb22020-05-15 17:46:55 -0600306static const struct nonspd_mem_info hynix_lpddr4_h9hcnnnbpumlhr = {
Kevin Chiu55250dd2016-11-08 17:21:23 +0800307 .dram_type = SPD_DRAM_TYPE_LPDDR4,
308
309 .module_size_mbits = 16384,
310 .num_ranks = 2,
311 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700312 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Kevin Chiu55250dd2016-11-08 17:21:23 +0800313
314 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
315 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
316
317 .part_num =
318 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'B', 'P', 'U', 'M', 'L',
319 'H', 'R',},
320};
321
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800322const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmalhr_nee = {
323 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
324
325 .module_size_mbits = 32768,
326 .num_ranks = 2,
327 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700328 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800329
330 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
331 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
332
333 .part_num =
334 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'A', 'L',
335 'H', 'R', '-', 'N', 'E', 'E'},
336};
337
David Hendricks6638f872015-11-04 14:52:02 -0800338const struct nonspd_mem_info micron_mt41k256m16ha = {
339 .dram_type = SPD_DRAM_TYPE_DDR3,
340 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
341
342 .module_size_mbits = 4096,
343 .num_ranks = 1,
344 .device_width = 16,
345 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
346
347 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
348 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
349
David Hendricks6638f872015-11-04 14:52:02 -0800350 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
351 '1', '6', 'H', 'A', '-', '1', '2', '5' },
352};
353
Milton Chiang5664fe32016-11-29 14:59:49 +0800354const struct nonspd_mem_info micron_mt52l256m32d1pf = {
355 .dram_type = SPD_DRAM_TYPE_DDR3,
356 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
357
358 .module_size_mbits = 8192,
359 .num_ranks = 1,
360 .device_width = 32,
361 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
362
363 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
364 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
365
Milton Chiang5664fe32016-11-29 14:59:49 +0800366 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M',
367 '3', '2', 'D', '1', 'P', 'F', '-', '0', '9',
368 '3', 'W', 'T', ':', 'B' },
369};
370
371const struct nonspd_mem_info micron_mt52l512m32d2pf = {
372 .dram_type = SPD_DRAM_TYPE_DDR3,
373 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
374
375 .module_size_mbits = 16384,
376 .num_ranks = 2,
377 .device_width = 32,
378 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
379
380 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
381 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
382
Milton Chiang5664fe32016-11-29 14:59:49 +0800383 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M',
384 '3', '2', 'D', '2', 'P', 'F', '-', '0', '9',
385 '3', 'W', 'T', ':', 'B' },
386};
387
David Hendricks97303242015-11-11 14:41:40 -0800388const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
389 .dram_type = SPD_DRAM_TYPE_DDR3,
390 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
391
392 .module_size_mbits = 4096,
393 .num_ranks = 1,
394 .device_width = 16,
395 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
396 .ddr_freq = { DDR_667, DDR_800 },
397 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
398 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
399
David Hendricks97303242015-11-11 14:41:40 -0800400 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
401 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
402};
403
Zheng Pan56c19e52018-10-23 17:01:11 -0700404const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
405 .dram_type = SPD_DRAM_TYPE_DDR3,
406 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
407
408 .module_size_mbits = 4096,
409 .num_ranks = 1,
410 .device_width = 16,
411 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
412 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
413 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
414
Zheng Pan56c19e52018-10-23 17:01:11 -0700415 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
416 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
417};
418
David Hendricks6638f872015-11-04 14:52:02 -0800419const struct nonspd_mem_info samsung_k4b4g1646d = {
420 .dram_type = SPD_DRAM_TYPE_DDR3,
421 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
422
423 .module_size_mbits = 4096,
424 .num_ranks = 1,
425 .device_width = 16,
426 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
427
428 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
429 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
430
David Hendricks6638f872015-11-04 14:52:02 -0800431 .part_num =
432 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
433 '-', 'B', 'Y', 'K', '0' },
434};
435
436const struct nonspd_mem_info samsung_k4b4g1646e = {
437 .dram_type = SPD_DRAM_TYPE_DDR3,
438 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
439
440 .module_size_mbits = 4096,
441 .num_ranks = 1,
442 .device_width = 16,
443 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
444
445 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
446 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
447
David Hendricks6638f872015-11-04 14:52:02 -0800448 .part_num =
449 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
450 '-', 'B', 'Y', 'K', '0' },
451};
452
Zheng Pan56c19e52018-10-23 17:01:11 -0700453const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
454 .dram_type = SPD_DRAM_TYPE_DDR3,
455 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
456
457 .module_size_mbits = 4096,
458 .num_ranks = 1,
459 .device_width = 16,
460 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
461
462 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
463 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
464
Zheng Pan56c19e52018-10-23 17:01:11 -0700465 .part_num =
466 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
467 '-', 'B', 'Y', 'M', 'A' },
468};
469
David Hendricks0fa54152016-03-16 15:08:56 -0700470const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800471 .dram_type = SPD_DRAM_TYPE_DDR3,
472 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
473
474 .module_size_mbits = 4096,
475 .num_ranks = 1,
476 .device_width = 16,
477 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
478
479 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
480 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
481
David Hendricks6638f872015-11-04 14:52:02 -0800482 .part_num =
483 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
484 'B', 'Y', 'K', '0' },
485};
486
David Hendricks0fa54152016-03-16 15:08:56 -0700487const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800488 .dram_type = SPD_DRAM_TYPE_DDR3,
489 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
490
491 .module_size_mbits = 4096,
492 .num_ranks = 1,
493 .device_width = 16,
494 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
495
496 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
497 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
498
David Hendricks6638f872015-11-04 14:52:02 -0800499 .part_num =
500 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
501 'H', 'Y', 'K', '0' },
502};
503
David Hendricks0fa54152016-03-16 15:08:56 -0700504const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800505 .dram_type = SPD_DRAM_TYPE_DDR3,
506 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
507 .module_size_mbits = 8192,
508 .num_ranks = 2,
509 .device_width = 16,
510 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
511
512 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
513 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
514
David Hendricks6638f872015-11-04 14:52:02 -0800515 .part_num =
516 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
517 'M', 'Y', 'K', '0' },
518};
519
David Hendricks0fa54152016-03-16 15:08:56 -0700520const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800521 .dram_type = SPD_DRAM_TYPE_LPDDR3,
522 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
523
524 .module_size_mbits = 8192,
525 .num_ranks = 2,
526 .device_width = 32,
527 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
528
529 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
530 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
531
532 .part_num =
533 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
534 'A', 'G', 'C', 'E' },
535};
536
Vincent Palatin90af8e62016-05-20 12:12:49 -0700537const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
538 .dram_type = SPD_DRAM_TYPE_LPDDR3,
539 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
540
541 .module_size_mbits = 16384,
542 .num_ranks = 2,
543 .device_width = 32,
544 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
545
546 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
547 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
548
549 .part_num =
550 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
551 'E', 'G', 'C', 'E' },
552};
553
Jack Rosenthal6b99a832020-05-06 15:34:10 -0600554const struct nonspd_mem_info samsung_lpddr3_k4e6e304ec_egcf = {
555 .dram_type = SPD_DRAM_TYPE_LPDDR3,
556 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
557
558 .module_size_mbits = 4096 * 8,
559 .num_ranks = 2,
560 .device_width = 64,
561 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
562
563 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
564 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
565
566 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'C', '-',
567 'E', 'G', 'C', 'F' },
568};
569
David Hendricks0fa54152016-03-16 15:08:56 -0700570const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800571 .dram_type = SPD_DRAM_TYPE_LPDDR3,
572 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
573
574 .module_size_mbits = 16384,
575 .num_ranks = 2,
576 .device_width = 32,
577 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
578
579 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
580 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
581
582 .part_num =
583 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
584 'E', 'G', 'C', 'E' },
585};
586
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -0600587const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egcf = {
588 .dram_type = SPD_DRAM_TYPE_LPDDR3,
589 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
590
591 .module_size_mbits = 4096 * 8,
592 .num_ranks = 2,
593 .device_width = 64,
594 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
595
596 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
597 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
598
599 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
600 'E', 'G', 'C', 'F' },
601};
602
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800603const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
604 .dram_type = SPD_DRAM_TYPE_LPDDR3,
605 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
606
607 .module_size_mbits = 16384,
608 .num_ranks = 2,
609 .device_width = 32,
610 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
611
612 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
613 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
614
615 .part_num =
616 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
617 'E', 'G', 'C', 'F' },
618};
619
David Hendricks0fa54152016-03-16 15:08:56 -0700620const struct nonspd_mem_info samsung_lpddr3_k4e8e304ed_egcc = {
David Hendricks6638f872015-11-04 14:52:02 -0800621 .dram_type = SPD_DRAM_TYPE_DDR3,
622 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
623
624 .module_size_mbits = 8192,
625 .num_ranks = 2,
626 .device_width = 32,
627 .ddr_freq = { DDR_533 },
628
629 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
630 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
631
David Hendricks6638f872015-11-04 14:52:02 -0800632 .part_num =
633 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'D', '-',
634 'E', 'G', 'C', 'C' },
635};
636
David Hendricks0fa54152016-03-16 15:08:56 -0700637const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800638 .dram_type = SPD_DRAM_TYPE_LPDDR3,
639 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
640
641 .module_size_mbits = 8192,
642 .num_ranks = 2,
643 .device_width = 32,
644 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
645
646 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
647 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
648
649 .part_num =
650 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
651 'E', 'G', 'C', 'E' },
652};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700653
654const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
655 .dram_type = SPD_DRAM_TYPE_LPDDR3,
656 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
657
658 .module_size_mbits = 8192,
659 .num_ranks = 2,
660 .device_width = 32,
661 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
662
663 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
664 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
665
666 .part_num =
667 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
668 'E', 'G', 'C', 'F' },
669};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700670
Jack Rosenthal7f5861c2020-05-07 07:30:55 -0600671const struct nonspd_mem_info samsung_lpddr3_k4ebe304eb_egcf = {
672 .dram_type = SPD_DRAM_TYPE_LPDDR3,
673 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
674
675 .module_size_mbits = 8192 * 8,
676 .num_ranks = 2,
677 .device_width = 64,
678 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
679
680 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
681 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
682
683 .part_num = { 'K', '4', 'E', 'B', 'E', '3', '0', '4', 'E', 'B', '-',
684 'E', 'G', 'C', 'F' },
685};
686
Loop Wue0fa3212016-12-01 16:25:41 +0800687const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
688 .dram_type = SPD_DRAM_TYPE_LPDDR3,
689 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
690
691 .module_size_mbits = 8192,
692 .num_ranks = 1,
693 .device_width = 32,
694 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
695
696 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
697 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
698
699 .part_num =
700 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
701 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
702};
703
Jack Rosenthal7bdaff92020-05-06 13:04:59 -0600704const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf107 = {
705 .dram_type = SPD_DRAM_TYPE_LPDDR3,
706 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
707
708 .module_size_mbits = 2048 * 8,
709 .num_ranks = 1,
710 .device_width = 64,
711 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
712
713 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
714 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
715
716 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
717 'D', '1', 'P', 'F', '1', '0', '7' },
718};
719
Jack Rosenthal10611d32020-05-06 12:46:38 -0600720const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_10 = {
721 .dram_type = SPD_DRAM_TYPE_LPDDR3,
722 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
723
724 .module_size_mbits = 2048 * 8,
725 .num_ranks = 1,
726 .device_width = 64,
727 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
728
729 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
730 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
731
732 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
733 'D', '1', 'P', 'F', '-', '1', '0' },
734};
735
jiazi Yang5e3d5942017-04-05 22:30:45 -0400736const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_107wtb = {
737 .dram_type = SPD_DRAM_TYPE_LPDDR3,
738 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
739
740 .module_size_mbits = 8192,
741 .num_ranks = 1,
742 .device_width = 32,
743 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
744
745 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
746 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
747
748 .part_num =
749 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
750 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
751};
752
Loop Wue0fa3212016-12-01 16:25:41 +0800753const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
754 .dram_type = SPD_DRAM_TYPE_LPDDR3,
755 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
756
757 .module_size_mbits = 16384,
758 .num_ranks = 2,
759 .device_width = 32,
760 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
761
762 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
763 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
764
765 .part_num =
766 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
767 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
768};
769
Jack Rosenthal1ca003d2020-05-07 09:04:54 -0600770const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_10 = {
771 .dram_type = SPD_DRAM_TYPE_LPDDR3,
772 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
773
774 .module_size_mbits = 4096 * 8,
775 .num_ranks = 2,
776 .device_width = 64,
777 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
778
779 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
780 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
781
782 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2',
783 'D', '2', 'P', 'F', '-', '1', '0' },
784};
785
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700786static const struct nonspd_mem_info micron_lpddr4_mt53b256m32d1np = {
787 .dram_type = SPD_DRAM_TYPE_LPDDR4,
788
789 .module_size_mbits = 8192,
790 .num_ranks = 1,
791 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700792 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700793
794 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
795 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
796
797 .part_num =
798 { 'M', 'T', '5', '3', 'B', '2', '5', '6', 'M', '3', '2', 'D',
799 '1', 'N', 'P'},
800};
801
802static const struct nonspd_mem_info micron_lpddr4_mt53b512m32d2np = {
803 .dram_type = SPD_DRAM_TYPE_LPDDR4,
804
805 .module_size_mbits = 16384,
806 .num_ranks = 2,
807 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700808 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700809
810 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
811 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
812
813 .part_num =
814 { 'M', 'T', '5', '3', 'B', '5', '1', '2', 'M', '3', '2', 'D',
815 '2', 'N', 'P'},
816};
817
ren kuoc9202c92018-05-14 19:46:20 +0800818static const struct nonspd_mem_info micron_lpddr4_mt53e512m32d2np = {
819 .dram_type = SPD_DRAM_TYPE_LPDDR4,
820
821 .module_size_mbits = 16384,
822 .num_ranks = 2,
823 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700824 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuoc9202c92018-05-14 19:46:20 +0800825
826 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
827 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
828
829 .part_num =
830 { 'M', 'T', '5', '3', 'E', '5', '1', '2', 'M', '3', '2', 'D',
831 '2', 'N', 'P'},
832};
833
Kaka Niae6ece42019-02-26 09:55:57 +0800834const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
835 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
836
837 .module_size_mbits = 32768,
838 .num_ranks = 2,
839 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700840 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Kaka Niae6ece42019-02-26 09:55:57 +0800841
842 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
843 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
844
845 .part_num =
846 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '4', 'N',
847 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
848};
849
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700850const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d2np_046wta = {
851 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
852
853 .module_size_mbits = 32768,
854 .num_ranks = 1,
855 .device_width = 32,
856 .ddr_freq = { DDR_2133 },
857
858 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
859 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
860
861 .part_num =
862 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '2', 'N',
863 'P', '-', '4', '6', 'W', 'T', ':', 'A'},
864};
865
866const struct nonspd_mem_info micron_lpddr4x_mt53e2g32d4nq_046wta = {
867 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
868
869 .module_size_mbits = 32768,
870 .num_ranks = 2,
871 .device_width = 32,
872 .ddr_freq = { DDR_2133 },
873
874 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
875 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
876
877 .part_num =
878 { 'M', 'T', '5', '3', 'E', '2', 'G', '3', '2', 'D', '4', 'N',
879 'Q', '-', '4', '6', 'W', 'T', ':', 'A'},
880};
881
karen_wuc94b8d32020-07-16 14:54:14 +0800882const struct nonspd_mem_info micron_lpddr4x_mt53d1g32d4dt_046wtd = {
883 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
884
885 .module_size_mbits = 32768,
886 .num_ranks = 2,
887 .device_width = 32,
888 .ddr_freq = { DDR_2133 },
889
890 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
891 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
892
893 .part_num =
894 { 'M', 'T', '5', '3', 'D', '1', 'G', '3', '2', 'D', '4', 'D',
895 'T', '-', '4', '6', 'W', 'T', ':', 'D'},
896};
897
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800898const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8dqksl = {
899 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
900
901 .module_size_mbits = 32768,
902 .num_ranks = 2,
903 .device_width = 32,
904 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
905
906 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
907 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
908
909 .part_num =
910 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'D',
911 'Q', 'K', 'S', 'L'},
912};
913
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +0800914const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8gqfsl_046 = {
915 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
916
917 .module_size_mbits = 32768,
918 .num_ranks = 2,
919 .device_width = 32,
920 .ddr_freq = { DDR_2133 },
921
922 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
923 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
924
925 .part_num =
926 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'G',
927 'Q', 'F', 'S', 'L', '-', '0', '4', '6'},
928};
929
930const struct nonspd_mem_info micron_lpddr4x_mt29vzzzbd9dqkpr_046 = {
931 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
932
933 .module_size_mbits = 32768,
934 .num_ranks = 2,
935 .device_width = 32,
936 .ddr_freq = { DDR_2133 },
937
938 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
939 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
940
941 .part_num =
942 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'B', 'D', '9', 'D',
943 'Q', 'K', 'P', 'R', '-', '0', '4', '6'},
944};
945
Philip Chencccc7042018-09-25 20:31:37 -0700946const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
947 .dram_type = SPD_DRAM_TYPE_LPDDR4,
948
949 .module_size_mbits = 32768,
950 .num_ranks = 2,
951 .device_width = 32,
952 .ddr_freq = { DDR_1355 },
953
954 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
955 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
956
957 .part_num =
958 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
959 'A', 'G', 'C', 'J' },
960};
961
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700962static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgcj = {
963 .dram_type = SPD_DRAM_TYPE_LPDDR4,
964
965 .module_size_mbits = 16384,
966 .num_ranks = 2,
967 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700968 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700969
970 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
971 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
972
973 .part_num =
974 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
975 'M', 'G', 'C', 'J' },
976};
977
ren kuo500c9c62018-05-24 17:57:50 +0800978static const struct nonspd_mem_info samsung_lpddr4_k4f6e3s4hm_mgcj = {
979 .dram_type = SPD_DRAM_TYPE_LPDDR4,
980
981 .module_size_mbits = 16384,
982 .num_ranks = 1,
983 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700984 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuo500c9c62018-05-24 17:57:50 +0800985
986 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
987 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
988
989 .part_num =
990 { 'K', '4', 'F', '6', 'E', '3', 'S', '4', 'H', 'M', '-',
991 'M', 'G', 'C', 'J' },
992};
993
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700994static const struct nonspd_mem_info samsung_lpddr4_k4f8e304hb_mgcj = {
995 .dram_type = SPD_DRAM_TYPE_LPDDR4,
996
997 .module_size_mbits = 8192,
998 .num_ranks = 1,
999 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001000 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001001
1002 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1003 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1004
1005 .part_num =
1006 { 'K', '4', 'F', '8', 'E', '3', '0', '4', 'H', 'B', '-',
1007 'M', 'G', 'C', 'J' },
1008};
1009
Kevin Chiucba66122020-07-14 20:08:52 +08001010static const struct nonspd_mem_info samsung_lpddr4_k4f8e3s4hd_mgcl = {
1011 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1012
1013 .module_size_mbits = 8192,
1014 .num_ranks = 1,
1015 .device_width = 32,
1016 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1017
1018 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1019 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1020
1021 .part_num =
1022 { 'K', '4', 'F', '8', 'E', '3', 'S', '4', 'H', 'D', '-',
1023 'M', 'G', 'C', 'L' },
1024};
1025
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001026const struct nonspd_mem_info samsung_lpddr4x_kmdh6001da_b422 = {
1027 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1028
1029 .module_size_mbits = 32768,
1030 .num_ranks = 2,
1031 .device_width = 32,
1032 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1033
1034 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1035 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1036
1037 .part_num =
1038 { 'K', 'M', 'D', 'H', '6', '0', '0', '1', 'D', 'A', '-',
1039 'B', '4', '2', '2' },
1040};
1041
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001042const struct nonspd_mem_info samsung_lpddr4x_kmdp6001da_b425 = {
1043 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1044
1045 .module_size_mbits = 32768,
1046 .num_ranks = 2,
1047 .device_width = 32,
1048 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1049
1050 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1051 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1052
1053 .part_num =
1054 { 'K', 'M', 'D', 'P', '6', '0', '0', '1', 'D', 'A', '-',
1055 'B', '4', '2', '5' },
1056};
1057
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001058const struct nonspd_mem_info samsung_lpddr4x_kmdv6001da_b620 = {
1059 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1060
1061 .module_size_mbits = 32768,
1062 .num_ranks = 2,
1063 .device_width = 32,
1064 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1065
1066 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1067 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1068
1069 .part_num =
1070 { 'K', 'M', 'D', 'V', '6', '0', '0', '1', 'D', 'A', '-',
1071 'B', '6', '2', '0' },
1072};
1073
1074const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4am_mgcj = {
1075 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1076
1077 .module_size_mbits = 32768,
1078 .num_ranks = 2,
1079 .device_width = 32,
1080 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1081
1082 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1083 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1084
1085 .part_num =
1086 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'M', '-',
1087 'M', 'G', 'C', 'J' },
1088};
1089
cherish8851df02019-09-01 14:35:55 +08001090const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcl = {
1091 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1092
1093 .module_size_mbits = 32768,
1094 .num_ranks = 2,
1095 .device_width = 32,
1096 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1097
1098 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1099 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1100
1101 .part_num =
1102 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
1103 'M', 'G', 'C', 'L' },
1104};
1105
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001106static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgch = {
1107 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1108
1109 .module_size_mbits = 8192,
1110 .num_ranks = 1,
1111 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001112 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001113
1114 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1115 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1116
1117 .part_num =
1118 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
1119 'M', 'G', 'C', 'H' },
1120};
1121
Kaka Ni9db5d8a2019-07-05 12:13:33 +08001122const struct nonspd_mem_info sandisk_lpddr4x_sdada4cr_128g = {
1123 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1124
1125 .module_size_mbits = 32768,
1126 .num_ranks = 2,
1127 .device_width = 32,
1128 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1129
1130 .module_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1131 .dram_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1132
1133 .part_num =
1134 { 'S', 'D', 'A', 'D', 'A', '4', 'C', 'R', '-', '1', '2',
1135 '8', 'G' },
1136};
1137
1138
Marco Chena18bbb22018-08-13 16:10:55 +08001139// This one is reserved for storing mem info from SMBIOS if no explicit entry
1140// was added above.
1141static struct nonspd_mem_info part_extracted_from_smbios = {
1142 .part_num =
1143 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
1144};
1145
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001146static const struct nonspd_mem_info *nospdmemory[] = {
1147 &elpida_lpddr3_edfa164a2ma_jd_f,
1148 &elpida_lpddr3_f8132a3ma_gd_f,
1149 &elpida_lpddr3_fa232a2ma_gc_f,
1150 &hynix_ddr3l_h5tc4g63afr_pba,
1151 &hynix_ddr3l_h5tc4g63cfr_pba,
Zheng Pan56c19e52018-10-23 17:01:11 -07001152 &hynix_ddr3l_h5tc4g63efr_rda,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001153 &hynix_lpddr3_h9ccnnn8gtmlar_nud,
Jack Rosenthal956a5b42020-05-06 14:26:32 -06001154 &hynix_lpddr3_h9ccnnn8jtblar_nud,
Milton Chiang5664fe32016-11-29 14:59:49 +08001155 &hynix_lpddr3_h9ccnnnbjtalar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001156 &hynix_lpddr3_h9ccnnnbjtmlar_nud,
Jack Rosenthal73a32f32020-05-07 08:24:48 -06001157 &hynix_lpddr3_h9ccnnncltmlar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001158 &hynix_ddr3l_h5tc8g63amr_pba,
1159 &hynix_lpddr3_h9ccnnnbptblbr_nud,
1160 &hynix_lpddr3_h9ccnnnbltblar_nud,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001161 &hynix_lpddr3_h9ccnnnbktmlbr_ntd,
Kevin Chiu55250dd2016-11-08 17:21:23 +08001162 &hynix_lpddr4_h9hcnnn8kumlhr,
1163 &hynix_lpddr4_h9hcnnnbpumlhr,
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +08001164 &hynix_lpddr4x_h9hcnnncpmalhr_nee,
Jack Rosenthal7bdaff92020-05-06 13:04:59 -06001165 &micron_lpddr3_mt52l256m32d1pf107,
Jack Rosenthal10611d32020-05-06 12:46:38 -06001166 &micron_lpddr3_mt52l256m32d1pf_10,
Marco Chena18bbb22018-08-13 16:10:55 +08001167 &micron_lpddr3_mt52l256m32d1pf_107wtb,
1168 &micron_lpddr3_mt52l256m64d2pp_107wtb,
1169 &micron_lpddr3_mt52l512m32d2pf_107wtb,
Jack Rosenthal1ca003d2020-05-07 09:04:54 -06001170 &micron_lpddr3_mt52l512m32d2pf_10,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001171 &micron_lpddr4_mt53b256m32d1np,
1172 &micron_lpddr4_mt53b512m32d2np,
ren kuoc9202c92018-05-14 19:46:20 +08001173 &micron_lpddr4_mt53e512m32d2np,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001174 &micron_lpddr4x_mt29vzzzad8dqksl,
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +08001175 &micron_lpddr4x_mt29vzzzad8gqfsl_046,
1176 &micron_lpddr4x_mt29vzzzbd9dqkpr_046,
Kaka Niae6ece42019-02-26 09:55:57 +08001177 &micron_lpddr4x_mt53e1g32d4nq_046wte,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001178 &micron_lpddr4x_mt53e1g32d2np_046wta,
1179 &micron_lpddr4x_mt53e2g32d4nq_046wta,
karen_wuc94b8d32020-07-16 14:54:14 +08001180 &micron_lpddr4x_mt53d1g32d4dt_046wtd,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001181 &micron_mt41k256m16ha,
Milton Chiang5664fe32016-11-29 14:59:49 +08001182 &micron_mt52l256m32d1pf,
1183 &micron_mt52l512m32d2pf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001184 &nanya_ddr3l_nt5cc256m16dp_di,
Zheng Pan56c19e52018-10-23 17:01:11 -07001185 &nanya_ddr3l_nt5cc256m16er_ek,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001186 &samsung_k4b4g1646d,
1187 &samsung_k4b4g1646e,
Zheng Pan56c19e52018-10-23 17:01:11 -07001188 &samsung_k4b4g1646e_byma,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001189 &samsung_ddr3l_k4b4g1646d_byk0,
1190 &samsung_ddr3l_k4b4g1646q_hyk0,
1191 &samsung_ddr3l_k4b8g1646q_myk0,
1192 &samsung_lpddr3_k3qf2f20em_agce,
1193 &samsung_lpddr3_k4e6e304eb_egce,
Jack Rosenthal6b99a832020-05-06 15:34:10 -06001194 &samsung_lpddr3_k4e6e304ec_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001195 &samsung_lpddr3_k4e6e304ee_egce,
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -06001196 &samsung_lpddr3_k4e6e304ee_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001197 &samsung_lpddr3_k4e6e304eb_egcf,
1198 &samsung_lpddr3_k4e8e304ed_egcc,
1199 &samsung_lpddr3_k4e8e304ee_egce,
1200 &samsung_lpddr3_k4e8e324eb_egcf,
Jack Rosenthal7f5861c2020-05-07 07:30:55 -06001201 &samsung_lpddr3_k4ebe304eb_egcf,
Philip Chencccc7042018-09-25 20:31:37 -07001202 &samsung_lpddr4_k3uh5h50mm_agcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001203 &samsung_lpddr4_k4f6e304hb_mgch,
1204 &samsung_lpddr4_k4f6e304hb_mgcj,
ren kuo500c9c62018-05-24 17:57:50 +08001205 &samsung_lpddr4_k4f6e3s4hm_mgcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001206 &samsung_lpddr4_k4f8e304hb_mgcj,
Kevin Chiucba66122020-07-14 20:08:52 +08001207 &samsung_lpddr4_k4f8e3s4hd_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001208 &samsung_lpddr4x_kmdh6001da_b422,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001209 &samsung_lpddr4x_kmdp6001da_b425,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001210 &samsung_lpddr4x_kmdv6001da_b620,
1211 &samsung_lpddr4x_k4ube3d4am_mgcj,
cherish8851df02019-09-01 14:35:55 +08001212 &samsung_lpddr4x_k4ube3d4aa_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001213 &sandisk_lpddr4x_sdada4cr_128g
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001214};
1215
Marco Chena18bbb22018-08-13 16:10:55 +08001216static int transfer_speed_from_smbios_to_nonspd_mem_info(
1217 struct smbios_table *table,
1218 struct nonspd_mem_info *info)
1219{
1220 for (int index = DDR_333; index < DDR_FREQ_MAX; index++) {
1221 if (table->data.mem_device.speed == atoi(ddr_freq_prettyprint[index])) {
1222 info->ddr_freq[0] = index;
1223 return 0;
1224 }
1225 }
1226
1227 lprintf(LOG_ERR, "%s: mem speed %hu in SMBIOS is out of range.",
1228 __func__, table->data.mem_device.speed);
1229 return -1;
1230}
1231
Jack Rosenthale279bb22020-05-15 17:46:55 -06001232static enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001233{
1234 switch (table->data.mem_device.type) {
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001235 case SMBIOS_MEMORY_TYPE_DDR3:
1236 return SPD_DRAM_TYPE_DDR3;
1237 case SMBIOS_MEMORY_TYPE_DDR4:
1238 return SPD_DRAM_TYPE_DDR4;
Paul Fagerburg1f3997c2019-05-17 09:31:29 -06001239 case SMBIOS_MEMORY_TYPE_LPDDR3:
1240 return SPD_DRAM_TYPE_LPDDR3;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001241 case SMBIOS_MEMORY_TYPE_LPDDR4:
1242 return SPD_DRAM_TYPE_LPDDR4;
1243 default:
1244 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
1245 __func__, table->data.mem_device.type);
1246 return 0;
1247 }
1248}
1249
Marco Chena18bbb22018-08-13 16:10:55 +08001250static int extract_mem_info_from_smbios(
1251 struct smbios_table *table,
1252 struct nonspd_mem_info *info)
1253{
1254 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +08001255 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +08001256 uint32_t size;
1257
Marco Chen05511cb2018-10-01 08:35:37 +08001258 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +08001259 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +08001260 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +08001261
1262 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +08001263 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +08001264 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
1265 "Or len of part number %lu is larger then buffer %lu."
1266 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +08001267 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +08001268 return -1;
1269 }
1270
1271 size = (table->data.mem_device.size & 0x7fff) * 8;
1272 info->module_size_mbits =
1273 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
1274
Marco Chen05511cb2018-10-01 08:35:37 +08001275 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001276
1277 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -08001278 info->num_ranks = table->data.mem_device.attributes & 0xf;
1279 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001280
Marco Chena18bbb22018-08-13 16:10:55 +08001281 return transfer_speed_from_smbios_to_nonspd_mem_info(table, info);
1282}
1283
Edward O'Callaghan36f667d2020-07-07 12:25:43 +10001284int spd_set_nonspd_info(struct platform_intf *intf, int dimm,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001285 const struct nonspd_mem_info **info)
1286{
Edward O'Callaghan36f667d2020-07-07 12:25:43 +10001287 int index;
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001288 struct smbios_table table;
1289
Jack Rosenthal248b3c62020-05-14 20:29:48 -06001290 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table) < 0) {
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001291 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n"
1292 , __func__);
1293 return -1;
1294 }
1295
1296 for (index = 0; index < ARRAY_SIZE(nospdmemory); index++) {
1297 if (!strncmp(table.string[table.data.mem_device.part_number],
Brian Norrisd7384fb2018-04-30 11:05:23 -07001298 (const char *)nospdmemory[index]->part_num,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001299 sizeof(nospdmemory[index]->part_num))) {
1300 *info = nospdmemory[index];
1301 break;
1302 }
1303 }
1304
Marco Chena18bbb22018-08-13 16:10:55 +08001305 if (index < ARRAY_SIZE(nospdmemory)) {
1306 return 0;
1307 }
1308
1309 // memory device from SMBIOS is mapped into a nonspd_mem_info.
1310 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios)) {
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001311 return -1;
1312 }
1313
Marco Chena18bbb22018-08-13 16:10:55 +08001314 *info = &part_extracted_from_smbios;
1315
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001316 return 0;
1317}