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; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * 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) | ||||
|   | ||||
| @@ -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(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); | ||||
|  | ||||
| @@ -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. */ | ||||
| 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 | ||||
|  * structure by calling CPUID.EAX=leaf and ECX=Cache Level. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user