diff options
author | David Hendricks <dhendrix@chromium.org> | 2014-06-19 15:39:29 -0700 |
---|---|---|
committer | Marc Jones <marc.jones@se-eng.com> | 2015-01-09 07:44:57 +0100 |
commit | bb0d5ef97a10bada5310ec7fc4faf53a15e98e71 (patch) | |
tree | 7fce8443db5c1df363a380d7d3defc1def282806 | |
parent | 990a592c1d2a58753decc72a75820177d92b555f (diff) | |
download | coreboot-bb0d5ef97a10bada5310ec7fc4faf53a15e98e71.tar.xz |
x86: Initialize drivers in SMM context if needed
This adds a block in the SMI handler to call init functions for
drivers which may be used in SMM. A static variable is used to
ensure the init functions are only called once.
BUG=chrome-os-partner:29580
BRANCH=mccloud
TEST=Built and booted on mccloud, system no longer hangs when
pressing power button at the dev mode screen. Also tested on parrot.
Original-Signed-off-by: David Hendricks <dhendrix@chromium.org>
Original-Change-Id: I225f572f7b3072bec2bc06aac3fb50d90a2e30ee
Original-Reviewed-on: https://chromium-review.googlesource.com/204764
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
(cherry picked from commit 9315c485deb5f24df753e2d69f4819b2cb6accc2)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>
Change-Id: I8d2b21765c35c7ac7746986d5334dca17dcd6861
Reviewed-on: http://review.coreboot.org/8134
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r-- | src/cpu/x86/smm/smihandler.c | 14 | ||||
-rw-r--r-- | src/cpu/x86/smm/smm_module_handler.c | 14 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/cpu/x86/smm/smihandler.c b/src/cpu/x86/smm/smihandler.c index c864df21f8..bd03030c4c 100644 --- a/src/cpu/x86/smm/smihandler.c +++ b/src/cpu/x86/smm/smihandler.c @@ -24,6 +24,12 @@ #include <cpu/x86/cache.h> #include <cpu/x86/smm.h> +#if CONFIG_SPI_FLASH_SMM +#include <spi-generic.h> +#endif + +static int do_driver_init = 1; + #if !CONFIG_SMM_TSEG /* TSEG handler locks in assembly */ typedef enum { SMI_LOCKED, SMI_UNLOCKED } smi_semaphore; @@ -184,6 +190,14 @@ void smi_handler(u32 smm_revision) return; } + /* Allow drivers to initialize variables in SMM context. */ + if (do_driver_init) { +#if CONFIG_SPI_FLASH_SMM + spi_init(); +#endif + do_driver_init = 0; + } + /* Call chipset specific SMI handlers. */ if (cpu_smi_handler) cpu_smi_handler(node, &state_save); diff --git a/src/cpu/x86/smm/smm_module_handler.c b/src/cpu/x86/smm/smm_module_handler.c index 79863d8fef..8c0e804523 100644 --- a/src/cpu/x86/smm/smm_module_handler.c +++ b/src/cpu/x86/smm/smm_module_handler.c @@ -22,6 +22,12 @@ #include <cpu/x86/smm.h> #include <rmodule.h> +#if CONFIG_SPI_FLASH_SMM +#include <spi-generic.h> +#endif + +static int do_driver_init = 1; + typedef enum { SMI_LOCKED, SMI_UNLOCKED } smi_semaphore; /* SMI multiprocessing semaphore */ @@ -154,6 +160,14 @@ void asmlinkage smm_handler_start(void *arg) printk(BIOS_SPEW, "\nSMI# #%d\n", cpu); + /* Allow drivers to initialize variables in SMM context. */ + if (do_driver_init) { +#if CONFIG_SPI_FLASH_SMM + spi_init(); +#endif + do_driver_init = 0; + } + cpu_smi_handler(); northbridge_smi_handler(); southbridge_smi_handler(); |