diff options
author | Shaunak Saha <shaunak.saha@intel.com> | 2017-08-16 09:54:00 -0700 |
---|---|---|
committer | Aaron Durbin <adurbin@chromium.org> | 2017-08-17 23:41:59 +0000 |
commit | 5f84310bb1801026b24c57925c8147e33a47a595 (patch) | |
tree | 9110ed78389c4e1a1a305d7329dcab19b8cbf204 /src | |
parent | 321111774ce013b35641fe6d0e03e693974b4a28 (diff) |
soc/intel/common/block: Add functions to common CPU library code
This patch adds few helper functions in CPU common libraray code
which are mainly needed for ACPI module. The functions those are
moved to cpu common code is removed from common acpi files.
TEST= System boots properly and no regression observed.
Change-Id: Id34eb7e03069656238ca0cbdf6ce33f116e0e413
Signed-off-by: Shaunak Saha <shaunak.saha@intel.com>
Reviewed-on: https://review.coreboot.org/21051
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/soc/intel/common/acpi.h | 41 | ||||
-rw-r--r-- | src/soc/intel/common/acpi/acpi.c | 61 | ||||
-rw-r--r-- | src/soc/intel/common/block/cpu/cpulib.c | 58 | ||||
-rw-r--r-- | src/soc/intel/common/block/include/intelblocks/cpulib.h | 35 |
4 files changed, 93 insertions, 102 deletions
diff --git a/src/soc/intel/common/acpi.h b/src/soc/intel/common/acpi.h index 845e0f0ae4..19ab92666b 100644 --- a/src/soc/intel/common/acpi.h +++ b/src/soc/intel/common/acpi.h @@ -32,47 +32,6 @@ int soc_fill_acpi_wake(uint32_t *pm1, uint32_t **gpe0); #if IS_ENABLED(CONFIG_SOC_INTEL_COMMON_ACPI) /* - * cpu_get_bus_clock returns the bus clock frequency in KHz. - * This is the value the clock ratio is multiplied with. - */ -uint32_t cpu_get_bus_clock(void); - -/* - * cpu_get_coord_type returns coordination type (SW_ANY or SW_ALL or HW_ALL) - * which is used to populate _PSD object. - */ -int cpu_get_coord_type(void); - -/* - * cpu_config_tdp_levels returns the number of TDP levels supported - * by this processor - */ -int cpu_config_tdp_levels(void); - -/* - * cpu_get_min_ratio returns the minimum frequency ratio that is supported - * by this processor - */ -uint32_t cpu_get_min_ratio(void); - -/* - * cpu_get_max_ratio returns the nominal TDP ratio if available or the - * maximum non turbo frequency ratio for this processor - */ -uint32_t cpu_get_max_ratio(void); - -/* - * cpu_get_power_max calculates CPU TDP in mW - */ -uint32_t cpu_get_power_max(void); - -/* - * cpu_get_max_turbo_ratio returns the maximum turbo ratio limit for the - * processor - */ -uint32_t cpu_get_max_turbo_ratio(void); - -/* * get_cstate_map returns a table of processor specific acpi_cstate_t entries * and number of entries in the table */ diff --git a/src/soc/intel/common/acpi/acpi.c b/src/soc/intel/common/acpi/acpi.c index 458b95fd54..0934dbd2ae 100644 --- a/src/soc/intel/common/acpi/acpi.c +++ b/src/soc/intel/common/acpi/acpi.c @@ -18,6 +18,7 @@ #include <arch/cpu.h> #include <cpu/intel/turbo.h> #include <cpu/x86/msr.h> +#include <intelblocks/cpulib.h> #include <soc/intel/common/acpi.h> #include <soc/pm.h> @@ -34,66 +35,6 @@ #define PSS_LATENCY_BUSMASTER 10 -__attribute__((weak)) int cpu_get_coord_type(void) -{ - return HW_ALL; -} - -__attribute__((weak)) int cpu_config_tdp_levels(void) -{ - return 0; -} - -__attribute__((weak)) uint32_t cpu_get_min_ratio(void) -{ - msr_t msr; - /* Get bus ratio limits and calculate clock speeds */ - msr = rdmsr(MSR_PLATFORM_INFO); - return ((msr.hi >> 8) & 0xff); /* Max Efficiency Ratio */ -} - -__attribute__((weak)) uint32_t cpu_get_max_ratio(void) -{ - msr_t msr; - uint32_t ratio_max; - if (cpu_config_tdp_levels()) { - /* Set max ratio to nominal TDP ratio */ - msr = rdmsr(MSR_CONFIG_TDP_NOMINAL); - ratio_max = msr.lo & 0xff; - } else { - msr = rdmsr(MSR_PLATFORM_INFO); - /* Max Non-Turbo Ratio */ - ratio_max = (msr.lo >> 8) & 0xff; - } - return ratio_max; -} - -__attribute__((weak)) uint32_t cpu_get_bus_clock(void) -{ - /* CPU bus clock is set by default here to 100MHz. - * This function returns the bus clock in KHz. - */ - return 100 * KHz; -} - -__attribute__((weak)) uint32_t cpu_get_power_max(void) -{ - msr_t msr; - int power_unit; - - msr = rdmsr(MSR_RAPL_POWER_UNIT); - power_unit = 2 << ((msr.lo & 0xf) - 1); - msr = rdmsr(MSR_PKG_POWER_INFO); - return ((msr.lo & 0x7fff) / power_unit) * 1000; -} - -__attribute__((weak)) uint32_t cpu_get_max_turbo_ratio(void) -{ - msr_t msr; - msr = rdmsr(MSR_TURBO_RATIO_LIMIT); - return msr.lo & 0xff; -} - __attribute__((weak)) acpi_cstate_t *soc_get_cstate_map(int *entries) { *entries = 0; diff --git a/src/soc/intel/common/block/cpu/cpulib.c b/src/soc/intel/common/block/cpu/cpulib.c index 5920512cd4..2272e69edb 100644 --- a/src/soc/intel/common/block/cpu/cpulib.c +++ b/src/soc/intel/common/block/cpu/cpulib.c @@ -14,6 +14,7 @@ * GNU General Public License for more details. */ +#include <arch/acpigen.h> #include <arch/io.h> #include <console/console.h> #include <cpu/intel/turbo.h> @@ -238,5 +239,60 @@ int cpu_read_topology(unsigned int *num_phys, unsigned int *num_virt) msr = rdmsr(MSR_CORE_THREAD_COUNT); *num_virt = (msr.lo >> 0) & 0xffff; *num_phys = (msr.lo >> 16) & 0xffff; - return (*num_virt == *num_phys); + return (*num_virt == *num_phys); +} + +int cpu_get_coord_type(void) +{ + return HW_ALL; +} + +uint32_t cpu_get_min_ratio(void) +{ + msr_t msr; + /* Get bus ratio limits and calculate clock speeds */ + msr = rdmsr(MSR_PLATFORM_INFO); + return ((msr.hi >> 8) & 0xff); /* Max Efficiency Ratio */ +} + +uint32_t cpu_get_max_ratio(void) +{ + msr_t msr; + uint32_t ratio_max; + if (cpu_config_tdp_levels()) { + /* Set max ratio to nominal TDP ratio */ + msr = rdmsr(MSR_CONFIG_TDP_NOMINAL); + ratio_max = msr.lo & 0xff; + } else { + msr = rdmsr(MSR_PLATFORM_INFO); + /* Max Non-Turbo Ratio */ + ratio_max = (msr.lo >> 8) & 0xff; + } + return ratio_max; +} + +uint32_t cpu_get_bus_clock(void) +{ + /* CPU bus clock is set by default here to 100MHz. + * This function returns the bus clock in KHz. + */ + return CONFIG_CPU_BCLK_MHZ * KHz; +} + +uint32_t cpu_get_power_max(void) +{ + msr_t msr; + int power_unit; + + msr = rdmsr(MSR_PKG_POWER_SKU_UNIT); + power_unit = 2 << ((msr.lo & 0xf) - 1); + msr = rdmsr(MSR_PKG_POWER_SKU); + return ((msr.lo & 0x7fff) / power_unit) * 1000; +} + +uint32_t cpu_get_max_turbo_ratio(void) +{ + msr_t msr; + msr = rdmsr(MSR_TURBO_RATIO_LIMIT); + return msr.lo & 0xff; } diff --git a/src/soc/intel/common/block/include/intelblocks/cpulib.h b/src/soc/intel/common/block/include/intelblocks/cpulib.h index f4145219b5..3d40a920c6 100644 --- a/src/soc/intel/common/block/include/intelblocks/cpulib.h +++ b/src/soc/intel/common/block/include/intelblocks/cpulib.h @@ -121,4 +121,39 @@ void cpu_enable_untrusted_mode(void); */ int cpu_read_topology(unsigned int *num_phys, unsigned int *num_virt); +/* + * cpu_get_bus_clock returns the bus clock frequency in KHz. + * This is the value the clock ratio is multiplied with. + */ +uint32_t cpu_get_bus_clock(void); + +/* + * cpu_get_coord_type returns coordination type (SW_ANY or SW_ALL or HW_ALL) + * which is used to populate _PSD object. + */ +int cpu_get_coord_type(void); + +/* + * cpu_get_min_ratio returns the minimum frequency ratio that is supported + * by this processor + */ +uint32_t cpu_get_min_ratio(void); + +/* + * cpu_get_max_ratio returns the nominal TDP ratio if available or the + * maximum non turbo frequency ratio for this processor + */ +uint32_t cpu_get_max_ratio(void); + +/* + * cpu_get_power_max calculates CPU TDP in mW + */ +uint32_t cpu_get_power_max(void); + +/* + * cpu_get_max_turbo_ratio returns the maximum turbo ratio limit for the + * processor + */ +uint32_t cpu_get_max_turbo_ratio(void); + #endif /* SOC_INTEL_COMMON_BLOCK_CPULIB_H */ |