arch/x86/cpu_common: Add cpu_get_c_substate_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> Reviewed-on: https://review.coreboot.org/c/coreboot/+/78224 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
This commit is contained in:
parent
6a249d688e
commit
6a13b520e9
|
@ -187,6 +187,22 @@ size_t get_cache_size(const struct cpu_cache_info *info)
|
||||||
return info->num_ways * info->physical_partitions * info->line_size * info->num_sets;
|
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)
|
bool fill_cpu_cache_info(uint8_t level, struct cpu_cache_info *info)
|
||||||
{
|
{
|
||||||
if (!info)
|
if (!info)
|
||||||
|
|
|
@ -99,6 +99,10 @@ static inline unsigned int cpuid_get_max_func(void)
|
||||||
#define CPUID_CACHE_NO_OF_SETS_MASK 0xffffffff
|
#define CPUID_CACHE_NO_OF_SETS_MASK 0xffffffff
|
||||||
#define CPUID_CACHE_NO_OF_SETS(res) CPUID_CACHE(NO_OF_SETS, (res).ecx)
|
#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);
|
unsigned int cpu_cpuid_extended_level(void);
|
||||||
int cpu_have_cpuid(void);
|
int cpu_have_cpuid(void);
|
||||||
|
|
||||||
|
@ -310,6 +314,15 @@ size_t cpu_get_max_cache_share(const struct cpu_cache_info *info);
|
||||||
/* get_cache_size to calculate the cache size. */
|
/* get_cache_size to calculate the cache size. */
|
||||||
size_t get_cache_size(const struct cpu_cache_info *info);
|
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 state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fill_cpu_cache_info to get all required cache info data and fill into cpu_cache_info
|
* 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.
|
* structure by calling CPUID.EAX=leaf and ECX=Cache Level.
|
||||||
|
|
Loading…
Reference in New Issue