* [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected @ 2025-06-23 19:13 Mario Limonciello 2025-06-24 7:22 ` Lukas Wunner 0 siblings, 1 reply; 6+ messages in thread From: Mario Limonciello @ 2025-06-23 19:13 UTC (permalink / raw) To: mario.limonciello, bhelgaas; +Cc: Lukas Wunner, linux-pci From: Mario Limonciello <mario.limonciello@amd.com> When a USB4 dock is unplugged the PCIe bridge it's connected to will issue a "Link Down" and "Card not detected event". The PCI core will treat this as a surprise hotplug event and unconfigure all downstream devices. This involves setting the device error state to `pci_channel_io_perm_failure` which pci_dev_is_disconnected() will check. It doesn't make sense to runtime resume disconnected devices to D0 and report the (expected) error, so bail early. Suggested-by: Lukas Wunner <lukas@wunner.de> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> --- v4: * no info message v3: * Adjust text and subject * Add an info message instead v2: * Use pci_dev_is_disconnected() v1: https://lore.kernel.org/linux-usb/20250609020223.269407-1-superm1@kernel.org/T/#mf95c947990d016fbfccfd11afe60b8ae08aafa0b --- drivers/pci/pci.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 9e42090fb1089..160a9a482c732 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1374,6 +1374,11 @@ int pci_power_up(struct pci_dev *dev) return -EIO; } + if (pci_dev_is_disconnected(dev)) { + dev->current_state = PCI_D3cold; + return -EIO; + } + pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); if (PCI_POSSIBLE_ERROR(pmcsr)) { pci_err(dev, "Unable to change power state from %s to D0, device inaccessible\n", -- 2.43.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected 2025-06-23 19:13 [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected Mario Limonciello @ 2025-06-24 7:22 ` Lukas Wunner 2025-06-24 10:24 ` Rafael J. Wysocki 0 siblings, 1 reply; 6+ messages in thread From: Lukas Wunner @ 2025-06-24 7:22 UTC (permalink / raw) To: Mario Limonciello Cc: mario.limonciello, bhelgaas, linux-pci, Rafael J. Wysocki, Mika Westerberg [cc += Rafael, Mika] On Mon, Jun 23, 2025 at 02:13:34PM -0500, Mario Limonciello wrote: > From: Mario Limonciello <mario.limonciello@amd.com> > > When a USB4 dock is unplugged the PCIe bridge it's connected to will > issue a "Link Down" and "Card not detected event". The PCI core will > treat this as a surprise hotplug event and unconfigure all downstream > devices. This involves setting the device error state to > `pci_channel_io_perm_failure` which pci_dev_is_disconnected() will check. > > It doesn't make sense to runtime resume disconnected devices to D0 and > report the (expected) error, so bail early. > > Suggested-by: Lukas Wunner <lukas@wunner.de> > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Reviewed-by: Lukas Wunner <lukas@wunner.de> > --- > v4: > * no info message > v3: > * Adjust text and subject > * Add an info message instead > v2: > * Use pci_dev_is_disconnected() > v1: https://lore.kernel.org/linux-usb/20250609020223.269407-1-superm1@kernel.org/T/#mf95c947990d016fbfccfd11afe60b8ae08aafa0b > --- > drivers/pci/pci.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index 9e42090fb1089..160a9a482c732 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -1374,6 +1374,11 @@ int pci_power_up(struct pci_dev *dev) > return -EIO; > } > > + if (pci_dev_is_disconnected(dev)) { > + dev->current_state = PCI_D3cold; > + return -EIO; > + } > + > pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); > if (PCI_POSSIBLE_ERROR(pmcsr)) { > pci_err(dev, "Unable to change power state from %s to D0, device inaccessible\n", > -- > 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected 2025-06-24 7:22 ` Lukas Wunner @ 2025-06-24 10:24 ` Rafael J. Wysocki 2025-06-24 15:08 ` Mario Limonciello 0 siblings, 1 reply; 6+ messages in thread From: Rafael J. Wysocki @ 2025-06-24 10:24 UTC (permalink / raw) To: Lukas Wunner, Mario Limonciello Cc: mario.limonciello, bhelgaas, linux-pci, Mika Westerberg On Tue, Jun 24, 2025 at 9:22 AM Lukas Wunner <lukas@wunner.de> wrote: > > [cc += Rafael, Mika] > > On Mon, Jun 23, 2025 at 02:13:34PM -0500, Mario Limonciello wrote: > > From: Mario Limonciello <mario.limonciello@amd.com> > > > > When a USB4 dock is unplugged the PCIe bridge it's connected to will > > issue a "Link Down" and "Card not detected event". The PCI core will > > treat this as a surprise hotplug event and unconfigure all downstream > > devices. This involves setting the device error state to > > `pci_channel_io_perm_failure` which pci_dev_is_disconnected() will check. > > > > It doesn't make sense to runtime resume disconnected devices to D0 and > > report the (expected) error, so bail early. > > > > Suggested-by: Lukas Wunner <lukas@wunner.de> > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > Reviewed-by: Lukas Wunner <lukas@wunner.de> > > > --- > > v4: > > * no info message > > v3: > > * Adjust text and subject > > * Add an info message instead > > v2: > > * Use pci_dev_is_disconnected() > > v1: https://lore.kernel.org/linux-usb/20250609020223.269407-1-superm1@kernel.org/T/#mf95c947990d016fbfccfd11afe60b8ae08aafa0b > > --- > > drivers/pci/pci.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > > index 9e42090fb1089..160a9a482c732 100644 > > --- a/drivers/pci/pci.c > > +++ b/drivers/pci/pci.c > > @@ -1374,6 +1374,11 @@ int pci_power_up(struct pci_dev *dev) > > return -EIO; > > } > > > > + if (pci_dev_is_disconnected(dev)) { > > + dev->current_state = PCI_D3cold; Why not PCI_UNKNOWN? > > + return -EIO; > > + } > > + > > pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); > > if (PCI_POSSIBLE_ERROR(pmcsr)) { > > pci_err(dev, "Unable to change power state from %s to D0, device inaccessible\n", > > -- > > 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected 2025-06-24 10:24 ` Rafael J. Wysocki @ 2025-06-24 15:08 ` Mario Limonciello 2025-06-26 12:09 ` Ilpo Järvinen 2025-06-26 12:31 ` Rafael J. Wysocki 0 siblings, 2 replies; 6+ messages in thread From: Mario Limonciello @ 2025-06-24 15:08 UTC (permalink / raw) To: Rafael J. Wysocki, Lukas Wunner, Bjorn Helgaas Cc: mario.limonciello, linux-pci, Mika Westerberg On 6/24/25 5:24 AM, Rafael J. Wysocki wrote: > On Tue, Jun 24, 2025 at 9:22 AM Lukas Wunner <lukas@wunner.de> wrote: >> >> [cc += Rafael, Mika] >> >> On Mon, Jun 23, 2025 at 02:13:34PM -0500, Mario Limonciello wrote: >>> From: Mario Limonciello <mario.limonciello@amd.com> >>> >>> When a USB4 dock is unplugged the PCIe bridge it's connected to will >>> issue a "Link Down" and "Card not detected event". The PCI core will >>> treat this as a surprise hotplug event and unconfigure all downstream >>> devices. This involves setting the device error state to >>> `pci_channel_io_perm_failure` which pci_dev_is_disconnected() will check. >>> >>> It doesn't make sense to runtime resume disconnected devices to D0 and >>> report the (expected) error, so bail early. >>> >>> Suggested-by: Lukas Wunner <lukas@wunner.de> >>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >> >> Reviewed-by: Lukas Wunner <lukas@wunner.de> >> >>> --- >>> v4: >>> * no info message >>> v3: >>> * Adjust text and subject >>> * Add an info message instead >>> v2: >>> * Use pci_dev_is_disconnected() >>> v1: https://lore.kernel.org/linux-usb/20250609020223.269407-1-superm1@kernel.org/T/#mf95c947990d016fbfccfd11afe60b8ae08aafa0b >>> --- >>> drivers/pci/pci.c | 5 +++++ >>> 1 file changed, 5 insertions(+) >>> >>> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c >>> index 9e42090fb1089..160a9a482c732 100644 >>> --- a/drivers/pci/pci.c >>> +++ b/drivers/pci/pci.c >>> @@ -1374,6 +1374,11 @@ int pci_power_up(struct pci_dev *dev) >>> return -EIO; >>> } >>> >>> + if (pci_dev_is_disconnected(dev)) { >>> + dev->current_state = PCI_D3cold; > > Why not PCI_UNKNOWN? It was following what other situations of failure did: * existing error in pci_power_up() * error in pci_update_current_state() * error in pci_set_low_power_state() I view all of these cases as unrecoverable failures. So perhaps if changing this one to PCI_UNKNOWN those three should those also be PCI_UNKNOWN? Bjorn, Lukas, thoughts? > >>> + return -EIO; >>> + } >>> + >>> pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); >>> if (PCI_POSSIBLE_ERROR(pmcsr)) { >>> pci_err(dev, "Unable to change power state from %s to D0, device inaccessible\n", >>> -- >>> 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected 2025-06-24 15:08 ` Mario Limonciello @ 2025-06-26 12:09 ` Ilpo Järvinen 2025-06-26 12:31 ` Rafael J. Wysocki 1 sibling, 0 replies; 6+ messages in thread From: Ilpo Järvinen @ 2025-06-26 12:09 UTC (permalink / raw) To: Mario Limonciello Cc: Rafael J. Wysocki, Lukas Wunner, Bjorn Helgaas, mario.limonciello, linux-pci, Mika Westerberg [-- Attachment #1: Type: text/plain, Size: 2812 bytes --] On Tue, 24 Jun 2025, Mario Limonciello wrote: > On 6/24/25 5:24 AM, Rafael J. Wysocki wrote: > > On Tue, Jun 24, 2025 at 9:22 AM Lukas Wunner <lukas@wunner.de> wrote: > > > > > > [cc += Rafael, Mika] > > > > > > On Mon, Jun 23, 2025 at 02:13:34PM -0500, Mario Limonciello wrote: > > > > From: Mario Limonciello <mario.limonciello@amd.com> > > > > > > > > When a USB4 dock is unplugged the PCIe bridge it's connected to will > > > > issue a "Link Down" and "Card not detected event". The PCI core will > > > > treat this as a surprise hotplug event and unconfigure all downstream > > > > devices. This involves setting the device error state to > > > > `pci_channel_io_perm_failure` which pci_dev_is_disconnected() will > > > > check. > > > > > > > > It doesn't make sense to runtime resume disconnected devices to D0 and > > > > report the (expected) error, so bail early. > > > > > > > > Suggested-by: Lukas Wunner <lukas@wunner.de> > > > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > > > > > Reviewed-by: Lukas Wunner <lukas@wunner.de> > > > > > > > --- > > > > v4: > > > > * no info message > > > > v3: > > > > * Adjust text and subject > > > > * Add an info message instead > > > > v2: > > > > * Use pci_dev_is_disconnected() > > > > v1: > > > > https://lore.kernel.org/linux-usb/20250609020223.269407-1-superm1@kernel.org/T/#mf95c947990d016fbfccfd11afe60b8ae08aafa0b > > > > --- > > > > drivers/pci/pci.c | 5 +++++ > > > > 1 file changed, 5 insertions(+) > > > > > > > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > > > > index 9e42090fb1089..160a9a482c732 100644 > > > > --- a/drivers/pci/pci.c > > > > +++ b/drivers/pci/pci.c > > > > @@ -1374,6 +1374,11 @@ int pci_power_up(struct pci_dev *dev) > > > > return -EIO; > > > > } > > > > > > > > + if (pci_dev_is_disconnected(dev)) { > > > > + dev->current_state = PCI_D3cold; > > > > Why not PCI_UNKNOWN? > > It was following what other situations of failure did: > * existing error in pci_power_up() > * error in pci_update_current_state() > * error in pci_set_low_power_state() > > I view all of these cases as unrecoverable failures. > > So perhaps if changing this one to PCI_UNKNOWN those three should those also > be PCI_UNKNOWN? > > Bjorn, Lukas, thoughts? > > > > > > > + return -EIO; > > > > + } > > > > + > > > > pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); > > > > if (PCI_POSSIBLE_ERROR(pmcsr)) { > > > > pci_err(dev, "Unable to change power state from %s to D0, > > > > device inaccessible\n", Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> (I've no opinion on PCI_UNKNOWN or not.) -- i. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected 2025-06-24 15:08 ` Mario Limonciello 2025-06-26 12:09 ` Ilpo Järvinen @ 2025-06-26 12:31 ` Rafael J. Wysocki 1 sibling, 0 replies; 6+ messages in thread From: Rafael J. Wysocki @ 2025-06-26 12:31 UTC (permalink / raw) To: Mario Limonciello Cc: Rafael J. Wysocki, Lukas Wunner, Bjorn Helgaas, mario.limonciello, linux-pci, Mika Westerberg On Tue, Jun 24, 2025 at 5:08 PM Mario Limonciello <superm1@kernel.org> wrote: > > On 6/24/25 5:24 AM, Rafael J. Wysocki wrote: > > On Tue, Jun 24, 2025 at 9:22 AM Lukas Wunner <lukas@wunner.de> wrote: > >> > >> [cc += Rafael, Mika] > >> > >> On Mon, Jun 23, 2025 at 02:13:34PM -0500, Mario Limonciello wrote: > >>> From: Mario Limonciello <mario.limonciello@amd.com> > >>> > >>> When a USB4 dock is unplugged the PCIe bridge it's connected to will > >>> issue a "Link Down" and "Card not detected event". The PCI core will > >>> treat this as a surprise hotplug event and unconfigure all downstream > >>> devices. This involves setting the device error state to > >>> `pci_channel_io_perm_failure` which pci_dev_is_disconnected() will check. > >>> > >>> It doesn't make sense to runtime resume disconnected devices to D0 and > >>> report the (expected) error, so bail early. > >>> > >>> Suggested-by: Lukas Wunner <lukas@wunner.de> > >>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > >> > >> Reviewed-by: Lukas Wunner <lukas@wunner.de> > >> > >>> --- > >>> v4: > >>> * no info message > >>> v3: > >>> * Adjust text and subject > >>> * Add an info message instead > >>> v2: > >>> * Use pci_dev_is_disconnected() > >>> v1: https://lore.kernel.org/linux-usb/20250609020223.269407-1-superm1@kernel.org/T/#mf95c947990d016fbfccfd11afe60b8ae08aafa0b > >>> --- > >>> drivers/pci/pci.c | 5 +++++ > >>> 1 file changed, 5 insertions(+) > >>> > >>> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > >>> index 9e42090fb1089..160a9a482c732 100644 > >>> --- a/drivers/pci/pci.c > >>> +++ b/drivers/pci/pci.c > >>> @@ -1374,6 +1374,11 @@ int pci_power_up(struct pci_dev *dev) > >>> return -EIO; > >>> } > >>> > >>> + if (pci_dev_is_disconnected(dev)) { > >>> + dev->current_state = PCI_D3cold; > > > > Why not PCI_UNKNOWN? > > It was following what other situations of failure did: > * existing error in pci_power_up() > * error in pci_update_current_state() > * error in pci_set_low_power_state() > > I view all of these cases as unrecoverable failures. > > So perhaps if changing this one to PCI_UNKNOWN those three should those > also be PCI_UNKNOWN? > > Bjorn, Lukas, thoughts? Note that pci_device_remove() sets power_state to PCI_UNKNOWN, but only if the old value is PCI_D0, so it would be good to make all of that consistent at one point. Anyway, feel free to add Acked-by: Rafael J. Wysocki <rafael@kernel.org> to this patch. Thanks! ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-06-26 12:31 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-23 19:13 [PATCH v4] PCI/PM: Skip resuming to D0 if disconnected Mario Limonciello 2025-06-24 7:22 ` Lukas Wunner 2025-06-24 10:24 ` Rafael J. Wysocki 2025-06-24 15:08 ` Mario Limonciello 2025-06-26 12:09 ` Ilpo Järvinen 2025-06-26 12:31 ` Rafael J. Wysocki
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).