From: laurent.pinchart@ideasonboard.com (Laurent Pinchart)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH 2/2] iommu: rockchip: Handle system-wide and runtime PM
Date: Fri, 12 Dec 2014 22:47:15 +0200 [thread overview]
Message-ID: <1508486.LLFuttrbI2@avalon> (raw)
In-Reply-To: <CAAFQd5B28WiWUqmbmROJUa3H25R=Y774NuemTZDvkoa=CvZUsw@mail.gmail.com>
Hello,
On Friday 12 December 2014 13:15:51 Tomasz Figa wrote:
> On Fri, Dec 12, 2014 at 5:48 AM, Rafael J. Wysocki wrote:
> > On Thursday, December 11, 2014 04:51:37 PM Ulf Hansson wrote:
> >> On 11 December 2014 at 16:31, Kevin Hilman <khilman@kernel.org> wrote:
> >> > [+ Laurent Pinchart]
> >> >
> >> > Tomasz Figa <tfiga@chromium.org> writes:
> >> >> On Thu, Dec 11, 2014 at 8:58 PM, Ulf Hansson wrote:
> >> > [...]
> >> >
> >> >>>> @@ -988,11 +1107,28 @@ static int rk_iommu_probe(struct
> >> >>>> platform_device *pdev)>> >>>>
> >> >>>> return -ENXIO;
> >> >>>>
> >> >>>> }
> >> >>>>
> >> >>>> + pm_runtime_no_callbacks(dev);
> >> >>>> + pm_runtime_enable(dev);
> >> >>>> +
> >> >>>> + /* Synchronize state of the domain with driver data. */
> >> >>>> + pm_runtime_get_sync(dev);
> >> >>>> + iommu->is_powered = true;
> >> >>>
> >> >>> Doesn't the runtime PM status reflect the value of "is_powered", thus
> >> >>> why do you need to have a copy of it? Could it perpahps be that you
> >> >>> try to cope with the case when CONFIG_PM is unset?
> >> >>
> >> >> It's worth noting that this driver fully relies on status of other
> >> >> devices in the power domain the IOMMU is in and does not enforce the
> >> >> status on its own. So in general, as far as my understanding of PM
> >> >> runtime subsystem, the status of the IOMMU device will be always
> >> >> suspended, because nobody will call pm_runtime_get() on it (except the
> >> >> get and put pair in probe). So is_powered is here to track status of
> >> >> the domain, not the device. Feel free to suggest a better way, though.
> >> >
> >> > I still don't like these notifiers. I think they add ways to bypass
> >> > having proper runtime PM implemented for devices/subsystems.
> >>
> >> I do agree, but I haven't found another good solution to the problem.
> >
> > For the record, I'm not liking this mostly because it "fixes" a generic
> > problem in a way that's hidden in the genpd code and very indirect.
>
> Well, that's true. This is indeed a generic problem of PM dependencies
> between devices (other than those represented by parent-child
> relation), which in fact doesn't have much to do with genpd, but
> rather with those devices directly. It is just that genpd is the most
> convenient location to solve this in current code and in a simple way.
> In other words, I see this solution as a reasonable way to get the
> problem solved quickly for now, so that we can start thinking about a
> more elegant solution.
>
> >> > From a high-level, the IOMMU is just another device inside the PM
> >> > domain, so ideally it should be doing it's own _get() and _put() calls
> >> > so the PM domain code would just do the right thing without the need
> >> > for notifiers.
> >>
> >> As I understand it, the IOMMU (or for other similar cases) shouldn't
> >> be doing any get() and put() at all because there are no IO API to
> >> serve request from.
Speaking purely from an IOMMU point of view that's not entirely tree. IOMMU
drivers expose map and unmap operations, so they can track whether any memory
is mapped. From a bus master point of view the IOMMU map and unmap operations
are hidden by the DMA mapping API. The IOMMU can thus track the existence of
mappings without any IOMMU awareness in the bus master driver.
If no mapping exist the IOMMU shouldn't receive any translation request. An
IOMMU driver could thus call pm_runtime_get_sync() in the map handler when
creating the first mapping, and pm_runtime_put() in the unmap handler when
tearing the last mapping down.
One could argue that the IOMMU would end up being powered more often than
strictly needed, as bus masters drivers, even when written properly, could
keep mappings around at times they don't perform bus access. This is true, and
that's an argument I've raised during the last kernel summit. The general
response (including Linus Torvald's) was that micro-optimizing power
management might not be worth it, and that measurements proving that the gain
is worth it are required before introducing new APIs to solve the problem. I
can't disagree with that argument.
> >> In principle we could consider these kind devices as "parent" devices
> >> to those other devices that needs them. Then runtime PM core would
> >> take care of things for us, right!?
> >>
> >> Now, I am not so sure using the "parent" approach is actually viable,
> >> since it will likely have other complications, but I haven't
> >> thoroughly thought it though yet.
> >
> > That actually need not be a "parent".
> >
> > What's needed in this case is to do a pm_runtime_get_sync() on a device
> > depended on every time a dependent device is runtime-resumed (and
> > analogously for suspending).
> >
> > The core doesn't have a way to do that, but it looks like we'll need to
> > add it anyway for various reasons (ACPI _DEP is one of them as I mentioned
> > some time ago, but people dismissed it basically as not their problem).
>
> Let me show you our exact use case.
>
> We have a power domain, which contains an IOMMU and an IP block, which
> can do bus transactions through that IOMMU. Of course the IP block is
> not aware of the IOMMU, because this is just an integration detail and
> on other platforms using the same IP block the IOMMU might not be
> there. This implies that the driver for this IP block should not be
> aware of the IOMMU either, which, on the buffer allocation and mapping
> side, is achieved by DMA mapping subsystem. We would also want the
> IOMMU to be fully transparent to that driver on PM side.
>
> Now, for PM related details, they are located in the same power
> domain, which means that whenever the power domain is turned off, the
> CPU can't access their registers and all the hardware state is gone.
> To make the case more interesting, there is no point in programming
> the IOMMU unless the device using it is powered on. Similarly, there
> is no point in powering the domain on to just access the IOMMU. This
> implies that the power domain should be fully controlled by the
> stand-alone IP block, while the peripheral IOMMU shouldn't affect its
> state and its driver only respond to operations performed by driver of
> that stand-alone IP block.
>
> A solution like below could work for the above:
>
> - There is a per-device list of peripheral devices, which need to be
> powered on for this device to work.
> - Whenever the IOMMU subsystem/driver binds an IOMMU to a device, it
> adds the IOMMU device to the list of peripheral devices of that device
> (and similarly for removal).
> - A runtime PM operation on a device will also perform the same
> operation on all its peripheral devices.
>
> Another way would be to extend what the PM runtime core does with
> parent-child relations to handle the whole list of peripheral devices
> instead of just the parent.
>
> Would this design sound somehow reasonable to you?
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2014-12-12 20:47 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-11 8:26 [RFC PATCH 0/2] Fix rockchip IOMMU driver vs PM issues Tomasz Figa
2014-12-11 8:26 ` [RFC PATCH 1/2] pm: Add PM domain notifications Tomasz Figa
2014-12-11 10:36 ` Sylwester Nawrocki
2014-12-11 11:04 ` Tomasz Figa
2014-12-11 13:54 ` Sylwester Nawrocki
2014-12-11 15:30 ` Ulf Hansson
2014-12-11 8:26 ` [RFC PATCH 2/2] iommu: rockchip: Handle system-wide and runtime PM Tomasz Figa
2014-12-11 11:58 ` Ulf Hansson
2014-12-11 12:42 ` Tomasz Figa
2014-12-11 15:22 ` Ulf Hansson
2014-12-11 15:31 ` Kevin Hilman
2014-12-11 15:51 ` Ulf Hansson
2014-12-11 20:48 ` Rafael J. Wysocki
2014-12-12 4:15 ` Tomasz Figa
2014-12-12 20:04 ` Kevin Hilman
2014-12-15 2:32 ` Tomasz Figa
2014-12-15 8:35 ` Geert Uytterhoeven
2014-12-15 18:06 ` Kevin Hilman
2014-12-12 20:47 ` Laurent Pinchart [this message]
2014-12-15 2:39 ` Tomasz Figa
2014-12-15 19:53 ` Laurent Pinchart
2014-12-16 2:18 ` Tomasz Figa
2014-12-17 0:15 ` Laurent Pinchart
2014-12-18 1:32 ` Rafael J. Wysocki
2014-12-18 19:12 ` Laurent Pinchart
2014-12-18 21:14 ` Kevin Hilman
2014-12-18 21:28 ` Laurent Pinchart
2014-12-19 2:27 ` Rafael J. Wysocki
2014-12-20 19:01 ` Laurent Pinchart
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=1508486.LLFuttrbI2@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=linux-arm-kernel@lists.infradead.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).