soc/amd: factor out common get_pstate_core_power implementation
Now that all get_pstate_core_power implementations in each SoC's acpi.c file is identical, factor it out into a common implementation. This implementation will also work for Stoneyridge which isn't using the common P state code yet. Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: Iba3833024a5e3ca5a47ffb1c1afdbfd884313c96 Reviewed-on: https://review.coreboot.org/c/coreboot/+/73997 Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com> Reviewed-by: Fred Reitberger <reitbergerfred@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
		@@ -132,42 +132,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
 | 
				
			|||||||
	return core_freq;
 | 
						return core_freq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Get Voltage from core voltage ID */
 | 
					 | 
				
			||||||
	voltage_in_uvolts = get_pstate_core_uvolts(pstate_reg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current value in amps */
 | 
					 | 
				
			||||||
	current_value_amps = pstate_reg.idd_value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current divisor */
 | 
					 | 
				
			||||||
	current_divisor = pstate_reg.idd_div;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Power in mW */
 | 
					 | 
				
			||||||
	power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (current_divisor) {
 | 
					 | 
				
			||||||
	case 0:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 100L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 1:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 1000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 2:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 10000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 3:
 | 
					 | 
				
			||||||
		/* current_divisor is set to an undefined value.*/
 | 
					 | 
				
			||||||
		printk(BIOS_WARNING, "Undefined current_divisor set for enabled P-state .\n");
 | 
					 | 
				
			||||||
		power_in_mw = 0;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return power_in_mw;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const acpi_cstate_t cstate_cfg_table[] = {
 | 
					const acpi_cstate_t cstate_cfg_table[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.ctype = 1,
 | 
							.ctype = 1,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,42 @@
 | 
				
			|||||||
#include <soc/msr.h>
 | 
					#include <soc/msr.h>
 | 
				
			||||||
#include <types.h>
 | 
					#include <types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get Voltage from core voltage ID */
 | 
				
			||||||
 | 
						voltage_in_uvolts = get_pstate_core_uvolts(pstate_reg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Current value in amps */
 | 
				
			||||||
 | 
						current_value_amps = pstate_reg.idd_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Current divisor */
 | 
				
			||||||
 | 
						current_divisor = pstate_reg.idd_div;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Power in mW */
 | 
				
			||||||
 | 
						power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (current_divisor) {
 | 
				
			||||||
 | 
						case 0:
 | 
				
			||||||
 | 
							power_in_mw = power_in_mw / 100L;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							power_in_mw = power_in_mw / 1000L;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							power_in_mw = power_in_mw / 10000L;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 3:
 | 
				
			||||||
 | 
							/* current_divisor is set to an undefined value.*/
 | 
				
			||||||
 | 
							printk(BIOS_WARNING, "Undefined current_divisor set for enabled P-state .\n");
 | 
				
			||||||
 | 
							power_in_mw = 0;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return power_in_mw;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Populate structure describing enabled p-states and return count of enabled p-states.
 | 
					 * Populate structure describing enabled p-states and return count of enabled p-states.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,6 @@ union pstate_msr; /* proper definition is in soc/msr.h */
 | 
				
			|||||||
uint32_t get_uvolts_from_vid(uint16_t core_vid);
 | 
					uint32_t get_uvolts_from_vid(uint16_t core_vid);
 | 
				
			||||||
uint32_t get_pstate_core_freq(union pstate_msr pstate_reg);
 | 
					uint32_t get_pstate_core_freq(union pstate_msr pstate_reg);
 | 
				
			||||||
uint32_t get_pstate_core_uvolts(union pstate_msr pstate_reg);
 | 
					uint32_t get_pstate_core_uvolts(union pstate_msr pstate_reg);
 | 
				
			||||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg);
 | 
					 | 
				
			||||||
const acpi_cstate_t *get_cstate_config_data(size_t *size);
 | 
					const acpi_cstate_t *get_cstate_config_data(size_t *size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* AMD_BLOCK_CPU_H */
 | 
					#endif /* AMD_BLOCK_CPU_H */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -109,42 +109,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
 | 
				
			|||||||
	return PSTATE_DEF_CORE_FREQ_BASE * core_freq_mul;
 | 
						return PSTATE_DEF_CORE_FREQ_BASE * core_freq_mul;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Get Voltage from core voltage ID */
 | 
					 | 
				
			||||||
	voltage_in_uvolts = get_pstate_core_uvolts(pstate_reg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current value in amps */
 | 
					 | 
				
			||||||
	current_value_amps = pstate_reg.idd_value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current divisor */
 | 
					 | 
				
			||||||
	current_divisor = pstate_reg.idd_div;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Power in mW */
 | 
					 | 
				
			||||||
	power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (current_divisor) {
 | 
					 | 
				
			||||||
	case 0:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 100L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 1:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 1000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 2:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 10000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 3:
 | 
					 | 
				
			||||||
		/* current_divisor is set to an undefined value.*/
 | 
					 | 
				
			||||||
		printk(BIOS_WARNING, "Undefined current_divisor set for enabled P-state .\n");
 | 
					 | 
				
			||||||
		power_in_mw = 0;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return power_in_mw;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const acpi_cstate_t cstate_cfg_table[] = {
 | 
					const acpi_cstate_t cstate_cfg_table[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.ctype = 1,
 | 
							.ctype = 1,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -134,42 +134,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
 | 
				
			|||||||
	return core_freq;
 | 
						return core_freq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Get Voltage from core voltage ID */
 | 
					 | 
				
			||||||
	voltage_in_uvolts = get_pstate_core_uvolts(pstate_reg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current value in amps */
 | 
					 | 
				
			||||||
	current_value_amps = pstate_reg.idd_value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current divisor */
 | 
					 | 
				
			||||||
	current_divisor = pstate_reg.idd_div;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Power in mW */
 | 
					 | 
				
			||||||
	power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (current_divisor) {
 | 
					 | 
				
			||||||
	case 0:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 100L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 1:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 1000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 2:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 10000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 3:
 | 
					 | 
				
			||||||
		/* current_divisor is set to an undefined value.*/
 | 
					 | 
				
			||||||
		printk(BIOS_WARNING, "Undefined current_divisor set for enabled P-state .\n");
 | 
					 | 
				
			||||||
		power_in_mw = 0;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return power_in_mw;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const acpi_cstate_t cstate_cfg_table[] = {
 | 
					const acpi_cstate_t cstate_cfg_table[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.ctype = 1,
 | 
							.ctype = 1,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -135,42 +135,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
 | 
				
			|||||||
	return core_freq;
 | 
						return core_freq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Get Voltage from core voltage ID */
 | 
					 | 
				
			||||||
	voltage_in_uvolts = get_pstate_core_uvolts(pstate_reg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current value in amps */
 | 
					 | 
				
			||||||
	current_value_amps = pstate_reg.idd_value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current divisor */
 | 
					 | 
				
			||||||
	current_divisor = pstate_reg.idd_div;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Power in mW */
 | 
					 | 
				
			||||||
	power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (current_divisor) {
 | 
					 | 
				
			||||||
	case 0:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 100L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 1:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 1000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 2:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 10000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 3:
 | 
					 | 
				
			||||||
		/* current_divisor is set to an undefined value.*/
 | 
					 | 
				
			||||||
		printk(BIOS_WARNING, "Undefined current_divisor set for enabled P-state .\n");
 | 
					 | 
				
			||||||
		power_in_mw = 0;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return power_in_mw;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const acpi_cstate_t cstate_cfg_table[] = {
 | 
					const acpi_cstate_t cstate_cfg_table[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.ctype = 1,
 | 
							.ctype = 1,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -136,42 +136,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
 | 
				
			|||||||
	return core_freq;
 | 
						return core_freq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Get Voltage from core voltage ID */
 | 
					 | 
				
			||||||
	voltage_in_uvolts = get_pstate_core_uvolts(pstate_reg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current value in amps */
 | 
					 | 
				
			||||||
	current_value_amps = pstate_reg.idd_value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Current divisor */
 | 
					 | 
				
			||||||
	current_divisor = pstate_reg.idd_div;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Power in mW */
 | 
					 | 
				
			||||||
	power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (current_divisor) {
 | 
					 | 
				
			||||||
	case 0:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 100L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 1:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 1000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 2:
 | 
					 | 
				
			||||||
		power_in_mw = power_in_mw / 10000L;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case 3:
 | 
					 | 
				
			||||||
		/* current_divisor is set to an undefined value.*/
 | 
					 | 
				
			||||||
		printk(BIOS_WARNING, "Undefined current_divisor set for enabled P-state .\n");
 | 
					 | 
				
			||||||
		power_in_mw = 0;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return power_in_mw;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const acpi_cstate_t cstate_cfg_table[] = {
 | 
					const acpi_cstate_t cstate_cfg_table[] = {
 | 
				
			||||||
	[0] = {
 | 
						[0] = {
 | 
				
			||||||
		.ctype = 1,
 | 
							.ctype = 1,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user