From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 76D612459E7; Sat, 6 Sep 2025 14:37:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757169439; cv=none; b=h/omrKzoTc3kEdGQPwQNxzxPclzovCjJcyLNNWvctvST2HXDOT+9FuOtP23v+LssXPUOC/t/BPrRUovLHilt1px4ArZeXyZlKbuf0sL1p1lY3tZZHdCRaWEiid5c/IPCNgQKZyniCUTS4OOHbTzsK/KWgpzKEwcZfowSx4nPBlk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757169439; c=relaxed/simple; bh=xp1A/WiAs/39HI9qEtVLwjIBOQZbPgNqW6mMoXZvzw8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LMsZoNb5BmH80THc6D3iVif1U8CrKmIOw74gdxlm23fNzoJOYlJSecisdIUZXqOHzy2i1ZBQVXNDnuPyYUY152HvjCFgOFGma97PsDjA7sC+iAa9QjyTMnOiNsidHmQg06dphnqm8h58lOgmGh6+3/8OtstiAvqLRMSxPOlekew= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=T556EMN4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="T556EMN4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 376EBC4CEFA; Sat, 6 Sep 2025 14:37:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1757169439; bh=xp1A/WiAs/39HI9qEtVLwjIBOQZbPgNqW6mMoXZvzw8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T556EMN48YqsPEPLjHooxNv9hFqJGu4/XgeqgNXn+QRUrR0GJlC66uL/CSIl7krCO hQcc1DG5DpqggY9fRgK7yUdabSM7Muo9In+Fb7pSpKg78BDXaxEQ1GdN8VVZMB5a6m lipco592CGRQde3MtZ30YF6sifaaCEKC9sMwdGRpMVlV+j1wvaWmccCOZ877fgvxRG Zj60U+FlzKFuLEqt5PjROgna0dq6p0gP6XFI8x82ffoIislUqo4QS3Wtx6cTv4XB53 MSW+FyCbR4KQ3oDCG/POfBbvjGznGaBVIXccJ7O0A3Q1tJpiNJh7iAISL7eooMTVjN rkmchMWzm1fbA== From: "Mario Limonciello (AMD)" To: "Rafael J . Wysocki" , Greg Kroah-Hartman , Danilo Krummrich , Bjorn Helgaas Cc: Pavel Machek , Len Brown , =?UTF-8?q?Christian=20K=C3=B6nig?= , "James E . J . Bottomley" , "Martin K . Petersen" , Steven Rostedt , linux-pm@vger.kernel.org (open list:HIBERNATION (aka Software Suspend, aka swsusp)), amd-gfx@lists.freedesktop.org (open list:RADEON and AMDGPU DRM DRIVERS), dri-devel@lists.freedesktop.org (open list:DRM DRIVERS), linux-pci@vger.kernel.org (open list:PCI SUBSYSTEM), linux-scsi@vger.kernel.org (open list:SCSI SUBSYSTEM), linux-usb@vger.kernel.org (open list:USB SUBSYSTEM), linux-trace-kernel@vger.kernel.org (open list:TRACING), AceLan Kao , Kai-Heng Feng , Mark Pearson , =?UTF-8?q?Merthan=20Karaka=C5=9F?= , Eric Naim , "Mario Limonciello (AMD)" , Denis Benato Subject: [PATCH v6 RESEND 09/11] PCI: Put PCIe bridges with downstream devices into D3 at hibernate Date: Sat, 6 Sep 2025 09:36:40 -0500 Message-ID: <20250906143642.2590808-10-superm1@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250906143642.2590808-1-superm1@kernel.org> References: <20250906143642.2590808-1-superm1@kernel.org> Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For the suspend flow PCIe bridges that have downstream devices are put into the appropriate low power state (D3hot or D3cold depending upon specific devices). For the hibernate flow, PCIe bridges with downstream devices stay in D0 however. This can lead to PCIe bridges that are remained powered on needlessly during hibernate. Adjust the pci_pm_poweroff_noirq() to follow the same flow as pci_pm_suspend_noirq() by using pci_pm_suspend_noirq_common(). This introduces a functional change that the hibernate flow will now call pci_save_state() and unless bus PM is skipped will also set the PCIe device into an unknown state. Cc: AceLan Kao Cc: Kai-Heng Feng Cc: Mark Pearson Cc: Denis Benato Cc: Merthan Karakaş Tested-by: Eric Naim Signed-off-by: Mario Limonciello (AMD) --- drivers/pci/pci-driver.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index c563fd6af979d..5eedfbb0be8a4 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -762,7 +762,7 @@ static void pci_pm_complete(struct device *dev) #endif /* !CONFIG_PM_SLEEP */ -#if defined(CONFIG_SUSPEND) +#if defined(CONFIG_SUSPEND) || defined(CONFIG_HIBERNATE_CALLBACKS) /** * pci_pm_suspend_noirq_common * @pci_dev: pci device @@ -808,7 +808,7 @@ static void pci_pm_suspend_noirq_common(struct pci_dev *pci_dev, bool *skip_bus_ pci_pm_set_unknown_state(pci_dev); } -#endif /* CONFIG_SUSPEND */ +#endif /* CONFIG_SUSPEND || CONFIG_HIBERNATE_CALLBACKS */ #ifdef CONFIG_SUSPEND static void pcie_pme_root_status_cleanup(struct pci_dev *pci_dev) @@ -1164,6 +1164,8 @@ static int pci_pm_poweroff(struct device *dev) (system_state == SYSTEM_HALT || system_state == SYSTEM_POWER_OFF)) device_set_wakeup_enable(dev, false); + pci_dev->skip_bus_pm = false; + if (pci_has_legacy_pm_support(pci_dev)) return pci_legacy_suspend(dev, PMSG_HIBERNATE); @@ -1206,6 +1208,7 @@ static int pci_pm_poweroff_noirq(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; + bool skip_bus_pm = false; if (dev_pm_skip_suspend(dev)) return 0; @@ -1227,8 +1230,9 @@ static int pci_pm_poweroff_noirq(struct device *dev) return error; } - if (!pci_dev->state_saved && pci_power_manageable(pci_dev)) - pci_prepare_to_sleep(pci_dev); + pci_pm_suspend_noirq_common(pci_dev, &skip_bus_pm); + if (skip_bus_pm) + goto Fixup; /* * The reason for doing this here is the same as for the analogous code @@ -1237,6 +1241,7 @@ static int pci_pm_poweroff_noirq(struct device *dev) if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI) pci_write_config_word(pci_dev, PCI_COMMAND, 0); +Fixup: pci_fixup_device(pci_fixup_suspend_late, pci_dev); return 0; -- 2.43.0