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:
		
				
					committed by
					
						 Felix Held
						Felix Held
					
				
			
			
				
	
			
			
			
						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. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user