diff options
author | Shaunak Saha <shaunak.saha@intel.com> | 2017-10-02 15:01:33 -0700 |
---|---|---|
committer | Aaron Durbin <adurbin@chromium.org> | 2017-10-05 21:11:27 +0000 |
commit | f073872e22728fe8ade85022740af95cc129e9a5 (patch) | |
tree | b68b949530a8853ff4db7fb991f0e6f31507d520 /src/soc/intel/common/block | |
parent | a75d6808ca03b681c007e8ff040ace438e346131 (diff) |
soc/intel/common/block: Manage power state variable from common PMC block
This patch helps managing power state variables from within the
library. Adds migrate_power_state which migrates the chipset
power state variable, reads global power variable and adds it
in cbmem for future use. This also adds get_soc_power_state_values
function which returns the power state variable from cbmem or
global power state variable if cbmem is not populated yet.
Change-Id: If65341c1492e3a35a1a927100e0d893f923b9e68
Signed-off-by: Shaunak Saha <shaunak.saha@intel.com>
Reviewed-on: https://review.coreboot.org/21851
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/soc/intel/common/block')
-rw-r--r-- | src/soc/intel/common/block/include/intelblocks/pmclib.h | 3 | ||||
-rw-r--r-- | src/soc/intel/common/block/pmc/pmclib.c | 36 |
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; |