blob: fdb467662b94be79cf9c7e8df34bebbddb40fc5e [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
David Hendricks6638f872015-11-04 14:52:02 -0800354const struct nonspd_mem_info micron_mt41k256m16ha = {
355 .dram_type = SPD_DRAM_TYPE_DDR3,
356 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
357
358 .module_size_mbits = 4096,
359 .num_ranks = 1,
360 .device_width = 16,
361 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
362
363 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
364 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
365
David Hendricks6638f872015-11-04 14:52:02 -0800366 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
367 '1', '6', 'H', 'A', '-', '1', '2', '5' },
368};
369
Milton Chiang5664fe32016-11-29 14:59:49 +0800370const struct nonspd_mem_info micron_mt52l256m32d1pf = {
371 .dram_type = SPD_DRAM_TYPE_DDR3,
372 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
373
374 .module_size_mbits = 8192,
375 .num_ranks = 1,
376 .device_width = 32,
377 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
378
379 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
380 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
381
Milton Chiang5664fe32016-11-29 14:59:49 +0800382 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M',
383 '3', '2', 'D', '1', 'P', 'F', '-', '0', '9',
384 '3', 'W', 'T', ':', 'B' },
385};
386
387const struct nonspd_mem_info micron_mt52l512m32d2pf = {
388 .dram_type = SPD_DRAM_TYPE_DDR3,
389 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
390
391 .module_size_mbits = 16384,
392 .num_ranks = 2,
393 .device_width = 32,
394 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
395
396 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
397 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
398
Milton Chiang5664fe32016-11-29 14:59:49 +0800399 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M',
400 '3', '2', 'D', '2', 'P', 'F', '-', '0', '9',
401 '3', 'W', 'T', ':', 'B' },
402};
403
David Hendricks97303242015-11-11 14:41:40 -0800404const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
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 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
412 .ddr_freq = { DDR_667, DDR_800 },
413 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
414 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
415
David Hendricks97303242015-11-11 14:41:40 -0800416 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
417 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
418};
419
Zheng Pan56c19e52018-10-23 17:01:11 -0700420const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
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 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
428 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
429 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
430
Zheng Pan56c19e52018-10-23 17:01:11 -0700431 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
432 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
433};
434
Huanhuan Liu22e02562020-10-14 14:57:39 +0800435const struct nonspd_mem_info nanya_lpddr3_nt6cl512t32am_h0 = {
436 .dram_type = SPD_DRAM_TYPE_LPDDR3,
437 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
438
439 .module_size_mbits = 16384,
440 .num_ranks = 2,
441 .device_width = 32,
442 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
443 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
444 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
445
446 .part_num = { 'N', 'T', '6', 'C', 'L', '5', '1', '2',
447 'T', '3', '2', 'A', 'M', '-', 'H', '0' },
448};
449
David Hendricks6638f872015-11-04 14:52:02 -0800450const struct nonspd_mem_info samsung_k4b4g1646d = {
451 .dram_type = SPD_DRAM_TYPE_DDR3,
452 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
453
454 .module_size_mbits = 4096,
455 .num_ranks = 1,
456 .device_width = 16,
457 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
458
459 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
460 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
461
David Hendricks6638f872015-11-04 14:52:02 -0800462 .part_num =
463 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
464 '-', 'B', 'Y', 'K', '0' },
465};
466
467const struct nonspd_mem_info samsung_k4b4g1646e = {
468 .dram_type = SPD_DRAM_TYPE_DDR3,
469 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
470
471 .module_size_mbits = 4096,
472 .num_ranks = 1,
473 .device_width = 16,
474 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
475
476 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
477 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
478
David Hendricks6638f872015-11-04 14:52:02 -0800479 .part_num =
480 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
481 '-', 'B', 'Y', 'K', '0' },
482};
483
Zheng Pan56c19e52018-10-23 17:01:11 -0700484const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
485 .dram_type = SPD_DRAM_TYPE_DDR3,
486 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
487
488 .module_size_mbits = 4096,
489 .num_ranks = 1,
490 .device_width = 16,
491 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
492
493 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
494 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
495
Zheng Pan56c19e52018-10-23 17:01:11 -0700496 .part_num =
497 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
498 '-', 'B', 'Y', 'M', 'A' },
499};
500
David Hendricks0fa54152016-03-16 15:08:56 -0700501const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800502 .dram_type = SPD_DRAM_TYPE_DDR3,
503 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
504
505 .module_size_mbits = 4096,
506 .num_ranks = 1,
507 .device_width = 16,
508 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
509
510 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
511 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
512
David Hendricks6638f872015-11-04 14:52:02 -0800513 .part_num =
514 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
515 'B', 'Y', 'K', '0' },
516};
517
David Hendricks0fa54152016-03-16 15:08:56 -0700518const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800519 .dram_type = SPD_DRAM_TYPE_DDR3,
520 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
521
522 .module_size_mbits = 4096,
523 .num_ranks = 1,
524 .device_width = 16,
525 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
526
527 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
528 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
529
David Hendricks6638f872015-11-04 14:52:02 -0800530 .part_num =
531 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
532 'H', 'Y', 'K', '0' },
533};
534
David Hendricks0fa54152016-03-16 15:08:56 -0700535const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800536 .dram_type = SPD_DRAM_TYPE_DDR3,
537 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
538 .module_size_mbits = 8192,
539 .num_ranks = 2,
540 .device_width = 16,
541 .ddr_freq = { DDR_333, 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', '8', 'G', '1', '6', '4', '6', 'Q', '-',
548 'M', 'Y', 'K', '0' },
549};
550
David Hendricks0fa54152016-03-16 15:08:56 -0700551const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800552 .dram_type = SPD_DRAM_TYPE_LPDDR3,
553 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
554
555 .module_size_mbits = 8192,
556 .num_ranks = 2,
557 .device_width = 32,
558 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
559
560 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
561 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
562
563 .part_num =
564 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
565 'A', 'G', 'C', 'E' },
566};
567
Vincent Palatin90af8e62016-05-20 12:12:49 -0700568const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
569 .dram_type = SPD_DRAM_TYPE_LPDDR3,
570 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
571
572 .module_size_mbits = 16384,
573 .num_ranks = 2,
574 .device_width = 32,
575 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
576
577 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
578 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
579
580 .part_num =
581 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
582 'E', 'G', 'C', 'E' },
583};
584
Jack Rosenthal6b99a832020-05-06 15:34:10 -0600585const struct nonspd_mem_info samsung_lpddr3_k4e6e304ec_egcf = {
586 .dram_type = SPD_DRAM_TYPE_LPDDR3,
587 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
588
589 .module_size_mbits = 4096 * 8,
590 .num_ranks = 2,
591 .device_width = 64,
592 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
593
594 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
595 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
596
597 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'C', '-',
598 'E', 'G', 'C', 'F' },
599};
600
David Hendricks0fa54152016-03-16 15:08:56 -0700601const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800602 .dram_type = SPD_DRAM_TYPE_LPDDR3,
603 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
604
605 .module_size_mbits = 16384,
606 .num_ranks = 2,
607 .device_width = 32,
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 =
614 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
615 'E', 'G', 'C', 'E' },
616};
617
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -0600618const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egcf = {
619 .dram_type = SPD_DRAM_TYPE_LPDDR3,
620 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
621
622 .module_size_mbits = 4096 * 8,
623 .num_ranks = 2,
624 .device_width = 64,
625 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
626
627 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
628 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
629
630 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
631 'E', 'G', 'C', 'F' },
632};
633
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800634const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
635 .dram_type = SPD_DRAM_TYPE_LPDDR3,
636 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
637
638 .module_size_mbits = 16384,
639 .num_ranks = 2,
640 .device_width = 32,
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 =
647 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
648 'E', 'G', 'C', 'F' },
649};
650
David Hendricks0fa54152016-03-16 15:08:56 -0700651const struct nonspd_mem_info samsung_lpddr3_k4e8e304ed_egcc = {
David Hendricks6638f872015-11-04 14:52:02 -0800652 .dram_type = SPD_DRAM_TYPE_DDR3,
653 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
654
655 .module_size_mbits = 8192,
656 .num_ranks = 2,
657 .device_width = 32,
658 .ddr_freq = { DDR_533 },
659
660 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
661 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
662
David Hendricks6638f872015-11-04 14:52:02 -0800663 .part_num =
664 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'D', '-',
665 'E', 'G', 'C', 'C' },
666};
667
David Hendricks0fa54152016-03-16 15:08:56 -0700668const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800669 .dram_type = SPD_DRAM_TYPE_LPDDR3,
670 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
671
672 .module_size_mbits = 8192,
673 .num_ranks = 2,
674 .device_width = 32,
675 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
676
677 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
678 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
679
680 .part_num =
681 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
682 'E', 'G', 'C', 'E' },
683};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700684
685const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
686 .dram_type = SPD_DRAM_TYPE_LPDDR3,
687 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
688
689 .module_size_mbits = 8192,
690 .num_ranks = 2,
691 .device_width = 32,
692 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
693
694 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
695 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
696
697 .part_num =
698 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
699 'E', 'G', 'C', 'F' },
700};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700701
Jack Rosenthal7f5861c2020-05-07 07:30:55 -0600702const struct nonspd_mem_info samsung_lpddr3_k4ebe304eb_egcf = {
703 .dram_type = SPD_DRAM_TYPE_LPDDR3,
704 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
705
706 .module_size_mbits = 8192 * 8,
707 .num_ranks = 2,
708 .device_width = 64,
709 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
710
711 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
712 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
713
714 .part_num = { 'K', '4', 'E', 'B', 'E', '3', '0', '4', 'E', 'B', '-',
715 'E', 'G', 'C', 'F' },
716};
717
Huanhuan Liu22e02562020-10-14 14:57:39 +0800718const struct nonspd_mem_info samsung_lpddr3_k4e6e304ed_egcg = {
719 .dram_type = SPD_DRAM_TYPE_LPDDR3,
720 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
721
722 .module_size_mbits = 16384,
723 .num_ranks = 2,
724 .device_width = 32,
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', '6', 'E', '3', '0', '4', 'E', 'D', '-',
731 'E', 'G', 'C', 'G' },
732};
733
Loop Wue0fa3212016-12-01 16:25:41 +0800734const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
735 .dram_type = SPD_DRAM_TYPE_LPDDR3,
736 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
737
738 .module_size_mbits = 8192,
739 .num_ranks = 1,
740 .device_width = 32,
741 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
742
743 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
744 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
745
746 .part_num =
747 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
748 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
749};
750
Jack Rosenthal7bdaff92020-05-06 13:04:59 -0600751const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf107 = {
752 .dram_type = SPD_DRAM_TYPE_LPDDR3,
753 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
754
755 .module_size_mbits = 2048 * 8,
756 .num_ranks = 1,
757 .device_width = 64,
758 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
759
760 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
761 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
762
763 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
764 'D', '1', 'P', 'F', '1', '0', '7' },
765};
766
Jack Rosenthal10611d32020-05-06 12:46:38 -0600767const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_10 = {
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' },
781};
782
jiazi Yang5e3d5942017-04-05 22:30:45 -0400783const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_107wtb = {
784 .dram_type = SPD_DRAM_TYPE_LPDDR3,
785 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
786
787 .module_size_mbits = 8192,
788 .num_ranks = 1,
789 .device_width = 32,
790 .ddr_freq = { 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 =
796 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
797 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
798};
799
Loop Wue0fa3212016-12-01 16:25:41 +0800800const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
801 .dram_type = SPD_DRAM_TYPE_LPDDR3,
802 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
803
804 .module_size_mbits = 16384,
805 .num_ranks = 2,
806 .device_width = 32,
807 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
808
809 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
810 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
811
812 .part_num =
813 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
814 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
815};
816
Jack Rosenthal1ca003d2020-05-07 09:04:54 -0600817const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_10 = {
818 .dram_type = SPD_DRAM_TYPE_LPDDR3,
819 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
820
821 .module_size_mbits = 4096 * 8,
822 .num_ranks = 2,
823 .device_width = 64,
824 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
825
826 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
827 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
828
829 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2',
830 'D', '2', 'P', 'F', '-', '1', '0' },
831};
832
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700833static const struct nonspd_mem_info micron_lpddr4_mt53b256m32d1np = {
834 .dram_type = SPD_DRAM_TYPE_LPDDR4,
835
836 .module_size_mbits = 8192,
837 .num_ranks = 1,
838 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700839 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700840
841 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
842 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
843
844 .part_num =
845 { 'M', 'T', '5', '3', 'B', '2', '5', '6', 'M', '3', '2', 'D',
846 '1', 'N', 'P'},
847};
848
849static const struct nonspd_mem_info micron_lpddr4_mt53b512m32d2np = {
850 .dram_type = SPD_DRAM_TYPE_LPDDR4,
851
852 .module_size_mbits = 16384,
853 .num_ranks = 2,
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', '5', '1', '2', 'M', '3', '2', 'D',
862 '2', 'N', 'P'},
863};
864
ren kuoc9202c92018-05-14 19:46:20 +0800865static const struct nonspd_mem_info micron_lpddr4_mt53e512m32d2np = {
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},
ren kuoc9202c92018-05-14 19:46:20 +0800872
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', 'E', '5', '1', '2', 'M', '3', '2', 'D',
878 '2', 'N', 'P'},
879};
880
Kaka Niae6ece42019-02-26 09:55:57 +0800881const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
882 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
883
884 .module_size_mbits = 32768,
885 .num_ranks = 2,
886 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700887 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Kaka Niae6ece42019-02-26 09:55:57 +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', '1', 'G', '3', '2', 'D', '4', 'N',
894 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
895};
896
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700897const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d2np_046wta = {
898 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
899
900 .module_size_mbits = 32768,
901 .num_ranks = 1,
902 .device_width = 32,
903 .ddr_freq = { DDR_2133 },
904
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', '2', 'N',
910 'P', '-', '4', '6', 'W', 'T', ':', 'A'},
911};
912
913const struct nonspd_mem_info micron_lpddr4x_mt53e2g32d4nq_046wta = {
914 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
915
916 .module_size_mbits = 32768,
917 .num_ranks = 2,
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', '2', 'G', '3', '2', 'D', '4', 'N',
926 'Q', '-', '4', '6', 'W', 'T', ':', 'A'},
927};
928
karen_wuc94b8d32020-07-16 14:54:14 +0800929const struct nonspd_mem_info micron_lpddr4x_mt53d1g32d4dt_046wtd = {
930 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
931
932 .module_size_mbits = 32768,
933 .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', 'D', '1', 'G', '3', '2', 'D', '4', 'D',
942 'T', '-', '4', '6', 'W', 'T', ':', 'D'},
943};
944
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800945const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8dqksl = {
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_800, DDR_1200, DDR_1600 },
952
953 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
954 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
955
956 .part_num =
957 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'D',
958 'Q', 'K', 'S', 'L'},
959};
960
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +0800961const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8gqfsl_046 = {
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_2133 },
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', 'G',
974 'Q', 'F', 'S', 'L', '-', '0', '4', '6'},
975};
976
977const struct nonspd_mem_info micron_lpddr4x_mt29vzzzbd9dqkpr_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', 'B', 'D', '9', 'D',
990 'Q', 'K', 'P', 'R', '-', '0', '4', '6'},
991};
992
Philip Chencccc7042018-09-25 20:31:37 -0700993const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
994 .dram_type = SPD_DRAM_TYPE_LPDDR4,
995
996 .module_size_mbits = 32768,
997 .num_ranks = 2,
998 .device_width = 32,
999 .ddr_freq = { DDR_1355 },
1000
1001 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1002 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1003
1004 .part_num =
1005 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
1006 'A', 'G', 'C', 'J' },
1007};
1008
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001009static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgcj = {
1010 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1011
1012 .module_size_mbits = 16384,
1013 .num_ranks = 2,
1014 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001015 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001016
1017 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1018 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1019
1020 .part_num =
1021 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
1022 'M', 'G', 'C', 'J' },
1023};
1024
ren kuo500c9c62018-05-24 17:57:50 +08001025static const struct nonspd_mem_info samsung_lpddr4_k4f6e3s4hm_mgcj = {
1026 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1027
1028 .module_size_mbits = 16384,
1029 .num_ranks = 1,
1030 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001031 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuo500c9c62018-05-24 17:57:50 +08001032
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', 'S', '4', 'H', 'M', '-',
1038 'M', 'G', 'C', 'J' },
1039};
1040
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001041static const struct nonspd_mem_info samsung_lpddr4_k4f8e304hb_mgcj = {
1042 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1043
1044 .module_size_mbits = 8192,
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},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001048
1049 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1050 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1051
1052 .part_num =
1053 { 'K', '4', 'F', '8', 'E', '3', '0', '4', 'H', 'B', '-',
1054 'M', 'G', 'C', 'J' },
1055};
1056
Kevin Chiucba66122020-07-14 20:08:52 +08001057static const struct nonspd_mem_info samsung_lpddr4_k4f8e3s4hd_mgcl = {
1058 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1059
1060 .module_size_mbits = 8192,
1061 .num_ranks = 1,
1062 .device_width = 32,
1063 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1064
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', 'S', '4', 'H', 'D', '-',
1070 'M', 'G', 'C', 'L' },
1071};
1072
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001073const struct nonspd_mem_info samsung_lpddr4x_kmdh6001da_b422 = {
1074 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1075
1076 .module_size_mbits = 32768,
1077 .num_ranks = 2,
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', 'M', 'D', 'H', '6', '0', '0', '1', 'D', 'A', '-',
1086 'B', '4', '2', '2' },
1087};
1088
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001089const struct nonspd_mem_info samsung_lpddr4x_kmdp6001da_b425 = {
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', 'P', '6', '0', '0', '1', 'D', 'A', '-',
1102 'B', '4', '2', '5' },
1103};
1104
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001105const struct nonspd_mem_info samsung_lpddr4x_kmdv6001da_b620 = {
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', 'V', '6', '0', '0', '1', 'D', 'A', '-',
1118 'B', '6', '2', '0' },
1119};
1120
1121const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4am_mgcj = {
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', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'M', '-',
1134 'M', 'G', 'C', 'J' },
1135};
1136
cherish8851df02019-09-01 14:35:55 +08001137const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcl = {
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', 'A', '-',
1150 'M', 'G', 'C', 'L' },
1151};
1152
Chia-Hsiu Chang065a3c42020-08-27 19:08:13 +08001153const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcr = {
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', 'R' },
1167};
1168
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001169static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgch = {
1170 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1171
1172 .module_size_mbits = 8192,
1173 .num_ranks = 1,
1174 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001175 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001176
1177 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1178 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1179
1180 .part_num =
1181 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
1182 'M', 'G', 'C', 'H' },
1183};
1184
Kaka Ni9db5d8a2019-07-05 12:13:33 +08001185const struct nonspd_mem_info sandisk_lpddr4x_sdada4cr_128g = {
1186 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1187
1188 .module_size_mbits = 32768,
1189 .num_ranks = 2,
1190 .device_width = 32,
1191 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1192
1193 .module_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1194 .dram_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1195
1196 .part_num =
1197 { 'S', 'D', 'A', 'D', 'A', '4', 'C', 'R', '-', '1', '2',
1198 '8', 'G' },
1199};
1200
1201
Marco Chena18bbb22018-08-13 16:10:55 +08001202// This one is reserved for storing mem info from SMBIOS if no explicit entry
1203// was added above.
1204static struct nonspd_mem_info part_extracted_from_smbios = {
1205 .part_num =
1206 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
1207};
1208
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001209static const struct nonspd_mem_info *nospdmemory[] = {
1210 &elpida_lpddr3_edfa164a2ma_jd_f,
1211 &elpida_lpddr3_f8132a3ma_gd_f,
1212 &elpida_lpddr3_fa232a2ma_gc_f,
1213 &hynix_ddr3l_h5tc4g63afr_pba,
1214 &hynix_ddr3l_h5tc4g63cfr_pba,
Zheng Pan56c19e52018-10-23 17:01:11 -07001215 &hynix_ddr3l_h5tc4g63efr_rda,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001216 &hynix_lpddr3_h9ccnnn8gtmlar_nud,
Jack Rosenthal956a5b42020-05-06 14:26:32 -06001217 &hynix_lpddr3_h9ccnnn8jtblar_nud,
Milton Chiang5664fe32016-11-29 14:59:49 +08001218 &hynix_lpddr3_h9ccnnnbjtalar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001219 &hynix_lpddr3_h9ccnnnbjtmlar_nud,
Jack Rosenthal73a32f32020-05-07 08:24:48 -06001220 &hynix_lpddr3_h9ccnnncltmlar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001221 &hynix_ddr3l_h5tc8g63amr_pba,
1222 &hynix_lpddr3_h9ccnnnbptblbr_nud,
1223 &hynix_lpddr3_h9ccnnnbltblar_nud,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001224 &hynix_lpddr3_h9ccnnnbktmlbr_ntd,
Kevin Chiu55250dd2016-11-08 17:21:23 +08001225 &hynix_lpddr4_h9hcnnn8kumlhr,
1226 &hynix_lpddr4_h9hcnnnbpumlhr,
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +08001227 &hynix_lpddr4x_h9hcnnncpmalhr_nee,
Eason Lina80ba0a2020-07-15 16:58:24 +08001228 &hynix_lpddr4x_h9hcnnncpmmlxr_nee,
Jack Rosenthal7bdaff92020-05-06 13:04:59 -06001229 &micron_lpddr3_mt52l256m32d1pf107,
Jack Rosenthal10611d32020-05-06 12:46:38 -06001230 &micron_lpddr3_mt52l256m32d1pf_10,
Marco Chena18bbb22018-08-13 16:10:55 +08001231 &micron_lpddr3_mt52l256m32d1pf_107wtb,
1232 &micron_lpddr3_mt52l256m64d2pp_107wtb,
1233 &micron_lpddr3_mt52l512m32d2pf_107wtb,
Jack Rosenthal1ca003d2020-05-07 09:04:54 -06001234 &micron_lpddr3_mt52l512m32d2pf_10,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001235 &micron_lpddr4_mt53b256m32d1np,
1236 &micron_lpddr4_mt53b512m32d2np,
ren kuoc9202c92018-05-14 19:46:20 +08001237 &micron_lpddr4_mt53e512m32d2np,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001238 &micron_lpddr4x_mt29vzzzad8dqksl,
Hsin-Yi Wangd62a29d2020-07-20 18:05:16 +08001239 &micron_lpddr4x_mt29vzzzad8gqfsl_046,
1240 &micron_lpddr4x_mt29vzzzbd9dqkpr_046,
Kaka Niae6ece42019-02-26 09:55:57 +08001241 &micron_lpddr4x_mt53e1g32d4nq_046wte,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001242 &micron_lpddr4x_mt53e1g32d2np_046wta,
1243 &micron_lpddr4x_mt53e2g32d4nq_046wta,
karen_wuc94b8d32020-07-16 14:54:14 +08001244 &micron_lpddr4x_mt53d1g32d4dt_046wtd,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001245 &micron_mt41k256m16ha,
Milton Chiang5664fe32016-11-29 14:59:49 +08001246 &micron_mt52l256m32d1pf,
1247 &micron_mt52l512m32d2pf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001248 &nanya_ddr3l_nt5cc256m16dp_di,
Zheng Pan56c19e52018-10-23 17:01:11 -07001249 &nanya_ddr3l_nt5cc256m16er_ek,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001250 &samsung_k4b4g1646d,
1251 &samsung_k4b4g1646e,
Zheng Pan56c19e52018-10-23 17:01:11 -07001252 &samsung_k4b4g1646e_byma,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001253 &samsung_ddr3l_k4b4g1646d_byk0,
1254 &samsung_ddr3l_k4b4g1646q_hyk0,
1255 &samsung_ddr3l_k4b8g1646q_myk0,
1256 &samsung_lpddr3_k3qf2f20em_agce,
1257 &samsung_lpddr3_k4e6e304eb_egce,
Jack Rosenthal6b99a832020-05-06 15:34:10 -06001258 &samsung_lpddr3_k4e6e304ec_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001259 &samsung_lpddr3_k4e6e304ee_egce,
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -06001260 &samsung_lpddr3_k4e6e304ee_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001261 &samsung_lpddr3_k4e6e304eb_egcf,
1262 &samsung_lpddr3_k4e8e304ed_egcc,
1263 &samsung_lpddr3_k4e8e304ee_egce,
1264 &samsung_lpddr3_k4e8e324eb_egcf,
Jack Rosenthal7f5861c2020-05-07 07:30:55 -06001265 &samsung_lpddr3_k4ebe304eb_egcf,
Philip Chencccc7042018-09-25 20:31:37 -07001266 &samsung_lpddr4_k3uh5h50mm_agcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001267 &samsung_lpddr4_k4f6e304hb_mgch,
1268 &samsung_lpddr4_k4f6e304hb_mgcj,
ren kuo500c9c62018-05-24 17:57:50 +08001269 &samsung_lpddr4_k4f6e3s4hm_mgcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001270 &samsung_lpddr4_k4f8e304hb_mgcj,
Kevin Chiucba66122020-07-14 20:08:52 +08001271 &samsung_lpddr4_k4f8e3s4hd_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001272 &samsung_lpddr4x_kmdh6001da_b422,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001273 &samsung_lpddr4x_kmdp6001da_b425,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001274 &samsung_lpddr4x_kmdv6001da_b620,
1275 &samsung_lpddr4x_k4ube3d4am_mgcj,
cherish8851df02019-09-01 14:35:55 +08001276 &samsung_lpddr4x_k4ube3d4aa_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001277 &sandisk_lpddr4x_sdada4cr_128g
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001278};
1279
Marco Chena18bbb22018-08-13 16:10:55 +08001280static int transfer_speed_from_smbios_to_nonspd_mem_info(
1281 struct smbios_table *table,
1282 struct nonspd_mem_info *info)
1283{
Rob Barnes06e01462020-09-16 15:04:44 -06001284 uint32_t expected_speed;
1285
Marco Chena18bbb22018-08-13 16:10:55 +08001286 for (int index = DDR_333; index < DDR_FREQ_MAX; index++) {
Rob Barnes06e01462020-09-16 15:04:44 -06001287 expected_speed = strtoul(ddr_freq_prettyprint[index], NULL, 10);
1288 if (table->data.mem_device.speed >= expected_speed - 1 &&
1289 table->data.mem_device.speed <= expected_speed + 1) {
Marco Chena18bbb22018-08-13 16:10:55 +08001290 info->ddr_freq[0] = index;
1291 return 0;
1292 }
1293 }
1294
1295 lprintf(LOG_ERR, "%s: mem speed %hu in SMBIOS is out of range.",
1296 __func__, table->data.mem_device.speed);
1297 return -1;
1298}
1299
Jack Rosenthale279bb22020-05-15 17:46:55 -06001300static enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001301{
1302 switch (table->data.mem_device.type) {
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001303 case SMBIOS_MEMORY_TYPE_DDR3:
1304 return SPD_DRAM_TYPE_DDR3;
1305 case SMBIOS_MEMORY_TYPE_DDR4:
1306 return SPD_DRAM_TYPE_DDR4;
Paul Fagerburg1f3997c2019-05-17 09:31:29 -06001307 case SMBIOS_MEMORY_TYPE_LPDDR3:
1308 return SPD_DRAM_TYPE_LPDDR3;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001309 case SMBIOS_MEMORY_TYPE_LPDDR4:
1310 return SPD_DRAM_TYPE_LPDDR4;
1311 default:
1312 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
1313 __func__, table->data.mem_device.type);
1314 return 0;
1315 }
1316}
1317
Marco Chena18bbb22018-08-13 16:10:55 +08001318static int extract_mem_info_from_smbios(
1319 struct smbios_table *table,
1320 struct nonspd_mem_info *info)
1321{
1322 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +08001323 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +08001324 uint32_t size;
1325
Marco Chen05511cb2018-10-01 08:35:37 +08001326 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +08001327 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +08001328 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +08001329
1330 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +08001331 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +08001332 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
1333 "Or len of part number %lu is larger then buffer %lu."
1334 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +08001335 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +08001336 return -1;
1337 }
1338
1339 size = (table->data.mem_device.size & 0x7fff) * 8;
1340 info->module_size_mbits =
1341 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
1342
Marco Chen05511cb2018-10-01 08:35:37 +08001343 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001344
1345 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -08001346 info->num_ranks = table->data.mem_device.attributes & 0xf;
1347 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001348
Marco Chena18bbb22018-08-13 16:10:55 +08001349 return transfer_speed_from_smbios_to_nonspd_mem_info(table, info);
1350}
1351
Nick Vaccaroc287faf2020-09-15 13:35:52 -07001352int spd_set_nonspd_info_from_smbios(struct platform_intf *intf, int dimm,
1353 const struct nonspd_mem_info **info)
1354{
1355 struct smbios_table table;
1356
1357 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table) < 0) {
1358 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n",
1359 __func__);
1360 return -1;
1361 }
1362
1363 /* memory device from SMBIOS is mapped into a nonspd_mem_info */
1364 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios))
1365 return -1;
1366
1367 *info = &part_extracted_from_smbios;
1368
1369 return 0;
1370}
1371
Edward O'Callaghan36f667d2020-07-07 12:25:43 +10001372int spd_set_nonspd_info(struct platform_intf *intf, int dimm,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001373 const struct nonspd_mem_info **info)
1374{
Edward O'Callaghan36f667d2020-07-07 12:25:43 +10001375 int index;
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001376 struct smbios_table table;
1377
Jack Rosenthal248b3c62020-05-14 20:29:48 -06001378 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table) < 0) {
Nick Vaccaroc287faf2020-09-15 13:35:52 -07001379 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n",
1380 __func__);
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001381 return -1;
1382 }
1383
1384 for (index = 0; index < ARRAY_SIZE(nospdmemory); index++) {
1385 if (!strncmp(table.string[table.data.mem_device.part_number],
Brian Norrisd7384fb2018-04-30 11:05:23 -07001386 (const char *)nospdmemory[index]->part_num,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001387 sizeof(nospdmemory[index]->part_num))) {
1388 *info = nospdmemory[index];
1389 break;
1390 }
1391 }
1392
Marco Chena18bbb22018-08-13 16:10:55 +08001393 if (index < ARRAY_SIZE(nospdmemory)) {
1394 return 0;
1395 }
1396
Nick Vaccaroc287faf2020-09-15 13:35:52 -07001397 /* memory device from SMBIOS is mapped into a nonspd_mem_info */
Marco Chena18bbb22018-08-13 16:10:55 +08001398 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios)) {
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001399 return -1;
1400 }
1401
Marco Chena18bbb22018-08-13 16:10:55 +08001402 *info = &part_extracted_from_smbios;
1403
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001404 return 0;
1405}