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. Signed-off-by: David Hendricks <dhendrix@chromium.org> Change-Id: I225f572f7b3072bec2bc06aac3fb50d90a2e30ee Reviewed-on: https://chromium-review.googlesource.com/204764 Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
dd9e06e41d
commit
9315c485de
2 changed files with 28 additions and 0 deletions
|
|
@ -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;
|
||||
|
||||
|
|
@ -183,6 +189,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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue