When a device is not power manageable by the platform, and not already
in a low power state pci_target_state() will find the deepest state
that PME is supported and use this to select the wakeup state.
Simplify this logic and split it out to a local function. No intended
functional changes.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v10->v11:
* New patch split from existing patch in v10
---
drivers/pci/pci.c | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 60230da957e0c..693f4ca90452b 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2660,6 +2660,20 @@ int pci_wake_from_d3(struct pci_dev *dev, bool enable)
}
EXPORT_SYMBOL(pci_wake_from_d3);
+/*
+ * Find the deepest state from which the device can generate
+ * PME#.
+ */
+static inline pci_power_t pci_get_wake_pme_state(struct pci_dev *dev)
+{
+ pci_power_t state = PCI_D3hot;
+
+ while (state && !(dev->pme_support & (1 << state)))
+ state--;
+
+ return state;
+}
+
/**
* pci_target_state - find an appropriate low power state for a given PCI dev
* @dev: PCI device
@@ -2701,21 +2715,8 @@ static pci_power_t pci_target_state(struct pci_dev *dev, bool wakeup)
else if (!dev->pm_cap)
return PCI_D0;
- if (wakeup && dev->pme_support) {
- pci_power_t state = PCI_D3hot;
-
- /*
- * Find the deepest state from which the device can generate
- * PME#.
- */
- while (state && !(dev->pme_support & (1 << state)))
- state--;
-
- if (state)
- return state;
- else if (dev->pme_support & 1)
- return PCI_D0;
- }
+ if (wakeup && dev->pme_support)
+ return pci_get_wake_pme_state(dev);
return PCI_D3hot;
}
--
2.34.1
On Wed, Aug 09, 2023 at 01:54:52PM -0500, Mario Limonciello wrote: > When a device is not power manageable by the platform, and not already > in a low power state pci_target_state() will find the deepest state > that PME is supported and use this to select the wakeup state. > > Simplify this logic and split it out to a local function. No intended > functional changes. ... > +static inline pci_power_t pci_get_wake_pme_state(struct pci_dev *dev) > +{ > + pci_power_t state = PCI_D3hot; > + > + while (state && !(dev->pme_support & (1 << state))) > + state--; > + > + return state; Sparse won't be happy about this code (with CF=-D__CHECK_ENDIAN__). Basically it's something like return (__force pci_power_t)fls(dev->pme_support & GENMASK(PCI_D3hot, 0)); (but double check and test the logic). > +} ... Yeah, I see that is the existing code, perhaps amend it first? -- With Best Regards, Andy Shevchenko
On 8/10/2023 11:21 AM, Andy Shevchenko wrote: > On Wed, Aug 09, 2023 at 01:54:52PM -0500, Mario Limonciello wrote: >> When a device is not power manageable by the platform, and not already >> in a low power state pci_target_state() will find the deepest state >> that PME is supported and use this to select the wakeup state. >> >> Simplify this logic and split it out to a local function. No intended >> functional changes. > > ... > >> +static inline pci_power_t pci_get_wake_pme_state(struct pci_dev *dev) >> +{ >> + pci_power_t state = PCI_D3hot; >> + >> + while (state && !(dev->pme_support & (1 << state))) >> + state--; >> + >> + return state; > > Sparse won't be happy about this code (with CF=-D__CHECK_ENDIAN__). > > Basically it's something like > > return (__force pci_power_t)fls(dev->pme_support & GENMASK(PCI_D3hot, 0)); > > (but double check and test the logic). > >> +} > > ... > > Yeah, I see that is the existing code, perhaps amend it first? > Are you sure? I actually double checked the sparse output using this command before I sent it. make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' drivers/pci/pci.o I didn't see anything related to the line numbers for this function.
On Thu, Aug 10, 2023 at 11:29:49AM -0500, Limonciello, Mario wrote: > On 8/10/2023 11:21 AM, Andy Shevchenko wrote: > > On Wed, Aug 09, 2023 at 01:54:52PM -0500, Mario Limonciello wrote: ... > > > +static inline pci_power_t pci_get_wake_pme_state(struct pci_dev *dev) > > > +{ > > > + pci_power_t state = PCI_D3hot; > > > + > > > + while (state && !(dev->pme_support & (1 << state))) > > > + state--; > > > + > > > + return state; > > > > Sparse won't be happy about this code (with CF=-D__CHECK_ENDIAN__). > > > > Basically it's something like > > > > return (__force pci_power_t)fls(dev->pme_support & GENMASK(PCI_D3hot, 0)); > > > > (but double check and test the logic). > > > > > +} > > > > ... > > > > Yeah, I see that is the existing code, perhaps amend it first? > > > > Are you sure? Yes. Just the original code drivers/pci/pci.c:2711:60: warning: restricted pci_power_t degrades to integer drivers/pci/pci.c:2712:30: warning: restricted pci_power_t degrades to integer /* * Find the deepest state from which the device can generate * PME#. */ 2711 ==> while (state && !(dev->pme_support & (1 << state))) 2712 ==> state--; How is yours different? > I actually double checked the sparse output using this > command before I sent it. > > make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' drivers/pci/pci.o > > I didn't see anything related to the line numbers for this function. Just in case... $ gcc --version gcc (Debian 12.3.0-5) 12.3.0 $ sparse --version 0.6.4 (Debian: 0.6.4-3) $ make --version GNU Make 4.3 Built for x86_64-pc-linux-gnu -- With Best Regards, Andy Shevchenko
On 8/11/2023 3:55 AM, Andy Shevchenko wrote: > On Thu, Aug 10, 2023 at 11:29:49AM -0500, Limonciello, Mario wrote: >> On 8/10/2023 11:21 AM, Andy Shevchenko wrote: >>> On Wed, Aug 09, 2023 at 01:54:52PM -0500, Mario Limonciello wrote: > > ... > >>>> +static inline pci_power_t pci_get_wake_pme_state(struct pci_dev *dev) >>>> +{ >>>> + pci_power_t state = PCI_D3hot; >>>> + >>>> + while (state && !(dev->pme_support & (1 << state))) >>>> + state--; >>>> + >>>> + return state; >>> >>> Sparse won't be happy about this code (with CF=-D__CHECK_ENDIAN__). >>> >>> Basically it's something like >>> >>> return (__force pci_power_t)fls(dev->pme_support & GENMASK(PCI_D3hot, 0)); >>> >>> (but double check and test the logic). >>> >>>> +} >>> >>> ... >>> >>> Yeah, I see that is the existing code, perhaps amend it first? >>> >> >> Are you sure? > > Yes. > > Just the original code > > drivers/pci/pci.c:2711:60: warning: restricted pci_power_t degrades to integer > drivers/pci/pci.c:2712:30: warning: restricted pci_power_t degrades to integer > > /* > * Find the deepest state from which the device can generate > * PME#. > */ > 2711 ==> while (state && !(dev->pme_support & (1 << state))) > 2712 ==> state--; > > How is yours different? > >> I actually double checked the sparse output using this >> command before I sent it. >> >> make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' drivers/pci/pci.o >> >> I didn't see anything related to the line numbers for this function. > > Just in case... > > $ gcc --version > gcc (Debian 12.3.0-5) 12.3.0 > > $ sparse --version > 0.6.4 (Debian: 0.6.4-3) > > $ make --version > GNU Make 4.3 > Built for x86_64-pc-linux-gnu > Oh, I see why I wasn't observing it now. Because it's inline code it's processed separately and isn't with the rest of the grouped output from 2416 through 2922. drivers/pci/pci.c:2679:52: sparse: warning: restricted pci_power_t degrades to integer drivers/pci/pci.c:2680:22: sparse: warning: restricted pci_power_t degrades to integer
© 2016 - 2025 Red Hat, Inc.