From: Mario Limonciello <superm1@kernel.org>
To: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>,
"Gautham R . Shenoy" <gautham.shenoy@amd.com>,
Perry Yuan <perry.yuan@amd.com>
Cc: "open list:X86 ARCHITECTURE (32-BIT AND 64-BIT)"
<linux-kernel@vger.kernel.org>,
"open list:CPU FREQUENCY SCALING FRAMEWORK"
<linux-pm@vger.kernel.org>,
Mario Limonciello <mario.limonciello@amd.com>
Subject: Re: [PATCH v4 1/5] cpufreq/amd-pstate: Add dynamic energy performance preference
Date: Mon, 24 Mar 2025 20:34:16 -0500 [thread overview]
Message-ID: <784b2e21-10fb-44d8-b874-b6bc2ee238c6@kernel.org> (raw)
In-Reply-To: <4d224956-b4f9-4b0c-b5fb-70abe82e6ab5@amd.com>
On 3/24/2025 04:58, Dhananjay Ugwekar wrote:
> On 3/21/2025 7:58 AM, Mario Limonciello wrote:
>> From: Mario Limonciello <mario.limonciello@amd.com>
>>
>> Dynamic energy performance preference will change the EPP profile
>> based on whether the machine is running on AC or DC power.
>>
>> A notification chain from the power supply core is used to adjust
>> EPP values on plug in or plug out events.
>>
>> For non-server systems:
>> * the default EPP for AC mode is `performance`.
>> * the default EPP for DC mode is `balance_performance`.
>>
>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
>> ---
>> v3->v4:
>> * Handle Kconfig not being set
>> * Fix dynamic epp default on server
>> v2-v3:
>> * Fix typo in Kconfig
>> v1->v2:
>> * Change defaults to performance (AC) and balance_performance (DC)
>> * Default Kconfig to disabled for now
>> * Rebase on latest branch
>> ---
>> Documentation/admin-guide/pm/amd-pstate.rst | 18 ++-
>> drivers/cpufreq/Kconfig.x86 | 12 ++
>> drivers/cpufreq/amd-pstate.c | 135 +++++++++++++++++++-
>> drivers/cpufreq/amd-pstate.h | 5 +-
>> 4 files changed, 161 insertions(+), 9 deletions(-)
>>
> [snip]
>> @@ -1050,6 +1056,73 @@ static void amd_pstate_cpu_exit(struct cpufreq_policy *policy)
>> kfree(cpudata);
>> }
>>
>> +static int amd_pstate_get_balanced_epp(struct cpufreq_policy *policy)
>> +{
>> + struct amd_cpudata *cpudata = policy->driver_data;
>> +
>> + if (power_supply_is_system_supplied())
>> + return cpudata->epp_default_ac;
>> + else
>> + return cpudata->epp_default_dc;
>> +}
>> +
>> +static int amd_pstate_power_supply_notifier(struct notifier_block *nb,
>> + unsigned long event, void *data)
>> +{
>> + struct amd_cpudata *cpudata = container_of(nb, struct amd_cpudata, power_nb);
>> + struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpudata->cpu);
>
> For consistency, we should add "if (!policy)" check I think
>
>> + u8 epp;
>> + int ret;
>> +
>> + if (event != PSY_EVENT_PROP_CHANGED)
>> + return NOTIFY_OK;
>> +
>> + epp = amd_pstate_get_balanced_epp(policy);
>> +
>> + ret = amd_pstate_set_epp(policy, epp);
>> + if (ret)
>> + pr_warn("Failed to set CPU %d EPP %u: %d\n", cpudata->cpu, epp, ret);
>> +
>> + return NOTIFY_OK;
>> +}
> [snip]
>> @@ -1364,6 +1444,32 @@ static ssize_t prefcore_show(struct device *dev,
>> return sysfs_emit(buf, "%s\n", str_enabled_disabled(amd_pstate_prefcore));
>> }
>>
>> +static ssize_t dynamic_epp_show(struct device *dev,
>> + struct device_attribute *attr, char *buf)
>> +{
>> + return sysfs_emit(buf, "%s\n", str_enabled_disabled(dynamic_epp));
>> +}
>> +
>> +static ssize_t dynamic_epp_store(struct device *a, struct device_attribute *b,
>> + const char *buf, size_t count)
>> +{
>> + bool enabled;
>> + int ret;
>> +
>> + ret = kstrtobool(buf, &enabled);
>> + if (ret)
>> + return ret;
>> +
>> + if (dynamic_epp == enabled)
>> + return -EINVAL;
>> +
>> + /* reinitialize with desired dynamic EPP value */
>> + dynamic_epp = enabled;
>> + ret = amd_pstate_change_driver_mode(cppc_state);
>
> I think implicitly changing the driver mode when we write to dynamic_epp file might lead to some confusions.
How about only allowing to write dynamic_epp attribute when in active
mode already?
>
>> +
>> + return ret ? ret : count;
>> +}
>> +
>> cpufreq_freq_attr_ro(amd_pstate_max_freq);
>> cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
next prev parent reply other threads:[~2025-03-25 1:34 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-21 2:28 [PATCH v4 0/5] amd-pstate Dynamic EPP and raw EPP Mario Limonciello
2025-03-21 2:28 ` [PATCH v4 1/5] cpufreq/amd-pstate: Add dynamic energy performance preference Mario Limonciello
2025-03-24 8:19 ` Dhananjay Ugwekar
2025-03-25 1:31 ` Mario Limonciello
2025-03-24 9:58 ` Dhananjay Ugwekar
2025-03-25 1:34 ` Mario Limonciello [this message]
2025-03-25 4:30 ` Dhananjay Ugwekar
2025-03-21 2:28 ` [PATCH v4 2/5] cpufreq/amd-pstate: add kernel command line to override dynamic epp Mario Limonciello
2025-03-24 8:39 ` Dhananjay Ugwekar
2025-03-21 2:28 ` [PATCH v4 3/5] cpufreq/amd-pstate: Add support for platform profile class Mario Limonciello
2025-03-24 10:30 ` Dhananjay Ugwekar
2025-03-21 2:28 ` [PATCH v4 4/5] cpufreq/amd-pstate: Add support for raw EPP writes Mario Limonciello
2025-03-24 10:44 ` Dhananjay Ugwekar
2025-03-21 2:28 ` [PATCH v4 5/5] cpufreq/amd-pstate-ut: Add a unit test for raw EPP Mario Limonciello
2025-03-24 11:25 ` Dhananjay Ugwekar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=784b2e21-10fb-44d8-b874-b6bc2ee238c6@kernel.org \
--to=superm1@kernel.org \
--cc=Dhananjay.Ugwekar@amd.com \
--cc=gautham.shenoy@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=perry.yuan@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.