soc/amd: introduce and use get_pstate_core_uvolts for SVI2 and SVI3
Since SVI3 has the CPU voltage ID split into two parts, a serial voltage ID version specific function is needed to get the raw core VID value. This will allow making get_pstate_core_power common for all AMD CPUs in a follow-up patch. Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: I71ca88c38b307558905a26cce8be1e8ffc5fbed4 Reviewed-on: https://review.coreboot.org/c/coreboot/+/73996 Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com> Reviewed-by: Fred Reitberger <reitbergerfred@gmail.com> Reviewed-by: Matt DeVillier <matt.devillier@amd.corp-partner.google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
23a398e001
commit
2c9de49a97
|
@ -134,10 +134,10 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
|
|||
|
||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
||||
{
|
||||
uint32_t voltage_in_uvolts, core_vid, current_value_amps, current_divisor, power_in_mw;
|
||||
uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
|
||||
|
||||
/* Core voltage ID */
|
||||
core_vid = pstate_reg.cpu_vid_0_7;
|
||||
/* 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;
|
||||
|
@ -145,9 +145,6 @@ uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
|||
/* Current divisor */
|
||||
current_divisor = pstate_reg.idd_div;
|
||||
|
||||
/* Voltage */
|
||||
voltage_in_uvolts = get_uvolts_from_vid(core_vid);
|
||||
|
||||
/* Power in mW */
|
||||
power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#include <amdblocks/cpu.h>
|
||||
#include <soc/msr.h>
|
||||
#include <types.h>
|
||||
|
||||
/* Value defined in Serial VID Interface 2.0 spec (#48022, NDA only) */
|
||||
|
@ -17,3 +18,8 @@ uint32_t get_uvolts_from_vid(uint16_t core_vid)
|
|||
(SERIAL_VID_2_DECODE_MICROVOLTS * core_vid);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t get_pstate_core_uvolts(union pstate_msr pstate_reg)
|
||||
{
|
||||
return get_uvolts_from_vid(pstate_reg.cpu_vid_0_7);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#include <amdblocks/cpu.h>
|
||||
#include <soc/msr.h>
|
||||
#include <types.h>
|
||||
|
||||
/* Value defined in Serial VID Interface 3.0 spec (#56413, NDA only) */
|
||||
|
@ -17,3 +18,8 @@ uint32_t get_uvolts_from_vid(uint16_t core_vid)
|
|||
(SERIAL_VID_3_DECODE_MICROVOLTS * core_vid);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t get_pstate_core_uvolts(union pstate_msr pstate_reg)
|
||||
{
|
||||
return get_uvolts_from_vid(pstate_reg.cpu_vid_0_7 | pstate_reg.cpu_vid_8 << 8);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ 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);
|
||||
|
||||
|
|
|
@ -111,10 +111,10 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
|
|||
|
||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
||||
{
|
||||
uint32_t voltage_in_uvolts, core_vid, current_value_amps, current_divisor, power_in_mw;
|
||||
uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
|
||||
|
||||
/* Core voltage ID */
|
||||
core_vid = pstate_reg.cpu_vid_0_7 | pstate_reg.cpu_vid_8 << 8;
|
||||
/* 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;
|
||||
|
@ -122,9 +122,6 @@ uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
|||
/* Current divisor */
|
||||
current_divisor = pstate_reg.idd_div;
|
||||
|
||||
/* Voltage */
|
||||
voltage_in_uvolts = get_uvolts_from_vid(core_vid);
|
||||
|
||||
/* Power in mW */
|
||||
power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
|
||||
|
||||
|
|
|
@ -136,10 +136,10 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
|
|||
|
||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
||||
{
|
||||
uint32_t voltage_in_uvolts, core_vid, current_value_amps, current_divisor, power_in_mw;
|
||||
uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
|
||||
|
||||
/* Core voltage ID */
|
||||
core_vid = pstate_reg.cpu_vid_0_7 | pstate_reg.cpu_vid_8 << 8;
|
||||
/* 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;
|
||||
|
@ -147,9 +147,6 @@ uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
|||
/* Current divisor */
|
||||
current_divisor = pstate_reg.idd_div;
|
||||
|
||||
/* Voltage */
|
||||
voltage_in_uvolts = get_uvolts_from_vid(core_vid);
|
||||
|
||||
/* Power in mW */
|
||||
power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
|
||||
|
||||
|
|
|
@ -137,10 +137,10 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
|
|||
|
||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
||||
{
|
||||
uint32_t voltage_in_uvolts, core_vid, current_value_amps, current_divisor, power_in_mw;
|
||||
uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
|
||||
|
||||
/* Core voltage ID */
|
||||
core_vid = pstate_reg.cpu_vid_0_7 | pstate_reg.cpu_vid_8 << 8;
|
||||
/* 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;
|
||||
|
@ -148,9 +148,6 @@ uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
|||
/* Current divisor */
|
||||
current_divisor = pstate_reg.idd_div;
|
||||
|
||||
/* Voltage */
|
||||
voltage_in_uvolts = get_uvolts_from_vid(core_vid);
|
||||
|
||||
/* Power in mW */
|
||||
power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
|
||||
|
||||
|
|
|
@ -138,10 +138,10 @@ uint32_t get_pstate_core_freq(union pstate_msr pstate_reg)
|
|||
|
||||
uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
||||
{
|
||||
uint32_t voltage_in_uvolts, core_vid, current_value_amps, current_divisor, power_in_mw;
|
||||
uint32_t voltage_in_uvolts, current_value_amps, current_divisor, power_in_mw;
|
||||
|
||||
/* Core voltage ID */
|
||||
core_vid = pstate_reg.cpu_vid_0_7;
|
||||
/* 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;
|
||||
|
@ -149,9 +149,6 @@ uint32_t get_pstate_core_power(union pstate_msr pstate_reg)
|
|||
/* Current divisor */
|
||||
current_divisor = pstate_reg.idd_div;
|
||||
|
||||
/* Voltage */
|
||||
voltage_in_uvolts = get_uvolts_from_vid(core_vid);
|
||||
|
||||
/* Power in mW */
|
||||
power_in_mw = (voltage_in_uvolts) / 10 * current_value_amps;
|
||||
|
||||
|
|
Loading…
Reference in New Issue