Skip to content

Commit fcf27a6

Browse files
superm1ij-intel
authored andcommitted
platform/x86: amd: pmf: Fix STT limits
On some platforms it has been observed that STT limits are not being applied properly causing poor performance as power limits are set too low. STT limits that are sent to the platform are supposed to be in Q8.8 format. Convert them before sending. Reported-by: Yijun Shen <[email protected]> Fixes: 7c45534 ("platform/x86/amd/pmf: Add support for PMF Policy Binary") Cc: [email protected] Tested-by: Yijun Shen <[email protected]> Signed-off-by: Mario Limonciello <[email protected]> Acked-by: Shyam Sundar S K <[email protected]> Reviewed-by: Ilpo Järvinen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Ilpo Järvinen <[email protected]>
1 parent b129005 commit fcf27a6

File tree

6 files changed

+33
-12
lines changed

6 files changed

+33
-12
lines changed

drivers/platform/x86/amd/pmf/auto-mode.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ static void amd_pmf_set_automode(struct amd_pmf_dev *dev, int idx,
120120
amd_pmf_send_cmd(dev, SET_SPPT_APU_ONLY, false, pwr_ctrl->sppt_apu_only, NULL);
121121
amd_pmf_send_cmd(dev, SET_STT_MIN_LIMIT, false, pwr_ctrl->stt_min, NULL);
122122
amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false,
123-
pwr_ctrl->stt_skin_temp[STT_TEMP_APU], NULL);
123+
fixp_q88_fromint(pwr_ctrl->stt_skin_temp[STT_TEMP_APU]), NULL);
124124
amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false,
125-
pwr_ctrl->stt_skin_temp[STT_TEMP_HS2], NULL);
125+
fixp_q88_fromint(pwr_ctrl->stt_skin_temp[STT_TEMP_HS2]), NULL);
126126

127127
if (is_apmf_func_supported(dev, APMF_FUNC_SET_FAN_IDX))
128128
apmf_update_fan_idx(dev, config_store.mode_set[idx].fan_control.manual,

drivers/platform/x86/amd/pmf/cnqf.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ static int amd_pmf_set_cnqf(struct amd_pmf_dev *dev, int src, int idx,
8181
amd_pmf_send_cmd(dev, SET_SPPT, false, pc->sppt, NULL);
8282
amd_pmf_send_cmd(dev, SET_SPPT_APU_ONLY, false, pc->sppt_apu_only, NULL);
8383
amd_pmf_send_cmd(dev, SET_STT_MIN_LIMIT, false, pc->stt_min, NULL);
84-
amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false, pc->stt_skin_temp[STT_TEMP_APU],
85-
NULL);
86-
amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false, pc->stt_skin_temp[STT_TEMP_HS2],
87-
NULL);
84+
amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false,
85+
fixp_q88_fromint(pc->stt_skin_temp[STT_TEMP_APU]), NULL);
86+
amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false,
87+
fixp_q88_fromint(pc->stt_skin_temp[STT_TEMP_HS2]), NULL);
8888

8989
if (is_apmf_func_supported(dev, APMF_FUNC_SET_FAN_IDX))
9090
apmf_update_fan_idx(dev,

drivers/platform/x86/amd/pmf/core.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,20 @@ static void __maybe_unused amd_pmf_dump_registers(struct amd_pmf_dev *dev)
176176
dev_dbg(dev->dev, "AMD_PMF_REGISTER_MESSAGE:%x\n", value);
177177
}
178178

