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:
Felix Held 2023-03-24 00:07:24 +01:00
parent 2c9de49a97
commit ca8a8de999
7 changed files with 36 additions and 181 deletions

View File

@ -132,42 +132,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
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[] = {
[0] = {
.ctype = 1,

View File

@ -10,6 +10,42 @@
#include <soc/msr.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.
*/

View File

@ -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_pstate_core_freq(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);
#endif /* AMD_BLOCK_CPU_H */

View File

@ -109,42 +109,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
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[] = {
[0] = {
.ctype = 1,

View File

@ -134,42 +134,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
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[] = {
[0] = {
.ctype = 1,

View File

@ -135,42 +135,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
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[] = {
[0] = {
.ctype = 1,

View File

@ -136,42 +136,6 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
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[] = {
[0] = {
.ctype = 1,