mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Danilo Krummrich" <dakr@kernel.org>
To: "Beata Michalska" <beata.michalska@arm.com>
Cc: <ojeda@kernel.org>, <gregkh@linuxfoundation.org>,
	<rafael@kernel.org>, <aliceryhl@google.com>, <boqun@kernel.org>,
	<gary@garyguo.net>, <bjorn3_gh@protonmail.com>,
	<lossin@kernel.org>, <a.hindborg@kernel.org>, <tmgross@umich.edu>,
	<daniel.almeida@collabora.com>, <boris.brezillon@collabora.com>,
	<work@onurozkan.dev>, <samitolvanen@google.com>,
	<acourbot@nvidia.com>, <rust-for-linux@vger.kernel.org>,
	<driver-core@lists.linux.dev>, <linux-kernel@vger.kernel.org>,
	<linux-pm@vger.kernel.org>
Subject: Re: [PATCH v5 1/3] rust: add runtime PM support
Date: Wed, 11 Nov 2026 23:45:23 +0100	[thread overview]
Message-ID: <DMSQVECFDJK0.2G5WLV9WPQN3M@kernel.org> (raw)
In-Reply-To: <avTT5VuspuFKbnBv@arm.com>

On Wed Nov 11, 2026 at 9:45 PM CET, Beata Michalska wrote:
> On Thu, Nov 05, 2026 at 05:47:28PM +0100, Danilo Krummrich wrote:
>> On Mon Oct 26, 2026 at 1:05 PM CET, Beata Michalska wrote:
>> > +#[vtable]
>> > +pub trait PMOps: Sized {
>> > +    /// The bus adapter that installs the generated PM ops.
>> > +    type Adapter: driver::DriverLayout + 'static;
>> > +
>> > +    /// Type of the bound bus device passed to runtime PM callbacks.
>> > +    type DeviceType: AsBusDevice<device::Bound>;
>> > +
>> > +    /// Type of the payload moved through runtime PM transitions.
>> > +    type RuntimePayloadType: Send + 'static;
>> 
>> I got back to this type after writing the below, because at first I thought this
>> is purely the data type that is cycled through suspend() and resume().
>> 
>> However, reading further this is currently the Registration's private data. This
>> won't work. The Registration's private data must not require 'static as we need
>> device resources in this data.
>> 
>> So, there should be at least two separate types:
>> 
>>   (1) The private data of pm::Registration.
>> 
>>   (2) An object that is created and returned by suspend() and passed by value to
>>       resume(), so it can store e.g. reverse guard types (see below).
>> 
>> This should also get us rid of the PMPayload magic.
>> 
> The `'static' lifetime is definitely a shortsighted idea on my side.
> Splitting the data does seem reasonable, though I'm not sure how that would allow
> us to get rid of moving around the `PMPayload`, as this is what I assume you
> are referring to by 'magic'. The pm framework still needs to keep the callback
> data between the transitions. Also I am not convinced the pm should distinguish
> between suspend and resume data - my thinking was it should be handled by the
> driver. We just need 'an' object to move back and forth.

For data that does outlive all the suspend/resume cycles (i.e. data that lives
as long as the pm::Registration), it should go into pm::Ops::RegistrationData.

For Tyr this would e.g. be:

	let runtime_payload = TyrPmRegistrationData {
	    clks: Clocks {
	        core: core_clk,
	        stacks: stacks_clk,
	        coregroup: coregroup_clk,
	    },
	    _regulators: Regulators {
	        _mali: mali_regulator,
	        _sram: sram_regulator,
	    },
	};

pm::Ops::SuspendData and pm::Ops::ResumeData (if needed) should only live
throughout suspend and resume, so they can carry e.g. reverse guard types such
as pci::DeviceDisableGuard, which should only live during a a suspend (it can't
live in resume data for obvious reasons, so a single type is not sufficient).

If we have both, pm::Ops::SuspendData and pm::Ops::ResumeData, nothing prevents
drivers to make those types share fields or even be identical, so you can still
cycle things around. Although I don't really see what would be the use case of
that.

I assume that my below function signature caused some confusion, because I
messed it up. What I actually meant is:

	fn runtime_resume<'a>(
	    dev: &Self::DeviceType,
	    reg_data: Self::RegistrationData<'>,
	    suspended: Self::SuspendData<'a>,
	) -> Result<(), (Self::SuspendData<'a>, Error)>;

>> > +
>> > +    /// Runtime resume callback.
>> 
>> It would be good to expand this doc-comment explaining the semantics of
>> RuntimePayloadType.
>> 
>> > +    fn runtime_resume<'a>(
>> > +        _dev: &'a Self::DeviceType,
>> > +        _payload: Self::RuntimePayloadType,
>> > +    ) -> PMCallbackResult<Self::RuntimePayloadType> {
>> > +        build_error!(VTABLE_DEFAULT_ERROR)
>> > +    }
>> > +
>> > +    /// Runtime suspend callback.
>> > +    fn runtime_suspend<'a>(
>> > +        _dev: &'a Self::DeviceType,
>> > +        _payload: Self::RuntimePayloadType,
>> > +    ) -> PMCallbackResult<Self::RuntimePayloadType> {
>> > +        build_error!(VTABLE_DEFAULT_ERROR)
>> > +    }
>> 
>> I think for Tyr it so far is sufficient to have a single RuntimePayloadType that
>> keeps cycling through the callbacks, but there will be use-cases where the types
>> differ.
>> 
>> For instance, for a PCI driver you will have DeviceDisableGuard stored in
>> suspend() and then you'll want to drop it in resume() so the device gets enabled
>> again.
>> 
>> We should also avoid requiring 'static, as reverse guards will borrow the
>> regular guard, e.g. pci::DeviceDisableGuard will borrow from
>> pci::DeviceEnableGuard.
>> 
>> For runtime_resume() I think of something like:
>> 
>> 	fn runtime_resume<'a>(
>> 	    dev: &Self::DeviceType,
>> 	    suspended: Self::SuspendData<'a>,
>> 	) -> Result<(), (Self::SuspendData<'a>, Error)>;
>> 

  reply	other threads:[~2026-11-11 22:45 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-26 12:05 Request::put_noidleFrom 43bd77ceaa3d6a9f61ae8074be13824a94fa76c1 Mon Sep 17 00:00:00 2001 Beata Michalska
2026-10-26 12:05 ` [PATCH v5 1/3] rust: add runtime PM support Beata Michalska
2026-11-05  5:16   ` Onur Özkan
2026-11-11 20:03     ` Beata Michalska
2026-11-05 16:47   ` Danilo Krummrich
2026-11-11 20:45     ` Beata Michalska
2026-11-11 22:45       ` Danilo Krummrich [this message]
2026-10-26 12:05 ` [PATCH v5 2/3] rust: platform: wire runtime PM callbacks Beata Michalska
2026-10-26 12:05 ` [PATCH v5 3/3 DO NOT MERGE] drm/tyr: enable runtime PM Beata Michalska
2026-10-26 12:15 ` Request::put_noidleFrom 43bd77ceaa3d6a9f61ae8074be13824a94fa76c1 Mon Sep 17 00:00:00 2001 Greg KH
2026-10-26 12:28   ` Beata Michalska
2026-10-26 12:25 ` [PATCH v5 0/3] Rust: add runtime PM support Beata Michalska

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=DMSQVECFDJK0.2G5WLV9WPQN3M@kernel.org \
    --to=dakr@kernel.org \
    --cc=a.hindborg@kernel.org \
    --cc=acourbot@nvidia.com \
    --cc=aliceryhl@google.com \
    --cc=beata.michalska@arm.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun@kernel.org \
    --cc=boris.brezillon@collabora.com \
    --cc=daniel.almeida@collabora.com \
    --cc=driver-core@lists.linux.dev \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=rafael@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=samitolvanen@google.com \
    --cc=tmgross@umich.edu \
    --cc=work@onurozkan.dev \
    /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

all inboxes | Powered by JetHome®