From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
To: xinx.sun@intel.com, rjw@rjwysocki.net, jacob.jun.pan@linux.intel.com
Cc: zhen.han@intel.com, chaox.m.wang@intel.com,
linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] powercap: add suspend and resume mechanism for SOC power limit
Date: Tue, 09 Jan 2018 17:47:10 -0800 [thread overview]
Message-ID: <1515548830.69545.28.camel@linux.intel.com> (raw)
In-Reply-To: <1515544703-19409-1-git-send-email-xinx.sun@intel.com>
On Wed, 2018-01-10 at 08:38 +0800, xinx.sun@intel.com wrote:
> From: Zhen Han <zhen.han@intel.com>
>
> PL1 and PL2 could be throlled or de-throttled by
> Thermal management to control SOC temperature.
> However, currently, their value will be reset to default value
> after once system suspend and resume.
> Add pm_notifier to save PL1, PL2 before system suspect and restore
> PL1, PL2 after system resume.
>
Why are you posting this patch again?
If there any change from your prior post?
Thanks,
Srinivas
> Signed-off-by: Zhen Han <zhen.han@intel.com>
> ---
> drivers/powercap/intel_rapl.c | 97
> +++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 97 insertions(+)
>
> diff --git a/drivers/powercap/intel_rapl.c
> b/drivers/powercap/intel_rapl.c
> index d1694f1..0188cff 100644
> --- a/drivers/powercap/intel_rapl.c
> +++ b/drivers/powercap/intel_rapl.c
> @@ -29,6 +29,7 @@
> #include <linux/sysfs.h>
> #include <linux/cpu.h>
> #include <linux/powercap.h>
> +#include <linux/suspend.h>
> #include <asm/iosf_mbi.h>
>
> #include <asm/processor.h>
> @@ -155,6 +156,7 @@ struct rapl_power_limit {
> int prim_id; /* primitive ID used to enable */
> struct rapl_domain *domain;
> const char *name;
> + u64 last_power_limit;
> };
>
> static const char pl1_name[] = "long_term";
> @@ -1533,6 +1535,92 @@ static int rapl_cpu_down_prep(unsigned int
> cpu)
>
> static enum cpuhp_state pcap_rapl_online;
>
> +static void power_limit_state_save(void)
> +{
> + struct rapl_package *rp;
> + struct rapl_domain *rd;
> + int nr_pl, ret, i;
> +
> + get_online_cpus();
> + list_for_each_entry(rp, &rapl_packages, plist) {
> + if (!rp->power_zone)
> + continue;
> + rd = power_zone_to_rapl_domain(rp->power_zone);
> + nr_pl = find_nr_power_limit(rd);
> + for (i = 0; i < nr_pl; i++) {
> + switch (rd->rpl[i].prim_id) {
> + case PL1_ENABLE:
> + ret = rapl_read_data_raw(rd,
> + POWER_LIMIT1,
> + true,
> + &rd-
> >rpl[i].last_power_limit);
> + if (ret)
> + rd->rpl[i].last_power_limit
> = 0;
> + break;
> + case PL2_ENABLE:
> + ret = rapl_read_data_raw(rd,
> + POWER_LIMIT2,
> + true,
> + &rd-
> >rpl[i].last_power_limit);
> + if (ret)
> + rd->rpl[i].last_power_limit
> = 0;
> + break;
> + }
> + }
> + }
> + put_online_cpus();
> +}
> +
> +static void power_limit_state_restore(void)
> +{
> + struct rapl_package *rp;
> + struct rapl_domain *rd;
> + int nr_pl, i;
> +
> + get_online_cpus();
> + list_for_each_entry(rp, &rapl_packages, plist) {
> + if (!rp->power_zone)
> + continue;
> + rd = power_zone_to_rapl_domain(rp->power_zone);
> + nr_pl = find_nr_power_limit(rd);
> + for (i = 0; i < nr_pl; i++) {
> + switch (rd->rpl[i].prim_id) {
> + case PL1_ENABLE:
> + if (rd->rpl[i].last_power_limit)
> + rapl_write_data_raw(rd,
> + POWER_LIMIT1,
> + rd-
> >rpl[i].last_power_limit);
> + break;
> + case PL2_ENABLE:
> + if (rd->rpl[i].last_power_limit)
> + rapl_write_data_raw(rd,
> + POWER_LIMIT2,
> + rd-
> >rpl[i].last_power_limit);
> + break;
> + }
> + }
> + }
> + put_online_cpus();
> +}
> +
> +static int rapl_pm_callback(struct notifier_block *nb,
> + unsigned long mode, void *_unused)
> +{
> + switch (mode) {
> + case PM_SUSPEND_PREPARE:
> + power_limit_state_save();
> + break;
> + case PM_POST_SUSPEND:
> + power_limit_state_restore();
> + break;
> + }
> + return NOTIFY_OK;
> +}
> +
> +static struct notifier_block rapl_pm_notifier = {
> + .notifier_call = rapl_pm_callback,
> +};
> +
> static int __init rapl_init(void)
> {
> const struct x86_cpu_id *id;
> @@ -1560,8 +1648,16 @@ static int __init rapl_init(void)
>
> /* Don't bail out if PSys is not supported */
> rapl_register_psys();
> +
> + ret = register_pm_notifier(&rapl_pm_notifier);
> + if (ret)
> + goto err_unreg_all;
> +
> return 0;
>
> +err_unreg_all:
> + cpuhp_remove_state(pcap_rapl_online);
> +
> err_unreg:
> rapl_unregister_powercap();
> return ret;
> @@ -1569,6 +1665,7 @@ static int __init rapl_init(void)
>
> static void __exit rapl_exit(void)
> {
> + unregister_pm_notifier(&rapl_pm_notifier);
> cpuhp_remove_state(pcap_rapl_online);
> rapl_unregister_powercap();
> }
next prev parent reply other threads:[~2018-01-10 1:47 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-10 0:38 [PATCH] powercap: add suspend and resume mechanism for SOC power limit xinx.sun
2018-01-10 1:47 ` Srinivas Pandruvada [this message]
2018-01-10 1:53 ` Sun, XinX
2018-01-10 6:21 ` Srinivas Pandruvada
2018-01-10 7:00 ` Sun, XinX
-- strict thread matches above, loose matches on Subject: below --
2018-01-09 8:25 xinx.sun
2018-01-09 11:39 ` Rafael J. Wysocki
2018-01-09 19:00 ` Srinivas Pandruvada
2018-01-10 0:21 ` Rafael J. Wysocki
2018-01-10 0:23 ` Sun, XinX
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=1515548830.69545.28.camel@linux.intel.com \
--to=srinivas.pandruvada@linux.intel.com \
--cc=chaox.m.wang@intel.com \
--cc=jacob.jun.pan@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=xinx.sun@intel.com \
--cc=zhen.han@intel.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.