romstage_handoff: add helper to determine resume status

Instead of having callers query the romstage handoff resume
status by inspecting the object themselves add
romstage_handoff_is_resume() so that the same information
can be queried easily.

Change-Id: I40f3769b7646bf296ee4bc323a9ab1d5e5691e21
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/17647
Tested-by: build bot (Jenkins)
Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Aaron Durbin 2016-11-29 21:22:42 -06:00
parent 77e13997d3
commit 6c191d8af4
6 changed files with 28 additions and 33 deletions

View File

@ -32,14 +32,7 @@ int acpi_slp_type = -1;
#if IS_ENABLED(CONFIG_EARLY_CBMEM_INIT) #if IS_ENABLED(CONFIG_EARLY_CBMEM_INIT)
int acpi_get_sleep_type(void) int acpi_get_sleep_type(void)
{ {
struct romstage_handoff *handoff; if (romstage_handoff_is_resume()) {
handoff = cbmem_find(CBMEM_ID_ROMSTAGE_INFO);
if (handoff == NULL) {
printk(BIOS_DEBUG, "Unknown boot method, assuming normal.\n");
return ACPI_S0;
} else if (handoff->s3_resume) {
printk(BIOS_DEBUG, "S3 Resume.\n"); printk(BIOS_DEBUG, "S3 Resume.\n");
return ACPI_S3; return ACPI_S3;
} else { } else {

View File

@ -78,4 +78,17 @@ static inline int romstage_handoff_init(int is_s3_resume)
return 0; return 0;
} }
/* Return 1 if resuming or 0 if not. */
static inline int romstage_handoff_is_resume(void)
{
struct romstage_handoff *handoff;
handoff = cbmem_find(CBMEM_ID_ROMSTAGE_INFO);
if (handoff == NULL)
return 0;
return handoff->s3_resume;
}
#endif /* ROMSTAGE_HANDOFF_H */ #endif /* ROMSTAGE_HANDOFF_H */

View File

@ -85,19 +85,19 @@ static void ramstage_cache_invalid(void)
} }
} }
static void run_ramstage_from_resume(struct romstage_handoff *handoff, static void run_ramstage_from_resume(struct prog *ramstage)
struct prog *ramstage)
{ {
if (handoff != NULL && handoff->s3_resume) { if (!romstage_handoff_is_resume())
/* Load the cached ramstage to runtime location. */ return;
stage_cache_load_stage(STAGE_RAMSTAGE, ramstage);
if (prog_entry(ramstage) != NULL) { /* Load the cached ramstage to runtime location. */
printk(BIOS_DEBUG, "Jumping to image.\n"); stage_cache_load_stage(STAGE_RAMSTAGE, ramstage);
prog_run(ramstage);
} if (prog_entry(ramstage) != NULL) {
ramstage_cache_invalid(); printk(BIOS_DEBUG, "Jumping to image.\n");
prog_run(ramstage);
} }
ramstage_cache_invalid();
} }
static int load_relocatable_ramstage(struct prog *ramstage) static int load_relocatable_ramstage(struct prog *ramstage)
@ -136,8 +136,7 @@ void run_ramstage(void)
if (IS_ENABLED(CONFIG_ARCH_X86) && if (IS_ENABLED(CONFIG_ARCH_X86) &&
!IS_ENABLED(CONFIG_NO_STAGE_CACHE) && !IS_ENABLED(CONFIG_NO_STAGE_CACHE) &&
IS_ENABLED(CONFIG_EARLY_CBMEM_INIT)) IS_ENABLED(CONFIG_EARLY_CBMEM_INIT))
run_ramstage_from_resume(romstage_handoff_find_or_add(), run_ramstage_from_resume(&ramstage);
&ramstage);
if (prog_locate(&ramstage)) if (prog_locate(&ramstage))
goto fail; goto fail;

View File

@ -260,7 +260,6 @@ static void set_power_limits(void)
static void soc_init(void *data) static void soc_init(void *data)
{ {
struct global_nvs_t *gnvs; struct global_nvs_t *gnvs;
struct romstage_handoff *handoff;
/* Save VBT info and mapping */ /* Save VBT info and mapping */
vbt = vbt_get(&vbt_rdev); vbt = vbt_get(&vbt_rdev);
@ -269,8 +268,7 @@ static void soc_init(void *data)
* default policy that doesn't honor boards' requirements. */ * default policy that doesn't honor boards' requirements. */
itss_snapshot_irq_polarities(GPIO_IRQ_START, GPIO_IRQ_END); itss_snapshot_irq_polarities(GPIO_IRQ_START, GPIO_IRQ_END);
handoff = romstage_handoff_find_or_add(); fsp_silicon_init(romstage_handoff_is_resume());
fsp_silicon_init(handoff->s3_resume);
/* Restore GPIO IRQ polarities back to previous settings. */ /* Restore GPIO IRQ polarities back to previous settings. */
itss_restore_irq_polarities(GPIO_IRQ_START, GPIO_IRQ_END); itss_restore_irq_polarities(GPIO_IRQ_START, GPIO_IRQ_END);

View File

@ -102,8 +102,6 @@ static const struct reg_script thermal_init_script[] = {
static void chip_init(void *chip_info) static void chip_init(void *chip_info)
{ {
struct romstage_handoff *handoff;
/* Validate the temperature settings */ /* Validate the temperature settings */
ASSERT(PLATFORM_CATASTROPHIC_TRIP_CELSIUS <= 255); ASSERT(PLATFORM_CATASTROPHIC_TRIP_CELSIUS <= 255);
ASSERT(PLATFORM_CATASTROPHIC_TRIP_CELSIUS ASSERT(PLATFORM_CATASTROPHIC_TRIP_CELSIUS
@ -120,8 +118,7 @@ static void chip_init(void *chip_info)
| TS_LOCK_AUX_TRIP_PT_REGS_ENABLE)); | TS_LOCK_AUX_TRIP_PT_REGS_ENABLE));
/* Perform silicon specific init. */ /* Perform silicon specific init. */
handoff = romstage_handoff_find_or_add(); fsp_silicon_init(romstage_handoff_is_resume());
fsp_silicon_init(handoff->s3_resume);
} }
static void pci_domain_set_resources(device_t dev) static void pci_domain_set_resources(device_t dev)

View File

@ -35,13 +35,8 @@
void soc_init_pre_device(void *chip_info) void soc_init_pre_device(void *chip_info)
{ {
struct romstage_handoff *handoff;
/* Get S3 status to pass to silicon init. */
handoff = romstage_handoff_find_or_add();
/* Perform silicon specific init. */ /* Perform silicon specific init. */
fsp_silicon_init(handoff->s3_resume); fsp_silicon_init(romstage_handoff_is_resume());
} }
static void pci_domain_set_resources(device_t dev) static void pci_domain_set_resources(device_t dev)