1 /* This should be done by Eric
2 2004.11 yhlu add 4 rank DIMM support
3 2004.12 yhlu add D0 support
4 2005.02 yhlu add E0 memory hole support
7 #include <cpu/x86/cache.h>
8 #include <cpu/x86/mtrr.h>
13 #if CONFIG_HAVE_OPTION_TABLE
14 #include "option_table.h"
17 #if (CONFIG_RAMTOP & (CONFIG_RAMTOP -1)) != 0
18 # error "CONFIG_RAMTOP must be a power of 2"
21 void setup_resource_map(const unsigned int *register_values, int max)
24 // printk(BIOS_DEBUG, "setting up resource map....");
25 for (i = 0; i < max; i += 3) {
29 dev = register_values[i] & ~0xfff;
30 where = register_values[i] & 0xfff;
31 reg = pci_read_config32(dev, where);
32 reg &= register_values[i+1];
33 reg |= register_values[i+2];
34 pci_write_config32(dev, where, reg);
36 // printk(BIOS_DEBUG, "done.\n");
39 static int controller_present(const struct mem_controller *ctrl)
41 return pci_read_config32(ctrl->f0, 0) == 0x11001022;
44 #if CONFIG_RAMINIT_SYSINFO
45 static void sdram_set_registers(const struct mem_controller *ctrl, struct sys_info *sysinfo)
47 static void sdram_set_registers(const struct mem_controller *ctrl)
50 static const unsigned int register_values[] = {
52 /* Careful set limit registers before base registers which
53 contain the enables */
54 /* DRAM Limit i Registers
63 * [ 2: 0] Destination Node ID
73 * [10: 8] Interleave select
74 * specifies the values of A[14:12] to use with interleave enable.
76 * [31:16] DRAM Limit Address i Bits 39-24
77 * This field defines the upper address bits of a 40 bit address
78 * that define the end of the DRAM region.
80 PCI_ADDR(0, 0x18, 1, 0x44), 0x0000f8f8, 0x00000000,
81 PCI_ADDR(0, 0x18, 1, 0x4C), 0x0000f8f8, 0x00000001,
82 PCI_ADDR(0, 0x18, 1, 0x54), 0x0000f8f8, 0x00000002,
83 PCI_ADDR(0, 0x18, 1, 0x5C), 0x0000f8f8, 0x00000003,
84 PCI_ADDR(0, 0x18, 1, 0x64), 0x0000f8f8, 0x00000004,
85 PCI_ADDR(0, 0x18, 1, 0x6C), 0x0000f8f8, 0x00000005,
86 PCI_ADDR(0, 0x18, 1, 0x74), 0x0000f8f8, 0x00000006,
87 PCI_ADDR(0, 0x18, 1, 0x7C), 0x0000f8f8, 0x00000007,
88 /* DRAM Base i Registers
100 * [ 1: 1] Write Enable
101 * 0 = Writes Disabled
104 * [10: 8] Interleave Enable
105 * 000 = No interleave
106 * 001 = Interleave on A[12] (2 nodes)
108 * 011 = Interleave on A[12] and A[14] (4 nodes)
112 * 111 = Interleve on A[12] and A[13] and A[14] (8 nodes)
114 * [13:16] DRAM Base Address i Bits 39-24
115 * This field defines the upper address bits of a 40-bit address
116 * that define the start of the DRAM region.
118 PCI_ADDR(0, 0x18, 1, 0x40), 0x0000f8fc, 0x00000000,
119 PCI_ADDR(0, 0x18, 1, 0x48), 0x0000f8fc, 0x00000000,
120 PCI_ADDR(0, 0x18, 1, 0x50), 0x0000f8fc, 0x00000000,
121 PCI_ADDR(0, 0x18, 1, 0x58), 0x0000f8fc, 0x00000000,
122 PCI_ADDR(0, 0x18, 1, 0x60), 0x0000f8fc, 0x00000000,
123 PCI_ADDR(0, 0x18, 1, 0x68), 0x0000f8fc, 0x00000000,
124 PCI_ADDR(0, 0x18, 1, 0x70), 0x0000f8fc, 0x00000000,
125 PCI_ADDR(0, 0x18, 1, 0x78), 0x0000f8fc, 0x00000000,
127 /* DRAM CS Base Address i Registers
136 * [ 0: 0] Chip-Select Bank Enable
140 * [15: 9] Base Address (19-13)
141 * An optimization used when all DIMM are the same size...
143 * [31:21] Base Address (35-25)
144 * This field defines the top 11 addresses bit of a 40-bit
145 * address that define the memory address space. These
146 * bits decode 32-MByte blocks of memory.
148 PCI_ADDR(0, 0x18, 2, 0x40), 0x001f01fe, 0x00000000,
149 PCI_ADDR(0, 0x18, 2, 0x44), 0x001f01fe, 0x00000000,
150 PCI_ADDR(0, 0x18, 2, 0x48), 0x001f01fe, 0x00000000,
151 PCI_ADDR(0, 0x18, 2, 0x4C), 0x001f01fe, 0x00000000,
152 PCI_ADDR(0, 0x18, 2, 0x50), 0x001f01fe, 0x00000000,
153 PCI_ADDR(0, 0x18, 2, 0x54), 0x001f01fe, 0x00000000,
154 PCI_ADDR(0, 0x18, 2, 0x58), 0x001f01fe, 0x00000000,
155 PCI_ADDR(0, 0x18, 2, 0x5C), 0x001f01fe, 0x00000000,
156 /* DRAM CS Mask Address i Registers
165 * Select bits to exclude from comparison with the DRAM Base address register.
167 * [15: 9] Address Mask (19-13)
168 * Address to be excluded from the optimized case
170 * [29:21] Address Mask (33-25)
171 * The bits with an address mask of 1 are excluded from address comparison
175 PCI_ADDR(0, 0x18, 2, 0x60), 0xC01f01ff, 0x00000000,
176 PCI_ADDR(0, 0x18, 2, 0x64), 0xC01f01ff, 0x00000000,
177 PCI_ADDR(0, 0x18, 2, 0x68), 0xC01f01ff, 0x00000000,
178 PCI_ADDR(0, 0x18, 2, 0x6C), 0xC01f01ff, 0x00000000,
179 PCI_ADDR(0, 0x18, 2, 0x70), 0xC01f01ff, 0x00000000,
180 PCI_ADDR(0, 0x18, 2, 0x74), 0xC01f01ff, 0x00000000,
181 PCI_ADDR(0, 0x18, 2, 0x78), 0xC01f01ff, 0x00000000,
182 PCI_ADDR(0, 0x18, 2, 0x7C), 0xC01f01ff, 0x00000000,
183 /* DRAM Bank Address Mapping Register
185 * Specify the memory module size
190 * 000 = 32Mbyte (Rows = 12 & Col = 8)
191 * 001 = 64Mbyte (Rows = 12 & Col = 9)
192 * 010 = 128Mbyte (Rows = 13 & Col = 9)|(Rows = 12 & Col = 10)
193 * 011 = 256Mbyte (Rows = 13 & Col = 10)|(Rows = 12 & Col = 11)
194 * 100 = 512Mbyte (Rows = 13 & Col = 11)|(Rows = 14 & Col = 10)
195 * 101 = 1Gbyte (Rows = 14 & Col = 11)|(Rows = 13 & Col = 12)
196 * 110 = 2Gbyte (Rows = 14 & Col = 12)
203 PCI_ADDR(0, 0x18, 2, 0x80), 0xffff8888, 0x00000000,
204 /* DRAM Timing Low Register
206 * [ 2: 0] Tcl (Cas# Latency, Cas# to read-data-valid)
216 * [ 7: 4] Trc (Row Cycle Time, Ras#-active to Ras#-active/bank auto refresh)
217 * 0000 = 7 bus clocks
218 * 0001 = 8 bus clocks
220 * 1110 = 21 bus clocks
221 * 1111 = 22 bus clocks
222 * [11: 8] Trfc (Row refresh Cycle time, Auto-refresh-active to RAS#-active or RAS#auto-refresh)
223 * 0000 = 9 bus clocks
224 * 0010 = 10 bus clocks
226 * 1110 = 23 bus clocks
227 * 1111 = 24 bus clocks
228 * [14:12] Trcd (Ras#-active to Case#-read/write Delay)
238 * [18:16] Trrd (Ras# to Ras# Delay)
248 * [23:20] Tras (Minmum Ras# Active Time)
249 * 0000 to 0100 = reserved
250 * 0101 = 5 bus clocks
252 * 1111 = 15 bus clocks
253 * [26:24] Trp (Row Precharge Time)
263 * [28:28] Twr (Write Recovery Time)
268 PCI_ADDR(0, 0x18, 2, 0x88), 0xe8088008, 0x02522001 /* 0x03623125 */ ,
269 /* DRAM Timing High Register
271 * [ 0: 0] Twtr (Write to Read Delay)
275 * [ 6: 4] Trwt (Read to Write Delay)
285 * [12: 8] Tref (Refresh Rate)
286 * 00000 = 100Mhz 4K rows
287 * 00001 = 133Mhz 4K rows
288 * 00010 = 166Mhz 4K rows
289 * 00011 = 200Mhz 4K rows
290 * 01000 = 100Mhz 8K/16K rows
291 * 01001 = 133Mhz 8K/16K rows
292 * 01010 = 166Mhz 8K/16K rows
293 * 01011 = 200Mhz 8K/16K rows
295 * [22:20] Twcl (Write CAS Latency)
296 * 000 = 1 Mem clock after CAS# (Unbuffered Dimms)
297 * 001 = 2 Mem clocks after CAS# (Registered Dimms)
300 PCI_ADDR(0, 0x18, 2, 0x8c), 0xff8fe08e, (0 << 20)|(0 << 8)|(0 << 4)|(0 << 0),
301 /* DRAM Config Low Register
303 * [ 0: 0] DLL Disable
312 * [ 3: 3] Disable DQS Hystersis (FIXME handle this one carefully)
313 * 0 = Enable DQS input filter
314 * 1 = Disable DQS input filtering
317 * 0 = Initialization done or not yet started.
318 * 1 = Initiate DRAM intialization sequence
319 * [ 9: 9] SO-Dimm Enable
321 * 1 = SO-Dimms present
323 * 0 = DRAM not enabled
324 * 1 = DRAM initialized and enabled
325 * [11:11] Memory Clear Status
326 * 0 = Memory Clear function has not completed
327 * 1 = Memory Clear function has completed
328 * [12:12] Exit Self-Refresh
329 * 0 = Exit from self-refresh done or not yet started
330 * 1 = DRAM exiting from self refresh
331 * [13:13] Self-Refresh Status
332 * 0 = Normal Operation
333 * 1 = Self-refresh mode active
334 * [15:14] Read/Write Queue Bypass Count
339 * [16:16] 128-bit/64-Bit
340 * 0 = 64bit Interface to DRAM
341 * 1 = 128bit Interface to DRAM
342 * [17:17] DIMM ECC Enable
343 * 0 = Some DIMMs do not have ECC
344 * 1 = ALL DIMMS have ECC bits
345 * [18:18] UnBuffered DIMMs
347 * 1 = Unbuffered DIMMS
348 * [19:19] Enable 32-Byte Granularity
349 * 0 = Optimize for 64byte bursts
350 * 1 = Optimize for 32byte bursts
351 * [20:20] DIMM 0 is x4
352 * [21:21] DIMM 1 is x4
353 * [22:22] DIMM 2 is x4
354 * [23:23] DIMM 3 is x4
356 * 1 = x4 DIMM present
357 * [24:24] Disable DRAM Receivers
358 * 0 = Receivers enabled
359 * 1 = Receivers disabled
361 * 000 = Arbiters chois is always respected
362 * 001 = Oldest entry in DCQ can be bypassed 1 time
363 * 010 = Oldest entry in DCQ can be bypassed 2 times
364 * 011 = Oldest entry in DCQ can be bypassed 3 times
365 * 100 = Oldest entry in DCQ can be bypassed 4 times
366 * 101 = Oldest entry in DCQ can be bypassed 5 times
367 * 110 = Oldest entry in DCQ can be bypassed 6 times
368 * 111 = Oldest entry in DCQ can be bypassed 7 times
371 PCI_ADDR(0, 0x18, 2, 0x90), 0xf0000000,
373 (0 << 23)|(0 << 22)|(0 << 21)|(0 << 20)|
374 (1 << 19)|(0 << 18)|(1 << 17)|(0 << 16)|
375 (2 << 14)|(0 << 13)|(0 << 12)|
376 (0 << 11)|(0 << 10)|(0 << 9)|(0 << 8)|
377 (0 << 3) |(0 << 1) |(0 << 0),
378 /* DRAM Config High Register
380 * [ 0: 3] Maximum Asynchronous Latency
385 * [11: 8] Read Preamble
403 * [18:16] Idle Cycle Limit
412 * [19:19] Dynamic Idle Cycle Center Enable
413 * 0 = Use Idle Cycle Limit
414 * 1 = Generate a dynamic Idle cycle limit
415 * [22:20] DRAM MEMCLK Frequency
425 * [25:25] Memory Clock Ratio Valid (FIXME carefully enable memclk)
426 * 0 = Disable MemClks
428 * [26:26] Memory Clock 0 Enable
431 * [27:27] Memory Clock 1 Enable
434 * [28:28] Memory Clock 2 Enable
437 * [29:29] Memory Clock 3 Enable
442 PCI_ADDR(0, 0x18, 2, 0x94), 0xc180f0f0,
443 (0 << 29)|(0 << 28)|(0 << 27)|(0 << 26)|(0 << 25)|
444 (0 << 20)|(0 << 19)|(DCH_IDLE_LIMIT_16 << 16)|(0 << 8)|(0 << 0),
445 /* DRAM Delay Line Register
447 * Adjust the skew of the input DQS strobe relative to DATA
449 * [23:16] Delay Line Adjust
450 * Adjusts the DLL derived PDL delay by one or more delay stages
451 * in either the faster or slower direction.
452 * [24:24} Adjust Slower
454 * 1 = Adj is used to increase the PDL delay
455 * [25:25] Adjust Faster
457 * 1 = Adj is used to decrease the PDL delay
460 PCI_ADDR(0, 0x18, 2, 0x98), 0xfc00ffff, 0x00000000,
461 /* MCA NB Status Low reg */
462 PCI_ADDR(0, 0x18, 3, 0x48), 0x00f00000, 0x00000000,
463 /* MCA NB Status high reg */
464 PCI_ADDR(0, 0x18, 3, 0x4c), 0x01801e8c, 0x00000000,
465 /* MCA NB address Low reg */
466 PCI_ADDR(0, 0x18, 3, 0x50), 0x00000007, 0x00000000,
467 /* MCA NB address high reg */
468 PCI_ADDR(0, 0x18, 3, 0x54), 0xffffff00, 0x00000000,
469 /* DRAM Scrub Control Register
471 * [ 4: 0] DRAM Scrube Rate
473 * [12: 8] L2 Scrub Rate
475 * [20:16] Dcache Scrub
478 * 00000 = Do not scrub
500 * All Others = Reserved
502 PCI_ADDR(0, 0x18, 3, 0x58), 0xffe0e0e0, 0x00000000,
503 /* DRAM Scrub Address Low Register
505 * [ 0: 0] DRAM Scrubber Redirect Enable
507 * 1 = Scrubber Corrects errors found in normal operation
509 * [31: 6] DRAM Scrub Address 31-6
511 PCI_ADDR(0, 0x18, 3, 0x5C), 0x0000003e, 0x00000000,
512 /* DRAM Scrub Address High Register
514 * [ 7: 0] DRAM Scrubb Address 39-32
517 PCI_ADDR(0, 0x18, 3, 0x60), 0xffffff00, 0x00000000,
522 if (!controller_present(ctrl)) {
523 // printk(BIOS_DEBUG, "No memory controller present\n");
526 printk(BIOS_SPEW, "setting up CPU%02x northbridge registers\n", ctrl->node_id);
527 max = ARRAY_SIZE(register_values);
528 for (i = 0; i < max; i += 3) {
532 dev = (register_values[i] & ~0xfff) - PCI_DEV(0, 0x18, 0) + ctrl->f0;
533 where = register_values[i] & 0xfff;
534 reg = pci_read_config32(dev, where);
535 reg &= register_values[i+1];
536 reg |= register_values[i+2];
537 pci_write_config32(dev, where, reg);
539 printk(BIOS_SPEW, "done.\n");
542 static void hw_enable_ecc(const struct mem_controller *ctrl)
545 nbcap = pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP);
546 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
547 dcl &= ~DCL_DimmEccEn;
548 if (nbcap & NBCAP_ECC) {
549 dcl |= DCL_DimmEccEn;
551 if (read_option(ECC_memory, 1) == 0) {
552 dcl &= ~DCL_DimmEccEn;
554 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
557 static int is_dual_channel(const struct mem_controller *ctrl)
560 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
561 return dcl & DCL_128BitEn;
564 static int is_opteron(const struct mem_controller *ctrl)
566 /* Test to see if I am an Opteron. Socket 939 based Athlon64
567 * have dual channel capability, too, so we need a better test
569 * However, all code uses is_opteron() to find out whether to
570 * use dual channel, so if we really check for opteron here, we
571 * need to fix up all code using this function, too.
574 nbcap = pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP);
575 return !!(nbcap & NBCAP_128Bit);
578 static int is_registered(const struct mem_controller *ctrl)
580 /* Test to see if we are dealing with registered SDRAM.
581 * If we are not registered we are unbuffered.
582 * This function must be called after spd_handle_unbuffered_dimms.
585 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
586 return !(dcl & DCL_UnBuffDimm);
594 #if CONFIG_QRANK_DIMM_SUPPORT
599 static struct dimm_size spd_get_dimm_size(unsigned device)
601 /* Calculate the log base 2 size of a DIMM in bits */
608 #if CONFIG_QRANK_DIMM_SUPPORT
612 /* Note it might be easier to use byte 31 here, it has the DIMM size as
613 * a multiple of 4MB. The way we do it now we can size both
614 * sides of an assymetric dimm.
616 value = spd_read_byte(device, 3); /* rows */
617 if (value < 0) goto hw_err;
618 if ((value & 0xf) == 0) goto val_err;
619 sz.side1 += value & 0xf;
620 sz.rows = value & 0xf;
622 value = spd_read_byte(device, 4); /* columns */
623 if (value < 0) goto hw_err;
624 if ((value & 0xf) == 0) goto val_err;
625 sz.side1 += value & 0xf;
626 sz.col = value & 0xf;
628 value = spd_read_byte(device, 17); /* banks */
629 if (value < 0) goto hw_err;
630 if ((value & 0xff) == 0) goto val_err;
631 sz.side1 += log2(value & 0xff);
633 /* Get the module data width and convert it to a power of two */
634 value = spd_read_byte(device, 7); /* (high byte) */
635 if (value < 0) goto hw_err;
639 low = spd_read_byte(device, 6); /* (low byte) */
640 if (low < 0) goto hw_err;
641 value = value | (low & 0xff);
642 if ((value != 72) && (value != 64)) goto val_err;
643 sz.side1 += log2(value);
646 value = spd_read_byte(device, 5); /* number of physical banks */
647 if (value < 0) goto hw_err;
648 if (value == 1) goto out;
649 if ((value != 2) && (value != 4 )) {
652 #if CONFIG_QRANK_DIMM_SUPPORT
656 /* Start with the symmetrical case */
659 value = spd_read_byte(device, 3); /* rows */
660 if (value < 0) goto hw_err;
661 if ((value & 0xf0) == 0) goto out; /* If symmetrical we are done */
662 sz.side2 -= (value & 0x0f); /* Subtract out rows on side 1 */
663 sz.side2 += ((value >> 4) & 0x0f); /* Add in rows on side 2 */
665 value = spd_read_byte(device, 4); /* columns */
666 if (value < 0) goto hw_err;
667 if ((value & 0xff) == 0) goto val_err;
668 sz.side2 -= (value & 0x0f); /* Subtract out columns on side 1 */
669 sz.side2 += ((value >> 4) & 0x0f); /* Add in columsn on side 2 */
674 die("Bad SPD value\n");
675 /* If an hw_error occurs report that I have no memory */
681 #if CONFIG_QRANK_DIMM_SUPPORT
689 static void set_dimm_size(const struct mem_controller *ctrl, struct dimm_size sz, unsigned index)
691 uint32_t base0, base1;
694 if (sz.side1 != sz.side2) {
698 /* For each base register.
699 * Place the dimm size in 32 MB quantities in the bits 31 - 21.
700 * The initialize dimm size is in bits.
701 * Set the base enable bit0.
706 /* Make certain side1 of the dimm is at least 32MB */
707 if (sz.side1 >= (25 +3)) {
708 base0 = (1 << ((sz.side1 - (25 + 3)) + 21)) | 1;
711 /* Make certain side2 of the dimm is at least 32MB */
712 if (sz.side2 >= (25 + 3)) {
713 base1 = (1 << ((sz.side2 - (25 + 3)) + 21)) | 1;
716 /* Double the size if we are using dual channel memory */
717 if (is_dual_channel(ctrl)) {
718 base0 = (base0 << 1) | (base0 & 1);
719 base1 = (base1 << 1) | (base1 & 1);
722 /* Clear the reserved bits */
723 base0 &= ~0x001ffffe;
724 base1 &= ~0x001ffffe;
726 /* Set the appropriate DIMM base address register */
727 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1)+0)<<2), base0);
728 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1)+1)<<2), base1);
729 #if CONFIG_QRANK_DIMM_SUPPORT
731 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1)+4)<<2), base0);
732 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1)+5)<<2), base1);
736 /* Enable the memory clocks for this DIMM */
738 dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
739 dch |= DCH_MEMCLK_EN0 << index;
740 #if CONFIG_QRANK_DIMM_SUPPORT
742 dch |= DCH_MEMCLK_EN0 << (index + 2);
745 pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
749 static void set_dimm_map(const struct mem_controller *ctrl, struct dimm_size sz, unsigned index)
751 static const unsigned cs_map_aa[] = {
752 /* (row=12, col=8)(14, 12) ---> (0, 0) (2, 4) */
760 map = pci_read_config32(ctrl->f2, DRAM_BANK_ADDR_MAP);
761 map &= ~(0xf << (index * 4));
762 #if CONFIG_QRANK_DIMM_SUPPORT
764 map &= ~(0xf << ( (index + 2) * 4));
769 /* Make certain side1 of the dimm is at least 32MB */
770 if (sz.side1 >= (25 +3)) {
771 if (is_cpu_pre_d0()) {
772 map |= (sz.side1 - (25 + 3)) << (index *4);
773 #if CONFIG_QRANK_DIMM_SUPPORT
775 map |= (sz.side1 - (25 + 3)) << ( (index + 2) * 4);
780 map |= cs_map_aa[(sz.rows - 12) * 5 + (sz.col - 8) ] << (index*4);
781 #if CONFIG_QRANK_DIMM_SUPPORT
783 map |= cs_map_aa[(sz.rows - 12) * 5 + (sz.col - 8) ] << ( (index + 2) * 4);
789 pci_write_config32(ctrl->f2, DRAM_BANK_ADDR_MAP, map);
793 static long spd_set_ram_size(const struct mem_controller *ctrl, long dimm_mask)
797 for (i = 0; i < DIMM_SOCKETS; i++) {
799 if (!(dimm_mask & (1 << i))) {
802 sz = spd_get_dimm_size(ctrl->channel0[i]);
804 return -1; /* Report SPD error */
806 set_dimm_size(ctrl, sz, i);
807 set_dimm_map (ctrl, sz, i);
812 static void route_dram_accesses(const struct mem_controller *ctrl,
813 unsigned long base_k, unsigned long limit_k)
815 /* Route the addresses to the controller node */
820 unsigned limit_reg, base_reg;
823 node_id = ctrl->node_id;
824 index = (node_id << 3);
825 limit = (limit_k << 2);
828 limit |= ( 0 << 8) | (node_id << 0);
829 base = (base_k << 2);
831 base |= (0 << 8) | (1<<1) | (1<<0);
833 limit_reg = 0x44 + index;
834 base_reg = 0x40 + index;
835 for (device = PCI_DEV(0, 0x18, 1); device <= PCI_DEV(0, 0x1f, 1); device += PCI_DEV(0, 1, 0)) {
836 pci_write_config32(device, limit_reg, limit);
837 pci_write_config32(device, base_reg, base);
841 static void set_top_mem(unsigned tom_k, unsigned hole_startk)
843 /* Error if I don't have memory */
848 /* Report the amount of memory. */
849 printk(BIOS_DEBUG, "RAM end at 0x%08x kB\n", tom_k);
851 /* Now set top of memory */
853 if (tom_k > (4*1024*1024)) {
854 printk(BIOS_SPEW, "Handling memory mapped above 4 GB\n");
855 printk(BIOS_SPEW, "Upper RAM end at 0x%08x kB\n", tom_k);
856 msr.lo = (tom_k & 0x003fffff) << 10;
857 msr.hi = (tom_k & 0xffc00000) >> 22;
858 wrmsr(TOP_MEM2, msr);
859 printk(BIOS_SPEW, "Correcting memory amount mapped below 4 GB\n");
862 /* Leave a 64M hole between TOP_MEM and TOP_MEM2
863 * so I can see my rom chip and other I/O devices.
865 if (tom_k >= 0x003f0000) {
866 #if CONFIG_HW_MEM_HOLE_SIZEK != 0
867 if (hole_startk != 0) {
872 printk(BIOS_SPEW, "Adjusting lower RAM end\n");
874 printk(BIOS_SPEW, "Lower RAM end at 0x%08x kB\n", tom_k);
875 msr.lo = (tom_k & 0x003fffff) << 10;
876 msr.hi = (tom_k & 0xffc00000) >> 22;
880 static unsigned long interleave_chip_selects(const struct mem_controller *ctrl)
883 static const uint8_t csbase_low_shift[] = {
886 /* 128MB */ (14 - 4),
887 /* 256MB */ (15 - 4),
888 /* 512MB */ (15 - 4),
893 static const uint8_t csbase_low_d0_shift[] = {
896 /* 128MB */ (14 - 4),
897 /* 128MB */ (15 - 4),
898 /* 256MB */ (15 - 4),
899 /* 512MB */ (15 - 4),
900 /* 256MB */ (16 - 4),
901 /* 512MB */ (16 - 4),
907 /* cs_base_high is not changed */
910 int chip_selects, index;
912 unsigned common_size;
913 unsigned common_cs_mode;
914 uint32_t csbase, csmask;
916 /* See if all of the memory chip selects are the same size
917 * and if so count them.
922 for (index = 0; index < 8; index++) {
927 value = pci_read_config32(ctrl->f2, DRAM_CSBASE + (index << 2));
935 if (common_size == 0) {
938 /* The size differed fail */
939 if (common_size != size) {
943 value = pci_read_config32(ctrl->f2, DRAM_BANK_ADDR_MAP);
944 cs_mode =( value >> ((index>>1)*4)) & 0xf;
945 if (cs_mode == 0 ) continue;
946 if (common_cs_mode == 0) {
947 common_cs_mode = cs_mode;
949 /* The cs_mode differed fail */
950 if (common_cs_mode != cs_mode) {
955 /* Chip selects can only be interleaved when there is
956 * more than one and their is a power of two of them.
958 bits = log2(chip_selects);
959 if (((1 << bits) != chip_selects) || (bits < 1) || (bits > 3)) {
963 /* Find the bits of csbase that we need to interleave on */
964 if (is_cpu_pre_d0()){
965 csbase_inc = 1 << csbase_low_shift[common_cs_mode];
966 if (is_dual_channel(ctrl)) {
967 /* Also we run out of address mask bits if we try and interleave 8 4GB dimms */
968 if ((bits == 3) && (common_size == (1 << (32 - 3)))) {
969 // printk(BIOS_DEBUG, "8 4GB chip selects cannot be interleaved\n");
976 csbase_inc = 1 << csbase_low_d0_shift[common_cs_mode];
977 if (is_dual_channel(ctrl)) {
978 if ( (bits==3) && (common_cs_mode > 8)) {
979 // printk(BIOS_DEBUG, "8 cs_mode>8 chip selects cannot be interleaved\n");
986 /* Compute the initial values for csbase and csbask.
987 * In csbase just set the enable bit and the base to zero.
988 * In csmask set the mask bits for the size and page level interleave.
991 csmask = (((common_size << bits) - 1) << 21);
992 csmask |= 0xfe00 & ~((csbase_inc << bits) - csbase_inc);
993 for (index = 0; index < 8; index++) {
996 value = pci_read_config32(ctrl->f2, DRAM_CSBASE + (index << 2));
1001 pci_write_config32(ctrl->f2, DRAM_CSBASE + (index << 2), csbase);
1002 pci_write_config32(ctrl->f2, DRAM_CSMASK + (index << 2), csmask);
1003 csbase += csbase_inc;
1006 printk(BIOS_SPEW, "Interleaved\n");
1008 /* Return the memory size in K */
1009 return common_size << (15 + bits);
1012 static unsigned long order_chip_selects(const struct mem_controller *ctrl)
1016 /* Remember which registers we have used in the high 8 bits of tom */
1019 /* Find the largest remaining candidate */
1020 unsigned index, candidate;
1021 uint32_t csbase, csmask;
1025 for (index = 0; index < 8; index++) {
1027 value = pci_read_config32(ctrl->f2, DRAM_CSBASE + (index << 2));
1029 /* Is it enabled? */
1034 /* Is it greater? */
1035 if (value <= csbase) {
1039 /* Has it already been selected */
1040 if (tom & (1 << (index + 24))) {
1043 /* I have a new candidate */
1048 /* See if I have found a new candidate */
1053 /* Remember the dimm size */
1054 size = csbase >> 21;
1056 /* Remember I have used this register */
1057 tom |= (1 << (candidate + 24));
1059 /* Recompute the cs base register value */
1060 csbase = (tom << 21) | 1;
1062 /* Increment the top of memory */
1065 /* Compute the memory mask */
1066 csmask = ((size -1) << 21);
1067 csmask |= 0xfe00; /* For now don't optimize */
1069 /* Write the new base register */
1070 pci_write_config32(ctrl->f2, DRAM_CSBASE + (candidate << 2), csbase);
1071 /* Write the new mask register */
1072 pci_write_config32(ctrl->f2, DRAM_CSMASK + (candidate << 2), csmask);
1075 /* Return the memory size in K */
1076 return (tom & ~0xff000000) << 15;
1079 static unsigned long memory_end_k(const struct mem_controller *ctrl, int max_node_id)
1083 /* Find the last memory address used */
1085 for (node_id = 0; node_id < max_node_id; node_id++) {
1086 uint32_t limit, base;
1088 index = node_id << 3;
1089 base = pci_read_config32(ctrl->f1, 0x40 + index);
1090 /* Only look at the limit if the base is enabled */
1091 if ((base & 3) == 3) {
1092 limit = pci_read_config32(ctrl->f1, 0x44 + index);
1093 end_k = ((limit + 0x00010000) & 0xffff0000) >> 2;
1099 static void order_dimms(const struct mem_controller *ctrl)
1101 unsigned long tom_k, base_k;
1103 if (read_option(interleave_chip_selects, 1) != 0) {
1104 tom_k = interleave_chip_selects(ctrl);
1106 printk(BIOS_DEBUG, "Interleaving disabled\n");
1111 tom_k = order_chip_selects(ctrl);
1114 /* Compute the memory base address */
1115 base_k = memory_end_k(ctrl, ctrl->node_id);
1117 route_dram_accesses(ctrl, base_k, tom_k);
1118 set_top_mem(tom_k, 0);
1121 static long disable_dimm(const struct mem_controller *ctrl, unsigned index, long dimm_mask)
1123 printk(BIOS_DEBUG, "disabling dimm %02x\n", index);
1124 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1)+0)<<2), 0);
1125 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1)+1)<<2), 0);
1126 dimm_mask &= ~(1 << index);
1130 static long spd_handle_unbuffered_dimms(const struct mem_controller *ctrl,
1136 int has_dualch = is_opteron(ctrl);
1140 for (i = 0; (i < DIMM_SOCKETS); i++) {
1142 if (!(dimm_mask & (1 << i))) {
1145 value = spd_read_byte(ctrl->channel0[i], 21);
1150 /* Registered dimm ? */
1151 if (value & (1 << 1)) {
1154 /* Otherwise it must be an unbuffered dimm */
1159 if (unbuffered && registered) {
1160 die("Mixed buffered and registered dimms not supported");
1163 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1164 dcl &= ~DCL_UnBuffDimm;
1166 if ((has_dualch) && (!is_cpu_pre_d0())) {
1167 dcl |= DCL_UnBuffDimm;
1168 #if CONFIG_CPU_AMD_SOCKET_939
1169 if ((cpuid_eax(1) & 0x30) == 0x30) {
1170 /* CS[7:4] is copy of CS[3:0], should be set for 939 socket */
1171 dcl |= DCL_UpperCSMap;
1175 dcl |= DCL_UnBuffDimm;
1178 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1180 if (is_registered(ctrl)) {
1181 printk(BIOS_SPEW, "Registered\n");
1183 printk(BIOS_SPEW, "Unbuffered\n");
1189 static unsigned int spd_detect_dimms(const struct mem_controller *ctrl)
1194 for (i = 0; i < DIMM_SOCKETS; i++) {
1197 device = ctrl->channel0[i];
1199 byte = spd_read_byte(ctrl->channel0[i], 2); /* Type */
1201 dimm_mask |= (1 << i);
1204 device = ctrl->channel1[i];
1206 byte = spd_read_byte(ctrl->channel1[i], 2);
1208 dimm_mask |= (1 << (i + DIMM_SOCKETS));
1215 static long spd_enable_2channels(const struct mem_controller *ctrl, long dimm_mask)
1219 /* SPD addresses to verify are identical */
1220 static const uint8_t addresses[] = {
1221 2, /* Type should be DDR SDRAM */
1222 3, /* *Row addresses */
1223 4, /* *Column addresses */
1224 5, /* *Physical Banks */
1225 6, /* *Module Data Width low */
1226 7, /* *Module Data Width high */
1227 9, /* *Cycle time at highest CAS Latency CL=X */
1228 11, /* *SDRAM Type */
1229 13, /* *SDRAM Width */
1230 17, /* *Logical Banks */
1231 18, /* *Supported CAS Latencies */
1232 21, /* *SDRAM Module Attributes */
1233 23, /* *Cycle time at CAS Latency (CLX - 0.5) */
1234 25, /* *Cycle time at CAS Latency (CLX - 1.0) */
1235 27, /* *tRP Row precharge time */
1236 28, /* *Minimum Row Active to Row Active Delay (tRRD) */
1237 29, /* *tRCD RAS to CAS */
1238 30, /* *tRAS Activate to Precharge */
1239 41, /* *Minimum Active to Active/Auto Refresh Time(Trc) */
1240 42, /* *Minimum Auto Refresh Command Time(Trfc) */
1242 /* If the dimms are not in pairs do not do dual channels */
1243 if ((dimm_mask & ((1 << DIMM_SOCKETS) - 1)) !=
1244 ((dimm_mask >> DIMM_SOCKETS) & ((1 << DIMM_SOCKETS) - 1))) {
1245 goto single_channel;
1247 /* If the cpu is not capable of doing dual channels don't do dual channels */
1248 nbcap = pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP);
1249 if (!(nbcap & NBCAP_128Bit)) {
1250 goto single_channel;
1252 for (i = 0; (i < 4) && (ctrl->channel0[i]); i++) {
1253 unsigned device0, device1;
1256 /* If I don't have a dimm skip this one */
1257 if (!(dimm_mask & (1 << i))) {
1260 device0 = ctrl->channel0[i];
1261 device1 = ctrl->channel1[i];
1262 for (j = 0; j < ARRAY_SIZE(addresses); j++) {
1264 addr = addresses[j];
1265 value0 = spd_read_byte(device0, addr);
1269 value1 = spd_read_byte(device1, addr);
1273 if (value0 != value1) {
1274 goto single_channel;
1278 printk(BIOS_SPEW, "Enabling dual channel memory\n");
1280 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1281 dcl &= ~DCL_32ByteEn;
1282 dcl |= DCL_128BitEn;
1283 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1286 dimm_mask &= ~((1 << (DIMM_SOCKETS *2)) - (1 << DIMM_SOCKETS));
1292 uint8_t divisor; /* In 1/2 ns increments */
1295 uint32_t dch_memclk;
1296 uint16_t dch_tref4k, dch_tref8k;
1299 uint8_t dtl_trwt[3][3]; /* first index is CAS_LAT 2/2.5/3 and 128/registered64/64 */
1300 uint8_t rdpreamble[4]; /* 0 is for registered, 1 for 1-2 DIMMS, 2 and 3 for 3 or 4 unreg dimm slots */
1304 static const struct mem_param *get_mem_param(int freq)
1306 static const struct mem_param speed[] = {
1307 [NBCAP_MEMCLK_100MHZ] = {
1310 .divisor = (10 <<1),
1313 .dch_memclk = DCH_MEMCLK_100MHZ << DCH_MEMCLK_SHIFT,
1314 .dch_tref4k = DTH_TREF_100MHZ_4K,
1315 .dch_tref8k = DTH_TREF_100MHZ_8K,
1318 .dtl_trwt = { { 2, 2, 3 }, { 3, 3, 4 }, { 3, 3, 4 }},
1319 .rdpreamble = { ((9 << 1) + 0), ((9 << 1) + 0), ((9 << 1) + 0), ((9 << 1) + 0) }
1321 [NBCAP_MEMCLK_133MHZ] = {
1324 .divisor = (7<<1)+1,
1327 .dch_memclk = DCH_MEMCLK_133MHZ << DCH_MEMCLK_SHIFT,
1328 .dch_tref4k = DTH_TREF_133MHZ_4K,
1329 .dch_tref8k = DTH_TREF_133MHZ_8K,
1332 .dtl_trwt = { { 2, 2, 3 }, { 3, 3, 4 }, { 3, 3, 4 }},
1333 .rdpreamble = { ((8 << 1) + 0), ((7 << 1) + 0), ((7 << 1) + 1), ((7 << 1) + 0) }
1335 [NBCAP_MEMCLK_166MHZ] = {
1341 .dch_memclk = DCH_MEMCLK_166MHZ << DCH_MEMCLK_SHIFT,
1342 .dch_tref4k = DTH_TREF_166MHZ_4K,
1343 .dch_tref8k = DTH_TREF_166MHZ_8K,
1346 .dtl_trwt = { { 3, 2, 3 }, { 3, 3, 4 }, { 4, 3, 4 }},
1347 .rdpreamble = { ((7 << 1) + 1), ((6 << 1) + 0), ((6 << 1) + 1), ((6 << 1) + 0) }
1349 [NBCAP_MEMCLK_200MHZ] = {
1355 .dch_memclk = DCH_MEMCLK_200MHZ << DCH_MEMCLK_SHIFT,
1356 .dch_tref4k = DTH_TREF_200MHZ_4K,
1357 .dch_tref8k = DTH_TREF_200MHZ_8K,
1360 .dtl_trwt = { { 0, 2, 3 }, { 3, 3, 4 }, { 3, 3, 4 }},
1361 .rdpreamble = { ((7 << 1) + 0), ((5 << 1) + 0), ((5 << 1) + 1), ((5 << 1) + 1) }
1364 const struct mem_param *param;
1366 param = speed + freq;
1367 printk(BIOS_SPEW, "%s\n", param->name);
1371 struct spd_set_memclk_result {
1372 const struct mem_param *param;
1376 static int spd_dimm_loading_socket(const struct mem_controller *ctrl, long dimm_mask, int *freq_1t)
1379 #if CONFIG_CPU_AMD_SOCKET_939
1381 /* + 1 raise so we detect 0 as bad field */
1382 #define DDR200 (NBCAP_MEMCLK_100MHZ + 1)
1383 #define DDR333 (NBCAP_MEMCLK_166MHZ + 1)
1384 #define DDR400 (NBCAP_MEMCLK_200MHZ + 1)
1386 #define DDR_MASK 0x7
1388 #define DDR200_2T (DDR_2T | DDR200)
1389 #define DDR333_2T (DDR_2T | DDR333)
1390 #define DDR400_2T (DDR_2T | DDR400)
1393 Following table comes directly from BKDG (unbuffered DIMM support)
1394 [Y][X] Y = ch0_0, ch1_0, ch0_1, ch1_1 1=present 0=empty
1395 X uses same layout but 1 means double rank 0 is single rank/empty
1397 Following tables come from BKDG the ch{0_0,1_0,0_1,1_1} maps to
1398 MEMCS_{1L,1H,2L,2H} in i the PDF. PreE is table 45, and revE table 46.
1401 static const unsigned char dimm_loading_config_preE[16][16] = {
1402 [0x8] = {[0x0] = DDR400,[0x8] = DDR400},
1403 [0x2] = {[0x0] = DDR333,[0x2] = DDR400},
1404 [0xa] = {[0x0] = DDR400_2T,[0x2] = DDR400_2T,
1405 [0x8] = DDR400_2T,[0xa] = DDR333_2T},
1406 [0xc] = {[0x0] = DDR400,[0xc] = DDR400},
1407 [0x3] = {[0x0] = DDR333,[0x3] = DDR400},
1408 [0xf] = {[0x0] = DDR400_2T,[0x3] = DDR400_2T,
1409 [0xc] = DDR400_2T,[0xf] = DDR333_2T},
1412 static const unsigned char dimm_loading_config_revE[16][16] = {
1413 [0x8] = {[0x0] = DDR400, [0x8] = DDR400},
1414 [0x2] = {[0x0] = DDR333, [0x2] = DDR400},
1415 [0x4] = {[0x0] = DDR400, [0x4] = DDR400},
1416 [0x1] = {[0x0] = DDR333, [0x1] = DDR400},
1417 [0xa] = {[0x0] = DDR400_2T, [0x2] = DDR400_2T,
1418 [0x8] = DDR400_2T, [0xa] = DDR333_2T},
1419 [0x5] = {[0x0] = DDR400_2T, [0x1] = DDR400_2T,
1420 [0x4] = DDR400_2T, [0x5] = DDR333_2T},
1421 [0xc] = {[0x0] = DDR400, [0xc] = DDR400, [0x4] = DDR400, [0x8] = DDR400},
1422 [0x3] = {[0x0] = DDR333, [0x1] = DDR333, [0x2] = DDR333, [0x3] = DDR400},
1423 [0xe] = {[0x0] = DDR400_2T, [0x4] = DDR400_2T, [0x2] = DDR400_2T,
1424 [0x6] = DDR400_2T, [0x8] = DDR400_2T, [0xc] = DDR400_2T,
1425 [0xa] = DDR333_2T, [0xe] = DDR333_2T},
1426 [0xb] = {[0x0] = DDR333, [0x1] = DDR400_2T, [0x2] = DDR333_2T,
1427 [0x3] = DDR400_2T, [0x8] = DDR333_2T, [0x9] = DDR400_2T,
1428 [0xa] = DDR333_2T, [0xb] = DDR333_2T},
1429 [0xd] = {[0x0] = DDR400_2T, [0x8] = DDR400_2T, [0x1] = DDR400_2T,
1430 [0x9] = DDR333_2T, [0x4] = DDR400_2T, [0xc] = DDR400_2T,
1431 [0x5] = DDR333_2T, [0xd] = DDR333_2T},
1432 [0x7] = {[0x0] = DDR333, [0x2] = DDR400_2T, [0x1] = DDR333_2T,
1433 [0x3] = DDR400_2T, [0x4] = DDR333_2T, [0x6] = DDR400_2T,
1434 [0x5] = DDR333_2T, [0x7] = DDR333_2T},
1435 [0xf] = {[0x0] = DDR400_2T, [0x1] = DDR400_2T, [0x4] = DDR400_2T,
1436 [0x5] = DDR333_2T, [0x2] = DDR400_2T, [0x3] = DDR400_2T,
1437 [0x6] = DDR400_2T, [0x7] = DDR333_2T, [0x8] = DDR400_2T,
1438 [0x9] = DDR400_2T, [0xc] = DDR400_2T, [0xd] = DDR333_2T,
1439 [0xa] = DDR333_2T, [0xb] = DDR333_2T, [0xe] = DDR333_2T,
1442 /*The dpos matches channel positions defined in BKDG and above arrays
1443 The rpos is bitmask of dual rank dimms in same order as dpos */
1444 unsigned int dloading = 0, i, rpos = 0, dpos = 0;
1445 const unsigned char (*dimm_loading_config)[16] = dimm_loading_config_revE;
1449 if (is_cpu_pre_e0()) {
1450 dimm_loading_config = dimm_loading_config_preE;
1453 /* only DIMMS two per channel */
1454 for (i = 0; i < 2; i++) {
1455 if ((dimm_mask & (1 << i))) {
1456 /* read rank channel 0 */
1457 rank = spd_read_byte(ctrl->channel0[i], 5);
1458 if (rank < 0) goto hw_error;
1459 rpos |= (rank == 2) ? (1 << (3 - (i * 2))) : 0;
1460 dpos |= (1 << (3 - (i * 2)));
1463 if ((dimm_mask & (1 << (i+DIMM_SOCKETS)))) {
1464 /* read rank channel 1*/
1465 rank = spd_read_byte(ctrl->channel1[i], 5);
1466 if (rank < 0) goto hw_error;
1467 rpos |= (rank == 2) ? (1 << (2 - (i * 2))) : 0;
1468 dpos |= (1 << (2 - (i * 2)));
1471 /* now the lookup, decode the max speed DDR400_2T etc */
1472 dloading = dimm_loading_config[dpos][rpos] & DDR_MASK;
1474 printk(BIOS_DEBUG, "XXX %x %x dload %x 2T %x\n", dpos,rpos, dloading, dimm_loading_config[dpos][rpos] & DDR_2T);
1477 if (dloading != 0) {
1478 /* we have valid combination check the restrictions */
1479 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1480 dcl |= ((dimm_loading_config[dpos][rpos] & DDR_2T) || CONFIG_K8_FORCE_2T_DRAM_TIMING) ? (DCL_En2T) : 0;
1481 /* Set DuallDimm is second channel is completely empty (revD+) */
1482 if (((cpuid_eax(1) & 0xfff0f) >= 0x10f00) && ((dpos & 0x5) == 0)) {
1483 printk(BIOS_DEBUG, "Setting DualDIMMen\n");
1484 dcl |= DCL_DualDIMMen;
1486 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1487 return dloading - 1;
1489 /* if we don't find it we se it to DDR400 */
1490 printk(BIOS_WARNING, "Detected strange DIMM configuration, may not work! (or bug)\n");
1491 return NBCAP_MEMCLK_200MHZ;
1494 #elif CONFIG_CPU_AMD_SOCKET_754
1496 #define CFGIDX(DIMM1,DIMM2,DIMM3) ((DIMM3)*9+(DIMM2)*3+(DIMM1))
1502 #define DDR200 NBCAP_MEMCLK_100MHZ
1503 #define DDR333 NBCAP_MEMCLK_166MHZ
1504 #define DDR400 NBCAP_MEMCLK_200MHZ
1506 /* this is table 42 from the BKDG, ignoring footnote 4,
1507 * with the EMPTY, EMPTY, EMPTY row added */
1508 static const unsigned char cfgtable[][2] = {
1509 [CFGIDX(EMPTY, EMPTY, EMPTY )] = { DDR400, DDR400 },
1510 [CFGIDX(X8S_X16, EMPTY, EMPTY )] = { DDR400, DDR400 },
1511 [CFGIDX(EMPTY, X8S_X16, EMPTY )] = { DDR400, DDR400 },
1512 [CFGIDX(EMPTY, EMPTY, X8S_X16 )] = { DDR400, DDR400 },
1513 [CFGIDX(X8D, EMPTY, EMPTY )] = { DDR400, DDR400 },
1514 [CFGIDX(EMPTY, X8D, EMPTY )] = { DDR400, DDR400 },
1515 [CFGIDX(EMPTY, EMPTY, X8D )] = { DDR400, DDR400 },
1516 [CFGIDX(X8S_X16, X8S_X16, EMPTY )] = { DDR400, DDR400 },
1517 [CFGIDX(X8S_X16, X8D, EMPTY )] = { DDR400, DDR400 },
1518 [CFGIDX(X8S_X16, EMPTY, X8S_X16 )] = { DDR400, DDR400 },
1519 [CFGIDX(X8S_X16, EMPTY, X8D )] = { DDR400, DDR400 },
1520 [CFGIDX(X8D, X8S_X16, EMPTY )] = { DDR400, DDR400 },
1521 [CFGIDX(X8D, X8D, EMPTY )] = { DDR333, DDR333 },
1522 [CFGIDX(X8D, EMPTY, X8S_X16 )] = { DDR400, DDR400 },
1523 [CFGIDX(X8D, EMPTY, X8D )] = { DDR333, DDR333 },
1524 [CFGIDX(EMPTY, X8S_X16, X8S_X16 )] = { DDR333, DDR400 },
1525 [CFGIDX(EMPTY, X8S_X16, X8D )] = { DDR200, DDR400 },
1526 [CFGIDX(EMPTY, X8D, X8S_X16 )] = { DDR200, DDR400 },
1527 [CFGIDX(EMPTY, X8D, X8D )] = { DDR200, DDR333 },
1528 [CFGIDX(X8S_X16, X8S_X16, X8S_X16 )] = { DDR333, DDR400 },
1529 [CFGIDX(X8S_X16, X8S_X16, X8D )] = { DDR200, DDR333 },
1530 [CFGIDX(X8S_X16, X8D, X8S_X16 )] = { DDR200, DDR333 },
1531 [CFGIDX(X8S_X16, X8D, X8D )] = { DDR200, DDR333 },
1532 [CFGIDX(X8D, X8S_X16, X8S_X16 )] = { DDR333, DDR333 },
1533 [CFGIDX(X8D, X8S_X16, X8D )] = { DDR200, DDR333 },
1534 [CFGIDX(X8D, X8D, X8S_X16 )] = { DDR200, DDR333 },
1535 [CFGIDX(X8D, X8D, X8D )] = { DDR200, DDR333 }
1538 int i, rank, width, dimmtypes[3];
1539 const unsigned char *cfg;
1541 for (i = 0; i < 3; i++) {
1542 if (dimm_mask & (1 << i)) {
1543 rank = spd_read_byte(ctrl->channel0[i], 5);
1544 width = spd_read_byte(ctrl->channel0[i], 13);
1545 if (rank < 0 || width < 0) die("failed to read SPD");
1547 /* this is my guess as to how the criteria in the table
1548 * are to be understood:
1550 dimmtypes[i] = width >= (rank == 1 ? 8 : 16) ? X8S_X16 : X8D;
1552 dimmtypes[i] = EMPTY;
1555 cfg = cfgtable[CFGIDX(dimmtypes[0], dimmtypes[1], dimmtypes[2])];
1557 return is_cpu_c0() ? cfg[0] : cfg[1];
1559 #else /* CONFIG_CPU_AMD_SOCKET_* */
1561 /* well, there are socket 940 boards supported which obviously fail to
1562 * compile with this */
1563 // #error load dependent memory clock limiting is not implemented for this socket
1565 /* see BKDG 4.1.3--if you just want to test a setup that doesn't
1566 * require limiting, you may use the following code */
1568 *freq_1t = NBCAP_MEMCLK_200MHZ;
1569 return NBCAP_MEMCLK_200MHZ;
1571 #endif /* CONFIG_CPU_AMD_SOCKET_* */
1575 static struct spd_set_memclk_result spd_set_memclk(const struct mem_controller *ctrl, long dimm_mask)
1577 struct spd_set_memclk_result result;
1578 unsigned char cl_at_freq[NBCAP_MEMCLK_MASK + 1];
1579 int dimm, freq, max_freq_bios, max_freq_dloading, max_freq_1t;
1582 static const uint8_t spd_min_cycle_time_indices[] = { 9, 23, 25 };
1583 static const unsigned char cycle_time_at_freq[] = {
1584 [NBCAP_MEMCLK_200MHZ] = 0x50, /* 5ns */
1585 [NBCAP_MEMCLK_166MHZ] = 0x60, /* 6ns */
1586 [NBCAP_MEMCLK_133MHZ] = 0x75, /* 7.5ns */
1587 [NBCAP_MEMCLK_100MHZ] = 0xa0, /* 10ns */
1590 /* BEWARE that the constants for frequencies order in reverse of what
1591 * would be intuitive. 200 MHz has the lowest constant, 100 MHz the
1592 * highest. Thus, all comparisons and traversal directions having to
1593 * do with frequencies are/have to be the opposite of what would be
1597 /* the CLs supported by the controller: */
1598 memset(cl_at_freq, 0x1c, sizeof(cl_at_freq));
1599 memset(cl_at_freq, 0x00,
1600 (pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP) >>
1601 NBCAP_MEMCLK_SHIFT) & NBCAP_MEMCLK_MASK);
1602 max_freq_bios = read_option(max_mem_clock, 0);
1603 if (max_freq_bios <= NBCAP_MEMCLK_100MHZ)
1604 memset(cl_at_freq, 0x00, max_freq_bios);
1605 for (dimm = 0; dimm < DIMM_SOCKETS; dimm++) {
1606 int x,i,spd_cls,cl,spd_min_cycle_time;
1607 unsigned char cl_at_freq_mask[sizeof(cl_at_freq)];
1609 if (!(dimm_mask & (1 << dimm)))
1611 /* Byte 18 for DDR SDRAM is interpreted:
1612 * bit 0 == CAS Latency = 1.0
1613 * bit 1 == CAS Latency = 1.5
1614 * bit 2 == CAS Latency = 2.0
1615 * bit 3 == CAS Latency = 2.5
1616 * bit 4 == CAS Latency = 3.0
1617 * bit 5 == CAS Latency = 3.5
1618 * bit 6 == CAS Latency = 4.0
1621 spd_cls = spd_read_byte(ctrl->channel0[dimm], 18);
1624 memset(cl_at_freq_mask, 0x00, sizeof(cl_at_freq_mask));
1625 for (cl = 1 << log2(spd_cls), i = 0; i < 3; cl >>= 1, i++) {
1626 if (!(spd_cls & cl))
1628 spd_min_cycle_time = spd_read_byte(ctrl->channel0[dimm],
1629 spd_min_cycle_time_indices[i]);
1630 if (spd_min_cycle_time < 0)
1632 if ((!spd_min_cycle_time) || (spd_min_cycle_time & 0x0f) > 9)
1634 for (x = 0; x < sizeof(cl_at_freq_mask); x++)
1635 if (cycle_time_at_freq[x] >= spd_min_cycle_time)
1636 cl_at_freq_mask[x] |= cl;
1638 for (x = 0; x < sizeof(cl_at_freq_mask); x++)
1639 cl_at_freq[x] &= cl_at_freq_mask[x];
1642 freq = NBCAP_MEMCLK_200MHZ;
1643 while (freq < sizeof(cl_at_freq) && !cl_at_freq[freq])
1646 max_freq_dloading = spd_dimm_loading_socket(ctrl, dimm_mask, &max_freq_1t);
1647 if (max_freq_dloading > freq) {
1648 printk(BIOS_WARNING, "Memory speed reduced due to signal loading conditions\n");
1649 freq = max_freq_dloading;
1650 while (freq < sizeof(cl_at_freq) && !cl_at_freq[freq])
1654 /* if the next lower frequency gives a CL at least one whole cycle
1655 * shorter, select that (see end of BKDG 4.1.1.1) */
1656 if (freq < sizeof(cl_at_freq)-1 && cl_at_freq[freq+1] &&
1657 log2f(cl_at_freq[freq]) - log2f(cl_at_freq[freq+1]) >= 2)
1660 if (freq == sizeof(cl_at_freq))
1663 #if CONFIG_CPU_AMD_SOCKET_754
1664 if (freq < max_freq_1t || CONFIG_K8_FORCE_2T_DRAM_TIMING) {
1665 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW,
1666 pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW) | DCL_En2T);
1670 result.param = get_mem_param(freq);
1672 /* Update DRAM Config High with our selected memory speed */
1673 value = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
1674 value &= ~(DCH_MEMCLK_MASK << DCH_MEMCLK_SHIFT);
1676 /* Improves DQS centering by correcting for case when core speed multiplier and MEMCLK speed result in odd clock divisor, by selecting the next lowest memory speed, required only at DDR400 and higher speeds with certain DIMM loadings ---- cheating???*/
1677 if (!is_cpu_pre_e0()) {
1678 if (min_cycle_time==0x50) {
1684 value |= result.param->dch_memclk;
1685 pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, value);
1687 static const unsigned latencies[] = { DTL_CL_2, DTL_CL_2_5, DTL_CL_3 };
1689 /* Update DRAM Timing Low with our selected cas latency */
1690 value = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1691 value &= ~(DTL_TCL_MASK << DTL_TCL_SHIFT);
1692 value |= latencies[log2f(cl_at_freq[freq]) - 2] << DTL_TCL_SHIFT;
1693 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, value);
1695 result.dimm_mask = dimm_mask;
1698 result.param = (const struct mem_param *)0;
1699 result.dimm_mask = -1;
1704 static int update_dimm_Trc(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1706 unsigned clocks, old_clocks;
1709 value = spd_read_byte(ctrl->channel0[i], 41);
1710 if (value < 0) return -1;
1711 if ((value == 0) || (value == 0xff)) {
1714 clocks = ((value << 1) + param->divisor - 1)/param->divisor;
1715 if (clocks < DTL_TRC_MIN) {
1716 clocks = DTL_TRC_MIN;
1718 if (clocks > DTL_TRC_MAX) {
1722 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1723 old_clocks = ((dtl >> DTL_TRC_SHIFT) & DTL_TRC_MASK) + DTL_TRC_BASE;
1724 if (old_clocks > clocks) {
1725 clocks = old_clocks;
1727 dtl &= ~(DTL_TRC_MASK << DTL_TRC_SHIFT);
1728 dtl |= ((clocks - DTL_TRC_BASE) << DTL_TRC_SHIFT);
1729 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1733 static int update_dimm_Trfc(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1735 unsigned clocks, old_clocks;
1738 value = spd_read_byte(ctrl->channel0[i], 42);
1739 if (value < 0) return -1;
1740 if ((value == 0) || (value == 0xff)) {
1741 value = param->tRFC;
1743 clocks = ((value << 1) + param->divisor - 1)/param->divisor;
1744 if (clocks < DTL_TRFC_MIN) {
1745 clocks = DTL_TRFC_MIN;
1747 if (clocks > DTL_TRFC_MAX) {
1750 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1751 old_clocks = ((dtl >> DTL_TRFC_SHIFT) & DTL_TRFC_MASK) + DTL_TRFC_BASE;
1752 if (old_clocks > clocks) {
1753 clocks = old_clocks;
1755 dtl &= ~(DTL_TRFC_MASK << DTL_TRFC_SHIFT);
1756 dtl |= ((clocks - DTL_TRFC_BASE) << DTL_TRFC_SHIFT);
1757 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1762 static int update_dimm_Trcd(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1764 unsigned clocks, old_clocks;
1767 value = spd_read_byte(ctrl->channel0[i], 29);
1768 if (value < 0) return -1;
1769 clocks = (value + (param->divisor << 1) -1)/(param->divisor << 1);
1770 if (clocks < DTL_TRCD_MIN) {
1771 clocks = DTL_TRCD_MIN;
1773 if (clocks > DTL_TRCD_MAX) {
1776 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1777 old_clocks = ((dtl >> DTL_TRCD_SHIFT) & DTL_TRCD_MASK) + DTL_TRCD_BASE;
1778 if (old_clocks > clocks) {
1779 clocks = old_clocks;
1781 dtl &= ~(DTL_TRCD_MASK << DTL_TRCD_SHIFT);
1782 dtl |= ((clocks - DTL_TRCD_BASE) << DTL_TRCD_SHIFT);
1783 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1787 static int update_dimm_Trrd(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1789 unsigned clocks, old_clocks;
1792 value = spd_read_byte(ctrl->channel0[i], 28);
1793 if (value < 0) return -1;
1794 clocks = (value + (param->divisor << 1) -1)/(param->divisor << 1);
1795 if (clocks < DTL_TRRD_MIN) {
1796 clocks = DTL_TRRD_MIN;
1798 if (clocks > DTL_TRRD_MAX) {
1801 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1802 old_clocks = ((dtl >> DTL_TRRD_SHIFT) & DTL_TRRD_MASK) + DTL_TRRD_BASE;
1803 if (old_clocks > clocks) {
1804 clocks = old_clocks;
1806 dtl &= ~(DTL_TRRD_MASK << DTL_TRRD_SHIFT);
1807 dtl |= ((clocks - DTL_TRRD_BASE) << DTL_TRRD_SHIFT);
1808 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1812 static int update_dimm_Tras(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1814 unsigned clocks, old_clocks;
1817 value = spd_read_byte(ctrl->channel0[i], 30);
1818 if (value < 0) return -1;
1819 clocks = ((value << 1) + param->divisor - 1)/param->divisor;
1820 if (clocks < DTL_TRAS_MIN) {
1821 clocks = DTL_TRAS_MIN;
1823 if (clocks > DTL_TRAS_MAX) {
1826 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1827 old_clocks = ((dtl >> DTL_TRAS_SHIFT) & DTL_TRAS_MASK) + DTL_TRAS_BASE;
1828 if (old_clocks > clocks) {
1829 clocks = old_clocks;
1831 dtl &= ~(DTL_TRAS_MASK << DTL_TRAS_SHIFT);
1832 dtl |= ((clocks - DTL_TRAS_BASE) << DTL_TRAS_SHIFT);
1833 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1837 static int update_dimm_Trp(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1839 unsigned clocks, old_clocks;
1842 value = spd_read_byte(ctrl->channel0[i], 27);
1843 if (value < 0) return -1;
1844 clocks = (value + (param->divisor << 1) - 1)/(param->divisor << 1);
1845 if (clocks < DTL_TRP_MIN) {
1846 clocks = DTL_TRP_MIN;
1848 if (clocks > DTL_TRP_MAX) {
1851 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1852 old_clocks = ((dtl >> DTL_TRP_SHIFT) & DTL_TRP_MASK) + DTL_TRP_BASE;
1853 if (old_clocks > clocks) {
1854 clocks = old_clocks;
1856 dtl &= ~(DTL_TRP_MASK << DTL_TRP_SHIFT);
1857 dtl |= ((clocks - DTL_TRP_BASE) << DTL_TRP_SHIFT);
1858 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1862 static void set_Twr(const struct mem_controller *ctrl, const struct mem_param *param)
1865 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1866 dtl &= ~(DTL_TWR_MASK << DTL_TWR_SHIFT);
1867 dtl |= (param->dtl_twr - DTL_TWR_BASE) << DTL_TWR_SHIFT;
1868 pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1872 static void init_Tref(const struct mem_controller *ctrl, const struct mem_param *param)
1875 dth = pci_read_config32(ctrl->f2, DRAM_TIMING_HIGH);
1876 dth &= ~(DTH_TREF_MASK << DTH_TREF_SHIFT);
1877 dth |= (param->dch_tref4k << DTH_TREF_SHIFT);
1878 pci_write_config32(ctrl->f2, DRAM_TIMING_HIGH, dth);
1881 static int update_dimm_Tref(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1885 unsigned tref, old_tref;
1886 value = spd_read_byte(ctrl->channel0[i], 3);
1887 if (value < 0) return -1;
1890 tref = param->dch_tref8k;
1892 tref = param->dch_tref4k;
1895 dth = pci_read_config32(ctrl->f2, DRAM_TIMING_HIGH);
1896 old_tref = (dth >> DTH_TREF_SHIFT) & DTH_TREF_MASK;
1897 if ((value == 12) && (old_tref == param->dch_tref4k)) {
1898 tref = param->dch_tref4k;
1900 tref = param->dch_tref8k;
1902 dth &= ~(DTH_TREF_MASK << DTH_TREF_SHIFT);
1903 dth |= (tref << DTH_TREF_SHIFT);
1904 pci_write_config32(ctrl->f2, DRAM_TIMING_HIGH, dth);
1909 static int update_dimm_x4(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1913 #if CONFIG_QRANK_DIMM_SUPPORT
1917 value = spd_read_byte(ctrl->channel0[i], 13);
1922 #if CONFIG_QRANK_DIMM_SUPPORT
1923 rank = spd_read_byte(ctrl->channel0[i], 5); /* number of physical banks */
1929 dimm = 1<<(DCL_x4DIMM_SHIFT+i);
1930 #if CONFIG_QRANK_DIMM_SUPPORT
1932 dimm |= 1<<(DCL_x4DIMM_SHIFT+i+2);
1935 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1940 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1944 static int update_dimm_ecc(const struct mem_controller *ctrl, const struct mem_param *param, int i)
1948 value = spd_read_byte(ctrl->channel0[i], 11);
1953 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1954 dcl &= ~DCL_DimmEccEn;
1955 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1960 static int count_dimms(const struct mem_controller *ctrl)
1965 for (index = 0; index < 8; index += 2) {
1967 csbase = pci_read_config32(ctrl->f2, (DRAM_CSBASE + (index << 2)));
1975 static void set_Twtr(const struct mem_controller *ctrl, const struct mem_param *param)
1979 dth = pci_read_config32(ctrl->f2, DRAM_TIMING_HIGH);
1980 dth &= ~(DTH_TWTR_MASK << DTH_TWTR_SHIFT);
1981 dth |= ((param->dtl_twtr - DTH_TWTR_BASE) << DTH_TWTR_SHIFT);
1982 pci_write_config32(ctrl->f2, DRAM_TIMING_HIGH, dth);
1985 static void set_Trwt(const struct mem_controller *ctrl, const struct mem_param *param)
1993 dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1994 latency = (dtl >> DTL_TCL_SHIFT) & DTL_TCL_MASK;
1996 if (is_opteron(ctrl)) {
1997 mtype = 0; /* dual channel */
1998 } else if (is_registered(ctrl)) {
1999 mtype = 1; /* registered 64bit interface */
2001 mtype = 2; /* unbuffered 64bit interface */
2015 die("Unknown LAT for Trwt");
2018 clocks = param->dtl_trwt[lat][mtype];
2019 if ((clocks < DTH_TRWT_MIN) || (clocks > DTH_TRWT_MAX)) {
2020 die("Unknown Trwt\n");
2023 dth = pci_read_config32(ctrl->f2, DRAM_TIMING_HIGH);
2024 dth &= ~(DTH_TRWT_MASK << DTH_TRWT_SHIFT);
2025 dth |= ((clocks - DTH_TRWT_BASE) << DTH_TRWT_SHIFT);
2026 pci_write_config32(ctrl->f2, DRAM_TIMING_HIGH, dth);
2030 static void set_Twcl(const struct mem_controller *ctrl, const struct mem_param *param)
2032 /* Memory Clocks after CAS# */
2035 if (is_registered(ctrl)) {
2040 dth = pci_read_config32(ctrl->f2, DRAM_TIMING_HIGH);
2041 dth &= ~(DTH_TWCL_MASK << DTH_TWCL_SHIFT);
2042 dth |= ((clocks - DTH_TWCL_BASE) << DTH_TWCL_SHIFT);
2043 pci_write_config32(ctrl->f2, DRAM_TIMING_HIGH, dth);
2047 static void set_read_preamble(const struct mem_controller *ctrl, const struct mem_param *param)
2050 unsigned rdpreamble;
2055 for (i = 0; i < 4; i++) {
2056 if (ctrl->channel0[i]) {
2061 /* map to index to param.rdpreamble array */
2062 if (is_registered(ctrl)) {
2064 } else if (slots < 3) {
2066 } else if (slots == 3) {
2068 } else if (slots == 4) {
2071 die("Unknown rdpreamble for this nr of slots");
2074 dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
2075 dch &= ~(DCH_RDPREAMBLE_MASK << DCH_RDPREAMBLE_SHIFT);
2076 rdpreamble = param->rdpreamble[i];
2078 if ((rdpreamble < DCH_RDPREAMBLE_MIN) || (rdpreamble > DCH_RDPREAMBLE_MAX)) {
2079 die("Unknown rdpreamble");
2082 dch |= (rdpreamble - DCH_RDPREAMBLE_BASE) << DCH_RDPREAMBLE_SHIFT;
2083 pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
2086 static void set_max_async_latency(const struct mem_controller *ctrl, const struct mem_param *param)
2092 dimms = count_dimms(ctrl);
2094 dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
2095 dch &= ~(DCH_ASYNC_LAT_MASK << DCH_ASYNC_LAT_SHIFT);
2097 if (is_registered(ctrl)) {
2109 die("Too many unbuffered dimms");
2111 else if (dimms == 3) {
2120 dch |= ((async_lat - DCH_ASYNC_LAT_BASE) << DCH_ASYNC_LAT_SHIFT);
2121 pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
2124 static void set_idle_cycle_limit(const struct mem_controller *ctrl, const struct mem_param *param)
2127 /* AMD says to Hardcode this */
2128 dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
2129 dch &= ~(DCH_IDLE_LIMIT_MASK << DCH_IDLE_LIMIT_SHIFT);
2130 dch |= DCH_IDLE_LIMIT_16 << DCH_IDLE_LIMIT_SHIFT;
2131 dch |= DCH_DYN_IDLE_CTR_EN;
2132 pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
2135 static long spd_set_dram_timing(const struct mem_controller *ctrl, const struct mem_param *param, long dimm_mask)
2139 init_Tref(ctrl, param);
2140 for (i = 0; i < DIMM_SOCKETS; i++) {
2142 if (!(dimm_mask & (1 << i))) {
2145 /* DRAM Timing Low Register */
2146 if ((rc = update_dimm_Trc (ctrl, param, i)) <= 0) goto dimm_err;
2147 if ((rc = update_dimm_Trfc(ctrl, param, i)) <= 0) goto dimm_err;
2148 if ((rc = update_dimm_Trcd(ctrl, param, i)) <= 0) goto dimm_err;
2149 if ((rc = update_dimm_Trrd(ctrl, param, i)) <= 0) goto dimm_err;
2150 if ((rc = update_dimm_Tras(ctrl, param, i)) <= 0) goto dimm_err;
2151 if ((rc = update_dimm_Trp (ctrl, param, i)) <= 0) goto dimm_err;
2153 /* DRAM Timing High Register */
2154 if ((rc = update_dimm_Tref(ctrl, param, i)) <= 0) goto dimm_err;
2157 /* DRAM Config Low */
2158 if ((rc = update_dimm_x4 (ctrl, param, i)) <= 0) goto dimm_err;
2159 if ((rc = update_dimm_ecc(ctrl, param, i)) <= 0) goto dimm_err;
2165 dimm_mask = disable_dimm(ctrl, i, dimm_mask);
2167 /* DRAM Timing Low Register */
2168 set_Twr(ctrl, param);
2170 /* DRAM Timing High Register */
2171 set_Twtr(ctrl, param);
2172 set_Trwt(ctrl, param);
2173 set_Twcl(ctrl, param);
2175 /* DRAM Config High */
2176 set_read_preamble(ctrl, param);
2177 set_max_async_latency(ctrl, param);
2178 set_idle_cycle_limit(ctrl, param);
2182 #if CONFIG_RAMINIT_SYSINFO
2183 static void sdram_set_spd_registers(const struct mem_controller *ctrl, struct sys_info *sysinfo)
2185 static void sdram_set_spd_registers(const struct mem_controller *ctrl)
2188 struct spd_set_memclk_result result;
2189 const struct mem_param *param;
2192 if (!controller_present(ctrl)) {
2193 // printk(BIOS_DEBUG, "No memory controller present\n");
2197 hw_enable_ecc(ctrl);
2198 activate_spd_rom(ctrl);
2199 dimm_mask = spd_detect_dimms(ctrl);
2200 if (!(dimm_mask & ((1 << DIMM_SOCKETS) - 1))) {
2201 printk(BIOS_DEBUG, "No memory for this cpu\n");
2204 dimm_mask = spd_enable_2channels(ctrl, dimm_mask);
2207 dimm_mask = spd_set_ram_size(ctrl , dimm_mask);
2210 dimm_mask = spd_handle_unbuffered_dimms(ctrl, dimm_mask);
2213 result = spd_set_memclk(ctrl, dimm_mask);
2214 param = result.param;
2215 dimm_mask = result.dimm_mask;
2218 dimm_mask = spd_set_dram_timing(ctrl, param , dimm_mask);
2224 /* Unrecoverable error reading SPD data */
2225 printk(BIOS_ERR, "SPD error - reset\n");
2230 #if CONFIG_HW_MEM_HOLE_SIZEK != 0
2231 static uint32_t hoist_memory(int controllers, const struct mem_controller *ctrl,unsigned hole_startk, int i)
2234 uint32_t carry_over;
2236 uint32_t base, limit;
2241 carry_over = (4*1024*1024) - hole_startk;
2243 for (ii=controllers - 1;ii>i;ii--) {
2244 base = pci_read_config32(ctrl[0].f1, 0x40 + (ii << 3));
2245 if ((base & ((1<<1)|(1<<0))) != ((1<<1)|(1<<0))) {
2248 limit = pci_read_config32(ctrl[0].f1, 0x44 + (ii << 3));
2249 for (j = 0; j < controllers; j++) {
2250 pci_write_config32(ctrl[j].f1, 0x44 + (ii << 3), limit + (carry_over << 2));
2251 pci_write_config32(ctrl[j].f1, 0x40 + (ii << 3), base + (carry_over << 2));
2254 limit = pci_read_config32(ctrl[0].f1, 0x44 + (i << 3));
2255 for (j = 0; j < controllers; j++) {
2256 pci_write_config32(ctrl[j].f1, 0x44 + (i << 3), limit + (carry_over << 2));
2259 base = pci_read_config32(dev, 0x40 + (i << 3));
2260 basek = (base & 0xffff0000) >> 2;
2261 if (basek == hole_startk) {
2262 //don't need set memhole here, because hole off set will be 0, overflow
2263 //so need to change base reg instead, new basek will be 4*1024*1024
2265 base |= (4*1024*1024)<<2;
2266 for (j = 0; j < controllers; j++) {
2267 pci_write_config32(ctrl[j].f1, 0x40 + (i<<3), base);
2271 hoist = /* hole start address */
2272 ((hole_startk << 10) & 0xff000000) +
2273 /* hole address to memory controller address */
2274 (((basek + carry_over) >> 6) & 0x0000ff00) +
2277 pci_write_config32(dev, 0xf0, hoist);
2283 static void set_hw_mem_hole(int controllers, const struct mem_controller *ctrl)
2286 uint32_t hole_startk;
2289 hole_startk = 4*1024*1024 - CONFIG_HW_MEM_HOLE_SIZEK;
2291 printk(BIOS_SPEW, "Handling memory hole at 0x%08x (default)\n", hole_startk);
2292 #if CONFIG_HW_MEM_HOLE_SIZE_AUTO_INC == 1
2293 /* We need to double check if hole_startk is valid.
2294 * If it is equal to the dram base address in K (base_k),
2295 * we need to decrease it.
2298 for (i=0; i<controllers; i++) {
2301 base = pci_read_config32(ctrl[0].f1, 0x40 + (i << 3));
2302 if ((base & ((1<<1)|(1<<0))) != ((1<<1)|(1<<0))) {
2305 base_k = (base & 0xffff0000) >> 2;
2306 if (base_k == hole_startk) {
2307 /* decrease memory hole startk to make sure it is
2308 * in the middle of the previous node
2310 hole_startk -= (base_k - basek_pri)>>1;
2311 break; /* only one hole */
2316 printk(BIOS_SPEW, "Handling memory hole at 0x%08x (adjusted)\n", hole_startk);
2318 /* Find node number that needs the memory hole configured */
2319 for (i=0; i<controllers; i++) {
2320 uint32_t base, limit;
2321 unsigned base_k, limit_k;
2322 base = pci_read_config32(ctrl[0].f1, 0x40 + (i << 3));
2323 if ((base & ((1<<1)|(1<<0))) != ((1<<1)|(1<<0))) {
2326 limit = pci_read_config32(ctrl[0].f1, 0x44 + (i << 3));
2327 base_k = (base & 0xffff0000) >> 2;
2328 limit_k = ((limit + 0x00010000) & 0xffff0000) >> 2;
2329 if ((base_k <= hole_startk) && (limit_k > hole_startk)) {
2331 hoist_memory(controllers, ctrl, hole_startk, i);
2332 end_k = memory_end_k(ctrl, controllers);
2333 set_top_mem(end_k, hole_startk);
2334 break; /* only one hole */
2342 #define TIMEOUT_LOOPS 300000
2343 #if CONFIG_RAMINIT_SYSINFO
2344 static void sdram_enable(int controllers, const struct mem_controller *ctrl, struct sys_info *sysinfo)
2346 static void sdram_enable(int controllers, const struct mem_controller *ctrl)
2351 #if CONFIG_HAVE_ACPI_RESUME == 1
2352 int suspend = acpi_is_wakeup_early();
2357 /* Error if I don't have memory */
2358 if (memory_end_k(ctrl, controllers) == 0) {
2362 /* Before enabling memory start the memory clocks */
2363 for (i = 0; i < controllers; i++) {
2365 if (!controller_present(ctrl + i))
2367 dch = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_HIGH);
2368 if (dch & (DCH_MEMCLK_EN0|DCH_MEMCLK_EN1|DCH_MEMCLK_EN2|DCH_MEMCLK_EN3)) {
2369 dch |= DCH_MEMCLK_VALID;
2370 pci_write_config32(ctrl[i].f2, DRAM_CONFIG_HIGH, dch);
2373 /* Disable dram receivers */
2375 dcl = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_LOW);
2376 dcl |= DCL_DisInRcvrs;
2377 pci_write_config32(ctrl[i].f2, DRAM_CONFIG_LOW, dcl);
2381 /* We need to wait a minimum of 20 MEMCLKS to enable the InitDram */
2382 /* And if necessary toggle the the reset on the dimms by hand */
2383 memreset(controllers, ctrl);
2385 for (i = 0; i < controllers; i++) {
2387 if (!controller_present(ctrl + i))
2389 /* Skip everything if I don't have any memory on this controller */
2390 dch = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_HIGH);
2391 if (!(dch & DCH_MEMCLK_VALID)) {
2395 /* Toggle DisDqsHys to get it working */
2396 dcl = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_LOW);
2397 if (dcl & DCL_DimmEccEn) {
2399 printk(BIOS_SPEW, "ECC enabled\n");
2400 mnc = pci_read_config32(ctrl[i].f3, MCA_NB_CONFIG);
2402 if (dcl & DCL_128BitEn) {
2403 mnc |= MNC_CHIPKILL_EN;
2405 pci_write_config32(ctrl[i].f3, MCA_NB_CONFIG, mnc);
2409 dcl |= DCL_DisDqsHys;
2410 pci_write_config32(ctrl[i].f2, DRAM_CONFIG_LOW, dcl);
2412 dcl &= ~DCL_DisDqsHys;
2413 dcl &= ~DCL_DLL_Disable;
2420 dcl |= (DCL_ESR | DCL_SRS);
2421 /* Handle errata 85 Insufficient Delay Between MEMCLK Startup
2422 and CKE Assertion During Resume From S3 */
2423 udelay(10); /* for unregistered */
2424 if (is_registered(&ctrl[i])) {
2425 udelay(100); /* 110us for registered (we wait 10us already) */
2429 dcl |= DCL_DramInit;
2430 whatWait = DCL_DramInit;
2432 pci_write_config32(ctrl[i].f2, DRAM_CONFIG_LOW, dcl);
2435 for (i = 0; i < controllers; i++) {
2437 if (!controller_present(ctrl + i))
2439 /* Skip everything if I don't have any memory on this controller */
2440 dch = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_HIGH);
2441 if (!(dch & DCH_MEMCLK_VALID)) {
2445 printk(BIOS_DEBUG, "Initializing memory: ");
2448 dcl = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_LOW);
2450 if ((loops & 1023) == 0) {
2451 printk(BIOS_DEBUG, ".");
2453 } while(((dcl & whatWait) != 0) && (loops < TIMEOUT_LOOPS));
2454 if (loops >= TIMEOUT_LOOPS) {
2455 printk(BIOS_DEBUG, " failed\n");
2459 if (!is_cpu_pre_c0()) {
2460 /* Wait until it is safe to touch memory */
2462 /* the registers are marked read-only but code zeros them */
2463 dcl &= ~(DCL_MemClrStatus | DCL_DramEnable);
2464 pci_write_config32(ctrl[i].f2, DRAM_CONFIG_LOW, dcl);
2467 dcl = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_LOW);
2468 } while(((dcl & DCL_MemClrStatus) == 0) || ((dcl & DCL_DramEnable) == 0) ||
2472 printk(BIOS_DEBUG, " done\n");
2475 #if CONFIG_HW_MEM_HOLE_SIZEK != 0
2476 // init hw mem hole here
2477 /* DramHoleValid bit only can be set after MemClrStatus is set by Hardware */
2478 if (!is_cpu_pre_e0())
2479 set_hw_mem_hole(controllers, ctrl);
2482 //FIXME add enable node interleaving here -- yhlu
2484 1. check how many nodes we have , if not all has ram installed get out
2485 2. check cs_base lo is 0, node 0 f2 0x40,,,,, if any one is not using lo is CS_BASE, get out
2486 3. check if other node is the same as node 0 about f2 0x40,,,,, otherwise get out
2487 4. if all ready enable node_interleaving in f1 0x40..... of every node
2488 5. for node interleaving we need to set mem hole to every node ( need recalcute hole offset in f0 for every node)
2493 static void set_sysinfo_in_ram(unsigned val)
2497 void fill_mem_ctrl(int controllers, struct mem_controller *ctrl_a,
2498 const uint16_t *spd_addr)
2502 struct mem_controller *ctrl;
2503 for (i=0;i<controllers; i++) {
2506 ctrl->f0 = PCI_DEV(0, 0x18+i, 0);
2507 ctrl->f1 = PCI_DEV(0, 0x18+i, 1);
2508 ctrl->f2 = PCI_DEV(0, 0x18+i, 2);
2509 ctrl->f3 = PCI_DEV(0, 0x18+i, 3);
2511 if (spd_addr == (void *)0) continue;
2513 for (j=0;j<DIMM_SOCKETS;j++) {
2514 ctrl->channel0[j] = spd_addr[(i*2+0)*DIMM_SOCKETS + j];
2515 ctrl->channel1[j] = spd_addr[(i*2+1)*DIMM_SOCKETS + j];