blob: decfb9f483a08fb0d735fa1ffa9d9ffba544c5a3 [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
101 .serial_num = { 0, 0, 0, 0 },
102 .part_num =
103 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'A', 'F', 'R', '-',
104 'P', 'B', 'A'},
105};
106
David Hendricks0fa54152016-03-16 15:08:56 -0700107const struct nonspd_mem_info hynix_ddr3l_h5tc4g63cfr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800108 .dram_type = SPD_DRAM_TYPE_DDR3,
109 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
110
111 .module_size_mbits = 4096,
112 .num_ranks = 1,
113 .device_width = 16,
114 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
115
116 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
117 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
118
119 .serial_num = { 0, 0, 0, 0 },
120 .part_num =
121 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'C', 'F', 'R', '-',
122 'P', 'B', 'A'},
123};
124
Zheng Pan56c19e52018-10-23 17:01:11 -0700125const struct nonspd_mem_info hynix_ddr3l_h5tc4g63efr_rda = {
126 .dram_type = SPD_DRAM_TYPE_DDR3,
127 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
128
129 .module_size_mbits = 4096,
130 .num_ranks = 1,
131 .device_width = 16,
132 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
133
134 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
135 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
136
137 .serial_num = { 0, 0, 0, 0 },
138 .part_num =
139 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'E', 'F', 'R', '-',
140 'R', 'D', 'A'},
141};
142
David Hendricks0fa54152016-03-16 15:08:56 -0700143const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8gtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800144 .dram_type = SPD_DRAM_TYPE_LPDDR3,
145 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
146
147 .module_size_mbits = 8192,
148 .num_ranks = 1,
149 .device_width = 32,
150 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
151
152 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
153 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
154
155 .part_num =
156 { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'G', 'T', 'M', 'L',
157 'A', 'R', '-', 'N', 'U', 'D',},
158};
159
Jack Rosenthal956a5b42020-05-06 14:26:32 -0600160const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8jtblar_nud = {
161 .dram_type = SPD_DRAM_TYPE_LPDDR3,
162 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
163
164 .module_size_mbits = 2048 * 8,
165 .num_ranks = 2,
166 .device_width = 64,
167 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
168
169 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
170 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
171
172 .part_num = { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'J', 'T', 'B',
173 'L', 'A', 'R', '-', 'N', 'U', 'D' },
174};
175
Milton Chiang5664fe32016-11-29 14:59:49 +0800176const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtalar_nud = {
177 .dram_type = SPD_DRAM_TYPE_LPDDR3,
178 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
179
180 .module_size_mbits = 16384,
181 .num_ranks = 2,
182 .device_width = 32,
183 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
184
185 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
186 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
187
188 .part_num =
189 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'J', 'T', 'A', 'L',
190 'A', 'R', '-', 'N', 'U', 'D',},
191};
192
David Hendricks0fa54152016-03-16 15:08:56 -0700193const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800194 .dram_type = SPD_DRAM_TYPE_LPDDR3,
195 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
196
197 .module_size_mbits = 16384,
198 .num_ranks = 2,
199 .device_width = 32,
200 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
201
202 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
203 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
204
205 .part_num =
206 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'J', 'T', 'M', 'L',
207 'A', 'R', '-', 'N', 'U', 'D',},
208};
209
David Hendricks0fa54152016-03-16 15:08:56 -0700210const struct nonspd_mem_info hynix_ddr3l_h5tc8g63amr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800211 .dram_type = SPD_DRAM_TYPE_DDR3,
212 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
213 .module_size_mbits = 8192,
214 .num_ranks = 2,
215 .device_width = 16,
216 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
217
218 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
219 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
220
221 .serial_num = { 0, 0, 0, 0 },
222 .part_num =
223 { 'H', '5', 'T', 'C', '8', 'G', '6', '3', 'A', 'M', 'R', '-',
224 'P', 'B', 'A' },
225};
226
David Hendricks0fa54152016-03-16 15:08:56 -0700227const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbptblbr_nud = {
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800228 .dram_type = SPD_DRAM_TYPE_LPDDR3,
229 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
230
231 .module_size_mbits = 16384,
232 .num_ranks = 2,
233 .device_width = 32,
234 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
235
236 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
237 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
238
239 .part_num =
240 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'P', 'T', 'B', 'L',
241 'B', 'R', '-', 'N', 'U', 'D',},
242};
243
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800244const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbltblar_nud = {
245 .dram_type = SPD_DRAM_TYPE_LPDDR3,
246 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
247
248 .module_size_mbits = 16384,
249 .num_ranks = 2,
250 .device_width = 32,
251 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
252
253 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
254 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
255
256 .part_num =
257 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'L', 'T', 'B', 'L',
258 'A', 'R', '-', 'N', 'U', 'D',},
259};
260
Loop_Wu9ec61642019-01-29 14:28:34 +0800261const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbktmlbr_ntd = {
262 .dram_type = SPD_DRAM_TYPE_LPDDR3,
263 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
264
265 .module_size_mbits = 16384,
266 .num_ranks = 2,
267 .device_width = 32,
268 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
269
270 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
271 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
272
273 .part_num =
274 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'K', 'T', 'M', 'L',
275 'B', 'R', '-', 'N', 'T', 'D',},
276};
277
Jack Rosenthal73a32f32020-05-07 08:24:48 -0600278const struct nonspd_mem_info hynix_lpddr3_h9ccnnncltmlar_nud = {
279 .dram_type = SPD_DRAM_TYPE_LPDDR3,
280 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
281
282 .module_size_mbits = 8192 * 8,
283 .num_ranks = 2,
284 .device_width = 64,
285 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
286
287 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
288 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
289
290 .part_num = { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'C', 'L', 'T', 'M',
291 'L', 'A', 'R', '-', 'N', 'U', 'D' },
292};
293
Kevin Chiu55250dd2016-11-08 17:21:23 +0800294const struct nonspd_mem_info hynix_lpddr4_h9hcnnn8kumlhr = {
295 .dram_type = SPD_DRAM_TYPE_LPDDR4,
296
297 .module_size_mbits = 8192,
298 .num_ranks = 1,
299 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700300 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Kevin Chiu55250dd2016-11-08 17:21:23 +0800301
302 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
303 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
304
305 .part_num =
306 { 'H', '9', 'H', 'C', 'N', 'N', 'N', '8', 'K', 'U', 'M', 'L',
307 'H', 'R',},
308};
309
310const struct nonspd_mem_info hynix_lpddr4_h9hcnnnbpumlhr = {
311 .dram_type = SPD_DRAM_TYPE_LPDDR4,
312
313 .module_size_mbits = 16384,
314 .num_ranks = 2,
315 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700316 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Kevin Chiu55250dd2016-11-08 17:21:23 +0800317
318 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
319 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
320
321 .part_num =
322 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'B', 'P', 'U', 'M', 'L',
323 'H', 'R',},
324};
325
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800326const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmalhr_nee = {
327 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
328
329 .module_size_mbits = 32768,
330 .num_ranks = 2,
331 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700332 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800333
334 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
335 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
336
337 .part_num =
338 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'C', 'P', 'M', 'A', 'L',
339 'H', 'R', '-', 'N', 'E', 'E'},
340};
341
David Hendricks6638f872015-11-04 14:52:02 -0800342const struct nonspd_mem_info micron_mt41k256m16ha = {
343 .dram_type = SPD_DRAM_TYPE_DDR3,
344 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
345
346 .module_size_mbits = 4096,
347 .num_ranks = 1,
348 .device_width = 16,
349 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
350
351 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
352 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
353
354 .serial_num = { 0, 0, 0, 0 },
355 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
356 '1', '6', 'H', 'A', '-', '1', '2', '5' },
357};
358
Milton Chiang5664fe32016-11-29 14:59:49 +0800359const struct nonspd_mem_info micron_mt52l256m32d1pf = {
360 .dram_type = SPD_DRAM_TYPE_DDR3,
361 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
362
363 .module_size_mbits = 8192,
364 .num_ranks = 1,
365 .device_width = 32,
366 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
367
368 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
369 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
370
371 .serial_num = { 0, 0, 0, 0 },
372 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M',
373 '3', '2', 'D', '1', 'P', 'F', '-', '0', '9',
374 '3', 'W', 'T', ':', 'B' },
375};
376
377const struct nonspd_mem_info micron_mt52l512m32d2pf = {
378 .dram_type = SPD_DRAM_TYPE_DDR3,
379 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
380
381 .module_size_mbits = 16384,
382 .num_ranks = 2,
383 .device_width = 32,
384 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
385
386 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
387 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
388
389 .serial_num = { 0, 0, 0, 0 },
390 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M',
391 '3', '2', 'D', '2', 'P', 'F', '-', '0', '9',
392 '3', 'W', 'T', ':', 'B' },
393};
394
David Hendricks97303242015-11-11 14:41:40 -0800395const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
396 .dram_type = SPD_DRAM_TYPE_DDR3,
397 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
398
399 .module_size_mbits = 4096,
400 .num_ranks = 1,
401 .device_width = 16,
402 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
403 .ddr_freq = { DDR_667, DDR_800 },
404 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
405 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
406
407 .serial_num = { 0, 0, 0, 0 },
408 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
409 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
410};
411
Zheng Pan56c19e52018-10-23 17:01:11 -0700412const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
413 .dram_type = SPD_DRAM_TYPE_DDR3,
414 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
415
416 .module_size_mbits = 4096,
417 .num_ranks = 1,
418 .device_width = 16,
419 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
420 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
421 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
422
423 .serial_num = { 0, 0, 0, 0 },
424 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
425 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
426};
427
David Hendricks6638f872015-11-04 14:52:02 -0800428const struct nonspd_mem_info samsung_k4b4g1646d = {
429 .dram_type = SPD_DRAM_TYPE_DDR3,
430 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
431
432 .module_size_mbits = 4096,
433 .num_ranks = 1,
434 .device_width = 16,
435 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
436
437 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
438 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
439
440 .serial_num = { 0, 0, 0, 0 },
441 .part_num =
442 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
443 '-', 'B', 'Y', 'K', '0' },
444};
445
446const struct nonspd_mem_info samsung_k4b4g1646e = {
447 .dram_type = SPD_DRAM_TYPE_DDR3,
448 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
449
450 .module_size_mbits = 4096,
451 .num_ranks = 1,
452 .device_width = 16,
453 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
454
455 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
456 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
457
458 .serial_num = { 0, 0, 0, 0 },
459 .part_num =
460 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
461 '-', 'B', 'Y', 'K', '0' },
462};
463
Zheng Pan56c19e52018-10-23 17:01:11 -0700464const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
465 .dram_type = SPD_DRAM_TYPE_DDR3,
466 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
467
468 .module_size_mbits = 4096,
469 .num_ranks = 1,
470 .device_width = 16,
471 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
472
473 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
474 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
475
476 .serial_num = { 0, 0, 0, 0 },
477 .part_num =
478 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
479 '-', 'B', 'Y', 'M', 'A' },
480};
481
David Hendricks0fa54152016-03-16 15:08:56 -0700482const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800483 .dram_type = SPD_DRAM_TYPE_DDR3,
484 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
485
486 .module_size_mbits = 4096,
487 .num_ranks = 1,
488 .device_width = 16,
489 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
490
491 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
492 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
493
494 .serial_num = { 0, 0, 0, 0 },
495 .part_num =
496 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
497 'B', 'Y', 'K', '0' },
498};
499
David Hendricks0fa54152016-03-16 15:08:56 -0700500const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800501 .dram_type = SPD_DRAM_TYPE_DDR3,
502 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
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 },
508
509 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
510 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
511
512 .serial_num = { 0, 0, 0, 0 },
513 .part_num =
514 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
515 'H', 'Y', 'K', '0' },
516};
517
David Hendricks0fa54152016-03-16 15:08:56 -0700518const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
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 .module_size_mbits = 8192,
522 .num_ranks = 2,
523 .device_width = 16,
524 .ddr_freq = { DDR_333, 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
529 .serial_num = { 0, 0, 0, 0 },
530 .part_num =
531 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
532 'M', 'Y', 'K', '0' },
533};
534
David Hendricks0fa54152016-03-16 15:08:56 -0700535const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800536 .dram_type = SPD_DRAM_TYPE_LPDDR3,
537 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
538
539 .module_size_mbits = 8192,
540 .num_ranks = 2,
541 .device_width = 32,
542 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
543
544 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
545 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
546
547 .part_num =
548 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
549 'A', 'G', 'C', 'E' },
550};
551
Vincent Palatin90af8e62016-05-20 12:12:49 -0700552const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
553 .dram_type = SPD_DRAM_TYPE_LPDDR3,
554 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
555
556 .module_size_mbits = 16384,
557 .num_ranks = 2,
558 .device_width = 32,
559 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
560
561 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
562 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
563
564 .part_num =
565 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
566 'E', 'G', 'C', 'E' },
567};
568
Jack Rosenthal6b99a832020-05-06 15:34:10 -0600569const struct nonspd_mem_info samsung_lpddr3_k4e6e304ec_egcf = {
570 .dram_type = SPD_DRAM_TYPE_LPDDR3,
571 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
572
573 .module_size_mbits = 4096 * 8,
574 .num_ranks = 2,
575 .device_width = 64,
576 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
577
578 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
579 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
580
581 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'C', '-',
582 'E', 'G', 'C', 'F' },
583};
584
David Hendricks0fa54152016-03-16 15:08:56 -0700585const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800586 .dram_type = SPD_DRAM_TYPE_LPDDR3,
587 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
588
589 .module_size_mbits = 16384,
590 .num_ranks = 2,
591 .device_width = 32,
592 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
593
594 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
595 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
596
597 .part_num =
598 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
599 'E', 'G', 'C', 'E' },
600};
601
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -0600602const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egcf = {
603 .dram_type = SPD_DRAM_TYPE_LPDDR3,
604 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
605
606 .module_size_mbits = 4096 * 8,
607 .num_ranks = 2,
608 .device_width = 64,
609 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
610
611 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
612 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
613
614 .part_num = { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
615 'E', 'G', 'C', 'F' },
616};
617
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800618const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
619 .dram_type = SPD_DRAM_TYPE_LPDDR3,
620 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
621
622 .module_size_mbits = 16384,
623 .num_ranks = 2,
624 .device_width = 32,
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 =
631 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
632 'E', 'G', 'C', 'F' },
633};
634
David Hendricks0fa54152016-03-16 15:08:56 -0700635const struct nonspd_mem_info samsung_lpddr3_k4e8e304ed_egcc = {
David Hendricks6638f872015-11-04 14:52:02 -0800636 .dram_type = SPD_DRAM_TYPE_DDR3,
637 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
638
639 .module_size_mbits = 8192,
640 .num_ranks = 2,
641 .device_width = 32,
642 .ddr_freq = { DDR_533 },
643
644 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
645 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
646
647 .serial_num = { 0, 0, 0, 0 },
648 .part_num =
649 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'D', '-',
650 'E', 'G', 'C', 'C' },
651};
652
David Hendricks0fa54152016-03-16 15:08:56 -0700653const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800654 .dram_type = SPD_DRAM_TYPE_LPDDR3,
655 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
656
657 .module_size_mbits = 8192,
658 .num_ranks = 2,
659 .device_width = 32,
660 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
661
662 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
663 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
664
665 .part_num =
666 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
667 'E', 'G', 'C', 'E' },
668};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700669
670const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
671 .dram_type = SPD_DRAM_TYPE_LPDDR3,
672 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
673
674 .module_size_mbits = 8192,
675 .num_ranks = 2,
676 .device_width = 32,
677 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
678
679 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
680 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
681
682 .part_num =
683 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
684 'E', 'G', 'C', 'F' },
685};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700686
Jack Rosenthal7f5861c2020-05-07 07:30:55 -0600687const struct nonspd_mem_info samsung_lpddr3_k4ebe304eb_egcf = {
688 .dram_type = SPD_DRAM_TYPE_LPDDR3,
689 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
690
691 .module_size_mbits = 8192 * 8,
692 .num_ranks = 2,
693 .device_width = 64,
694 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
695
696 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
697 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
698
699 .part_num = { 'K', '4', 'E', 'B', 'E', '3', '0', '4', 'E', 'B', '-',
700 'E', 'G', 'C', 'F' },
701};
702
Loop Wue0fa3212016-12-01 16:25:41 +0800703const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
704 .dram_type = SPD_DRAM_TYPE_LPDDR3,
705 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
706
707 .module_size_mbits = 8192,
708 .num_ranks = 1,
709 .device_width = 32,
710 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
711
712 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
713 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
714
715 .part_num =
716 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
717 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
718};
719
Jack Rosenthal7bdaff92020-05-06 13:04:59 -0600720const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf107 = {
721 .dram_type = SPD_DRAM_TYPE_LPDDR3,
722 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
723
724 .module_size_mbits = 2048 * 8,
725 .num_ranks = 1,
726 .device_width = 64,
727 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
728
729 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
730 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
731
732 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
733 'D', '1', 'P', 'F', '1', '0', '7' },
734};
735
Jack Rosenthal10611d32020-05-06 12:46:38 -0600736const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_10 = {
737 .dram_type = SPD_DRAM_TYPE_LPDDR3,
738 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
739
740 .module_size_mbits = 2048 * 8,
741 .num_ranks = 1,
742 .device_width = 64,
743 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
744
745 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
746 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
747
748 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2',
749 'D', '1', 'P', 'F', '-', '1', '0' },
750};
751
jiazi Yang5e3d5942017-04-05 22:30:45 -0400752const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_107wtb = {
753 .dram_type = SPD_DRAM_TYPE_LPDDR3,
754 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
755
756 .module_size_mbits = 8192,
757 .num_ranks = 1,
758 .device_width = 32,
759 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
760
761 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
762 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
763
764 .part_num =
765 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
766 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
767};
768
Loop Wue0fa3212016-12-01 16:25:41 +0800769const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
770 .dram_type = SPD_DRAM_TYPE_LPDDR3,
771 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
772
773 .module_size_mbits = 16384,
774 .num_ranks = 2,
775 .device_width = 32,
776 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
777
778 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
779 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
780
781 .part_num =
782 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
783 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
784};
785
Jack Rosenthal1ca003d2020-05-07 09:04:54 -0600786const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_10 = {
787 .dram_type = SPD_DRAM_TYPE_LPDDR3,
788 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
789
790 .module_size_mbits = 4096 * 8,
791 .num_ranks = 2,
792 .device_width = 64,
793 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
794
795 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
796 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
797
798 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2',
799 'D', '2', 'P', 'F', '-', '1', '0' },
800};
801
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700802static const struct nonspd_mem_info micron_lpddr4_mt53b256m32d1np = {
803 .dram_type = SPD_DRAM_TYPE_LPDDR4,
804
805 .module_size_mbits = 8192,
806 .num_ranks = 1,
807 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700808 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700809
810 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
811 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
812
813 .part_num =
814 { 'M', 'T', '5', '3', 'B', '2', '5', '6', 'M', '3', '2', 'D',
815 '1', 'N', 'P'},
816};
817
818static const struct nonspd_mem_info micron_lpddr4_mt53b512m32d2np = {
819 .dram_type = SPD_DRAM_TYPE_LPDDR4,
820
821 .module_size_mbits = 16384,
822 .num_ranks = 2,
823 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700824 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700825
826 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
827 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
828
829 .part_num =
830 { 'M', 'T', '5', '3', 'B', '5', '1', '2', 'M', '3', '2', 'D',
831 '2', 'N', 'P'},
832};
833
ren kuoc9202c92018-05-14 19:46:20 +0800834static const struct nonspd_mem_info micron_lpddr4_mt53e512m32d2np = {
835 .dram_type = SPD_DRAM_TYPE_LPDDR4,
836
837 .module_size_mbits = 16384,
838 .num_ranks = 2,
839 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700840 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuoc9202c92018-05-14 19:46:20 +0800841
842 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
843 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
844
845 .part_num =
846 { 'M', 'T', '5', '3', 'E', '5', '1', '2', 'M', '3', '2', 'D',
847 '2', 'N', 'P'},
848};
849
Kaka Niae6ece42019-02-26 09:55:57 +0800850const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
851 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
852
853 .module_size_mbits = 32768,
854 .num_ranks = 2,
855 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700856 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Kaka Niae6ece42019-02-26 09:55:57 +0800857
858 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
859 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
860
861 .part_num =
862 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '4', 'N',
863 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
864};
865
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700866const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d2np_046wta = {
867 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
868
869 .module_size_mbits = 32768,
870 .num_ranks = 1,
871 .device_width = 32,
872 .ddr_freq = { DDR_2133 },
873
874 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
875 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
876
877 .part_num =
878 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '2', 'N',
879 'P', '-', '4', '6', 'W', 'T', ':', 'A'},
880};
881
882const struct nonspd_mem_info micron_lpddr4x_mt53e2g32d4nq_046wta = {
883 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
884
885 .module_size_mbits = 32768,
886 .num_ranks = 2,
887 .device_width = 32,
888 .ddr_freq = { DDR_2133 },
889
890 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
891 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
892
893 .part_num =
894 { 'M', 'T', '5', '3', 'E', '2', 'G', '3', '2', 'D', '4', 'N',
895 'Q', '-', '4', '6', 'W', 'T', ':', 'A'},
896};
897
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800898const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8dqksl = {
899 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
900
901 .module_size_mbits = 32768,
902 .num_ranks = 2,
903 .device_width = 32,
904 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
905
906 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
907 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
908
909 .part_num =
910 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'D',
911 'Q', 'K', 'S', 'L'},
912};
913
Philip Chencccc7042018-09-25 20:31:37 -0700914const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
915 .dram_type = SPD_DRAM_TYPE_LPDDR4,
916
917 .module_size_mbits = 32768,
918 .num_ranks = 2,
919 .device_width = 32,
920 .ddr_freq = { DDR_1355 },
921
922 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
923 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
924
925 .part_num =
926 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
927 'A', 'G', 'C', 'J' },
928};
929
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700930static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgcj = {
931 .dram_type = SPD_DRAM_TYPE_LPDDR4,
932
933 .module_size_mbits = 16384,
934 .num_ranks = 2,
935 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700936 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700937
938 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
939 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
940
941 .part_num =
942 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
943 'M', 'G', 'C', 'J' },
944};
945
ren kuo500c9c62018-05-24 17:57:50 +0800946static const struct nonspd_mem_info samsung_lpddr4_k4f6e3s4hm_mgcj = {
947 .dram_type = SPD_DRAM_TYPE_LPDDR4,
948
949 .module_size_mbits = 16384,
950 .num_ranks = 1,
951 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700952 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuo500c9c62018-05-24 17:57:50 +0800953
954 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
955 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
956
957 .part_num =
958 { 'K', '4', 'F', '6', 'E', '3', 'S', '4', 'H', 'M', '-',
959 'M', 'G', 'C', 'J' },
960};
961
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700962static const struct nonspd_mem_info samsung_lpddr4_k4f8e304hb_mgcj = {
963 .dram_type = SPD_DRAM_TYPE_LPDDR4,
964
965 .module_size_mbits = 8192,
966 .num_ranks = 1,
967 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700968 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700969
970 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
971 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
972
973 .part_num =
974 { 'K', '4', 'F', '8', 'E', '3', '0', '4', 'H', 'B', '-',
975 'M', 'G', 'C', 'J' },
976};
977
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800978const struct nonspd_mem_info samsung_lpddr4x_kmdh6001da_b422 = {
979 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
980
981 .module_size_mbits = 32768,
982 .num_ranks = 2,
983 .device_width = 32,
984 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
985
986 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
987 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
988
989 .part_num =
990 { 'K', 'M', 'D', 'H', '6', '0', '0', '1', 'D', 'A', '-',
991 'B', '4', '2', '2' },
992};
993
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800994const struct nonspd_mem_info samsung_lpddr4x_kmdp6001da_b425 = {
995 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
996
997 .module_size_mbits = 32768,
998 .num_ranks = 2,
999 .device_width = 32,
1000 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1001
1002 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1003 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1004
1005 .part_num =
1006 { 'K', 'M', 'D', 'P', '6', '0', '0', '1', 'D', 'A', '-',
1007 'B', '4', '2', '5' },
1008};
1009
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001010const struct nonspd_mem_info samsung_lpddr4x_kmdv6001da_b620 = {
1011 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1012
1013 .module_size_mbits = 32768,
1014 .num_ranks = 2,
1015 .device_width = 32,
1016 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1017
1018 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1019 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1020
1021 .part_num =
1022 { 'K', 'M', 'D', 'V', '6', '0', '0', '1', 'D', 'A', '-',
1023 'B', '6', '2', '0' },
1024};
1025
1026const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4am_mgcj = {
1027 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1028
1029 .module_size_mbits = 32768,
1030 .num_ranks = 2,
1031 .device_width = 32,
1032 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1033
1034 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1035 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1036
1037 .part_num =
1038 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'M', '-',
1039 'M', 'G', 'C', 'J' },
1040};
1041
cherish8851df02019-09-01 14:35:55 +08001042const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcl = {
1043 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1044
1045 .module_size_mbits = 32768,
1046 .num_ranks = 2,
1047 .device_width = 32,
1048 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1049
1050 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1051 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1052
1053 .part_num =
1054 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
1055 'M', 'G', 'C', 'L' },
1056};
1057
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001058static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgch = {
1059 .dram_type = SPD_DRAM_TYPE_LPDDR4,
1060
1061 .module_size_mbits = 8192,
1062 .num_ranks = 1,
1063 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -07001064 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001065
1066 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1067 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
1068
1069 .part_num =
1070 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
1071 'M', 'G', 'C', 'H' },
1072};
1073
Kaka Ni9db5d8a2019-07-05 12:13:33 +08001074const struct nonspd_mem_info sandisk_lpddr4x_sdada4cr_128g = {
1075 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
1076
1077 .module_size_mbits = 32768,
1078 .num_ranks = 2,
1079 .device_width = 32,
1080 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
1081
1082 .module_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1083 .dram_mfg_id = { .msb = 0x45, .lsb = 0x00 },
1084
1085 .part_num =
1086 { 'S', 'D', 'A', 'D', 'A', '4', 'C', 'R', '-', '1', '2',
1087 '8', 'G' },
1088};
1089
1090
Marco Chena18bbb22018-08-13 16:10:55 +08001091// This one is reserved for storing mem info from SMBIOS if no explicit entry
1092// was added above.
1093static struct nonspd_mem_info part_extracted_from_smbios = {
1094 .part_num =
1095 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
1096};
1097
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001098static const struct nonspd_mem_info *nospdmemory[] = {
1099 &elpida_lpddr3_edfa164a2ma_jd_f,
1100 &elpida_lpddr3_f8132a3ma_gd_f,
1101 &elpida_lpddr3_fa232a2ma_gc_f,
1102 &hynix_ddr3l_h5tc4g63afr_pba,
1103 &hynix_ddr3l_h5tc4g63cfr_pba,
Zheng Pan56c19e52018-10-23 17:01:11 -07001104 &hynix_ddr3l_h5tc4g63efr_rda,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001105 &hynix_lpddr3_h9ccnnn8gtmlar_nud,
Jack Rosenthal956a5b42020-05-06 14:26:32 -06001106 &hynix_lpddr3_h9ccnnn8jtblar_nud,
Milton Chiang5664fe32016-11-29 14:59:49 +08001107 &hynix_lpddr3_h9ccnnnbjtalar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001108 &hynix_lpddr3_h9ccnnnbjtmlar_nud,
Jack Rosenthal73a32f32020-05-07 08:24:48 -06001109 &hynix_lpddr3_h9ccnnncltmlar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001110 &hynix_ddr3l_h5tc8g63amr_pba,
1111 &hynix_lpddr3_h9ccnnnbptblbr_nud,
1112 &hynix_lpddr3_h9ccnnnbltblar_nud,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001113 &hynix_lpddr3_h9ccnnnbktmlbr_ntd,
Kevin Chiu55250dd2016-11-08 17:21:23 +08001114 &hynix_lpddr4_h9hcnnn8kumlhr,
1115 &hynix_lpddr4_h9hcnnnbpumlhr,
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +08001116 &hynix_lpddr4x_h9hcnnncpmalhr_nee,
Jack Rosenthal7bdaff92020-05-06 13:04:59 -06001117 &micron_lpddr3_mt52l256m32d1pf107,
Jack Rosenthal10611d32020-05-06 12:46:38 -06001118 &micron_lpddr3_mt52l256m32d1pf_10,
Marco Chena18bbb22018-08-13 16:10:55 +08001119 &micron_lpddr3_mt52l256m32d1pf_107wtb,
1120 &micron_lpddr3_mt52l256m64d2pp_107wtb,
1121 &micron_lpddr3_mt52l512m32d2pf_107wtb,
Jack Rosenthal1ca003d2020-05-07 09:04:54 -06001122 &micron_lpddr3_mt52l512m32d2pf_10,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001123 &micron_lpddr4_mt53b256m32d1np,
1124 &micron_lpddr4_mt53b512m32d2np,
ren kuoc9202c92018-05-14 19:46:20 +08001125 &micron_lpddr4_mt53e512m32d2np,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001126 &micron_lpddr4x_mt29vzzzad8dqksl,
Kaka Niae6ece42019-02-26 09:55:57 +08001127 &micron_lpddr4x_mt53e1g32d4nq_046wte,
Bob Moraguesfdcf0552020-04-23 14:50:16 -07001128 &micron_lpddr4x_mt53e1g32d2np_046wta,
1129 &micron_lpddr4x_mt53e2g32d4nq_046wta,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001130 &micron_mt41k256m16ha,
Milton Chiang5664fe32016-11-29 14:59:49 +08001131 &micron_mt52l256m32d1pf,
1132 &micron_mt52l512m32d2pf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001133 &nanya_ddr3l_nt5cc256m16dp_di,
Zheng Pan56c19e52018-10-23 17:01:11 -07001134 &nanya_ddr3l_nt5cc256m16er_ek,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001135 &samsung_k4b4g1646d,
1136 &samsung_k4b4g1646e,
Zheng Pan56c19e52018-10-23 17:01:11 -07001137 &samsung_k4b4g1646e_byma,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001138 &samsung_ddr3l_k4b4g1646d_byk0,
1139 &samsung_ddr3l_k4b4g1646q_hyk0,
1140 &samsung_ddr3l_k4b8g1646q_myk0,
1141 &samsung_lpddr3_k3qf2f20em_agce,
1142 &samsung_lpddr3_k4e6e304eb_egce,
Jack Rosenthal6b99a832020-05-06 15:34:10 -06001143 &samsung_lpddr3_k4e6e304ec_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001144 &samsung_lpddr3_k4e6e304ee_egce,
Jack Rosenthal4eccd7d2020-05-06 14:05:15 -06001145 &samsung_lpddr3_k4e6e304ee_egcf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001146 &samsung_lpddr3_k4e6e304eb_egcf,
1147 &samsung_lpddr3_k4e8e304ed_egcc,
1148 &samsung_lpddr3_k4e8e304ee_egce,
1149 &samsung_lpddr3_k4e8e324eb_egcf,
Jack Rosenthal7f5861c2020-05-07 07:30:55 -06001150 &samsung_lpddr3_k4ebe304eb_egcf,
Philip Chencccc7042018-09-25 20:31:37 -07001151 &samsung_lpddr4_k3uh5h50mm_agcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001152 &samsung_lpddr4_k4f6e304hb_mgch,
1153 &samsung_lpddr4_k4f6e304hb_mgcj,
ren kuo500c9c62018-05-24 17:57:50 +08001154 &samsung_lpddr4_k4f6e3s4hm_mgcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001155 &samsung_lpddr4_k4f8e304hb_mgcj,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001156 &samsung_lpddr4x_kmdh6001da_b422,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001157 &samsung_lpddr4x_kmdp6001da_b425,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001158 &samsung_lpddr4x_kmdv6001da_b620,
1159 &samsung_lpddr4x_k4ube3d4am_mgcj,
cherish8851df02019-09-01 14:35:55 +08001160 &samsung_lpddr4x_k4ube3d4aa_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001161 &sandisk_lpddr4x_sdada4cr_128g
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001162};
1163
Marco Chena18bbb22018-08-13 16:10:55 +08001164static int transfer_speed_from_smbios_to_nonspd_mem_info(
1165 struct smbios_table *table,
1166 struct nonspd_mem_info *info)
1167{
1168 for (int index = DDR_333; index < DDR_FREQ_MAX; index++) {
1169 if (table->data.mem_device.speed == atoi(ddr_freq_prettyprint[index])) {
1170 info->ddr_freq[0] = index;
1171 return 0;
1172 }
1173 }
1174
1175 lprintf(LOG_ERR, "%s: mem speed %hu in SMBIOS is out of range.",
1176 __func__, table->data.mem_device.speed);
1177 return -1;
1178}
1179
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001180enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
1181{
1182 switch (table->data.mem_device.type) {
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001183 case SMBIOS_MEMORY_TYPE_DDR3:
1184 return SPD_DRAM_TYPE_DDR3;
1185 case SMBIOS_MEMORY_TYPE_DDR4:
1186 return SPD_DRAM_TYPE_DDR4;
Paul Fagerburg1f3997c2019-05-17 09:31:29 -06001187 case SMBIOS_MEMORY_TYPE_LPDDR3:
1188 return SPD_DRAM_TYPE_LPDDR3;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001189 case SMBIOS_MEMORY_TYPE_LPDDR4:
1190 return SPD_DRAM_TYPE_LPDDR4;
1191 default:
1192 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
1193 __func__, table->data.mem_device.type);
1194 return 0;
1195 }
1196}
1197
Marco Chena18bbb22018-08-13 16:10:55 +08001198static int extract_mem_info_from_smbios(
1199 struct smbios_table *table,
1200 struct nonspd_mem_info *info)
1201{
1202 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +08001203 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +08001204 uint32_t size;
1205
Marco Chen05511cb2018-10-01 08:35:37 +08001206 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +08001207 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +08001208 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +08001209
1210 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +08001211 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +08001212 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
1213 "Or len of part number %lu is larger then buffer %lu."
1214 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +08001215 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +08001216 return -1;
1217 }
1218
1219 size = (table->data.mem_device.size & 0x7fff) * 8;
1220 info->module_size_mbits =
1221 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
1222
Marco Chen05511cb2018-10-01 08:35:37 +08001223 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001224
1225 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -08001226 info->num_ranks = table->data.mem_device.attributes & 0xf;
1227 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001228
Marco Chena18bbb22018-08-13 16:10:55 +08001229 return transfer_speed_from_smbios_to_nonspd_mem_info(table, info);
1230}
1231
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001232int spd_set_nonspd_info(struct platform_intf *intf,
1233 const struct nonspd_mem_info **info)
1234{
1235 int dimm = 0, index;
1236 struct smbios_table table;
1237
1238 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table,
1239 SMBIOS_LEGACY_ENTRY_BASE,
1240 SMBIOS_LEGACY_ENTRY_LEN) < 0) {
1241 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n"
1242 , __func__);
1243 return -1;
1244 }
1245
1246 for (index = 0; index < ARRAY_SIZE(nospdmemory); index++) {
1247 if (!strncmp(table.string[table.data.mem_device.part_number],
Brian Norrisd7384fb2018-04-30 11:05:23 -07001248 (const char *)nospdmemory[index]->part_num,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001249 sizeof(nospdmemory[index]->part_num))) {
1250 *info = nospdmemory[index];
1251 break;
1252 }
1253 }
1254
Marco Chena18bbb22018-08-13 16:10:55 +08001255 if (index < ARRAY_SIZE(nospdmemory)) {
1256 return 0;
1257 }
1258
1259 // memory device from SMBIOS is mapped into a nonspd_mem_info.
1260 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios)) {
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001261 return -1;
1262 }
1263
Marco Chena18bbb22018-08-13 16:10:55 +08001264 *info = &part_extracted_from_smbios;
1265
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001266 return 0;
1267}