From: Dave Gerlach <d-gerlach@ti.com>
To: Kevin Hilman <khilman@kernel.org>
Cc: Suman Anna <s-anna@ti.com>, Ohad Ben-Cohen <ohad@wizery.com>,
linux-arm <linux-arm-kernel@lists.infradead.org>,
"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>,
Paul Walmsley <paul@pwsan.com>, Tony Lindgren <tony@atomide.com>,
Tero Kristo <t-kristo@ti.com>, Nishanth Menon <nm@ti.com>,
Russ Dill <russ.dill@ti.com>,
Santosh Shilimkar <santosh.shilimkar@ti.com>,
Daniel Mack <daniel@zonque.org>,
Benoit Cousson <bcousson@baylibre.com>
Subject: Re: [PATCH v4 10/11] ARM: OMAP2+: AM33XX: Basic suspend resume support
Date: Wed, 10 Sep 2014 16:19:22 -0500 [thread overview]
Message-ID: <5410C05A.50602@ti.com> (raw)
In-Reply-To: <7hr3zk7b5z.fsf@deeprootsystems.com>
Kevin,
On 09/09/2014 04:10 PM, Kevin Hilman wrote:
> Dave Gerlach <d-gerlach@ti.com> writes:
>
>> Kevin/Ohad,
>> On 09/09/2014 02:59 PM, Suman Anna wrote:
>>> Hi Ohad,
>>>
>>> On 09/09/2014 05:31 AM, Ohad Ben-Cohen wrote:
>>>> On Tue, Sep 9, 2014 at 1:30 AM, Kevin Hilman <khilman@linaro.org> wrote:
>>>>> To me, it's not terribly clear how you made the split between this PM
>>>>> core code an the remoteproc code. In the changelog for the remoteproc
>>>>> patch, it states it's to "load the firmware for and boot the wkup_m3".
>>>>> But, while parts of the IPC are here in pm33xx.c, parts of the IPC are
>>>>> also inside the remoteproc driver, so I'm quite curious if that's OK
>>>>> with the remoteproc maintainers. Either way, please make it clearer how
>>>>> and why you made the split, and please isolate the wkup_m3 IPC/protocol
>>>>> from this code. Think of people wanting to rework/extend the wkup_m3
>>>>> firmware. They shouldn't be messing around in here, but rather inside a
>>>>> driver specificaly for the wkup_m3.
>>>>
>>>> I haven't looked at the code very thoroughly yet, but generally a
>>>> remoteproc driver should only implement the three start/stop/kick
>>>> rproc_ops, and then register them via the remoteproc framework.
>>>> Exposing additional API directly from that driver isn't something we
>>>> immediately want to accept.
>>>>
>>>> If relevant, we would generally prefer to extend remoteproc instead,
>>>> so other platform-specific drivers could utilize that functionality as
>>>> well. Or rpmsg - if we're missing some IPC functionality.
>>>
>>> The WkupM3 cannot access DDR, and so we don't intend to use rpmsg. The
>>> IPC with wkup_m3 is usually one of the last steps for putting the SoC
>>> into a desired low-power state either during suspend or cpuidle, and the
>>> communication uses a bank of fixed registers. The .kick is specific
>>> to virtio-based communication, and so this is not gonna be used.
>>>
>>> If you can take a closer look at the wkup_m3 remoteproc driver and give
>>> your comments, then we can plan on the next steps. Especially as there
>>> are also pieces pertaining to the PM layer knowing the WkupM3 has been
>>> loaded and booted. There are already some pending comments on code
>>> fragments from Santosh and myself, but let us know your inputs on the
>>> integration aspects on PM, remoteproc and IPC with WkupM3.
>>>
>>
>> The split was defined by putting all the application specific (to the
>> firmware in use) code in the platform pm code while trying to keep all the
>> IPC code within the wkup_m3_rproc driver.
>
> I don't even see that split. I see the platform PM code directly
> setting IPC register values, but then rproc driver actually sends the
> mailbox command.
Well, really the pm code is setting a structure which gets passed to the
wkup_m3_rproc API and that's what does the write. I suppose the naming of the
structure is misleading though. However, the wkup_m3 driver isn't aware of the
protocol or what is going into these registers for the writes, the PM code
defines the usage.
>
>> The exposed API is definitely heavily biased towards the intended
>> use-case,
>
> Maybe if the API was actually documented, it would be easier for us to
> review it.
>
>> but the CM3 was designed with this exact purpose in mind and
>> not much else, and due to the limited IPC registers we have to work
>> with there isn't a whole lot of flexibility. Only IPC reg 0 is always
>> used as the resume address, the usage of the other registers is
>> defined by the firmware and pm code.
>>
>> Just as a refresher for those not familiar with it, the IPC mechanism works
>> like this: we load the ipc registers (8 for am33xx, 16 for am43xx) with any
>> information we want to communicate to the CM3,
>
> OK, and this happens currently in the platform PM code, right?
>
>> then we make a dummy write to
>> the Mailbox which triggers an interrupt on the CM3, the CM3 does what it
>> needs to with the info passed in the IPC regs and writes anything it wants to
>> communicate back to these registers, and then triggers a different interrupt
>> (not related to mailbox) to let the MPU know it is done.
>
> And this part happens in the rproc driver, right?
>
>> It's kind of a mess so I figured one driver was the best way to
>> encapsulate it all,
>
> So where is this "one driver" that encapsulates it all?
>
Sp my thinking was that I put the IPC writing in the wkup_m3_rproc driver, but
the actual configuration of what gets written in the PM platform code, to at
least try to keep things generic. Still, I do agree now that the split is not
that clear.
>> and I still had to
>> introduce callbacks within the wkup_m3_rproc driver so it could let the pm code
>> know when the FW loaded (to actually enable pm) and when an interrupt was
>> received from the wkup_m3 (so the pm code can process the response).
>
>> As Suman stated, this sequence is part of the suspend path and also will be part
>> of the lower c-states for cpuidle, so we need something fast and lightweight.
>> RPMsg is way more than we need and it doesn't really fit the use case, so I'm
>> not sure what makes the most sense, extending remoteproc in some way to support
>> IPC communication like described above or leaving the basic FW loading
>> functionality in place in remoteproc but moving the IPC and wkup_m3
>> functionality back into the platform pm33xx code as it's so specific to that
>> use-case anyway.
>
> I'm not advocating for using rpmsg (anymore). But I dont' think shoving
> your rpmsg-lite IPC into your rproc driver is the right answer either
> (and Ohad's repsonse confirmed my suspicion.)
>
> What I think you need to do (and what I've recommended at least once in
> earlier reviews) put all the (non-rproc) wkup_m3 IPC into into one
> driver and create a well-described, well-documented API that the
> platform PM code will use.
>
> IMO, the current "split" is very difficult to read/understand, which
> means it will even more difficult to maintain.
I dont think I entirely understand your vision for the API. I see it going in
one of two directions:
PM/Application agnostic: provide ability to write/read wkup_m3 (mailbox ping is
handled automatically by the driver also) and then callbacks for rproc being
ready and handling response from wkup_m3 for the PM code to use, and that's it.
Well let the PM code sort out how it uses everything. This means that there is a
payload (similar to the structure in place now that takes the register values)
that gets configured and then the wkup_m3 driver just passes the info back and
forth between the MPU and wkup_m3 without the driver ever knowing what's
actually happening.
OR
Application specific: Provide ability to set use-case specific functionality,
i.e. wkup_m3_set_low_power_mode, wkup_m3_set_resume_address, etc... which
exposes the high level functions provided by the wkup_m3 firmware (which are
limited to the functionality in the TI provided firmware, which is all that is
intended anyway), and the pm code uses this to accomplish what it wants without
any knowledge of the actual communication or configuration.
I think the first version is more scalable and maintainable for future
applications, but perhaps I am still not aligned with your vision. Thoughts?
Regards,
Dave
>
> Kevin
>
WARNING: multiple messages have this Message-ID (diff)
From: d-gerlach@ti.com (Dave Gerlach)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 10/11] ARM: OMAP2+: AM33XX: Basic suspend resume support
Date: Wed, 10 Sep 2014 16:19:22 -0500 [thread overview]
Message-ID: <5410C05A.50602@ti.com> (raw)
In-Reply-To: <7hr3zk7b5z.fsf@deeprootsystems.com>
Kevin,
On 09/09/2014 04:10 PM, Kevin Hilman wrote:
> Dave Gerlach <d-gerlach@ti.com> writes:
>
>> Kevin/Ohad,
>> On 09/09/2014 02:59 PM, Suman Anna wrote:
>>> Hi Ohad,
>>>
>>> On 09/09/2014 05:31 AM, Ohad Ben-Cohen wrote:
>>>> On Tue, Sep 9, 2014 at 1:30 AM, Kevin Hilman <khilman@linaro.org> wrote:
>>>>> To me, it's not terribly clear how you made the split between this PM
>>>>> core code an the remoteproc code. In the changelog for the remoteproc
>>>>> patch, it states it's to "load the firmware for and boot the wkup_m3".
>>>>> But, while parts of the IPC are here in pm33xx.c, parts of the IPC are
>>>>> also inside the remoteproc driver, so I'm quite curious if that's OK
>>>>> with the remoteproc maintainers. Either way, please make it clearer how
>>>>> and why you made the split, and please isolate the wkup_m3 IPC/protocol
>>>>> from this code. Think of people wanting to rework/extend the wkup_m3
>>>>> firmware. They shouldn't be messing around in here, but rather inside a
>>>>> driver specificaly for the wkup_m3.
>>>>
>>>> I haven't looked at the code very thoroughly yet, but generally a
>>>> remoteproc driver should only implement the three start/stop/kick
>>>> rproc_ops, and then register them via the remoteproc framework.
>>>> Exposing additional API directly from that driver isn't something we
>>>> immediately want to accept.
>>>>
>>>> If relevant, we would generally prefer to extend remoteproc instead,
>>>> so other platform-specific drivers could utilize that functionality as
>>>> well. Or rpmsg - if we're missing some IPC functionality.
>>>
>>> The WkupM3 cannot access DDR, and so we don't intend to use rpmsg. The
>>> IPC with wkup_m3 is usually one of the last steps for putting the SoC
>>> into a desired low-power state either during suspend or cpuidle, and the
>>> communication uses a bank of fixed registers. The .kick is specific
>>> to virtio-based communication, and so this is not gonna be used.
>>>
>>> If you can take a closer look at the wkup_m3 remoteproc driver and give
>>> your comments, then we can plan on the next steps. Especially as there
>>> are also pieces pertaining to the PM layer knowing the WkupM3 has been
>>> loaded and booted. There are already some pending comments on code
>>> fragments from Santosh and myself, but let us know your inputs on the
>>> integration aspects on PM, remoteproc and IPC with WkupM3.
>>>
>>
>> The split was defined by putting all the application specific (to the
>> firmware in use) code in the platform pm code while trying to keep all the
>> IPC code within the wkup_m3_rproc driver.
>
> I don't even see that split. I see the platform PM code directly
> setting IPC register values, but then rproc driver actually sends the
> mailbox command.
Well, really the pm code is setting a structure which gets passed to the
wkup_m3_rproc API and that's what does the write. I suppose the naming of the
structure is misleading though. However, the wkup_m3 driver isn't aware of the
protocol or what is going into these registers for the writes, the PM code
defines the usage.
>
>> The exposed API is definitely heavily biased towards the intended
>> use-case,
>
> Maybe if the API was actually documented, it would be easier for us to
> review it.
>
>> but the CM3 was designed with this exact purpose in mind and
>> not much else, and due to the limited IPC registers we have to work
>> with there isn't a whole lot of flexibility. Only IPC reg 0 is always
>> used as the resume address, the usage of the other registers is
>> defined by the firmware and pm code.
>>
>> Just as a refresher for those not familiar with it, the IPC mechanism works
>> like this: we load the ipc registers (8 for am33xx, 16 for am43xx) with any
>> information we want to communicate to the CM3,
>
> OK, and this happens currently in the platform PM code, right?
>
>> then we make a dummy write to
>> the Mailbox which triggers an interrupt on the CM3, the CM3 does what it
>> needs to with the info passed in the IPC regs and writes anything it wants to
>> communicate back to these registers, and then triggers a different interrupt
>> (not related to mailbox) to let the MPU know it is done.
>
> And this part happens in the rproc driver, right?
>
>> It's kind of a mess so I figured one driver was the best way to
>> encapsulate it all,
>
> So where is this "one driver" that encapsulates it all?
>
Sp my thinking was that I put the IPC writing in the wkup_m3_rproc driver, but
the actual configuration of what gets written in the PM platform code, to at
least try to keep things generic. Still, I do agree now that the split is not
that clear.
>> and I still had to
>> introduce callbacks within the wkup_m3_rproc driver so it could let the pm code
>> know when the FW loaded (to actually enable pm) and when an interrupt was
>> received from the wkup_m3 (so the pm code can process the response).
>
>> As Suman stated, this sequence is part of the suspend path and also will be part
>> of the lower c-states for cpuidle, so we need something fast and lightweight.
>> RPMsg is way more than we need and it doesn't really fit the use case, so I'm
>> not sure what makes the most sense, extending remoteproc in some way to support
>> IPC communication like described above or leaving the basic FW loading
>> functionality in place in remoteproc but moving the IPC and wkup_m3
>> functionality back into the platform pm33xx code as it's so specific to that
>> use-case anyway.
>
> I'm not advocating for using rpmsg (anymore). But I dont' think shoving
> your rpmsg-lite IPC into your rproc driver is the right answer either
> (and Ohad's repsonse confirmed my suspicion.)
>
> What I think you need to do (and what I've recommended at least once in
> earlier reviews) put all the (non-rproc) wkup_m3 IPC into into one
> driver and create a well-described, well-documented API that the
> platform PM code will use.
>
> IMO, the current "split" is very difficult to read/understand, which
> means it will even more difficult to maintain.
I dont think I entirely understand your vision for the API. I see it going in
one of two directions:
PM/Application agnostic: provide ability to write/read wkup_m3 (mailbox ping is
handled automatically by the driver also) and then callbacks for rproc being
ready and handling response from wkup_m3 for the PM code to use, and that's it.
Well let the PM code sort out how it uses everything. This means that there is a
payload (similar to the structure in place now that takes the register values)
that gets configured and then the wkup_m3 driver just passes the info back and
forth between the MPU and wkup_m3 without the driver ever knowing what's
actually happening.
OR
Application specific: Provide ability to set use-case specific functionality,
i.e. wkup_m3_set_low_power_mode, wkup_m3_set_resume_address, etc... which
exposes the high level functions provided by the wkup_m3 firmware (which are
limited to the functionality in the TI provided firmware, which is all that is
intended anyway), and the pm code uses this to accomplish what it wants without
any knowledge of the actual communication or configuration.
I think the first version is more scalable and maintainable for future
applications, but perhaps I am still not aligned with your vision. Thoughts?
Regards,
Dave
>
> Kevin
>
next prev parent reply other threads:[~2014-09-10 21:19 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-11 2:55 [PATCH v4 00/11] ARM: OMAP2+: AM33XX: Add suspend-resume support Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 01/11] ARM: omap: edma: add suspend suspend/resume hooks Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-14 11:05 ` Tony Lindgren
2014-07-14 11:05 ` Tony Lindgren
2014-07-14 17:47 ` Dave Gerlach
2014-07-14 17:47 ` Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 02/11] memory: emif: Move EMIF register defines to include/linux/ Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-14 11:12 ` Tony Lindgren
2014-07-14 11:12 ` Tony Lindgren
2014-07-14 17:42 ` Dave Gerlach
2014-07-14 17:42 ` Dave Gerlach
2014-07-15 6:38 ` Tony Lindgren
2014-07-15 6:38 ` Tony Lindgren
2014-07-16 2:44 ` Dave Gerlach
2014-07-16 2:44 ` Dave Gerlach
2014-07-16 8:33 ` Tony Lindgren
2014-07-16 8:33 ` Tony Lindgren
2014-07-11 2:55 ` [PATCH v4 03/11] ARM: OMAP2+: timer: Add suspend-resume callbacks for clkevent device Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-14 11:15 ` Tony Lindgren
2014-07-14 11:15 ` Tony Lindgren
2014-07-14 14:37 ` Santosh Shilimkar
2014-07-14 14:37 ` Santosh Shilimkar
2014-07-14 17:42 ` Dave Gerlach
2014-07-14 17:42 ` Dave Gerlach
2014-07-15 6:48 ` Tony Lindgren
2014-07-15 6:48 ` Tony Lindgren
2014-07-15 19:10 ` Dave Gerlach
2014-07-15 19:10 ` Dave Gerlach
2014-07-16 20:17 ` Dave Gerlach
2014-07-16 20:17 ` Dave Gerlach
2014-07-17 8:16 ` Tony Lindgren
2014-07-17 8:16 ` Tony Lindgren
2014-07-11 2:55 ` [PATCH v4 04/11] ARM: OMAP2+: Use pdata-quirks for wkup_m3 deassert_hardreset Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-14 18:48 ` Suman Anna
2014-07-14 18:48 ` Suman Anna
2014-07-11 2:55 ` [PATCH v4 05/11] Documentation: dt: add ti,am3353_wkup_m3 bindings Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-14 14:41 ` Santosh Shilimkar
2014-07-14 14:41 ` [PATCH v4 05/11] Documentation: dt: add ti, am3353_wkup_m3 bindings Santosh Shilimkar
2014-07-14 16:33 ` [PATCH v4 05/11] Documentation: dt: add ti,am3353_wkup_m3 bindings Suman Anna
2014-07-14 16:33 ` [PATCH v4 05/11] Documentation: dt: add ti, am3353_wkup_m3 bindings Suman Anna
2014-07-14 17:45 ` [PATCH v4 05/11] Documentation: dt: add ti,am3353_wkup_m3 bindings Dave Gerlach
2014-07-14 17:45 ` [PATCH v4 05/11] Documentation: dt: add ti, am3353_wkup_m3 bindings Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 06/11] remoteproc: wkup_m3: Add wkup_m3 remote proc driver Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-14 14:54 ` Santosh Shilimkar
2014-07-14 14:54 ` Santosh Shilimkar
2014-07-14 17:43 ` Dave Gerlach
2014-07-14 17:43 ` Dave Gerlach
2014-07-14 19:07 ` Suman Anna
2014-07-14 19:07 ` Suman Anna
2014-07-14 21:09 ` Dave Gerlach
2014-07-14 21:09 ` Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 07/11] ARM: dts: am33xx: Update wkup_m3 node Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 08/11] ARM: OMAP2+: AM33XX: Reserve memory to comply with EMIF spec Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 09/11] ARM: OMAP2+: AM33XX: Add assembly code for PM operations Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 10/11] ARM: OMAP2+: AM33XX: Basic suspend resume support Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-09-08 22:30 ` Kevin Hilman
2014-09-08 22:30 ` Kevin Hilman
2014-09-09 10:31 ` Ohad Ben-Cohen
2014-09-09 10:31 ` Ohad Ben-Cohen
2014-09-09 19:59 ` Suman Anna
2014-09-09 19:59 ` Suman Anna
2014-09-09 20:28 ` Dave Gerlach
2014-09-09 20:28 ` Dave Gerlach
2014-09-09 21:10 ` Kevin Hilman
2014-09-09 21:10 ` Kevin Hilman
2014-09-10 21:19 ` Dave Gerlach [this message]
2014-09-10 21:19 ` Dave Gerlach
2014-09-16 15:08 ` Ohad Ben-Cohen
2014-09-16 15:08 ` Ohad Ben-Cohen
2014-09-16 16:14 ` Suman Anna
2014-09-16 16:14 ` Suman Anna
2014-09-17 13:37 ` Ohad Ben-Cohen
2014-09-17 13:37 ` Ohad Ben-Cohen
2014-09-25 19:42 ` Dave Gerlach
2014-09-25 19:42 ` Dave Gerlach
2014-07-11 2:55 ` [PATCH v4 11/11] ARM: OMAP2+: AM33XX: Hookup AM33XX PM code into OMAP builds Dave Gerlach
2014-07-11 2:55 ` Dave Gerlach
2014-07-14 11:21 ` Tony Lindgren
2014-07-14 11:21 ` Tony Lindgren
2014-07-14 17:46 ` Dave Gerlach
2014-07-14 17:46 ` Dave Gerlach
2014-07-11 7:59 ` [PATCH v4 00/11] ARM: OMAP2+: AM33XX: Add suspend-resume support Daniel Mack
2014-07-11 7:59 ` Daniel Mack
2014-07-11 17:24 ` Dave Gerlach
2014-07-11 17:24 ` Dave Gerlach
2014-07-11 15:30 ` Andre Heider
2014-07-11 15:30 ` Andre Heider
2014-07-11 17:31 ` Dave Gerlach
2014-07-11 17:31 ` Dave Gerlach
2014-07-14 9:37 ` Andre Heider
2014-07-14 9:37 ` Andre Heider
2014-07-14 11:24 ` Tony Lindgren
2014-07-14 11:24 ` Tony Lindgren
2014-07-14 17:47 ` Dave Gerlach
2014-07-14 17:47 ` Dave Gerlach
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=5410C05A.50602@ti.com \
--to=d-gerlach@ti.com \
--cc=bcousson@baylibre.com \
--cc=daniel@zonque.org \
--cc=khilman@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=nm@ti.com \
--cc=ohad@wizery.com \
--cc=paul@pwsan.com \
--cc=russ.dill@ti.com \
--cc=s-anna@ti.com \
--cc=santosh.shilimkar@ti.com \
--cc=t-kristo@ti.com \
--cc=tony@atomide.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.