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>
This commit is contained in:
Shaunak Saha 2017-08-16 09:54:00 -07:00 committed by Aaron Durbin
parent 321111774c
commit 5f84310bb1
4 changed files with 93 additions and 102 deletions

View File

@ -31,47 +31,6 @@ int soc_fill_acpi_wake(uint32_t *pm1, uint32_t **gpe0);
#if IS_ENABLED(CONFIG_SOC_INTEL_COMMON_ACPI) #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 * get_cstate_map returns a table of processor specific acpi_cstate_t entries
* and number of entries in the table * and number of entries in the table

View File

@ -18,6 +18,7 @@
#include <arch/cpu.h> #include <arch/cpu.h>
#include <cpu/intel/turbo.h> #include <cpu/intel/turbo.h>
#include <cpu/x86/msr.h> #include <cpu/x86/msr.h>
#include <intelblocks/cpulib.h>
#include <soc/intel/common/acpi.h> #include <soc/intel/common/acpi.h>
#include <soc/pm.h> #include <soc/pm.h>
@ -34,66 +35,6 @@
#define PSS_LATENCY_BUSMASTER 10 #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) __attribute__((weak)) acpi_cstate_t *soc_get_cstate_map(int *entries)
{ {
*entries = 0; *entries = 0;

View File

@ -14,6 +14,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <arch/acpigen.h>
#include <arch/io.h> #include <arch/io.h>
#include <console/console.h> #include <console/console.h>
#include <cpu/intel/turbo.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); msr = rdmsr(MSR_CORE_THREAD_COUNT);
*num_virt = (msr.lo >> 0) & 0xffff; *num_virt = (msr.lo >> 0) & 0xffff;
*num_phys = (msr.lo >> 16) & 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;
} }

View File

@ -121,4 +121,39 @@ void cpu_enable_untrusted_mode(void);
*/ */
int cpu_read_topology(unsigned int *num_phys, unsigned int *num_virt); 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 */ #endif /* SOC_INTEL_COMMON_BLOCK_CPULIB_H */