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 <cpu/x86/mem.h>
21 #include <cpu/x86/mtrr.h>
22 #include <cpu/x86/cache.h>
27 #define DEBUG_RAM_SETUP
29 /* Debugging macros. */
30 #if defined(DEBUG_RAM_SETUP)
31 #define PRINTK_DEBUG(x...) printk_debug(x)
33 #define PRINTK_DEBUG(x...)
36 #define RAM_INITIALIZATION_COMPLETE (1 << 19)
38 #define RAM_COMMAND_SELF_REFRESH (0x0 << 16)
39 #define RAM_COMMAND_NOP (0x1 << 16)
40 #define RAM_COMMAND_PRECHARGE (0x2 << 16)
41 #define RAM_COMMAND_MRS (0x3 << 16)
42 #define RAM_COMMAND_EMRS (0x4 << 16)
43 #define RAM_COMMAND_CBR (0x6 << 16)
44 #define RAM_COMMAND_NORMAL (0x7 << 16)
46 #define RAM_EMRS_1 (0x0 << 21)
47 #define RAM_EMRS_2 (0x1 << 21)
48 #define RAM_EMRS_3 (0x2 << 21)
50 static void do_ram_command(u32 command)
54 reg32 = MCHBAR32(DCC);
55 reg32 &= ~( (3<<21) | (1<<20) | (1<<19) | (7 << 16) );
58 /* Also set Init Complete */
59 if (command == RAM_COMMAND_NORMAL)
60 reg32 |= RAM_INITIALIZATION_COMPLETE;
62 PRINTK_DEBUG(" Sending RAM command 0x%08x", reg32);
64 MCHBAR32(DCC) = reg32; /* This is the actual magic */
66 PRINTK_DEBUG("...done\n");
69 static void ram_read32(u32 offset)
71 PRINTK_DEBUG(" ram read: %08x\n", offset);
76 #ifdef DEBUG_RAM_SETUP
77 static void sdram_dump_mchbar_registers(void)
80 printk_debug("Dumping MCHBAR Registers\n");
82 for (i=0; i<0xfff; i+=4) {
85 printk_debug("0x%04x: 0x%08x\n", i, MCHBAR32(i));
90 static int sdram_capabilities_max_supported_memory_frequency(void)
94 #ifdef MAXIMUM_SUPPORTED_FREQUENCY
95 return MAXIMUM_SUPPORTED_FREQUENCY;
98 reg32 = pci_read_config32(PCI_DEV(0, 0x00, 0), 0xe4);
106 /* Newer revisions of this chipset rather support faster memory clocks,
107 * so if it's a reserved value, return the fastest memory clock that we
108 * know of and can handle
114 * @brief determine whether chipset is capable of dual channel interleaved mode
116 * @return 1 if interleaving is supported, 0 otherwise
118 static int sdram_capabilities_interleave(void)
122 reg32 = pci_read_config8(PCI_DEV(0, 0x00,0), 0xe4);
130 * @brief determine whether chipset is capable of two memory channels
132 * @return 1 if dual channel operation is supported, 0 otherwise
134 static int sdram_capabilities_dual_channel(void)
138 reg32 = pci_read_config8(PCI_DEV(0, 0x00,0), 0xe4);
145 static int sdram_capabilities_enhanced_addressing_xor(void)
149 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe5); /* CAPID0 + 5 */
155 static int sdram_capabilities_two_dimms_per_channel(void)
159 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe8); /* CAPID0 + 8 */
165 static int sdram_capabilities_MEM4G_disable(void)
169 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe5);
175 #define GFX_FREQUENCY_CAP_166MHZ 0x04
176 #define GFX_FREQUENCY_CAP_200MHZ 0x03
177 #define GFX_FREQUENCY_CAP_250MHZ 0x02
178 #define GFX_FREQUENCY_CAP_ALL 0x00
180 static int sdram_capabilities_core_frequencies(void)
184 reg8 = pci_read_config8(PCI_DEV(0, 0x00, 0), 0xe5); /* CAPID0 + 5 */
185 reg8 &= (1 << 3) | (1 << 2) | (1 << 1);
191 static void sdram_detect_errors(void)
196 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa2);
198 if (reg8 & ((1<<7)|(1<<2))) {
200 printk_debug("SLP S4# Assertion Width Violation.\n");
202 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
207 printk_debug("DRAM initialization was interrupted.\n");
209 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
213 /* Set SLP_S3# Assertion Stretch Enable */
214 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa4); /* GEN_PMCON_3 */
216 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa4, reg8);
219 printk_debug("Reset required.\n");
222 for (;;) ; /* Wait for reset! */
226 /* Set DRAM initialization bit in ICH7 */
227 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa2);
229 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
234 * @brief Get generic DIMM parameters.
235 * @param sysinfo Central memory controller information structure
237 * This function gathers several pieces of information for each system DIMM:
238 * o DIMM width (x8 / x16)
239 * o DIMM sides (single sided / dual sided)
241 * Also, some non-supported scenarios are detected.
244 static void sdram_get_dram_configuration(struct sys_info *sysinfo)
250 * i945 supports two DIMMs, in two configurations:
252 * - single channel with two dimms
253 * - dual channel with one dimm per channel
255 * In practice dual channel mainboards have their spd at 0x50, 0x52
256 * whereas single channel configurations have their spd at 0x50/x51
258 * The capability register knows a lot about the channel configuration
259 * but for now we stick with the information we gather from the SPD
263 if (sdram_capabilities_dual_channel()) {
264 sysinfo->dual_channel = 1;
265 printk_debug("This mainboard supports Dual Channel Operation.\n");
267 sysinfo->dual_channel = 0;
268 printk_debug("This mainboard supports only Single Channel Operation.\n");
272 * Since we only support two DIMMs in total, there is a limited number
273 * of combinations. This function returns the type of DIMMs.
275 * [0:7] lower DIMM population
276 * [8-15] higher DIMM population
279 * There are 5 different possible populations for a DIMM socket:
280 * 1. x16 double sided (X16DS)
281 * 2. x8 double sided (X8DS)
282 * 3. x16 single sided (X16SS)
283 * 4. x8 double stacked (X8DDS)
284 * 5. not populated (NC)
286 * For the return value we start counting at zero.
290 for (i=0; i<(2 * DIMM_SOCKETS); i++) {
291 u8 reg8, device = DIMM_SPD_BASE + i;
293 /* Initialize the socket information with a sane value */
294 sysinfo->dimm[i] = SYSINFO_DIMM_NOT_POPULATED;
296 /* Dual Channel not supported, but Channel 1? Bail out */
297 if (!sdram_capabilities_dual_channel() && (i >> 1))
300 /* Two DIMMs per channel not supported, but odd DIMM number? */
301 if (!sdram_capabilities_two_dimms_per_channel() && (i& 1))
304 printk_debug("DDR II Channel %d Socket %d: ", (i >> 1), (i & 1));
306 if (spd_read_byte(device, SPD_MEMORY_TYPE) != SPD_MEMORY_TYPE_SDRAM_DDR2) {
307 printk_debug("N/A\n");
311 reg8 = spd_read_byte(device, SPD_DIMM_CONFIG_TYPE);
312 if (reg8 == ERROR_SCHEME_ECC)
313 die("Error: ECC memory not supported by this chipset\n");
315 reg8 = spd_read_byte(device, SPD_MODULE_ATTRIBUTES);
316 if (reg8 & MODULE_BUFFERED)
317 die("Error: Buffered memory not supported by this chipset\n");
318 if (reg8 & MODULE_REGISTERED)
319 die("Error: Registered memory not supported by this chipset\n");
321 switch (spd_read_byte(device, SPD_PRIMARY_SDRAM_WIDTH)) {
323 switch (spd_read_byte(device, SPD_NUM_DIMM_BANKS) & 0x0f) {
325 printk_debug("x8DDS\n");
326 sysinfo->dimm[i] = SYSINFO_DIMM_X8DDS;
329 printk_debug("x8DS\n");
330 sysinfo->dimm[i] = SYSINFO_DIMM_X8DS;
333 printk_debug ("Unsupported.\n");
337 switch (spd_read_byte(device, SPD_NUM_DIMM_BANKS) & 0x0f) {
339 printk_debug("x16DS\n");
340 sysinfo->dimm[i] = SYSINFO_DIMM_X16DS;
343 printk_debug("x16SS\n");
344 sysinfo->dimm[i] = SYSINFO_DIMM_X16SS;
347 printk_debug ("Unsupported.\n");
351 die("Unsupported DDR-II memory width.\n");
354 dimm_mask |= (1 << i);
358 die("No memory installed.\n");
361 /* The chipset might be able to do this. What the heck, legacy bios
362 * just beeps when a single DIMM is in the Channel 1 socket. So let's
363 * not bother until someone needs this enough to cope with it.
365 if (!(dimm_mask & ((1 << DIMM_SOCKETS) - 1))) {
366 printk_err("Channel 0 has no memory populated. This setup is not usable. Please move the DIMM.\n");
371 * @brief determine if any DIMMs are stacked
373 * @param sysinfo central sysinfo data structure.
375 static void sdram_verify_package_type(struct sys_info * sysinfo)
379 /* Assume no stacked DIMMs are available until we find one */
380 sysinfo->package = 0;
381 for (i=0; i<2*DIMM_SOCKETS; i++) {
382 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
385 /* Is the current DIMM a stacked DIMM? */
386 if (spd_read_byte(DIMM_SPD_BASE + i, SPD_NUM_DIMM_BANKS) & (1 << 4))
387 sysinfo->package = 1;
391 static u8 sdram_possible_cas_latencies(struct sys_info * sysinfo)
396 /* Setup CAS mask with all supported CAS Latencies */
397 cas_mask = SPD_CAS_LATENCY_DDR2_3 |
398 SPD_CAS_LATENCY_DDR2_4 |
399 SPD_CAS_LATENCY_DDR2_5;
401 for (i=0; i<2*DIMM_SOCKETS; i++) {
402 if (sysinfo->dimm[i] != SYSINFO_DIMM_NOT_POPULATED)
403 cas_mask &= spd_read_byte(DIMM_SPD_BASE + i, SPD_ACCEPTABLE_CAS_LATENCIES);
407 die("No DDR-II modules with accepted CAS latencies found.\n");
413 static void sdram_detect_cas_latency_and_ram_speed(struct sys_info * sysinfo, u8 cas_mask)
416 int lowest_common_cas = 0;
419 const u8 ddr2_speeds_table[] = {
420 0x50, 0x60, /* DDR2 400: tCLK = 5.0ns tAC = 0.6ns */
421 0x3d, 0x50, /* DDR2 533: tCLK = 3.75ns tAC = 0.5ns */
422 0x30, 0x45, /* DDR2 667: tCLK = 3.0ns tAC = 0.45ns */
425 const u8 spd_lookup_table[] = {
426 SPD_MIN_CYCLE_TIME_AT_CAS_MAX, SPD_ACCESS_TIME_FROM_CLOCK,
427 SPD_SDRAM_CYCLE_TIME_2ND, SPD_ACCESS_TIME_FROM_CLOCK_2ND,
428 SPD_SDRAM_CYCLE_TIME_3RD, SPD_ACCESS_TIME_FROM_CLOCK_3RD
431 switch (sdram_capabilities_max_supported_memory_frequency()) {
432 case 400: max_ram_speed = 0; break;
433 case 533: max_ram_speed = 1; break;
434 case 667: max_ram_speed = 2; break;
437 sysinfo->memory_frequency = 0;
440 if (cas_mask & SPD_CAS_LATENCY_DDR2_3) {
441 lowest_common_cas = 3;
442 } else if (cas_mask & SPD_CAS_LATENCY_DDR2_4) {
443 lowest_common_cas = 4;
444 } else if (cas_mask & SPD_CAS_LATENCY_DDR2_5) {
445 lowest_common_cas = 5;
447 PRINTK_DEBUG("lowest common cas = %d\n", lowest_common_cas);
449 for (j = max_ram_speed; j>=0; j--) {
450 int freq_cas_mask = cas_mask;
452 PRINTK_DEBUG("Probing Speed %d\n", j);
453 for (i=0; i<2*DIMM_SOCKETS; i++) {
454 int current_cas_mask;
456 PRINTK_DEBUG(" DIMM: %d\n", i);
457 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED) {
461 current_cas_mask = spd_read_byte(DIMM_SPD_BASE + i, SPD_ACCEPTABLE_CAS_LATENCIES);
463 while (current_cas_mask) {
464 int highest_supported_cas = 0, current_cas = 0;
465 PRINTK_DEBUG(" Current CAS mask: %04x; ", current_cas_mask);
466 if (current_cas_mask & SPD_CAS_LATENCY_DDR2_5) {
467 highest_supported_cas = 5;
468 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_4) {
469 highest_supported_cas = 4;
470 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_3) {
471 highest_supported_cas = 3;
473 if (current_cas_mask & SPD_CAS_LATENCY_DDR2_3) {
475 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_4) {
477 } else if (current_cas_mask & SPD_CAS_LATENCY_DDR2_5) {
481 idx = highest_supported_cas - current_cas;
482 PRINTK_DEBUG("idx=%d, ", idx);
483 PRINTK_DEBUG("tCLK=%x, ", spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[2*idx]));
484 PRINTK_DEBUG("tAC=%x", spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[(2*idx)+1]));
486 if (spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[2*idx]) <= ddr2_speeds_table[2*j] &&
487 spd_read_byte(DIMM_SPD_BASE + i, spd_lookup_table[(2*idx)+1]) <= ddr2_speeds_table[(2*j)+1]) {
488 PRINTK_DEBUG(": OK\n");
492 PRINTK_DEBUG(": Not fast enough!\n");
494 current_cas_mask &= ~(1 << (current_cas));
497 freq_cas_mask &= current_cas_mask;
498 if (!current_cas_mask) {
499 PRINTK_DEBUG(" No valid CAS for this speed on DIMM %d\n", i);
503 PRINTK_DEBUG(" freq_cas_mask for speed %d: %04x\n", j, freq_cas_mask);
506 case 0: sysinfo->memory_frequency = 400; break;
507 case 1: sysinfo->memory_frequency = 533; break;
508 case 2: sysinfo->memory_frequency = 667; break;
510 if (freq_cas_mask & SPD_CAS_LATENCY_DDR2_3) {
512 } else if (freq_cas_mask & SPD_CAS_LATENCY_DDR2_4) {
514 } else if (freq_cas_mask & SPD_CAS_LATENCY_DDR2_5) {
521 if (sysinfo->memory_frequency && sysinfo->cas) {
522 printk_debug("Memory will be driven at %dMHz with CAS=%d clocks\n",
523 sysinfo->memory_frequency, sysinfo->cas);
525 die("Could not find common memory frequency and CAS\n");
529 static void sdram_detect_smallest_tRAS(struct sys_info * sysinfo)
534 int freq_multiplier = 0;
536 switch (sysinfo->memory_frequency) {
537 case 400: freq_multiplier = 0x14; break; /* 5ns */
538 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
539 case 667: freq_multiplier = 0x0c; break; /* 3ns */
542 tRAS_cycles = 4; /* 4 clocks minimum */
543 tRAS_time = tRAS_cycles * freq_multiplier;
545 for (i=0; i<2*DIMM_SOCKETS; i++) {
548 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
551 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_MIN_ACTIVE_TO_PRECHARGE_DELAY);
553 die("Invalid tRAS value.\n");
556 while ((tRAS_time >> 2) < reg8) {
557 tRAS_time += freq_multiplier;
561 if(tRAS_cycles > 0x18) {
562 die("DDR-II Module does not support this frequency (tRAS error)\n");
565 printk_debug("tRAS = %d cycles\n", tRAS_cycles);
566 sysinfo->tras = tRAS_cycles;
569 static void sdram_detect_smallest_tRP(struct sys_info * sysinfo)
574 int freq_multiplier = 0;
576 switch (sysinfo->memory_frequency) {
577 case 400: freq_multiplier = 0x14; break; /* 5ns */
578 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
579 case 667: freq_multiplier = 0x0c; break; /* 3ns */
582 tRP_cycles = 2; /* 2 clocks minimum */
583 tRP_time = tRP_cycles * freq_multiplier;
585 for (i=0; i<2*DIMM_SOCKETS; i++) {
588 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
591 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_MIN_ROW_PRECHARGE_TIME);
593 die("Invalid tRP value.\n");
596 while (tRP_time < reg8) {
597 tRP_time += freq_multiplier;
603 die("DDR-II Module does not support this frequency (tRP error)\n");
606 printk_debug("tRP = %d cycles\n", tRP_cycles);
607 sysinfo->trp = tRP_cycles;
610 static void sdram_detect_smallest_tRCD(struct sys_info * sysinfo)
615 int freq_multiplier = 0;
617 switch (sysinfo->memory_frequency) {
618 case 400: freq_multiplier = 0x14; break; /* 5ns */
619 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
620 case 667: freq_multiplier = 0x0c; break; /* 3ns */
623 tRCD_cycles = 2; /* 2 clocks minimum */
624 tRCD_time = tRCD_cycles * freq_multiplier;
626 for (i=0; i<2*DIMM_SOCKETS; i++) {
629 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
632 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_MIN_RAS_TO_CAS_DELAY);
634 die("Invalid tRCD value.\n");
637 while (tRCD_time < reg8) {
638 tRCD_time += freq_multiplier;
642 if(tRCD_cycles > 6) {
643 die("DDR-II Module does not support this frequency (tRCD error)\n");
646 printk_debug("tRCD = %d cycles\n", tRCD_cycles);
647 sysinfo->trcd = tRCD_cycles;
650 static void sdram_detect_smallest_tWR(struct sys_info * sysinfo)
655 int freq_multiplier = 0;
657 switch (sysinfo->memory_frequency) {
658 case 400: freq_multiplier = 0x14; break; /* 5ns */
659 case 533: freq_multiplier = 0x0f; break; /* 3.75ns */
660 case 667: freq_multiplier = 0x0c; break; /* 3ns */
663 tWR_cycles = 2; /* 2 clocks minimum */
664 tWR_time = tWR_cycles * freq_multiplier;
666 for (i=0; i<2*DIMM_SOCKETS; i++) {
669 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
672 reg8 = spd_read_byte(DIMM_SPD_BASE + i, SPD_WRITE_RECOVERY_TIME);
674 die("Invalid tWR value.\n");
677 while (tWR_time < reg8) {
678 tWR_time += freq_multiplier;
683 die("DDR-II Module does not support this frequency (tWR error)\n");
686 printk_debug("tWR = %d cycles\n", tWR_cycles);
687 sysinfo->twr = tWR_cycles;
690 static void sdram_detect_smallest_tRFC(struct sys_info * sysinfo)
694 const u8 tRFC_cycles[] = {
696 15, 21, 26, /* DDR2-400 */
697 20, 28, 34, /* DDR2-533 */
698 25, 35, 43 /* DDR2-667 */
701 for (i=0; i<2*DIMM_SOCKETS; i++) {
704 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
707 reg8 = sysinfo->banksize[i*2];
709 case 0x04: reg8 = 0; break;
710 case 0x08: reg8 = 1; break;
711 case 0x10: reg8 = 2; break;
712 case 0x20: reg8 = 3; break;
715 if (sysinfo->dimm[i] == SYSINFO_DIMM_X16DS || sysinfo->dimm[i] == SYSINFO_DIMM_X16SS)
719 /* Can this happen? Go back to 127.5ns just to be sure
720 * we don't run out of the array. This may be wrong
722 printk_debug("DIMM %d is 1Gb x16.. Please report.\n", i);
731 switch (sysinfo->memory_frequency) {
732 case 667: index += 3; /* Fallthrough */
733 case 533: index += 3; /* Fallthrough */
737 sysinfo->trfc = tRFC_cycles[index];
738 printk_debug("tRFC = %d cycles\n", tRFC_cycles[index]);
741 static void sdram_detect_smallest_refresh(struct sys_info * sysinfo)
745 sysinfo->refresh = 0;
747 for (i=0; i<2*DIMM_SOCKETS; i++) {
750 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
753 refresh = spd_read_byte(DIMM_SPD_BASE + i, SPD_REFRESH) & ~(1 << 7);
759 /* Refresh is slower than 15.6us, use 15.6us */
764 sysinfo->refresh = 1;
768 die("DDR-II module has unsupported refresh value\n");
770 printk_debug("Refresh: %s\n", sysinfo->refresh?"7.8us":"15.6us");
773 static void sdram_verify_burst_length(struct sys_info * sysinfo)
777 for (i=0; i<2*DIMM_SOCKETS; i++) {
778 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
781 if (!(spd_read_byte(DIMM_SPD_BASE + i, SPD_SUPPORTED_BURST_LENGTHS) & SPD_BURST_LENGTH_8))
782 die("Only DDR-II RAM with burst length 8 is supported by this chipset.\n");
786 static void sdram_program_dram_width(struct sys_info * sysinfo)
788 u16 c0dramw=0, c1dramw=0;
791 if (sysinfo->dual_channel)
796 switch (sysinfo->dimm[0]) {
797 case 0: c0dramw = 0x0000; break; /* x16DS */
798 case 1: c0dramw = 0x0001; break; /* x8DS */
799 case 2: c0dramw = 0x0000; break; /* x16SS */
800 case 3: c0dramw = 0x0005; break; /* x8DDS */
801 case 4: c0dramw = 0x0000; break; /* NC */
804 switch (sysinfo->dimm[idx]) {
805 case 0: c1dramw = 0x0000; break; /* x16DS */
806 case 1: c1dramw = 0x0010; break; /* x8DS */
807 case 2: c1dramw = 0x0000; break; /* x16SS */
808 case 3: c1dramw = 0x0050; break; /* x8DDS */
809 case 4: c1dramw = 0x0000; break; /* NC */
812 if ( !sdram_capabilities_dual_channel() ) {
818 MCHBAR16(C0DRAMW) = c0dramw;
819 MCHBAR16(C1DRAMW) = c1dramw;
822 static void sdram_write_slew_rates(u32 offset, const u32 *slew_rate_table)
827 MCHBAR32(offset+(i*4)) = slew_rate_table[i];
830 static void sdram_rcomp_buffer_strength_and_slew(struct sys_info *sysinfo)
832 static const u32 dq2030[] = {
833 0x08070706, 0x0a090908, 0x0d0c0b0a, 0x12100f0e,
834 0x1a181614, 0x22201e1c, 0x2a282624, 0x3934302d,
835 0x0a090908, 0x0c0b0b0a, 0x0e0d0d0c, 0x1211100f,
836 0x19171513, 0x211f1d1b, 0x2d292623, 0x3f393531
839 static const u32 dq2330[] = {
840 0x08070706, 0x0a090908, 0x0d0c0b0a, 0x12100f0e,
841 0x1a181614, 0x22201e1c, 0x2a282624, 0x3934302d,
842 0x0a090908, 0x0c0b0b0a, 0x0e0d0d0c, 0x1211100f,
843 0x19171513, 0x211f1d1b, 0x2d292623, 0x3f393531
846 static const u32 cmd2710[] = {
847 0x07060605, 0x0f0d0b09, 0x19171411, 0x1f1f1d1b,
848 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f,
849 0x1110100f, 0x0f0d0b09, 0x19171411, 0x1f1f1d1b,
850 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f
853 static const u32 cmd3210[] = {
854 0x0f0d0b0a, 0x17151311, 0x1f1d1b19, 0x1f1f1f1f,
855 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f,
856 0x18171615, 0x1f1f1c1a, 0x1f1f1f1f, 0x1f1f1f1f,
857 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f, 0x1f1f1f1f
860 static const u32 clk2030[] = {
861 0x0e0d0d0c, 0x100f0f0e, 0x100f0e0d, 0x15131211,
862 0x1d1b1917, 0x2523211f, 0x2a282927, 0x32302e2c,
863 0x17161514, 0x1b1a1918, 0x1f1e1d1c, 0x23222120,
864 0x27262524, 0x2d2b2928, 0x3533312f, 0x3d3b3937
867 static const u32 ctl3215[] = {
868 0x01010000, 0x03020101, 0x07060504, 0x0b0a0908,
869 0x100f0e0d, 0x14131211, 0x18171615, 0x1c1b1a19,
870 0x05040403, 0x07060605, 0x0a090807, 0x0f0d0c0b,
871 0x14131211, 0x18171615, 0x1c1b1a19, 0x201f1e1d
874 static const u32 ctl3220[] = {
875 0x05040403, 0x07060505, 0x0e0c0a08, 0x1a171411,
876 0x2825221f, 0x35322f2b, 0x3e3e3b38, 0x3e3e3e3e,
877 0x09080807, 0x0b0a0a09, 0x0f0d0c0b, 0x1b171311,
878 0x2825221f, 0x35322f2b, 0x3e3e3b38, 0x3e3e3e3e
881 static const u32 nc[] = {
882 0x00000000, 0x00000000, 0x00000000, 0x00000000,
883 0x00000000, 0x00000000, 0x00000000, 0x00000000,
884 0x00000000, 0x00000000, 0x00000000, 0x00000000,
885 0x00000000, 0x00000000, 0x00000000, 0x00000000
888 static const u32 const * const dual_channel_slew_group_lookup[] = {
889 dq2030, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd3210,
890 dq2030, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd3210,
891 dq2030, cmd3210, nc, ctl3215, nc, clk2030, dq2030, cmd3210,
892 dq2030, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd2710,
893 dq2030, cmd3210, nc, ctl3215, nc, clk2030, nc, nc,
895 dq2030, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd3210,
896 dq2030, cmd3210, ctl3215, nc, clk2030, nc, dq2030, cmd3210,
897 dq2030, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd3210,
898 dq2030, cmd3210, ctl3215, nc, clk2030, nc, dq2030, cmd2710,
899 dq2030, cmd3210, ctl3215, nc, clk2030, nc, nc, nc,
901 dq2030, cmd3210, nc, ctl3215, nc, clk2030, dq2030, cmd3210,
902 dq2030, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd3210,
903 dq2030, cmd3210, nc, ctl3215, nc, clk2030, dq2030, cmd3210,
904 dq2030, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd2710,
905 dq2030, cmd3210, nc, ctl3215, nc, clk2030, nc, nc,
907 dq2030, cmd2710, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd3210,
908 dq2030, cmd2710, ctl3215, nc, clk2030, nc, dq2030, cmd3210,
909 dq2030, cmd2710, ctl3215, ctl3215, clk2030, clk2030, dq2030, cmd3210,
910 dq2030, cmd2710, ctl3215, nc, clk2030, nc, dq2030, cmd2710,
911 dq2030, cmd2710, ctl3215, nc, clk2030, nc, nc, nc,
913 nc, nc, nc, ctl3215, nc, clk2030, dq2030, cmd3210,
914 nc, nc, ctl3215, nc, clk2030, nc, dq2030, cmd3210,
915 nc, nc, nc, ctl3215, nc, clk2030, dq2030, cmd3210,
916 nc, nc, ctl3215, nc, clk2030, clk2030, dq2030, cmd2710
919 static const u32 const * const single_channel_slew_group_lookup[] = {
920 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
921 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
922 dq2330, cmd3210, nc, ctl3215, nc, clk2030, dq2330, cmd3210,
923 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
924 dq2330, cmd3210, nc, ctl3215, nc, clk2030, nc, nc,
926 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
927 dq2330, cmd3210, ctl3215, nc, clk2030, nc, dq2330, cmd3210,
928 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
929 dq2330, cmd3210, ctl3215, nc, clk2030, nc, dq2330, cmd3210,
930 dq2330, cmd3210, ctl3215, nc, clk2030, nc, nc, nc,
932 dq2330, cmd3210, nc, ctl3215, nc, clk2030, dq2330, cmd3210,
933 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
934 dq2330, cmd3210, nc, ctl3215, nc, clk2030, dq2330, cmd3210,
935 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
936 dq2330, cmd3210, nc, ctl3215, nc, clk2030, nc, nc,
938 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
939 dq2330, cmd3210, ctl3215, nc, clk2030, nc, dq2330, cmd3210,
940 dq2330, cmd3210, ctl3215, ctl3215, clk2030, clk2030, dq2330, cmd3210,
941 dq2330, cmd3210, ctl3215, nc, clk2030, nc, dq2330, cmd3210,
942 dq2330, cmd3210, ctl3215, nc, clk2030, nc, nc, nc,
944 dq2330, nc, nc, ctl3215, nc, clk2030, dq2030, cmd3210,
945 dq2330, nc, ctl3215, nc, clk2030, nc, dq2030, cmd3210,
946 dq2330, nc, nc, ctl3215, nc, clk2030, dq2030, cmd3210,
947 dq2330, nc, ctl3215, nc, clk2030, clk2030, dq2030, cmd3210
950 /* Strength multiplier tables */
951 static const u8 dual_channel_strength_multiplier[] = {
952 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
953 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
954 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
955 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x22,
956 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
957 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
958 0x44, 0x11, 0x11, 0x00, 0x44, 0x00, 0x44, 0x11,
959 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
960 0x44, 0x11, 0x11, 0x00, 0x44, 0x00, 0x44, 0x22,
961 0x44, 0x11, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
962 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
963 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
964 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
965 0x44, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x22,
966 0x44, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
967 0x44, 0x22, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
968 0x44, 0x22, 0x11, 0x00, 0x44, 0x00, 0x44, 0x11,
969 0x44, 0x22, 0x11, 0x11, 0x44, 0x44, 0x44, 0x11,
970 0x44, 0x22, 0x11, 0x00, 0x44, 0x00, 0x44, 0x22,
971 0x44, 0x22, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
973 0x00, 0x00, 0x11, 0x00, 0x44, 0x00, 0x44, 0x11,
974 0x00, 0x00, 0x00, 0x11, 0x00, 0x44, 0x44, 0x11,
975 0x00, 0x00, 0x11, 0x00, 0x44, 0x44, 0x44, 0x22
978 static const u8 single_channel_strength_multiplier[] = {
979 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
980 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
981 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
982 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
983 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
984 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
985 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
986 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
987 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
988 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
989 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
990 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
991 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
992 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
993 0x33, 0x11, 0x00, 0x11, 0x00, 0x44, 0x00, 0x00,
994 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
995 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
996 0x33, 0x11, 0x11, 0x11, 0x44, 0x44, 0x33, 0x11,
997 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
998 0x33, 0x11, 0x11, 0x00, 0x44, 0x00, 0x00, 0x00,
999 0x33, 0x00, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
1000 0x33, 0x00, 0x11, 0x00, 0x44, 0x00, 0x33, 0x11,
1001 0x33, 0x00, 0x00, 0x11, 0x00, 0x44, 0x33, 0x11,
1002 0x33, 0x00, 0x11, 0x00, 0x44, 0x44, 0x33, 0x11
1005 const u8 * strength_multiplier;
1006 const u32* const * slew_group_lookup;
1009 /* Set Strength Multipliers */
1011 /* Dual Channel needs different tables. */
1012 if (sdram_capabilities_dual_channel()) {
1013 printk_debug("Programming Dual Channel RCOMP\n");
1014 strength_multiplier = dual_channel_strength_multiplier;
1015 slew_group_lookup = dual_channel_slew_group_lookup;
1016 idx = 5 * sysinfo->dimm[0] + sysinfo->dimm[2];
1018 printk_debug("Programming Single Channel RCOMP\n");
1019 strength_multiplier = single_channel_strength_multiplier;
1020 slew_group_lookup = single_channel_slew_group_lookup;
1021 idx = 5 * sysinfo->dimm[0] + sysinfo->dimm[1];
1024 printk_debug("Table Index: %d\n", idx);
1026 MCHBAR8(G1SC) = strength_multiplier[idx * 8 + 0];
1027 MCHBAR8(G2SC) = strength_multiplier[idx * 8 + 1];
1028 MCHBAR8(G3SC) = strength_multiplier[idx * 8 + 2];
1029 MCHBAR8(G4SC) = strength_multiplier[idx * 8 + 3];
1030 MCHBAR8(G5SC) = strength_multiplier[idx * 8 + 4];
1031 MCHBAR8(G6SC) = strength_multiplier[idx * 8 + 5];
1032 MCHBAR8(G7SC) = strength_multiplier[idx * 8 + 6];
1033 MCHBAR8(G8SC) = strength_multiplier[idx * 8 + 7];
1036 sdram_write_slew_rates(G1SRPUT, slew_group_lookup[idx * 8 + 0]);
1037 sdram_write_slew_rates(G2SRPUT, slew_group_lookup[idx * 8 + 1]);
1038 if ((slew_group_lookup[idx * 8 + 2] != nc) && (sysinfo->package == SYSINFO_PACKAGE_STACKED)) {
1040 sdram_write_slew_rates(G3SRPUT, ctl3220);
1042 sdram_write_slew_rates(G3SRPUT, slew_group_lookup[idx * 8 + 2]);
1044 sdram_write_slew_rates(G4SRPUT, slew_group_lookup[idx * 8 + 3]);
1045 sdram_write_slew_rates(G5SRPUT, slew_group_lookup[idx * 8 + 4]);
1046 sdram_write_slew_rates(G6SRPUT, slew_group_lookup[idx * 8 + 5]);
1049 if (sysinfo->dual_channel) {
1050 sdram_write_slew_rates(G7SRPUT, slew_group_lookup[idx * 8 + 6]);
1051 sdram_write_slew_rates(G8SRPUT, slew_group_lookup[idx * 8 + 7]);
1053 sdram_write_slew_rates(G7SRPUT, nc);
1054 sdram_write_slew_rates(G8SRPUT, nc);
1058 static void sdram_enable_rcomp(void)
1061 /* Enable Global Periodic RCOMP */
1063 reg32 = MCHBAR32(GBRCOMPCTL);
1064 reg32 &= ~(1 << 23);
1065 MCHBAR32(GBRCOMPCTL) = reg32;
1068 static void sdram_program_dll_timings(struct sys_info *sysinfo)
1070 u32 chan0dll = 0, chan1dll = 0;
1073 printk_debug ("Programming DLL Timings... \n");
1075 MCHBAR16(DQSMT) &= ~( (3 << 12) | (1 << 10) | ( 0xf << 0) );
1076 MCHBAR16(DQSMT) |= (1 << 13) | (0xc << 0);
1078 /* We drive both channels with the same speed */
1079 switch (sysinfo->memory_frequency) {
1080 case 400: chan0dll = 0x26262626; chan1dll=0x26262626; break; /* 400MHz */
1081 case 533: chan0dll = 0x22222222; chan1dll=0x22222222; break; /* 533MHz */
1082 case 667: chan0dll = 0x11111111; chan1dll=0x11111111; break; /* 667MHz */
1085 for (i=0; i < 4; i++) {
1086 MCHBAR32(C0R0B00DQST + (i * 0x10) + 0) = chan0dll;
1087 MCHBAR32(C0R0B00DQST + (i * 0x10) + 4) = chan0dll;
1088 MCHBAR32(C1R0B00DQST + (i * 0x10) + 0) = chan1dll;
1089 MCHBAR32(C1R0B00DQST + (i * 0x10) + 4) = chan1dll;
1093 static void sdram_force_rcomp(void)
1098 reg32 = MCHBAR32(ODTC);
1100 MCHBAR32(ODTC) = reg32;
1102 reg32 = MCHBAR32(SMSRCTL);
1104 MCHBAR32(SMSRCTL) = reg32;
1106 /* Start initial RCOMP */
1107 reg32 = MCHBAR32(GBRCOMPCTL);
1109 MCHBAR32(GBRCOMPCTL) = reg32;
1111 reg8 = i945_silicon_revision();
1112 if ((reg8 == 0 && (MCHBAR32(DCC) & (3 << 0)) == 0) || (reg8 == 1)) {
1113 reg32 = MCHBAR32(GBRCOMPCTL);
1115 MCHBAR32(GBRCOMPCTL) = reg32;
1119 static void sdram_initialize_system_memory_io(struct sys_info *sysinfo)
1124 printk_debug ("Initializing System Memory IO... \n");
1125 /* Enable Data Half Clock Pushout */
1126 reg8 = MCHBAR8(C0HCTC);
1129 MCHBAR8(C0HCTC) = reg8;
1131 reg8 = MCHBAR8(C1HCTC);
1134 MCHBAR8(C1HCTC) = reg8;
1136 MCHBAR16(WDLLBYPMODE) &= ~( (1 << 9) | (1 << 6) | (1 << 4) | (1 << 3) | (1 << 1) );
1137 MCHBAR16(WDLLBYPMODE) |= (1 << 8) | (1 << 7) | (1 << 5) | (1 << 2) | (1 << 0);
1139 MCHBAR8(C0WDLLCMC) = 0;
1140 MCHBAR8(C1WDLLCMC) = 0;
1142 /* Program RCOMP Settings */
1143 sdram_program_dram_width(sysinfo);
1145 sdram_rcomp_buffer_strength_and_slew(sysinfo);
1147 /* Indicate that RCOMP programming is done */
1148 reg32 = MCHBAR32(GBRCOMPCTL);
1149 reg32 &= ~( (1 << 29) | (1 << 26) | (3 << 21) | (3 << 2) );
1150 reg32 |= (3 << 27) | (3 << 0);
1151 MCHBAR32(GBRCOMPCTL) = reg32;
1153 MCHBAR32(GBRCOMPCTL) |= (1 << 10);
1155 /* Program DLL Timings */
1156 sdram_program_dll_timings(sysinfo);
1158 /* Force RCOMP cycle */
1159 sdram_force_rcomp();
1162 static void sdram_enable_system_memory_io(struct sys_info *sysinfo)
1166 printk_debug ("Enabling System Memory IO... \n");
1168 reg32 = MCHBAR32(RCVENMT);
1169 reg32 &= ~(0x3f << 6);
1170 MCHBAR32(RCVENMT) = reg32; /* [11:6] = 0 */
1172 reg32 |= (1 << 11) | (1 << 9);
1173 MCHBAR32(RCVENMT) = reg32;
1175 reg32 = MCHBAR32(DRTST);
1176 reg32 |= (1 << 3) | (1 << 2);
1177 MCHBAR32(DRTST) = reg32;
1179 reg32 = MCHBAR32(DRTST);
1180 reg32 |= (1 << 6) | (1 << 4);
1181 MCHBAR32(DRTST) = reg32;
1183 asm volatile ("nop; nop;");
1185 reg32 = MCHBAR32(DRTST);
1187 /* Is channel 0 populated? */
1188 if (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
1189 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED)
1190 reg32 |= (1 << 7) | (1 << 5);
1194 /* Is channel 1 populated? */
1195 if (sysinfo->dimm[2] != SYSINFO_DIMM_NOT_POPULATED ||
1196 sysinfo->dimm[3] != SYSINFO_DIMM_NOT_POPULATED)
1197 reg32 |= (1 << 9) | (1 << 8);
1201 MCHBAR32(DRTST) = reg32;
1203 /* Activate DRAM Channel IO Buffers */
1204 if (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
1205 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED) {
1206 reg32 = MCHBAR32(C0DRC1);
1208 MCHBAR32(C0DRC1) = reg32;
1210 if (sysinfo->dimm[2] != SYSINFO_DIMM_NOT_POPULATED ||
1211 sysinfo->dimm[3] != SYSINFO_DIMM_NOT_POPULATED) {
1212 reg32 = MCHBAR32(C1DRC1);
1214 MCHBAR32(C1DRC1) = reg32;
1219 unsigned long side1;
1220 unsigned long side2;
1223 static struct dimm_size sdram_get_dimm_size(u16 device)
1225 /* Calculate the log base 2 size of a DIMM in bits */
1226 struct dimm_size sz;
1227 int value, low, rows, columns;
1232 rows = spd_read_byte(device, SPD_NUM_ROWS); /* rows */
1233 if (rows < 0) goto hw_err;
1234 if ((rows & 0xf) == 0) goto val_err;
1235 sz.side1 += rows & 0xf;
1237 columns = spd_read_byte(device, SPD_NUM_COLUMNS); /* columns */
1238 if (columns < 0) goto hw_err;
1239 if ((columns & 0xf) == 0) goto val_err;
1240 sz.side1 += columns & 0xf;
1242 value = spd_read_byte(device, SPD_NUM_BANKS_PER_SDRAM); /* banks */
1243 if (value < 0) goto hw_err;
1244 if ((value & 0xff) == 0) goto val_err;
1245 sz.side1 += log2(value & 0xff);
1247 /* Get the module data width and convert it to a power of two */
1248 value = spd_read_byte(device, SPD_MODULE_DATA_WIDTH_MSB); /* (high byte) */
1249 if (value < 0) goto hw_err;
1253 low = spd_read_byte(device, SPD_MODULE_DATA_WIDTH_LSB); /* (low byte) */
1254 if (low < 0) goto hw_err;
1255 value = value | (low & 0xff);
1256 if ((value != 72) && (value != 64)) goto val_err;
1257 sz.side1 += log2(value);
1260 value = spd_read_byte(device, SPD_NUM_DIMM_BANKS); /* number of physical banks */
1262 if (value < 0) goto hw_err;
1265 if (value == 1) goto out;
1266 if (value != 2) goto val_err;
1268 /* Start with the symmetrical case */
1269 sz.side2 = sz.side1;
1271 if ((rows & 0xf0) == 0) goto out; /* If symmetrical we are done */
1273 /* Don't die here, I have not come across any of these to test what
1276 printk_err("Assymetric DIMMs are not supported by this chipset\n");
1278 sz.side2 -= (rows & 0x0f); /* Subtract out rows on side 1 */
1279 sz.side2 += ((rows >> 4) & 0x0f); /* Add in rows on side 2 */
1281 sz.side2 -= (columns & 0x0f); /* Subtract out columns on side 1 */
1282 sz.side2 += ((columns >> 4) & 0x0f); /* Add in columns on side 2 */
1287 die("Bad SPD value\n");
1289 /* If a hardware error occurs the spd rom probably does not exist.
1290 * In this case report that there is no memory
1298 static void sdram_detect_dimm_size(struct sys_info * sysinfo)
1302 for(i = 0; i < 2 * DIMM_SOCKETS; i++) {
1303 struct dimm_size sz;
1305 sysinfo->banksize[i * 2] = 0;
1306 sysinfo->banksize[(i * 2) + 1] = 0;
1308 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
1311 sz = sdram_get_dimm_size(DIMM_SPD_BASE + i);
1313 sysinfo->banks[i] = spd_read_byte(DIMM_SPD_BASE + i, SPD_NUM_BANKS_PER_SDRAM); /* banks */
1316 die("DDR-II rank size smaller than 128MB is not supported.\n");
1318 sysinfo->banksize[i * 2] = 1 << (sz.side1 - 28);
1320 printk_debug("DIMM %d side 0 = %d MB\n", i, sysinfo->banksize[i * 2] * 32 );
1325 /* If there is a second side, it has to have at least 128M, too */
1327 die("DDR-II rank size smaller than 128MB is not supported.\n");
1329 sysinfo->banksize[(i * 2) + 1] = 1 << (sz.side2 - 28);
1331 printk_debug("DIMM %d side 1 = %d MB\n", i, sysinfo->banksize[(i * 2) + 1] * 32);
1335 static int sdram_program_row_boundaries(struct sys_info *sysinfo)
1338 int cum0, cum1, tolud, tom;
1340 printk_debug ("Setting RAM size... \n");
1343 for(i = 0; i < 2 * DIMM_SOCKETS; i++) {
1344 cum0 += sysinfo->banksize[i];
1345 MCHBAR8(C0DRB0+i) = cum0;
1348 /* Assume we continue in Channel 1 where we stopped in Channel 0 */
1351 /* Exception: Interleaved starts from the beginning */
1352 if (sysinfo->interleaved)
1355 /* Exception: Channel 1 is not populated. C1DRB stays zero */
1356 if (sysinfo->dimm[2] == SYSINFO_DIMM_NOT_POPULATED &&
1357 sysinfo->dimm[3] == SYSINFO_DIMM_NOT_POPULATED)
1360 for(i = 0; i < 2 * DIMM_SOCKETS; i++) {
1361 cum1 += sysinfo->banksize[i + 4];
1362 MCHBAR8(C1DRB0+i) = cum1;
1365 /* Set TOLUD Top Of Low Usable DRAM */
1366 if (sysinfo->interleaved)
1367 tolud = (cum0 + cum1) << 1;
1369 tolud = (cum1 ? cum1 : cum0) << 1;
1371 /* The TOM register has a different format */
1374 /* Limit the value of TOLUD to leave some space for PCI memory. */
1376 tolud = 0xd0; /* 3.25GB : 0.75GB */
1378 pci_write_config8(PCI_DEV(0,0,0), TOLUD, tolud);
1380 printk_debug("C0DRB = 0x%08x\n", MCHBAR32(C0DRB0));
1381 printk_debug("C1DRB = 0x%08x\n", MCHBAR32(C1DRB0));
1382 printk_debug("TOLUD = 0x%04x\n", pci_read_config8(PCI_DEV(0,0,0), TOLUD));
1384 pci_write_config16(PCI_DEV(0,0,0), TOM, tom);
1389 static int sdram_set_row_attributes(struct sys_info *sysinfo)
1392 u16 dra0=0, dra1=0, dra = 0;
1394 printk_debug ("Setting row attributes... \n");
1395 for(i=0; i < 2 * DIMM_SOCKETS; i++) {
1399 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED) {
1403 device = DIMM_SPD_BASE + i;
1405 value = spd_read_byte(device, SPD_NUM_ROWS); /* rows */
1406 columnsrows = (value & 0x0f);
1408 value = spd_read_byte(device, SPD_NUM_COLUMNS); /* columns */
1409 columnsrows |= (value & 0xf) << 4;
1411 switch (columnsrows) {
1412 case 0x9d: dra = 2; break;
1413 case 0xad: dra = 3; break;
1414 case 0xbd: dra = 4; break;
1415 case 0xae: dra = 3; break;
1416 case 0xbe: dra = 4; break;
1417 default: die("Unsupported Rows/Columns. (DRA)");
1420 /* Double Sided DIMMs? */
1421 if (sysinfo->banksize[(2 * i) + 1] != 0) {
1422 dra = (dra << 4) | dra;
1425 if (i < DIMM_SOCKETS)
1426 dra0 |= (dra << (i*8));
1428 dra1 |= (dra << ((i - DIMM_SOCKETS)*8));
1431 MCHBAR16(C0DRA0) = dra0;
1432 MCHBAR16(C1DRA0) = dra1;
1434 printk_debug("C0DRA = 0x%04x\n", dra0);
1435 printk_debug("C1DRA = 0x%04x\n", dra1);
1440 static void sdram_set_bank_architecture(struct sys_info *sysinfo)
1445 MCHBAR16(C1BNKARC) &= 0xff00;
1446 MCHBAR16(C0BNKARC) &= 0xff00;
1449 for (i=0; i < 2 * DIMM_SOCKETS; i++) {
1450 /* Switch to second channel */
1451 if (i == DIMM_SOCKETS)
1454 if (sysinfo->dimm[i] == SYSINFO_DIMM_NOT_POPULATED)
1457 if (sysinfo->banks[i] != 8)
1460 printk_spew("DIMM%d has 8 banks.\n");
1463 MCHBAR16(off32) |= 0x50;
1465 MCHBAR16(off32) |= 0x05;
1469 #define REFRESH_7_8US 1
1470 #define REFRESH_15_6US 0
1471 static void sdram_program_refresh_rate(struct sys_info *sysinfo)
1475 if (sysinfo->refresh == REFRESH_7_8US) {
1476 reg32 = (2 << 8); /* Refresh enabled at 7.8us */
1478 reg32 = (1 << 8); /* Refresh enabled at 15.6us */
1481 MCHBAR32(C0DRC0) &= ~(7 << 8);
1482 MCHBAR32(C0DRC0) |= reg32;
1484 MCHBAR32(C1DRC0) &= ~(7 << 8);
1485 MCHBAR32(C1DRC0) |= reg32;
1488 static void sdram_program_cke_tristate(struct sys_info *sysinfo)
1493 reg32 = MCHBAR32(C0DRC1);
1495 for (i=0; i < 4; i++) {
1496 if (sysinfo->banksize[i] == 0) {
1497 reg32 |= (1 << (16 + i));
1504 MCHBAR32(C0DRC1) = reg32;
1506 /* Do we have to do this if we're in Single Channel Mode? */
1507 reg32 = MCHBAR32(C1DRC1);
1509 for (i=4; i < 8; i++) {
1510 if (sysinfo->banksize[i] == 0) {
1511 reg32 |= (1 << (12 + i));
1518 MCHBAR32(C1DRC1) = reg32;
1521 static void sdram_program_odt_tristate(struct sys_info *sysinfo)
1526 reg32 = MCHBAR32(C0DRC2);
1528 for (i=0; i < 4; i++) {
1529 if (sysinfo->banksize[i] == 0) {
1530 reg32 |= (1 << (24 + i));
1533 MCHBAR32(C0DRC2) = reg32;
1535 reg32 = MCHBAR32(C1DRC2);
1537 for (i=4; i < 8; i++) {
1538 if (sysinfo->banksize[i] == 0) {
1539 reg32 |= (1 << (20 + i));
1542 MCHBAR32(C1DRC2) = reg32;
1545 static void sdram_set_timing_and_control(struct sys_info *sysinfo)
1552 static const u8 const drt0_table[] = {
1554 3, 4, 5, /* FSB533/400, DDR533/400 */
1555 4, 5, 6, /* FSB667, DDR533/400 */
1556 4, 5, 6, /* FSB667, DDR667 */
1559 static const u8 const cas_table[] = {
1563 reg32 = MCHBAR32(C0DRC0);
1564 reg32 |= (1 << 2); /* Burst Length 8 */
1565 reg32 &= ~( (1 << 13) | (1 << 12) );
1566 MCHBAR32(C0DRC0) = reg32;
1568 reg32 = MCHBAR32(C1DRC0);
1569 reg32 |= (1 << 2); /* Burst Length 8 */
1570 reg32 &= ~( (1 << 13) | (1 << 12) );
1571 MCHBAR32(C1DRC0) = reg32;
1573 if (!sysinfo->dual_channel && sysinfo->dimm[1] !=
1574 SYSINFO_DIMM_NOT_POPULATED) {
1575 reg32 = MCHBAR32(C0DRC0);
1577 MCHBAR32(C0DRC0) = reg32;
1580 sdram_program_refresh_rate(sysinfo);
1582 sdram_program_cke_tristate(sysinfo);
1584 sdram_program_odt_tristate(sysinfo);
1586 /* Calculate DRT0 */
1590 /* B2B Write Precharge (same bank) = CL-1 + BL/2 + tWR */
1591 reg32 = (sysinfo->cas - 1) + (BURSTLENGTH / 2) + sysinfo->twr;
1592 temp_drt |= (reg32 << 28);
1594 /* Write Auto Precharge (same bank) = CL-1 + BL/2 + tWR + tRP */
1595 reg32 += sysinfo->trp;
1596 temp_drt |= (reg32 << 4);
1598 if (sysinfo->memory_frequency == 667) {
1599 tWTR = 3; /* 667MHz */
1601 tWTR = 2; /* 400 and 533 */
1604 /* B2B Write to Read Command Spacing */
1605 reg32 = (sysinfo->cas - 1) + (BURSTLENGTH / 2) + tWTR;
1606 temp_drt |= (reg32 << 24);
1608 /* CxDRT0 [23:22], [21:20], [19:18] [16] have fixed values */
1609 temp_drt |= ( (1 << 22) | (3 << 20) | (1 << 18) | (0 << 16) );
1611 /* Program Write Auto Precharge to Activate */
1613 if (sysinfo->fsb_frequency == 667) { /* 667MHz FSB */
1616 if (sysinfo->memory_frequency == 667) {
1619 off32 += sysinfo->cas - 3;
1620 reg32 = drt0_table[off32];
1621 temp_drt |= (reg32 << 11);
1623 /* Read Auto Precharge to Activate */
1625 temp_drt |= (8 << 0);
1627 MCHBAR32(C0DRT0) = temp_drt;
1628 MCHBAR32(C1DRT0) = temp_drt;
1630 /* Calculate DRT1 */
1632 temp_drt = MCHBAR32(C0DRT1) & 0x00020088;
1634 /* DRAM RASB Precharge */
1635 temp_drt |= (sysinfo->trp - 2) << 0;
1637 /* DRAM RASB to CASB Delay */
1638 temp_drt |= (sysinfo->trcd - 2) << 4;
1641 temp_drt |= (cas_table[sysinfo->cas - 3]) << 8;
1643 /* Refresh Cycle Time */
1644 temp_drt |= (sysinfo->trfc) << 10;
1646 /* Pre-All to Activate Delay */
1647 temp_drt |= (0 << 16);
1649 /* Precharge to Precharge Delay stays at 1 clock */
1650 temp_drt |= (0 << 18);
1652 /* Activate to Precharge Delay */
1653 temp_drt |= (sysinfo->tras << 19);
1655 /* Read to Precharge (tRTP) */
1656 if (sysinfo->memory_frequency == 667) {
1657 temp_drt |= (1 << 28);
1659 temp_drt |= (0 << 28);
1662 /* Determine page size */
1664 page_size = 1; /* Default: 1k pagesize */
1665 for (i=0; i< 2*DIMM_SOCKETS; i++) {
1666 if (sysinfo->dimm[i] == SYSINFO_DIMM_X16DS ||
1667 sysinfo->dimm[i] == SYSINFO_DIMM_X16SS)
1668 page_size = 2; /* 2k pagesize */
1671 if (sysinfo->memory_frequency == 533 && page_size == 2) {
1674 if (sysinfo->memory_frequency == 667) {
1678 temp_drt |= (reg32 << 30);
1680 MCHBAR32(C0DRT1) = temp_drt;
1681 MCHBAR32(C1DRT1) = temp_drt;
1684 reg32 = MCHBAR32(C0DRT2);
1686 MCHBAR32(C0DRT2) = reg32;
1688 reg32 = MCHBAR32(C1DRT2);
1690 MCHBAR32(C1DRT2) = reg32;
1692 /* Calculate DRT3 */
1693 temp_drt = MCHBAR32(C0DRT3) & ~0x07ffffff;
1695 /* Get old tRFC value */
1696 reg32 = MCHBAR32(C0DRT1) >> 10;
1700 switch (sysinfo->memory_frequency) {
1702 reg32 = ((78800 / 500) - reg32) & 0x1ff;
1703 reg32 |= (0x8c << 16) | (0x0c << 10); /* 1 us */
1705 case 533: /* 3.75nS */
1706 reg32 = ((78800 / 375) - reg32) & 0x1ff;
1707 reg32 |= (0xba << 16) | (0x10 << 10); /* 1 us */
1710 reg32 = ((78800 / 300) - reg32) & 0x1ff;
1711 reg32 |= (0xe9 << 16) | (0x14 << 10); /* 1 us */
1717 MCHBAR32(C0DRT3) = temp_drt;
1718 MCHBAR32(C1DRT3) = temp_drt;
1721 static void sdram_set_channel_mode(struct sys_info *sysinfo)
1725 printk_debug("Setting mode of operation for memory channels...");
1727 if (sdram_capabilities_interleave() &&
1728 ( ( sysinfo->banksize[0] + sysinfo->banksize[1] +
1729 sysinfo->banksize[2] + sysinfo->banksize[3] ) ==
1730 ( sysinfo->banksize[4] + sysinfo->banksize[5] +
1731 sysinfo->banksize[6] + sysinfo->banksize[7] ) ) ) {
1732 /* Both channels equipped with DIMMs of the same size */
1733 sysinfo->interleaved = 1;
1735 sysinfo->interleaved = 0;
1738 reg32 = MCHBAR32(DCC);
1741 if(sysinfo->interleaved) {
1742 /* Dual Channel Interleaved */
1743 printk_debug("Dual Channel Interleaved.\n");
1745 } else if (sysinfo->dimm[0] == SYSINFO_DIMM_NOT_POPULATED &&
1746 sysinfo->dimm[1] == SYSINFO_DIMM_NOT_POPULATED) {
1747 /* Channel 1 only */
1748 printk_debug("Single Channel 1 only.\n");
1750 } else if (sdram_capabilities_dual_channel() && sysinfo->dimm[2] !=
1751 SYSINFO_DIMM_NOT_POPULATED) {
1752 /* Dual Channel Assymetric */
1753 printk_debug("Dual Channel Assymetric.\n");
1756 /* All bits 0 means Single Channel 0 operation */
1757 printk_debug("Single Channel 0 only.\n");
1762 MCHBAR32(DCC) = reg32;
1764 PRINTK_DEBUG("DCC=0x%08x\n", MCHBAR32(DCC));
1767 static void sdram_program_pll_settings(struct sys_info *sysinfo)
1771 MCHBAR32(PLLMON) = 0x80800000;
1773 switch (MCHBAR32(CLKCFG) & 0x7) {
1774 case 0: sysinfo->fsb_frequency = 400; break; /* FSB400 */
1775 case 1: sysinfo->fsb_frequency = 533; break; /* FSB533 */
1776 case 3: sysinfo->fsb_frequency = 667; break; /* FSB667 */
1777 default: die("Unsupported FSB speed");
1780 /* Program CPCTL according to FSB speed */
1781 /* Only write the lower byte */
1782 switch (sysinfo->fsb_frequency) {
1783 case 400: MCHBAR8(CPCTL) = 0x90; break; /* FSB400 */
1784 case 533: MCHBAR8(CPCTL) = 0x95; break; /* FSB533 */
1785 case 667: MCHBAR8(CPCTL) = 0x8d; break; /* FSB667 */
1788 MCHBAR16(CPCTL) &= ~(1 << 11);
1790 reg16 = MCHBAR16(CPCTL); /* Read back register to activate settings */
1793 static void sdram_program_graphics_frequency(struct sys_info *sysinfo)
1797 u8 freq, second_vco, voltage;
1799 #define CRCLK_166MHz 0x00
1800 #define CRCLK_200MHz 0x01
1801 #define CRCLK_250MHz 0x03
1802 #define CRCLK_400MHz 0x05
1804 #define CDCLK_200MHz 0x00
1805 #define CDCLK_320MHz 0x40
1807 #define VOLTAGE_1_05 0x00
1808 #define VOLTAGE_1_50 0x01
1810 printk_debug ("Setting Graphics Frequency... \n");
1812 printk_debug("FSB: %d MHz ", sysinfo->fsb_frequency);
1814 voltage = VOLTAGE_1_05;
1815 if (MCHBAR32(DFT_STRAP1) & (1 << 20))
1816 voltage = VOLTAGE_1_50;
1817 printk_debug("Voltage: %s ", (voltage==VOLTAGE_1_05)?"1.05V":"1.5V");
1819 /* Gate graphics hardware for frequency change */
1820 reg8 = pci_read_config16(PCI_DEV(0,2,0), GCFC + 1);
1821 reg8 = (1<<3) | (1<<1); /* disable crclk, gate cdclk */
1822 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
1824 /* Get graphics frequency capabilities */
1825 reg8 = sdram_capabilities_core_frequencies();
1827 freq = CRCLK_250MHz;
1829 case GFX_FREQUENCY_CAP_ALL:
1830 if (voltage == VOLTAGE_1_05)
1831 freq = CRCLK_250MHz;
1833 freq = CRCLK_400MHz;
1835 case GFX_FREQUENCY_CAP_250MHZ: freq = CRCLK_250MHz; break;
1836 case GFX_FREQUENCY_CAP_200MHZ: freq = CRCLK_200MHz; break;
1837 case GFX_FREQUENCY_CAP_166MHZ: freq = CRCLK_166MHz; break;
1840 if (freq != CRCLK_400MHz) {
1841 /* What chipset are we? Force 166MHz for GMS */
1842 reg8 = (pci_read_config8(PCI_DEV(0, 0x00,0), 0xe7) & 0x70) >> 4;
1844 freq = CRCLK_166MHz;
1847 printk_debug("Render: ");
1849 case CRCLK_166MHz: printk_debug("166Mhz"); break;
1850 case CRCLK_200MHz: printk_debug("200Mhz"); break;
1851 case CRCLK_250MHz: printk_debug("250Mhz"); break;
1852 case CRCLK_400MHz: printk_debug("400Mhz"); break;
1855 if (i945_silicon_revision() == 0) {
1856 sysinfo->mvco4x = 1;
1858 sysinfo->mvco4x = 0;
1863 if (voltage == VOLTAGE_1_50) {
1865 } else if ((i945_silicon_revision() > 0) && (freq == CRCLK_250MHz)) {
1866 u16 mem = sysinfo->memory_frequency;
1867 u16 fsb = sysinfo->fsb_frequency;
1869 if ( (fsb == 667 && mem == 533) ||
1870 (fsb == 533 && mem == 533) ||
1871 (fsb == 533 && mem == 400)) {
1875 if (fsb == 667 && mem == 533)
1876 sysinfo->mvco4x = 1;
1880 sysinfo->clkcfg_bit7=1;
1882 sysinfo->clkcfg_bit7=0;
1885 /* Graphics Core Render Clock */
1886 reg16 = pci_read_config16(PCI_DEV(0,2,0), GCFC);
1887 reg16 &= ~( (7 << 0) | (1 << 13) );
1889 pci_write_config16(PCI_DEV(0,2,0), GCFC, reg16);
1891 /* Graphics Core Display Clock */
1892 reg8 = pci_read_config8(PCI_DEV(0,2,0), GCFC);
1893 reg8 &= ~( (1<<7) | (7<<4) );
1895 if (voltage == VOLTAGE_1_05) {
1896 reg8 |= CDCLK_200MHz;
1897 printk_debug(" Display: 200MHz\n");
1899 reg8 |= CDCLK_320MHz;
1900 printk_debug(" Display: 320MHz\n");
1902 pci_write_config8(PCI_DEV(0,2,0), GCFC, reg8);
1904 reg8 = pci_read_config8(PCI_DEV(0,2,0), GCFC + 1);
1906 reg8 |= (1<<3) | (1<<1);
1907 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
1910 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
1912 /* Ungate core render and display clocks */
1914 pci_write_config8(PCI_DEV(0,2,0), GCFC + 1, reg8);
1917 static void sdram_program_memory_frequency(struct sys_info *sysinfo)
1922 printk_debug ("Setting Memory Frequency... ");
1924 clkcfg = MCHBAR32(CLKCFG);
1926 printk_debug("CLKCFG=0x%08x, ", clkcfg);
1928 clkcfg &= ~( (1 << 12) | (1 << 7) | ( 7 << 4) );
1930 if (sysinfo->mvco4x) {
1931 printk_debug("MVCO 4x, ");
1932 clkcfg &= ~(1 << 12);
1935 if (sysinfo->clkcfg_bit7) {
1936 printk_debug("second VCO, ");
1941 switch (sysinfo->memory_frequency) {
1942 case 400: clkcfg |= (2 << 4); break;
1943 case 533: clkcfg |= (3 << 4); break;
1944 case 667: clkcfg |= (4 << 4); break;
1945 default: die("Target Memory Frequency Error");
1948 if (MCHBAR32(CLKCFG) == clkcfg) {
1949 printk_debug ("ok (unchanged)\n");
1953 MCHBAR32(CLKCFG) = clkcfg;
1955 /* Make sure the following code is in the
1956 * cache before we execute it.
1960 reg8 = pci_read_config8(PCI_DEV(0,0x1f,0), 0xa2);
1962 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
1964 clkcfg &= ~(1 << 10);
1965 MCHBAR32(CLKCFG) = clkcfg;
1966 clkcfg |= (1 << 10);
1967 MCHBAR32(CLKCFG) = clkcfg;
1969 __asm__ __volatile__ (
1970 " movl $0x100, %%ecx\n"
1976 " loop delay_update\n"
1982 clkcfg &= ~(1 << 10);
1983 MCHBAR32(CLKCFG) = clkcfg;
1990 printk_debug("CLKCFG=0x%08x, ", MCHBAR32(CLKCFG));
1991 printk_debug ("ok\n");
1994 static void sdram_program_clock_crossing(void)
2000 * We add the indices according to our clocks from CLKCFG.
2003 static const u32 data_clock_crossing[] = {
2004 0x00100401, 0x00000000, /* DDR400 FSB400 */
2006 0x08040120, 0x00000000, /* DDR400 FSB533 */
2007 0x00100401, 0x00000000, /* DDR533 FSB533 */
2009 0x04020120, 0x00000010, /* DDR400 FSB667 */
2010 0x10040280, 0x00000040, /* DDR533 FSB667 */
2011 0x00100401, 0x00000000 /* DDR667 FSB667 */
2014 static const u32 command_clock_crossing[] = {
2015 0x04020208, 0x00000000, /* DDR400 FSB400 */
2017 0x00060108, 0x00000000, /* DDR400 FSB533 */
2018 0x04020108, 0x00000000, /* DDR533 FSB533 */
2020 0x00040318, 0x00000000, /* DDR400 FSB667 */
2021 0x04020118, 0x00000000, /* DDR533 FSB667 */
2022 0x02010804, 0x00000000 /* DDR667 FSB667 */
2025 printk_debug("Programming Clock Crossing...");
2026 reg32 = MCHBAR32(CLKCFG);
2028 printk_debug("MEM=");
2029 switch ((reg32 >> 4) & 7) {
2030 case 2: printk_debug("400"); idx += 0; break;
2031 case 3: printk_debug("533"); idx += 2; break;
2032 case 4: printk_debug("667"); idx += 4; break;
2033 default: printk_debug("RSVD\n"); return;
2036 printk_debug(" FSB=");
2037 switch (reg32 & 7) {
2038 case 0: printk_debug("400\n"); idx += 0; break;
2039 case 1: printk_debug("533"); idx += 2; break;
2040 case 3: printk_debug("667"); idx += 6; break;
2041 default: printk_debug("RSVD\n"); return;
2044 MCHBAR32(CCCFT + 0) = command_clock_crossing[idx];
2045 MCHBAR32(CCCFT + 4) = command_clock_crossing[idx + 1];
2047 MCHBAR32(C0DCCFT + 0) = data_clock_crossing[idx];
2048 MCHBAR32(C0DCCFT + 4) = data_clock_crossing[idx + 1];
2049 MCHBAR32(C1DCCFT + 0) = data_clock_crossing[idx];
2050 MCHBAR32(C1DCCFT + 4) = data_clock_crossing[idx + 1];
2052 printk_debug("... ok\n");
2055 static void sdram_disable_fast_dispatch(void)
2059 reg32 = MCHBAR32(FSBPMC3);
2061 MCHBAR32(FSBPMC3) = reg32;
2063 reg32 = MCHBAR32(SBTEST);
2065 MCHBAR32(SBTEST) = reg32;
2068 static void sdram_pre_jedec_initialization(void)
2072 reg32 = MCHBAR32(WCC);
2073 reg32 &= 0x113ff3ff;
2074 reg32 |= (4 << 29) | (3 << 25) | (1 << 10);
2075 MCHBAR32(WCC) = reg32;
2077 MCHBAR32(SMVREFC) |= (1 << 6);
2079 MCHBAR32(MMARB0) &= ~(3 << 17);
2080 MCHBAR32(MMARB0) |= (1 << 21) | (1 << 16);
2082 MCHBAR32(MMARB1) &= ~(7 << 8);
2083 MCHBAR32(MMARB1) |= (3 << 8);
2085 /* Adaptive Idle Timer Control */
2086 MCHBAR32(C0AIT) = 0x000006c4;
2087 MCHBAR32(C0AIT+4) = 0x871a066d;
2089 MCHBAR32(C1AIT) = 0x000006c4;
2090 MCHBAR32(C1AIT+4) = 0x871a066d;
2093 #define EA_DUALCHANNEL_XOR_BANK_RANK_MODE (0xd4 << 24)
2094 #define EA_DUALCHANNEL_XOR_BANK_MODE (0xf4 << 24)
2095 #define EA_DUALCHANNEL_BANK_RANK_MODE (0xc2 << 24)
2096 #define EA_DUALCHANNEL_BANK_MODE (0xe2 << 24)
2097 #define EA_SINGLECHANNEL_XOR_BANK_RANK_MODE (0x91 << 24)
2098 #define EA_SINGLECHANNEL_XOR_BANK_MODE (0xb1 << 24)
2099 #define EA_SINGLECHANNEL_BANK_RANK_MODE (0x80 << 24)
2100 #define EA_SINGLECHANNEL_BANK_MODE (0xa0 << 24)
2102 static void sdram_enhanced_addressing_mode(struct sys_info *sysinfo)
2104 u32 chan0 = 0, chan1 = 0;
2105 int chan0_dualsided, chan1_dualsided, chan0_populated, chan1_populated;
2107 chan0_populated = (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
2108 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED);
2109 chan1_populated = (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED ||
2110 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED);
2111 chan0_dualsided = (sysinfo->banksize[1] || sysinfo->banksize[3]);
2112 chan1_dualsided = (sysinfo->banksize[5] || sysinfo->banksize[7]);
2114 if (sdram_capabilities_enhanced_addressing_xor()) {
2115 if (!sysinfo->interleaved) {
2116 /* Single Channel & Dual Channel Assymetric */
2117 if (chan0_populated) {
2118 if (chan0_dualsided) {
2119 chan0 = EA_SINGLECHANNEL_XOR_BANK_RANK_MODE;
2121 chan0 = EA_SINGLECHANNEL_XOR_BANK_MODE;
2124 if (chan1_populated) {
2125 if (chan1_dualsided) {
2126 chan1 = EA_SINGLECHANNEL_XOR_BANK_RANK_MODE;
2128 chan1 = EA_SINGLECHANNEL_XOR_BANK_MODE;
2132 /* Interleaved has always both channels populated */
2133 if (chan0_dualsided) {
2134 chan0 = EA_DUALCHANNEL_XOR_BANK_RANK_MODE;
2136 chan0 = EA_DUALCHANNEL_XOR_BANK_MODE;
2139 if (chan1_dualsided) {
2140 chan1 = EA_DUALCHANNEL_XOR_BANK_RANK_MODE;
2142 chan1 = EA_DUALCHANNEL_XOR_BANK_MODE;
2146 if (!sysinfo->interleaved) {
2147 /* Single Channel & Dual Channel Assymetric */
2148 if (chan0_populated) {
2149 if (chan0_dualsided) {
2150 chan0 = EA_SINGLECHANNEL_BANK_RANK_MODE;
2152 chan0 = EA_SINGLECHANNEL_BANK_MODE;
2155 if (chan1_populated) {
2156 if (chan1_dualsided) {
2157 chan1 = EA_SINGLECHANNEL_BANK_RANK_MODE;
2159 chan1 = EA_SINGLECHANNEL_BANK_MODE;
2163 /* Interleaved has always both channels populated */
2164 if (chan0_dualsided) {
2165 chan0 = EA_DUALCHANNEL_BANK_RANK_MODE;
2167 chan0 = EA_DUALCHANNEL_BANK_MODE;
2170 if (chan1_dualsided) {
2171 chan1 = EA_DUALCHANNEL_BANK_RANK_MODE;
2173 chan1 = EA_DUALCHANNEL_BANK_MODE;
2178 MCHBAR32(C0DRC1) &= 0x00ffffff;
2179 MCHBAR32(C0DRC1) |= chan0;
2180 MCHBAR32(C1DRC1) &= 0x00ffffff;
2181 MCHBAR32(C1DRC1) |= chan1;
2184 static void sdram_post_jedec_initialization(struct sys_info *sysinfo)
2188 /* Enable Channel XORing for Dual Channel Interleave */
2189 if (sysinfo->interleaved) {
2191 reg32 = MCHBAR32(DCC);
2192 #if CHANNEL_XOR_RANDOMIZATION
2193 reg32 &= ~(1 << 10);
2198 MCHBAR32(DCC) = reg32;
2201 /* DRAM mode optimizations */
2202 sdram_enhanced_addressing_mode(sysinfo);
2204 reg32 = MCHBAR32(FSBPMC3);
2206 MCHBAR32(FSBPMC3) = reg32;
2208 reg32 = MCHBAR32(SBTEST);
2210 MCHBAR32(SBTEST) = reg32;
2212 reg32 = MCHBAR32(SBOCC);
2213 reg32 &= 0xffbdb6ff;
2214 reg32 |= (0xbdb6 << 8) | (1 << 0);
2215 MCHBAR32(SBOCC) = reg32;
2218 static void sdram_power_management(struct sys_info *sysinfo)
2223 int integrated_graphics = 1;
2226 reg32 = MCHBAR32(C0DRT2);
2227 reg32 &= 0xffffff00;
2228 /* Idle timer = 8 clocks, CKE idle timer = 16 clocks */
2229 reg32 |= (1 << 5) | (1 << 4);
2230 MCHBAR32(C0DRT2) = reg32;
2232 reg32 = MCHBAR32(C1DRT2);
2233 reg32 &= 0xffffff00;
2234 /* Idle timer = 8 clocks, CKE idle timer = 16 clocks */
2235 reg32 |= (1 << 5) | (1 << 4);
2236 MCHBAR32(C1DRT2) = reg32;
2238 reg32 = MCHBAR32(C0DRC1);
2240 reg32 |= (1 << 12) | (1 << 11);
2241 MCHBAR32(C0DRC1) = reg32;
2243 reg32 = MCHBAR32(C1DRC1);
2245 reg32 |= (1 << 12) | (1 << 11);
2246 MCHBAR32(C1DRC1) = reg32;
2248 if (i945_silicon_revision()>1) {
2249 /* FIXME bits 5 and 0 only if PCIe graphics is disabled */
2250 u16 peg_bits = (1 << 5) | (1 << 0);
2252 MCHBAR16(UPMC1) = 0x1010 | peg_bits;
2254 /* FIXME bits 5 and 0 only if PCIe graphics is disabled */
2255 u16 peg_bits = (1 << 5) | (1 << 0);
2258 MCHBAR16(UPMC1) = 0x0010 | peg_bits;
2261 reg16 = MCHBAR16(UPMC2);
2264 MCHBAR16(UPMC2) = reg16;
2266 MCHBAR32(UPMC3) = 0x000f06ff;
2268 for (i=0; i<5; i++) {
2269 MCHBAR32(UPMC3) &= ~(1 << 16);
2270 MCHBAR32(UPMC3) |= (1 << 16);
2273 MCHBAR32(GIPMC1) = 0x8000000c;
2275 reg16 = MCHBAR16(CPCTL);
2276 reg16 &= ~(7 << 11);
2277 if (i945_silicon_revision()>2) {
2282 MCHBAR16(CPCTL) = reg16;
2285 if ((MCHBAR32(ECO) & (1 << 16)) != 0) {
2287 if (i945_silicon_revision() != 0) {
2289 switch (sysinfo->fsb_frequency) {
2290 case 667: MCHBAR32(HGIPMC2) = 0x0d590d59; break;
2291 case 533: MCHBAR32(HGIPMC2) = 0x155b155b; break;
2294 switch (sysinfo->fsb_frequency) {
2295 case 667: MCHBAR32(HGIPMC2) = 0x09c409c4; break;
2296 case 533: MCHBAR32(HGIPMC2) = 0x0fa00fa0; break;
2300 MCHBAR32(FSBPMC1) = 0x8000000c;
2302 reg32 = MCHBAR32(C2C3TT);
2303 reg32 &= 0xffff0000;
2304 switch (sysinfo->fsb_frequency) {
2305 case 667: reg32 |= 0x0600; break;
2306 case 533: reg32 |= 0x0480; break;
2308 MCHBAR32(C2C3TT) = reg32;
2310 reg32 = MCHBAR32(C3C4TT);
2311 reg32 &= 0xffff0000;
2312 switch (sysinfo->fsb_frequency) {
2313 case 667: reg32 |= 0x0b80; break;
2314 case 533: reg32 |= 0x0980; break;
2316 MCHBAR32(C3C4TT) = reg32;
2318 if (i945_silicon_revision() == 0) {
2319 MCHBAR32(ECO) &= ~(1 << 16);
2321 MCHBAR32(ECO) |= (1 << 16);
2326 if (i945_silicon_revision() == 0) {
2327 MCHBAR32(FSBPMC3) &= ~(1 << 29);
2329 MCHBAR32(FSBPMC3) |= (1 << 29);
2332 MCHBAR32(FSBPMC3) &= ~(1 << 29);
2334 MCHBAR32(FSBPMC3) |= (1 << 21);
2336 MCHBAR32(FSBPMC3) &= ~(1 << 19);
2338 MCHBAR32(FSBPMC3) &= ~(1 << 13);
2340 reg32 = MCHBAR32(FSBPMC4);
2341 reg32 &= ~(3 << 24);
2342 reg32 |= ( 2 << 24);
2343 MCHBAR32(FSBPMC4) = reg32;
2345 MCHBAR32(FSBPMC4) |= (1 << 21);
2347 MCHBAR32(FSBPMC4) |= (1 << 5);
2349 if ((i945_silicon_revision() < 2) /* || cpuid() = 0x6e8 */ ) {
2350 /* stepping 0 and 1 or CPUID 6e8 */
2351 MCHBAR32(FSBPMC4) &= ~(1 << 4);
2353 MCHBAR32(FSBPMC4) |= (1 << 4);
2356 reg8 = pci_read_config8(PCI_DEV(0,0x0,0), 0xfc);
2358 pci_write_config8(PCI_DEV(0, 0x0, 0), 0xfc, reg8);
2360 reg8 = pci_read_config8(PCI_DEV(0,0x2,0), 0xc1);
2362 pci_write_config8(PCI_DEV(0, 0x2, 0), 0xc1, reg8);
2364 #if C2_SELF_REFRESH_DISABLE
2366 if (integrated_graphics) {
2367 printk_debug("C2 self-refresh with IGD\n");
2368 MCHBAR16(MIPMC4) = 0x0468;
2369 MCHBAR16(MIPMC5) = 0x046c;
2370 MCHBAR16(MIPMC6) = 0x046c;
2372 MCHBAR16(MIPMC4) = 0x6468;
2373 MCHBAR16(MIPMC5) = 0x646c;
2374 MCHBAR16(MIPMC6) = 0x646c;
2377 if (integrated_graphics) {
2378 MCHBAR16(MIPMC4) = 0x04f8;
2379 MCHBAR16(MIPMC5) = 0x04fc;
2380 MCHBAR16(MIPMC6) = 0x04fc;
2382 MCHBAR16(MIPMC4) = 0x64f8;
2383 MCHBAR16(MIPMC5) = 0x64fc;
2384 MCHBAR16(MIPMC6) = 0x64fc;
2389 reg32 = MCHBAR32(PMCFG);
2390 reg32 &= ~(3 << 17);
2392 MCHBAR32(PMCFG) = reg32;
2394 MCHBAR32(PMCFG) |= (1 << 4);
2396 reg32 = MCHBAR32(0xc30);
2397 reg32 &= 0xffffff00;
2399 MCHBAR32(0xc30) = reg32;
2401 MCHBAR32(0xb18) &= ~(1 << 21);
2404 static void sdram_thermal_management(void)
2407 MCHBAR8(TCO1) = 0x00;
2408 MCHBAR8(TCO0) = 0x00;
2410 /* The Thermal Sensors for DIMMs at 0x50, 0x52 are at I2C addr
2416 static void sdram_save_receive_enable(void)
2422 /* The following values are stored to an unused CMOS
2423 * area and restored instead of recalculated in case
2426 * C0WL0REOST [7:0] -> 8 bit
2427 * C1WL0REOST [7:0] -> 8 bit
2428 * RCVENMT [11:8] [3:0] -> 8 bit
2429 * C0DRT1 [27:24] -> 4 bit
2430 * C1DRT1 [27:24] -> 4 bit
2433 values[0] = MCHBAR8(C0WL0REOST);
2434 values[1] = MCHBAR8(C1WL0REOST);
2436 reg32 = MCHBAR32(RCVENMT);
2437 values[2] = (u8)((reg32 >> (8 - 4)) & 0xf0) | (reg32 & 0x0f);
2439 reg32 = MCHBAR32(C0DRT1);
2440 values[3] = (reg32 >> 24) & 0x0f;
2441 reg32 = MCHBAR32(C1DRT1);
2442 values[3] |= (reg32 >> (24 - 4)) & 0xf0;
2444 /* coreboot only uses bytes 0 - 127 for its CMOS values so far
2445 * so we grad bytes 128 - 131 to save the receive enable values
2449 cmos_write(values[i], 128 + i);
2452 static void sdram_recover_receive_enable(void)
2459 values[i] = cmos_read(128 + i);
2461 MCHBAR8(C0WL0REOST) = values[0];
2462 MCHBAR8(C1WL0REOST) = values[1];
2464 reg32 = MCHBAR32(RCVENMT);
2465 reg32 &= ~((0x0f << 8) | (0x0f << 0));
2466 reg32 |= ((u32)(values[2] & 0xf0) << (8 - 4)) | (values[2] & 0x0f);
2467 MCHBAR32(RCVENMT) = reg32;
2469 reg32 = MCHBAR32(C0DRT1) & ~(0x0f << 24);
2470 reg32 |= (u32)(values[3] & 0x0f) << 24;
2471 MCHBAR32(C0DRT1) = reg32;
2473 reg32 = MCHBAR32(C1DRT1) & ~(0x0f << 24);
2474 reg32 |= (u32)(values[3] & 0xf0) << (24 - 4);
2475 MCHBAR32(C1DRT1) = reg32;
2480 static void sdram_program_receive_enable(struct sys_info *sysinfo)
2482 MCHBAR32(REPC) |= (1 << 0);
2484 /* enable upper CMOS */
2485 RCBA32(0x3400) = (1 << 2);
2487 /* Program Receive Enable Timings */
2488 if (sysinfo->boot_path == BOOT_PATH_RESUME) {
2489 sdram_recover_receive_enable();
2491 receive_enable_adjust(sysinfo);
2492 sdram_save_receive_enable();
2495 MCHBAR32(C0DRC1) |= (1 << 6);
2496 MCHBAR32(C1DRC1) |= (1 << 6);
2497 MCHBAR32(C0DRC1) &= ~(1 << 6);
2498 MCHBAR32(C1DRC1) &= ~(1 << 6);
2500 MCHBAR32(MIPMC3) |= (0x0f << 0);
2504 * @brief Enable On-Die Termination for DDR2.
2508 static void sdram_on_die_termination(struct sys_info *sysinfo)
2510 static const u32 odt[] = {
2511 0x00024911, 0xe0010000,
2512 0x00049211, 0xe0020000,
2513 0x0006db11, 0xe0030000,
2519 reg32 = MCHBAR32(ODTC);
2520 reg32 &= ~(3 << 16);
2521 reg32 |= (1 << 14) | (1 << 6) | (2 << 16);
2522 MCHBAR32(ODTC) = reg32;
2524 if ( !(sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED &&
2525 sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED) ) {
2526 printk_debug("one dimm per channel config.. \n");
2528 reg32 = MCHBAR32(C0ODT);
2529 reg32 &= ~(7 << 28);
2530 MCHBAR32(C0ODT) = reg32;
2531 reg32 = MCHBAR32(C1ODT);
2532 reg32 &= ~(7 << 28);
2533 MCHBAR32(C1ODT) = reg32;
2538 reg32 = MCHBAR32(C0ODT) & 0xfff00000;
2539 reg32 |= odt[(cas-3) * 2];
2540 MCHBAR32(C0ODT) = reg32;
2542 reg32 = MCHBAR32(C1ODT) & 0xfff00000;
2543 reg32 |= odt[(cas-3) * 2];
2544 MCHBAR32(C1ODT) = reg32;
2546 reg32 = MCHBAR32(C0ODT + 4) & 0x1fc8ffff;
2547 reg32 |= odt[((cas-3) * 2) + 1];
2548 MCHBAR32(C0ODT + 4) = reg32;
2550 reg32 = MCHBAR32(C1ODT + 4) & 0x1fc8ffff;
2551 reg32 |= odt[((cas-3) * 2) + 1];
2552 MCHBAR32(C1ODT + 4) = reg32;
2556 * @brief Enable clocks to populated sockets
2559 static void sdram_enable_memory_clocks(struct sys_info *sysinfo)
2561 u8 clocks[2] = { 0, 0 };
2563 if (sysinfo->dimm[0] != SYSINFO_DIMM_NOT_POPULATED)
2564 clocks[0] |= (1 << 0) | (1 << 1);
2566 if (sysinfo->dimm[1] != SYSINFO_DIMM_NOT_POPULATED)
2567 clocks[0] |= (1 << 2) | (1 << 3);
2569 if (sysinfo->dimm[2] != SYSINFO_DIMM_NOT_POPULATED)
2570 clocks[1] |= (1 << 0) | (1 << 1);
2572 if (sysinfo->dimm[3] != SYSINFO_DIMM_NOT_POPULATED)
2573 clocks[1] |= (1 << 2) | (1 << 3);
2575 #ifdef OVERRIDE_CLOCK_DISABLE
2576 /* Usually system firmware turns off system memory clock signals
2577 * to unused SO-DIMM slots to reduce EMI and power consumption.
2578 * However, the Kontron 986LCD-M does not like unused clock
2579 * signals to be disabled.
2580 * If other similar mainboard occur, it would make sense to make
2581 * this an entry in the sysinfo structure, and pre-initialize that
2582 * structure in the mainboard's auto.c main() function.
2583 * For now an #ifdef will do.
2586 clocks[0] = 0xf; /* force all clock gate pairs to enable */
2587 clocks[1] = 0xf; /* force all clock gate pairs to enable */
2590 MCHBAR8(C0DCLKDIS) = clocks[0];
2591 MCHBAR8(C1DCLKDIS) = clocks[1];
2594 #define RTT_ODT_NONE 0
2595 #define RTT_ODT_50_OHM ( (1 << 9) | (1 << 5) )
2596 #define RTT_ODT_75_OHM (1 << 5)
2597 #define RTT_ODT_150_OHM (1 << 9)
2599 #define EMRS_OCD_DEFAULT ( (1 << 12) | (1 << 11) | (1 << 10) )
2601 #define MRS_CAS_3 (3 << 7)
2602 #define MRS_CAS_4 (4 << 7)
2603 #define MRS_CAS_5 (5 << 7)
2605 #define MRS_TWR_3 (2 << 12)
2606 #define MRS_TWR_4 (3 << 12)
2607 #define MRS_TWR_5 (4 << 12)
2609 #define MRS_BT (1 << 6)
2611 #define MRS_BL4 (2 << 3)
2612 #define MRS_BL8 (3 << 3)
2614 static void sdram_jedec_enable(struct sys_info *sysinfo)
2617 u32 bankaddr = 0, tmpaddr, mrsaddr = 0;
2619 for (i = 0, nonzero = -1; i < 8; i++) {
2620 if (sysinfo->banksize[i] == 0) {
2624 printk_debug("jedec enable sequence: bank %d\n", i);
2627 /* Start at address 0 */
2631 if (sysinfo->interleaved) {
2636 if (nonzero != -1) {
2637 printk_debug("bankaddr from bank size of rank %d\n", nonzero);
2638 bankaddr += sysinfo->banksize[nonzero] <<
2639 (sysinfo->interleaved ? 26 : 25);
2642 /* No populated bank hit before. Start at address 0 */
2646 /* We have a bank with a non-zero size.. Remember it
2647 * for the next offset we have to calculate
2651 /* Get CAS latency set up */
2652 switch (sysinfo->cas) {
2653 case 5: mrsaddr = MRS_CAS_5; break;
2654 case 4: mrsaddr = MRS_CAS_4; break;
2655 case 3: mrsaddr = MRS_CAS_3; break;
2656 default: die("Jedec Error (CAS).\n");
2660 switch (sysinfo->twr) {
2661 case 5: mrsaddr |= MRS_TWR_5; break;
2662 case 4: mrsaddr |= MRS_TWR_4; break;
2663 case 3: mrsaddr |= MRS_TWR_3; break;
2664 default: die("Jedec Error (tWR).\n");
2667 /* Set "Burst Type" */
2671 if (sysinfo->interleaved) {
2672 mrsaddr = mrsaddr << 1;
2675 /* Only burst length 8 supported */
2679 PRINTK_DEBUG("Apply NOP\n");
2680 do_ram_command(RAM_COMMAND_NOP);
2681 ram_read32(bankaddr);
2683 /* Precharge all banks */
2684 PRINTK_DEBUG("All Banks Precharge\n");
2685 do_ram_command(RAM_COMMAND_PRECHARGE);
2686 ram_read32(bankaddr);
2688 /* Extended Mode Register Set (2) */
2689 PRINTK_DEBUG("Extended Mode Register Set(2)\n");
2690 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_2);
2691 ram_read32(bankaddr);
2693 /* Extended Mode Register Set (3) */
2694 PRINTK_DEBUG("Extended Mode Register Set(3)\n");
2695 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_3);
2696 ram_read32(bankaddr);
2698 /* Extended Mode Register Set */
2699 PRINTK_DEBUG("Extended Mode Register Set\n");
2700 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_1);
2702 if (!sdram_capabilities_dual_channel()) {
2703 tmpaddr |= RTT_ODT_75_OHM;
2704 } else if (sysinfo->interleaved) {
2705 tmpaddr |= (RTT_ODT_150_OHM << 1);
2707 tmpaddr |= RTT_ODT_150_OHM;
2709 ram_read32(tmpaddr);
2711 /* Mode Register Set: Reset DLLs */
2712 PRINTK_DEBUG("MRS: Reset DLLs\n");
2713 do_ram_command(RAM_COMMAND_MRS);
2716 /* Set DLL reset bit */
2717 if (sysinfo->interleaved)
2718 tmpaddr |= (1 << 12);
2720 tmpaddr |= (1 << 11);
2721 ram_read32(tmpaddr);
2723 /* Precharge all banks */
2724 PRINTK_DEBUG("All Banks Precharge\n");
2725 do_ram_command(RAM_COMMAND_PRECHARGE);
2726 ram_read32(bankaddr);
2728 /* CAS before RAS Refresh */
2729 PRINTK_DEBUG("CAS before RAS\n");
2730 do_ram_command(RAM_COMMAND_CBR);
2732 /* CBR wants two READs */
2733 ram_read32(bankaddr);
2734 ram_read32(bankaddr);
2736 /* Mode Register Set: Enable DLLs */
2737 PRINTK_DEBUG("MRS: Enable DLLs\n");
2738 do_ram_command(RAM_COMMAND_MRS);
2742 ram_read32(tmpaddr);
2744 /* Extended Mode Register Set */
2745 PRINTK_DEBUG("Extended Mode Register Set: ODT/OCD\n");
2746 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_1);
2749 if (!sdram_capabilities_dual_channel()) {
2751 tmpaddr |= RTT_ODT_75_OHM | EMRS_OCD_DEFAULT;
2752 } else if (sysinfo->interleaved) {
2753 tmpaddr |= ((RTT_ODT_150_OHM | EMRS_OCD_DEFAULT) << 1);
2755 tmpaddr |= RTT_ODT_150_OHM | EMRS_OCD_DEFAULT;
2757 ram_read32(tmpaddr);
2759 /* Extended Mode Register Set */
2760 PRINTK_DEBUG("Extended Mode Register Set: OCD Exit\n");
2761 do_ram_command(RAM_COMMAND_EMRS | RAM_EMRS_1);
2764 if (!sdram_capabilities_dual_channel()) {
2765 tmpaddr |= RTT_ODT_75_OHM;
2766 } else if (sysinfo->interleaved) {
2767 tmpaddr |= (RTT_ODT_150_OHM << 1);
2769 tmpaddr |= RTT_ODT_150_OHM;
2771 ram_read32(tmpaddr);
2775 static void sdram_init_complete(void)
2777 PRINTK_DEBUG("Normal Operation\n");
2778 do_ram_command(RAM_COMMAND_NORMAL);
2781 static void sdram_setup_processor_side(void)
2783 if (i945_silicon_revision() == 0)
2784 MCHBAR32(FSBPMC3) |= (1 << 2);
2786 MCHBAR8(0xb00) |= 1;
2788 if (i945_silicon_revision() == 0)
2789 MCHBAR32(SLPCTL) |= (1 << 8);
2793 * @param boot_path: 0 = normal, 1 = reset, 2 = resume from s3
2795 void sdram_initialize(int boot_path)
2797 struct sys_info sysinfo;
2800 sdram_detect_errors();
2802 printk_debug ("Setting up RAM controller.\n");
2804 memset(&sysinfo, 0, sizeof(sysinfo));
2806 sysinfo.boot_path = boot_path;
2808 /* Look at the type of DIMMs and verify all DIMMs are x8 or x16 width */
2809 sdram_get_dram_configuration(&sysinfo);
2811 /* Check whether we have stacked DIMMs */
2812 sdram_verify_package_type(&sysinfo);
2814 /* Determine common CAS */
2815 cas_mask = sdram_possible_cas_latencies(&sysinfo);
2817 /* Choose Common Frequency */
2818 sdram_detect_cas_latency_and_ram_speed(&sysinfo, cas_mask);
2820 /* Determine smallest common tRAS */
2821 sdram_detect_smallest_tRAS(&sysinfo);
2824 sdram_detect_smallest_tRP(&sysinfo);
2826 /* Determine tRCD */
2827 sdram_detect_smallest_tRCD(&sysinfo);
2829 /* Determine smallest refresh period */
2830 sdram_detect_smallest_refresh(&sysinfo);
2832 /* Verify all DIMMs support burst length 8 */
2833 sdram_verify_burst_length(&sysinfo);
2836 sdram_detect_smallest_tWR(&sysinfo);
2838 /* Determine DIMM size parameters (rows, columns banks) */
2839 sdram_detect_dimm_size(&sysinfo);
2841 /* determine tRFC */
2842 sdram_detect_smallest_tRFC(&sysinfo);
2844 /* Program PLL settings */
2845 sdram_program_pll_settings(&sysinfo);
2847 /* Program Graphics Frequency */
2848 sdram_program_graphics_frequency(&sysinfo);
2850 /* Program System Memory Frequency */
2851 sdram_program_memory_frequency(&sysinfo);
2853 /* Determine Mode of Operation (Interleaved etc) */
2854 sdram_set_channel_mode(&sysinfo);
2856 /* Program Clock Crossing values */
2857 sdram_program_clock_crossing();
2859 /* Disable fast dispatch */
2860 sdram_disable_fast_dispatch();
2862 /* Enable WIODLL Power Down in ACPI states */
2863 MCHBAR32(C0DMC) |= (1 << 24);
2864 MCHBAR32(C1DMC) |= (1 << 24);
2866 /* Program DRAM Row Boundary/Attribute Registers */
2868 /* program row size DRB and set TOLUD */
2869 sdram_program_row_boundaries(&sysinfo);
2871 /* program page size DRA */
2872 sdram_set_row_attributes(&sysinfo);
2874 /* Program CxBNKARC */
2875 sdram_set_bank_architecture(&sysinfo);
2877 /* Program DRAM Timing and Control registers based on SPD */
2878 sdram_set_timing_and_control(&sysinfo);
2880 /* On-Die Termination Adjustment */
2881 sdram_on_die_termination(&sysinfo);
2883 /* Pre Jedec Initialization */
2884 sdram_pre_jedec_initialization();
2886 /* Perform System Memory IO Initialization */
2887 sdram_initialize_system_memory_io(&sysinfo);
2889 /* Perform System Memory IO Buffer Enable */
2890 sdram_enable_system_memory_io(&sysinfo);
2892 /* Enable System Memory Clocks */
2893 sdram_enable_memory_clocks(&sysinfo);
2895 if (boot_path == BOOT_PATH_NORMAL) {
2896 /* Jedec Initialization sequence */
2897 sdram_jedec_enable(&sysinfo);
2900 /* Program Power Management Registers */
2901 sdram_power_management(&sysinfo);
2903 /* Post Jedec Init */
2904 sdram_post_jedec_initialization(&sysinfo);
2906 /* Program DRAM Throttling */
2907 sdram_thermal_management();
2909 /* Normal Operations */
2910 sdram_init_complete();
2912 /* Program Receive Enable Timings */
2913 sdram_program_receive_enable(&sysinfo);
2915 /* Enable Periodic RCOMP */
2916 sdram_enable_rcomp();
2918 /* Tell ICH7 that we're done */
2919 reg8 = pci_read_config8(PCI_DEV(0,0x1f,0), 0xa2);
2921 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa2, reg8);
2923 printk_debug("RAM initialization finished.\n");
2925 sdram_setup_processor_side();
2928 unsigned long get_top_of_ram(void)
2930 /* This will not work if TSEG is in place! */
2931 u32 tom = pci_read_config32(PCI_DEV(0,2,0), 0x5c);
2933 return (unsigned long) tom;