soc/intel/common: Add API to restore power failure into PMC common code
PMC config register need to program to define which state system should be after reapplied power from G3 state. 0 = System will return to S0 state 1 = System will return to S5 state 2 = System will return to previous state before failure Refer to EDS for detailed programming sequence. Change-Id: I0ce2cc77745d00a8cfe3eed7c6372af77e063d02 Signed-off-by: Subrata Banik <subrata.banik@intel.com> Reviewed-on: https://review.coreboot.org/22838 Reviewed-by: Furquan Shaikh <furquan@google.com> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
e5ab9e28a6
commit
9b98febe7a
|
@ -132,6 +132,12 @@ void pmc_clear_all_gpe_status(void);
|
||||||
/* Clear status bits in Power and Reset Status (PRSTS) register */
|
/* Clear status bits in Power and Reset Status (PRSTS) register */
|
||||||
void pmc_clear_prsts(void);
|
void pmc_clear_prsts(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set PMC register to know which state system should be after
|
||||||
|
* power reapplied
|
||||||
|
*/
|
||||||
|
void pmc_soc_restore_power_failure(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable or disable global reset. If global reset is enabled, hard reset and
|
* Enable or disable global reset. If global reset is enabled, hard reset and
|
||||||
* soft reset will trigger global reset, where both host and TXE are reset.
|
* soft reset will trigger global reset, where both host and TXE are reset.
|
||||||
|
@ -205,4 +211,22 @@ void soc_get_gpi_gpe_configs(uint8_t *dw0, uint8_t *dw1, uint8_t *dw2);
|
||||||
*/
|
*/
|
||||||
void soc_fill_power_state(struct chipset_power_state *ps);
|
void soc_fill_power_state(struct chipset_power_state *ps);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Which state do we want to goto after g3 (power restored)?
|
||||||
|
* 0 == S5 Soft Off
|
||||||
|
* 1 == S0 Full On
|
||||||
|
* 2 == Keep Previous State
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
MAINBOARD_POWER_STATE_OFF,
|
||||||
|
MAINBOARD_POWER_STATE_ON,
|
||||||
|
MAINBOARD_POWER_STATE_PREVIOUS,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determines what state to go to when power is reapplied
|
||||||
|
* after a power failure (G3 State)
|
||||||
|
*/
|
||||||
|
int pmc_get_mainboard_power_failure_state_choice(void);
|
||||||
|
|
||||||
#endif /* SOC_INTEL_COMMON_BLOCK_PMCLIB_H */
|
#endif /* SOC_INTEL_COMMON_BLOCK_PMCLIB_H */
|
||||||
|
|
|
@ -5,3 +5,28 @@ config SOC_INTEL_COMMON_BLOCK_PMC
|
||||||
help
|
help
|
||||||
Intel Processor common code for Power Management controller(PMC)
|
Intel Processor common code for Power Management controller(PMC)
|
||||||
subsystem
|
subsystem
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "System Power State after Failure"
|
||||||
|
default POWER_STATE_ON_AFTER_FAILURE
|
||||||
|
|
||||||
|
config POWER_STATE_OFF_AFTER_FAILURE
|
||||||
|
bool "S5 Soft Off"
|
||||||
|
help
|
||||||
|
Choose this option if you want to keep system into
|
||||||
|
S5 after reapplying power after failure
|
||||||
|
|
||||||
|
config POWER_STATE_ON_AFTER_FAILURE
|
||||||
|
bool "S0 Full On"
|
||||||
|
help
|
||||||
|
Choose this option if you want to keep system into
|
||||||
|
S0 after reapplying power after failure
|
||||||
|
|
||||||
|
config POWER_STATE_PREVIOUS_AFTER_FAILURE
|
||||||
|
bool "Keep Previous State"
|
||||||
|
help
|
||||||
|
Choose this option if you want to keep system into
|
||||||
|
same power state as before failure even after reapplying
|
||||||
|
power
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
|
@ -80,6 +80,18 @@ __attribute__ ((weak)) uint32_t soc_get_smi_status(uint32_t generic_sts)
|
||||||
return generic_sts;
|
return generic_sts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set PMC register to know which state system should be after
|
||||||
|
* power reapplied
|
||||||
|
*/
|
||||||
|
__attribute__ ((weak)) void pmc_soc_restore_power_failure(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* SoC code should set PMC config register in order to set
|
||||||
|
* MAINBOARD_POWER_ON bit as per EDS.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t pmc_reset_smi_status(void)
|
static uint32_t pmc_reset_smi_status(void)
|
||||||
{
|
{
|
||||||
uint32_t smi_sts = inl(ACPI_BASE_ADDRESS + SMI_STS);
|
uint32_t smi_sts = inl(ACPI_BASE_ADDRESS + SMI_STS);
|
||||||
|
@ -590,3 +602,17 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determines what state to go to when power is reapplied
|
||||||
|
* after a power failure (G3 State)
|
||||||
|
*/
|
||||||
|
int pmc_get_mainboard_power_failure_state_choice(void)
|
||||||
|
{
|
||||||
|
if (IS_ENABLED(CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE))
|
||||||
|
return MAINBOARD_POWER_STATE_PREVIOUS;
|
||||||
|
else if (IS_ENABLED(CONFIG_POWER_STATE_ON_AFTER_FAILURE))
|
||||||
|
return MAINBOARD_POWER_STATE_ON;
|
||||||
|
|
||||||
|
return MAINBOARD_POWER_STATE_OFF;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue