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