blob: af8402f908b8eabbec9aecaaf6074ebe19ca8547 [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
Milton Chiang5664fe32016-11-29 14:59:49 +0800160const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtalar_nud = {
161 .dram_type = SPD_DRAM_TYPE_LPDDR3,
162 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
163
164 .module_size_mbits = 16384,
165 .num_ranks = 2,
166 .device_width = 32,
167 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
168
169 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
170 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
171
172 .part_num =
173 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'J', 'T', 'A', 'L',
174 'A', 'R', '-', 'N', 'U', 'D',},
175};
176
David Hendricks0fa54152016-03-16 15:08:56 -0700177const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800178 .dram_type = SPD_DRAM_TYPE_LPDDR3,
179 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
180
181 .module_size_mbits = 16384,
182 .num_ranks = 2,
183 .device_width = 32,
184 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
185
186 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
187 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
188
189 .part_num =
190 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'J', 'T', 'M', 'L',
191 'A', 'R', '-', 'N', 'U', 'D',},
192};
193
David Hendricks0fa54152016-03-16 15:08:56 -0700194const struct nonspd_mem_info hynix_ddr3l_h5tc8g63amr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800195 .dram_type = SPD_DRAM_TYPE_DDR3,
196 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
197 .module_size_mbits = 8192,
198 .num_ranks = 2,
199 .device_width = 16,
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 .serial_num = { 0, 0, 0, 0 },
206 .part_num =
207 { 'H', '5', 'T', 'C', '8', 'G', '6', '3', 'A', 'M', 'R', '-',
208 'P', 'B', 'A' },
209};
210
David Hendricks0fa54152016-03-16 15:08:56 -0700211const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbptblbr_nud = {
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800212 .dram_type = SPD_DRAM_TYPE_LPDDR3,
213 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
214
215 .module_size_mbits = 16384,
216 .num_ranks = 2,
217 .device_width = 32,
218 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
219
220 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
221 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
222
223 .part_num =
224 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'P', 'T', 'B', 'L',
225 'B', 'R', '-', 'N', 'U', 'D',},
226};
227
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800228const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbltblar_nud = {
229 .dram_type = SPD_DRAM_TYPE_LPDDR3,
230 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
231
232 .module_size_mbits = 16384,
233 .num_ranks = 2,
234 .device_width = 32,
235 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
236
237 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
238 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
239
240 .part_num =
241 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'L', 'T', 'B', 'L',
242 'A', 'R', '-', 'N', 'U', 'D',},
243};
244
Loop_Wu9ec61642019-01-29 14:28:34 +0800245const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbktmlbr_ntd = {
246 .dram_type = SPD_DRAM_TYPE_LPDDR3,
247 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
248
249 .module_size_mbits = 16384,
250 .num_ranks = 2,
251 .device_width = 32,
252 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
253
254 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
255 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
256
257 .part_num =
258 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'K', 'T', 'M', 'L',
259 'B', 'R', '-', 'N', 'T', 'D',},
260};
261
Kevin Chiu55250dd2016-11-08 17:21:23 +0800262const struct nonspd_mem_info hynix_lpddr4_h9hcnnn8kumlhr = {
263 .dram_type = SPD_DRAM_TYPE_LPDDR4,
264
265 .module_size_mbits = 8192,
266 .num_ranks = 1,
267 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700268 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Kevin Chiu55250dd2016-11-08 17:21:23 +0800269
270 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
271 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
272
273 .part_num =
274 { 'H', '9', 'H', 'C', 'N', 'N', 'N', '8', 'K', 'U', 'M', 'L',
275 'H', 'R',},
276};
277
278const struct nonspd_mem_info hynix_lpddr4_h9hcnnnbpumlhr = {
279 .dram_type = SPD_DRAM_TYPE_LPDDR4,
280
281 .module_size_mbits = 16384,
282 .num_ranks = 2,
283 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700284 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Kevin Chiu55250dd2016-11-08 17:21:23 +0800285
286 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
287 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
288
289 .part_num =
290 { 'H', '9', 'H', 'C', 'N', 'N', 'N', 'B', 'P', 'U', 'M', 'L',
291 'H', 'R',},
292};
293
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800294const struct nonspd_mem_info hynix_lpddr4x_h9hcnnncpmalhr_nee = {
295 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
296
297 .module_size_mbits = 32768,
298 .num_ranks = 2,
299 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700300 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +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', 'C', 'P', 'M', 'A', 'L',
307 'H', 'R', '-', 'N', 'E', 'E'},
308};
309
David Hendricks6638f872015-11-04 14:52:02 -0800310const struct nonspd_mem_info micron_mt41k256m16ha = {
311 .dram_type = SPD_DRAM_TYPE_DDR3,
312 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
313
314 .module_size_mbits = 4096,
315 .num_ranks = 1,
316 .device_width = 16,
317 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
318
319 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
320 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
321
322 .serial_num = { 0, 0, 0, 0 },
323 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
324 '1', '6', 'H', 'A', '-', '1', '2', '5' },
325};
326
Milton Chiang5664fe32016-11-29 14:59:49 +0800327const struct nonspd_mem_info micron_mt52l256m32d1pf = {
328 .dram_type = SPD_DRAM_TYPE_DDR3,
329 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
330
331 .module_size_mbits = 8192,
332 .num_ranks = 1,
333 .device_width = 32,
334 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
335
336 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
337 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
338
339 .serial_num = { 0, 0, 0, 0 },
340 .part_num = { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M',
341 '3', '2', 'D', '1', 'P', 'F', '-', '0', '9',
342 '3', 'W', 'T', ':', 'B' },
343};
344
345const struct nonspd_mem_info micron_mt52l512m32d2pf = {
346 .dram_type = SPD_DRAM_TYPE_DDR3,
347 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
348
349 .module_size_mbits = 16384,
350 .num_ranks = 2,
351 .device_width = 32,
352 .ddr_freq = { DDR_800, DDR_933, DDR_1067 },
353
354 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
355 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
356
357 .serial_num = { 0, 0, 0, 0 },
358 .part_num = { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M',
359 '3', '2', 'D', '2', 'P', 'F', '-', '0', '9',
360 '3', 'W', 'T', ':', 'B' },
361};
362
David Hendricks97303242015-11-11 14:41:40 -0800363const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
364 .dram_type = SPD_DRAM_TYPE_DDR3,
365 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
366
367 .module_size_mbits = 4096,
368 .num_ranks = 1,
369 .device_width = 16,
370 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
371 .ddr_freq = { DDR_667, DDR_800 },
372 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
373 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
374
375 .serial_num = { 0, 0, 0, 0 },
376 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
377 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
378};
379
Zheng Pan56c19e52018-10-23 17:01:11 -0700380const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16er_ek = {
381 .dram_type = SPD_DRAM_TYPE_DDR3,
382 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
383
384 .module_size_mbits = 4096,
385 .num_ranks = 1,
386 .device_width = 16,
387 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
388 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
389 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
390
391 .serial_num = { 0, 0, 0, 0 },
392 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
393 'M', '1', '6', 'E', 'R', '-', 'E', 'K' },
394};
395
David Hendricks6638f872015-11-04 14:52:02 -0800396const struct nonspd_mem_info samsung_k4b4g1646d = {
397 .dram_type = SPD_DRAM_TYPE_DDR3,
398 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
399
400 .module_size_mbits = 4096,
401 .num_ranks = 1,
402 .device_width = 16,
403 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
404
405 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
406 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
407
408 .serial_num = { 0, 0, 0, 0 },
409 .part_num =
410 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
411 '-', 'B', 'Y', 'K', '0' },
412};
413
414const struct nonspd_mem_info samsung_k4b4g1646e = {
415 .dram_type = SPD_DRAM_TYPE_DDR3,
416 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
417
418 .module_size_mbits = 4096,
419 .num_ranks = 1,
420 .device_width = 16,
421 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
422
423 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
424 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
425
426 .serial_num = { 0, 0, 0, 0 },
427 .part_num =
428 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
429 '-', 'B', 'Y', 'K', '0' },
430};
431
Zheng Pan56c19e52018-10-23 17:01:11 -0700432const struct nonspd_mem_info samsung_k4b4g1646e_byma = {
433 .dram_type = SPD_DRAM_TYPE_DDR3,
434 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
435
436 .module_size_mbits = 4096,
437 .num_ranks = 1,
438 .device_width = 16,
439 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
440
441 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
442 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
443
444 .serial_num = { 0, 0, 0, 0 },
445 .part_num =
446 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
447 '-', 'B', 'Y', 'M', 'A' },
448};
449
David Hendricks0fa54152016-03-16 15:08:56 -0700450const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800451 .dram_type = SPD_DRAM_TYPE_DDR3,
452 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
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
462 .serial_num = { 0, 0, 0, 0 },
463 .part_num =
464 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
465 'B', 'Y', 'K', '0' },
466};
467
David Hendricks0fa54152016-03-16 15:08:56 -0700468const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800469 .dram_type = SPD_DRAM_TYPE_DDR3,
470 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
471
472 .module_size_mbits = 4096,
473 .num_ranks = 1,
474 .device_width = 16,
475 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
476
477 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
478 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
479
480 .serial_num = { 0, 0, 0, 0 },
481 .part_num =
482 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
483 'H', 'Y', 'K', '0' },
484};
485
David Hendricks0fa54152016-03-16 15:08:56 -0700486const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800487 .dram_type = SPD_DRAM_TYPE_DDR3,
488 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
489 .module_size_mbits = 8192,
490 .num_ranks = 2,
491 .device_width = 16,
492 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
493
494 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
495 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
496
497 .serial_num = { 0, 0, 0, 0 },
498 .part_num =
499 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
500 'M', 'Y', 'K', '0' },
501};
502
David Hendricks0fa54152016-03-16 15:08:56 -0700503const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800504 .dram_type = SPD_DRAM_TYPE_LPDDR3,
505 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
506
507 .module_size_mbits = 8192,
508 .num_ranks = 2,
509 .device_width = 32,
510 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
511
512 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
513 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
514
515 .part_num =
516 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
517 'A', 'G', 'C', 'E' },
518};
519
Vincent Palatin90af8e62016-05-20 12:12:49 -0700520const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
521 .dram_type = SPD_DRAM_TYPE_LPDDR3,
522 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
523
524 .module_size_mbits = 16384,
525 .num_ranks = 2,
526 .device_width = 32,
527 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
528
529 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
530 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
531
532 .part_num =
533 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
534 'E', 'G', 'C', 'E' },
535};
536
David Hendricks0fa54152016-03-16 15:08:56 -0700537const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800538 .dram_type = SPD_DRAM_TYPE_LPDDR3,
539 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
540
541 .module_size_mbits = 16384,
542 .num_ranks = 2,
543 .device_width = 32,
544 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
545
546 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
547 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
548
549 .part_num =
550 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
551 'E', 'G', 'C', 'E' },
552};
553
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800554const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
555 .dram_type = SPD_DRAM_TYPE_LPDDR3,
556 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
557
558 .module_size_mbits = 16384,
559 .num_ranks = 2,
560 .device_width = 32,
561 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
562
563 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
564 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
565
566 .part_num =
567 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
568 'E', 'G', 'C', 'F' },
569};
570
David Hendricks0fa54152016-03-16 15:08:56 -0700571const struct nonspd_mem_info samsung_lpddr3_k4e8e304ed_egcc = {
David Hendricks6638f872015-11-04 14:52:02 -0800572 .dram_type = SPD_DRAM_TYPE_DDR3,
573 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
574
575 .module_size_mbits = 8192,
576 .num_ranks = 2,
577 .device_width = 32,
578 .ddr_freq = { DDR_533 },
579
580 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
581 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
582
583 .serial_num = { 0, 0, 0, 0 },
584 .part_num =
585 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'D', '-',
586 'E', 'G', 'C', 'C' },
587};
588
David Hendricks0fa54152016-03-16 15:08:56 -0700589const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800590 .dram_type = SPD_DRAM_TYPE_LPDDR3,
591 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
592
593 .module_size_mbits = 8192,
594 .num_ranks = 2,
595 .device_width = 32,
596 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
597
598 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
599 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
600
601 .part_num =
602 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
603 'E', 'G', 'C', 'E' },
604};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700605
606const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
607 .dram_type = SPD_DRAM_TYPE_LPDDR3,
608 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
609
610 .module_size_mbits = 8192,
611 .num_ranks = 2,
612 .device_width = 32,
613 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
614
615 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
616 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
617
618 .part_num =
619 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
620 'E', 'G', 'C', 'F' },
621};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700622
Loop Wue0fa3212016-12-01 16:25:41 +0800623const struct nonspd_mem_info micron_lpddr3_mt52l256m32d1pf_107wtb = {
624 .dram_type = SPD_DRAM_TYPE_LPDDR3,
625 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
626
627 .module_size_mbits = 8192,
628 .num_ranks = 1,
629 .device_width = 32,
630 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
631
632 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
633 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
634
635 .part_num =
636 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '3', '2', 'D',
637 '1', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
638};
639
jiazi Yang5e3d5942017-04-05 22:30:45 -0400640const struct nonspd_mem_info micron_lpddr3_mt52l256m64d2pp_107wtb = {
641 .dram_type = SPD_DRAM_TYPE_LPDDR3,
642 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
643
644 .module_size_mbits = 8192,
645 .num_ranks = 1,
646 .device_width = 32,
647 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
648
649 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
650 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
651
652 .part_num =
653 { 'M', 'T', '5', '2', 'L', '2', '5', '6', 'M', '6', '4', 'D',
654 '2', 'P', 'P', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
655};
656
Loop Wue0fa3212016-12-01 16:25:41 +0800657const struct nonspd_mem_info micron_lpddr3_mt52l512m32d2pf_107wtb = {
658 .dram_type = SPD_DRAM_TYPE_LPDDR3,
659 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
660
661 .module_size_mbits = 16384,
662 .num_ranks = 2,
663 .device_width = 32,
664 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
665
666 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
667 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
668
669 .part_num =
670 { 'M', 'T', '5', '2', 'L', '5', '1', '2', 'M', '3', '2', 'D',
671 '2', 'P', 'F', '-', '1', '0', '7', 'W', 'T', ':', 'B' },
672};
673
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700674static const struct nonspd_mem_info micron_lpddr4_mt53b256m32d1np = {
675 .dram_type = SPD_DRAM_TYPE_LPDDR4,
676
677 .module_size_mbits = 8192,
678 .num_ranks = 1,
679 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700680 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700681
682 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
683 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
684
685 .part_num =
686 { 'M', 'T', '5', '3', 'B', '2', '5', '6', 'M', '3', '2', 'D',
687 '1', 'N', 'P'},
688};
689
690static const struct nonspd_mem_info micron_lpddr4_mt53b512m32d2np = {
691 .dram_type = SPD_DRAM_TYPE_LPDDR4,
692
693 .module_size_mbits = 16384,
694 .num_ranks = 2,
695 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700696 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700697
698 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
699 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
700
701 .part_num =
702 { 'M', 'T', '5', '3', 'B', '5', '1', '2', 'M', '3', '2', 'D',
703 '2', 'N', 'P'},
704};
705
ren kuoc9202c92018-05-14 19:46:20 +0800706static const struct nonspd_mem_info micron_lpddr4_mt53e512m32d2np = {
707 .dram_type = SPD_DRAM_TYPE_LPDDR4,
708
709 .module_size_mbits = 16384,
710 .num_ranks = 2,
711 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700712 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuoc9202c92018-05-14 19:46:20 +0800713
714 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
715 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
716
717 .part_num =
718 { 'M', 'T', '5', '3', 'E', '5', '1', '2', 'M', '3', '2', 'D',
719 '2', 'N', 'P'},
720};
721
Kaka Niae6ece42019-02-26 09:55:57 +0800722const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d4nq_046wte = {
723 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
724
725 .module_size_mbits = 32768,
726 .num_ranks = 2,
727 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700728 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
Kaka Niae6ece42019-02-26 09:55:57 +0800729
730 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
731 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
732
733 .part_num =
734 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '4', 'N',
735 'Q', '-', '4', '6', 'W', 'T', ':', 'E'},
736};
737
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700738const struct nonspd_mem_info micron_lpddr4x_mt53e1g32d2np_046wta = {
739 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
740
741 .module_size_mbits = 32768,
742 .num_ranks = 1,
743 .device_width = 32,
744 .ddr_freq = { DDR_2133 },
745
746 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
747 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
748
749 .part_num =
750 { 'M', 'T', '5', '3', 'E', '1', 'G', '3', '2', 'D', '2', 'N',
751 'P', '-', '4', '6', 'W', 'T', ':', 'A'},
752};
753
754const struct nonspd_mem_info micron_lpddr4x_mt53e2g32d4nq_046wta = {
755 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
756
757 .module_size_mbits = 32768,
758 .num_ranks = 2,
759 .device_width = 32,
760 .ddr_freq = { DDR_2133 },
761
762 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
763 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
764
765 .part_num =
766 { 'M', 'T', '5', '3', 'E', '2', 'G', '3', '2', 'D', '4', 'N',
767 'Q', '-', '4', '6', 'W', 'T', ':', 'A'},
768};
769
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800770const struct nonspd_mem_info micron_lpddr4x_mt29vzzzad8dqksl = {
771 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
772
773 .module_size_mbits = 32768,
774 .num_ranks = 2,
775 .device_width = 32,
776 .ddr_freq = { DDR_800, DDR_1200, DDR_1600 },
777
778 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
779 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
780
781 .part_num =
782 { 'M', 'T', '2', '9', 'V', 'Z', 'Z', 'Z', 'A', 'D', '8', 'D',
783 'Q', 'K', 'S', 'L'},
784};
785
Philip Chencccc7042018-09-25 20:31:37 -0700786const struct nonspd_mem_info samsung_lpddr4_k3uh5h50mm_agcj = {
787 .dram_type = SPD_DRAM_TYPE_LPDDR4,
788
789 .module_size_mbits = 32768,
790 .num_ranks = 2,
791 .device_width = 32,
792 .ddr_freq = { DDR_1355 },
793
794 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
795 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
796
797 .part_num =
798 { 'K', '3', 'U', 'H', '5', 'H', '5', '0', 'M', 'M', '-',
799 'A', 'G', 'C', 'J' },
800};
801
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700802static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgcj = {
803 .dram_type = SPD_DRAM_TYPE_LPDDR4,
804
805 .module_size_mbits = 16384,
806 .num_ranks = 2,
807 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700808 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700809
810 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
811 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
812
813 .part_num =
814 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
815 'M', 'G', 'C', 'J' },
816};
817
ren kuo500c9c62018-05-24 17:57:50 +0800818static const struct nonspd_mem_info samsung_lpddr4_k4f6e3s4hm_mgcj = {
819 .dram_type = SPD_DRAM_TYPE_LPDDR4,
820
821 .module_size_mbits = 16384,
822 .num_ranks = 1,
823 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700824 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
ren kuo500c9c62018-05-24 17:57:50 +0800825
826 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
827 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
828
829 .part_num =
830 { 'K', '4', 'F', '6', 'E', '3', 'S', '4', 'H', 'M', '-',
831 'M', 'G', 'C', 'J' },
832};
833
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700834static const struct nonspd_mem_info samsung_lpddr4_k4f8e304hb_mgcj = {
835 .dram_type = SPD_DRAM_TYPE_LPDDR4,
836
837 .module_size_mbits = 8192,
838 .num_ranks = 1,
839 .device_width = 32,
Philip Chen0bf30ae2019-04-22 21:11:54 -0700840 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700841
842 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
843 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
844
845 .part_num =
846 { 'K', '4', 'F', '8', 'E', '3', '0', '4', 'H', 'B', '-',
847 'M', 'G', 'C', 'J' },
848};
849
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800850const struct nonspd_mem_info samsung_lpddr4x_kmdh6001da_b422 = {
851 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
852
853 .module_size_mbits = 32768,
854 .num_ranks = 2,
855 .device_width = 32,
856 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
857
858 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
859 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
860
861 .part_num =
862 { 'K', 'M', 'D', 'H', '6', '0', '0', '1', 'D', 'A', '-',
863 'B', '4', '2', '2' },
864};
865
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800866const struct nonspd_mem_info samsung_lpddr4x_kmdp6001da_b425 = {
867 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
868
869 .module_size_mbits = 32768,
870 .num_ranks = 2,
871 .device_width = 32,
872 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
873
874 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
875 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
876
877 .part_num =
878 { 'K', 'M', 'D', 'P', '6', '0', '0', '1', 'D', 'A', '-',
879 'B', '4', '2', '5' },
880};
881
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +0800882const struct nonspd_mem_info samsung_lpddr4x_kmdv6001da_b620 = {
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_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
889
890 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
891 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
892
893 .part_num =
894 { 'K', 'M', 'D', 'V', '6', '0', '0', '1', 'D', 'A', '-',
895 'B', '6', '2', '0' },
896};
897
898const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4am_mgcj = {
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_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
905
906 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
907 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
908
909 .part_num =
910 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'M', '-',
911 'M', 'G', 'C', 'J' },
912};
913
cherish8851df02019-09-01 14:35:55 +0800914const struct nonspd_mem_info samsung_lpddr4x_k4ube3d4aa_mgcl = {
915 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
916
917 .module_size_mbits = 32768,
918 .num_ranks = 2,
919 .device_width = 32,
920 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
921
922 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
923 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
924
925 .part_num =
926 { 'K', '4', 'U', 'B', 'E', '3', 'D', '4', 'A', 'A', '-',
927 'M', 'G', 'C', 'L' },
928};
929
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700930static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgch = {
931 .dram_type = SPD_DRAM_TYPE_LPDDR4,
932
933 .module_size_mbits = 8192,
934 .num_ranks = 1,
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', 'H' },
944};
945
Kaka Ni9db5d8a2019-07-05 12:13:33 +0800946const struct nonspd_mem_info sandisk_lpddr4x_sdada4cr_128g = {
947 .dram_type = SPD_DRAM_TYPE_LPDDR4X,
948
949 .module_size_mbits = 32768,
950 .num_ranks = 2,
951 .device_width = 32,
952 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1200},
953
954 .module_mfg_id = { .msb = 0x45, .lsb = 0x00 },
955 .dram_mfg_id = { .msb = 0x45, .lsb = 0x00 },
956
957 .part_num =
958 { 'S', 'D', 'A', 'D', 'A', '4', 'C', 'R', '-', '1', '2',
959 '8', 'G' },
960};
961
962
Marco Chena18bbb22018-08-13 16:10:55 +0800963// This one is reserved for storing mem info from SMBIOS if no explicit entry
964// was added above.
965static struct nonspd_mem_info part_extracted_from_smbios = {
966 .part_num =
967 { 'U', 'N', 'P', 'R', 'O', 'V', 'I', 'S', 'I', 'O', 'N', 'E', 'D'},
968};
969
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700970static const struct nonspd_mem_info *nospdmemory[] = {
971 &elpida_lpddr3_edfa164a2ma_jd_f,
972 &elpida_lpddr3_f8132a3ma_gd_f,
973 &elpida_lpddr3_fa232a2ma_gc_f,
974 &hynix_ddr3l_h5tc4g63afr_pba,
975 &hynix_ddr3l_h5tc4g63cfr_pba,
Zheng Pan56c19e52018-10-23 17:01:11 -0700976 &hynix_ddr3l_h5tc4g63efr_rda,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700977 &hynix_lpddr3_h9ccnnn8gtmlar_nud,
Milton Chiang5664fe32016-11-29 14:59:49 +0800978 &hynix_lpddr3_h9ccnnnbjtalar_nud,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700979 &hynix_lpddr3_h9ccnnnbjtmlar_nud,
980 &hynix_ddr3l_h5tc8g63amr_pba,
981 &hynix_lpddr3_h9ccnnnbptblbr_nud,
982 &hynix_lpddr3_h9ccnnnbltblar_nud,
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700983 &hynix_lpddr3_h9ccnnnbktmlbr_ntd,
Kevin Chiu55250dd2016-11-08 17:21:23 +0800984 &hynix_lpddr4_h9hcnnn8kumlhr,
985 &hynix_lpddr4_h9hcnnnbpumlhr,
Hsin-Yi, Wangafcacfb2019-01-17 19:23:10 +0800986 &hynix_lpddr4x_h9hcnnncpmalhr_nee,
Marco Chena18bbb22018-08-13 16:10:55 +0800987 &micron_lpddr3_mt52l256m32d1pf_107wtb,
988 &micron_lpddr3_mt52l256m64d2pp_107wtb,
989 &micron_lpddr3_mt52l512m32d2pf_107wtb,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700990 &micron_lpddr4_mt53b256m32d1np,
991 &micron_lpddr4_mt53b512m32d2np,
ren kuoc9202c92018-05-14 19:46:20 +0800992 &micron_lpddr4_mt53e512m32d2np,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +0800993 &micron_lpddr4x_mt29vzzzad8dqksl,
Kaka Niae6ece42019-02-26 09:55:57 +0800994 &micron_lpddr4x_mt53e1g32d4nq_046wte,
Bob Moraguesfdcf0552020-04-23 14:50:16 -0700995 &micron_lpddr4x_mt53e1g32d2np_046wta,
996 &micron_lpddr4x_mt53e2g32d4nq_046wta,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700997 &micron_mt41k256m16ha,
Milton Chiang5664fe32016-11-29 14:59:49 +0800998 &micron_mt52l256m32d1pf,
999 &micron_mt52l512m32d2pf,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001000 &nanya_ddr3l_nt5cc256m16dp_di,
Zheng Pan56c19e52018-10-23 17:01:11 -07001001 &nanya_ddr3l_nt5cc256m16er_ek,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001002 &samsung_k4b4g1646d,
1003 &samsung_k4b4g1646e,
Zheng Pan56c19e52018-10-23 17:01:11 -07001004 &samsung_k4b4g1646e_byma,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001005 &samsung_ddr3l_k4b4g1646d_byk0,
1006 &samsung_ddr3l_k4b4g1646q_hyk0,
1007 &samsung_ddr3l_k4b8g1646q_myk0,
1008 &samsung_lpddr3_k3qf2f20em_agce,
1009 &samsung_lpddr3_k4e6e304eb_egce,
1010 &samsung_lpddr3_k4e6e304ee_egce,
1011 &samsung_lpddr3_k4e6e304eb_egcf,
1012 &samsung_lpddr3_k4e8e304ed_egcc,
1013 &samsung_lpddr3_k4e8e304ee_egce,
1014 &samsung_lpddr3_k4e8e324eb_egcf,
Philip Chencccc7042018-09-25 20:31:37 -07001015 &samsung_lpddr4_k3uh5h50mm_agcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001016 &samsung_lpddr4_k4f6e304hb_mgch,
1017 &samsung_lpddr4_k4f6e304hb_mgcj,
ren kuo500c9c62018-05-24 17:57:50 +08001018 &samsung_lpddr4_k4f6e3s4hm_mgcj,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001019 &samsung_lpddr4_k4f8e304hb_mgcj,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001020 &samsung_lpddr4x_kmdh6001da_b422,
Hsin-Yi Wang4e357982019-06-04 16:54:59 +08001021 &samsung_lpddr4x_kmdp6001da_b425,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001022 &samsung_lpddr4x_kmdv6001da_b620,
1023 &samsung_lpddr4x_k4ube3d4am_mgcj,
cherish8851df02019-09-01 14:35:55 +08001024 &samsung_lpddr4x_k4ube3d4aa_mgcl,
Hsin-Yi Wang12ebb282019-07-05 12:31:10 +08001025 &sandisk_lpddr4x_sdada4cr_128g
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001026};
1027
Marco Chena18bbb22018-08-13 16:10:55 +08001028static int transfer_speed_from_smbios_to_nonspd_mem_info(
1029 struct smbios_table *table,
1030 struct nonspd_mem_info *info)
1031{
1032 for (int index = DDR_333; index < DDR_FREQ_MAX; index++) {
1033 if (table->data.mem_device.speed == atoi(ddr_freq_prettyprint[index])) {
1034 info->ddr_freq[0] = index;
1035 return 0;
1036 }
1037 }
1038
1039 lprintf(LOG_ERR, "%s: mem speed %hu in SMBIOS is out of range.",
1040 __func__, table->data.mem_device.speed);
1041 return -1;
1042}
1043
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001044enum spd_dram_type map_smbios_mem_type_to_spd(struct smbios_table *table)
1045{
1046 switch (table->data.mem_device.type) {
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001047 case SMBIOS_MEMORY_TYPE_DDR3:
1048 return SPD_DRAM_TYPE_DDR3;
1049 case SMBIOS_MEMORY_TYPE_DDR4:
1050 return SPD_DRAM_TYPE_DDR4;
Paul Fagerburg1f3997c2019-05-17 09:31:29 -06001051 case SMBIOS_MEMORY_TYPE_LPDDR3:
1052 return SPD_DRAM_TYPE_LPDDR3;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001053 case SMBIOS_MEMORY_TYPE_LPDDR4:
1054 return SPD_DRAM_TYPE_LPDDR4;
1055 default:
1056 lprintf(LOG_ERR, "%s: Unknown SMBIOS memory type: %d\n",
1057 __func__, table->data.mem_device.type);
1058 return 0;
1059 }
1060}
1061
Marco Chena18bbb22018-08-13 16:10:55 +08001062static int extract_mem_info_from_smbios(
1063 struct smbios_table *table,
1064 struct nonspd_mem_info *info)
1065{
1066 const char *smbios_part_num;
Marco Chen05511cb2018-10-01 08:35:37 +08001067 size_t smbios_part_num_len, max_part_num_len;
Marco Chena18bbb22018-08-13 16:10:55 +08001068 uint32_t size;
1069
Marco Chen05511cb2018-10-01 08:35:37 +08001070 max_part_num_len = sizeof(info->part_num) - 1;
Marco Chena18bbb22018-08-13 16:10:55 +08001071 smbios_part_num = table->string[table->data.mem_device.part_number];
Marco Chen05511cb2018-10-01 08:35:37 +08001072 smbios_part_num_len = strlen(smbios_part_num);
Marco Chena18bbb22018-08-13 16:10:55 +08001073
1074 if (!smbios_part_num_len ||
Marco Chen05511cb2018-10-01 08:35:37 +08001075 smbios_part_num_len > max_part_num_len) {
Marco Chena18bbb22018-08-13 16:10:55 +08001076 lprintf(LOG_ERR, "%s: SMBIOS Memory info table: part num is missing. "
1077 "Or len of part number %lu is larger then buffer %lu."
1078 , __func__, (unsigned long)smbios_part_num_len,
Marco Chen05511cb2018-10-01 08:35:37 +08001079 (unsigned long)max_part_num_len);
Marco Chena18bbb22018-08-13 16:10:55 +08001080 return -1;
1081 }
1082
1083 size = (table->data.mem_device.size & 0x7fff) * 8;
1084 info->module_size_mbits =
1085 (table->data.mem_device.size & 0x8000 ? size * 1024 : size);
1086
Marco Chen05511cb2018-10-01 08:35:37 +08001087 strncpy((char *)info->part_num, smbios_part_num, max_part_num_len);
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001088
1089 info->dram_type = map_smbios_mem_type_to_spd(table);
Francois Toguoce08eb02019-02-04 17:34:55 -08001090 info->num_ranks = table->data.mem_device.attributes & 0xf;
1091 info->device_width = table->data.mem_device.data_width;
Furquan Shaikh8866b2c2018-11-29 17:56:19 -08001092
Marco Chena18bbb22018-08-13 16:10:55 +08001093 return transfer_speed_from_smbios_to_nonspd_mem_info(table, info);
1094}
1095
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001096int spd_set_nonspd_info(struct platform_intf *intf,
1097 const struct nonspd_mem_info **info)
1098{
1099 int dimm = 0, index;
1100 struct smbios_table table;
1101
1102 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table,
1103 SMBIOS_LEGACY_ENTRY_BASE,
1104 SMBIOS_LEGACY_ENTRY_LEN) < 0) {
1105 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n"
1106 , __func__);
1107 return -1;
1108 }
1109
1110 for (index = 0; index < ARRAY_SIZE(nospdmemory); index++) {
1111 if (!strncmp(table.string[table.data.mem_device.part_number],
Brian Norrisd7384fb2018-04-30 11:05:23 -07001112 (const char *)nospdmemory[index]->part_num,
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001113 sizeof(nospdmemory[index]->part_num))) {
1114 *info = nospdmemory[index];
1115 break;
1116 }
1117 }
1118
Marco Chena18bbb22018-08-13 16:10:55 +08001119 if (index < ARRAY_SIZE(nospdmemory)) {
1120 return 0;
1121 }
1122
1123 // memory device from SMBIOS is mapped into a nonspd_mem_info.
1124 if (extract_mem_info_from_smbios(&table, &part_extracted_from_smbios)) {
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001125 return -1;
1126 }
1127
Marco Chena18bbb22018-08-13 16:10:55 +08001128 *info = &part_extracted_from_smbios;
1129
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -07001130 return 0;
1131}