From: David Brownell <david-b@pacbell.net>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: lenb@kernel.org, trenn@suse.de,
linux-pm@lists.linux-foundation.org, linux-acpi@vger.kernel.org
Subject: Re: [patch 2.6.25-rc6 3/7] pci_choose_state() cleanup and fixes
Date: Fri, 21 Mar 2008 00:53:03 -0700 [thread overview]
Message-ID: <200803210053.04330.david-b@pacbell.net> (raw)
In-Reply-To: <200803210122.44188.rjw@sisk.pl>
On Thursday 20 March 2008, Rafael J. Wysocki wrote:
> The original code executed platform_pci_choose_state() first, if defined, and
> if that succeeded, it just returned the result. You put
> platform_pci_choose_state() under the switch(). :-)
So the updated patch just chooses a new state when drivers are
supposed to enter a lowpowerstate: SUSPEND and HIBERNATE.
Appended.
> In fact the entire switch() in pci_choose_state() is just confusing.
All it does is implement the rules that have been defined for
ages now: most of the pm_message_t transitions should not
change device power states.
> I'd make
> it return PCI_D3hot if platform_pci_choose_state() is undefined or fails
See above: this implements the current rules, which say
that in most cases devices shoudn't change powerstates.
> > > I really don't think pci_choose_state() should take the state argument at all.
> >
> > There is no "state" argument. It's a pm_message_t, which does
> > not package the target state.
>
> Correct, but the pm_message_t argument is called 'state', confusingly so.
Which was (and is!) one of the cleanups in $SUBJECT.
- Dave
======== CUT HERE
Clean up pci_choose_state():
- pci_choose_state() should only return PCI_D0, unless the system is
entering a suspend (or hibernate) system state.
- Only use platform_pci_choose_state() when entering a suspend
state ... and avoid PCI_D1 and PCI_D2 when appropriate.
- Corrrect kerneldoc.
Note that for now only ACPI provides platform_pci_choose_state(), so
this could be a minor change in behavior on some non-PC systems: it
avoids D3 except in the final stage of hibernation.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
---
drivers/pci/pci.c | 49 ++++++++++++++++++++++++++-----------------------
1 file changed, 26 insertions(+), 23 deletions(-)
--- g26.orig/drivers/pci/pci.c 2008-03-20 03:02:46.000000000 -0700
+++ g26/drivers/pci/pci.c 2008-03-21 00:51:19.000000000 -0700
@@ -523,46 +523,49 @@ pci_set_power_state(struct pci_dev *dev,
}
pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev, pm_message_t state);
-
+
/**
* pci_choose_state - Choose the power state of a PCI device
* @dev: PCI device to be suspended
- * @state: target sleep state for the whole system. This is the value
- * that is passed to suspend() function.
+ * @mesg: value passed to suspend() function.
*
* Returns PCI power state suitable for given device and given system
- * message.
+ * power state transition.
*/
-
-pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state)
+pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t mesg)
{
pci_power_t ret;
+ /* PCI legacy PM? */
if (!pci_find_capability(dev, PCI_CAP_ID_PM))
return PCI_D0;
- if (platform_pci_choose_state) {
- ret = platform_pci_choose_state(dev, state);
- if (ret != PCI_POWER_ERROR)
- return ret;
- }
-
- switch (state.event) {
- case PM_EVENT_ON:
- return PCI_D0;
- case PM_EVENT_FREEZE:
- case PM_EVENT_PRETHAW:
- /* REVISIT both freeze and pre-thaw "should" use D0 */
+ switch (mesg.event) {
case PM_EVENT_SUSPEND:
case PM_EVENT_HIBERNATE:
- return PCI_D3hot;
+ /* NOTE: platform_pci_choose_state() should only return
+ * states where wakeup won't work if
+ * - !device_may_wakeup(&dev->dev), or
+ * - dev can't wake from the target system state
+ */
+ if (platform_pci_choose_state) {
+ ret = platform_pci_choose_state(dev, mesg);
+ if (ret == PCI_POWER_ERROR)
+ ret = PCI_D3hot;
+ else if ((ret == PCI_D1 || ret == PCI_D2)
+ && pci_no_d1d2(dev))
+ ret = PCI_D3hot;
+ break;
+ }
+ /* D3hot works, but may be suboptimal */
+ ret = PCI_D3hot;
+ break;
default:
- printk("Unrecognized suspend event %d\n", state.event);
- BUG();
+ ret = PCI_D0;
+ break;
}
- return PCI_D0;
+ return ret;
}
-
EXPORT_SYMBOL(pci_choose_state);
static int pci_save_pcie_state(struct pci_dev *dev)
next prev parent reply other threads:[~2008-03-21 8:15 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-20 21:08 [patch 2.6.25-rc6 0/7] misc pm wake patches David Brownell
2008-03-20 21:09 ` [patch 2.6.25-rc6 1/7] crosslink ACPI and "real" device nodes David Brownell
2008-03-21 6:43 ` Zhao Yakui
2008-03-21 6:43 ` Zhao Yakui
2008-03-21 7:31 ` David Brownell
2008-03-21 7:31 ` David Brownell
2008-03-21 8:34 ` Zhao Yakui
2008-03-21 9:04 ` David Brownell
2008-03-21 9:04 ` David Brownell
2008-03-21 8:34 ` Zhao Yakui
2008-03-20 21:09 ` David Brownell
2008-03-20 21:10 ` [patch 2.6.25-rc6 2/7] acpi_pm_device_sleep_state() cleanup David Brownell
2008-03-20 21:10 ` David Brownell
2008-03-24 16:30 ` Pavel Machek
2008-03-24 16:30 ` [linux-pm] " Pavel Machek
2008-04-19 4:11 ` [RESEND patch 2.6.25] " David Brownell
2008-04-29 20:33 ` [RE-RESEND patch 2.6.25-git] " David Brownell
2008-04-29 20:33 ` David Brownell
2008-04-29 21:49 ` Rafael J. Wysocki
2008-04-29 22:12 ` David Brownell
2008-04-29 22:12 ` David Brownell
2008-04-30 12:07 ` Rafael J. Wysocki
2008-04-30 12:07 ` Rafael J. Wysocki
2008-04-29 21:49 ` Rafael J. Wysocki
2008-03-20 21:12 ` [patch 2.6.25-rc6 3/7] pci_choose_state() cleanup and fixes David Brownell
2008-03-20 21:12 ` David Brownell
2008-03-20 22:37 ` Rafael J. Wysocki
2008-03-20 22:37 ` Rafael J. Wysocki
2008-03-20 23:03 ` David Brownell
2008-03-21 0:22 ` Rafael J. Wysocki
2008-03-21 0:55 ` [linux-pm] " Alan Stern
2008-03-21 1:47 ` Rafael J. Wysocki
2008-03-21 1:47 ` [linux-pm] " Rafael J. Wysocki
2008-03-21 8:15 ` David Brownell
2008-03-21 16:23 ` Rafael J. Wysocki
2008-03-21 16:23 ` [linux-pm] " Rafael J. Wysocki
2008-03-22 17:55 ` David Brownell
2008-03-22 18:11 ` Rafael J. Wysocki
2008-03-22 18:11 ` [linux-pm] " Rafael J. Wysocki
2008-03-22 18:29 ` David Brownell
2008-03-22 18:29 ` David Brownell
2008-03-22 17:55 ` David Brownell
2008-03-21 8:15 ` David Brownell
2008-03-21 0:55 ` Alan Stern
2008-03-21 7:53 ` David Brownell
2008-03-21 7:53 ` David Brownell [this message]
2008-03-21 16:38 ` Rafael J. Wysocki
2008-03-22 17:49 ` David Brownell
2008-03-22 17:49 ` David Brownell
2008-03-22 18:34 ` Rafael J. Wysocki
2008-03-22 18:34 ` Rafael J. Wysocki
2008-04-14 4:59 ` David Brownell
2008-04-14 4:59 ` David Brownell
2008-03-21 16:38 ` Rafael J. Wysocki
2008-03-21 0:22 ` Rafael J. Wysocki
2008-03-20 23:03 ` David Brownell
2008-03-20 21:15 ` [patch 2.6.25-rc6 4/7] USB uses pci_choose_state() David Brownell
2008-03-20 21:15 ` David Brownell
2008-03-20 21:20 ` [patch 2.6.25-rc6 5/7] ACPI sets up device.power.can_wakeup flags David Brownell
2008-03-20 21:20 ` David Brownell
2008-03-21 7:43 ` Zhao Yakui
2008-03-21 7:43 ` Zhao Yakui
2008-04-19 4:14 ` [RESEND patch 2.6.25] " David Brownell
2008-04-22 2:48 ` Zhang Rui
2008-04-22 2:48 ` Zhang Rui
2008-04-19 4:14 ` David Brownell
2008-03-20 21:22 ` [patch 2.6.25-rc6 6/7] ACPI uses device_may_wakeup() policy inputs David Brownell
2008-04-19 4:18 ` [RESEND patch 2.6.25] " David Brownell
2008-04-22 2:42 ` Zhang Rui
2008-04-26 19:29 ` David Brownell
2008-04-26 19:29 ` David Brownell
2008-04-22 2:42 ` Zhang Rui
2008-04-22 13:30 ` Zhao Yakui
2008-04-22 13:30 ` Zhao Yakui
2008-04-26 19:37 ` David Brownell
2008-04-28 12:48 ` Zhao Yakui
2008-04-28 12:48 ` Zhao Yakui
2008-04-28 8:50 ` Zhang Rui
2008-04-28 13:43 ` Alan Stern
2008-04-28 13:43 ` [linux-pm] " Alan Stern
2008-04-29 23:38 ` David Brownell
2008-04-29 23:38 ` [linux-pm] " David Brownell
2008-04-30 13:58 ` Alan Stern
2008-04-30 13:58 ` [linux-pm] " Alan Stern
2008-05-14 14:56 ` Pavel Machek
2008-05-14 14:56 ` Pavel Machek
2008-04-28 22:28 ` David Brownell
2008-04-28 22:28 ` David Brownell
2008-04-28 8:50 ` Zhang Rui
2008-04-28 21:35 ` Henrique de Moraes Holschuh
2008-04-28 21:35 ` Henrique de Moraes Holschuh
2008-04-28 22:20 ` David Brownell
2008-04-28 22:20 ` David Brownell
2008-04-28 22:54 ` Henrique de Moraes Holschuh
2008-04-28 22:54 ` Henrique de Moraes Holschuh
2008-04-29 0:20 ` David Brownell
2008-04-29 0:20 ` David Brownell
2008-04-29 20:32 ` David Brownell
2008-04-29 20:32 ` David Brownell
2008-04-28 22:24 ` David Brownell
2008-04-28 22:24 ` David Brownell
2008-04-28 22:26 ` David Brownell
2008-04-28 22:26 ` David Brownell
2008-04-26 19:37 ` David Brownell
2008-03-20 21:22 ` [patch 2.6.25-rc6 6/7] " David Brownell
2008-03-20 21:25 ` [patch 2.6.25-rc6 7/7] PCI set up device.power.can_wakeup flags David Brownell
2008-03-20 21:25 ` David Brownell
2008-03-20 21:53 ` [linux-pm] " Alan Stern
2008-03-20 22:22 ` David Brownell
2008-03-20 22:22 ` David Brownell
2008-03-20 21:53 ` Alan Stern
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=200803210053.04330.david-b@pacbell.net \
--to=david-b@pacbell.net \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=rjw@sisk.pl \
--cc=trenn@suse.de \
/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.