soc/amd/phoenix: introduce and use pstate_msr bitfield struct
Add the pstate_msr union of a bitfield struct and a raw uint64_t to allow easier access of the bitfields of the P state MSRs and use this bitfield struct in get_pstate_core_freq and get_pstate_core_power. The signature of those two function will be changed in a follow-up commit. PPR #57019 Rev 1.65 and PPR #57396 Rev 1.54 were used as a reference as well as the reference code. This patch also adds and uses the cpu_vid_8 bit which is the 9th bit of the voltage ID specified in the SVI3 spec. Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: Ia024d32ae75cf2ffbc2a2e86a8b3af3dc6cbad61 Reviewed-on: https://review.coreboot.org/c/coreboot/+/73923 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> 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>
This commit is contained in:
@@ -102,13 +102,15 @@ uint32_t get_pstate_core_freq(msr_t pstate_def)
|
||||
{
|
||||
uint32_t core_freq, core_freq_mul, core_freq_div;
|
||||
bool valid_freq_divisor;
|
||||
union pstate_msr pstate_reg;
|
||||
|
||||
pstate_reg.raw = pstate_def.raw;
|
||||
|
||||
/* Core frequency multiplier */
|
||||
core_freq_mul = pstate_def.lo & PSTATE_DEF_LO_FREQ_MUL_MASK;
|
||||
core_freq_mul = pstate_reg.cpu_fid_0_7;
|
||||
|
||||
/* Core frequency divisor ID */
|
||||
core_freq_div =
|
||||
(pstate_def.lo & PSTATE_DEF_LO_FREQ_DIV_MASK) >> PSTATE_DEF_LO_FREQ_DIV_SHIFT;
|
||||
core_freq_div = pstate_reg.cpu_dfs_id;
|
||||
|
||||
if (core_freq_div == 0) {
|
||||
return 0;
|
||||
@@ -139,18 +141,18 @@ uint32_t get_pstate_core_freq(msr_t pstate_def)
|
||||
uint32_t get_pstate_core_power(msr_t pstate_def)
|
||||
{
|
||||
uint32_t voltage_in_uvolts, core_vid, current_value_amps, current_divisor, power_in_mw;
|
||||
union pstate_msr pstate_reg;
|
||||
|
||||
pstate_reg.raw = pstate_def.raw;
|
||||
|
||||
/* Core voltage ID */
|
||||
core_vid =
|
||||
(pstate_def.lo & PSTATE_DEF_LO_CORE_VID_MASK) >> PSTATE_DEF_LO_CORE_VID_SHIFT;
|
||||
core_vid = pstate_reg.cpu_vid_0_7 | pstate_reg.cpu_vid_8 << 8;
|
||||
|
||||
/* Current value in amps */
|
||||
current_value_amps =
|
||||
(pstate_def.lo & PSTATE_DEF_LO_CUR_VAL_MASK) >> PSTATE_DEF_LO_CUR_VAL_SHIFT;
|
||||
current_value_amps = pstate_reg.idd_value;
|
||||
|
||||
/* Current divisor */
|
||||
current_divisor =
|
||||
(pstate_def.lo & PSTATE_DEF_LO_CUR_DIV_MASK) >> PSTATE_DEF_LO_CUR_DIV_SHIFT;
|
||||
current_divisor = pstate_reg.idd_div;
|
||||
|
||||
/* Voltage */
|
||||
if (core_vid == 0x00) {
|
||||
|
Reference in New Issue
Block a user