coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
raminit.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <device/pci_ops.h>
4 #include <device/smbus_host.h>
5 #include <cbmem.h>
6 #include <cf9_reset.h>
7 #include <console/console.h>
8 #include <arch/cpu.h>
9 #include <spd.h>
10 #include <string.h>
11 #include <device/dram/ddr2.h>
12 #include <device/dram/ddr3.h>
13 #include <mrc_cache.h>
14 #include <timestamp.h>
15 #include <types.h>
16 
17 #include "raminit.h"
18 #include "x4x.h"
19 
20 #define MRC_CACHE_VERSION 0
21 
22 static u16 ddr2_get_crc(u8 device, u8 len)
23 {
24  u8 raw_spd[128] = {};
25  i2c_eeprom_read(device, 64, 9, &raw_spd[64]);
26  i2c_eeprom_read(device, 93, 6, &raw_spd[93]);
27  return spd_ddr2_calc_unique_crc(raw_spd, len);
28 }
29 
30 static u16 ddr3_get_crc(u8 device, u8 len)
31 {
32  u8 raw_spd[256] = {};
33  i2c_eeprom_read(device, 117, 11, &raw_spd[117]);
34  return spd_ddr3_calc_unique_crc(raw_spd, len);
35 }
36 
37 static enum cb_err verify_spds(const u8 *spd_map, const struct sysinfo *ctrl_cached)
38 {
39  int i;
40  u16 crc;
41 
42  for (i = 0; i < TOTAL_DIMMS; i++) {
43  if (!(spd_map[i]))
44  continue;
45  int len = smbus_read_byte(spd_map[i], 0);
46  if (len < 0 && ctrl_cached->dimms[i].card_type == RAW_CARD_UNPOPULATED)
47  continue;
48  if (len > 0 && ctrl_cached->dimms[i].card_type == RAW_CARD_UNPOPULATED)
49  return CB_ERR;
50 
51  if (ctrl_cached->spd_type == DDR2)
52  crc = ddr2_get_crc(spd_map[i], len);
53  else
54  crc = ddr3_get_crc(spd_map[i], len);
55 
56  if (crc != ctrl_cached->dimms[i].spd_crc)
57  return CB_ERR;
58  }
59  return CB_SUCCESS;
60 }
61 
62 struct abs_timings {
75 };
76 
77 #define CTRL_MIN_TCLK_DDR2 TCK_400MHZ
78 
79 static void select_cas_dramfreq_ddr2(struct sysinfo *s, const struct abs_timings *saved_timings)
80 {
81  u8 try_cas;
82  /* Currently only these CAS are supported */
84 
85  cas_mask &= saved_timings->cas_supported;
86  try_cas = spd_get_msbs(cas_mask);
87 
88  while (cas_mask & (1 << try_cas) && try_cas > 0) {
89  s->selected_timings.CAS = try_cas;
90  s->selected_timings.tclk = saved_timings->min_tCLK_cas[try_cas];
91  if (s->selected_timings.tclk >= CTRL_MIN_TCLK_DDR2 &&
92  saved_timings->min_tCLK_cas[try_cas] !=
93  saved_timings->min_tCLK_cas[try_cas - 1])
94  break;
95  try_cas--;
96  }
97 
98  if ((s->selected_timings.CAS < 3) || (s->selected_timings.tclk == 0))
99  die("Could not find common memory frequency and CAS\n");
100 
101  switch (s->selected_timings.tclk) {
102  case TCK_200MHZ:
103  case TCK_266MHZ:
104  /* FIXME: this works on vendor BIOS */
105  die("Selected dram frequency not supported\n");
106  case TCK_333MHZ:
107  s->selected_timings.mem_clk = MEM_CLOCK_667MHz;
108  break;
109  case TCK_400MHZ:
110  s->selected_timings.mem_clk = MEM_CLOCK_800MHz;
111  break;
112  }
113 }
114 
115 static void mchinfo_ddr2(struct sysinfo *s)
116 {
117  const u32 eax = cpuid_ext(0x04, 0).eax;
118  printk(BIOS_WARNING, "%d CPU cores\n", ((eax >> 26) & 0x3f) + 1);
119 
120  u32 capid = pci_read_config16(HOST_BRIDGE, 0xe8);
121  if (!(capid & (1<<(79-64))))
122  printk(BIOS_WARNING, "iTPM enabled\n");
123 
124  capid = pci_read_config32(HOST_BRIDGE, 0xe4);
125  if (!(capid & (1<<(57-32))))
126  printk(BIOS_WARNING, "ME enabled\n");
127 
128  if (!(capid & (1<<(56-32))))
129  printk(BIOS_WARNING, "AMT enabled\n");
130 
131  if (!(capid & (1<<(48-32))))
132  printk(BIOS_WARNING, "VT-d enabled\n");
133 }
134 
135 static int ddr2_save_dimminfo(u8 dimm_idx, u8 *raw_spd,
136  struct abs_timings *saved_timings, struct sysinfo *s)
137 {
138  struct dimm_attr_ddr2_st decoded_dimm;
139  int i;
140 
141  if (spd_decode_ddr2(&decoded_dimm, raw_spd) != SPD_STATUS_OK) {
142  printk(BIOS_DEBUG, "Problems decoding SPD\n");
143  return CB_ERR;
144  }
145 
146  if (CONFIG(DEBUG_RAM_SETUP))
147  dram_print_spd_ddr2(&decoded_dimm);
148 
149  if (!(decoded_dimm.width & (0x08 | 0x10))) {
150 
151  printk(BIOS_ERR, "DIMM%d Unsupported width: x%d. Disabling dimm\n",
152  dimm_idx, s->dimms[dimm_idx].width);
153  return CB_ERR;
154  }
155  s->dimms[dimm_idx].width = (decoded_dimm.width >> 3) - 1;
156  /*
157  * This boils down to:
158  * "Except for the x16 configuration, all DDR2 devices have a
159  * 1KB page size. For the x16 configuration, the page size is 2KB
160  * for all densities except the 256Mb device, which has a 1KB page
161  * size." Micron, 'TN-47-16 Designing for High-Density DDR2 Memory'
162  * The formula is pagesize in KiB = width * 2^col_bits / 8.
163  */
164  s->dimms[dimm_idx].page_size = decoded_dimm.width * (1 << decoded_dimm.col_bits) / 8;
165 
166  switch (decoded_dimm.banks) {
167  case 4:
168  s->dimms[dimm_idx].n_banks = N_BANKS_4;
169  break;
170  case 8:
171  s->dimms[dimm_idx].n_banks = N_BANKS_8;
172  break;
173  default:
174  printk(BIOS_ERR, "DIMM%d Unsupported #banks: x%d. Disabling dimm\n",
175  dimm_idx, decoded_dimm.banks);
176  return CB_ERR;
177  }
178 
179  s->dimms[dimm_idx].ranks = decoded_dimm.ranks;
180  s->dimms[dimm_idx].rows = decoded_dimm.row_bits;
181  s->dimms[dimm_idx].cols = decoded_dimm.col_bits;
182 
183  saved_timings->cas_supported &= decoded_dimm.cas_supported;
184 
185  saved_timings->min_tRAS = MAX(saved_timings->min_tRAS, decoded_dimm.tRAS);
186  saved_timings->min_tRP = MAX(saved_timings->min_tRP, decoded_dimm.tRP);
187  saved_timings->min_tRCD = MAX(saved_timings->min_tRCD, decoded_dimm.tRCD);
188  saved_timings->min_tWR = MAX(saved_timings->min_tWR, decoded_dimm.tWR);
189  saved_timings->min_tRFC = MAX(saved_timings->min_tRFC, decoded_dimm.tRFC);
190  saved_timings->min_tWTR = MAX(saved_timings->min_tWTR, decoded_dimm.tWTR);
191  saved_timings->min_tRRD = MAX(saved_timings->min_tRRD, decoded_dimm.tRRD);
192  saved_timings->min_tRTP = MAX(saved_timings->min_tRTP, decoded_dimm.tRTP);
193  for (i = 0; i < 8; i++) {
194  if (!(saved_timings->cas_supported & (1 << i)))
195  saved_timings->min_tCLK_cas[i] = 0;
196  else
197  saved_timings->min_tCLK_cas[i] =
198  MAX(saved_timings->min_tCLK_cas[i],
199  decoded_dimm.cycle_time[i]);
200  }
201 
202  s->dimms[dimm_idx].spd_crc = spd_ddr2_calc_unique_crc(raw_spd,
203  spd_decode_spd_size_ddr2(raw_spd[0]));
204  return CB_SUCCESS;
205 }
206 
207 static void normalize_tCLK(u32 *tCLK)
208 {
209  if (*tCLK <= TCK_666MHZ)
210  *tCLK = TCK_666MHZ;
211  else if (*tCLK <= TCK_533MHZ)
212  *tCLK = TCK_533MHZ;
213  else if (*tCLK <= TCK_400MHZ)
214  *tCLK = TCK_400MHZ;
215  else
216  *tCLK = 0;
217 }
218 
219 static void select_cas_dramfreq_ddr3(struct sysinfo *s, struct abs_timings *saved_timings)
220 {
221  /*
222  * various constraints must be fulfilled:
223  * CAS * tCK < 20ns == 160MTB
224  * tCK_max >= tCK >= tCK_min
225  * CAS >= roundup(tAA_min/tCK)
226  * CAS supported
227  * AND BTW: Clock(MT) = 2000 / tCK(ns) - intel uses MTs but calls them MHz
228  */
229 
230  u32 min_tCLK;
231  u8 try_CAS;
232  u16 capid = (pci_read_config16(HOST_BRIDGE, 0xea) >> 4) & 0x3f;
233 
234  switch (s->max_fsb) {
235  default:
236  case FSB_CLOCK_800MHz:
237  min_tCLK = TCK_400MHZ;
238  break;
239  case FSB_CLOCK_1066MHz:
240  min_tCLK = TCK_533MHZ;
241  break;
242  case FSB_CLOCK_1333MHz:
243  min_tCLK = TCK_666MHZ;
244  break;
245  }
246 
247  switch (capid >> 3) {
248  default: /* Should not happen */
249  min_tCLK = TCK_400MHZ;
250  break;
251  case 1:
252  min_tCLK = MAX(min_tCLK, TCK_400MHZ);
253  break;
254  case 2:
255  min_tCLK = MAX(min_tCLK, TCK_533MHZ);
256  break;
257  case 3: /* Only on P45 */
258  case 0:
259  min_tCLK = MAX(min_tCLK, TCK_666MHZ);
260  break;
261  }
262 
263  min_tCLK = MAX(min_tCLK, saved_timings->min_tclk);
264  if (min_tCLK == 0) {
266  "DRAM frequency is under lowest supported frequency (400 MHz).\n"
267  "Increasing to 400 MHz as last resort.\n");
268  min_tCLK = TCK_400MHZ;
269  }
270 
271  while (1) {
272  normalize_tCLK(&min_tCLK);
273  if (min_tCLK == 0)
274  die("Couldn't find compatible clock / CAS settings.\n");
275  try_CAS = DIV_ROUND_UP(saved_timings->min_tAA, min_tCLK);
276  printk(BIOS_SPEW, "Trying CAS %u, tCK %u.\n", try_CAS, min_tCLK);
277  for (; try_CAS <= DDR3_MAX_CAS; try_CAS++) {
278  /*
279  * cas_supported is encoded like the SPD which starts
280  * at CAS=4.
281  */
282  if ((saved_timings->cas_supported << 4) & (1 << try_CAS))
283  break;
284  }
285  if ((try_CAS <= DDR3_MAX_CAS) && (try_CAS * min_tCLK < 20 * 256)) {
286  /* Found good CAS. */
287  printk(BIOS_SPEW, "Found compatible tCLK / CAS pair: %u / %u.\n",
288  min_tCLK, try_CAS);
289  break;
290  }
291  /*
292  * If no valid tCLK / CAS pair could be found for a tCLK
293  * increase it after which it gets normalised. This means
294  * that a lower frequency gets tried.
295  */
296  min_tCLK++;
297  }
298 
299  s->selected_timings.tclk = min_tCLK;
300  s->selected_timings.CAS = try_CAS;
301 
302  switch (s->selected_timings.tclk) {
303  case TCK_400MHZ:
304  s->selected_timings.mem_clk = MEM_CLOCK_800MHz;
305  break;
306  case TCK_533MHZ:
307  s->selected_timings.mem_clk = MEM_CLOCK_1066MHz;
308  break;
309  case TCK_666MHZ:
310  s->selected_timings.mem_clk = MEM_CLOCK_1333MHz;
311  break;
312  }
313 }
314 
315 /* With DDR3 and 533MHz mem clock and an enabled internal gfx device the display
316  is not usable in non stacked mode, so select stacked mode accordingly */
317 static void workaround_stacked_mode(struct sysinfo *s)
318 {
319  u32 deven;
320  /* Only a problem on DDR3 */
321  if (s->spd_type == DDR2)
322  return;
323  /* Does not matter if only one channel is populated */
324  if (!CHANNEL_IS_POPULATED(s->dimms, 0) || !CHANNEL_IS_POPULATED(s->dimms, 1))
325  return;
326  if (s->selected_timings.mem_clk != MEM_CLOCK_1066MHz)
327  return;
328  /* IGD0EN gets disabled if not present before this code runs */
330  if (deven & IGD0EN)
331  s->stacked_mode = 1;
332 }
333 
334 static int ddr3_save_dimminfo(u8 dimm_idx, u8 *raw_spd,
335  struct abs_timings *saved_timings, struct sysinfo *s)
336 {
337  struct dimm_attr_ddr3_st decoded_dimm;
338 
339  if (spd_decode_ddr3(&decoded_dimm, raw_spd) != SPD_STATUS_OK)
340  return CB_ERR;
341 
342  if (CONFIG(DEBUG_RAM_SETUP))
343  dram_print_spd_ddr3(&decoded_dimm);
344 
345  /* x4 DIMMs are not supported (true for both ddr2 and ddr3) */
346  if (!(decoded_dimm.width & (0x8 | 0x10))) {
347  printk(BIOS_ERR, "DIMM%d Unsupported width: x%d. Disabling dimm\n",
348  dimm_idx, s->dimms[dimm_idx].width);
349  return CB_ERR;
350  }
351  s->dimms[dimm_idx].width = (decoded_dimm.width >> 3) - 1;
352  /*
353  * This boils down to:
354  * "Except for the x16 configuration, all DDR3 devices have a
355  * 1KB page size. For the x16 configuration, the page size is 2KB
356  * for all densities except the 256Mb device, which has a 1KB page size."
357  * Micron, 'TN-47-16 Designing for High-Density DDR2 Memory'
358  */
359  s->dimms[dimm_idx].page_size = decoded_dimm.width * (1 << decoded_dimm.col_bits) / 8;
360 
361  s->dimms[dimm_idx].n_banks = N_BANKS_8; /* Always 8 banks on ddr3?? */
362 
363  s->dimms[dimm_idx].ranks = decoded_dimm.ranks;
364  s->dimms[dimm_idx].rows = decoded_dimm.row_bits;
365  s->dimms[dimm_idx].cols = decoded_dimm.col_bits;
366 
367  saved_timings->min_tRAS = MAX(saved_timings->min_tRAS, decoded_dimm.tRAS);
368  saved_timings->min_tRP = MAX(saved_timings->min_tRP, decoded_dimm.tRP);
369  saved_timings->min_tRCD = MAX(saved_timings->min_tRCD, decoded_dimm.tRCD);
370  saved_timings->min_tWR = MAX(saved_timings->min_tWR, decoded_dimm.tWR);
371  saved_timings->min_tRFC = MAX(saved_timings->min_tRFC, decoded_dimm.tRFC);
372  saved_timings->min_tWTR = MAX(saved_timings->min_tWTR, decoded_dimm.tWTR);
373  saved_timings->min_tRRD = MAX(saved_timings->min_tRRD, decoded_dimm.tRRD);
374  saved_timings->min_tRTP = MAX(saved_timings->min_tRTP, decoded_dimm.tRTP);
375  saved_timings->min_tAA = MAX(saved_timings->min_tAA, decoded_dimm.tAA);
376  saved_timings->cas_supported &= decoded_dimm.cas_supported;
377 
378  s->dimms[dimm_idx].spd_crc = spd_ddr3_calc_unique_crc(raw_spd, raw_spd[0]);
379 
380  s->dimms[dimm_idx].mirrored = decoded_dimm.flags.pins_mirrored;
381 
382  return CB_SUCCESS;
383 }
384 
385 static void select_discrete_timings(struct sysinfo *s, const struct abs_timings *timings)
386 {
387  s->selected_timings.tRAS = DIV_ROUND_UP(timings->min_tRAS, s->selected_timings.tclk);
388  s->selected_timings.tRP = DIV_ROUND_UP(timings->min_tRP, s->selected_timings.tclk);
389  s->selected_timings.tRCD = DIV_ROUND_UP(timings->min_tRCD, s->selected_timings.tclk);
390  s->selected_timings.tWR = DIV_ROUND_UP(timings->min_tWR, s->selected_timings.tclk);
391  s->selected_timings.tRFC = DIV_ROUND_UP(timings->min_tRFC, s->selected_timings.tclk);
392  s->selected_timings.tWTR = DIV_ROUND_UP(timings->min_tWTR, s->selected_timings.tclk);
393  s->selected_timings.tRRD = DIV_ROUND_UP(timings->min_tRRD, s->selected_timings.tclk);
394  s->selected_timings.tRTP = DIV_ROUND_UP(timings->min_tRTP, s->selected_timings.tclk);
395 }
396 static void print_selected_timings(struct sysinfo *s)
397 {
398  printk(BIOS_DEBUG, "Selected timings:\n");
399  printk(BIOS_DEBUG, "\tFSB: %dMHz\n", fsb_to_mhz(s->selected_timings.fsb_clk));
400  printk(BIOS_DEBUG, "\tDDR: %dMHz\n", ddr_to_mhz(s->selected_timings.mem_clk));
401 
402  printk(BIOS_DEBUG, "\tCAS: %d\n", s->selected_timings.CAS);
403  printk(BIOS_DEBUG, "\ttRAS: %d\n", s->selected_timings.tRAS);
404  printk(BIOS_DEBUG, "\ttRP: %d\n", s->selected_timings.tRP);
405  printk(BIOS_DEBUG, "\ttRCD: %d\n", s->selected_timings.tRCD);
406  printk(BIOS_DEBUG, "\ttWR: %d\n", s->selected_timings.tWR);
407  printk(BIOS_DEBUG, "\ttRFC: %d\n", s->selected_timings.tRFC);
408  printk(BIOS_DEBUG, "\ttWTR: %d\n", s->selected_timings.tWTR);
409  printk(BIOS_DEBUG, "\ttRRD: %d\n", s->selected_timings.tRRD);
410  printk(BIOS_DEBUG, "\ttRTP: %d\n", s->selected_timings.tRTP);
411 }
412 
413 static void find_fsb_speed(struct sysinfo *s)
414 {
416  case 0x0:
417  s->max_fsb = FSB_CLOCK_1066MHz;
418  break;
419  case 0x2:
420  s->max_fsb = FSB_CLOCK_800MHz;
421  break;
422  case 0x4:
423  s->max_fsb = FSB_CLOCK_1333MHz;
424  break;
425  default:
426  s->max_fsb = FSB_CLOCK_800MHz;
427  printk(BIOS_WARNING, "Can't detect FSB, setting 800MHz\n");
428  break;
429  }
430  s->selected_timings.fsb_clk = s->max_fsb;
431 }
432 
433 static void decode_spd_select_timings(struct sysinfo *s)
434 {
435  unsigned int device;
436  u8 dram_type_mask = (1 << DDR2) | (1 << DDR3);
437  u8 dimm_mask = 0;
438  u8 raw_spd[256];
439  int i, j;
440  struct abs_timings saved_timings;
441  memset(&saved_timings, 0, sizeof(saved_timings));
442  saved_timings.cas_supported = UINT32_MAX;
443 
444  FOR_EACH_DIMM(i) {
445  s->dimms[i].card_type = RAW_CARD_POPULATED;
446  device = s->spd_map[i];
447  if (!device) {
448  s->dimms[i].card_type = RAW_CARD_UNPOPULATED;
449  continue;
450  }
451  switch (smbus_read_byte(s->spd_map[i], SPD_MEMORY_TYPE)) {
452  case DDR2SPD:
453  dram_type_mask &= 1 << DDR2;
454  s->spd_type = DDR2;
455  break;
456  case DDR3SPD:
457  dram_type_mask &= 1 << DDR3;
458  s->spd_type = DDR3;
459  break;
460  default:
461  s->dimms[i].card_type = RAW_CARD_UNPOPULATED;
462  continue;
463  }
464  if (!dram_type_mask)
465  die("Mixing up dimm types is not supported!\n");
466 
467  printk(BIOS_DEBUG, "Decoding dimm %d\n", i);
468  if (i2c_eeprom_read(device, 0, 128, raw_spd) != 128) {
470  "i2c block operation failed, trying smbus byte operation.\n");
471  for (j = 0; j < 128; j++)
472  raw_spd[j] = smbus_read_byte(device, j);
473  }
474 
475  if (s->spd_type == DDR2){
476  if (ddr2_save_dimminfo(i, raw_spd, &saved_timings, s)) {
478  "Encountered problems with SPD, skipping this DIMM.\n");
479  s->dimms[i].card_type = RAW_CARD_UNPOPULATED;
480  continue;
481  }
482  } else { /* DDR3 */
483  if (ddr3_save_dimminfo(i, raw_spd, &saved_timings, s)) {
485  "Encountered problems with SPD, skipping this DIMM.\n");
486  /* something in decoded SPD was unsupported */
487  s->dimms[i].card_type = RAW_CARD_UNPOPULATED;
488  continue;
489  }
490  }
491  dimm_mask |= (1 << i);
492  }
493  if (!dimm_mask)
494  die("No memory installed.\n");
495 
496  if (s->spd_type == DDR2)
497  select_cas_dramfreq_ddr2(s, &saved_timings);
498  else
499  select_cas_dramfreq_ddr3(s, &saved_timings);
500  select_discrete_timings(s, &saved_timings);
502 }
503 
504 static void find_dimm_config(struct sysinfo *s)
505 {
506  int chan, i;
507 
508  FOR_EACH_POPULATED_CHANNEL(s->dimms, chan) {
509  FOR_EACH_POPULATED_DIMM_IN_CHANNEL(s->dimms, chan, i) {
510  int dimm_config;
511  if (s->dimms[i].ranks == 1) {
512  if (s->dimms[i].width == 0) /* x8 */
513  dimm_config = 1;
514  else /* x16 */
515  dimm_config = 3;
516  } else {
517  if (s->dimms[i].width == 0) /* x8 */
518  dimm_config = 2;
519  else
520  die("Dual-rank x16 not supported\n");
521  }
522  s->dimm_config[chan] |= dimm_config << (i % DIMMS_PER_CHANNEL) * 2;
523  }
524  printk(BIOS_DEBUG, " Config[CH%d] : %d\n", chan, s->dimm_config[chan]);
525  }
526 
527 }
528 
529 static void checkreset_ddr2(int boot_path)
530 {
531  u8 pmcon2;
532  u32 pmsts;
533 
534  if (boot_path >= 1) {
535  pmsts = mchbar_read32(PMSTS_MCHBAR);
536  if (!(pmsts & 1))
537  printk(BIOS_DEBUG, "Channel 0 possibly not in self refresh\n");
538  if (!(pmsts & 2))
539  printk(BIOS_DEBUG, "Channel 1 possibly not in self refresh\n");
540  }
541 
542  pmcon2 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa2);
543 
544  if (pmcon2 & 0x80) {
545  pmcon2 &= ~0x80;
546  pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, pmcon2);
547 
548  /* do magic 0xf0 thing. */
549  pci_and_config8(HOST_BRIDGE, 0xf0, ~(1 << 2));
550 
551  pci_or_config8(HOST_BRIDGE, 0xf0, (1 << 2));
552 
553  full_reset();
554  }
555  pmcon2 |= 0x80;
556  pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, pmcon2);
557 }
558 
559 /**
560  * @param boot_path: 0 = normal, 1 = reset, 2 = resume from s3
561  */
562 void sdram_initialize(int boot_path, const u8 *spd_map)
563 {
564  struct sysinfo s, *ctrl_cached;
565  u8 reg8;
566  int fast_boot, cbmem_was_inited;
567  size_t mrc_size;
568 
570  printk(BIOS_DEBUG, "Setting up RAM controller.\n");
571 
572  pci_write_config8(HOST_BRIDGE, 0xdf, 0xff);
573 
574  memset(&s, 0, sizeof(struct sysinfo));
575 
578  &mrc_size);
579 
580  if (!ctrl_cached || mrc_size < sizeof(s)) {
581  if (boot_path == BOOT_PATH_RESUME) {
582  /* Failed S3 resume, reset to come up cleanly */
583  system_reset();
584  } else if (boot_path == BOOT_PATH_WARM_RESET) {
585  /* On warm reset some of dram calibrations fail
586  and therefore requiring valid cached settings */
587  full_reset();
588  }
589  }
590 
591  /* verify MRC cache for fast boot */
592  if (boot_path != BOOT_PATH_RESUME && ctrl_cached) {
593  /* check SPD checksum to make sure the DIMMs haven't been replaced */
594  fast_boot = verify_spds(spd_map, ctrl_cached) == CB_SUCCESS;
595  if (!fast_boot) {
597  "SPD checksums don't match, dimm's have been replaced\n");
598  } else {
599  find_fsb_speed(&s);
600  fast_boot = s.max_fsb == ctrl_cached->max_fsb;
601  if (!fast_boot)
603  "CPU FSB does not match and has been replaced\n");
604  }
605  } else {
606  fast_boot = boot_path == BOOT_PATH_RESUME;
607  }
608 
609  if (fast_boot) {
610  printk(BIOS_DEBUG, "Using cached raminit settings\n");
611  memcpy(&s, ctrl_cached, sizeof(s));
612  s.boot_path = boot_path;
613  mchinfo_ddr2(&s);
615  } else {
616  s.boot_path = boot_path;
617  s.spd_map[0] = spd_map[0];
618  s.spd_map[1] = spd_map[1];
619  s.spd_map[2] = spd_map[2];
620  s.spd_map[3] = spd_map[3];
621  checkreset_ddr2(s.boot_path);
622 
623  /* Detect dimms per channel */
624  reg8 = pci_read_config8(HOST_BRIDGE, 0xe9);
625  printk(BIOS_DEBUG, "Dimms per channel: %d\n", (reg8 & 0x10) ? 1 : 2);
626 
627  mchinfo_ddr2(&s);
628 
629  find_fsb_speed(&s);
633  }
634 
635  do_raminit(&s, fast_boot);
636 
637  pci_and_config8(PCI_DEV(0, 0x1f, 0), 0xa2, (u8)~0x80);
638 
639  pci_or_config8(HOST_BRIDGE, 0xf4, 1);
640 
642 
643  printk(BIOS_DEBUG, "RAM initialization finished.\n");
644 
646 
647  cbmem_was_inited = !cbmem_recovery(s3resume);
648  if (!fast_boot)
650 
651  if (s3resume && !cbmem_was_inited) {
652  /* Failed S3 resume, reset to come up cleanly */
653  system_reset();
654  }
655 
656  printk(BIOS_DEBUG, "Memory initialized\n");
657 }
#define DIMMS_PER_CHANNEL
Definition: OemCustomize.c:6
static struct cpuid_result cpuid_ext(int op, unsigned int ecx)
Definition: cpu.h:59
void * memcpy(void *dest, const void *src, size_t n)
Definition: memcpy.c:7
void * memset(void *dstpp, int c, size_t len)
Definition: memset.c:12
#define MAX(a, b)
Definition: helpers.h:40
#define DIV_ROUND_UP(x, y)
Definition: helpers.h:60
cb_err
coreboot error codes
Definition: cb_err.h:15
@ CB_ERR
Generic error code.
Definition: cb_err.h:17
@ CB_SUCCESS
Call completed successfully.
Definition: cb_err.h:16
int cbmem_recovery(int s3resume)
Definition: imd_cbmem.c:125
void full_reset(void)
Definition: cf9_reset.c:45
void system_reset(void)
Definition: cf9_reset.c:37
enum fch_io_device device
Definition: fch.c:74
#define printk(level,...)
Definition: stdlib.h:16
void __noreturn die(const char *fmt,...)
Definition: die.c:17
u8 spd_get_msbs(u8 c)
Return index of MSB set.
Definition: ddr2.c:115
void dram_print_spd_ddr2(const struct dimm_attr_ddr2_st *dimm)
Print the info in DIMM.
Definition: ddr2.c:660
u16 spd_ddr2_calc_unique_crc(const u8 *spd, int len)
Calculate the CRC of a DDR2 SPD unique identifier.
Definition: ddr2.c:69
int spd_decode_ddr2(struct dimm_attr_ddr2_st *dimm, u8 spd[SPD_SIZE_MAX_DDR2])
Decode the raw SPD data.
Definition: ddr2.c:310
u32 spd_decode_spd_size_ddr2(u8 byte0)
Return size of SPD.
Definition: ddr2.c:89
Utilities for decoding DDR2 SPDs.
void dram_print_spd_ddr3(const struct dimm_attr_ddr3_st *dimm)
Print the info in DIMM.
Definition: ddr3.c:600
int spd_decode_ddr3(struct dimm_attr_ddr3_st *dimm, spd_raw_data spd)
Decode the raw SPD data.
Definition: ddr3.c:101
u16 spd_ddr3_calc_unique_crc(u8 *spd, int len)
Calculate the CRC of a DDR3 SPD unique identifier.
Definition: ddr3.c:74
@ CONFIG
Definition: dsi_common.h:201
static __always_inline uint32_t mchbar_read32(const uintptr_t offset)
Definition: fixed_bars.h:21
@ DDR3
Definition: gm45.h:53
@ DDR2
Definition: gm45.h:52
#define CLKCFG_MCHBAR
Definition: gm45.h:229
#define CLKCFG_FSBCLK_MASK
Definition: gm45.h:231
#define DDR3_MAX_CAS
Definition: gm45.h:153
#define CLKCFG_FSBCLK_SHIFT
Definition: gm45.h:230
@ FSB_CLOCK_800MHz
Definition: gm45.h:10
#define D0F0_DEVEN
Definition: gm45.h:177
#define PMSTS_MCHBAR
Definition: gm45.h:225
#define BOOT_PATH_RESUME
Definition: raminit.h:35
#define TCK_333MHZ
Definition: common.h:30
#define TCK_266MHZ
Definition: common.h:31
#define TCK_533MHZ
Definition: common.h:28
#define TCK_200MHZ
Definition: common.h:32
#define TCK_666MHZ
Definition: common.h:27
#define TCK_400MHZ
Definition: common.h:29
@ SPD_STATUS_OK
Definition: common.h:52
Utilities for decoding DDR3 SPDs.
static __always_inline void pci_and_config8(const struct device *dev, u16 reg, u8 andmask)
Definition: pci_ops.h:136
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
static __always_inline void pci_or_config8(const struct device *dev, u16 reg, u8 ormask)
Definition: pci_ops.h:169
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
static __always_inline u8 pci_read_config8(const struct device *dev, u16 reg)
Definition: pci_ops.h:46
static __always_inline void pci_write_config8(const struct device *dev, u16 reg, u8 val)
Definition: pci_ops.h:64
static int smbus_read_byte(struct device *const dev, u8 addr)
Definition: smbus.h:43
#define SPD_CAS_LATENCY_DDR2_5
Definition: spd.h:185
#define SPD_CAS_LATENCY_DDR2_6
Definition: spd.h:186
#define SPD_MEMORY_TYPE
Definition: spd.h:25
void timestamp_add_now(enum timestamp_id id)
Definition: timestamp.c:141
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition: loglevel.h:142
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
Definition: loglevel.h:86
int mrc_cache_stash_data(int type, uint32_t version, const void *data, size_t size)
Returns < 0 on error, 0 on success.
Definition: mrc_cache.c:687
void * mrc_cache_current_mmap_leak(int type, uint32_t version, size_t *data_size)
mrc_cache_mmap_leak
Definition: mrc_cache.c:342
@ MRC_TRAINING_DATA
Definition: mrc_cache.h:11
void sdram_initialize(void)
Definition: raminit.c:1692
#define FOR_EACH_POPULATED_CHANNEL(dimms, idx)
Definition: raminit.c:66
#define FOR_EACH_DIMM(idx)
Definition: raminit.c:57
#define CHANNEL_IS_POPULATED(dimms, idx)
Definition: raminit.c:61
#define TOTAL_DIMMS
Definition: raminit.c:44
static void workaround_stacked_mode(struct sysinfo *s)
Definition: raminit.c:317
static u16 ddr3_get_crc(u8 device, u8 len)
Definition: raminit.c:30
static void mchinfo_ddr2(struct sysinfo *s)
Definition: raminit.c:115
static int ddr3_save_dimminfo(u8 dimm_idx, u8 *raw_spd, struct abs_timings *saved_timings, struct sysinfo *s)
Definition: raminit.c:334
static void select_cas_dramfreq_ddr2(struct sysinfo *s, const struct abs_timings *saved_timings)
Definition: raminit.c:79
static void normalize_tCLK(u32 *tCLK)
Definition: raminit.c:207
static enum cb_err verify_spds(const u8 *spd_map, const struct sysinfo *ctrl_cached)
Definition: raminit.c:37
static void select_discrete_timings(struct sysinfo *s, const struct abs_timings *timings)
Definition: raminit.c:385
static void select_cas_dramfreq_ddr3(struct sysinfo *s, struct abs_timings *saved_timings)
Definition: raminit.c:219
static void find_dimm_config(struct sysinfo *s)
Definition: raminit.c:504
#define MRC_CACHE_VERSION
Definition: raminit.c:20
static void print_selected_timings(struct sysinfo *s)
Definition: raminit.c:396
#define CTRL_MIN_TCLK_DDR2
Definition: raminit.c:77
static u16 ddr2_get_crc(u8 device, u8 len)
Definition: raminit.c:22
static void decode_spd_select_timings(struct sysinfo *s)
Definition: raminit.c:433
static int ddr2_save_dimminfo(u8 dimm_idx, u8 *raw_spd, struct abs_timings *saved_timings, struct sysinfo *s)
Definition: raminit.c:135
static void find_fsb_speed(struct sysinfo *s)
Definition: raminit.c:413
static void checkreset_ddr2(int boot_path)
Definition: raminit.c:529
#define PCI_DEV(SEGBUS, DEV, FN)
Definition: pci_type.h:14
@ MEM_CLOCK_667MHz
Definition: raminit.h:18
@ MEM_CLOCK_800MHz
Definition: raminit.h:19
@ HOST_BRIDGE
Definition: reg_access.h:23
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
#define UINT32_MAX
Definition: stdint.h:67
uint8_t u8
Definition: stdint.h:45
u32 min_tRRD
Definition: raminit.c:70
u32 min_tRCD
Definition: raminit.c:66
u32 min_tRTP
Definition: raminit.c:71
u32 min_tWTR
Definition: raminit.c:69
u32 min_tRFC
Definition: raminit.c:68
u32 min_tclk
Definition: raminit.c:63
u32 min_tCLK_cas[8]
Definition: raminit.c:73
u32 min_tRP
Definition: raminit.c:65
u32 min_tWR
Definition: raminit.c:67
u32 min_tAA
Definition: raminit.c:72
u32 cas_supported
Definition: raminit.c:74
u32 min_tRAS
Definition: raminit.c:64
uint32_t eax
Definition: cpu.h:30
Definition: device.h:107
DIMM characteristics.
Definition: ddr2.h:88
u8 cas_supported
Definition: ddr2.h:94
u32 cycle_time[8]
Definition: ddr2.h:97
DIMM characteristics.
Definition: ddr3.h:106
union dimm_flags_ddr3_st flags
Definition: ddr3.h:111
u16 cas_supported
Definition: ddr3.h:109
unsigned int card_type
Definition: raminit.h:59
u16 spd_crc
Definition: raminit.h:167
struct dimminfo dimms[4]
Definition: raminit.h:114
int spd_type
Definition: raminit.h:111
u8 spd_map[4]
Definition: raminit.h:115
enum fsb_clock max_fsb
Definition: raminit.h:182
int s3resume
Definition: state_machine.h:31
int boot_path
Definition: raminit.h:100
u32 min_tRAS
Definition: raminit.c:275
u32 min_tRCD
Definition: raminit.c:277
u32 min_tRP
Definition: raminit.c:276
u32 min_tRFC
Definition: raminit.c:279
u32 min_tWR
Definition: raminit.c:278
#define s(param, src_bits, pmcreg, dst_bits)
@ TS_INITRAM_END
@ TS_INITRAM_START
unsigned int pins_mirrored
Definition: ddr3.h:70
u32 fsb_to_mhz(u32 speed)
Definition: raminit_ddr23.c:21
#define RAW_CARD_POPULATED
Definition: raminit.h:24
@ FSB_CLOCK_1066MHz
Definition: raminit.h:85
@ FSB_CLOCK_1333MHz
Definition: raminit.h:86
u32 ddr_to_mhz(u32 speed)
Definition: raminit_ddr23.c:26
@ N_BANKS_4
Definition: raminit.h:140
@ N_BANKS_8
Definition: raminit.h:141
@ DDR3SPD
Definition: raminit.h:105
@ DDR2SPD
Definition: raminit.h:104
#define RAW_CARD_UNPOPULATED
Definition: raminit.h:23
@ MEM_CLOCK_1333MHz
Definition: raminit.h:95
@ MEM_CLOCK_1066MHz
Definition: raminit.h:94
#define FOR_EACH_POPULATED_DIMM_IN_CHANNEL(dimms, ch, idx)
Definition: raminit.h:43
void do_raminit(struct sysinfo *, int fast_boot)
#define IGD0EN
Definition: host_bridge.h:14
#define BOOT_PATH_WARM_RESET
Definition: x4x.h:10