From 00fd3ff507568d93cc1fb4e3c9d6742cde58fae0 Mon Sep 17 00:00:00 2001 From: Arthur Heymans Date: Mon, 17 Apr 2017 17:50:40 +0200 Subject: nb/pineview/raminit: Fix raminit failing on hot reset path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For raminit to succeed on a hot reset the following things are prevented from running: * Clearing self refresh * Setting memory frequency * programming sdram dll timings * programming rcomp TESTED on Intel d510mo. Change-Id: I8f7e5c2958df29a96cdf856ade2f4f33707ad362 Signed-off-by: Arthur Heymans Reviewed-on: https://review.coreboot.org/19337 Tested-by: build bot (Jenkins) Reviewed-by: Kyösti Mälkki Reviewed-by: Paul Menzel --- src/northbridge/intel/pineview/raminit.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'src/northbridge') diff --git a/src/northbridge/intel/pineview/raminit.c b/src/northbridge/intel/pineview/raminit.c index a45b4da081..69880580c1 100644 --- a/src/northbridge/intel/pineview/raminit.c +++ b/src/northbridge/intel/pineview/raminit.c @@ -569,6 +569,8 @@ static void sdram_detect_ram_speed(struct sysinfo *s) PRINTK_DEBUG("Drive Memory at %dMHz with CAS = %d clocks\n", ddr_reg_to_mhz(s->selected_timings.mem_clock), s->selected_timings.CAS); // Set memory frequency + if (s->boot_path == BOOT_PATH_RESET) + return; MCHBAR32(0xf14) = MCHBAR32(0xf14) | 0x1; reg32 = (MCHBAR32(0xc00) & (~0x70)) | (1 << 10); if (s->selected_timings.mem_clock == MEM_CLOCK_800MHz) { @@ -676,7 +678,8 @@ static void sdram_clkmode(struct sysinfo *s) reg8 = 1; reg16 = (1 << 8) | (1 << 5); } - MCHBAR16(0x1c0) = (MCHBAR16(0x1c0) & ~(0x033f)) | reg16; + if (s->boot_path != BOOT_PATH_RESET) + MCHBAR16(0x1c0) = (MCHBAR16(0x1c0) & ~(0x033f)) | reg16; MCHBAR32(0x220) = 0x58001117; MCHBAR32(0x248) = (MCHBAR32(0x248) | (1 << 23)); @@ -2540,12 +2543,14 @@ void sdram_initialize(int boot_path, const u8 *spd_addresses) { struct sysinfo si; u8 reg8; + const char *boot_str[] = { "Normal", "Reset", "Resume"}; PRINTK_DEBUG("Setting up RAM controller.\n"); memset(&si, 0, sizeof(si)); si.boot_path = boot_path; + printk(BIOS_DEBUG, "Boot path: %s\n", boot_str[boot_path]); si.spd_map[0] = spd_addresses[0]; si.spd_map[1] = spd_addresses[1]; si.spd_map[2] = spd_addresses[2]; @@ -2578,18 +2583,25 @@ void sdram_initialize(int boot_path, const u8 *spd_addresses) sdram_timings(&si); PRINTK_DEBUG("Done timings (dqs dll enabled)\n"); - sdram_dlltiming(&si); - PRINTK_DEBUG("Done dlltiming\n"); + if (si.boot_path != BOOT_PATH_RESET) { + sdram_dlltiming(&si); + PRINTK_DEBUG("Done dlltiming\n"); + } hpet_udelay(200000); - sdram_rcomp(&si); - PRINTK_DEBUG("Done RCOMP\n"); + if (si.boot_path != BOOT_PATH_RESET) { + sdram_rcomp(&si); + PRINTK_DEBUG("Done RCOMP\n"); + } sdram_odt(&si); PRINTK_DEBUG("Done odt\n"); - while ((MCHBAR8(0x130) & 0x1) != 0); + if (si.boot_path != BOOT_PATH_RESET) { + while ((MCHBAR8(0x130) & 0x1) != 0) + ; + } sdram_mmap(&si); PRINTK_DEBUG("Done mmap\n"); -- cgit v1.2.3