x86: Add a few common Intel CPU functions
Add functions to query CPU information, needed for ACPI. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									abc585b745
								
							
						
					
					
						commit
						6c0da2da7c
					
				|  | @ -12,6 +12,7 @@ | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <log.h> | #include <log.h> | ||||||
|  | #include <acpi/acpigen.h> | ||||||
| #include <asm/cpu.h> | #include <asm/cpu.h> | ||||||
| #include <asm/cpu_common.h> | #include <asm/cpu_common.h> | ||||||
| #include <asm/intel_regs.h> | #include <asm/intel_regs.h> | ||||||
|  | @ -227,3 +228,66 @@ void cpu_set_eist(bool eist_status) | ||||||
| 		msr.lo &= ~MISC_ENABLE_ENHANCED_SPEEDSTEP; | 		msr.lo &= ~MISC_ENABLE_ENHANCED_SPEEDSTEP; | ||||||
| 	msr_write(MSR_IA32_MISC_ENABLE, msr); | 	msr_write(MSR_IA32_MISC_ENABLE, msr); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | int cpu_get_coord_type(void) | ||||||
|  | { | ||||||
|  | 	return HW_ALL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int cpu_get_min_ratio(void) | ||||||
|  | { | ||||||
|  | 	msr_t msr; | ||||||
|  | 
 | ||||||
|  | 	/* Get bus ratio limits and calculate clock speeds */ | ||||||
|  | 	msr = msr_read(MSR_PLATFORM_INFO); | ||||||
|  | 
 | ||||||
|  | 	return (msr.hi >> 8) & 0xff;	/* Max Efficiency Ratio */ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int cpu_get_max_ratio(void) | ||||||
|  | { | ||||||
|  | 	u32 ratio_max; | ||||||
|  | 	msr_t msr; | ||||||
|  | 
 | ||||||
|  | 	if (cpu_config_tdp_levels()) { | ||||||
|  | 		/* Set max ratio to nominal TDP ratio */ | ||||||
|  | 		msr = msr_read(MSR_CONFIG_TDP_NOMINAL); | ||||||
|  | 		ratio_max = msr.lo & 0xff; | ||||||
|  | 	} else { | ||||||
|  | 		msr = msr_read(MSR_PLATFORM_INFO); | ||||||
|  | 		/* Max Non-Turbo Ratio */ | ||||||
|  | 		ratio_max = (msr.lo >> 8) & 0xff; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return ratio_max; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int cpu_get_bus_clock_khz(void) | ||||||
|  | { | ||||||
|  | 	/*
 | ||||||
|  | 	 * CPU bus clock is set by default here to 100MHz. This function returns | ||||||
|  | 	 * the bus clock in KHz. | ||||||
|  | 	 */ | ||||||
|  | 	return INTEL_BCLK_MHZ * 1000; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int cpu_get_power_max(void) | ||||||
|  | { | ||||||
|  | 	int power_unit; | ||||||
|  | 	msr_t msr; | ||||||
|  | 
 | ||||||
|  | 	msr = msr_read(MSR_PKG_POWER_SKU_UNIT); | ||||||
|  | 	power_unit = 2 << ((msr.lo & 0xf) - 1); | ||||||
|  | 	msr = msr_read(MSR_PKG_POWER_SKU); | ||||||
|  | 
 | ||||||
|  | 	return (msr.lo & 0x7fff) * 1000 / power_unit; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int cpu_get_max_turbo_ratio(void) | ||||||
|  | { | ||||||
|  | 	msr_t msr; | ||||||
|  | 
 | ||||||
|  | 	msr = msr_read(MSR_TURBO_RATIO_LIMIT); | ||||||
|  | 
 | ||||||
|  | 	return msr.lo & 0xff; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -128,4 +128,53 @@ void cpu_set_eist(bool eist_status); | ||||||
|  */ |  */ | ||||||
| void cpu_set_p_state_to_turbo_ratio(void); | void cpu_set_p_state_to_turbo_ratio(void); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * cpu_get_coord_type() - Get the type of coordination for P-State transition | ||||||
|  |  * | ||||||
|  |  * See ACPI spec v6.3 section 8.4.6.5 _PSD (P-State Dependency) | ||||||
|  |  * | ||||||
|  |  * @return HW_ALL (always) | ||||||
|  |  */ | ||||||
|  | int cpu_get_coord_type(void); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * cpu_get_min_ratio() - get minimum support frequency ratio for CPU | ||||||
|  |  * | ||||||
|  |  * @return minimum ratio | ||||||
|  |  */ | ||||||
|  | int cpu_get_min_ratio(void); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * cpu_get_max_ratio() - get nominal TDP ration or max non-turbo ratio | ||||||
|  |  * | ||||||
|  |  * If a nominal TDP ratio is available, it is returned. Otherwise this returns | ||||||
|  |  * the  maximum non-turbo frequency ratio for this processor | ||||||
|  |  * | ||||||
|  |  * @return max ratio | ||||||
|  |  */ | ||||||
|  | int cpu_get_max_ratio(void); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * cpu_get_bus_clock_khz() - Get the bus clock frequency in KHz | ||||||
|  |  * | ||||||
|  |  * This is the value the clock ratio is multiplied with | ||||||
|  |  * | ||||||
|  |  * @return bus-block frequency in KHz | ||||||
|  |  */ | ||||||
|  | int cpu_get_bus_clock_khz(void); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * cpu_get_power_max() - Get maximum CPU TDP | ||||||
|  |  * | ||||||
|  |  * @return maximum CPU TDP (Thermal-design power) in mW | ||||||
|  |  */ | ||||||
|  | int cpu_get_power_max(void); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * cpu_get_max_turbo_ratio() - Get maximum turbo ratio | ||||||
|  |  * | ||||||
|  |  * @return maximum ratio | ||||||
|  |  */ | ||||||
|  | int cpu_get_max_turbo_ratio(void); | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -73,6 +73,18 @@ enum { | ||||||
| 	RETURN_OP		= 0xa4, | 	RETURN_OP		= 0xa4, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * enum psd_coord - Coordination types for P-states | ||||||
|  |  * | ||||||
|  |  * The type of coordination that exists (hardware) or is required (software) as | ||||||
|  |  * a result of the underlying hardware dependency | ||||||
|  |  */ | ||||||
|  | enum psd_coord { | ||||||
|  | 	SW_ALL = 0xfc, | ||||||
|  | 	SW_ANY = 0xfd, | ||||||
|  | 	HW_ALL = 0xfe | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * acpigen_get_current() - Get the current ACPI code output pointer |  * acpigen_get_current() - Get the current ACPI code output pointer | ||||||
|  * |  * | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue