Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/78224?usp=email )
Change subject: arch/x86/cpu_common: Add cpu_get_c_state_support ......................................................................
arch/x86/cpu_common: Add cpu_get_c_state_support
Add a function to get the number of substates supported by an Intel CPU C-state.
Test: Can read out the supported C-state substates.
Change-Id: Ie57e87609ea5d6ec6f37154e8b84f1e9574aa4a9 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/arch/x86/cpu_common.c M src/arch/x86/include/arch/cpu.h 2 files changed, 30 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/24/78224/1
diff --git a/src/arch/x86/cpu_common.c b/src/arch/x86/cpu_common.c index 9387f3b..f18b501 100644 --- a/src/arch/x86/cpu_common.c +++ b/src/arch/x86/cpu_common.c @@ -187,6 +187,23 @@ return info->num_ways * info->physical_partitions * info->line_size * info->num_sets; }
+/* + * Returns the sub-states supported by the specified CPU + * C-state level. + * + * Level 0 corresponds to the lowest C-state (C0). + * Higher levels are processor specific. + */ +uint8_t cpu_get_c_substate_support(const int state) +{ + if ((cpuid_get_max_func() < 5) || + !(cpuid_ecx(5) & CPUID_FEATURE_MONITOR_MWAIT) || + (state > 4)) + return 0; + + return (cpuid_edx(5) >> (state * 4)) & 0xf; +} + bool fill_cpu_cache_info(uint8_t level, struct cpu_cache_info *info) { if (!info) diff --git a/src/arch/x86/include/arch/cpu.h b/src/arch/x86/include/arch/cpu.h index 2c98d1e..f9517af 100644 --- a/src/arch/x86/include/arch/cpu.h +++ b/src/arch/x86/include/arch/cpu.h @@ -99,6 +99,10 @@ #define CPUID_CACHE_NO_OF_SETS_MASK 0xffffffff #define CPUID_CACHE_NO_OF_SETS(res) CPUID_CACHE(NO_OF_SETS, (res).ecx)
+// Intel leaf 0x5 +#define CPUID_FEATURE_MONITOR_MWAIT (1 << 0) +#define CPUID_FEATURE_INTERUPT_BREAK_EVENT (1 << 1) + unsigned int cpu_cpuid_extended_level(void); int cpu_have_cpuid(void);
@@ -311,6 +315,15 @@ size_t get_cache_size(const struct cpu_cache_info *info);
/* + * Returns the sub-states supported by the specified CPU + * C-state level. + * + * Level 0 corresponds to the lowest C-state (C0). + * Higher levels are processor specific. + */ +uint8_t cpu_get_c_substate_support(const int lvl); + +/* * fill_cpu_cache_info to get all required cache info data and fill into cpu_cache_info * structure by calling CPUID.EAX=leaf and ECX=Cache Level. */