linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Hilman <khilman@kernel.org>
To: Axel Haslam <ahaslam@baylibre.com>
Cc: linux-pm@vger.kernel.org, rjw@rjwysocki.net,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Benoit Cousson <bcousson@baylibre.com>
Subject: Re: [PATCH] [RFC] PM / Domains: multiple states
Date: Tue, 07 Apr 2015 08:25:40 -0700	[thread overview]
Message-ID: <7hwq1oq7t7.fsf@deeprootsystems.com> (raw)
In-Reply-To: <CAKXjFTNQ2q2=Q6YqJQnaQOe_TX7NSQX3Mv7MwnRTBoS2q2=T-w@mail.gmail.com> (Axel Haslam's message of "Tue, 7 Apr 2015 16:24:38 +0200")

Axel Haslam <ahaslam@baylibre.com> writes:

> Hi Kevin,
>
>
>>
>> ...the most common of these being a "retention" state, where clocks are
>> gated, and voltage is lowered to a retention voltage so the domain is
>> not technically "off" (as in zero volts) but is in a low-power state,
>> with all or part of the logic/memory retained.
>>
>> For those more familiar with ACPI, you might also mention the simliarity
>> to ACPI D states:
>> http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface#Device_states
>>
>
> ok, i can add more info here.
>
>
>>
>> The unfortunate problem here is that the underlying framework (runtime
>> PM) doesn't yet know about multiple power states, so I'm not sure (yet)
>> how to make this work at the genpd level without also changing runtime
>> PM understand the concept of multiple power states.
>>
>> So, maybe I'm missing something, but I'm not yet sure how this would be
>> useful without the underlying support in runtime PM also.
>
>
> The way i had imagined it was that runtime pm would suspend
> the devices, and based on the latency constraint of all devices
> on the genpd, the genpd governor would pick the most restrictive
> constraint and decide what state to go into.

OK, that should work also.

>>
>> > States should be declared in ascending order from shallowest
>> > to deepest, deepest meaning the state which takes longer
>> > to enter and exit. The declaration would look something like:
>> >
>> >       struct genpd_power_state states[3] = {
>> >               {
>> >                       .name= "LOW_POWER_1",
>> >                       .power_off = arch_callback_lp1,
>> >                       .power_on = arch_callback_lp1,
>> >                       .power_off_latency_ns = 1000000,
>> >                       .power_on_latency_ns = 1000000,
>> >
>> >               },
>> >               {
>> >                       .name= "LOW_POWER_2",
>> >                       .power_off = arch_callback_lp2,
>> >                       .power_on = arch_callback_lp2,
>> >                       .power_off_latency_ns = 2000000,
>> >                       .power_on_latency_ns = 2000000,
>> >
>> >               },
>> >               {
>> >                       .name= "OFF",
>> >                       .power_off = arch_callback_off,
>> >                       .power_on = arch_callback_off,
>> >                       .power_off_latency_ns = 4000000,
>> >                       .power_on_latency_ns = 4000000,
>> >
>> >               },
>> >       };
>>
>> We might also need a per-state flag stating whether context is lost, so
>> we know whether the save/restore state stuff actually needs to be
>> called.
>
>
> The patch adds the "state" parameter on the save/restore callback,
> i thought the callbacks can use this to decide if they need to
> restore, and which registers to restore. (maybe there could be only a subset
> to restore depending on the state)

OK, that should work.

>>
>> [...]
>>
>> > @@ -118,14 +120,33 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
>> >                       link->master->max_off_time_changed = true;
>> >
>> >               genpd->max_off_time_changed = false;
>> > -             genpd->cached_power_down_ok = false;
>> > -             genpd->max_off_time_ns = -1;
>> > +             /*
>> > +              * invalidate the cached values for every state
>> > +              */
>> > +             for (i = 0; i < genpd->state_count; i++) {
>> > +                     genpd->states[i].cached_power_down_ok =
>> > +                             GPD_CACHED_UNKNOWN;
>> > +                     genpd->max_off_time_ns = -1;
>> > +             }
>> > +
>>
>> I'm not quite understanding the need for these new GPD_CACHED_* flags,
>> and this change isn't described in the changelog.
>>
>
> sorry, i should have added a few lines about this.
>
> Currently, the decision to use the cached value relies only on
> the flag "max_off_time_changed". if the flag is set when
> default_power_down_ok is called,
> it is turned off and the value of cached_power_down_ok is calculated
> and saved to be used
> on subsequent calls until max_off_time_changed is set again after a
> device constraint
> is changed or a save/restore on/off latency is changed.
>
> With multiple states, cached_power_down_ok is a per-state flag and
> tells if the genpd can enter into that particular state.
> The default_power_down_ok function becomes a loop that calls
> default_power_down_ok_state until the deepest valid state is found, if
> the found state is not the shallowest, cached_power_down_ok  will not be
> calculated for the shallower states. thats why i thought of making
> cached_power_down_ok a tri state flag.
>
> in hindsight,  it may not even be relevant, since we are only
> interested in the deepest
> state we can go into.  i think that the cached logic could be moved out of the
> default_power_down_ok_state function and back into default_power_down_ok,
> And the governor should save the deepest state allowed so that if the
> max_off_time_changed flag does not change, we could return without even
> looping through the states. i can repost with this change if it makes
> more sense.

Yes, and you might make that change a separate patch with it's own
descriptive changelog.

Kevin

      reply	other threads:[~2015-04-07 15:25 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-02  8:34 [PATCH] [RFC] PM / Domains: multiple states ahaslam
2015-04-07  0:06 ` Kevin Hilman
2015-04-07 11:11   ` Rafael J. Wysocki
2015-04-07 15:21     ` Kevin Hilman
2015-04-07 14:24   ` Axel Haslam
2015-04-07 15:25     ` Kevin Hilman [this message]

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=7hwq1oq7t7.fsf@deeprootsystems.com \
    --to=khilman@kernel.org \
    --cc=ahaslam@baylibre.com \
    --cc=bcousson@baylibre.com \
    --cc=linux-pm@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).