Jesse Keating 2f82dda
From: Matthew Garrett <mjg@redhat.com>
Jesse Keating 2f82dda
Date: Wed, 9 Jun 2010 20:05:07 +0000 (-0400)
Jesse Keating 2f82dda
Subject: PCI: Don't enable aspm before drivers have had a chance to veto it
Jesse Keating 2f82dda
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fjbarnes%2Fpci-2.6.git;a=commitdiff_plain;h=8f0b08c29f1df91315e48adce04462eb23671099
Jesse Keating 2f82dda
Jesse Keating 2f82dda
PCI: Don't enable aspm before drivers have had a chance to veto it
Jesse Keating 2f82dda
Jesse Keating 2f82dda
The aspm code will currently set the configured aspm policy before drivers
Jesse Keating 2f82dda
have had an opportunity to indicate that their hardware doesn't support it.
Jesse Keating 2f82dda
Unfortunately, putting some hardware in L0 or L1 can result in the hardware
Jesse Keating 2f82dda
no longer responding to any requests, even after aspm is disabled. It makes
Jesse Keating 2f82dda
more sense to leave aspm policy at the BIOS defaults at initial setup time,
Jesse Keating 2f82dda
reconfiguring it after pci_enable_device() is called. This allows the
Jesse Keating 2f82dda
driver to blacklist individual devices beforehand.
Jesse Keating 2f82dda
Jesse Keating 2f82dda
Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Jesse Keating 2f82dda
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Jesse Keating 2f82dda
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Jesse Keating 2f82dda
---
Jesse Keating 2f82dda
Jesse Keating 2f82dda
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
Jesse Keating 2f82dda
index be53d98..7122281 100644
Jesse Keating 2f82dda
--- a/drivers/pci/pcie/aspm.c
Jesse Keating 2f82dda
+++ b/drivers/pci/pcie/aspm.c
Jesse Keating 2f82dda
@@ -588,11 +588,23 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
Jesse Keating 2f82dda
 	 * update through pcie_aspm_cap_init().
Jesse Keating 2f82dda
 	 */
Jesse Keating 2f82dda
 	pcie_aspm_cap_init(link, blacklist);
Jesse Keating 2f82dda
-	pcie_config_aspm_path(link);
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 	/* Setup initial Clock PM state */
Jesse Keating 2f82dda
 	pcie_clkpm_cap_init(link, blacklist);
Jesse Keating 2f82dda
-	pcie_set_clkpm(link, policy_to_clkpm_state(link));
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+	/*
Jesse Keating 2f82dda
+	 * At this stage drivers haven't had an opportunity to change the
Jesse Keating 2f82dda
+	 * link policy setting. Enabling ASPM on broken hardware can cripple
Jesse Keating 2f82dda
+	 * it even before the driver has had a chance to disable ASPM, so
Jesse Keating 2f82dda
+	 * default to a safe level right now. If we're enabling ASPM beyond
Jesse Keating 2f82dda
+	 * the BIOS's expectation, we'll do so once pci_enable_device() is
Jesse Keating 2f82dda
+	 * called.
Jesse Keating 2f82dda
+	 */
Jesse Keating 2f82dda
+	if (aspm_policy != POLICY_POWERSAVE) {
Jesse Keating 2f82dda
+		pcie_config_aspm_path(link);
Jesse Keating 2f82dda
+		pcie_set_clkpm(link, policy_to_clkpm_state(link));
Jesse Keating 2f82dda
+	}
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
 unlock:
Jesse Keating 2f82dda
 	mutex_unlock(&aspm_lock);
Jesse Keating 2f82dda
 out: