From: Huang Rui <ray.huang@amd.com>
To: "Yuan, Perry" <Perry.Yuan@amd.com>
Cc: "rafael.j.wysocki@intel.com" <rafael.j.wysocki@intel.com>,
"Limonciello, Mario" <Mario.Limonciello@amd.com>,
"viresh.kumar@linaro.org" <viresh.kumar@linaro.org>,
"Sharma, Deepak" <Deepak.Sharma@amd.com>,
"Fontenot, Nathan" <Nathan.Fontenot@amd.com>,
"Deucher, Alexander" <Alexander.Deucher@amd.com>,
"Huang, Shimmer" <Shimmer.Huang@amd.com>,
"Du, Xiaojian" <Xiaojian.Du@amd.com>,
"Meng, Li (Jassmine)" <Li.Meng@amd.com>,
"Karny, Wyes" <Wyes.Karny@amd.com>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v8 09/13] cpufreq: amd-pstate: add driver working mode switch support
Date: Fri, 23 Dec 2022 16:56:20 +0800 [thread overview]
Message-ID: <Y6VtNOgfohaewEtW@amd.com> (raw)
In-Reply-To: <20221219064042.661122-10-perry.yuan@amd.com>
On Mon, Dec 19, 2022 at 02:40:38PM +0800, Yuan, Perry wrote:
> From: Perry Yuan <Perry.Yuan@amd.com>
>
> While amd-pstate driver was loaded with specific driver mode, it will
> need to check which mode is enabled for the pstate driver,add this sysfs
> entry to show the current status
>
> $ cat /sys/devices/system/cpu/amd-pstate/status
> active
>
> Meanwhile, user can switch the pstate driver mode with writing mode
> string to sysfs entry as below.
>
> Enable passive mode:
> $ sudo bash -c "echo passive > /sys/devices/system/cpu/amd-pstate/status"
>
> Enable active mode (EPP driver mode):
> $ sudo bash -c "echo active > /sys/devices/system/cpu/amd-pstate/status"
>
> Signed-off-by: Perry Yuan <Perry.Yuan@amd.com>
> ---
> drivers/cpufreq/amd-pstate.c | 128 +++++++++++++++++++++++++++++++++++
> 1 file changed, 128 insertions(+)
>
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index fc12d35bc7bd..e8996e937e63 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -64,6 +64,7 @@ static struct cpufreq_driver amd_pstate_driver;
> static struct cpufreq_driver amd_pstate_epp_driver;
> static struct amd_cpudata **all_cpu_data;
> static int cppc_state = AMD_PSTATE_DISABLE;
> +struct kobject *amd_pstate_kobj;
>
> static inline int get_mode_idx_from_str(const char *str, size_t size)
> {
> @@ -90,6 +91,8 @@ static struct amd_pstate_params global_params;
> static DEFINE_MUTEX(amd_pstate_limits_lock);
> static DEFINE_MUTEX(amd_pstate_driver_lock);
>
> +static DEFINE_SPINLOCK(cppc_notify_lock);
> +
> static s16 amd_pstate_get_epp(struct amd_cpudata *cpudata, u64 cppc_req_cached)
> {
> u64 epp;
> @@ -644,6 +647,8 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
> policy->driver_data = cpudata;
>
> amd_pstate_boost_init(cpudata);
> + if (!default_pstate_driver->adjust_perf)
> + default_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
If default_driver is passive driver, it will be programed as
amd_pstate_adjust_perf. If not, the epp driver won't need adjust_perf.
Thanks,
Ray
>
> return 0;
>
> @@ -784,12 +789,106 @@ static ssize_t show_energy_performance_preference(
> return sysfs_emit(buf, "%s\n", energy_perf_strings[preference]);
> }
>
> +static ssize_t amd_pstate_show_status(char *buf)
> +{
> + if (!default_pstate_driver)
> + return sysfs_emit(buf, "off\n");
> +
> + return sysfs_emit(buf, "%s\n", default_pstate_driver == &amd_pstate_epp_driver ?
> + "active" : "passive");
> +}
> +
> +static void amd_pstate_driver_cleanup(void)
> +{
> + unsigned int cpu;
> +
> + cpus_read_lock();
> + for_each_online_cpu(cpu) {
> + if (all_cpu_data[cpu]) {
> + spin_lock(&cppc_notify_lock);
> + kfree(all_cpu_data[cpu]);
> + WRITE_ONCE(all_cpu_data[cpu], NULL);
> + spin_unlock(&cppc_notify_lock);
> + }
> + }
> + cpus_read_unlock();
> +
> + default_pstate_driver = NULL;
> +}
> +
> +static int amd_pstate_update_status(const char *buf, size_t size)
> +{
> + if (size == 3 && !strncmp(buf, "off", size)) {
> + if (!default_pstate_driver)
> + return -EINVAL;
> +
> + if (cppc_state == AMD_PSTATE_ACTIVE)
> + return -EBUSY;
> +
> + cpufreq_unregister_driver(default_pstate_driver);
> + amd_pstate_driver_cleanup();
> + return 0;
> + }
> +
> + if (size == 6 && !strncmp(buf, "active", size)) {
> + if (default_pstate_driver) {
> + if (default_pstate_driver == &amd_pstate_epp_driver)
> + return 0;
> + cpufreq_unregister_driver(default_pstate_driver);
> + default_pstate_driver = &amd_pstate_epp_driver;
> + cppc_state = AMD_PSTATE_ACTIVE;
> + }
> +
> + return cpufreq_register_driver(default_pstate_driver);
> + }
> +
> + if (size == 7 && !strncmp(buf, "passive", size)) {
> + if (default_pstate_driver) {
> + if (default_pstate_driver == &amd_pstate_driver)
> + return 0;
> + cpufreq_unregister_driver(default_pstate_driver);
> + cppc_state = AMD_PSTATE_PASSIVE;
> + default_pstate_driver = &amd_pstate_driver;
> + }
> +
> + return cpufreq_register_driver(default_pstate_driver);
> + }
> +
> + return -EINVAL;
> +}
> +
> +static ssize_t show_status(struct kobject *kobj,
> + struct kobj_attribute *attr, char *buf)
> +{
> + ssize_t ret;
> +
> + mutex_lock(&amd_pstate_driver_lock);
> + ret = amd_pstate_show_status(buf);
> + mutex_unlock(&amd_pstate_driver_lock);
> +
> + return ret;
> +}
> +
> +static ssize_t store_status(struct kobject *a, struct kobj_attribute *b,
> + const char *buf, size_t count)
> +{
> + char *p = memchr(buf, '\n', count);
> + int ret;
> +
> + mutex_lock(&amd_pstate_driver_lock);
> + ret = amd_pstate_update_status(buf, p ? p - buf : count);
> + mutex_unlock(&amd_pstate_driver_lock);
> +
> + return ret < 0 ? ret : count;
> +}
> +
> cpufreq_freq_attr_ro(amd_pstate_max_freq);
> cpufreq_freq_attr_ro(amd_pstate_lowest_nonlinear_freq);
>
> cpufreq_freq_attr_ro(amd_pstate_highest_perf);
> cpufreq_freq_attr_rw(energy_performance_preference);
> cpufreq_freq_attr_ro(energy_performance_available_preferences);
> +define_one_global_rw(status);
>
> static struct freq_attr *amd_pstate_attr[] = {
> &amd_pstate_max_freq,
> @@ -807,6 +906,15 @@ static struct freq_attr *amd_pstate_epp_attr[] = {
> NULL,
> };
>
> +static struct attribute *pstate_global_attributes[] = {
> + &status.attr,
> + NULL
> +};
> +
> +static const struct attribute_group amd_pstate_global_attr_group = {
> + .attrs = pstate_global_attributes,
> +};
> +
> static inline void update_boost_state(void)
> {
> u64 misc_en;
> @@ -1228,6 +1336,26 @@ static int __init amd_pstate_init(void)
> if (ret)
> pr_err("failed to register with return %d\n", ret);
>
> + amd_pstate_kobj = kobject_create_and_add("amd-pstate", &cpu_subsys.dev_root->kobj);
> + if (!amd_pstate_kobj) {
> + ret = -EINVAL;
> + pr_err("global sysfs registration failed.\n");
> + goto kobject_free;
> + }
> +
> + ret = sysfs_create_group(amd_pstate_kobj, &amd_pstate_global_attr_group);
> + if (ret) {
> + pr_err("sysfs attribute export failed with error %d.\n", ret);
> + goto global_attr_free;
> + }
> +
> + return ret;
> +
> +global_attr_free:
> + kobject_put(amd_pstate_kobj);
> +kobject_free:
> + kfree(cpudata);
> + cpufreq_unregister_driver(default_pstate_driver);
> return ret;
> }
> device_initcall(amd_pstate_init);
> --
> 2.34.1
>
next prev parent reply other threads:[~2022-12-23 8:56 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-19 6:40 [PATCH v8 00/13] Implement AMD Pstate EPP Driver Perry Yuan
2022-12-19 6:40 ` [PATCH v8 01/13] ACPI: CPPC: Add AMD pstate energy performance preference cppc control Perry Yuan
2022-12-19 21:09 ` Limonciello, Mario
2022-12-23 2:16 ` Huang Rui
2022-12-23 3:19 ` Yuan, Perry
2022-12-23 9:06 ` Huang Rui
2022-12-25 16:41 ` Yuan, Perry
2022-12-19 6:40 ` [PATCH v8 02/13] Documentation: amd-pstate: add EPP profiles introduction Perry Yuan
2022-12-19 22:37 ` Limonciello, Mario
2022-12-19 6:40 ` [PATCH v8 03/13] cpufreq: intel_pstate: use common macro definition for Energy Preference Performance(EPP) Perry Yuan
2022-12-19 10:51 ` kernel test robot
2022-12-19 11:11 ` kernel test robot
2022-12-20 2:53 ` Mario Limonciello
2022-12-23 3:10 ` Huang Rui
2022-12-23 3:12 ` Yuan, Perry
2022-12-19 6:40 ` [PATCH v8 04/13] cpufreq: amd-pstate: fix kernel hang issue while amd-pstate unregistering Perry Yuan
2022-12-19 22:55 ` Limonciello, Mario
2022-12-19 6:40 ` [PATCH v8 05/13] cpufreq: amd-pstate: optimize driver working mode selection in amd_pstate_param() Perry Yuan
2022-12-19 10:11 ` kernel test robot
2022-12-19 23:01 ` Limonciello, Mario
2022-12-23 4:23 ` Huang Rui
2022-12-23 9:45 ` Wyes Karny
2022-12-25 16:41 ` Yuan, Perry
2022-12-19 6:40 ` [PATCH v8 06/13] cpufreq: amd-pstate: implement Pstate EPP support for the AMD processors Perry Yuan
2022-12-20 3:09 ` Mario Limonciello
2022-12-23 7:43 ` Huang Rui
2022-12-23 7:52 ` Yuan, Perry
2022-12-19 6:40 ` [PATCH v8 07/13] cpufreq: amd-pstate: implement amd pstate cpu online and offline callback Perry Yuan
2022-12-23 8:11 ` Huang Rui
2022-12-19 6:40 ` [PATCH v8 08/13] cpufreq: amd-pstate: implement suspend and resume callbacks Perry Yuan
2022-12-23 8:12 ` Huang Rui
2022-12-19 6:40 ` [PATCH v8 09/13] cpufreq: amd-pstate: add driver working mode switch support Perry Yuan
2022-12-19 23:38 ` Limonciello, Mario
2022-12-23 8:56 ` Huang Rui [this message]
2022-12-25 16:41 ` Yuan, Perry
2022-12-19 6:40 ` [PATCH v8 10/13] Documentation: amd-pstate: add amd pstate driver mode introduction Perry Yuan
2022-12-19 23:28 ` Limonciello, Mario
2022-12-19 6:40 ` [PATCH v8 11/13] Documentation: introduce amd pstate active mode kernel command line options Perry Yuan
2022-12-19 23:29 ` Limonciello, Mario
2022-12-19 6:40 ` [PATCH v8 12/13] cpufreq: amd-pstate: convert sprintf with sysfs_emit() Perry Yuan
2022-12-19 23:31 ` Limonciello, Mario
2022-12-25 16:42 ` Yuan, Perry
2022-12-23 7:45 ` Huang Rui
2022-12-19 6:40 ` [PATCH v8 13/13] Documentation: amd-pstate: introduce new global sysfs attributes Perry Yuan
2022-12-19 22:35 ` Limonciello, Mario
2022-12-20 18:13 ` [PATCH v8 00/13] Implement AMD Pstate EPP Driver Tor Vic
2022-12-20 18:52 ` Tor Vic
2022-12-21 3:08 ` Yuan, Perry
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=Y6VtNOgfohaewEtW@amd.com \
--to=ray.huang@amd.com \
--cc=Alexander.Deucher@amd.com \
--cc=Deepak.Sharma@amd.com \
--cc=Li.Meng@amd.com \
--cc=Mario.Limonciello@amd.com \
--cc=Nathan.Fontenot@amd.com \
--cc=Perry.Yuan@amd.com \
--cc=Shimmer.Huang@amd.com \
--cc=Wyes.Karny@amd.com \
--cc=Xiaojian.Du@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rafael.j.wysocki@intel.com \
--cc=viresh.kumar@linaro.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.