From: "Gautham R. Shenoy" <gautham.shenoy@amd.com>
To: Mario Limonciello <superm1@kernel.org>
Cc: Perry Yuan <perry.yuan@amd.com>,
Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>,
"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 v2 1/5] cpufreq/amd-pstate: Add dynamic energy performance preference
Date: Fri, 7 Mar 2025 12:15:31 +0530 [thread overview]
Message-ID: <Z8qWCyb8Jexb180g@BLRRASHENOY1.amd.com> (raw)
In-Reply-To: <20250304152327.1561017-2-superm1@kernel.org>
Hello Mario,
On Tue, Mar 04, 2025 at 09:23:23AM -0600, 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>
> ---
> 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 | 129 ++++++++++++++++++--
> drivers/cpufreq/amd-pstate.h | 5 +-
> 4 files changed, 155 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
> index 412423c54f258..2e076650dc77c 100644
> --- a/Documentation/admin-guide/pm/amd-pstate.rst
> +++ b/Documentation/admin-guide/pm/amd-pstate.rst
[...snip..]
> @@ -311,6 +311,22 @@ boost or `1` to enable it, for the respective CPU using the sysfs path
> Other performance and frequency values can be read back from
> ``/sys/devices/system/cpu/cpuX/acpi_cppc/``, see :ref:`cppc_sysfs`.
>
> +Dynamic energy performance profile
> +==================================
> +The amd-pstate driver supports dynamically selecting the energy performance
> +profile based on whether the machine is running on AC or DC power.
> +
> +Whether this behavior is enabled by default with the kernel config option
> +`CONFIG_X86_AMD_PSTATE_DYNAMIC_EPP`. This behavior can also be overridden
> +at runtime by the sysfs file ``/sys/devices/system/cpu/cpufreq/policyX/dynamic_epp``.
> +
> +When set to enabled, the driver will select a different energy performance
> +profile when the machine is running on battery or AC power.
> +When set to disabled, the driver will not change the energy performance profile
> +based on the power source and will not react to user desired power state.
> +
> +Attempting to manually write to the ``energy_performance_preference`` sysfs
> +file will fail when ``dynamic_epp`` is enabled.
>
> ``amd-pstate`` vs ``acpi-cpufreq``
> ======================================
> diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86
> index 97c2d4f15d76e..c5ef92634ddf4 100644
> --- a/drivers/cpufreq/Kconfig.x86
> +++ b/drivers/cpufreq/Kconfig.x86
> @@ -68,6 +68,18 @@ config X86_AMD_PSTATE_DEFAULT_MODE
> For details, take a look at:
> <file:Documentation/admin-guide/pm/amd-pstate.rst>.
>
> +config X86_AMD_PSTATE_DYNAMIC_EPP
> + bool "AMD Processor P-State dynamic EPP support"
> + depends on X86_AMD_PSTATE
> + default n
> + help
> + Allow the kenrel to dynamically change the energy performance
^^^^^^
kernel
> + value from events like ACPI platform profile and AC adapter plug
> + events.
> +
> + This feature can also be changed at runtime, this configuration
> + option only sets the kernel default value behavior.
> +
> config X86_AMD_PSTATE_UT
> tristate "selftest for AMD Processor P-State driver"
> depends on X86 && ACPI_PROCESSOR
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index e98ef41083ba1..f00fb4ba9f26e 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -36,6 +36,7 @@
> #include <linux/io.h>
> #include <linux/delay.h>
> #include <linux/uaccess.h>
> +#include <linux/power_supply.h>
> #include <linux/static_call.h>
> #include <linux/topology.h>
>
> @@ -86,6 +87,7 @@ static struct cpufreq_driver amd_pstate_driver;
> static struct cpufreq_driver amd_pstate_epp_driver;
> static int cppc_state = AMD_PSTATE_UNDEFINED;
> static bool amd_pstate_prefcore = true;
> +static bool dynamic_epp = CONFIG_X86_AMD_PSTATE_DYNAMIC_EPP;
> static struct quirk_entry *quirks;
>
> /*
> @@ -1050,6 +1052,73 @@ static void amd_pstate_cpu_exit(struct cpufreq_policy *policy)
> kfree(cpudata);
> }
>
> +static int amd_pstate_get_balanced_epp(struct cpufreq_policy *policy)
Can we rename this function as amd_pstate_get_dynamic_epp() ?
Because the values being returned may not be
balance_performance/balance_power.
> +{
> + 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);
> + 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;
> +}
> +static void amd_pstate_clear_dynamic_epp(struct cpufreq_policy *policy)
> +{
> + struct amd_cpudata *cpudata = policy->driver_data;
> +
> + if (cpudata->power_nb.notifier_call)
> + power_supply_unreg_notifier(&cpudata->power_nb);
> + cpudata->dynamic_epp = false;
> +}
> +
> +static int amd_pstate_set_dynamic_epp(struct cpufreq_policy *policy)
> +{
> + struct amd_cpudata *cpudata = policy->driver_data;
> + int ret;
> + u8 epp;
> +
> + epp = amd_pstate_get_balanced_epp(policy);
> + ret = amd_pstate_set_epp(policy, epp);
> + if (ret)
> + return ret;
> +
> + /* only enable notifier if things will actually change */
> + if (cpudata->epp_default_ac != cpudata->epp_default_dc) {
> + ret = power_supply_reg_notifier(&cpudata->power_nb);
> + if (ret)
> + goto cleanup;
> + cpudata->power_nb.notifier_call = amd_pstate_power_supply_notifier;
> + }
> +
> + cpudata->dynamic_epp = true;
> +
> + return 0;
> +
> +cleanup:
> + amd_pstate_clear_dynamic_epp(policy);
> +
> + return ret;
> +}
> +
> /* Sysfs attributes */
>
> /*
> @@ -1146,6 +1215,11 @@ static ssize_t store_energy_performance_preference(
> ssize_t ret;
> u8 epp;
>
> + if (cpudata->dynamic_epp) {
> + pr_debug("EPP cannot be set when dynamic EPP is enabled\n");
> + return -EBUSY;
> + }
> +
> ret = sscanf(buf, "%20s", str_preference);
> if (ret != 1)
> return -EINVAL;
> @@ -1154,10 +1228,10 @@ static ssize_t store_energy_performance_preference(
> if (ret < 0)
> return -EINVAL;
>
> - if (!ret)
> - epp = cpudata->epp_default;
> - else
> + if (ret)
> epp = epp_values[ret];
> + else
> + epp = amd_pstate_get_balanced_epp(policy);
>
> if (epp > 0 && policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
> pr_debug("EPP cannot be set under performance policy\n");
> @@ -1165,6 +1239,8 @@ static ssize_t store_energy_performance_preference(
> }
>
> ret = amd_pstate_set_epp(policy, epp);
> + if (ret)
> + return ret;
Isn't this unecessary given that the next line is doing exactly this ?
>
> return ret ? ret : count;
> }
Rest of the patch looks good to me.
--
Thanks and Regards
gautham.
next prev parent reply other threads:[~2025-03-07 6:45 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-04 15:23 [PATCH v2 0/5] amd-pstate Dynamic EPP and raw EPP Mario Limonciello
2025-03-04 15:23 ` [PATCH v2 1/5] cpufreq/amd-pstate: Add dynamic energy performance preference Mario Limonciello
2025-03-07 6:45 ` Gautham R. Shenoy [this message]
2025-03-11 6:34 ` Dhananjay Ugwekar
2025-03-18 19:08 ` Mario Limonciello
2025-03-12 12:16 ` Dhananjay Ugwekar
2025-03-18 19:36 ` Mario Limonciello
2025-03-19 3:43 ` Dhananjay Ugwekar
2025-03-19 16:50 ` Mario Limonciello
2025-03-19 17:13 ` Mario Limonciello
2025-03-04 15:23 ` [PATCH v2 2/5] cpufreq/amd-pstate: add kernel command line to override dynamic epp Mario Limonciello
2025-03-07 8:53 ` Gautham R. Shenoy
2025-03-04 15:23 ` [PATCH v2 3/5] cpufreq/amd-pstate: Add support for platform profile class Mario Limonciello
2025-03-07 16:22 ` Gautham R. Shenoy
2025-03-07 16:55 ` Mario Limonciello
2025-03-08 4:30 ` Mario Limonciello
2025-03-10 5:09 ` Gautham R. Shenoy
2025-03-18 19:07 ` Mario Limonciello
2025-03-04 15:23 ` [PATCH v2 4/5] cpufreq/amd-pstate: Add support for raw EPP writes Mario Limonciello
2025-03-04 15:23 ` [PATCH v2 5/5] cpufreq/amd-pstate-ut: Add a unit test for raw EPP Mario Limonciello
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=Z8qWCyb8Jexb180g@BLRRASHENOY1.amd.com \
--to=gautham.shenoy@amd.com \
--cc=Dhananjay.Ugwekar@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=perry.yuan@amd.com \
--cc=superm1@kernel.org \
/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.