aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/soc/intel/common/block/include/intelblocks/pmclib.h3
-rw-r--r--src/soc/intel/common/block/pmc/pmclib.c36
2 files changed, 38 insertions, 1 deletions
diff --git a/src/soc/intel/common/block/include/intelblocks/pmclib.h b/src/soc/intel/common/block/include/intelblocks/pmclib.h
index fe0a7657e3..05a4a06294 100644
--- a/src/soc/intel/common/block/include/intelblocks/pmclib.h
+++ b/src/soc/intel/common/block/include/intelblocks/pmclib.h
@@ -150,6 +150,9 @@ void pmc_global_reset_lock(void);
/* Rewrite the gpe0 registers in cbmem to proper values as per routing table */
void pmc_fixup_power_state(void);
+/* Returns the power state structure */
+struct chipset_power_state *pmc_get_power_state(void);
+
/*
* Reads and prints ACPI specific PM registers which are common across
* chipsets. Returns the previous sleep state which is one of ACPI_SX values.
diff --git a/src/soc/intel/common/block/pmc/pmclib.c b/src/soc/intel/common/block/pmc/pmclib.c
index 78b43e44e9..0afcdb2a2c 100644
--- a/src/soc/intel/common/block/pmc/pmclib.c
+++ b/src/soc/intel/common/block/pmc/pmclib.c
@@ -13,6 +13,7 @@
* GNU General Public License for more details.
*/
+#include <arch/early_variables.h>
#include <arch/io.h>
#include <cbmem.h>
#include <console/console.h>
@@ -20,9 +21,42 @@
#include <intelblocks/pmclib.h>
#include <intelblocks/gpio.h>
#include <soc/pm.h>
+#include <string.h>
#include <timer.h>
#include <vboot/vboot_common.h>
+static struct chipset_power_state power_state CAR_GLOBAL;
+
+struct chipset_power_state *pmc_get_power_state(void)
+{
+ struct chipset_power_state *ptr = NULL;
+
+ if (cbmem_possibly_online())
+ ptr = cbmem_find(CBMEM_ID_POWER_STATE);
+
+ /* cbmem is online but ptr is not populated yet */
+ if (ptr == NULL && !(ENV_RAMSTAGE || ENV_POSTCAR))
+ return car_get_var_ptr(&power_state);
+
+ return ptr;
+}
+
+static void migrate_power_state(int is_recovery)
+{
+ struct chipset_power_state *ps_cbmem;
+ struct chipset_power_state *ps_car;
+
+ ps_car = car_get_var_ptr(&power_state);
+ ps_cbmem = cbmem_add(CBMEM_ID_POWER_STATE, sizeof(*ps_cbmem));
+
+ if (ps_cbmem == NULL) {
+ printk(BIOS_DEBUG, "Not adding power state to cbmem!\n");
+ return;
+ }
+ memcpy(ps_cbmem, ps_car, sizeof(*ps_cbmem));
+}
+ROMSTAGE_CBMEM_INIT_HOOK(migrate_power_state)
+
static void print_num_status_bits(int num_bits, uint32_t status,
const char *const bit_names[])
{
@@ -322,7 +356,7 @@ void pmc_fixup_power_state(void)
int i;
struct chipset_power_state *ps;
- ps = cbmem_find(CBMEM_ID_POWER_STATE);
+ ps = pmc_get_power_state();
if (ps == NULL)
return;