T124: perform ram_repair when CPU rail is powered on in warmboot

This patch is to perform software triggered RAM re-repair in
the warm boot path.

"RAM" actually refers to the CPU cache here (yeah, I know, but that's
how the manuals call it). This is some magic hardware thing that must be
done every time after applying power to the main CPU cores or their
cache may have random failures in some very rare cases.

Also, note that this file isn't built in coreboot proper, but is a
companion binary for kernel. It resides here for safe keeping.

BUG=chrome-os-partner:30430
BRANCH=nyan
TEST=run suspend_stress_test on nyan.

Original-Signed-off-by: Yen Lin <yelin@nvidia.com>
Original-Change-Id: I540f8afbffa323d1e378cb6ba6a20be4afd08339
Original-Reviewed-on: https://chromium-review.googlesource.com/207422
Original-Tested-by: Yen Lin <yelin@nvidia.com>
Original-Reviewed-by: Tom Warren <twarren@nvidia.com>
Original-Reviewed-by: Julius Werner <jwerner@chromium.org>
Original-Reviewed-by: Andrew Bresticker <abrestic@chromium.org>
Original-Commit-Queue: Yen Lin <yelin@nvidia.com>
(cherry picked from commit f06c413c42819f8f75d9b0fecde02b82583f1d2a)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>

Change-Id: I151ce943ce8623e46cc55f890bbd6fc641cc2b98
Reviewed-on: http://review.coreboot.org/8416
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Yen Lin 2014-07-10 14:11:16 -07:00 committed by Marc Jones
parent 5840626cec
commit ba118cc3a9
1 changed files with 29 additions and 0 deletions

View File

@ -193,6 +193,14 @@ enum {
FLOW_CLUSTER_ACTIVE_LP = 0x1 << 0 FLOW_CLUSTER_ACTIVE_LP = 0x1 << 0
}; };
static uint32_t *flow_ctlr_ram_repair_ptr =
(void *)(FLOW_CTLR_BASE + 0x40);
static uint32_t *flow_ctlr_ram_repair_cluster1_ptr =
(void *)(FLOW_CTLR_BASE + 0x58);
enum {
RAM_REPAIR_REQ = 0x1 << 0,
RAM_REPAIR_STS = 0x1 << 1,
};
/* Power management controller registers. */ /* Power management controller registers. */
@ -483,6 +491,24 @@ static void clear_cpu_resets(void)
/* RAM repair */
void ram_repair(void)
{
// Request Cluster0 RAM repair.
setbits32(RAM_REPAIR_REQ, flow_ctlr_ram_repair_ptr);
// Poll for Cluster0 RAM repair status.
while (!(read32(flow_ctlr_ram_repair_ptr) & RAM_REPAIR_STS))
;
// Request Cluster1 RAM repair.
setbits32(RAM_REPAIR_REQ, flow_ctlr_ram_repair_cluster1_ptr);
// Poll for Cluster1 RAM repair status.
while (!(read32(flow_ctlr_ram_repair_cluster1_ptr) & RAM_REPAIR_STS))
;
}
/* Power. */ /* Power. */
static void power_on_partition(unsigned id) static void power_on_partition(unsigned id)
@ -589,6 +615,9 @@ void lp0_resume(void)
power_on_main_cpu(); power_on_main_cpu();
// Perform ram repair after cpu is powered on.
ram_repair();
clear_cpu_resets(); clear_cpu_resets();
// Halt the AVP. // Halt the AVP.