blob: f68951430d02920db66b9f67b52ee9440b43fbb8 [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
32#include "lib/nonspd.h"
33
David Hendricks0fa54152016-03-16 15:08:56 -070034const struct nonspd_mem_info elpida_lpddr3_edfa164a2ma_jd_f = {
David Hendricks6638f872015-11-04 14:52:02 -080035 .dram_type = SPD_DRAM_TYPE_LPDDR3,
36 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
37
38 .module_size_mbits = 8192,
39 .num_ranks = 2,
40 .device_width = 32,
41 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
42
43 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
44 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
45
46 .part_num =
47 { 'E', 'D', 'F', 'A', '1', '6', '4', 'A', '2', 'M', 'A', '-',
48 'J', 'D', '-', 'F',},
49};
50
David Hendricks0fa54152016-03-16 15:08:56 -070051const struct nonspd_mem_info elpida_lpddr3_f8132a3ma_gd_f = {
David Hendricks6638f872015-11-04 14:52:02 -080052 .dram_type = SPD_DRAM_TYPE_LPDDR3,
53 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
54
55 .module_size_mbits = 8192,
56 .num_ranks = 2,
57 .device_width = 32,
58 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
59
60 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
61 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
62
63 .part_num =
64 { 'F', '8', '1', '3', '2', 'A', '3', 'M', 'A', '-', 'G', 'D',
65 '-', 'F',},
66};
67
David Hendricks0fa54152016-03-16 15:08:56 -070068const struct nonspd_mem_info elpida_lpddr3_fa232a2ma_gc_f = {
David Hendricks6638f872015-11-04 14:52:02 -080069 .dram_type = SPD_DRAM_TYPE_LPDDR3,
70 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
71
72 .module_size_mbits = 16384,
73 .num_ranks = 2,
74 .device_width = 32,
75 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
76
77 .module_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
78 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x80 },
79
80 .part_num =
81 { 'F', 'A', '2', '3', '2', 'A', '2', 'M', 'A', '-', 'G', 'C',
82 '-', 'F',},
83};
84
David Hendricks0fa54152016-03-16 15:08:56 -070085const struct nonspd_mem_info hynix_ddr3l_h5tc4g63afr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -080086 .dram_type = SPD_DRAM_TYPE_DDR3,
87 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
88
89 .module_size_mbits = 4096,
90 .num_ranks = 1,
91 .device_width = 16,
92 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
93
94 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
95 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
96
97 .serial_num = { 0, 0, 0, 0 },
98 .part_num =
99 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'A', 'F', 'R', '-',
100 'P', 'B', 'A'},
101};
102
David Hendricks0fa54152016-03-16 15:08:56 -0700103const struct nonspd_mem_info hynix_ddr3l_h5tc4g63cfr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800104 .dram_type = SPD_DRAM_TYPE_DDR3,
105 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
106
107 .module_size_mbits = 4096,
108 .num_ranks = 1,
109 .device_width = 16,
110 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
111
112 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
113 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
114
115 .serial_num = { 0, 0, 0, 0 },
116 .part_num =
117 { 'H', '5', 'T', 'C', '4', 'G', '6', '3', 'C', 'F', 'R', '-',
118 'P', 'B', 'A'},
119};
120
David Hendricks0fa54152016-03-16 15:08:56 -0700121const struct nonspd_mem_info hynix_lpddr3_h9ccnnn8gtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800122 .dram_type = SPD_DRAM_TYPE_LPDDR3,
123 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
124
125 .module_size_mbits = 8192,
126 .num_ranks = 1,
127 .device_width = 32,
128 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
129
130 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
131 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
132
133 .part_num =
134 { 'H', '9', 'C', 'C', 'N', 'N', 'N', '8', 'G', 'T', 'M', 'L',
135 'A', 'R', '-', 'N', 'U', 'D',},
136};
137
David Hendricks0fa54152016-03-16 15:08:56 -0700138const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbjtmlar_nud = {
David Hendricks6638f872015-11-04 14:52:02 -0800139 .dram_type = SPD_DRAM_TYPE_LPDDR3,
140 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
141
142 .module_size_mbits = 16384,
143 .num_ranks = 2,
144 .device_width = 32,
145 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
146
147 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
148 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
149
150 .part_num =
151 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'J', 'T', 'M', 'L',
152 'A', 'R', '-', 'N', 'U', 'D',},
153};
154
David Hendricks0fa54152016-03-16 15:08:56 -0700155const struct nonspd_mem_info hynix_ddr3l_h5tc8g63amr_pba = {
David Hendricks6638f872015-11-04 14:52:02 -0800156 .dram_type = SPD_DRAM_TYPE_DDR3,
157 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
158 .module_size_mbits = 8192,
159 .num_ranks = 2,
160 .device_width = 16,
161 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
162
163 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
164 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
165
166 .serial_num = { 0, 0, 0, 0 },
167 .part_num =
168 { 'H', '5', 'T', 'C', '8', 'G', '6', '3', 'A', 'M', 'R', '-',
169 'P', 'B', 'A' },
170};
171
David Hendricks0fa54152016-03-16 15:08:56 -0700172const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbptblbr_nud = {
Loop Wu2a7e0fc2016-01-20 14:39:46 +0800173 .dram_type = SPD_DRAM_TYPE_LPDDR3,
174 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
175
176 .module_size_mbits = 16384,
177 .num_ranks = 2,
178 .device_width = 32,
179 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
180
181 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
182 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
183
184 .part_num =
185 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'P', 'T', 'B', 'L',
186 'B', 'R', '-', 'N', 'U', 'D',},
187};
188
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800189const struct nonspd_mem_info hynix_lpddr3_h9ccnnnbltblar_nud = {
190 .dram_type = SPD_DRAM_TYPE_LPDDR3,
191 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
192
193 .module_size_mbits = 16384,
194 .num_ranks = 2,
195 .device_width = 32,
196 .ddr_freq = { DDR_667, DDR_800, DDR_933 },
197
198 .module_mfg_id = { .msb = 0xad, .lsb = 0x80 },
199 .dram_mfg_id = { .msb = 0xad, .lsb = 0x80 },
200
201 .part_num =
202 { 'H', '9', 'C', 'C', 'N', 'N', 'N', 'B', 'L', 'T', 'B', 'L',
203 'A', 'R', '-', 'N', 'U', 'D',},
204};
205
David Hendricks6638f872015-11-04 14:52:02 -0800206const struct nonspd_mem_info micron_mt41k256m16ha = {
207 .dram_type = SPD_DRAM_TYPE_DDR3,
208 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
209
210 .module_size_mbits = 4096,
211 .num_ranks = 1,
212 .device_width = 16,
213 .ddr_freq = { DDR_533, DDR_667, DDR_800 },
214
215 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
216 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
217
218 .serial_num = { 0, 0, 0, 0 },
219 .part_num = { 'M', 'T', '4', '1', 'K', '2', '5', '6', 'M',
220 '1', '6', 'H', 'A', '-', '1', '2', '5' },
221};
222
David Hendricks97303242015-11-11 14:41:40 -0800223const struct nonspd_mem_info nanya_ddr3l_nt5cc256m16dp_di = {
224 .dram_type = SPD_DRAM_TYPE_DDR3,
225 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
226
227 .module_size_mbits = 4096,
228 .num_ranks = 1,
229 .device_width = 16,
230 /* CL = 11, CWL = 8, min = 1.25ns, max <1.5ns */
231 .ddr_freq = { DDR_667, DDR_800 },
232 .module_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
233 .dram_mfg_id = { .msb = 0x0b, .lsb = 0x03 },
234
235 .serial_num = { 0, 0, 0, 0 },
236 .part_num = { 'N', 'T', '5', 'C', 'C', '2', '5', '6',
237 'M', '1', '6', 'D', 'P', '-', 'D', 'I' },
238};
239
David Hendricks6638f872015-11-04 14:52:02 -0800240const struct nonspd_mem_info samsung_k4b4g1646d = {
241 .dram_type = SPD_DRAM_TYPE_DDR3,
242 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
243
244 .module_size_mbits = 4096,
245 .num_ranks = 1,
246 .device_width = 16,
247 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
248
249 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
250 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
251
252 .serial_num = { 0, 0, 0, 0 },
253 .part_num =
254 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D',
255 '-', 'B', 'Y', 'K', '0' },
256};
257
258const struct nonspd_mem_info samsung_k4b4g1646e = {
259 .dram_type = SPD_DRAM_TYPE_DDR3,
260 .module_type.ddr3_type = DDR3_MODULE_TYPE_UNDEFINED,
261
262 .module_size_mbits = 4096,
263 .num_ranks = 1,
264 .device_width = 16,
265 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
266
267 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
268 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
269
270 .serial_num = { 0, 0, 0, 0 },
271 .part_num =
272 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'E',
273 '-', 'B', 'Y', 'K', '0' },
274};
275
David Hendricks0fa54152016-03-16 15:08:56 -0700276const struct nonspd_mem_info samsung_ddr3l_k4b4g1646d_byk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800277 .dram_type = SPD_DRAM_TYPE_DDR3,
278 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
279
280 .module_size_mbits = 4096,
281 .num_ranks = 1,
282 .device_width = 16,
283 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
284
285 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
286 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
287
288 .serial_num = { 0, 0, 0, 0 },
289 .part_num =
290 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'D', '-',
291 'B', 'Y', 'K', '0' },
292};
293
David Hendricks0fa54152016-03-16 15:08:56 -0700294const struct nonspd_mem_info samsung_ddr3l_k4b4g1646q_hyk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800295 .dram_type = SPD_DRAM_TYPE_DDR3,
296 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
297
298 .module_size_mbits = 4096,
299 .num_ranks = 1,
300 .device_width = 16,
301 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
302
303 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
304 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
305
306 .serial_num = { 0, 0, 0, 0 },
307 .part_num =
308 { 'K', '4', 'B', '4', 'G', '1', '6', '4', '6', 'Q', '-',
309 'H', 'Y', 'K', '0' },
310};
311
David Hendricks0fa54152016-03-16 15:08:56 -0700312const struct nonspd_mem_info samsung_ddr3l_k4b8g1646q_myk0 = {
David Hendricks6638f872015-11-04 14:52:02 -0800313 .dram_type = SPD_DRAM_TYPE_DDR3,
314 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
315 .module_size_mbits = 8192,
316 .num_ranks = 2,
317 .device_width = 16,
318 .ddr_freq = { DDR_333, DDR_400, DDR_533, DDR_667, DDR_800 },
319
320 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
321 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
322
323 .serial_num = { 0, 0, 0, 0 },
324 .part_num =
325 { 'K', '4', 'B', '8', 'G', '1', '6', '4', '6', 'Q', '-',
326 'M', 'Y', 'K', '0' },
327};
328
David Hendricks0fa54152016-03-16 15:08:56 -0700329const struct nonspd_mem_info samsung_lpddr3_k3qf2f20em_agce = {
David Hendricks6638f872015-11-04 14:52:02 -0800330 .dram_type = SPD_DRAM_TYPE_LPDDR3,
331 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
332
333 .module_size_mbits = 8192,
334 .num_ranks = 2,
335 .device_width = 32,
336 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800 },
337
338 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
339 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
340
341 .part_num =
342 { 'K', '3', 'Q', 'F', '2', 'F', '2', '0', 'E', 'M', '-',
343 'A', 'G', 'C', 'E' },
344};
345
Vincent Palatin90af8e62016-05-20 12:12:49 -0700346const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egce = {
347 .dram_type = SPD_DRAM_TYPE_LPDDR3,
348 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
349
350 .module_size_mbits = 16384,
351 .num_ranks = 2,
352 .device_width = 32,
353 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
354
355 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
356 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
357
358 .part_num =
359 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
360 'E', 'G', 'C', 'E' },
361};
362
David Hendricks0fa54152016-03-16 15:08:56 -0700363const struct nonspd_mem_info samsung_lpddr3_k4e6e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800364 .dram_type = SPD_DRAM_TYPE_LPDDR3,
365 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
366
367 .module_size_mbits = 16384,
368 .num_ranks = 2,
369 .device_width = 32,
370 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
371
372 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
373 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
374
375 .part_num =
376 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'E', '-',
377 'E', 'G', 'C', 'E' },
378};
379
Milton Chiang1bcd0e62016-04-12 16:38:25 +0800380const struct nonspd_mem_info samsung_lpddr3_k4e6e304eb_egcf = {
381 .dram_type = SPD_DRAM_TYPE_LPDDR3,
382 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
383
384 .module_size_mbits = 16384,
385 .num_ranks = 2,
386 .device_width = 32,
387 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933},
388
389 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
390 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
391
392 .part_num =
393 { 'K', '4', 'E', '6', 'E', '3', '0', '4', 'E', 'B', '-',
394 'E', 'G', 'C', 'F' },
395};
396
David Hendricks0fa54152016-03-16 15:08:56 -0700397const struct nonspd_mem_info samsung_lpddr3_k4e8e304ed_egcc = {
David Hendricks6638f872015-11-04 14:52:02 -0800398 .dram_type = SPD_DRAM_TYPE_DDR3,
399 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
400
401 .module_size_mbits = 8192,
402 .num_ranks = 2,
403 .device_width = 32,
404 .ddr_freq = { DDR_533 },
405
406 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
407 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
408
409 .serial_num = { 0, 0, 0, 0 },
410 .part_num =
411 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'D', '-',
412 'E', 'G', 'C', 'C' },
413};
414
David Hendricks0fa54152016-03-16 15:08:56 -0700415const struct nonspd_mem_info samsung_lpddr3_k4e8e304ee_egce = {
David Hendricks6638f872015-11-04 14:52:02 -0800416 .dram_type = SPD_DRAM_TYPE_LPDDR3,
417 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
418
419 .module_size_mbits = 8192,
420 .num_ranks = 2,
421 .device_width = 32,
422 .ddr_freq = { DDR_400, DDR_533, DDR_667, DDR_800, DDR_933 },
423
424 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
425 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
426
427 .part_num =
428 { 'K', '4', 'E', '8', 'E', '3', '0', '4', 'E', 'E', '-',
429 'E', 'G', 'C', 'E' },
430};
Vincent Palatin90af8e62016-05-20 12:12:49 -0700431
432const struct nonspd_mem_info samsung_lpddr3_k4e8e324eb_egcf = {
433 .dram_type = SPD_DRAM_TYPE_LPDDR3,
434 .module_type.ddr3_type = DDR3_MODULE_TYPE_SO_DIMM,
435
436 .module_size_mbits = 8192,
437 .num_ranks = 2,
438 .device_width = 32,
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 .part_num =
445 { 'K', '4', 'E', '8', 'E', '3', '2', '4', 'E', 'B', '-',
446 'E', 'G', 'C', 'F' },
447};
Ravi Sarawadi7ef277d2016-08-16 17:04:00 -0700448
449static const struct nonspd_mem_info micron_lpddr4_mt53b256m32d1np = {
450 .dram_type = SPD_DRAM_TYPE_LPDDR4,
451
452 .module_size_mbits = 8192,
453 .num_ranks = 1,
454 .device_width = 32,
455 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
456
457 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
458 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
459
460 .part_num =
461 { 'M', 'T', '5', '3', 'B', '2', '5', '6', 'M', '3', '2', 'D',
462 '1', 'N', 'P'},
463};
464
465static const struct nonspd_mem_info micron_lpddr4_mt53b512m32d2np = {
466 .dram_type = SPD_DRAM_TYPE_LPDDR4,
467
468 .module_size_mbits = 16384,
469 .num_ranks = 2,
470 .device_width = 32,
471 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
472
473 .module_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
474 .dram_mfg_id = { .msb = 0x2c, .lsb = 0x00 },
475
476 .part_num =
477 { 'M', 'T', '5', '3', 'B', '5', '1', '2', 'M', '3', '2', 'D',
478 '2', 'N', 'P'},
479};
480
481static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgcj = {
482 .dram_type = SPD_DRAM_TYPE_LPDDR4,
483
484 .module_size_mbits = 16384,
485 .num_ranks = 2,
486 .device_width = 32,
487 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
488
489 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
490 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
491
492 .part_num =
493 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
494 'M', 'G', 'C', 'J' },
495};
496
497static const struct nonspd_mem_info samsung_lpddr4_k4f8e304hb_mgcj = {
498 .dram_type = SPD_DRAM_TYPE_LPDDR4,
499
500 .module_size_mbits = 8192,
501 .num_ranks = 1,
502 .device_width = 32,
503 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
504
505 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
506 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
507
508 .part_num =
509 { 'K', '4', 'F', '8', 'E', '3', '0', '4', 'H', 'B', '-',
510 'M', 'G', 'C', 'J' },
511};
512
513static const struct nonspd_mem_info samsung_lpddr4_k4f6e304hb_mgch = {
514 .dram_type = SPD_DRAM_TYPE_LPDDR4,
515
516 .module_size_mbits = 8192,
517 .num_ranks = 1,
518 .device_width = 32,
519 .ddr_freq = { DDR_667, DDR_800, DDR_933, DDR_1067, DDR_1400},
520
521 .module_mfg_id = { .msb = 0xce, .lsb = 0x00 },
522 .dram_mfg_id = { .msb = 0xce, .lsb = 0x00 },
523
524 .part_num =
525 { 'K', '4', 'F', '6', 'E', '3', '0', '4', 'H', 'B', '-',
526 'M', 'G', 'C', 'H' },
527};
528
529static const struct nonspd_mem_info *nospdmemory[] = {
530 &elpida_lpddr3_edfa164a2ma_jd_f,
531 &elpida_lpddr3_f8132a3ma_gd_f,
532 &elpida_lpddr3_fa232a2ma_gc_f,
533 &hynix_ddr3l_h5tc4g63afr_pba,
534 &hynix_ddr3l_h5tc4g63cfr_pba,
535 &hynix_lpddr3_h9ccnnn8gtmlar_nud,
536 &hynix_lpddr3_h9ccnnnbjtmlar_nud,
537 &hynix_ddr3l_h5tc8g63amr_pba,
538 &hynix_lpddr3_h9ccnnnbptblbr_nud,
539 &hynix_lpddr3_h9ccnnnbltblar_nud,
540 &micron_lpddr4_mt53b256m32d1np,
541 &micron_lpddr4_mt53b512m32d2np,
542 &micron_mt41k256m16ha,
543 &nanya_ddr3l_nt5cc256m16dp_di,
544 &samsung_k4b4g1646d,
545 &samsung_k4b4g1646e,
546 &samsung_ddr3l_k4b4g1646d_byk0,
547 &samsung_ddr3l_k4b4g1646q_hyk0,
548 &samsung_ddr3l_k4b8g1646q_myk0,
549 &samsung_lpddr3_k3qf2f20em_agce,
550 &samsung_lpddr3_k4e6e304eb_egce,
551 &samsung_lpddr3_k4e6e304ee_egce,
552 &samsung_lpddr3_k4e6e304eb_egcf,
553 &samsung_lpddr3_k4e8e304ed_egcc,
554 &samsung_lpddr3_k4e8e304ee_egce,
555 &samsung_lpddr3_k4e8e324eb_egcf,
556 &samsung_lpddr4_k4f6e304hb_mgch,
557 &samsung_lpddr4_k4f6e304hb_mgcj,
558 &samsung_lpddr4_k4f8e304hb_mgcj,
559};
560
561int spd_set_nonspd_info(struct platform_intf *intf,
562 const struct nonspd_mem_info **info)
563{
564 int dimm = 0, index;
565 struct smbios_table table;
566
567 if (smbios_find_table(intf, SMBIOS_TYPE_MEMORY, dimm, &table,
568 SMBIOS_LEGACY_ENTRY_BASE,
569 SMBIOS_LEGACY_ENTRY_LEN) < 0) {
570 lprintf(LOG_ERR, "%s: SMBIOS Memory info table missing\n"
571 , __func__);
572 return -1;
573 }
574
575 for (index = 0; index < ARRAY_SIZE(nospdmemory); index++) {
576 if (!strncmp(table.string[table.data.mem_device.part_number],
577 nospdmemory[index]->part_num,
578 sizeof(nospdmemory[index]->part_num))) {
579 *info = nospdmemory[index];
580 break;
581 }
582 }
583
584 if (index == ARRAY_SIZE(nospdmemory)) {
585 lprintf(LOG_ERR, "%s: non SPD info missing\n", __func__);
586 return -1;
587 }
588
589 return 0;
590}