From: Lina Iyer <lina.iyer@linaro.org>
To: Ulf Hansson <ulf.hansson@linaro.org>
Cc: Kevin Hilman <khilman@kernel.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Andy Gross <andy.gross@linaro.org>,
Stephen Boyd <sboyd@codeaurora.org>,
"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>,
Brendan Jackman <brendan.jackman@arm.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Sudeep Holla <sudeep.holla@arm.com>,
Juri Lelli <Juri.Lelli@arm.com>,
Marc Titinger <mtitinger+renesas@baylibre.com>
Subject: Re: [PATCH 3/8] PM / Domains: Allow domain power states to be read from DT
Date: Thu, 6 Oct 2016 09:53:36 -0600 [thread overview]
Message-ID: <20161006155336.GD28930@linaro.org> (raw)
In-Reply-To: <CAPDyKFqWE=-tMLN-6zKWpb6K2a2bBxkA7q+mSivJFpzNntcupw@mail.gmail.com>
On Thu, Oct 06 2016 at 03:47 -0600, Ulf Hansson wrote:
>On 5 October 2016 at 22:31, Lina Iyer <lina.iyer@linaro.org> wrote:
>> This patch allows domains to define idle states in the DT. SoC's can
>> define domain idle states in DT using the "domain-idle-states" property
>> of the domain provider. Calling of_pm_genpd_init() will read the idle
>> states and initialize the genpd for the domain.
>>
>> In addition to the entry and exit latency for idle state, also add
>> residency_ns, param and of_node property to each state. A domain idling
>> in a state is only power effecient if it stays idle for a certain period
>> in that state. The residency provides this minimum time for the idle
>> state to provide power benefits. The param is a state specific u32 value
>> that the platform may use for that idle state.
>>
>> This patch is based on the original patch by Marc Titinger.
>>
>> Signed-off-by: Marc Titinger <mtitinger+renesas@baylibre.com>
>> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
>> Signed-off-by: Lina Iyer <lina.iyer@linaro.org>
>> ---
>> drivers/base/power/domain.c | 103 ++++++++++++++++++++++++++++++++++++++++++++
>> include/linux/pm_domain.h | 8 ++++
>> 2 files changed, 111 insertions(+)
>>
>> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
>> index 740afa9..368a5b8 100644
>> --- a/drivers/base/power/domain.c
>> +++ b/drivers/base/power/domain.c
>> @@ -1895,6 +1895,109 @@ out:
>> return ret ? -EPROBE_DEFER : 0;
>> }
>> EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
>> +
>> +static const struct of_device_id idle_state_match[] = {
>> + { .compatible = "arm,idle-state", },
>> + { }
>> +};
>> +
>> +static int read_genpd_state(struct genpd_power_state *genpd_state,
>
>/s/read_genpd_state/genpd_parse_state
>
>> + struct device_node *state_node)
>> +{
>> + int err = 0;
>
>No need to assign err to 0.
>
>> + u32 latency;
>> + u32 residency;
>> + u32 entry_latency, exit_latency;
>> + const struct of_device_id *match_id;
>> +
>> + match_id = of_match_node(idle_state_match, state_node);
>> + if (!match_id)
>> + return -EINVAL;
>> +
>> + err = of_property_read_u32(state_node, "entry-latency-us",
>> + &entry_latency);
>> + if (err) {
>> + pr_debug(" * %s missing entry-latency-us property\n",
>> + state_node->full_name);
>> + return -EINVAL;
>> + }
>> +
>> + err = of_property_read_u32(state_node, "exit-latency-us",
>> + &exit_latency);
>> + if (err) {
>> + pr_debug(" * %s missing exit-latency-us property\n",
>> + state_node->full_name);
>> + return -EINVAL;
>> + }
>> +
>> + err = of_property_read_u32(state_node, "min-residency-us", &residency);
>> + if (!err)
>> + genpd_state->residency_ns = 1000 * residency;
>> +
>> + latency = entry_latency + exit_latency;
>
>Hmm, this is probably not what you want.
>
>The genpd governor, via __default_power_down_ok(), already adds the
>->power_on_latency_ns and the ->power_off_latency_ns, when it
>validates which idle state you are allowed to enter.
>
>> + genpd_state->power_on_latency_ns = 1000 * latency;
>> + genpd_state->power_off_latency_ns = 1000 * entry_latency;
>> +
>> + return 0;
>> +}
>> +
>> +/**
>> + * of_genpd_parse_idle_states: Return array of idle states for the genpd.
>> + *
>> + * @dn: The genpd device node
>> + * @states: The pointer to which the state array will be saved.
>> + * @n: The count of elements in the array returned from this function.
>> + *
>> + * Returns the device states parsed from the OF node. The memory for the states
>> + * is allocated by this function and is the responsibility of the caller to
>> + * free the memory after use.
>> + */
>> +int of_genpd_parse_idle_states(struct device_node *dn,
>> + struct genpd_power_state **states, int *n)
>> +{
>> + struct genpd_power_state *st;
>> + struct device_node *np;
>> + int i, ret = 0;
>> + int count;
>> +
>> + for (count = 0; ; count++)
>> + if (!of_parse_phandle(dn, "domain-idle-states", count))
>> + break;
>
>I think it's better to use of_count_phandle_with_args() to find out
>the number of phandles.
>
>> +
>> + st = kcalloc(count, sizeof(*st), GFP_KERNEL);
>> + if (!st)
>> + return -ENOMEM;
>> +
>> + for (i = 0; i < count; i++) {
>> + np = of_parse_phandle(dn, "domain-idle-states", i);
>
>Isn't this a case of when it would be convenient to use the
>of_phandle_iterator*() APIs?
>
Hmm.. But if we move back to static allocation of states, we won't need
any of this ;)
-- Lina
>> + if (!np) {
>> + ret = -EFAULT;
>> + break;
>> + }
>> +
>> + ret = read_genpd_state(&st[i], np);
>> + if (ret) {
>> + pr_err
>> + ("Parsing idle state node %s failed with err %d\n",
>> + np->full_name, ret);
>> + of_node_put(np);
>> + break;
>> + }
>> + of_node_put(np);
>> + }
>> +
>> + if (ret) {
>> + kfree(st);
>> + return ret;
>> + }
>> +
>> + *n = count;
>> + *states = st;
>> +
>> + return 0;
>> +}
>> +EXPORT_SYMBOL(of_genpd_parse_idle_states);
>> +
>> #endif /* CONFIG_PM_GENERIC_DOMAINS_OF */
>>
>>
>> diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
>> index c113713..4c9152d 100644
>> --- a/include/linux/pm_domain.h
>> +++ b/include/linux/pm_domain.h
>> @@ -204,6 +204,8 @@ extern int of_genpd_add_device(struct of_phandle_args *args,
>> extern int of_genpd_add_subdomain(struct of_phandle_args *parent,
>> struct of_phandle_args *new_subdomain);
>> extern struct generic_pm_domain *of_genpd_remove_last(struct device_node *np);
>> +extern int of_genpd_parse_idle_states(struct device_node *dn,
>> + struct genpd_power_state **states, int *n);
>>
>> int genpd_dev_pm_attach(struct device *dev);
>> #else /* !CONFIG_PM_GENERIC_DOMAINS_OF */
>> @@ -233,6 +235,12 @@ static inline int of_genpd_add_subdomain(struct of_phandle_args *parent,
>> return -ENODEV;
>> }
>>
>> +static inline int of_genpd_parse_idle_states(struct device_node *dn,
>> + struct genpd_power_state **states, int *n)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> static inline int genpd_dev_pm_attach(struct device *dev)
>> {
>> return -ENODEV;
>> --
>> 2.7.4
>>
>
>Kind regards
>Uffe
WARNING: multiple messages have this Message-ID (diff)
From: lina.iyer@linaro.org (Lina Iyer)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/8] PM / Domains: Allow domain power states to be read from DT
Date: Thu, 6 Oct 2016 09:53:36 -0600 [thread overview]
Message-ID: <20161006155336.GD28930@linaro.org> (raw)
In-Reply-To: <CAPDyKFqWE=-tMLN-6zKWpb6K2a2bBxkA7q+mSivJFpzNntcupw@mail.gmail.com>
On Thu, Oct 06 2016 at 03:47 -0600, Ulf Hansson wrote:
>On 5 October 2016 at 22:31, Lina Iyer <lina.iyer@linaro.org> wrote:
>> This patch allows domains to define idle states in the DT. SoC's can
>> define domain idle states in DT using the "domain-idle-states" property
>> of the domain provider. Calling of_pm_genpd_init() will read the idle
>> states and initialize the genpd for the domain.
>>
>> In addition to the entry and exit latency for idle state, also add
>> residency_ns, param and of_node property to each state. A domain idling
>> in a state is only power effecient if it stays idle for a certain period
>> in that state. The residency provides this minimum time for the idle
>> state to provide power benefits. The param is a state specific u32 value
>> that the platform may use for that idle state.
>>
>> This patch is based on the original patch by Marc Titinger.
>>
>> Signed-off-by: Marc Titinger <mtitinger+renesas@baylibre.com>
>> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
>> Signed-off-by: Lina Iyer <lina.iyer@linaro.org>
>> ---
>> drivers/base/power/domain.c | 103 ++++++++++++++++++++++++++++++++++++++++++++
>> include/linux/pm_domain.h | 8 ++++
>> 2 files changed, 111 insertions(+)
>>
>> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
>> index 740afa9..368a5b8 100644
>> --- a/drivers/base/power/domain.c
>> +++ b/drivers/base/power/domain.c
>> @@ -1895,6 +1895,109 @@ out:
>> return ret ? -EPROBE_DEFER : 0;
>> }
>> EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
>> +
>> +static const struct of_device_id idle_state_match[] = {
>> + { .compatible = "arm,idle-state", },
>> + { }
>> +};
>> +
>> +static int read_genpd_state(struct genpd_power_state *genpd_state,
>
>/s/read_genpd_state/genpd_parse_state
>
>> + struct device_node *state_node)
>> +{
>> + int err = 0;
>
>No need to assign err to 0.
>
>> + u32 latency;
>> + u32 residency;
>> + u32 entry_latency, exit_latency;
>> + const struct of_device_id *match_id;
>> +
>> + match_id = of_match_node(idle_state_match, state_node);
>> + if (!match_id)
>> + return -EINVAL;
>> +
>> + err = of_property_read_u32(state_node, "entry-latency-us",
>> + &entry_latency);
>> + if (err) {
>> + pr_debug(" * %s missing entry-latency-us property\n",
>> + state_node->full_name);
>> + return -EINVAL;
>> + }
>> +
>> + err = of_property_read_u32(state_node, "exit-latency-us",
>> + &exit_latency);
>> + if (err) {
>> + pr_debug(" * %s missing exit-latency-us property\n",
>> + state_node->full_name);
>> + return -EINVAL;
>> + }
>> +
>> + err = of_property_read_u32(state_node, "min-residency-us", &residency);
>> + if (!err)
>> + genpd_state->residency_ns = 1000 * residency;
>> +
>> + latency = entry_latency + exit_latency;
>
>Hmm, this is probably not what you want.
>
>The genpd governor, via __default_power_down_ok(), already adds the
>->power_on_latency_ns and the ->power_off_latency_ns, when it
>validates which idle state you are allowed to enter.
>
>> + genpd_state->power_on_latency_ns = 1000 * latency;
>> + genpd_state->power_off_latency_ns = 1000 * entry_latency;
>> +
>> + return 0;
>> +}
>> +
>> +/**
>> + * of_genpd_parse_idle_states: Return array of idle states for the genpd.
>> + *
>> + * @dn: The genpd device node
>> + * @states: The pointer to which the state array will be saved.
>> + * @n: The count of elements in the array returned from this function.
>> + *
>> + * Returns the device states parsed from the OF node. The memory for the states
>> + * is allocated by this function and is the responsibility of the caller to
>> + * free the memory after use.
>> + */
>> +int of_genpd_parse_idle_states(struct device_node *dn,
>> + struct genpd_power_state **states, int *n)
>> +{
>> + struct genpd_power_state *st;
>> + struct device_node *np;
>> + int i, ret = 0;
>> + int count;
>> +
>> + for (count = 0; ; count++)
>> + if (!of_parse_phandle(dn, "domain-idle-states", count))
>> + break;
>
>I think it's better to use of_count_phandle_with_args() to find out
>the number of phandles.
>
>> +
>> + st = kcalloc(count, sizeof(*st), GFP_KERNEL);
>> + if (!st)
>> + return -ENOMEM;
>> +
>> + for (i = 0; i < count; i++) {
>> + np = of_parse_phandle(dn, "domain-idle-states", i);
>
>Isn't this a case of when it would be convenient to use the
>of_phandle_iterator*() APIs?
>
Hmm.. But if we move back to static allocation of states, we won't need
any of this ;)
-- Lina
>> + if (!np) {
>> + ret = -EFAULT;
>> + break;
>> + }
>> +
>> + ret = read_genpd_state(&st[i], np);
>> + if (ret) {
>> + pr_err
>> + ("Parsing idle state node %s failed with err %d\n",
>> + np->full_name, ret);
>> + of_node_put(np);
>> + break;
>> + }
>> + of_node_put(np);
>> + }
>> +
>> + if (ret) {
>> + kfree(st);
>> + return ret;
>> + }
>> +
>> + *n = count;
>> + *states = st;
>> +
>> + return 0;
>> +}
>> +EXPORT_SYMBOL(of_genpd_parse_idle_states);
>> +
>> #endif /* CONFIG_PM_GENERIC_DOMAINS_OF */
>>
>>
>> diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
>> index c113713..4c9152d 100644
>> --- a/include/linux/pm_domain.h
>> +++ b/include/linux/pm_domain.h
>> @@ -204,6 +204,8 @@ extern int of_genpd_add_device(struct of_phandle_args *args,
>> extern int of_genpd_add_subdomain(struct of_phandle_args *parent,
>> struct of_phandle_args *new_subdomain);
>> extern struct generic_pm_domain *of_genpd_remove_last(struct device_node *np);
>> +extern int of_genpd_parse_idle_states(struct device_node *dn,
>> + struct genpd_power_state **states, int *n);
>>
>> int genpd_dev_pm_attach(struct device *dev);
>> #else /* !CONFIG_PM_GENERIC_DOMAINS_OF */
>> @@ -233,6 +235,12 @@ static inline int of_genpd_add_subdomain(struct of_phandle_args *parent,
>> return -ENODEV;
>> }
>>
>> +static inline int of_genpd_parse_idle_states(struct device_node *dn,
>> + struct genpd_power_state **states, int *n)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> static inline int genpd_dev_pm_attach(struct device *dev)
>> {
>> return -ENODEV;
>> --
>> 2.7.4
>>
>
>Kind regards
>Uffe
next prev parent reply other threads:[~2016-10-06 15:53 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-05 20:31 [PATCH 0/8] PM / Domains: DT support for domain idle states & atomic PM domains Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-05 20:31 ` [PATCH 1/8] PM / Domains: Make genpd state allocation dynamic Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-06 8:36 ` Ulf Hansson
2016-10-06 8:36 ` Ulf Hansson
2016-10-06 15:40 ` Lina Iyer
2016-10-06 15:40 ` Lina Iyer
2016-10-06 19:45 ` Ulf Hansson
2016-10-06 19:45 ` Ulf Hansson
2016-10-06 20:57 ` Lina Iyer
2016-10-06 20:57 ` Lina Iyer
2016-10-07 8:39 ` Ulf Hansson
2016-10-07 8:39 ` Ulf Hansson
2016-10-05 20:31 ` [PATCH 2/8] PM / Domain: Add residency property to genpd states Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-06 8:38 ` Ulf Hansson
2016-10-06 8:38 ` Ulf Hansson
2016-10-05 20:31 ` [PATCH 3/8] PM / Domains: Allow domain power states to be read from DT Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-06 8:04 ` Geert Uytterhoeven
2016-10-06 8:04 ` Geert Uytterhoeven
2016-10-06 15:44 ` Lina Iyer
2016-10-06 15:44 ` Lina Iyer
2016-10-06 9:47 ` Ulf Hansson
2016-10-06 9:47 ` Ulf Hansson
2016-10-06 15:53 ` Lina Iyer [this message]
2016-10-06 15:53 ` Lina Iyer
2016-10-06 15:54 ` Lina Iyer
2016-10-06 15:54 ` Lina Iyer
2016-10-05 20:31 ` [PATCH 4/8] PM / Domains: Add fwnode provider to genpd states Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-06 12:01 ` Ulf Hansson
2016-10-06 12:01 ` Ulf Hansson
2016-10-06 15:55 ` Lina Iyer
2016-10-06 15:55 ` Lina Iyer
2016-10-05 20:31 ` [PATCH 5/8] dt/bindings: Update binding for PM domain idle states Lina Iyer
2016-10-05 20:31 ` Lina Iyer
[not found] ` <1475699519-109623-6-git-send-email-lina.iyer-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2016-10-06 8:06 ` Geert Uytterhoeven
2016-10-06 8:06 ` Geert Uytterhoeven
[not found] ` <CAMuHMdWxft8o493XN2zg1wj2By7P+qBkrvyQOt7WdBnhPAvSXQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-06 8:09 ` Geert Uytterhoeven
2016-10-06 8:09 ` Geert Uytterhoeven
[not found] ` <CAMuHMdUKbJ1Mt3viEkbCDmZGHQjGi_E=bxEBSHOB1MMY+qfSYQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-06 15:56 ` Lina Iyer
2016-10-06 15:56 ` Lina Iyer
2016-10-05 20:31 ` [PATCH 6/8] PM / Domains: Abstract genpd locking Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-06 10:56 ` Ulf Hansson
2016-10-06 10:56 ` Ulf Hansson
2016-10-06 15:56 ` Lina Iyer
2016-10-06 15:56 ` Lina Iyer
2016-10-05 20:31 ` [PATCH 7/8] PM / Domains: Support IRQ safe PM domains Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-06 11:34 ` Ulf Hansson
2016-10-06 11:34 ` Ulf Hansson
2016-10-05 20:31 ` [PATCH 8/8] PM / doc: Update device documentation for devices in " Lina Iyer
2016-10-05 20:31 ` Lina Iyer
2016-10-06 11:48 ` Ulf Hansson
2016-10-06 11:48 ` Ulf Hansson
2016-10-05 20:38 ` [PATCH 0/8] PM / Domains: DT support for domain idle states & atomic " Lina Iyer
2016-10-05 20:38 ` Lina Iyer
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=20161006155336.GD28930@linaro.org \
--to=lina.iyer@linaro.org \
--cc=Juri.Lelli@arm.com \
--cc=andy.gross@linaro.org \
--cc=brendan.jackman@arm.com \
--cc=khilman@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=mtitinger+renesas@baylibre.com \
--cc=rjw@rjwysocki.net \
--cc=sboyd@codeaurora.org \
--cc=sudeep.holla@arm.com \
--cc=ulf.hansson@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.