From: Lukas Wunner <lukas@wunner.de>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Andreas Noever <andreas.noever@gmail.com>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
Tomas Winkler <tomas.winkler@intel.com>,
Amir Levy <amir.jer.levy@intel.com>
Subject: Re: [PATCH v3 6/7] thunderbolt: Power down controller when idle
Date: Tue, 20 Dec 2016 12:28:56 +0100 [thread overview]
Message-ID: <20161220112856.GA14428@wunner.de> (raw)
In-Reply-To: <CAHp75VfzuTaBpZd+Hu2uHbhAPHzHQDdPOwOvb9ejP2j22OWoog@mail.gmail.com>
On Mon, Dec 19, 2016 at 01:05:10AM +0200, Andy Shevchenko wrote:
> On Sat, Dec 17, 2016 at 4:39 PM, Lukas Wunner <lukas@wunner.de> wrote:
> > Document and implement Apple's ACPI-based (but nonstandard) pm mechanism
> > for Thunderbolt. Briefly, an ACPI method provided by Apple is used to
> > cut power to the controller. A GPE is enabled while the controller is
> > powered down which sideband-signals a plug event, whereupon we reinstate
> > power using the ACPI method.
> >
> > This saves 1.7 W on machines with a Light Ridge controller and is
> > reported to save 4 W on Cactus Ridge 4C and Falcon Ridge 4C. (I believe
> > 4 W includes the bus power drawn by Apple's Gigabit Ethernet adapter.)
> > It fixes (at least partially) a power regression introduced in 3.17 by
> > commit 7bc5a2bad0b8 ("ACPI: Support _OSI("Darwin") correctly").
> >
>
> > +++ b/drivers/thunderbolt/power.c
> > @@ -0,0 +1,347 @@
>
> > +#include <linux/delay.h>
> > +#include <linux/pci.h>
> > +#include <linux/pm_runtime.h>
> > +
> > +#include "power.h"
> > +
>
> > +#ifdef pr_fmt
> > +#undef pr_fmt
> > +#endif
> > +#define pr_fmt(fmt) KBUILD_MODNAME " %s: " fmt, dev_name(dev)
>
> Perhaps just define pr_fmt before any other include?
> We have such check where actually default pr_fmt is defined. No need
> to duplicate.
If I put the '#define pr_fmt(fmt)' line above all includes, I get:
include/linux/ratelimit.h: In function 'ratelimit_state_exit':
drivers/thunderbolt/power.c:93:49: error: implicit declaration of function 'dev_name'
This is caused by 6b1d174b0c27 which was introduced this August.
If I try to solve this by including <linux/device.h> before the
'#define pr_fmt(fmt)' line, I get:
drivers/thunderbolt/power.c:95:0: warning: "pr_fmt" redefined
#define pr_fmt(fmt) KBUILD_MODNAME " %s: " fmt, dev_name(dev)
^
In file included from /root/kernel/linux/include/linux/kernel.h:13:0,
from /root/kernel/linux/include/linux/list.h:8,
from /root/kernel/linux/include/linux/kobject.h:20,
from /root/kernel/linux/include/linux/device.h:17,
from /root/kernel/linux/drivers/thunderbolt/power.c:93:
include/linux/printk.h:260:0: note: this is the location of the previous definition
#define pr_fmt(fmt) fmt
^
So it seems there's no alternative to the '#undef pr_fmt'.
> > + /* prevent interrupts during system sleep transition */
> > + if (ACPI_FAILURE(acpi_disable_gpe(NULL, power->wake_gpe))) {
> > + pr_err("cannot disable wake GPE, resuming\n");
>
> dev_err?
This is intentionally pr_err for cosmetic reasons. :-)
With dev_err it would look like this in dmesg:
pcieport 0000:05:00.0: cannot disable wake GPE, resuming
With pr_err it looks like this:
thunderbolt 0000:05:00.0: cannot disable wake GPE, resuming
Thus, someone grepping for this error message will get a hint that
they have to look in drivers/thunderbolt/ rather than drivers/pci/pcie/.
The code of this PM callback is located in the thunderbolt driver,
which binds to the NHI, 0000:07:00.0. But the PM callback is
assigned to the upstream bridge, which is the grandparent of the NHI,
0000:05:00.0. The pr_fmt is crafted such that the KBUILD_MODNAME
("thunderbolt") is logged rather than "pcieport". So I use pr_*
in the PM callbacks assigned to the upstream bridge and dev_*
in thunderbolt_power_init() / _fini() (which is executed in the
context of the NHI).
This is also much nicer for end users looking at dmesg. E.g. when
the chip is suspended, it looks like this:
thunderbolt 0000:07:00.0: suspending...
thunderbolt 0000:07:00.0: stopping RX ring 0
thunderbolt 0000:07:00.0: disabling interrupt at register 0x38204 bit 0 (0x1 -> 0x0)
thunderbolt 0000:07:00.0: stopping TX ring 0
thunderbolt 0000:07:00.0: disabling interrupt at register 0x38200 bit 0 (0x1 -> 0x0)
thunderbolt 0000:07:00.0: control channel stopped
thunderbolt 0000:07:00.0: suspend finished
thunderbolt 0000:05:00.0: powering down
It would be confusing for end users if it would say here that
the pcieport is powering down.
> > + /*
> > + * On gen 2 controllers, the wake GPE fires as long as the controller
> > + * is powered up. Poll until it's powered down before enabling the GPE.
> > + */
> > + for (i = 0; i < 300; i++) {
>
> 300 is magic.
[...]
> Why 800? Perhaps comment on this.
We mimic the behaviour of the macOS driver here which polls up to
300 times with a 1 ms delay. I've now extended the comment above
in my working branch to explain this.
> > +err:
>
> err_resume: ?
Ok.
> > +err:
>
> err_free: ?
Ok.
> > +void thunderbolt_power_fini(struct tb *tb)
> > +{
> > + struct device *nhi_dev = &tb->nhi->pdev->dev;
> > + struct device *upstream_dev = nhi_dev->parent->parent;
> > + struct tb_power *power = tb->power;
> > +
>
> > + if (!power)
> > + return;
>
> Would be the case?
That would be the case if thunderbolt_power_init() failed, then we
have to skip removing the GPE handler and all that. I've now added
a comment to explain this.
I've also discovered and fixed a bug in thunderbolt_power_init(),
in the "cannot find upstream bridge" error path I have to remove
the GPE handler.
I'll wait a bit if there's further feedback and will post a
rectified version probably next week, after the merge window
has closed.
Thanks!
Lukas
next prev parent reply other threads:[~2016-12-20 11:28 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-17 14:39 [PATCH v3 0/7] Runtime PM for Thunderbolt on Macs Lukas Wunner
2016-12-17 14:39 ` [PATCH v3 1/7] PCI: Recognize Thunderbolt devices Lukas Wunner
2016-12-17 14:39 ` [PATCH v3 6/7] thunderbolt: Power down controller when idle Lukas Wunner
2016-12-18 23:05 ` Andy Shevchenko
2016-12-20 11:28 ` Lukas Wunner [this message]
2016-12-20 13:44 ` Andy Shevchenko
2016-12-21 10:53 ` Lukas Wunner
2016-12-17 14:39 ` [PATCH v3 2/7] PCI: Allow runtime PM on Thunderbolt ports Lukas Wunner
2016-12-17 14:39 ` [PATCH v3 7/7] thunderbolt: Runtime suspend NHI when idle Lukas Wunner
2016-12-17 14:39 ` [PATCH v3 3/7] PCI: Don't block runtime PM for Thunderbolt host hotplug ports Lukas Wunner
2016-12-17 14:39 ` [PATCH v3 4/7] Revert "PM / Runtime: Remove the exported function pm_children_suspended()" Lukas Wunner
2016-12-17 14:39 ` [PATCH v3 5/7] PM: Make requirements of dev_pm_domain_set() more precise Lukas Wunner
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=20161220112856.GA14428@wunner.de \
--to=lukas@wunner.de \
--cc=amir.jer.levy@intel.com \
--cc=andreas.noever@gmail.com \
--cc=andy.shevchenko@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=tomas.winkler@intel.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 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).