179+
/**
180+
* fixp_q88_fromint: Convert integer to Q8.8
181+
* @val: input value
182+
*
183+
* Converts an integer into binary fixed point format where 8 bits
184+
* are used for integer and 8 bits are used for the decimal.
185+
*
186+
* Return: unsigned integer converted to Q8.8 format
187+
*/
188+
u32 fixp_q88_fromint(u32 val)
189+
{
190+
return val << 8;
191+
}
192+
179193
int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32 *data)
180194
{
181195
int rc;

drivers/platform/x86/amd/pmf/pmf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,7 @@ int apmf_install_handler(struct amd_pmf_dev *pmf_dev);
777777
int apmf_os_power_slider_update(struct amd_pmf_dev *dev, u8 flag);
778778
int amd_pmf_set_dram_addr(struct amd_pmf_dev *dev, bool alloc_buffer);
779779
int amd_pmf_notify_sbios_heartbeat_event_v2(struct amd_pmf_dev *dev, u8 flag);
780+
u32 fixp_q88_fromint(u32 val);
780781

781782
/* SPS Layer */
782783
int amd_pmf_get_pprof_modes(struct amd_pmf_dev *pmf);

drivers/platform/x86/amd/pmf/sps.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,11 @@ static void amd_pmf_update_slider_v2(struct amd_pmf_dev *dev, int idx)
198198
amd_pmf_send_cmd(dev, SET_STT_MIN_LIMIT, false,
199199
apts_config_store.val[idx].stt_min_limit, NULL);
200200
amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false,
201-
apts_config_store.val[idx].stt_skin_temp_limit_apu, NULL);
201+
fixp_q88_fromint(apts_config_store.val[idx].stt_skin_temp_limit_apu),
202+
NULL);
202203
amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false,
203-
apts_config_store.val[idx].stt_skin_temp_limit_hs2, NULL);
204+
fixp_q88_fromint(apts_config_store.val[idx].stt_skin_temp_limit_hs2),
205+
NULL);
204206
}
205207

206208
void amd_pmf_update_slider(struct amd_pmf_dev *dev, bool op, int idx,
@@ -217,9 +219,11 @@ void amd_pmf_update_slider(struct amd_pmf_dev *dev, bool op, int idx,
217219
amd_pmf_send_cmd(dev, SET_STT_MIN_LIMIT, false,
218220
config_store.prop[src][idx].stt_min, NULL);
219221
amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false,
220-
config_store.prop[src][idx].stt_skin_temp[STT_TEMP_APU], NULL);
222+
fixp_q88_fromint(config_store.prop[src][idx].stt_skin_temp[STT_TEMP_APU]),
223+
NULL);
221224
amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false,
222-
config_store.prop[src][idx].stt_skin_temp[STT_TEMP_HS2], NULL);
225+
fixp_q88_fromint(config_store.prop[src][idx].stt_skin_temp[STT_TEMP_HS2]),
226+
NULL);
223227
} else if (op == SLIDER_OP_GET) {
224228
amd_pmf_send_cmd(dev, GET_SPL, true, ARG_NONE, &table->prop[src][idx].spl);
225229
amd_pmf_send_cmd(dev, GET_FPPT, true, ARG_NONE, &table->prop[src][idx].fppt);

drivers/platform/x86/amd/pmf/tee-if.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,17 @@ static void amd_pmf_apply_policies(struct amd_pmf_dev *dev, struct ta_pmf_enact_
123123

124124
case PMF_POLICY_STT_SKINTEMP_APU:
125125
if (dev->prev_data->stt_skintemp_apu != val) {
126-
amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false, val, NULL);
126+
amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false,
127+
fixp_q88_fromint(val), NULL);
127128
dev_dbg(dev->dev, "update STT_SKINTEMP_APU: %u\n", val);
128129
dev->prev_data->stt_skintemp_apu = val;
129130
}
130131
break;
131132

132133
case PMF_POLICY_STT_SKINTEMP_HS2:
133134
if (dev->prev_data->stt_skintemp_hs2 != val) {
134-
amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false, val, NULL);
135+
amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false,
136+
fixp_q88_fromint(val), NULL);
135137
dev_dbg(dev->dev, "update STT_SKINTEMP_HS2: %u\n", val);
136138
dev->prev_data->stt_skintemp_hs2 = val;
137139
}

0 commit comments

Comments
 (0)