blob: 12c9e9a937cc6ebb3045a6d9168c45897c3bd4f9 [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
Eason Lina80ba0a2020-07-15 16:58:24 +0800338const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmmlxr_nee = {
339 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
340
341 .module_size_mbits = 32768,
342 .num_ranks = 2,
343 .device_width = 32,
344 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
345
346 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
347 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
348
349 .part_num =
350 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'M', 'L',
351 'X', 'R', '-', 'N', 'E', 'E'},
352};
353
Bob Moraguesd8e1a692021-01-10 05:28:36 +0000354const struct nonspd_mem_info hynix_lpddr4x_h9hcnnnfammlxr_nee = {
355 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
356
357 .module_size_mbits = 65536,
358 .num_ranks = 2,
359 .device_width = 32,
360 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
361
362 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
363 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
364
365 .part_num =
366 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'F', 'A', 'M', 'M', 'L',
367 'X', 'R', '-', 'N', 'E', 'E' },
368};
369
David Hendricks6638f872015-11-04 14:52:02 -0800370const struct nonspd_mem_info micron_mt41k256m16ha = {
371 .dram_type = SPD_DRAM_TYPE_DDR3,
372 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
373
374 .module_size_mbits = 4096,
375 .num_ranks = 1,
376 .device_width = 16,
377 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
378
379 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
380 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
381
David Hendricks6638f872015-11-04 14:52:02 -0800382 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
383 '1', '6', 'H', 'A', '-', '1', '2', '5' },
384};
385
Milton Chiang5664fe32016-11-29 14:59:49 +0800386const struct nonspd_mem_info micron_mt52l256m32d1pf = {
387 .dram_type = SPD_DRAM_TYPE_DDR3,
388 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
389
390 .module_size_mbits = 8192,
391 .num_ranks = 1,
392 .device_width = 32,
393 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
394
395 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
396 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
397
Milton Chiang5664fe32016-11-29 14:59:49 +0800398 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M',
399 '3', '2', 'D', '1', 'P', 'F', '-', '0', '9',
400 '3', 'W', 'T', ':', 'B' },
401};
402
403const struct nonspd_mem_info micron_mt52l512m32d2pf = {
404 .dram_type = SPD_DRAM_TYPE_DDR3,
405 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
406
407 .module_size_mbits = 16384,
408 .num_ranks = 2,
409 .device_width = 32,
410 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
411
412 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
413 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
414
Milton Chiang5664fe32016-11-29 14:59:49 +0800415 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M',
416 '3', '2', 'D', '2', 'P', 'F', '-', '0', '9',
417 '3', 'W', 'T', ':', 'B' },
418};
419
David Hendricks97303242015-11-11 14:41:40 -0800420const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
421 .dram_type = SPD_DRAM_TYPE_DDR3,
422 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
423
424 .module_size_mbits = 4096,
425 .num_ranks = 1,
426 .device_width = 16,
427 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
428 .ddr_freq = { DDR_667, DDR_800 },
429 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
430 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
431
David Hendricks97303242015-11-11 14:41:40 -0800432 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
433 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
434};
435
Zheng Pan56c19e52018-10-23 17:01:11 -0700436const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
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, DDR_933 },
444 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
445 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
446
Zheng Pan56c19e52018-10-23 17:01:11 -0700447 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
448 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
449};
450
Huanhuan Liu22e02562020-10-14 14:57:39 +0800451const struct nonspd_mem_info nanya_lpddr3_nt6cl512t32am_h0 = {
452 .dram_type = SPD_DRAM_TYPE_LPDDR3,
453 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
454
455 .module_size_mbits = 16384,
456 .num_ranks = 2,
457 .device_width = 32,
458 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
459 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
460 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
461
462 .part_num = { 'N', 'T', '6', 'C', 'L', '5', '1', '2',
463 'T', '3', '2', 'A', 'M', '-', 'H', '0' },
464};
465
David Hendricks6638f872015-11-04 14:52:02 -0800466const struct nonspd_mem_info samsung_k4b4g1646d = {
467 .dram_type = SPD_DRAM_TYPE_DDR3,
468 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
469
470 .module_size_mbits = 4096,
471 .num_ranks = 1,
472 .device_width = 16,
473 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
474
475 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
476 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
477
David Hendricks6638f872015-11-04 14:52:02 -0800478 .part_num =
479 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
480 '-', 'B', 'Y', 'K', '0' },
481};
482
483const struct nonspd_mem_info samsung_k4b4g1646e = {
484 .dram_type = SPD_DRAM_TYPE_DDR3,
485 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
486
487 .module_size_mbits = 4096,
488 .num_ranks = 1,
489 .device_width = 16,
490 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
491
492 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
493 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
494
David Hendricks6638f872015-11-04 14:52:02 -0800495 .part_num =
496 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
497 '-', 'B', 'Y', 'K', '0' },
498};
499
Zheng Pan56c19e52018-10-23 17:01:11 -0700500const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
501 .dram_type = SPD_DRAM_TYPE_DDR3,
502 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
503
504 .module_size_mbits = 4096,
505 .num_ranks = 1,
506 .device_width = 16,
507 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
508
509 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
510 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
511
Zheng Pan56c19e52018-10-23 17:01:11 -0700512 .part_num =
513 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
514 '-', 'B', 'Y', 'M', 'A' },
515};
516
David Hendricks0fa54152016-03-16 15:08:56 -0700517const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800518 .dram_type = SPD_DRAM_TYPE_DDR3,
519 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
520
521 .module_size_mbits = 4096,
522 .num_ranks = 1,
523 .device_width = 16,
524 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
525
526 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
527 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
528
David Hendricks6638f872015-11-04 14:52:02 -0800529 .part_num =
530 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
531 'B', 'Y', 'K', '0' },
532};
533
David Hendricks0fa54152016-03-16 15:08:56 -0700534const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800535 .dram_type = SPD_DRAM_TYPE_DDR3,
536 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
537
538 .module_size_mbits = 4096,
539 .num_ranks = 1,
540 .device_width = 16,
541 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
542
543 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
544 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
545
David Hendricks6638f872015-11-04 14:52:02 -0800546 .part_num =
547 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
548 'H', 'Y', 'K', '0' },
549};
550
David Hendricks0fa54152016-03-16 15:08:56 -0700551const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800552 .dram_type = SPD_DRAM_TYPE_DDR3,
553 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
554 .module_size_mbits = 8192,
555 .num_ranks = 2,
556 .device_width = 16,
557 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
558
559 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
560 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
561
David Hendricks6638f872015-11-04 14:52:02 -0800562 .part_num =
563 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
564 'M', 'Y', 'K', '0' },
565};
566
David Hendricks0fa54152016-03-16 15:08:56 -0700567const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800568 .dram_type = SPD_DRAM_TYPE_LPDDR3,
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_400, DDR_533, DDR_667, DDR_800 },
575
576 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
577 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
578
579 .part_num =
580 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
581 'A', 'G', 'C', 'E' },
582};
583
Vincent Palatin90af8e62016-05-20 12:12:49 -0700584const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
585 .dram_type = SPD_DRAM_TYPE_LPDDR3,
586 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
587
588 .module_size_mbits = 16384,
589 .num_ranks = 2,
590 .device_width = 32,
591 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
592
593 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
594 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
595
596 .part_num =
597 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
598 'E', 'G', 'C', 'E' },
599};
600
Jack Rosenthal6b99a832020-05-06 15:34:10 -0600601const struct nonspd_mem_info samsung_lpddr3_k4e6e304ec_egcf = {
602 .dram_type = SPD_DRAM_TYPE_LPDDR3,
603 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
604
605 .module_size_mbits = 4096 * 8,
606 .num_ranks = 2,
607 .device_width = 64,
608 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
609
610 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
611 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
612
613 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'C', '-',
614 'E', 'G', 'C', 'F' },
615};
616
David Hendricks0fa54152016-03-16 15:08:56 -0700617const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800618 .dram_type = SPD_DRAM_TYPE_LPDDR3,
619 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
620
621 .module_size_mbits = 16384,
622 .num_ranks = 2,
623 .device_width = 32,
624 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
625
626 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
627 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
628
629 .part_num =
630 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
631 'E', 'G', 'C', 'E' },
632};
633
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -0600634const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egcf = {
635 .dram_type = SPD_DRAM_TYPE_LPDDR3,
636 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
637
638 .module_size_mbits = 4096 * 8,
639 .num_ranks = 2,
640 .device_width = 64,
641 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
642
643 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
644 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
645
646 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
647 'E', 'G', 'C', 'F' },
648};
649
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800650const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
651 .dram_type = SPD_DRAM_TYPE_LPDDR3,
652 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
653
654 .module_size_mbits = 16384,
655 .num_ranks = 2,
656 .device_width = 32,
657 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
658
659 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
660 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
661
662 .part_num =
663 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
664 'E', 'G', 'C', 'F' },
665};
666
David Hendricks0fa54152016-03-16 15:08:56 -0700667const struct nonspd_mem_info samsung_lpddr3_k4e8e304ed_egcc = {
David Hendricks6638f872015-11-04 14:52:02 -0800668 .dram_type = SPD_DRAM_TYPE_DDR3,
669 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
670
671 .module_size_mbits = 8192,
672 .num_ranks = 2,
673 .device_width = 32,
674 .ddr_freq = { DDR_533 },
675
676 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
677 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
678
David Hendricks6638f872015-11-04 14:52:02 -0800679 .part_num =
680 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'D', '-',
681 'E', 'G', 'C', 'C' },
682};
683
David Hendricks0fa54152016-03-16 15:08:56 -0700684const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800685 .dram_type = SPD_DRAM_TYPE_LPDDR3,
686 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
687
688 .module_size_mbits = 8192,
689 .num_ranks = 2,
690 .device_width = 32,
691 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
692
693 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
694 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
695
696 .part_num =
697 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
698 'E', 'G', 'C', 'E' },
699};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700700
701const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
702 .dram_type = SPD_DRAM_TYPE_LPDDR3,
703 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
704
705 .module_size_mbits = 8192,
706 .num_ranks = 2,
707 .device_width = 32,
708 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
709
710 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
711 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
712
713 .part_num =
714 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
715 'E', 'G', 'C', 'F' },
716};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700717
Jack Rosenthal7f5861c2020-05-07 07:30:55 -0600718const struct nonspd_mem_info samsung_lpddr3_k4ebe304eb_egcf = {
719 .dram_type = SPD_DRAM_TYPE_LPDDR3,
720 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
721
722 .module_size_mbits = 8192 * 8,
723 .num_ranks = 2,
724 .device_width = 64,
725 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
726
727 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
728 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
729
730 .part_num = { 'K', '4', 'E', 'B', 'E', '3', '0', '4', 'E', 'B', '-',
731 'E', 'G', 'C', 'F' },
732};
733
Huanhuan Liu22e02562020-10-14 14:57:39 +0800734const struct nonspd_mem_info samsung_lpddr3_k4e6e304ed_egcg = {
735 .dram_type = SPD_DRAM_TYPE_LPDDR3,
736 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
737
738 .module_size_mbits = 16384,
739 .num_ranks = 2,
740 .device_width = 32,
741 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
742
743 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
744 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
745
746 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'D', '-',
747 'E', 'G', 'C', 'G' },
748};
749
Loop Wue0fa3212016-12-01 16:25:41 +0800750const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
751 .dram_type = SPD_DRAM_TYPE_LPDDR3,
752 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
753
754 .module_size_mbits = 8192,
755 .num_ranks = 1,
756 .device_width = 32,
757 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
758
759 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
760 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
761
762 .part_num =
763 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
764 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
765};
766
Jack Rosenthal7bdaff92020-05-06 13:04:59 -0600767const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf107 = {
768 .dram_type = SPD_DRAM_TYPE_LPDDR3,
769 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
770
771 .module_size_mbits = 2048 * 8,
772 .num_ranks = 1,
773 .device_width = 64,
774 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
775
776 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
777 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
778
779 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
780 'D', '1', 'P', 'F', '1', '0', '7' },
781};
782
Jack Rosenthal10611d32020-05-06 12:46:38 -0600783const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_10 = {
784 .dram_type = SPD_DRAM_TYPE_LPDDR3,
785 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
786
787 .module_size_mbits = 2048 * 8,
788 .num_ranks = 1,
789 .device_width = 64,
790 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
791
792 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
793 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
794
795 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
796 'D', '1', 'P', 'F', '-', '1', '0' },
797};
798
jiazi Yang5e3d5942017-04-05 22:30:45 -0400799const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_107wtb = {
800 .dram_type = SPD_DRAM_TYPE_LPDDR3,
801 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
802
803 .module_size_mbits = 8192,
804 .num_ranks = 1,
805 .device_width = 32,
806 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
807
808 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
809 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
810
811 .part_num =
812 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
813 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
814};
815
Loop Wue0fa3212016-12-01 16:25:41 +0800816const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
817 .dram_type = SPD_DRAM_TYPE_LPDDR3,
818 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
819
820 .module_size_mbits = 16384,
821 .num_ranks = 2,
822 .device_width = 32,
823 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
824
825 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
826 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
827
828 .part_num =
829 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
830 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
831};
832
Jack Rosenthal1ca003d2020-05-07 09:04:54 -0600833const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_10 = {
834 .dram_type = SPD_DRAM_TYPE_LPDDR3,
835 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
836
837 .module_size_mbits = 4096 * 8,
838 .num_ranks = 2,
839 .device_width = 64,
840 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
841
842 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
843 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
844
845 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2',
846 'D', '2', 'P', 'F', '-', '1', '0' },
847};
848
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700849static const struct nonspd_mem_info micron_lpddr4_mt53b256m32d1np = {
850 .dram_type = SPD_DRAM_TYPE_LPDDR4,
851
852 .module_size_mbits = 8192,
853 .num_ranks = 1,
854 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700855 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700856
857 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
858 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
859
860 .part_num =
861 { 'M', 'T', '5', '3', 'B', '2', '5', '6', 'M', '3', '2', 'D',
862 '1', 'N', 'P'},
863};
864
865static const struct nonspd_mem_info micron_lpddr4_mt53b512m32d2np = {
866 .dram_type = SPD_DRAM_TYPE_LPDDR4,
867
868 .module_size_mbits = 16384,
869 .num_ranks = 2,
870 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700871 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700872
873 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
874 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
875
876 .part_num =
877 { 'M', 'T', '5', '3', 'B', '5', '1', '2', 'M', '3', '2', 'D',
878 '2', 'N', 'P'},
879};
880
ren kuoc9202c92018-05-14 19:46:20 +0800881static const struct nonspd_mem_info micron_lpddr4_mt53e512m32d2np = {
882 .dram_type = SPD_DRAM_TYPE_LPDDR4,
883
884 .module_size_mbits = 16384,
885 .num_ranks = 2,
886 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700887 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuoc9202c92018-05-14 19:46:20 +0800888
889 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
890 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
891
892 .part_num =
893 { 'M', 'T', '5', '3', 'E', '5', '1', '2', 'M', '3', '2', 'D',
894 '2', 'N', 'P'},
895};
896
Kaka Niae6ece42019-02-26 09:55:57 +0800897const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
898 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
899
900 .module_size_mbits = 32768,
901 .num_ranks = 2,
902 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700903 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Kaka Niae6ece42019-02-26 09:55:57 +0800904
905 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
906 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
907
908 .part_num =
909 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '4', 'N',
910 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
911};
912
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700913const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d2np_046wta = {
914 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
915
916 .module_size_mbits = 32768,
917 .num_ranks = 1,
918 .device_width = 32,
919 .ddr_freq = { DDR_2133 },
920
921 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
922 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
923
924 .part_num =
925 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '2', 'N',
926 'P', '-', '4', '6', 'W', 'T', ':', 'A'},
927};
928
929const struct nonspd_mem_info micron_lpddr4x_mt53e2g32d4nq_046wta = {
930 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
931
Paul Huang2fe53be2020-11-17 14:02:55 +0800932 .module_size_mbits = 65536,
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700933 .num_ranks = 2,
934 .device_width = 32,
935 .ddr_freq = { DDR_2133 },
936
937 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
938 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
939
940 .part_num =
941 { 'M', 'T', '5', '3', 'E', '2', 'G', '3', '2', 'D', '4', 'N',
942 'Q', '-', '4', '6', 'W', 'T', ':', 'A'},
943};
944
karen_wuc94b8d32020-07-16 14:54:14 +0800945const struct nonspd_mem_info micron_lpddr4x_mt53d1g32d4dt_046wtd = {
946 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
947
948 .module_size_mbits = 32768,
949 .num_ranks = 2,
950 .device_width = 32,
951 .ddr_freq = { DDR_2133 },
952
953 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
954 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
955
956 .part_num =
957 { 'M', 'T', '5', '3', 'D', '1', 'G', '3', '2', 'D', '4', 'D',
958 'T', '-', '4', '6', 'W', 'T', ':', 'D'},
959};
960
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800961const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8dqksl = {
962 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
963
964 .module_size_mbits = 32768,
965 .num_ranks = 2,
966 .device_width = 32,
967 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
968
969 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
970 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
971
972 .part_num =
973 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'D',
974 'Q', 'K', 'S', 'L'},
975};
976
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +0800977const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8gqfsl_046 = {
978 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
979
980 .module_size_mbits = 32768,
981 .num_ranks = 2,
982 .device_width = 32,
983 .ddr_freq = { DDR_2133 },
984
985 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
986 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
987
988 .part_num =
989 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'G',
990 'Q', 'F', 'S', 'L', '-', '0', '4', '6'},
991};
992
993const struct nonspd_mem_info micron_lpddr4x_mt29vzzzbd9dqkpr_046 = {
994 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
995
996 .module_size_mbits = 32768,
997 .num_ranks = 2,
998 .device_width = 32,
999 .ddr_freq = { DDR_2133 },
1000
1001 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
1002 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
1003
1004 .part_num =
1005 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'B', 'D', '9', 'D',
1006 'Q', 'K', 'P', 'R', '-', '0', '4', '6'},
1007};
1008
Philip Chencccc7042018-09-25 20:31:37 -07001009const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
1010 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1011
1012 .module_size_mbits = 32768,
1013 .num_ranks = 2,
1014 .device_width = 32,
1015 .ddr_freq = { DDR_1355 },
1016
1017 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1018 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1019
1020 .part_num =
1021 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
1022 'A', 'G', 'C', 'J' },
1023};
1024
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001025static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgcj = {
1026 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1027
1028 .module_size_mbits = 16384,
1029 .num_ranks = 2,
1030 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001031 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001032
1033 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1034 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1035
1036 .part_num =
1037 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
1038 'M', 'G', 'C', 'J' },
1039};
1040
ren kuo500c9c62018-05-24 17:57:50 +08001041static const struct nonspd_mem_info samsung_lpddr4_k4f6e3s4hm_mgcj = {
1042 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1043
1044 .module_size_mbits = 16384,
1045 .num_ranks = 1,
1046 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001047 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuo500c9c62018-05-24 17:57:50 +08001048
1049 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1050 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1051
1052 .part_num =
1053 { 'K', '4', 'F', '6', 'E', '3', 'S', '4', 'H', 'M', '-',
1054 'M', 'G', 'C', 'J' },
1055};
1056
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001057static const struct nonspd_mem_info samsung_lpddr4_k4f8e304hb_mgcj = {
1058 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1059
1060 .module_size_mbits = 8192,
1061 .num_ranks = 1,
1062 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001063 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001064
1065 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1066 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1067
1068 .part_num =
1069 { 'K', '4', 'F', '8', 'E', '3', '0', '4', 'H', 'B', '-',
1070 'M', 'G', 'C', 'J' },
1071};
1072
Kevin Chiucba66122020-07-14 20:08:52 +08001073static const struct nonspd_mem_info samsung_lpddr4_k4f8e3s4hd_mgcl = {
1074 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1075
1076 .module_size_mbits = 8192,
1077 .num_ranks = 1,
1078 .device_width = 32,
1079 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1080
1081 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1082 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1083
1084 .part_num =
1085 { 'K', '4', 'F', '8', 'E', '3', 'S', '4', 'H', 'D', '-',
1086 'M', 'G', 'C', 'L' },
1087};
1088
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001089const struct nonspd_mem_info samsung_lpddr4x_kmdh6001da_b422 = {
1090 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1091
1092 .module_size_mbits = 32768,
1093 .num_ranks = 2,
1094 .device_width = 32,
1095 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1096
1097 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1098 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1099
1100 .part_num =
1101 { 'K', 'M', 'D', 'H', '6', '0', '0', '1', 'D', 'A', '-',
1102 'B', '4', '2', '2' },
1103};
1104
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001105const struct nonspd_mem_info samsung_lpddr4x_kmdp6001da_b425 = {
1106 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1107
1108 .module_size_mbits = 32768,
1109 .num_ranks = 2,
1110 .device_width = 32,
1111 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1112
1113 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1114 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1115
1116 .part_num =
1117 { 'K', 'M', 'D', 'P', '6', '0', '0', '1', 'D', 'A', '-',
1118 'B', '4', '2', '5' },
1119};
1120
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001121const struct nonspd_mem_info samsung_lpddr4x_kmdv6001da_b620 = {
1122 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1123
1124 .module_size_mbits = 32768,
1125 .num_ranks = 2,
1126 .device_width = 32,
1127 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1128
1129 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1130 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1131
1132 .part_num =
1133 { 'K', 'M', 'D', 'V', '6', '0', '0', '1', 'D', 'A', '-',
1134 'B', '6', '2', '0' },
1135};
1136
1137const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4am_mgcj = {
1138 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1139
1140 .module_size_mbits = 32768,
1141 .num_ranks = 2,
1142 .device_width = 32,
1143 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1144
1145 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1146 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1147
1148 .part_num =
1149 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'M', '-',
1150 'M', 'G', 'C', 'J' },
1151};
1152
cherish8851df02019-09-01 14:35:55 +08001153const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcl = {
1154 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1155
1156 .module_size_mbits = 32768,
1157 .num_ranks = 2,
1158 .device_width = 32,
1159 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1160
1161 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1162 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1163
1164 .part_num =
1165 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
1166 'M', 'G', 'C', 'L' },
1167};
1168
Chia-Hsiu Chang065a3c42020-08-27 19:08:13 +08001169const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcr = {
1170 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1171
1172 .module_size_mbits = 32768,
1173 .num_ranks = 2,
1174 .device_width = 32,
1175 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1176
1177 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1178 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1179
1180 .part_num =
1181 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
1182 'M', 'G', 'C', 'R' },
1183};
1184
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001185static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgch = {
1186 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1187
1188 .module_size_mbits = 8192,
1189 .num_ranks = 1,
1190 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001191 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001192
1193 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1194 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1195
1196 .part_num =
1197 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
1198 'M', 'G', 'C', 'H' },
1199};
1200
Kaka Ni9db5d8a2019-07-05 12:13:33 +08001201const struct nonspd_mem_info sandisk_lpddr4x_sdada4cr_128g = {
1202 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1203
1204 .module_size_mbits = 32768,
1205 .num_ranks = 2,
1206 .device_width = 32,
1207 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1208
1209 .module_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1210 .dram_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1211
1212 .part_num =
1213 { 'S', 'D', 'A', 'D', 'A', '4', 'C', 'R', '-', '1', '2',
1214 '8', 'G' },
1215};
1216
1217
Marco Chena18bbb22018-08-13 16:10:55 +08001218// This one is reserved for storing mem info from SMBIOS if no explicit entry
1219// was added above.
1220static struct nonspd_mem_info part_extracted_from_smbios = {
1221 .part_num =
1222 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
1223};
1224
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001225static const struct nonspd_mem_info *nospdmemory[] = {
1226 &elpida_lpddr3_edfa164a2ma_jd_f,
1227 &elpida_lpddr3_f8132a3ma_gd_f,
1228 &elpida_lpddr3_fa232a2ma_gc_f,
1229 &hynix_ddr3l_h5tc4g63afr_pba,
1230 &hynix_ddr3l_h5tc4g63cfr_pba,
Zheng Pan56c19e52018-10-23 17:01:11 -07001231 &hynix_ddr3l_h5tc4g63efr_rda,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001232 &hynix_lpddr3_h9ccnnn8gtmlar_nud,
Jack Rosenthal956a5b42020-05-06 14:26:32 -06001233 &hynix_lpddr3_h9ccnnn8jtblar_nud,
Milton Chiang5664fe32016-11-29 14:59:49 +08001234 &hynix_lpddr3_h9ccnnnbjtalar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001235 &hynix_lpddr3_h9ccnnnbjtmlar_nud,
Jack Rosenthal73a32f32020-05-07 08:24:48 -06001236 &hynix_lpddr3_h9ccnnncltmlar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001237 &hynix_ddr3l_h5tc8g63amr_pba,
1238 &hynix_lpddr3_h9ccnnnbptblbr_nud,
1239 &hynix_lpddr3_h9ccnnnbltblar_nud,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001240 &hynix_lpddr3_h9ccnnnbktmlbr_ntd,
Kevin Chiu55250dd2016-11-08 17:21:23 +08001241 &hynix_lpddr4_h9hcnnn8kumlhr,
1242 &hynix_lpddr4_h9hcnnnbpumlhr,
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +08001243 &hynix_lpddr4x_h9hcnnncpmalhr_nee,
Eason Lina80ba0a2020-07-15 16:58:24 +08001244 &hynix_lpddr4x_h9hcnnncpmmlxr_nee,
Jack Rosenthal7bdaff92020-05-06 13:04:59 -06001245 &micron_lpddr3_mt52l256m32d1pf107,
Jack Rosenthal10611d32020-05-06 12:46:38 -06001246 &micron_lpddr3_mt52l256m32d1pf_10,
Marco Chena18bbb22018-08-13 16:10:55 +08001247 &micron_lpddr3_mt52l256m32d1pf_107wtb,
1248 &micron_lpddr3_mt52l256m64d2pp_107wtb,
1249 &micron_lpddr3_mt52l512m32d2pf_107wtb,
Jack Rosenthal1ca003d2020-05-07 09:04:54 -06001250 &micron_lpddr3_mt52l512m32d2pf_10,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001251 &micron_lpddr4_mt53b256m32d1np,
1252 &micron_lpddr4_mt53b512m32d2np,
ren kuoc9202c92018-05-14 19:46:20 +08001253 &micron_lpddr4_mt53e512m32d2np,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001254 &micron_lpddr4x_mt29vzzzad8dqksl,
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +08001255 &micron_lpddr4x_mt29vzzzad8gqfsl_046,
1256 &micron_lpddr4x_mt29vzzzbd9dqkpr_046,
Kaka Niae6ece42019-02-26 09:55:57 +08001257 &micron_lpddr4x_mt53e1g32d4nq_046wte,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001258 &micron_lpddr4x_mt53e1g32d2np_046wta,
1259 &micron_lpddr4x_mt53e2g32d4nq_046wta,
karen_wuc94b8d32020-07-16 14:54:14 +08001260 &micron_lpddr4x_mt53d1g32d4dt_046wtd,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001261 &micron_mt41k256m16ha,
Milton Chiang5664fe32016-11-29 14:59:49 +08001262 &micron_mt52l256m32d1pf,
1263 &micron_mt52l512m32d2pf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001264 &nanya_ddr3l_nt5cc256m16dp_di,
Zheng Pan56c19e52018-10-23 17:01:11 -07001265 &nanya_ddr3l_nt5cc256m16er_ek,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001266 &samsung_k4b4g1646d,
1267 &samsung_k4b4g1646e,
Zheng Pan56c19e52018-10-23 17:01:11 -07001268 &samsung_k4b4g1646e_byma,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001269 &samsung_ddr3l_k4b4g1646d_byk0,
1270 &samsung_ddr3l_k4b4g1646q_hyk0,
1271 &samsung_ddr3l_k4b8g1646q_myk0,
1272 &samsung_lpddr3_k3qf2f20em_agce,
1273 &samsung_lpddr3_k4e6e304eb_egce,
Jack Rosenthal6b99a832020-05-06 15:34:10 -06001274 &samsung_lpddr3_k4e6e304ec_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001275 &samsung_lpddr3_k4e6e304ee_egce,
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -06001276 &samsung_lpddr3_k4e6e304ee_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001277 &samsung_lpddr3_k4e6e304eb_egcf,
1278 &samsung_lpddr3_k4e8e304ed_egcc,
1279 &samsung_lpddr3_k4e8e304ee_egce,
1280 &samsung_lpddr3_k4e8e324eb_egcf,
Jack Rosenthal7f5861c2020-05-07 07:30:55 -06001281 &samsung_lpddr3_k4ebe304eb_egcf,
Philip Chencccc7042018-09-25 20:31:37 -07001282 &samsung_lpddr4_k3uh5h50mm_agcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001283 &samsung_lpddr4_k4f6e304hb_mgch,
1284 &samsung_lpddr4_k4f6e304hb_mgcj,
ren kuo500c9c62018-05-24 17:57:50 +08001285 &samsung_lpddr4_k4f6e3s4hm_mgcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001286 &samsung_lpddr4_k4f8e304hb_mgcj,
Kevin Chiucba66122020-07-14 20:08:52 +08001287 &samsung_lpddr4_k4f8e3s4hd_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001288 &samsung_lpddr4x_kmdh6001da_b422,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001289 &samsung_lpddr4x_kmdp6001da_b425,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001290 &samsung_lpddr4x_kmdv6001da_b620,
1291 &samsung_lpddr4x_k4ube3d4am_mgcj,
cherish8851df02019-09-01 14:35:55 +08001292 &samsung_lpddr4x_k4ube3d4aa_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001293 &sandisk_lpddr4x_sdada4cr_128g
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001294};
1295
Marco Chena18bbb22018-08-13 16:10:55 +08001296static int transfer_speed_from_smbios_to_nonspd_mem_info(
1297 struct smbios_table *table,
1298 struct nonspd_mem_info *info)
1299{
Rob Barnes06e01462020-09-16 15:04:44 -06001300 uint32_t expected_speed;
1301
Marco Chena18bbb22018-08-13 16:10:55 +08001302 for (int index = DDR_333; index < DDR_FREQ_MAX; index++) {
Rob Barnes06e01462020-09-16 15:04:44 -06001303 expected_speed = strtoul(ddr_freq_prettyprint[index], NULL, 10);
1304 if (table->data.mem_device.speed >= expected_speed - 1 &&
1305 table->data.mem_device.speed <= expected_speed + 1) {
Marco Chena18bbb22018-08-13 16:10:55 +08001306 info->ddr_freq[0] = index;
1307 return 0;
1308 }
1309 }
1310
1311 lprintf(LOG_ERR, "%s: mem speed %hu in SMBIOS is out of range.",
1312 __func__, table->data.mem_device.speed);
1313 return -1;
1314}
1315
Jack Rosenthale279bb22020-05-15 17:46:55 -06001316static enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001317{
Jack Rosenthal0eec1a52021-01-12 13:40:07 -07001318 char *part_number = table->string[table->data.mem_device.part_number];
1319 static const struct {
1320 enum spd_dram_type type;
1321 const char *prefix;
1322 } part_number_matches[] = {
1323 /* Hynix */
1324 { SPD_DRAM_TYPE_DDR3, "h5t" },
1325 { SPD_DRAM_TYPE_LPDDR3, "h9c" },
1326 { SPD_DRAM_TYPE_LPDDR4, "h9h" },
1327
1328 /* Samsung */
1329 { SPD_DRAM_TYPE_DDR3, "k4b" },
1330 { SPD_DRAM_TYPE_LPDDR3, "k3q" },
1331 { SPD_DRAM_TYPE_LPDDR3, "k4e" },
1332 { SPD_DRAM_TYPE_LPDDR4, "k3u" },
1333 { SPD_DRAM_TYPE_LPDDR4, "k4f" },
1334
1335 /* Micron */
1336 { SPD_DRAM_TYPE_DDR4, "mt40" },
1337 { SPD_DRAM_TYPE_DDR3, "mt41" },
1338 { SPD_DRAM_TYPE_LPDDR3, "mt52" },
1339 { SPD_DRAM_TYPE_LPDDR4, "mt53" },
1340 };
1341
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001342 switch (table->data.mem_device.type) {
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001343 case SMBIOS_MEMORY_TYPE_DDR3:
1344 return SPD_DRAM_TYPE_DDR3;
1345 case SMBIOS_MEMORY_TYPE_DDR4:
1346 return SPD_DRAM_TYPE_DDR4;
Paul Fagerburg1f3997c2019-05-17 09:31:29 -06001347 case SMBIOS_MEMORY_TYPE_LPDDR3:
1348 return SPD_DRAM_TYPE_LPDDR3;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001349 case SMBIOS_MEMORY_TYPE_LPDDR4:
1350 return SPD_DRAM_TYPE_LPDDR4;
Jack Rosenthal0eec1a52021-01-12 13:40:07 -07001351 case SMBIOS_MEMORY_TYPE_UNKNOWN:
1352 /* Do our best to figure it out from part numbers */
1353 for (size_t i = 0; i < ARRAY_SIZE(part_number_matches); i++) {
1354 if (!strncasecmp(part_number,
1355 part_number_matches[i].prefix,
1356 strlen(part_number_matches[i].prefix)))
1357 return part_number_matches[i].type;
1358 }
1359
1360 /* Fall thru */
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001361 default:
1362 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
1363 __func__, table->data.mem_device.type);
1364 return 0;
1365 }
1366}
1367
Marco Chena18bbb22018-08-13 16:10:55 +08001368static int extract_mem_info_from_smbios(
1369 struct smbios_table *table,
1370 struct nonspd_mem_info *info)
1371{
1372 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +08001373 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +08001374 uint32_t size;
1375
Marco Chen05511cb2018-10-01 08:35:37 +08001376 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +08001377 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +08001378 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +08001379
1380 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +08001381 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +08001382 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
1383 "Or len of part number %lu is larger then buffer %lu."
1384 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +08001385 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +08001386 return -1;
1387 }
1388
1389 size = (table->data.mem_device.size & 0x7fff) * 8;
1390 info->module_size_mbits =
1391 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
1392
Marco Chen05511cb2018-10-01 08:35:37 +08001393 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001394
1395 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -08001396 info->num_ranks = table->data.mem_device.attributes & 0xf;
1397 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001398
Marco Chena18bbb22018-08-13 16:10:55 +08001399 return transfer_speed_from_smbios_to_nonspd_mem_info(table, info);
1400}
1401
Nick Vaccaroc287faf2020-09-15 13:35:52 -07001402int spd_set_nonspd_info_from_smbios(struct platform_intf *intf, int dimm,
1403 const struct nonspd_mem_info **info)
1404{
1405 struct smbios_table table;
1406
1407 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table) < 0) {
1408 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n",
1409 __func__);
1410 return -1;
1411 }
1412
1413 /* memory device from SMBIOS is mapped into a nonspd_mem_info */
1414 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios))
1415 return -1;
1416
1417 *info = &part_extracted_from_smbios;
1418
1419 return 0;
1420}
1421
Edward O'Callaghan36f667d2020-07-07 12:25:43 +10001422int spd_set_nonspd_info(struct platform_intf *intf, int dimm,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001423 const struct nonspd_mem_info **info)
1424{
Edward O'Callaghan36f667d2020-07-07 12:25:43 +10001425 int index;
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001426 struct smbios_table table;
1427
Jack Rosenthal248b3c62020-05-14 20:29:48 -06001428 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table) < 0) {
Nick Vaccaroc287faf2020-09-15 13:35:52 -07001429 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n",
1430 __func__);
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001431 return -1;
1432 }
1433
1434 for (index = 0; index < ARRAY_SIZE(nospdmemory); index++) {
1435 if (!strncmp(table.string[table.data.mem_device.part_number],
Brian Norrisd7384fb2018-04-30 11:05:23 -07001436 (const char *)nospdmemory[index]->part_num,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001437 sizeof(nospdmemory[index]->part_num))) {
1438 *info = nospdmemory[index];
1439 break;
1440 }
1441 }
1442
Marco Chena18bbb22018-08-13 16:10:55 +08001443 if (index < ARRAY_SIZE(nospdmemory)) {
1444 return 0;
1445 }
1446
Nick Vaccaroc287faf2020-09-15 13:35:52 -07001447 /* memory device from SMBIOS is mapped into a nonspd_mem_info */
Marco Chena18bbb22018-08-13 16:10:55 +08001448 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios)) {
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001449 return -1;
1450 }
1451
Marco Chena18bbb22018-08-13 16:10:55 +08001452 *info = &part_extracted_from_smbios;
1453
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001454 return 0;
1455}