soc/intel/common: Implement power-failure-state handling
This is a consolidation of the respective feature in `soc/intel/*lake/`, including additional support for MAINBOARD_POWER_STATE_PREVIOUS. For the latter, firmware has to keep track of the `previous` state. The feature was already advertised in Kconfig long ago, but not implemented. SoC code has to call pmc_set_power_failure_state() at least once during boot and needs to implement pmc_soc_set_afterg3_en() for the actual register write. Change-Id: Ic6970a79d9b95373c2855f4c92232d2aa05963bb Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/34724 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
parent
84d5d65bce
commit
ef19ce5346
|
@ -16,6 +16,7 @@
|
||||||
#ifndef SOC_INTEL_COMMON_BLOCK_PMCLIB_H
|
#ifndef SOC_INTEL_COMMON_BLOCK_PMCLIB_H
|
||||||
#define SOC_INTEL_COMMON_BLOCK_PMCLIB_H
|
#define SOC_INTEL_COMMON_BLOCK_PMCLIB_H
|
||||||
|
|
||||||
|
#include <device/pci_type.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/* Forward declare the power state struct here */
|
/* Forward declare the power state struct here */
|
||||||
|
@ -214,4 +215,20 @@ enum {
|
||||||
MAINBOARD_POWER_STATE_PREVIOUS,
|
MAINBOARD_POWER_STATE_PREVIOUS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Implemented by SoC code to set PMC register to know which state
|
||||||
|
* system should go into after power is reapplied.
|
||||||
|
*/
|
||||||
|
void pmc_soc_set_afterg3_en(bool on);
|
||||||
|
/*
|
||||||
|
* Configure power state to go into when power is reapplied.
|
||||||
|
*
|
||||||
|
* To be called by SoC code once during boot and will be called by
|
||||||
|
* the "sleep" SMI handler when going into S5.
|
||||||
|
*
|
||||||
|
* `target_on` signifies that we are currently powering on, so that
|
||||||
|
* MAINBOARD_POWER_STATE_PREVIOUS can be handled accordingly.
|
||||||
|
*/
|
||||||
|
void pmc_set_power_failure_state(bool target_on);
|
||||||
|
|
||||||
#endif /* SOC_INTEL_COMMON_BLOCK_PMCLIB_H */
|
#endif /* SOC_INTEL_COMMON_BLOCK_PMCLIB_H */
|
||||||
|
|
|
@ -579,3 +579,30 @@ void pmc_gpe_init(void)
|
||||||
/* Set the routes in the GPIO communities as well. */
|
/* Set the routes in the GPIO communities as well. */
|
||||||
gpio_route_gpe(dw0, dw1, dw2);
|
gpio_route_gpe(dw0, dw1, dw2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pmc_set_power_failure_state(const bool target_on)
|
||||||
|
{
|
||||||
|
const int state = CONFIG_MAINBOARD_POWER_FAILURE_STATE;
|
||||||
|
bool on;
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case MAINBOARD_POWER_STATE_OFF:
|
||||||
|
printk(BIOS_INFO, "Set power off after power failure.\n");
|
||||||
|
on = false;
|
||||||
|
break;
|
||||||
|
case MAINBOARD_POWER_STATE_ON:
|
||||||
|
printk(BIOS_INFO, "Set power on after power failure.\n");
|
||||||
|
on = true;
|
||||||
|
break;
|
||||||
|
case MAINBOARD_POWER_STATE_PREVIOUS:
|
||||||
|
printk(BIOS_INFO, "Keep power state after power failure.\n");
|
||||||
|
on = target_on;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk(BIOS_WARNING, "WARNING: Unknown power-failure state: %d\n", state);
|
||||||
|
on = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmc_soc_set_afterg3_en(on);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue