Hung-Te Lin (hungte(a)chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3102
-gerrit
commit 5896f9c5e6e4bf35e6e994d7927e3ee199f25b83
Author: Hung-Te Lin <hungte(a)chromium.org>
Date: Thu Apr 25 19:49:40 2013 +0800
Google/Snow: Enable suspend/resume.
Add the suspend/resume feature into bootblock and romstage.
Verified by built and boot successfully on Google/Snow, and then executed the
"suspend_stress_test" in ChromiumOS succesfully.
Change-Id: I65681c42eeef2736e55bb906595f42a5b1dfdf11
Signed-off-by: Hung-Te Lin <hungte(a)chromium.org>
---
src/mainboard/google/snow/bootblock.c | 17 ++++++++++++-----
src/mainboard/google/snow/romstage.c | 13 ++++++++++---
2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/src/mainboard/google/snow/bootblock.c b/src/mainboard/google/snow/bootblock.c
index d2e0b50..d6411b5 100644
--- a/src/mainboard/google/snow/bootblock.c
+++ b/src/mainboard/google/snow/bootblock.c
@@ -25,16 +25,23 @@
#include <console/console.h>
#include <cpu/samsung/exynos5250/periph.h>
#include <cpu/samsung/exynos5250/pinmux.h>
+#include "mainboard.h"
void bootblock_mainboard_init(void);
void bootblock_mainboard_init(void)
{
- /* kick off the microsecond timer. We want to do this as early
- * as we can.
- */
- timer_start();
+ switch (board_get_wakeup_state()) {
+ case BOARD_WAKEUP_DIRECT:
+ board_wakeup();
+ break;
- exynos_pinmux_config(PERIPH_ID_SPI1, PINMUX_FLAG_NONE);
+ case BOARD_IS_NOT_WAKEUP:
+ /* kick off the microsecond timer.
+ * We want to do this as early as we can.
+ */
+ timer_start();
+ break;
+ }
#if CONFIG_EARLY_CONSOLE
exynos_pinmux_config(PERIPH_ID_UART3, PINMUX_FLAG_NONE);
console_init();
diff --git a/src/mainboard/google/snow/romstage.c b/src/mainboard/google/snow/romstage.c
index 52391ef..11d5d61 100644
--- a/src/mainboard/google/snow/romstage.c
+++ b/src/mainboard/google/snow/romstage.c
@@ -170,15 +170,22 @@ void main(void)
{
struct mem_timings *mem;
void *entry;
+ int is_resume = (board_get_wakeup_state() != BOARD_IS_NOT_WAKEUP);
/* Clock must be initialized before console_init, otherwise you may need
* to re-initialize serial console drivers again. */
mem = board_setup_clock();
- console_init();
- board_setup_power();
+ if (!is_resume) {
+ console_init();
+ board_setup_power();
+ }
+
+ board_setup_memory(mem, is_resume);
- board_setup_memory(mem, 0);
+ if (is_resume) {
+ board_wakeup();
+ }
board_setup_storage();
board_setup_gpio();
Hung-Te Lin (hungte(a)chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3129
-gerrit
commit badb325241ac84b6711fb82565191378658efffc
Author: Hung-Te Lin <hungte(a)chromium.org>
Date: Thu Apr 25 17:38:55 2013 +0800
google/snow: Add "wakup" module for suspend/resume.
The "wakeup" procedure will be shared by bootblock and romstage for different
types of resume process.
Note, this commit does not include changes in romstage/bootblock to enable
suspend/resume feature. Simply adding functions to handle suspend/resume.
Verified by successfully built and boot Google/Snow firmware image.
Change-Id: I17a256afb99f2f8b5e0eac3393cdf6959b239341
Signed-off-by: Hung-Te Lin <hungte(a)chromium.org>
---
src/cpu/samsung/exynos5250/Makefile.inc | 2 +-
src/mainboard/google/snow/Makefile.inc | 3 ++
src/mainboard/google/snow/mainboard.h | 9 +++++
src/mainboard/google/snow/romstage.c | 13 -------
src/mainboard/google/snow/wakeup.c | 60 +++++++++++++++++++++++++++++++++
5 files changed, 73 insertions(+), 14 deletions(-)
diff --git a/src/cpu/samsung/exynos5250/Makefile.inc b/src/cpu/samsung/exynos5250/Makefile.inc
index 8788a6c..25d1bc5 100644
--- a/src/cpu/samsung/exynos5250/Makefile.inc
+++ b/src/cpu/samsung/exynos5250/Makefile.inc
@@ -3,7 +3,7 @@
# image outside of CBFS
#INTERMEDIATE += exynos5250_add_bl1
-bootblock-y += pinmux.c mct.c
+bootblock-y += pinmux.c mct.c power.c
# Clock is required for UART
bootblock-$(CONFIG_EARLY_CONSOLE) += clock_init.c
bootblock-$(CONFIG_EARLY_CONSOLE) += clock.c
diff --git a/src/mainboard/google/snow/Makefile.inc b/src/mainboard/google/snow/Makefile.inc
index 46e366f..84a8c05 100644
--- a/src/mainboard/google/snow/Makefile.inc
+++ b/src/mainboard/google/snow/Makefile.inc
@@ -17,9 +17,12 @@
## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
##
+bootblock-y += wakeup.c
+
romstage-y += mainboard.c
romstage-y += memory.c
romstage-y += romstage.c
+romstage-y += wakeup.c
# ramstage-y += ec.c
ramstage-y += ramstage.c
diff --git a/src/mainboard/google/snow/mainboard.h b/src/mainboard/google/snow/mainboard.h
index 6fe371f..9650bea 100644
--- a/src/mainboard/google/snow/mainboard.h
+++ b/src/mainboard/google/snow/mainboard.h
@@ -35,4 +35,13 @@ enum snow_board_config {
int board_get_config(void);
+enum {
+ BOARD_IS_NOT_WAKEUP,
+ BOARD_WAKEUP_DIRECT,
+ BOARD_WAKEUP_NEED_CLOCK_RESET,
+};
+
+int board_get_wakeup_state(void);
+void board_wakeup(void);
+
#endif /* MAINBOARD_H */
diff --git a/src/mainboard/google/snow/romstage.c b/src/mainboard/google/snow/romstage.c
index edbe009..6e312fa 100644
--- a/src/mainboard/google/snow/romstage.c
+++ b/src/mainboard/google/snow/romstage.c
@@ -46,19 +46,6 @@
#define PMIC_BUS 0
#define MMC0_GPIO_PIN (58)
-#if 0
-static int board_wakeup_permitted(void)
-{
- const int gpio = GPIO_Y10;
- int is_bad_wake;
-
- /* We're a bad wakeup if the gpio was defined and was high */
- is_bad_wake = ((gpio != -1) && gpio_get_value(gpio));
-
- return !is_bad_wake;
-}
-#endif
-
static int setup_pmic(void)
{
int error = 0;
diff --git a/src/mainboard/google/snow/wakeup.c b/src/mainboard/google/snow/wakeup.c
new file mode 100644
index 0000000..49867af
--- /dev/null
+++ b/src/mainboard/google/snow/wakeup.c
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2013 Google, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <arch/gpio.h>
+#include <arch/hlt.h>
+#include <cpu/samsung/exynos5250/gpio.h>
+#include <cpu/samsung/exynos5250/power.h>
+#include <cpu/samsung/exynos5-common/exynos5-common.h>
+
+#include "mainboard.h"
+
+static int wakeup_need_reset(void)
+{
+ /* We're a bad wakeup if the gpio is high */
+ return gpio_get_value(GPIO_Y10);
+}
+
+void board_wakeup(void)
+{
+ if (wakeup_need_reset())
+ power_reset();
+
+ power_init(); /* Ensure ps_hold_setup() for early wakeup. */
+ power_exit_wakeup();
+ /* Should never return. */
+ hlt();
+}
+
+int board_get_wakeup_state()
+{
+ uint32_t status = power_read_reset_status();
+
+ /* DIDLE/LPA can be resumed without clock reset (ex, bootblock),
+ * and SLEEP requires resetting clock (should be done in ROM stage).
+ */
+
+ if (status == S5P_CHECK_DIDLE || status == S5P_CHECK_LPA)
+ return BOARD_WAKEUP_DIRECT;
+
+ if (status == S5P_CHECK_SLEEP)
+ return BOARD_WAKEUP_NEED_CLOCK_RESET;
+
+ return BOARD_IS_NOT_WAKEUP;
+}
Martin Roth (martin.roth(a)se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3126
-gerrit
commit 3412fd185fb0e2a1b0d9d05b30ac811534cc9db5
Author: Martin Roth <martin.roth(a)se-eng.com>
Date: Tue Apr 23 15:11:52 2013 -0600
AMD F15: Fix warning in Proc/CPU/Feature
Fix Warning:
cpuFeatureLeveling.c:265, GNU Compiler 4 (gcc), Priority: Normal
cast to pointer from integer of different size [-Wint-to-pointer-cast]
with an intermediate cast to (intptr_t)
Change-Id: I3bfd2ea1e797632316675338789dabef8f73ba64
Signed-off-by: Martin Roth <martin.roth(a)se-eng.com>
---
src/vendorcode/amd/agesa/f15/Proc/CPU/Feature/cpuFeatureLeveling.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/vendorcode/amd/agesa/f15/Proc/CPU/Feature/cpuFeatureLeveling.c b/src/vendorcode/amd/agesa/f15/Proc/CPU/Feature/cpuFeatureLeveling.c
index 1f2e708..294a18d 100644
--- a/src/vendorcode/amd/agesa/f15/Proc/CPU/Feature/cpuFeatureLeveling.c
+++ b/src/vendorcode/amd/agesa/f15/Proc/CPU/Feature/cpuFeatureLeveling.c
@@ -262,5 +262,5 @@ GetGlobalCpuFeatureListAddress (
AddressValue = GLOBAL_CPU_FEATURE_LIST_TEMP_ADDR;
- *Address = (UINT64 *)(AddressValue);
+ *Address = (UINT64 *) (intptr_t) (AddressValue);
}
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3124
-gerrit
commit 5bbd5fc68a3eb85b89fd69d22d3e9fdf211fcdf3
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Tue Apr 23 10:25:34 2013 -0500
x86: use proper types for interrupt callbacks
The mainboard_interrupt_handlers() argument for the function
pointer was using void * as the type. This does not allow the compiler
to catch type differences for the arguments. Thus, some code has been
committed which violates the new interrupt callbacks not taking any
arguments. Make sure the compiler provides a type checking benefit.
Change-Id: I268ec8e16929080955751ef518d65b91895e4308
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/arch/x86/include/arch/interrupt.h | 4 ++--
src/device/oprom/realmode/x86.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/arch/x86/include/arch/interrupt.h b/src/arch/x86/include/arch/interrupt.h
index 8c9b4a9..9753c50 100644
--- a/src/arch/x86/include/arch/interrupt.h
+++ b/src/arch/x86/include/arch/interrupt.h
@@ -23,9 +23,9 @@
/* setup interrupt handlers for mainboard */
#if CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-extern void mainboard_interrupt_handlers(int intXX, void *intXX_func);
+extern void mainboard_interrupt_handlers(int intXX, int (*intXX_func)(void));
#elif CONFIG_PCI_OPTION_ROM_RUN_YABEL
#include <device/oprom/yabel/biosemu.h>
#else
-static inline void mainboard_interrupt_handlers(int intXX, void *intXX_func) { }
+static inline void mainboard_interrupt_handlers(int intXX, int (*intXX_func)(void)) { }
#endif
diff --git a/src/device/oprom/realmode/x86.c b/src/device/oprom/realmode/x86.c
index 94b65e1..69017f4 100644
--- a/src/device/oprom/realmode/x86.c
+++ b/src/device/oprom/realmode/x86.c
@@ -118,7 +118,7 @@ static int intXX_unknown_handler(void)
}
/* setup interrupt handlers for mainboard */
-void mainboard_interrupt_handlers(int intXX, void *intXX_func)
+void mainboard_interrupt_handlers(int intXX, int (*intXX_func)(void))
{
intXX_handler[intXX] = intXX_func;
}
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3124
-gerrit
commit 9f6e038cc7618dc03eb806a1aa0729e1dbd479f8
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Tue Apr 23 10:25:34 2013 -0500
x86: use proper types for interrupt callbacks
The mainboard_interrupt_handlers() argument for the function
pointer was using void * as the type. This does not allow the compiler
to catch type differences for the arguments. Thus, some code has been
committed which violates the new interrupt callbacks not taking any
arguments. Make sure the compiler provides a type checking benefit.
Change-Id: I268ec8e16929080955751ef518d65b91895e4308
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/arch/x86/include/arch/interrupt.h | 4 ++--
src/device/oprom/realmode/x86.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/arch/x86/include/arch/interrupt.h b/src/arch/x86/include/arch/interrupt.h
index 8c9b4a9..afe5617 100644
--- a/src/arch/x86/include/arch/interrupt.h
+++ b/src/arch/x86/include/arch/interrupt.h
@@ -23,9 +23,9 @@
/* setup interrupt handlers for mainboard */
#if CONFIG_PCI_OPTION_ROM_RUN_REALMODE
-extern void mainboard_interrupt_handlers(int intXX, void *intXX_func);
+extern void mainboard_interrupt_handlers(int intXX, void (*intXX_func)(void));
#elif CONFIG_PCI_OPTION_ROM_RUN_YABEL
#include <device/oprom/yabel/biosemu.h>
#else
-static inline void mainboard_interrupt_handlers(int intXX, void *intXX_func) { }
+static inline void mainboard_interrupt_handlers(int intXX, void (*intXX_func)(void)) { }
#endif
diff --git a/src/device/oprom/realmode/x86.c b/src/device/oprom/realmode/x86.c
index 94b65e1..0b45f46 100644
--- a/src/device/oprom/realmode/x86.c
+++ b/src/device/oprom/realmode/x86.c
@@ -118,7 +118,7 @@ static int intXX_unknown_handler(void)
}
/* setup interrupt handlers for mainboard */
-void mainboard_interrupt_handlers(int intXX, void *intXX_func)
+void mainboard_interrupt_handlers(int intXX, void (*intXX_func)(void))
{
intXX_handler[intXX] = intXX_func;
}