diff options
-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 */ |