2 * This file is part of the coreboot project.
4 * Copyright (C) 2007-2009 coresystems GmbH
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #include <console/console.h>
21 #include <cpu/x86/mtrr.h>
22 #include <cpu/x86/cache.h>
23 #include <pc80/mc146818rtc.h>
26 #include <arch/romcc_io.h>
30 /* Debugging macros. */
31 #if CONFIG_DEBUG_RAM_SETUP
32 #define PRINTK_DEBUG(x...) printk(BIOS_DEBUG, x)
34 #define PRINTK_DEBUG(x...)
37 #define RAM_INITIALIZATION_COMPLETE (1 << 19)
39 #define RAM_COMMAND_SELF_REFRESH (0x0 << 16)
40 #define RAM_COMMAND_NOP (0x1 << 16)
41 #define RAM_COMMAND_PRECHARGE (0x2 << 16)
42 #define RAM_COMMAND_MRS (0x3 << 16)
43 #define RAM_COMMAND_EMRS (0x4 << 16)
44 #define RAM_COMMAND_CBR (0x6 << 16)
45 #define RAM_COMMAND_NORMAL (0x7 << 16)
47 #define RAM_EMRS_1 (0x0 << 21)
48 #define RAM_EMRS_2 (0x1 << 21)
49 #define RAM_EMRS_3 (0x2 << 21)
51 static inline int spd_read_byte(unsigned device, unsigned address)
53 return smbus_read_byte(device, address);
56 static __attribute__((noinline)) void do_ram_command(u32 command)
60 reg32 = MCHBAR32(DCC);
61 reg32 &= ~( (3<<21) | (1<<20) | (1<<19) | (7 << 16) );
64 /* Also set Init Complete */
65 if (command == RAM_COMMAND_NORMAL)
66 reg32 |= RAM_INITIALIZATION_COMPLETE;
68 PRINTK_DEBUG(" Sending RAM command 0x%08x", reg32);
70 MCHBAR32(DCC) = reg32; /* This is the actual magic */
72 PRINTK_DEBUG("...done\n");
77 static void ram_read32(u32 offset)
79 PRINTK_DEBUG(" ram read: %08x\n", offset);
84 #if CONFIG_DEBUG_RAM_SETUP
85 static void sdram_dump_mchbar_registers(void)
88 printk(BIOS_DEBUG, "Dumping MCHBAR Registers\n");
90 for (i=0; i<0xfff; i+=4) {
93 printk(BIOS_DEBUG, "0x%04x: 0x%08x\n", i, MCHBAR32(i));
98 static int memclk(void)
101 #if defined(CONFIG_NORTHBRIDGE_INTEL_I945GM)
104 switch (((MCHBAR32(CLKCFG) >> 4) & 7) - offset) {
108 default: printk(BIOS_DEBUG, "memclk: unknown register value %x\n", ((MCHBAR32(CLKCFG) >> 4) & 7) - offset);
113 #if defined(CONFIG_NORTHBRIDGE_INTEL_I945GM)
114 static u16 fsbclk(void)
116 switch (MCHBAR32(CLKCFG) & 7) {
120 default: printk(BIOS_DEBUG, "fsbclk: unknown register value %x\n", MCHBAR32(CLKCFG) & 7);
124 #elif defined(CONFIG_NORTHBRIDGE_INTEL_I945GC)
125 static u16 fsbclk(void)
127 switch (MCHBAR32(CLKCFG) & 7) {
131 default: printk(BIOS_DEBUG, "fsbclk: unknown register value %x\n", MCHBAR32(CLKCFG) & 7);
137 static int sdram_capabilities_max_supported_memory_frequency(void)
141 #if CONFIG_MAXIMUM_SUPPORTED_FREQUENCY
142 return CONFIG_MAXIMUM_SUPPORTED_FREQUENCY;
145 reg32 = pci_read_config32(PCI_DEV(0, 0x00, 0), 0xe4); /* CAPID0 + 4 */
153 /* Newer revisions of this chipset rather support faster memory clocks,
154 * so if it's a reserved value, return the fastest memory clock that we
155 * know of and can handle
161 * @brief determine whether chipset is capable of dual channel interleaved mode
163 * @return 1 if interleaving is supported, 0 otherwise
165 static int sdram_capabilities_interleave(void)
169 reg32 = pci_read_config32(PCI_DEV(0, 0x00,0), 0xe4); /* CAPID0 + 4 */
177 * @brief determine whether chipset is capable of two memory channels
179 * @return 1 if dual channel operation is supported, 0 otherwise
181 static int sdram_capabilities_dual_channel(void)
185 reg32 = pci_read_config32(PCI_DEV(0, 0x00,0), 0xe4); /* CAPID0 + 4 */
192 static int sdram_capabilities_enhanced_addressing_xor(void)
196 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe5); /* CAPID0 + 5 */
202 static int sdram_capabilities_two_dimms_per_channel(void)
206 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe8); /* CAPID0 + 8 */
212 // TODO check if we ever need this function
214 static int sdram_capabilities_MEM4G_disable(void)
218 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe5); /* CAPID0 + 5 */
225 #define GFX_FREQUENCY_CAP_166MHZ 0x04
226 #define GFX_FREQUENCY_CAP_200MHZ 0x03
227 #define GFX_FREQUENCY_CAP_250MHZ 0x02
228 #define GFX_FREQUENCY_CAP_ALL 0x00
230 static int sdram_capabilities_core_frequencies(void)
234 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe5); /* CAPID0 + 5 */
235 reg8 &= (1 << 3) | (1 << 2) | (1 << 1);
241 static void sdram_detect_errors(struct sys_info *sysinfo)
246 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa2);
248 if (reg8 & ((1<<7)|(1<<2))) {
250 printk(BIOS_DEBUG, "SLP S4# Assertion Width Violation.\n");
251 /* Write back clears bit 2 */
252 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
258 printk(BIOS_DEBUG, "DRAM initialization was interrupted.\n");
260 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
264 /* Set SLP_S3# Assertion Stretch Enable */
265 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa4); /* GEN_PMCON_3 */
267 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa4, reg8);
270 printk(BIOS_DEBUG, "Reset required.\n");
273 for (;;) asm("hlt"); /* Wait for reset! */
277 /* Set DRAM initialization bit in ICH7 */
278 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa2);
280 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
282 /* clear self refresh if not wake-up from suspend */
283 if (sysinfo->boot_path != 2) {
286 /* Validate self refresh config */
287 if (((sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED) ||
288 (sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED)) &&
289 !(MCHBAR8(0xf14) & (1<<0))) {
292 if (((sysinfo->dimm[2] != SYSINFO_DIMM_NOT_POPULATED) ||
293 (sysinfo->dimm[3] != SYSINFO_DIMM_NOT_POPULATED)) &&
294 !(MCHBAR8(0xf14) & (1<<1))) {
300 printk(BIOS_DEBUG, "Reset required.\n");
303 for (;;) asm("hlt"); /* Wait for reset! */
308 * @brief Get generic DIMM parameters.
309 * @param sysinfo Central memory controller information structure
311 * This function gathers several pieces of information for each system DIMM:
312 * o DIMM width (x8 / x16)
313 * o DIMM sides (single sided / dual sided)
315 * Also, some non-supported scenarios are detected.
318 static void sdram_get_dram_configuration(struct sys_info *sysinfo)
324 * i945 supports two DIMMs, in two configurations:
326 * - single channel with two dimms
327 * - dual channel with one dimm per channel
329 * In practice dual channel mainboards have their spd at 0x50, 0x52
330 * whereas single channel configurations have their spd at 0x50/x51
332 * The capability register knows a lot about the channel configuration
333 * but for now we stick with the information we gather from the SPD
337 if (sdram_capabilities_dual_channel()) {
338 sysinfo->dual_channel = 1;
339 printk(BIOS_DEBUG, "This mainboard supports Dual Channel Operation.\n");
341 sysinfo->dual_channel = 0;
342 printk(BIOS_DEBUG, "This mainboard supports only Single Channel Operation.\n");
346 * Since we only support two DIMMs in total, there is a limited number
347 * of combinations. This function returns the type of DIMMs.
349 * [0:7] lower DIMM population
350 * [8-15] higher DIMM population
353 * There are 5 different possible populations for a DIMM socket:
354 * 1. x16 double sided (X16DS)
355 * 2. x8 double sided (X8DS)
356 * 3. x16 single sided (X16SS)
357 * 4. x8 double stacked (X8DDS)
358 * 5. not populated (NC)
360 * For the return value we start counting at zero.
364 for (i=0; i<(2 * DIMM_SOCKETS); i++) {
365 u8 reg8, device = DIMM_SPD_BASE + i;
367 /* Initialize the socket information with a sane value */
368 sysinfo->dimm[i] = SYSINFO_DIMM_NOT_POPULATED;
370 /* Dual Channel not supported, but Channel 1? Bail out */
371 if (!sdram_capabilities_dual_channel() && (i >> 1))
374 /* Two DIMMs per channel not supported, but odd DIMM number? */
375 if (!sdram_capabilities_two_dimms_per_channel() && (i& 1))
378 printk(BIOS_DEBUG, "DDR II Channel %d Socket %d: ", (i >> 1), (i & 1));
380 if (spd_read_byte(device, SPD_MEMORY_TYPE) != SPD_MEMORY_TYPE_SDRAM_DDR2) {
381 printk(BIOS_DEBUG, "N/A\n");
385 reg8 = spd_read_byte(device, SPD_DIMM_CONFIG_TYPE);
386 if (reg8 == ERROR_SCHEME_ECC)
387 die("Error: ECC memory not supported by this chipset\n");
389 reg8 = spd_read_byte(device, SPD_MODULE_ATTRIBUTES);
390 if (reg8 & MODULE_BUFFERED)
391 die("Error: Buffered memory not supported by this chipset\n");
392 if (reg8 & MODULE_REGISTERED)
393 die("Error: Registered memory not supported by this chipset\n");
395 switch (spd_read_byte(device, SPD_PRIMARY_SDRAM_WIDTH)) {
397 switch (spd_read_byte(device, SPD_NUM_DIMM_BANKS) & 0x0f) {
399 printk(BIOS_DEBUG, "x8DDS\n");
400 sysinfo->dimm[i] = SYSINFO_DIMM_X8DDS;
403 printk(BIOS_DEBUG, "x8DS\n");
404 sysinfo->dimm[i] = SYSINFO_DIMM_X8DS;
407 printk(BIOS_DEBUG, "Unsupported.\n");
411 switch (spd_read_byte(device, SPD_NUM_DIMM_BANKS) & 0x0f) {
413 printk(BIOS_DEBUG, "x16DS\n");
414 sysinfo->dimm[i] = SYSINFO_DIMM_X16DS;
417 printk(BIOS_DEBUG, "x16SS\n");
418 sysinfo->dimm[i] = SYSINFO_DIMM_X16SS;
421 printk(BIOS_DEBUG, "Unsupported.\n");
425 die("Unsupported DDR-II memory width.\n");
428 dimm_mask |= (1 << i);
432 die("No memory installed.\n");
435 if (!(dimm_mask & ((1 << DIMM_SOCKETS) - 1))) {
436 printk(BIOS_INFO, "Channel 0 has no memory populated.\n");
441 * @brief determine if any DIMMs are stacked
443 * @param sysinfo central sysinfo data structure.
445 static void sdram_verify_package_type(struct sys_info * sysinfo)
449 /* Assume no stacked DIMMs are available until we find one */
450 sysinfo->package = 0;
451 for (i=0; i<2*DIMM_SOCKETS; i++) {
452 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
455 /* Is the current DIMM a stacked DIMM? */
456 if (spd_read_byte(DIMM_SPD_BASE + i, SPD_NUM_DIMM_BANKS) & (1 << 4))
457 sysinfo->package = 1;
461 static u8 sdram_possible_cas_latencies(struct sys_info * sysinfo)
466 /* Setup CAS mask with all supported CAS Latencies */
467 cas_mask = SPD_CAS_LATENCY_DDR2_3 |
468 SPD_CAS_LATENCY_DDR2_4 |
469 SPD_CAS_LATENCY_DDR2_5;
471 for (i=0; i<2*DIMM_SOCKETS; i++) {
472 if (sysinfo->dimm[i] != SYSINFO_DIMM_NOT_POPULATED)
473 cas_mask &= spd_read_byte(DIMM_SPD_BASE + i, SPD_ACCEPTABLE_CAS_LATENCIES);
477 die("No DDR-II modules with accepted CAS latencies found.\n");
483 static void sdram_detect_cas_latency_and_ram_speed(struct sys_info * sysinfo, u8 cas_mask)
486 int lowest_common_cas = 0;
487 int max_ram_speed = 0;
489 const u8 ddr2_speeds_table[] = {
490 0x50, 0x60, /* DDR2 400: tCLK = 5.0ns tAC = 0.6ns */
491 0x3d, 0x50, /* DDR2 533: tCLK = 3.75ns tAC = 0.5ns */
492 0x30, 0x45, /* DDR2 667: tCLK = 3.0ns tAC = 0.45ns */
495 const u8 spd_lookup_table[] = {
496 SPD_MIN_CYCLE_TIME_AT_CAS_MAX, SPD_ACCESS_TIME_FROM_CLOCK,
497 SPD_SDRAM_CYCLE_TIME_2ND, SPD_ACCESS_TIME_FROM_CLOCK_2ND,
498 SPD_SDRAM_CYCLE_TIME_3RD, SPD_ACCESS_TIME_FROM_CLOCK_3RD
501 switch (sdram_capabilities_max_supported_memory_frequency()) {
502 case 400: max_ram_speed = 0; break;
503 case 533: max_ram_speed = 1; break;
504 case 667: max_ram_speed = 2; break;
510 sysinfo->memory_frequency = 0;
513 if (cas_mask & SPD_CAS_LATENCY_DDR2_3) {
514 lowest_common_cas = 3;
515 } else if (cas_mask & SPD_CAS_LATENCY_DDR2_4) {
516 lowest_common_cas = 4;
517 } else if (cas_mask & SPD_CAS_LATENCY_DDR2_5) {
518 lowest_common_cas = 5;
520 PRINTK_DEBUG("lowest common cas = %d\n", lowest_common_cas);
522 for (j = max_ram_speed; j>=0; j--) {
523 int freq_cas_mask = cas_mask;
525 PRINTK_DEBUG("Probing Speed %d\n", j);
526 for (i=0; i<2*DIMM_SOCKETS; i++) {
527 int current_cas_mask;
529 PRINTK_DEBUG(" DIMM: %d\n", i);
530 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED) {
534 current_cas_mask = spd_read_byte(DIMM_SPD_BASE + i, SPD_ACCEPTABLE_CAS_LATENCIES);
536 while (current_cas_mask) {
537 int highest_supported_cas = 0, current_cas = 0;
538 PRINTK_DEBUG(" Current CAS mask: %04x; ", current_cas_mask);
539 if (current_cas_mask & SPD_CAS_LATENCY_DDR2_5) {
540 highest_supported_cas = 5;
541 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_4) {
542 highest_supported_cas = 4;
543 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_3) {
544 highest_supported_cas = 3;
546 if (current_cas_mask & SPD_CAS_LATENCY_DDR2_3) {
548 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_4) {
550 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_5) {
554 idx = highest_supported_cas - current_cas;
555 PRINTK_DEBUG("idx=%d, ", idx);
556 PRINTK_DEBUG("tCLK=%x, ", spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[2*idx]));
557 PRINTK_DEBUG("tAC=%x", spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[(2*idx)+1]));
559 if (spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[2*idx]) <= ddr2_speeds_table[2*j] &&
560 spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[(2*idx)+1]) <= ddr2_speeds_table[(2*j)+1]) {
561 PRINTK_DEBUG(": OK\n");
565 PRINTK_DEBUG(": Not fast enough!\n");
567 current_cas_mask &= ~(1 << (current_cas));
570 freq_cas_mask &= current_cas_mask;
571 if (!current_cas_mask) {
572 PRINTK_DEBUG(" No valid CAS for this speed on DIMM %d\n", i);
576 PRINTK_DEBUG(" freq_cas_mask for speed %d: %04x\n", j, freq_cas_mask);
579 case 0: sysinfo->memory_frequency = 400; break;
580 case 1: sysinfo->memory_frequency = 533; break;
581 case 2: sysinfo->memory_frequency = 667; break;
583 if (freq_cas_mask & SPD_CAS_LATENCY_DDR2_3) {
585 } else if (freq_cas_mask & SPD_CAS_LATENCY_DDR2_4) {
587 } else if (freq_cas_mask & SPD_CAS_LATENCY_DDR2_5) {
594 if (sysinfo->memory_frequency && sysinfo->cas) {
595 printk(BIOS_DEBUG, "Memory will be driven at %dMHz with CAS=%d clocks\n",
596 sysinfo->memory_frequency, sysinfo->cas);
598 die("Could not find common memory frequency and CAS\n");
602 static void sdram_detect_smallest_tRAS(struct sys_info * sysinfo)
607 int freq_multiplier = 0;
609 switch (sysinfo->memory_frequency) {
610 case 400: freq_multiplier = 0x14; break; /* 5ns */
611 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
612 case 667: freq_multiplier = 0x0c; break; /* 3ns */
615 tRAS_cycles = 4; /* 4 clocks minimum */
616 tRAS_time = tRAS_cycles * freq_multiplier;
618 for (i=0; i<2*DIMM_SOCKETS; i++) {
621 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
624 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_MIN_ACTIVE_TO_PRECHARGE_DELAY);
626 die("Invalid tRAS value.\n");
629 while ((tRAS_time >> 2) < reg8) {
630 tRAS_time += freq_multiplier;
634 if(tRAS_cycles > 0x18) {
635 die("DDR-II Module does not support this frequency (tRAS error)\n");
638 printk(BIOS_DEBUG, "tRAS = %d cycles\n", tRAS_cycles);
639 sysinfo->tras = tRAS_cycles;
642 static void sdram_detect_smallest_tRP(struct sys_info * sysinfo)
647 int freq_multiplier = 0;
649 switch (sysinfo->memory_frequency) {
650 case 400: freq_multiplier = 0x14; break; /* 5ns */
651 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
652 case 667: freq_multiplier = 0x0c; break; /* 3ns */
655 tRP_cycles = 2; /* 2 clocks minimum */
656 tRP_time = tRP_cycles * freq_multiplier;
658 for (i=0; i<2*DIMM_SOCKETS; i++) {
661 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
664 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_MIN_ROW_PRECHARGE_TIME);
666 die("Invalid tRP value.\n");
669 while (tRP_time < reg8) {
670 tRP_time += freq_multiplier;
676 die("DDR-II Module does not support this frequency (tRP error)\n");
679 printk(BIOS_DEBUG, "tRP = %d cycles\n", tRP_cycles);
680 sysinfo->trp = tRP_cycles;
683 static void sdram_detect_smallest_tRCD(struct sys_info * sysinfo)
688 int freq_multiplier = 0;
690 switch (sysinfo->memory_frequency) {
691 case 400: freq_multiplier = 0x14; break; /* 5ns */
692 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
693 case 667: freq_multiplier = 0x0c; break; /* 3ns */
696 tRCD_cycles = 2; /* 2 clocks minimum */
697 tRCD_time = tRCD_cycles * freq_multiplier;
699 for (i=0; i<2*DIMM_SOCKETS; i++) {
702 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
705 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_MIN_RAS_TO_CAS_DELAY);
707 die("Invalid tRCD value.\n");
710 while (tRCD_time < reg8) {
711 tRCD_time += freq_multiplier;
715 if(tRCD_cycles > 6) {
716 die("DDR-II Module does not support this frequency (tRCD error)\n");
719 printk(BIOS_DEBUG, "tRCD = %d cycles\n", tRCD_cycles);
720 sysinfo->trcd = tRCD_cycles;
723 static void sdram_detect_smallest_tWR(struct sys_info * sysinfo)
728 int freq_multiplier = 0;
730 switch (sysinfo->memory_frequency) {
731 case 400: freq_multiplier = 0x14; break; /* 5ns */
732 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
733 case 667: freq_multiplier = 0x0c; break; /* 3ns */
736 tWR_cycles = 2; /* 2 clocks minimum */
737 tWR_time = tWR_cycles * freq_multiplier;
739 for (i=0; i<2*DIMM_SOCKETS; i++) {
742 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
745 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_WRITE_RECOVERY_TIME);
747 die("Invalid tWR value.\n");
750 while (tWR_time < reg8) {
751 tWR_time += freq_multiplier;
756 die("DDR-II Module does not support this frequency (tWR error)\n");
759 printk(BIOS_DEBUG, "tWR = %d cycles\n", tWR_cycles);
760 sysinfo->twr = tWR_cycles;
763 static void sdram_detect_smallest_tRFC(struct sys_info * sysinfo)
767 const u8 tRFC_cycles[] = {
769 15, 21, 26, /* DDR2-400 */
770 20, 28, 34, /* DDR2-533 */
771 25, 35, 43 /* DDR2-667 */
774 for (i=0; i<2*DIMM_SOCKETS; i++) {
777 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
780 reg8 = sysinfo->banksize[i*2];
782 case 0x04: reg8 = 0; break;
783 case 0x08: reg8 = 1; break;
784 case 0x10: reg8 = 2; break;
785 case 0x20: reg8 = 3; break;
788 if (sysinfo->dimm[i] == SYSINFO_DIMM_X16DS || sysinfo->dimm[i] == SYSINFO_DIMM_X16SS)
792 /* Can this happen? Go back to 127.5ns just to be sure
793 * we don't run out of the array. This may be wrong
795 printk(BIOS_DEBUG, "DIMM %d is 1Gb x16.. Please report.\n", i);
804 switch (sysinfo->memory_frequency) {
805 case 667: index += 3; /* Fallthrough */
806 case 533: index += 3; /* Fallthrough */
810 sysinfo->trfc = tRFC_cycles[index];
811 printk(BIOS_DEBUG, "tRFC = %d cycles\n", tRFC_cycles[index]);
814 static void sdram_detect_smallest_refresh(struct sys_info * sysinfo)
818 sysinfo->refresh = 0;
820 for (i=0; i<2*DIMM_SOCKETS; i++) {
823 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
826 refresh = spd_read_byte(DIMM_SPD_BASE + i, SPD_REFRESH) & ~(1 << 7);
832 /* Refresh is slower than 15.6us, use 15.6us */
837 sysinfo->refresh = 1;
841 die("DDR-II module has unsupported refresh value\n");
843 printk(BIOS_DEBUG, "Refresh: %s\n", sysinfo->refresh?"7.8us":"15.6us");
846 static void sdram_verify_burst_length(struct sys_info * sysinfo)
850 for (i=0; i<2*DIMM_SOCKETS; i++) {
851 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
854 if (!(spd_read_byte(DIMM_SPD_BASE + i, SPD_SUPPORTED_BURST_LENGTHS) & SPD_BURST_LENGTH_8))
855 die("Only DDR-II RAM with burst length 8 is supported by this chipset.\n");
859 static void sdram_program_dram_width(struct sys_info * sysinfo)
861 u16 c0dramw=0, c1dramw=0;
864 if (sysinfo->dual_channel)
869 switch (sysinfo->dimm[0]) {
870 case 0: c0dramw = 0x0000; break; /* x16DS */
871 case 1: c0dramw = 0x0001; break; /* x8DS */
872 case 2: c0dramw = 0x0000; break; /* x16SS */
873 case 3: c0dramw = 0x0005; break; /* x8DDS */
874 case 4: c0dramw = 0x0000; break; /* NC */
877 switch (sysinfo->dimm[idx]) {
878 case 0: c1dramw = 0x0000; break; /* x16DS */
879 case 1: c1dramw = 0x0010; break; /* x8DS */
880 case 2: c1dramw = 0x0000; break; /* x16SS */
881 case 3: c1dramw = 0x0050; break; /* x8DDS */
882 case 4: c1dramw = 0x0000; break; /* NC */
885 if ( !sdram_capabilities_dual_channel() ) {
891 MCHBAR16(C0DRAMW) = c0dramw;
892 MCHBAR16(C1DRAMW) = c1dramw;
895 static void sdram_write_slew_rates(u32 offset, const u32 *slew_rate_table)
900 MCHBAR32(offset+(i*4)) = slew_rate_table[i];
903 static const u32 dq2030[] = {
904 0x08070706, 0x0a090908, 0x0d0c0b0a, 0x12100f0e,
905 0x1a181614, 0x22201e1c, 0x2a282624, 0x3934302d,
906 0x0a090908, 0x0c0b0b0a, 0x0e0d0d0c, 0x1211100f,
907 0x19171513, 0x211f1d1b, 0x2d292623, 0x3f393531
910 static const u32 dq2330[] = {
911 0x08070706, 0x0a090908, 0x0d0c0b0a, 0x12100f0e,
912 0x1a181614, 0x22201e1c, 0x2a282624, 0x3934302d,
913 0x0a090908, 0x0c0b0b0a, 0x0e0d0d0c, 0x1211100f,
914 0x19171513, 0x211f1d1b, 0x2d292623, 0x3f393531
917 static const u32 cmd2710[] = {
918 0x07060605, 0x0f0d0b09, 0x19171411, 0x1f1f1d1b,
919 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f,
920 0x1110100f, 0x0f0d0b09, 0x19171411, 0x1f1f1d1b,
921 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f
924 static const u32 cmd3210[] = {
925 0x0f0d0b0a, 0x17151311, 0x1f1d1b19, 0x1f1f1f1f,
926 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f,
927 0x18171615, 0x1f1f1c1a, 0x1f1f1f1f, 0x1f1f1f1f,
928 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f
931 static const u32 clk2030[] = {
932 0x0e0d0d0c, 0x100f0f0e, 0x100f0e0d, 0x15131211,
933 0x1d1b1917, 0x2523211f, 0x2a282927, 0x32302e2c,
934 0x17161514, 0x1b1a1918, 0x1f1e1d1c, 0x23222120,
935 0x27262524, 0x2d2b2928, 0x3533312f, 0x3d3b3937
938 static const u32 ctl3215[] = {
939 0x01010000, 0x03020101, 0x07060504, 0x0b0a0908,
940 0x100f0e0d, 0x14131211, 0x18171615, 0x1c1b1a19,
941 0x05040403, 0x07060605, 0x0a090807, 0x0f0d0c0b,
942 0x14131211, 0x18171615, 0x1c1b1a19, 0x201f1e1d
945 static const u32 ctl3220[] = {
946 0x05040403, 0x07060505, 0x0e0c0a08, 0x1a171411,
947 0x2825221f, 0x35322f2b, 0x3e3e3b38, 0x3e3e3e3e,
948 0x09080807, 0x0b0a0a09, 0x0f0d0c0b, 0x1b171311,
949 0x2825221f, 0x35322f2b, 0x3e3e3b38, 0x3e3e3e3e
952 static const u32 nc[] = {
953 0x00000000, 0x00000000, 0x00000000, 0x00000000,
954 0x00000000, 0x00000000, 0x00000000, 0x00000000,
955 0x00000000, 0x00000000, 0x00000000, 0x00000000,
956 0x00000000, 0x00000000, 0x00000000, 0x00000000
970 static const u8 dual_channel_slew_group_lookup[] = {
971 DQ2030, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD3210,
972 DQ2030, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD3210,
973 DQ2030, CMD3210, NC, CTL3215, NC, CLK2030, DQ2030, CMD3210,
974 DQ2030, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD2710,
975 DQ2030, CMD3210, NC, CTL3215, NC, CLK2030, NC, NC,
977 DQ2030, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD3210,
978 DQ2030, CMD3210, CTL3215, NC, CLK2030, NC, DQ2030, CMD3210,
979 DQ2030, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD3210,
980 DQ2030, CMD3210, CTL3215, NC, CLK2030, NC, DQ2030, CMD2710,
981 DQ2030, CMD3210, CTL3215, NC, CLK2030, NC, NC, NC,
983 DQ2030, CMD3210, NC, CTL3215, NC, CLK2030, DQ2030, CMD3210,
984 DQ2030, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD3210,
985 DQ2030, CMD3210, NC, CTL3215, NC, CLK2030, DQ2030, CMD3210,
986 DQ2030, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD2710,
987 DQ2030, CMD3210, NC, CTL3215, NC, CLK2030, NC, NC,
989 DQ2030, CMD2710, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD3210,
990 DQ2030, CMD2710, CTL3215, NC, CLK2030, NC, DQ2030, CMD3210,
991 DQ2030, CMD2710, CTL3215, CTL3215, CLK2030, CLK2030, DQ2030, CMD3210,
992 DQ2030, CMD2710, CTL3215, NC, CLK2030, NC, DQ2030, CMD2710,
993 DQ2030, CMD2710, CTL3215, NC, CLK2030, NC, NC, NC,
995 NC, NC, NC, CTL3215, NC, CLK2030, DQ2030, CMD3210,
996 NC, NC, CTL3215, NC, CLK2030, NC, DQ2030, CMD3210,
997 NC, NC, NC, CTL3215, NC, CLK2030, DQ2030, CMD3210,
998 NC, NC, CTL3215, NC, CLK2030, CLK2030, DQ2030, CMD2710
1001 static const u8 single_channel_slew_group_lookup[] = {
1002 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1003 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1004 DQ2330, CMD3210, NC, CTL3215, NC, CLK2030, DQ2330, CMD3210,
1005 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1006 DQ2330, CMD3210, NC, CTL3215, NC, CLK2030, NC, NC,
1008 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1009 DQ2330, CMD3210, CTL3215, NC, CLK2030, NC, DQ2330, CMD3210,
1010 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1011 DQ2330, CMD3210, CTL3215, NC, CLK2030, NC, DQ2330, CMD3210,
1012 DQ2330, CMD3210, CTL3215, NC, CLK2030, NC, NC, NC,
1014 DQ2330, CMD3210, NC, CTL3215, NC, CLK2030, DQ2330, CMD3210,
1015 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1016 DQ2330, CMD3210, NC, CTL3215, NC, CLK2030, DQ2330, CMD3210,
1017 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1018 DQ2330, CMD3210, NC, CTL3215, NC, CLK2030, NC, NC,
1020 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1021 DQ2330, CMD3210, CTL3215, NC, CLK2030, NC, DQ2330, CMD3210,
1022 DQ2330, CMD3210, CTL3215, CTL3215, CLK2030, CLK2030, DQ2330, CMD3210,
1023 DQ2330, CMD3210, CTL3215, NC, CLK2030, NC, DQ2330, CMD3210,
1024 DQ2330, CMD3210, CTL3215, NC, CLK2030, NC, NC, NC,
1026 DQ2330, NC, NC, CTL3215, NC, CLK2030, DQ2030, CMD3210,
1027 DQ2330, NC, CTL3215, NC, CLK2030, NC, DQ2030, CMD3210,
1028 DQ2330, NC, NC, CTL3215, NC, CLK2030, DQ2030, CMD3210,
1029 DQ2330, NC, CTL3215, NC, CLK2030, CLK2030, DQ2030, CMD3210
1032 static const u32 *slew_group_lookup(int dual_channel, int index)
1034 const u8 *slew_group;
1035 /* Dual Channel needs different tables. */
1037 slew_group = dual_channel_slew_group_lookup;
1039 slew_group = single_channel_slew_group_lookup;
1041 switch (slew_group[index]) {
1042 case DQ2030: return dq2030;
1043 case DQ2330: return dq2330;
1044 case CMD2710: return cmd2710;
1045 case CMD3210: return cmd3210;
1046 case CLK2030: return clk2030;
1047 case CTL3215: return ctl3215;
1048 case CTL3220: return ctl3220;
1055 #if defined(CONFIG_NORTHBRIDGE_INTEL_I945GM)
1056 /* Strength multiplier tables */
1057 static const u8 dual_channel_strength_multiplier[] = {
1058 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
1059 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
1060 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
1061 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x22,
1062 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
1063 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
1064 0x44, 0x11, 0x11, 0x00, 0x44, 0x00, 0x44, 0x11,
1065 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
1066 0x44, 0x11, 0x11, 0x00, 0x44, 0x00, 0x44, 0x22,
1067 0x44, 0x11, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
1068 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
1069 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
1070 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
1071 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x22,
1072 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
1073 0x44, 0x22, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
1074 0x44, 0x22, 0x11, 0x00, 0x44, 0x00, 0x44, 0x11,
1075 0x44, 0x22, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
1076 0x44, 0x22, 0x11, 0x00, 0x44, 0x00, 0x44, 0x22,
1077 0x44, 0x22, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
1079 0x00, 0x00, 0x11, 0x00, 0x44, 0x00, 0x44, 0x11,
1080 0x00, 0x00, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
1081 0x00, 0x00, 0x11, 0x00, 0x44, 0x44, 0x44, 0x22
1084 static const u8 single_channel_strength_multiplier[] = {
1085 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1086 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1087 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
1088 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1089 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
1090 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1091 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
1092 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1093 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
1094 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
1095 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
1096 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1097 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
1098 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1099 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
1100 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1101 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
1102 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
1103 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
1104 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
1105 0x33, 0x00, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
1106 0x33, 0x00, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
1107 0x33, 0x00, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
1108 0x33, 0x00, 0x11, 0x00, 0x44, 0x44, 0x33, 0x11
1110 #elif defined(CONFIG_NORTHBRIDGE_INTEL_I945GC)
1111 static const u8 dual_channel_strength_multiplier[] = {
1112 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1113 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1114 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1115 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x33,
1116 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1117 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1118 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1119 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1120 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x33,
1121 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1122 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1123 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1124 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1125 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x33,
1126 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1127 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1128 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1129 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1130 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x33,
1131 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1132 0x44, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1133 0x44, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1134 0x44, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x22,
1135 0x44, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x33
1138 static const u8 single_channel_strength_multiplier[] = {
1139 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1140 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1141 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1142 0x44, 0x55, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1143 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1144 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1145 0x44, 0x55, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1146 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1147 0x44, 0x88, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1148 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1149 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1150 0x44, 0x44, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1151 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1152 0x44, 0x55, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1153 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1154 0x44, 0x55, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1155 0x44, 0x88, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1156 0x44, 0x55, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1157 0x44, 0x88, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1158 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1159 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1160 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1161 0x44, 0x22, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00,
1162 0x44, 0x33, 0x00, 0x00, 0x44, 0x44, 0x44, 0x00
1166 static void sdram_rcomp_buffer_strength_and_slew(struct sys_info *sysinfo)
1168 const u8 * strength_multiplier;
1169 int idx, dual_channel;
1171 /* Set Strength Multipliers */
1173 /* Dual Channel needs different tables. */
1174 if (sdram_capabilities_dual_channel()) {
1175 printk(BIOS_DEBUG, "Programming Dual Channel RCOMP\n");
1176 strength_multiplier = dual_channel_strength_multiplier;
1178 idx = 5 * sysinfo->dimm[0] + sysinfo->dimm[2];
1180 printk(BIOS_DEBUG, "Programming Single Channel RCOMP\n");
1181 strength_multiplier = single_channel_strength_multiplier;
1183 idx = 5 * sysinfo->dimm[0] + sysinfo->dimm[1];
1186 printk(BIOS_DEBUG, "Table Index: %d\n", idx);
1188 MCHBAR8(G1SC) = strength_multiplier[idx * 8 + 0];
1189 MCHBAR8(G2SC) = strength_multiplier[idx * 8 + 1];
1190 MCHBAR8(G3SC) = strength_multiplier[idx * 8 + 2];
1191 MCHBAR8(G4SC) = strength_multiplier[idx * 8 + 3];
1192 MCHBAR8(G5SC) = strength_multiplier[idx * 8 + 4];
1193 MCHBAR8(G6SC) = strength_multiplier[idx * 8 + 5];
1194 MCHBAR8(G7SC) = strength_multiplier[idx * 8 + 6];
1195 MCHBAR8(G8SC) = strength_multiplier[idx * 8 + 7];
1198 sdram_write_slew_rates(G1SRPUT, slew_group_lookup(dual_channel, idx * 8 + 0));
1199 sdram_write_slew_rates(G2SRPUT, slew_group_lookup(dual_channel, idx * 8 + 1));
1200 if ((slew_group_lookup(dual_channel, idx * 8 + 2) != nc) && (sysinfo->package == SYSINFO_PACKAGE_STACKED)) {
1202 sdram_write_slew_rates(G3SRPUT, ctl3220);
1204 sdram_write_slew_rates(G3SRPUT, slew_group_lookup(dual_channel, idx * 8 + 2));
1206 sdram_write_slew_rates(G4SRPUT, slew_group_lookup(dual_channel, idx * 8 + 3));
1207 sdram_write_slew_rates(G5SRPUT, slew_group_lookup(dual_channel, idx * 8 + 4));
1208 sdram_write_slew_rates(G6SRPUT, slew_group_lookup(dual_channel, idx * 8 + 5));
1211 if (sysinfo->dual_channel) {
1212 sdram_write_slew_rates(G7SRPUT, slew_group_lookup(dual_channel, idx * 8 + 6));
1213 sdram_write_slew_rates(G8SRPUT, slew_group_lookup(dual_channel, idx * 8 + 7));
1215 sdram_write_slew_rates(G7SRPUT, nc);
1216 sdram_write_slew_rates(G8SRPUT, nc);
1220 static void sdram_enable_rcomp(void)
1223 /* Enable Global Periodic RCOMP */
1225 reg32 = MCHBAR32(GBRCOMPCTL);
1226 reg32 &= ~(1 << 23);
1227 MCHBAR32(GBRCOMPCTL) = reg32;
1230 static void sdram_program_dll_timings(struct sys_info *sysinfo)
1232 u32 chan0dll = 0, chan1dll = 0;
1235 printk(BIOS_DEBUG, "Programming DLL Timings... \n");
1237 MCHBAR16(DQSMT) &= ~( (3 << 12) | (1 << 10) | ( 0xf << 0) );
1238 MCHBAR16(DQSMT) |= (1 << 13) | (0xc << 0);
1240 /* We drive both channels with the same speed */
1241 switch (sysinfo->memory_frequency) {
1242 case 400: chan0dll = 0x26262626; chan1dll=0x26262626; break; /* 400MHz */
1243 case 533: chan0dll = 0x22222222; chan1dll=0x22222222; break; /* 533MHz */
1244 case 667: chan0dll = 0x11111111; chan1dll=0x11111111; break; /* 667MHz */
1247 for (i=0; i < 4; i++) {
1248 MCHBAR32(C0R0B00DQST + (i * 0x10) + 0) = chan0dll;
1249 MCHBAR32(C0R0B00DQST + (i * 0x10) + 4) = chan0dll;
1250 MCHBAR32(C1R0B00DQST + (i * 0x10) + 0) = chan1dll;
1251 MCHBAR32(C1R0B00DQST + (i * 0x10) + 4) = chan1dll;
1255 static void sdram_force_rcomp(void)
1260 reg32 = MCHBAR32(ODTC);
1262 MCHBAR32(ODTC) = reg32;
1264 reg32 = MCHBAR32(SMSRCTL);
1266 MCHBAR32(SMSRCTL) = reg32;
1268 /* Start initial RCOMP */
1269 reg32 = MCHBAR32(GBRCOMPCTL);
1271 MCHBAR32(GBRCOMPCTL) = reg32;
1273 reg8 = i945_silicon_revision();
1274 if ((reg8 == 0 && (MCHBAR32(DCC) & (3 << 0)) == 0) || (reg8 == 1)) {
1276 reg32 = MCHBAR32(GBRCOMPCTL);
1278 MCHBAR32(GBRCOMPCTL) = reg32;
1282 static void sdram_initialize_system_memory_io(struct sys_info *sysinfo)
1287 printk(BIOS_DEBUG, "Initializing System Memory IO... \n");
1288 /* Enable Data Half Clock Pushout */
1289 reg8 = MCHBAR8(C0HCTC);
1292 MCHBAR8(C0HCTC) = reg8;
1294 reg8 = MCHBAR8(C1HCTC);
1297 MCHBAR8(C1HCTC) = reg8;
1299 MCHBAR16(WDLLBYPMODE) &= ~( (1 << 9) | (1 << 6) | (1 << 4) | (1 << 3) | (1 << 1) );
1300 MCHBAR16(WDLLBYPMODE) |= (1 << 8) | (1 << 7) | (1 << 5) | (1 << 2) | (1 << 0);
1302 MCHBAR8(C0WDLLCMC) = 0;
1303 MCHBAR8(C1WDLLCMC) = 0;
1305 /* Program RCOMP Settings */
1306 sdram_program_dram_width(sysinfo);
1308 sdram_rcomp_buffer_strength_and_slew(sysinfo);
1310 /* Indicate that RCOMP programming is done */
1311 reg32 = MCHBAR32(GBRCOMPCTL);
1312 reg32 &= ~( (1 << 29) | (1 << 26) | (3 << 21) | (3 << 2) );
1313 reg32 |= (3 << 27) | (3 << 0);
1314 MCHBAR32(GBRCOMPCTL) = reg32;
1316 MCHBAR32(GBRCOMPCTL) |= (1 << 10);
1318 /* Program DLL Timings */
1319 sdram_program_dll_timings(sysinfo);
1321 /* Force RCOMP cycle */
1322 sdram_force_rcomp();
1325 static void sdram_enable_system_memory_io(struct sys_info *sysinfo)
1329 printk(BIOS_DEBUG, "Enabling System Memory IO... \n");
1331 reg32 = MCHBAR32(RCVENMT);
1332 reg32 &= ~(0x3f << 6);
1333 MCHBAR32(RCVENMT) = reg32; /* [11:6] = 0 */
1335 reg32 |= (1 << 11) | (1 << 9);
1336 MCHBAR32(RCVENMT) = reg32;
1338 reg32 = MCHBAR32(DRTST);
1339 reg32 |= (1 << 3) | (1 << 2);
1340 MCHBAR32(DRTST) = reg32;
1342 reg32 = MCHBAR32(DRTST);
1343 reg32 |= (1 << 6) | (1 << 4);
1344 MCHBAR32(DRTST) = reg32;
1346 asm volatile ("nop; nop;" ::: "memory");
1348 reg32 = MCHBAR32(DRTST);
1350 /* Is channel 0 populated? */
1351 if (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
1352 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED)
1353 reg32 |= (1 << 7) | (1 << 5);
1357 /* Is channel 1 populated? */
1358 if (sysinfo->dimm[2] != SYSINFO_DIMM_NOT_POPULATED ||
1359 sysinfo->dimm[3] != SYSINFO_DIMM_NOT_POPULATED)
1360 reg32 |= (1 << 9) | (1 << 8);
1364 MCHBAR32(DRTST) = reg32;
1366 /* Activate DRAM Channel IO Buffers */
1367 if (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
1368 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED) {
1369 reg32 = MCHBAR32(C0DRC1);
1371 MCHBAR32(C0DRC1) = reg32;
1373 if (sysinfo->dimm[2] != SYSINFO_DIMM_NOT_POPULATED ||
1374 sysinfo->dimm[3] != SYSINFO_DIMM_NOT_POPULATED) {
1375 reg32 = MCHBAR32(C1DRC1);
1377 MCHBAR32(C1DRC1) = reg32;
1382 unsigned long side1;
1383 unsigned long side2;
1386 static struct dimm_size sdram_get_dimm_size(u16 device)
1388 /* Calculate the log base 2 size of a DIMM in bits */
1389 struct dimm_size sz;
1390 int value, low, rows, columns;
1395 rows = spd_read_byte(device, SPD_NUM_ROWS); /* rows */
1396 if (rows < 0) goto hw_err;
1397 if ((rows & 0xf) == 0) goto val_err;
1398 sz.side1 += rows & 0xf;
1400 columns = spd_read_byte(device, SPD_NUM_COLUMNS); /* columns */
1401 if (columns < 0) goto hw_err;
1402 if ((columns & 0xf) == 0) goto val_err;
1403 sz.side1 += columns & 0xf;
1405 value = spd_read_byte(device, SPD_NUM_BANKS_PER_SDRAM); /* banks */
1406 if (value < 0) goto hw_err;
1407 if ((value & 0xff) == 0) goto val_err;
1408 sz.side1 += log2(value & 0xff);
1410 /* Get the module data width and convert it to a power of two */
1411 value = spd_read_byte(device, SPD_MODULE_DATA_WIDTH_MSB); /* (high byte) */
1412 if (value < 0) goto hw_err;
1416 low = spd_read_byte(device, SPD_MODULE_DATA_WIDTH_LSB); /* (low byte) */
1417 if (low < 0) goto hw_err;
1418 value = value | (low & 0xff);
1419 if ((value != 72) && (value != 64)) goto val_err;
1420 sz.side1 += log2(value);
1423 value = spd_read_byte(device, SPD_NUM_DIMM_BANKS); /* number of physical banks */
1425 if (value < 0) goto hw_err;
1428 if (value == 1) goto out;
1429 if (value != 2) goto val_err;
1431 /* Start with the symmetrical case */
1432 sz.side2 = sz.side1;
1434 if ((rows & 0xf0) == 0) goto out; /* If symmetrical we are done */
1436 /* Don't die here, I have not come across any of these to test what
1439 printk(BIOS_ERR, "Assymetric DIMMs are not supported by this chipset\n");
1441 sz.side2 -= (rows & 0x0f); /* Subtract out rows on side 1 */
1442 sz.side2 += ((rows >> 4) & 0x0f); /* Add in rows on side 2 */
1444 sz.side2 -= (columns & 0x0f); /* Subtract out columns on side 1 */
1445 sz.side2 += ((columns >> 4) & 0x0f); /* Add in columns on side 2 */
1450 die("Bad SPD value\n");
1452 /* If a hardware error occurs the spd rom probably does not exist.
1453 * In this case report that there is no memory
1461 static void sdram_detect_dimm_size(struct sys_info * sysinfo)
1465 for(i = 0; i < 2 * DIMM_SOCKETS; i++) {
1466 struct dimm_size sz;
1468 sysinfo->banksize[i * 2] = 0;
1469 sysinfo->banksize[(i * 2) + 1] = 0;
1471 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
1474 sz = sdram_get_dimm_size(DIMM_SPD_BASE + i);
1476 sysinfo->banks[i] = spd_read_byte(DIMM_SPD_BASE + i, SPD_NUM_BANKS_PER_SDRAM); /* banks */
1479 die("DDR-II rank size smaller than 128MB is not supported.\n");
1481 sysinfo->banksize[i * 2] = 1 << (sz.side1 - 28);
1483 printk(BIOS_DEBUG, "DIMM %d side 0 = %d MB\n", i, sysinfo->banksize[i * 2] * 32 );
1488 /* If there is a second side, it has to have at least 128M, too */
1490 die("DDR-II rank size smaller than 128MB is not supported.\n");
1492 sysinfo->banksize[(i * 2) + 1] = 1 << (sz.side2 - 28);
1494 printk(BIOS_DEBUG, "DIMM %d side 1 = %d MB\n", i, sysinfo->banksize[(i * 2) + 1] * 32);
1498 static int sdram_program_row_boundaries(struct sys_info *sysinfo)
1501 int cum0, cum1, tolud, tom;
1503 printk(BIOS_DEBUG, "Setting RAM size... \n");
1506 for(i = 0; i < 2 * DIMM_SOCKETS; i++) {
1507 cum0 += sysinfo->banksize[i];
1508 MCHBAR8(C0DRB0+i) = cum0;
1511 /* Assume we continue in Channel 1 where we stopped in Channel 0 */
1514 /* Exception: Interleaved starts from the beginning */
1515 if (sysinfo->interleaved)
1519 /* Exception: Channel 1 is not populated. C1DRB stays zero */
1520 if (sysinfo->dimm[2] == SYSINFO_DIMM_NOT_POPULATED &&
1521 sysinfo->dimm[3] == SYSINFO_DIMM_NOT_POPULATED)
1525 for(i = 0; i < 2 * DIMM_SOCKETS; i++) {
1526 cum1 += sysinfo->banksize[i + 4];
1527 MCHBAR8(C1DRB0+i) = cum1;
1530 /* Set TOLUD Top Of Low Usable DRAM */
1531 if (sysinfo->interleaved)
1532 tolud = (cum0 + cum1) << 1;
1534 tolud = (cum1 ? cum1 : cum0) << 1;
1536 /* The TOM register has a different format */
1539 /* Limit the value of TOLUD to leave some space for PCI memory. */
1541 tolud = 0xd0; /* 3.25GB : 0.75GB */
1543 pci_write_config8(PCI_DEV(0,0,0), TOLUD, tolud);
1545 printk(BIOS_DEBUG, "C0DRB = 0x%08x\n", MCHBAR32(C0DRB0));
1546 printk(BIOS_DEBUG, "C1DRB = 0x%08x\n", MCHBAR32(C1DRB0));
1547 printk(BIOS_DEBUG, "TOLUD = 0x%04x\n", pci_read_config8(PCI_DEV(0,0,0), TOLUD));
1549 pci_write_config16(PCI_DEV(0,0,0), TOM, tom);
1554 static int sdram_set_row_attributes(struct sys_info *sysinfo)
1557 u16 dra0=0, dra1=0, dra = 0;
1559 printk(BIOS_DEBUG, "Setting row attributes... \n");
1560 for(i=0; i < 2 * DIMM_SOCKETS; i++) {
1564 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED) {
1568 device = DIMM_SPD_BASE + i;
1570 value = spd_read_byte(device, SPD_NUM_ROWS); /* rows */
1571 columnsrows = (value & 0x0f);
1573 value = spd_read_byte(device, SPD_NUM_COLUMNS); /* columns */
1574 columnsrows |= (value & 0xf) << 4;
1576 switch (columnsrows) {
1577 case 0x9d: dra = 2; break;
1578 case 0xad: dra = 3; break;
1579 case 0xbd: dra = 4; break;
1580 case 0xae: dra = 3; break;
1581 case 0xbe: dra = 4; break;
1582 default: die("Unsupported Rows/Columns. (DRA)");
1585 /* Double Sided DIMMs? */
1586 if (sysinfo->banksize[(2 * i) + 1] != 0) {
1587 dra = (dra << 4) | dra;
1590 if (i < DIMM_SOCKETS)
1591 dra0 |= (dra << (i*8));
1593 dra1 |= (dra << ((i - DIMM_SOCKETS)*8));
1596 MCHBAR16(C0DRA0) = dra0;
1597 MCHBAR16(C1DRA0) = dra1;
1599 printk(BIOS_DEBUG, "C0DRA = 0x%04x\n", dra0);
1600 printk(BIOS_DEBUG, "C1DRA = 0x%04x\n", dra1);
1605 static void sdram_set_bank_architecture(struct sys_info *sysinfo)
1610 MCHBAR16(C1BNKARC) &= 0xff00;
1611 MCHBAR16(C0BNKARC) &= 0xff00;
1614 for (i=0; i < 2 * DIMM_SOCKETS; i++) {
1615 /* Switch to second channel */
1616 if (i == DIMM_SOCKETS)
1619 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
1622 if (sysinfo->banks[i] != 8)
1625 printk(BIOS_SPEW, "DIMM%d has 8 banks.\n", i);
1628 MCHBAR16(off32) |= 0x50;
1630 MCHBAR16(off32) |= 0x05;
1634 #define REFRESH_7_8US 1
1635 #define REFRESH_15_6US 0
1636 static void sdram_program_refresh_rate(struct sys_info *sysinfo)
1640 if (sysinfo->refresh == REFRESH_7_8US) {
1641 reg32 = (2 << 8); /* Refresh enabled at 7.8us */
1643 reg32 = (1 << 8); /* Refresh enabled at 15.6us */
1646 MCHBAR32(C0DRC0) &= ~(7 << 8);
1647 MCHBAR32(C0DRC0) |= reg32;
1649 MCHBAR32(C1DRC0) &= ~(7 << 8);
1650 MCHBAR32(C1DRC0) |= reg32;
1653 static void sdram_program_cke_tristate(struct sys_info *sysinfo)
1658 reg32 = MCHBAR32(C0DRC1);
1660 for (i=0; i < 4; i++) {
1661 if (sysinfo->banksize[i] == 0) {
1662 reg32 |= (1 << (16 + i));
1669 MCHBAR32(C0DRC1) = reg32;
1671 /* Do we have to do this if we're in Single Channel Mode? */
1672 reg32 = MCHBAR32(C1DRC1);
1674 for (i=4; i < 8; i++) {
1675 if (sysinfo->banksize[i] == 0) {
1676 reg32 |= (1 << (12 + i));
1683 MCHBAR32(C1DRC1) = reg32;
1686 static void sdram_program_odt_tristate(struct sys_info *sysinfo)
1691 reg32 = MCHBAR32(C0DRC2);
1693 for (i=0; i < 4; i++) {
1694 if (sysinfo->banksize[i] == 0) {
1695 reg32 |= (1 << (24 + i));
1698 MCHBAR32(C0DRC2) = reg32;
1700 reg32 = MCHBAR32(C1DRC2);
1702 for (i=4; i < 8; i++) {
1703 if (sysinfo->banksize[i] == 0) {
1704 reg32 |= (1 << (20 + i));
1707 MCHBAR32(C1DRC2) = reg32;
1710 static void sdram_set_timing_and_control(struct sys_info *sysinfo)
1717 static const u8 const drt0_table[] = {
1719 3, 4, 5, /* FSB533/400, DDR533/400 */
1720 4, 5, 6, /* FSB667, DDR533/400 */
1721 4, 5, 6, /* FSB667, DDR667 */
1724 static const u8 const cas_table[] = {
1728 reg32 = MCHBAR32(C0DRC0);
1729 reg32 |= (1 << 2); /* Burst Length 8 */
1730 reg32 &= ~( (1 << 13) | (1 << 12) );
1731 MCHBAR32(C0DRC0) = reg32;
1733 reg32 = MCHBAR32(C1DRC0);
1734 reg32 |= (1 << 2); /* Burst Length 8 */
1735 reg32 &= ~( (1 << 13) | (1 << 12) );
1736 MCHBAR32(C1DRC0) = reg32;
1738 if (!sysinfo->dual_channel && sysinfo->dimm[1] !=
1739 SYSINFO_DIMM_NOT_POPULATED) {
1740 reg32 = MCHBAR32(C0DRC0);
1742 MCHBAR32(C0DRC0) = reg32;
1745 sdram_program_refresh_rate(sysinfo);
1747 sdram_program_cke_tristate(sysinfo);
1749 sdram_program_odt_tristate(sysinfo);
1751 /* Calculate DRT0 */
1755 /* B2B Write Precharge (same bank) = CL-1 + BL/2 + tWR */
1756 reg32 = (sysinfo->cas - 1) + (BURSTLENGTH / 2) + sysinfo->twr;
1757 temp_drt |= (reg32 << 28);
1759 /* Write Auto Precharge (same bank) = CL-1 + BL/2 + tWR + tRP */
1760 reg32 += sysinfo->trp;
1761 temp_drt |= (reg32 << 4);
1763 if (sysinfo->memory_frequency == 667) {
1764 tWTR = 3; /* 667MHz */
1766 tWTR = 2; /* 400 and 533 */
1769 /* B2B Write to Read Command Spacing */
1770 reg32 = (sysinfo->cas - 1) + (BURSTLENGTH / 2) + tWTR;
1771 temp_drt |= (reg32 << 24);
1773 /* CxDRT0 [23:22], [21:20], [19:18] [16] have fixed values */
1774 temp_drt |= ( (1 << 22) | (3 << 20) | (1 << 18) | (0 << 16) );
1776 /* Program Write Auto Precharge to Activate */
1778 if (sysinfo->fsb_frequency == 667) { /* 667MHz FSB */
1781 if (sysinfo->memory_frequency == 667) {
1784 off32 += sysinfo->cas - 3;
1785 reg32 = drt0_table[off32];
1786 temp_drt |= (reg32 << 11);
1788 /* Read Auto Precharge to Activate */
1790 temp_drt |= (8 << 0);
1792 MCHBAR32(C0DRT0) = temp_drt;
1793 MCHBAR32(C1DRT0) = temp_drt;
1795 /* Calculate DRT1 */
1797 temp_drt = MCHBAR32(C0DRT1) & 0x00020088;
1799 /* DRAM RASB Precharge */
1800 temp_drt |= (sysinfo->trp - 2) << 0;
1802 /* DRAM RASB to CASB Delay */
1803 temp_drt |= (sysinfo->trcd - 2) << 4;
1806 temp_drt |= (cas_table[sysinfo->cas - 3]) << 8;
1808 /* Refresh Cycle Time */
1809 temp_drt |= (sysinfo->trfc) << 10;
1811 /* Pre-All to Activate Delay */
1812 temp_drt |= (0 << 16);
1814 /* Precharge to Precharge Delay stays at 1 clock */
1815 temp_drt |= (0 << 18);
1817 /* Activate to Precharge Delay */
1818 temp_drt |= (sysinfo->tras << 19);
1820 /* Read to Precharge (tRTP) */
1821 if (sysinfo->memory_frequency == 667) {
1822 temp_drt |= (1 << 28);
1824 temp_drt |= (0 << 28);
1827 /* Determine page size */
1829 page_size = 1; /* Default: 1k pagesize */
1830 for (i=0; i< 2*DIMM_SOCKETS; i++) {
1831 if (sysinfo->dimm[i] == SYSINFO_DIMM_X16DS ||
1832 sysinfo->dimm[i] == SYSINFO_DIMM_X16SS)
1833 page_size = 2; /* 2k pagesize */
1836 if (sysinfo->memory_frequency == 533 && page_size == 2) {
1839 if (sysinfo->memory_frequency == 667) {
1843 temp_drt |= (reg32 << 30);
1845 MCHBAR32(C0DRT1) = temp_drt;
1846 MCHBAR32(C1DRT1) = temp_drt;
1849 reg32 = MCHBAR32(C0DRT2);
1851 MCHBAR32(C0DRT2) = reg32;
1853 reg32 = MCHBAR32(C1DRT2);
1855 MCHBAR32(C1DRT2) = reg32;
1857 /* Calculate DRT3 */
1858 temp_drt = MCHBAR32(C0DRT3) & ~0x07ffffff;
1860 /* Get old tRFC value */
1861 reg32 = MCHBAR32(C0DRT1) >> 10;
1865 switch (sysinfo->memory_frequency) {
1867 reg32 = ((78800 / 500) - reg32) & 0x1ff;
1868 reg32 |= (0x8c << 16) | (0x0c << 10); /* 1 us */
1870 case 533: /* 3.75nS */
1871 reg32 = ((78800 / 375) - reg32) & 0x1ff;
1872 reg32 |= (0xba << 16) | (0x10 << 10); /* 1 us */
1875 reg32 = ((78800 / 300) - reg32) & 0x1ff;
1876 reg32 |= (0xe9 << 16) | (0x14 << 10); /* 1 us */
1882 MCHBAR32(C0DRT3) = temp_drt;
1883 MCHBAR32(C1DRT3) = temp_drt;
1886 static void sdram_set_channel_mode(struct sys_info *sysinfo)
1890 printk(BIOS_DEBUG, "Setting mode of operation for memory channels...");
1892 if (sdram_capabilities_interleave() &&
1893 ( ( sysinfo->banksize[0] + sysinfo->banksize[1] +
1894 sysinfo->banksize[2] + sysinfo->banksize[3] ) ==
1895 ( sysinfo->banksize[4] + sysinfo->banksize[5] +
1896 sysinfo->banksize[6] + sysinfo->banksize[7] ) ) ) {
1897 /* Both channels equipped with DIMMs of the same size */
1898 sysinfo->interleaved = 1;
1900 sysinfo->interleaved = 0;
1903 reg32 = MCHBAR32(DCC);
1906 if(sysinfo->interleaved) {
1907 /* Dual Channel Interleaved */
1908 printk(BIOS_DEBUG, "Dual Channel Interleaved.\n");
1910 } else if (sysinfo->dimm[0] == SYSINFO_DIMM_NOT_POPULATED &&
1911 sysinfo->dimm[1] == SYSINFO_DIMM_NOT_POPULATED) {
1912 /* Channel 1 only */
1913 printk(BIOS_DEBUG, "Single Channel 1 only.\n");
1915 } else if (sdram_capabilities_dual_channel() && sysinfo->dimm[2] !=
1916 SYSINFO_DIMM_NOT_POPULATED) {
1917 /* Dual Channel Assymetric */
1918 printk(BIOS_DEBUG, "Dual Channel Assymetric.\n");
1921 /* All bits 0 means Single Channel 0 operation */
1922 printk(BIOS_DEBUG, "Single Channel 0 only.\n");
1925 /* Now disable channel XORing */
1928 MCHBAR32(DCC) = reg32;
1930 PRINTK_DEBUG("DCC=0x%08x\n", MCHBAR32(DCC));
1933 static void sdram_program_pll_settings(struct sys_info *sysinfo)
1937 MCHBAR32(PLLMON) = 0x80800000;
1939 sysinfo->fsb_frequency = fsbclk();
1940 if (sysinfo->fsb_frequency == 0xffff)
1941 die("Unsupported FSB speed");
1943 /* Program CPCTL according to FSB speed */
1944 /* Only write the lower byte */
1945 switch (sysinfo->fsb_frequency) {
1946 case 400: MCHBAR8(CPCTL) = 0x90; break; /* FSB400 */
1947 case 533: MCHBAR8(CPCTL) = 0x95; break; /* FSB533 */
1948 case 667: MCHBAR8(CPCTL) = 0x8d; break; /* FSB667 */
1951 MCHBAR16(CPCTL) &= ~(1 << 11);
1953 reg16 = MCHBAR16(CPCTL); /* Read back register to activate settings */
1956 static void sdram_program_graphics_frequency(struct sys_info *sysinfo)
1960 u8 freq, second_vco, voltage;
1962 #define CRCLK_166MHz 0x00
1963 #define CRCLK_200MHz 0x01
1964 #define CRCLK_250MHz 0x03
1965 #define CRCLK_400MHz 0x05
1967 #define CDCLK_200MHz 0x00
1968 #define CDCLK_320MHz 0x40
1970 #define VOLTAGE_1_05 0x00
1971 #define VOLTAGE_1_50 0x01
1973 printk(BIOS_DEBUG, "Setting Graphics Frequency... \n");
1975 printk(BIOS_DEBUG, "FSB: %d MHz ", sysinfo->fsb_frequency);
1977 voltage = VOLTAGE_1_05;
1978 if (MCHBAR32(DFT_STRAP1) & (1 << 20))
1979 voltage = VOLTAGE_1_50;
1980 printk(BIOS_DEBUG, "Voltage: %s ", (voltage==VOLTAGE_1_05)?"1.05V":"1.5V");
1982 /* Gate graphics hardware for frequency change */
1983 reg8 = pci_read_config16(PCI_DEV(0,2,0), GCFC + 1);
1984 reg8 = (1<<3) | (1<<1); /* disable crclk, gate cdclk */
1985 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
1987 /* Get graphics frequency capabilities */
1988 reg8 = sdram_capabilities_core_frequencies();
1990 freq = CRCLK_250MHz;
1992 case GFX_FREQUENCY_CAP_ALL:
1993 if (voltage == VOLTAGE_1_05)
1994 freq = CRCLK_250MHz;
1996 freq = CRCLK_400MHz; /* 1.5V requires 400MHz */
1998 case GFX_FREQUENCY_CAP_250MHZ: freq = CRCLK_250MHz; break;
1999 case GFX_FREQUENCY_CAP_200MHZ: freq = CRCLK_200MHz; break;
2000 case GFX_FREQUENCY_CAP_166MHZ: freq = CRCLK_166MHz; break;
2003 if (freq != CRCLK_400MHz) {
2004 /* What chipset are we? Force 166MHz for GMS */
2005 reg8 = (pci_read_config8(PCI_DEV(0, 0x00,0), 0xe7) & 0x70) >> 4;
2007 freq = CRCLK_166MHz;
2010 printk(BIOS_DEBUG, "Render: ");
2012 case CRCLK_166MHz: printk(BIOS_DEBUG, "166Mhz"); break;
2013 case CRCLK_200MHz: printk(BIOS_DEBUG, "200Mhz"); break;
2014 case CRCLK_250MHz: printk(BIOS_DEBUG, "250Mhz"); break;
2015 case CRCLK_400MHz: printk(BIOS_DEBUG, "400Mhz"); break;
2018 if (i945_silicon_revision() == 0) {
2019 sysinfo->mvco4x = 1;
2021 sysinfo->mvco4x = 0;
2026 if (voltage == VOLTAGE_1_50) {
2028 } else if ((i945_silicon_revision() > 0) && (freq == CRCLK_250MHz)) {
2029 u16 mem = sysinfo->memory_frequency;
2030 u16 fsb = sysinfo->fsb_frequency;
2032 if ( (fsb == 667 && mem == 533) ||
2033 (fsb == 533 && mem == 533) ||
2034 (fsb == 533 && mem == 400)) {
2038 if (fsb == 667 && mem == 533)
2039 sysinfo->mvco4x = 1;
2043 sysinfo->clkcfg_bit7=1;
2045 sysinfo->clkcfg_bit7=0;
2048 /* Graphics Core Render Clock */
2049 reg16 = pci_read_config16(PCI_DEV(0,2,0), GCFC);
2050 reg16 &= ~( (7 << 0) | (1 << 13) );
2052 pci_write_config16(PCI_DEV(0,2,0), GCFC, reg16);
2054 /* Graphics Core Display Clock */
2055 reg8 = pci_read_config8(PCI_DEV(0,2,0), GCFC);
2056 reg8 &= ~( (1<<7) | (7<<4) );
2058 if (voltage == VOLTAGE_1_05) {
2059 reg8 |= CDCLK_200MHz;
2060 printk(BIOS_DEBUG, " Display: 200MHz\n");
2062 reg8 |= CDCLK_320MHz;
2063 printk(BIOS_DEBUG, " Display: 320MHz\n");
2065 pci_write_config8(PCI_DEV(0,2,0), GCFC, reg8);
2067 reg8 = pci_read_config8(PCI_DEV(0,2,0), GCFC + 1);
2069 reg8 |= (1<<3) | (1<<1);
2070 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
2073 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
2075 /* Ungate core render and display clocks */
2077 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
2080 static void sdram_program_memory_frequency(struct sys_info *sysinfo)
2085 printk(BIOS_DEBUG, "Setting Memory Frequency... ");
2087 clkcfg = MCHBAR32(CLKCFG);
2089 printk(BIOS_DEBUG, "CLKCFG=0x%08x, ", clkcfg);
2091 clkcfg &= ~( (1 << 12) | (1 << 7) | ( 7 << 4) );
2093 if (sysinfo->mvco4x) {
2094 printk(BIOS_DEBUG, "MVCO 4x, ");
2095 clkcfg &= ~(1 << 12);
2098 if (sysinfo->clkcfg_bit7) {
2099 printk(BIOS_DEBUG, "second VCO, ");
2104 switch (sysinfo->memory_frequency) {
2105 case 400: clkcfg |= (2 << 4); break;
2106 case 533: clkcfg |= (3 << 4); break;
2107 case 667: clkcfg |= (4 << 4); break;
2108 default: die("Target Memory Frequency Error");
2111 if (MCHBAR32(CLKCFG) == clkcfg) {
2112 printk(BIOS_DEBUG, "ok (unchanged)\n");
2116 MCHBAR32(CLKCFG) = clkcfg;
2118 /* Make sure the following code is in the
2119 * cache before we execute it.
2123 reg8 = pci_read_config8(PCI_DEV(0,0x1f,0), 0xa2);
2125 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
2127 clkcfg &= ~(1 << 10);
2128 MCHBAR32(CLKCFG) = clkcfg;
2129 clkcfg |= (1 << 10);
2130 MCHBAR32(CLKCFG) = clkcfg;
2133 " movl $0x100, %%ecx\n"
2139 " loop delay_update\n"
2145 clkcfg &= ~(1 << 10);
2146 MCHBAR32(CLKCFG) = clkcfg;
2153 printk(BIOS_DEBUG, "CLKCFG=0x%08x, ", MCHBAR32(CLKCFG));
2154 printk(BIOS_DEBUG, "ok\n");
2157 static void sdram_program_clock_crossing(void)
2162 * We add the indices according to our clocks from CLKCFG.
2164 #if defined(CONFIG_NORTHBRIDGE_INTEL_I945GM)
2165 static const u32 data_clock_crossing[] = {
2166 0x00100401, 0x00000000, /* DDR400 FSB400 */
2167 0xffffffff, 0xffffffff, /* nonexistant */
2168 0xffffffff, 0xffffffff, /* nonexistant */
2170 0x08040120, 0x00000000, /* DDR400 FSB533 */
2171 0x00100401, 0x00000000, /* DDR533 FSB533 */
2172 0x00010402, 0x00000000, /* DDR667 FSB533 - fake values */
2174 0x04020120, 0x00000010, /* DDR400 FSB667 */
2175 0x10040280, 0x00000040, /* DDR533 FSB667 */
2176 0x00100401, 0x00000000, /* DDR667 FSB667 */
2178 0xffffffff, 0xffffffff, /* nonexistant */
2179 0xffffffff, 0xffffffff, /* nonexistant */
2180 0xffffffff, 0xffffffff, /* nonexistant */
2182 0xffffffff, 0xffffffff, /* nonexistant */
2183 0xffffffff, 0xffffffff, /* nonexistant */
2184 0xffffffff, 0xffffffff, /* nonexistant */
2187 static const u32 command_clock_crossing[] = {
2188 0x04020208, 0x00000000, /* DDR400 FSB400 */
2189 0xffffffff, 0xffffffff, /* nonexistant */
2190 0xffffffff, 0xffffffff, /* nonexistant */
2192 0x00060108, 0x00000000, /* DDR400 FSB533 */
2193 0x04020108, 0x00000000, /* DDR533 FSB533 */
2194 0xffffffff, 0xffffffff, /* nonexistant */
2196 0x00040318, 0x00000000, /* DDR400 FSB667 */
2197 0x04020118, 0x00000000, /* DDR533 FSB667 */
2198 0x02010804, 0x00000000, /* DDR667 FSB667 */
2200 0xffffffff, 0xffffffff, /* nonexistant */
2201 0xffffffff, 0xffffffff, /* nonexistant */
2202 0xffffffff, 0xffffffff, /* nonexistant */
2204 0xffffffff, 0xffffffff, /* nonexistant */
2205 0xffffffff, 0xffffffff, /* nonexistant */
2206 0xffffffff, 0xffffffff, /* nonexistant */
2209 #elif defined(CONFIG_NORTHBRIDGE_INTEL_I945GC)
2211 static const u32 data_clock_crossing[] = {
2212 0xffffffff, 0xffffffff, /* nonexistant */
2213 0xffffffff, 0xffffffff, /* nonexistant */
2214 0xffffffff, 0xffffffff, /* nonexistant */
2216 0x10080201, 0x00000000, /* DDR400 FSB533 */
2217 0x00100401, 0x00000000, /* DDR533 FSB533 */
2218 0x00010402, 0x00000000, /* DDR667 FSB533 - fake values */
2220 0xffffffff, 0xffffffff, /* nonexistant */
2221 0xffffffff, 0xffffffff, /* nonexistant */
2222 0xffffffff, 0xffffffff, /* nonexistant */
2224 0x04020108, 0x00000000, /* DDR400 FSB800 */
2225 0x00020108, 0x00000000, /* DDR533 FSB800 */
2226 0x00080201, 0x00000000, /* DDR667 FSB800 */
2228 0x00010402, 0x00000000, /* DDR400 FSB1066 */
2229 0x04020108, 0x00000000, /* DDR533 FSB1066 */
2230 0x08040110, 0x00000000, /* DDR667 FSB1066 */
2233 static const u32 command_clock_crossing[] = {
2234 0xffffffff, 0xffffffff, /* nonexistant */
2235 0xffffffff, 0xffffffff, /* nonexistant */
2236 0xffffffff, 0xffffffff, /* nonexistant */
2238 0x00010800, 0x00000402, /* DDR400 FSB533 */
2239 0x01000400, 0x00000200, /* DDR533 FSB533 */
2240 0x00020904, 0x00000000, /* DDR667 FSB533 - fake values */
2242 0xffffffff, 0xffffffff, /* nonexistant */
2243 0xffffffff, 0xffffffff, /* nonexistant */
2244 0xffffffff, 0xffffffff, /* nonexistant */
2246 0x02010804, 0x00000000, /* DDR400 FSB800 */
2247 0x00010402, 0x00000000, /* DDR533 FSB800 */
2248 0x04020180, 0x00000008, /* DDR667 FSB800 */
2250 0x00020904, 0x00000000, /* DDR400 FSB1066 */
2251 0x02010804, 0x00000000, /* DDR533 FSB1066 */
2252 0x180601c0, 0x00000020, /* DDR667 FSB1066 */
2256 printk(BIOS_DEBUG, "Programming Clock Crossing...");
2258 printk(BIOS_DEBUG, "MEM=");
2260 case 400: printk(BIOS_DEBUG, "400"); idx += 0; break;
2261 case 533: printk(BIOS_DEBUG, "533"); idx += 2; break;
2262 case 667: printk(BIOS_DEBUG, "667"); idx += 4; break;
2263 default: printk(BIOS_DEBUG, "RSVD %x", memclk()); return;
2266 printk(BIOS_DEBUG, " FSB=");
2268 case 400: printk(BIOS_DEBUG, "400"); idx += 0; break;
2269 case 533: printk(BIOS_DEBUG, "533"); idx += 6; break;
2270 case 667: printk(BIOS_DEBUG, "667"); idx += 12; break;
2271 case 800: printk(BIOS_DEBUG, "800"); idx += 18; break;
2272 case 1066: printk(BIOS_DEBUG, "1066"); idx += 24; break;
2273 default: printk(BIOS_DEBUG, "RSVD %x\n", fsbclk()); return;
2276 if (command_clock_crossing[idx]==0xffffffff) {
2277 printk(BIOS_DEBUG, "Invalid MEM/FSB combination!\n");
2280 MCHBAR32(CCCFT + 0) = command_clock_crossing[idx];
2281 MCHBAR32(CCCFT + 4) = command_clock_crossing[idx + 1];
2283 MCHBAR32(C0DCCFT + 0) = data_clock_crossing[idx];
2284 MCHBAR32(C0DCCFT + 4) = data_clock_crossing[idx + 1];
2285 MCHBAR32(C1DCCFT + 0) = data_clock_crossing[idx];
2286 MCHBAR32(C1DCCFT + 4) = data_clock_crossing[idx + 1];
2288 printk(BIOS_DEBUG, "... ok\n");
2291 static void sdram_disable_fast_dispatch(void)
2295 reg32 = MCHBAR32(FSBPMC3);
2297 MCHBAR32(FSBPMC3) = reg32;
2299 reg32 = MCHBAR32(SBTEST);
2301 MCHBAR32(SBTEST) = reg32;
2304 static void sdram_pre_jedec_initialization(void)
2308 reg32 = MCHBAR32(WCC);
2309 reg32 &= 0x113ff3ff;
2310 reg32 |= (4 << 29) | (3 << 25) | (1 << 10);
2311 MCHBAR32(WCC) = reg32;
2313 MCHBAR32(SMVREFC) |= (1 << 6);
2315 MCHBAR32(MMARB0) &= ~(3 << 17);
2316 MCHBAR32(MMARB0) |= (1 << 21) | (1 << 16);
2318 MCHBAR32(MMARB1) &= ~(7 << 8);
2319 MCHBAR32(MMARB1) |= (3 << 8);
2321 /* Adaptive Idle Timer Control */
2322 MCHBAR32(C0AIT) = 0x000006c4;
2323 MCHBAR32(C0AIT+4) = 0x871a066d;
2325 MCHBAR32(C1AIT) = 0x000006c4;
2326 MCHBAR32(C1AIT+4) = 0x871a066d;
2329 #define EA_DUALCHANNEL_XOR_BANK_RANK_MODE (0xd4 << 24)
2330 #define EA_DUALCHANNEL_XOR_BANK_MODE (0xf4 << 24)
2331 #define EA_DUALCHANNEL_BANK_RANK_MODE (0xc2 << 24)
2332 #define EA_DUALCHANNEL_BANK_MODE (0xe2 << 24)
2333 #define EA_SINGLECHANNEL_XOR_BANK_RANK_MODE (0x91 << 24)
2334 #define EA_SINGLECHANNEL_XOR_BANK_MODE (0xb1 << 24)
2335 #define EA_SINGLECHANNEL_BANK_RANK_MODE (0x80 << 24)
2336 #define EA_SINGLECHANNEL_BANK_MODE (0xa0 << 24)
2338 static void sdram_enhanced_addressing_mode(struct sys_info *sysinfo)
2340 u32 chan0 = 0, chan1 = 0;
2341 int chan0_dualsided, chan1_dualsided, chan0_populated, chan1_populated;
2343 chan0_populated = (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
2344 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED);
2345 chan1_populated = (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
2346 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED);
2347 chan0_dualsided = (sysinfo->banksize[1] || sysinfo->banksize[3]);
2348 chan1_dualsided = (sysinfo->banksize[5] || sysinfo->banksize[7]);
2350 if (sdram_capabilities_enhanced_addressing_xor()) {
2351 if (!sysinfo->interleaved) {
2352 /* Single Channel & Dual Channel Assymetric */
2353 if (chan0_populated) {
2354 if (chan0_dualsided) {
2355 chan0 = EA_SINGLECHANNEL_XOR_BANK_RANK_MODE;
2357 chan0 = EA_SINGLECHANNEL_XOR_BANK_MODE;
2360 if (chan1_populated) {
2361 if (chan1_dualsided) {
2362 chan1 = EA_SINGLECHANNEL_XOR_BANK_RANK_MODE;
2364 chan1 = EA_SINGLECHANNEL_XOR_BANK_MODE;
2368 /* Interleaved has always both channels populated */
2369 if (chan0_dualsided) {
2370 chan0 = EA_DUALCHANNEL_XOR_BANK_RANK_MODE;
2372 chan0 = EA_DUALCHANNEL_XOR_BANK_MODE;
2375 if (chan1_dualsided) {
2376 chan1 = EA_DUALCHANNEL_XOR_BANK_RANK_MODE;
2378 chan1 = EA_DUALCHANNEL_XOR_BANK_MODE;
2382 if (!sysinfo->interleaved) {
2383 /* Single Channel & Dual Channel Assymetric */
2384 if (chan0_populated) {
2385 if (chan0_dualsided) {
2386 chan0 = EA_SINGLECHANNEL_BANK_RANK_MODE;
2388 chan0 = EA_SINGLECHANNEL_BANK_MODE;
2391 if (chan1_populated) {
2392 if (chan1_dualsided) {
2393 chan1 = EA_SINGLECHANNEL_BANK_RANK_MODE;
2395 chan1 = EA_SINGLECHANNEL_BANK_MODE;
2399 /* Interleaved has always both channels populated */
2400 if (chan0_dualsided) {
2401 chan0 = EA_DUALCHANNEL_BANK_RANK_MODE;
2403 chan0 = EA_DUALCHANNEL_BANK_MODE;
2406 if (chan1_dualsided) {
2407 chan1 = EA_DUALCHANNEL_BANK_RANK_MODE;
2409 chan1 = EA_DUALCHANNEL_BANK_MODE;
2414 MCHBAR32(C0DRC1) &= 0x00ffffff;
2415 MCHBAR32(C0DRC1) |= chan0;
2416 MCHBAR32(C1DRC1) &= 0x00ffffff;
2417 MCHBAR32(C1DRC1) |= chan1;
2420 static void sdram_post_jedec_initialization(struct sys_info *sysinfo)
2424 /* Enable Channel XORing for Dual Channel Interleave */
2425 if (sysinfo->interleaved) {
2427 reg32 = MCHBAR32(DCC);
2428 #if CONFIG_CHANNEL_XOR_RANDOMIZATION
2429 reg32 &= ~(1 << 10);
2434 MCHBAR32(DCC) = reg32;
2437 /* DRAM mode optimizations */
2438 sdram_enhanced_addressing_mode(sysinfo);
2440 reg32 = MCHBAR32(FSBPMC3);
2442 MCHBAR32(FSBPMC3) = reg32;
2444 reg32 = MCHBAR32(SBTEST);
2446 MCHBAR32(SBTEST) = reg32;
2448 reg32 = MCHBAR32(SBOCC);
2449 reg32 &= 0xffbdb6ff;
2450 reg32 |= (0xbdb6 << 8) | (1 << 0);
2451 MCHBAR32(SBOCC) = reg32;
2454 static void sdram_power_management(struct sys_info *sysinfo)
2459 int integrated_graphics = 1;
2462 reg32 = MCHBAR32(C0DRT2);
2463 reg32 &= 0xffffff00;
2464 /* Idle timer = 8 clocks, CKE idle timer = 16 clocks */
2465 reg32 |= (1 << 5) | (1 << 4);
2466 MCHBAR32(C0DRT2) = reg32;
2468 reg32 = MCHBAR32(C1DRT2);
2469 reg32 &= 0xffffff00;
2470 /* Idle timer = 8 clocks, CKE idle timer = 16 clocks */
2471 reg32 |= (1 << 5) | (1 << 4);
2472 MCHBAR32(C1DRT2) = reg32;
2474 reg32 = MCHBAR32(C0DRC1);
2476 reg32 |= (1 << 12) | (1 << 11);
2477 MCHBAR32(C0DRC1) = reg32;
2479 reg32 = MCHBAR32(C1DRC1);
2481 reg32 |= (1 << 12) | (1 << 11);
2482 MCHBAR32(C1DRC1) = reg32;
2484 if (i945_silicon_revision()>1) {
2485 /* FIXME bits 5 and 0 only if PCIe graphics is disabled */
2486 u16 peg_bits = (1 << 5) | (1 << 0);
2488 MCHBAR16(UPMC1) = 0x1010 | peg_bits;
2490 /* FIXME bits 5 and 0 only if PCIe graphics is disabled */
2491 u16 peg_bits = (1 << 5) | (1 << 0);
2494 MCHBAR16(UPMC1) = 0x0010 | peg_bits;
2497 reg16 = MCHBAR16(UPMC2);
2500 MCHBAR16(UPMC2) = reg16;
2502 MCHBAR32(UPMC3) = 0x000f06ff;
2504 for (i=0; i<5; i++) {
2505 MCHBAR32(UPMC3) &= ~(1 << 16);
2506 MCHBAR32(UPMC3) |= (1 << 16);
2509 MCHBAR32(GIPMC1) = 0x8000000c;
2511 reg16 = MCHBAR16(CPCTL);
2512 reg16 &= ~(7 << 11);
2513 if (i945_silicon_revision()>2) {
2518 MCHBAR16(CPCTL) = reg16;
2521 if ((MCHBAR32(ECO) & (1 << 16)) != 0) {
2523 if (i945_silicon_revision() != 0) {
2525 switch (sysinfo->fsb_frequency) {
2526 case 667: MCHBAR32(HGIPMC2) = 0x0d590d59; break;
2527 case 533: MCHBAR32(HGIPMC2) = 0x155b155b; break;
2530 switch (sysinfo->fsb_frequency) {
2531 case 667: MCHBAR32(HGIPMC2) = 0x09c409c4; break;
2532 case 533: MCHBAR32(HGIPMC2) = 0x0fa00fa0; break;
2536 MCHBAR32(FSBPMC1) = 0x8000000c;
2538 reg32 = MCHBAR32(C2C3TT);
2539 reg32 &= 0xffff0000;
2540 switch (sysinfo->fsb_frequency) {
2541 case 667: reg32 |= 0x0600; break;
2542 case 533: reg32 |= 0x0480; break;
2544 MCHBAR32(C2C3TT) = reg32;
2546 reg32 = MCHBAR32(C3C4TT);
2547 reg32 &= 0xffff0000;
2548 switch (sysinfo->fsb_frequency) {
2549 case 667: reg32 |= 0x0b80; break;
2550 case 533: reg32 |= 0x0980; break;
2552 MCHBAR32(C3C4TT) = reg32;
2554 if (i945_silicon_revision() == 0) {
2555 MCHBAR32(ECO) &= ~(1 << 16);
2557 MCHBAR32(ECO) |= (1 << 16);
2562 if (i945_silicon_revision() == 0) {
2563 MCHBAR32(FSBPMC3) &= ~(1 << 29);
2565 MCHBAR32(FSBPMC3) |= (1 << 29);
2568 MCHBAR32(FSBPMC3) &= ~(1 << 29);
2570 MCHBAR32(FSBPMC3) |= (1 << 21);
2572 MCHBAR32(FSBPMC3) &= ~(1 << 19);
2574 MCHBAR32(FSBPMC3) &= ~(1 << 13);
2576 reg32 = MCHBAR32(FSBPMC4);
2577 reg32 &= ~(3 << 24);
2578 reg32 |= ( 2 << 24);
2579 MCHBAR32(FSBPMC4) = reg32;
2581 MCHBAR32(FSBPMC4) |= (1 << 21);
2583 MCHBAR32(FSBPMC4) |= (1 << 5);
2585 if ((i945_silicon_revision() < 2) /* || cpuid() = 0x6e8 */ ) {
2586 /* stepping 0 and 1 or CPUID 6e8 */
2587 MCHBAR32(FSBPMC4) &= ~(1 << 4);
2589 MCHBAR32(FSBPMC4) |= (1 << 4);
2592 reg8 = pci_read_config8(PCI_DEV(0,0x0,0), 0xfc);
2594 pci_write_config8(PCI_DEV(0, 0x0, 0), 0xfc, reg8);
2596 reg8 = pci_read_config8(PCI_DEV(0,0x2,0), 0xc1);
2598 pci_write_config8(PCI_DEV(0, 0x2, 0), 0xc1, reg8);
2600 #ifdef C2_SELF_REFRESH_DISABLE
2602 if (integrated_graphics) {
2603 printk(BIOS_DEBUG, "C2 self-refresh with IGD\n");
2604 MCHBAR16(MIPMC4) = 0x0468;
2605 MCHBAR16(MIPMC5) = 0x046c;
2606 MCHBAR16(MIPMC6) = 0x046c;
2608 MCHBAR16(MIPMC4) = 0x6468;
2609 MCHBAR16(MIPMC5) = 0x646c;
2610 MCHBAR16(MIPMC6) = 0x646c;
2613 if (integrated_graphics) {
2614 MCHBAR16(MIPMC4) = 0x04f8;
2615 MCHBAR16(MIPMC5) = 0x04fc;
2616 MCHBAR16(MIPMC6) = 0x04fc;
2618 MCHBAR16(MIPMC4) = 0x64f8;
2619 MCHBAR16(MIPMC5) = 0x64fc;
2620 MCHBAR16(MIPMC6) = 0x64fc;
2625 reg32 = MCHBAR32(PMCFG);
2626 reg32 &= ~(3 << 17);
2628 MCHBAR32(PMCFG) = reg32;
2630 MCHBAR32(PMCFG) |= (1 << 4);
2632 reg32 = MCHBAR32(0xc30);
2633 reg32 &= 0xffffff00;
2635 MCHBAR32(0xc30) = reg32;
2637 MCHBAR32(0xb18) &= ~(1 << 21);
2640 static void sdram_thermal_management(void)
2643 MCHBAR8(TCO1) = 0x00;
2644 MCHBAR8(TCO0) = 0x00;
2646 /* The Thermal Sensors for DIMMs at 0x50, 0x52 are at I2C addr
2650 /* TODO This is not implemented yet. Volunteers? */
2653 static void sdram_save_receive_enable(void)
2659 /* The following values are stored to an unused CMOS
2660 * area and restored instead of recalculated in case
2663 * C0WL0REOST [7:0] -> 8 bit
2664 * C1WL0REOST [7:0] -> 8 bit
2665 * RCVENMT [11:8] [3:0] -> 8 bit
2666 * C0DRT1 [27:24] -> 4 bit
2667 * C1DRT1 [27:24] -> 4 bit
2670 values[0] = MCHBAR8(C0WL0REOST);
2671 values[1] = MCHBAR8(C1WL0REOST);
2673 reg32 = MCHBAR32(RCVENMT);
2674 values[2] = (u8)((reg32 >> (8 - 4)) & 0xf0) | (reg32 & 0x0f);
2676 reg32 = MCHBAR32(C0DRT1);
2677 values[3] = (reg32 >> 24) & 0x0f;
2678 reg32 = MCHBAR32(C1DRT1);
2679 values[3] |= (reg32 >> (24 - 4)) & 0xf0;
2681 /* coreboot only uses bytes 0 - 127 for its CMOS values so far
2682 * so we grab bytes 128 - 131 to save the receive enable values
2686 cmos_write(values[i], 128 + i);
2689 static void sdram_recover_receive_enable(void)
2696 values[i] = cmos_read(128 + i);
2698 MCHBAR8(C0WL0REOST) = values[0];
2699 MCHBAR8(C1WL0REOST) = values[1];
2701 reg32 = MCHBAR32(RCVENMT);
2702 reg32 &= ~((0x0f << 8) | (0x0f << 0));
2703 reg32 |= ((u32)(values[2] & 0xf0) << (8 - 4)) | (values[2] & 0x0f);
2704 MCHBAR32(RCVENMT) = reg32;
2706 reg32 = MCHBAR32(C0DRT1) & ~(0x0f << 24);
2707 reg32 |= (u32)(values[3] & 0x0f) << 24;
2708 MCHBAR32(C0DRT1) = reg32;
2710 reg32 = MCHBAR32(C1DRT1) & ~(0x0f << 24);
2711 reg32 |= (u32)(values[3] & 0xf0) << (24 - 4);
2712 MCHBAR32(C1DRT1) = reg32;
2717 static void sdram_program_receive_enable(struct sys_info *sysinfo)
2719 MCHBAR32(REPC) |= (1 << 0);
2721 /* enable upper CMOS */
2722 RCBA32(0x3400) = (1 << 2);
2724 /* Program Receive Enable Timings */
2725 if (sysinfo->boot_path == BOOT_PATH_RESUME) {
2726 sdram_recover_receive_enable();
2728 receive_enable_adjust(sysinfo);
2729 sdram_save_receive_enable();
2732 MCHBAR32(C0DRC1) |= (1 << 6);
2733 MCHBAR32(C1DRC1) |= (1 << 6);
2734 MCHBAR32(C0DRC1) &= ~(1 << 6);
2735 MCHBAR32(C1DRC1) &= ~(1 << 6);
2737 MCHBAR32(MIPMC3) |= (0x0f << 0);
2741 * @brief Enable On-Die Termination for DDR2.
2745 static void sdram_on_die_termination(struct sys_info *sysinfo)
2747 static const u32 odt[] = {
2748 0x00024911, 0xe0010000,
2749 0x00049211, 0xe0020000,
2750 0x0006db11, 0xe0030000,
2756 reg32 = MCHBAR32(ODTC);
2757 reg32 &= ~(3 << 16);
2758 reg32 |= (1 << 14) | (1 << 6) | (2 << 16);
2759 MCHBAR32(ODTC) = reg32;
2761 if ( !(sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED &&
2762 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED) ) {
2763 printk(BIOS_DEBUG, "one dimm per channel config.. \n");
2765 reg32 = MCHBAR32(C0ODT);
2766 reg32 &= ~(7 << 28);
2767 MCHBAR32(C0ODT) = reg32;
2768 reg32 = MCHBAR32(C1ODT);
2769 reg32 &= ~(7 << 28);
2770 MCHBAR32(C1ODT) = reg32;
2775 reg32 = MCHBAR32(C0ODT) & 0xfff00000;
2776 reg32 |= odt[(cas-3) * 2];
2777 MCHBAR32(C0ODT) = reg32;
2779 reg32 = MCHBAR32(C1ODT) & 0xfff00000;
2780 reg32 |= odt[(cas-3) * 2];
2781 MCHBAR32(C1ODT) = reg32;
2783 reg32 = MCHBAR32(C0ODT + 4) & 0x1fc8ffff;
2784 reg32 |= odt[((cas-3) * 2) + 1];
2785 MCHBAR32(C0ODT + 4) = reg32;
2787 reg32 = MCHBAR32(C1ODT + 4) & 0x1fc8ffff;
2788 reg32 |= odt[((cas-3) * 2) + 1];
2789 MCHBAR32(C1ODT + 4) = reg32;
2793 * @brief Enable clocks to populated sockets
2796 static void sdram_enable_memory_clocks(struct sys_info *sysinfo)
2798 u8 clocks[2] = { 0, 0 };
2800 #if defined(CONFIG_NORTHBRIDGE_INTEL_I945GM)
2801 #define CLOCKS_WIDTH 2
2802 #elif defined(CONFIG_NORTHBRIDGE_INTEL_I945GC)
2803 #define CLOCKS_WIDTH 3
2805 if (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED)
2806 clocks[0] |= (1 << CLOCKS_WIDTH)-1;
2808 if (sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED)
2809 clocks[0] |= ((1 << CLOCKS_WIDTH)-1) << CLOCKS_WIDTH;
2811 if (sysinfo->dimm[2] != SYSINFO_DIMM_NOT_POPULATED)
2812 clocks[1] |= (1 << CLOCKS_WIDTH)-1;
2814 if (sysinfo->dimm[3] != SYSINFO_DIMM_NOT_POPULATED)
2815 clocks[1] |= ((1 << CLOCKS_WIDTH)-1) << CLOCKS_WIDTH;
2817 #if CONFIG_OVERRIDE_CLOCK_DISABLE
2818 /* Usually system firmware turns off system memory clock signals
2819 * to unused SO-DIMM slots to reduce EMI and power consumption.
2820 * However, the Kontron 986LCD-M does not like unused clock
2821 * signals to be disabled.
2824 clocks[0] = 0xf; /* force all clock gate pairs to enable */
2825 clocks[1] = 0xf; /* force all clock gate pairs to enable */
2828 MCHBAR8(C0DCLKDIS) = clocks[0];
2829 MCHBAR8(C1DCLKDIS) = clocks[1];
2832 #define RTT_ODT_NONE 0
2833 #define RTT_ODT_50_OHM ( (1 << 9) | (1 << 5) )
2834 #define RTT_ODT_75_OHM (1 << 5)
2835 #define RTT_ODT_150_OHM (1 << 9)
2837 #define EMRS_OCD_DEFAULT ( (1 << 12) | (1 << 11) | (1 << 10) )
2839 #define MRS_CAS_3 (3 << 7)
2840 #define MRS_CAS_4 (4 << 7)
2841 #define MRS_CAS_5 (5 << 7)
2843 #define MRS_TWR_3 (2 << 12)
2844 #define MRS_TWR_4 (3 << 12)
2845 #define MRS_TWR_5 (4 << 12)
2847 #define MRS_BT (1 << 6)
2849 #define MRS_BL4 (2 << 3)
2850 #define MRS_BL8 (3 << 3)
2852 static void sdram_jedec_enable(struct sys_info *sysinfo)
2855 u32 bankaddr = 0, tmpaddr, mrsaddr = 0;
2857 for (i = 0, nonzero = -1; i < 8; i++) {
2858 if (sysinfo->banksize[i] == 0) {
2862 printk(BIOS_DEBUG, "jedec enable sequence: bank %d\n", i);
2865 /* Start at address 0 */
2869 if (sysinfo->interleaved) {
2874 if (nonzero != -1) {
2875 printk(BIOS_DEBUG, "bankaddr from bank size of rank %d\n", nonzero);
2876 bankaddr += sysinfo->banksize[nonzero] <<
2877 (sysinfo->interleaved ? 26 : 25);
2880 /* No populated bank hit before. Start at address 0 */
2884 /* We have a bank with a non-zero size.. Remember it
2885 * for the next offset we have to calculate
2889 /* Get CAS latency set up */
2890 switch (sysinfo->cas) {
2891 case 5: mrsaddr = MRS_CAS_5; break;
2892 case 4: mrsaddr = MRS_CAS_4; break;
2893 case 3: mrsaddr = MRS_CAS_3; break;
2894 default: die("Jedec Error (CAS).\n");
2898 switch (sysinfo->twr) {
2899 case 5: mrsaddr |= MRS_TWR_5; break;
2900 case 4: mrsaddr |= MRS_TWR_4; break;
2901 case 3: mrsaddr |= MRS_TWR_3; break;
2902 default: die("Jedec Error (tWR).\n");
2905 /* Set "Burst Type" */
2909 if (sysinfo->interleaved) {
2910 mrsaddr = mrsaddr << 1;
2913 /* Only burst length 8 supported */
2917 PRINTK_DEBUG("Apply NOP\n");
2918 do_ram_command(RAM_COMMAND_NOP);
2919 ram_read32(bankaddr);
2921 /* Precharge all banks */
2922 PRINTK_DEBUG("All Banks Precharge\n");
2923 do_ram_command(RAM_COMMAND_PRECHARGE);
2924 ram_read32(bankaddr);
2926 /* Extended Mode Register Set (2) */
2927 PRINTK_DEBUG("Extended Mode Register Set(2)\n");
2928 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_2);
2929 ram_read32(bankaddr);
2931 /* Extended Mode Register Set (3) */
2932 PRINTK_DEBUG("Extended Mode Register Set(3)\n");
2933 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_3);
2934 ram_read32(bankaddr);
2936 /* Extended Mode Register Set */
2937 PRINTK_DEBUG("Extended Mode Register Set\n");
2938 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_1);
2940 if (!sdram_capabilities_dual_channel()) {
2941 tmpaddr |= RTT_ODT_75_OHM;
2942 } else if (sysinfo->interleaved) {
2943 tmpaddr |= (RTT_ODT_150_OHM << 1);
2945 tmpaddr |= RTT_ODT_150_OHM;
2947 ram_read32(tmpaddr);
2949 /* Mode Register Set: Reset DLLs */
2950 PRINTK_DEBUG("MRS: Reset DLLs\n");
2951 do_ram_command(RAM_COMMAND_MRS);
2954 /* Set DLL reset bit */
2955 if (sysinfo->interleaved)
2956 tmpaddr |= (1 << 12);
2958 tmpaddr |= (1 << 11);
2959 ram_read32(tmpaddr);
2961 /* Precharge all banks */
2962 PRINTK_DEBUG("All Banks Precharge\n");
2963 do_ram_command(RAM_COMMAND_PRECHARGE);
2964 ram_read32(bankaddr);
2966 /* CAS before RAS Refresh */
2967 PRINTK_DEBUG("CAS before RAS\n");
2968 do_ram_command(RAM_COMMAND_CBR);
2970 /* CBR wants two READs */
2971 ram_read32(bankaddr);
2972 ram_read32(bankaddr);
2974 /* Mode Register Set: Enable DLLs */
2975 PRINTK_DEBUG("MRS: Enable DLLs\n");
2976 do_ram_command(RAM_COMMAND_MRS);
2980 ram_read32(tmpaddr);
2982 /* Extended Mode Register Set */
2983 PRINTK_DEBUG("Extended Mode Register Set: ODT/OCD\n");
2984 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_1);
2987 if (!sdram_capabilities_dual_channel()) {
2989 tmpaddr |= RTT_ODT_75_OHM | EMRS_OCD_DEFAULT;
2990 } else if (sysinfo->interleaved) {
2991 tmpaddr |= ((RTT_ODT_150_OHM | EMRS_OCD_DEFAULT) << 1);
2993 tmpaddr |= RTT_ODT_150_OHM | EMRS_OCD_DEFAULT;
2995 ram_read32(tmpaddr);
2997 /* Extended Mode Register Set */
2998 PRINTK_DEBUG("Extended Mode Register Set: OCD Exit\n");
2999 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_1);
3002 if (!sdram_capabilities_dual_channel()) {
3003 tmpaddr |= RTT_ODT_75_OHM;
3004 } else if (sysinfo->interleaved) {
3005 tmpaddr |= (RTT_ODT_150_OHM << 1);
3007 tmpaddr |= RTT_ODT_150_OHM;
3009 ram_read32(tmpaddr);
3013 static void sdram_init_complete(void)
3015 PRINTK_DEBUG("Normal Operation\n");
3016 do_ram_command(RAM_COMMAND_NORMAL);
3019 static void sdram_setup_processor_side(void)
3021 if (i945_silicon_revision() == 0)
3022 MCHBAR32(FSBPMC3) |= (1 << 2);
3024 MCHBAR8(0xb00) |= 1;
3026 if (i945_silicon_revision() == 0)
3027 MCHBAR32(SLPCTL) |= (1 << 8);
3031 * @param boot_path: 0 = normal, 1 = reset, 2 = resume from s3
3033 void sdram_initialize(int boot_path)
3035 struct sys_info sysinfo;
3038 printk(BIOS_DEBUG, "Setting up RAM controller.\n");
3040 memset(&sysinfo, 0, sizeof(sysinfo));
3042 sysinfo.boot_path = boot_path;
3044 /* Look at the type of DIMMs and verify all DIMMs are x8 or x16 width */
3045 sdram_get_dram_configuration(&sysinfo);
3047 /* If error, do cold boot */
3048 sdram_detect_errors(&sysinfo);
3050 /* Check whether we have stacked DIMMs */
3051 sdram_verify_package_type(&sysinfo);
3053 /* Determine common CAS */
3054 cas_mask = sdram_possible_cas_latencies(&sysinfo);
3056 /* Choose Common Frequency */
3057 sdram_detect_cas_latency_and_ram_speed(&sysinfo, cas_mask);
3059 /* Determine smallest common tRAS */
3060 sdram_detect_smallest_tRAS(&sysinfo);
3063 sdram_detect_smallest_tRP(&sysinfo);
3065 /* Determine tRCD */
3066 sdram_detect_smallest_tRCD(&sysinfo);
3068 /* Determine smallest refresh period */
3069 sdram_detect_smallest_refresh(&sysinfo);
3071 /* Verify all DIMMs support burst length 8 */
3072 sdram_verify_burst_length(&sysinfo);
3075 sdram_detect_smallest_tWR(&sysinfo);
3077 /* Determine DIMM size parameters (rows, columns banks) */
3078 sdram_detect_dimm_size(&sysinfo);
3080 /* determine tRFC */
3081 sdram_detect_smallest_tRFC(&sysinfo);
3083 /* Program PLL settings */
3084 sdram_program_pll_settings(&sysinfo);
3086 /* Program Graphics Frequency */
3087 sdram_program_graphics_frequency(&sysinfo);
3089 /* Program System Memory Frequency */
3090 sdram_program_memory_frequency(&sysinfo);
3092 /* Determine Mode of Operation (Interleaved etc) */
3093 sdram_set_channel_mode(&sysinfo);
3095 /* Program Clock Crossing values */
3096 sdram_program_clock_crossing();
3098 /* Disable fast dispatch */
3099 sdram_disable_fast_dispatch();
3101 /* Enable WIODLL Power Down in ACPI states */
3102 MCHBAR32(C0DMC) |= (1 << 24);
3103 MCHBAR32(C1DMC) |= (1 << 24);
3105 /* Program DRAM Row Boundary/Attribute Registers */
3107 /* program row size DRB and set TOLUD */
3108 sdram_program_row_boundaries(&sysinfo);
3110 /* program page size DRA */
3111 sdram_set_row_attributes(&sysinfo);
3113 /* Program CxBNKARC */
3114 sdram_set_bank_architecture(&sysinfo);
3116 /* Program DRAM Timing and Control registers based on SPD */
3117 sdram_set_timing_and_control(&sysinfo);
3119 /* On-Die Termination Adjustment */
3120 sdram_on_die_termination(&sysinfo);
3122 /* Pre Jedec Initialization */
3123 sdram_pre_jedec_initialization();
3125 /* Perform System Memory IO Initialization */
3126 sdram_initialize_system_memory_io(&sysinfo);
3128 /* Perform System Memory IO Buffer Enable */
3129 sdram_enable_system_memory_io(&sysinfo);
3131 /* Enable System Memory Clocks */
3132 sdram_enable_memory_clocks(&sysinfo);
3134 if (boot_path == BOOT_PATH_NORMAL) {
3135 /* Jedec Initialization sequence */
3136 sdram_jedec_enable(&sysinfo);
3139 /* Program Power Management Registers */
3140 sdram_power_management(&sysinfo);
3142 /* Post Jedec Init */
3143 sdram_post_jedec_initialization(&sysinfo);
3145 /* Program DRAM Throttling */
3146 sdram_thermal_management();
3148 /* Normal Operations */
3149 sdram_init_complete();
3151 /* Program Receive Enable Timings */
3152 sdram_program_receive_enable(&sysinfo);
3154 /* Enable Periodic RCOMP */
3155 sdram_enable_rcomp();
3157 /* Tell ICH7 that we're done */
3158 reg8 = pci_read_config8(PCI_DEV(0,0x1f,0), 0xa2);
3160 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
3162 printk(BIOS_DEBUG, "RAM initialization finished.\n");
3164 sdram_setup_processor_side();
3167 unsigned long get_top_of_ram(void)
3169 /* This will not work if TSEG is in place! */
3170 u32 tom = pci_read_config32(PCI_DEV(0,2,0), 0x5c);
3172 return (unsigned long) tom;