summaryrefslogtreecommitdiff
path: root/src/northbridge
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2012-04-10 19:55:19 +0300
committerStefan Reinauer <stefan.reinauer@coreboot.org>2012-04-11 23:25:09 +0200
commit5c1ff9284a7ac382a9ec702fa52f3a173279d566 (patch)
treeff8d7d75c484aedeb4337621670e4a406f799e4b /src/northbridge
parent5bd271b9fa81532f786f42604d94df92f44b605f (diff)
downloadcoreboot-5c1ff9284a7ac382a9ec702fa52f3a173279d566.tar.xz
Intel e7505: cleanups
Fix delay loop comments. Time waited and the comments did not match in the origin (e7501), so delays currently "just work". Move reset detection to main raminit and don't use generic sdram_initialize for now, as there are local debug functions I need to use. Fix AOpen respectively. Disable ecc scrub, until I have it fixed for cache-as-ram use. Change-Id: I0529297f43c565d30b5fb7d1836700278ac029c4 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/883 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/northbridge')
-rw-r--r--src/northbridge/intel/e7505/raminit.c89
-rw-r--r--src/northbridge/intel/e7505/reset_test.c18
2 files changed, 46 insertions, 61 deletions
diff --git a/src/northbridge/intel/e7505/raminit.c b/src/northbridge/intel/e7505/raminit.c
index 21ffba22b5..29eb42b133 100644
--- a/src/northbridge/intel/e7505/raminit.c
+++ b/src/northbridge/intel/e7505/raminit.c
@@ -464,27 +464,25 @@ static const uint32_t pull_updown_offset_table[] = {
Delay functions:
-----------------------------------------------------------------------------*/
+/* Estimate that SLOW_DOWN_IO takes about 1 us */
#define SLOW_DOWN_IO inb(0x80)
-//#define SLOW_DOWN_IO udelay(40);
-
- /* Estimate that SLOW_DOWN_IO takes about 50&76us */
- /* delay for 200us */
-
-#if 1
-static void do_delay(void)
+static inline void local_udelay(int i)
{
- int i;
- for (i = 0; i < 16; i++) {
+ while (i--) {
SLOW_DOWN_IO;
}
}
-#define DO_DELAY do_delay()
-#else
-#define DO_DELAY \
- udelay(200)
-#endif
+static inline void local_mdelay(int i)
+{
+ i *= 1000;
+ while (i--) {
+ SLOW_DOWN_IO;
+ }
+}
+/* delay for 200us */
+#define DO_DELAY local_udelay(200)
#define EXTRA_DELAY DO_DELAY
/*-----------------------------------------------------------------------------
@@ -913,8 +911,10 @@ static void do_ram_command(uint8_t command, uint16_t jedec_mode_bits)
// RAM_COMMAND_NORMAL is an exception.
// It affects only the memory controller and does not need to be "sent" to the DIMMs.
- if (command == RAM_COMMAND_NORMAL)
+ if (command == RAM_COMMAND_NORMAL) {
+ EXTRA_DELAY;
return;
+ }
// NOTE: for mode select commands, some of the location address bits are part of the command
// Map JEDEC mode bits to E7505
@@ -949,7 +949,7 @@ static void do_ram_command(uint8_t command, uint16_t jedec_mode_bits)
dimm_start_64M_multiple = dimm_end_64M_multiple;
}
}
-
+ EXTRA_DELAY;
}
/**
@@ -1169,6 +1169,7 @@ static void configure_e7501_ram_addresses(const struct mem_controller
* If we're configured to use ECC, initialize the SDRAM and clear the E7501's
* ECC error flags.
*/
+#ifdef __ROMCC__
static void initialize_ecc(void)
{
uint32_t dram_controller_mode;
@@ -1202,6 +1203,7 @@ static void initialize_ecc(void)
}
}
+#endif
/**
* Program the DRAM Timing register (DRT) of the E7501 (except for CAS#
@@ -1898,12 +1900,10 @@ Public interface:
* refresh and initialize ECC and memory to zero. Upon exit, SDRAM is up
* and running.
*
- * @param controllers Not used.
* @param ctrl PCI addresses of memory controller functions, and SMBus
* addresses of DIMM slots on the mainboard.
*/
-static void sdram_enable(int controllers,
- const struct mem_controller *ctrl)
+static void sdram_enable(const struct mem_controller *ctrl)
{
uint8_t dimm_mask = pci_read_config16(MCHDEV, SKPD);
uint32_t dram_controller_mode;
@@ -1921,12 +1921,10 @@ static void sdram_enable(int controllers,
/* 3. Apply NOP */
RAM_DEBUG_MESSAGE("Ram Enable 3\n");
do_ram_command(RAM_COMMAND_NOP, 0);
- EXTRA_DELAY;
/* 4 Precharge all */
RAM_DEBUG_MESSAGE("Ram Enable 4\n");
do_ram_command(RAM_COMMAND_PRECHARGE, 0);
- EXTRA_DELAY;
/* wait until the all banks idle state... */
/* 5. Issue EMRS to enable DLL */
@@ -1934,7 +1932,6 @@ static void sdram_enable(int controllers,
do_ram_command(RAM_COMMAND_EMRS,
SDRAM_EXTMODE_DLL_ENABLE |
SDRAM_EXTMODE_DRIVE_NORMAL);
- EXTRA_DELAY;
/* 6. Reset DLL */
RAM_DEBUG_MESSAGE("Ram Enable 6\n");
@@ -1949,33 +1946,17 @@ static void sdram_enable(int controllers,
/* 7 Precharge all */
RAM_DEBUG_MESSAGE("Ram Enable 7\n");
do_ram_command(RAM_COMMAND_PRECHARGE, 0);
- EXTRA_DELAY;
/* 8 Now we need 2 AUTO REFRESH / CBR cycles to be performed */
- RAM_DEBUG_MESSAGE("Ram Enable 8\n");
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
-
/* And for good luck 6 more CBRs */
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
- do_ram_command(RAM_COMMAND_CBR, 0);
- EXTRA_DELAY;
+ RAM_DEBUG_MESSAGE("Ram Enable 8\n");
+ int i;
+ for(i=0; i<8; i++)
+ do_ram_command(RAM_COMMAND_CBR, 0);
/* 9 mode register set */
RAM_DEBUG_MESSAGE("Ram Enable 9\n");
set_ram_mode(E7501_SDRAM_MODE | SDRAM_MODE_NORMAL);
- EXTRA_DELAY;
/* 10 DDR Receive FIFO RE-Sync */
RAM_DEBUG_MESSAGE("Ram Enable 10\n");
@@ -1985,7 +1966,6 @@ static void sdram_enable(int controllers,
/* 11 normal operation */
RAM_DEBUG_MESSAGE("Ram Enable 11\n");
do_ram_command(RAM_COMMAND_NORMAL, 0);
- EXTRA_DELAY;
// Reconfigure the row boundaries and Top of Low Memory
// to match the true size of the DIMMs
@@ -1996,7 +1976,11 @@ static void sdram_enable(int controllers,
dram_controller_mode |= (1 << 29);
pci_write_config32(MCHDEV, DRC, dram_controller_mode);
EXTRA_DELAY;
+
+#ifdef __ROMCC__
+ /* Problems with cache-as-ram, disable for now */
initialize_ecc();
+#endif
dram_controller_mode = pci_read_config32(MCHDEV, DRC); /* FCS_EN */
dram_controller_mode |= (1 << 17); // NOTE: undocumented reserved bit
@@ -2069,3 +2053,22 @@ static void sdram_set_registers(const struct mem_controller *ctrl)
ram_handle_d060_2();
}
+/**
+ *
+ *
+ */
+void sdram_initialize(int controllers, const struct mem_controller *memctrl)
+{
+ RAM_DEBUG_MESSAGE("Northbridge prior to SDRAM init:\n");
+ DUMPNORTH();
+
+ sdram_set_registers(memctrl);
+ sdram_set_spd_registers(memctrl);
+ sdram_enable(memctrl);
+}
+
+static int bios_reset_detected(void)
+{
+ uint32_t dword = pci_read_config32(MCHDEV, DRC);
+ return !!(dword & DRC_DONE);
+}
diff --git a/src/northbridge/intel/e7505/reset_test.c b/src/northbridge/intel/e7505/reset_test.c
deleted file mode 100644
index 1c0dad5ed9..0000000000
--- a/src/northbridge/intel/e7505/reset_test.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Convert to C by yhlu */
-#define MCH_DRC 0x7c
-#define DRC_DONE (1 << 29)
- /* If I have already booted once skip a bunch of initialization */
- /* To see if I have already booted I check to see if memory
- * has been enabled.
- */
-static int bios_reset_detected(void) {
- uint32_t dword;
-
- dword = pci_read_config32(PCI_DEV(0, 0, 0), MCH_DRC);
-
- if( (dword & DRC_DONE) != 0 ) {
- return 1;
- }
-
- return 0;
-}