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