88 lines
3.3 KiB
Diff
88 lines
3.3 KiB
Diff
From: Rafael J. Wysocki <rjw@sisk.pl>
|
|
Date: Fri, 18 Jun 2010 15:04:22 +0000 (+0200)
|
|
Subject: PCI/PM: Do not use native PCIe PME by default
|
|
X-Git-Tag: v2.6.35-rc4~60^2
|
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=b27759f880018b0cd43543dc94c921341b64b5ec
|
|
|
|
PCI/PM: Do not use native PCIe PME by default
|
|
|
|
Commit c7f486567c1d0acd2e4166c47069835b9f75e77b
|
|
(PCI PM: PCIe PME root port service driver) causes the native PCIe
|
|
PME signaling to be used by default, if the BIOS allows the kernel to
|
|
control the standard configuration registers of PCIe root ports.
|
|
However, the native PCIe PME is coupled to the native PCIe hotplug
|
|
and calling pcie_pme_acpi_setup() makes some BIOSes expect that
|
|
the native PCIe hotplug will be used as well. That, in turn, causes
|
|
problems to appear on systems where the PCIe hotplug driver is not
|
|
loaded. The usual symptom, as reported by Jaroslav Kameník and
|
|
others, is that the ACPI GPE associated with PCIe hotplug keeps
|
|
firing continuously causing kacpid to take substantial percentage
|
|
of CPU time.
|
|
|
|
To work around this issue, change the default so that the native
|
|
PCIe PME signaling is only used if directly requested with the help
|
|
of the pcie_pme= command line switch.
|
|
|
|
Fixes https://bugzilla.kernel.org/show_bug.cgi?id=15924 , which is
|
|
a listed regression from 2.6.33.
|
|
|
|
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
|
|
Reported-by: Jaroslav Kameník <jaroslav@kamenik.cz>
|
|
Tested-by: Antoni Grzymala <antekgrzymala@gmail.com>
|
|
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
|
---
|
|
|
|
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
|
|
index 1808f11..82d6aeb 100644
|
|
--- a/Documentation/kernel-parameters.txt
|
|
+++ b/Documentation/kernel-parameters.txt
|
|
@@ -2048,7 +2048,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
|
WARNING: Forcing ASPM on may cause system lockups.
|
|
|
|
pcie_pme= [PCIE,PM] Native PCIe PME signaling options:
|
|
- off Do not use native PCIe PME signaling.
|
|
+ Format: {auto|force}[,nomsi]
|
|
+ auto Use native PCIe PME signaling if the BIOS allows the
|
|
+ kernel to control PCIe config registers of root ports.
|
|
force Use native PCIe PME signaling even if the BIOS refuses
|
|
to allow the kernel to control the relevant PCIe config
|
|
registers.
|
|
diff --git a/drivers/pci/pcie/pme/pcie_pme.c b/drivers/pci/pcie/pme/pcie_pme.c
|
|
index aac285a..d672a0a 100644
|
|
--- a/drivers/pci/pcie/pme/pcie_pme.c
|
|
+++ b/drivers/pci/pcie/pme/pcie_pme.c
|
|
@@ -34,7 +34,7 @@
|
|
* being registered. Consequently, the interrupt-based PCIe PME signaling will
|
|
* not be used by any PCIe root ports in that case.
|
|
*/
|
|
-static bool pcie_pme_disabled;
|
|
+static bool pcie_pme_disabled = true;
|
|
|
|
/*
|
|
* The PCI Express Base Specification 2.0, Section 6.1.8, states the following:
|
|
@@ -64,12 +64,19 @@ bool pcie_pme_msi_disabled;
|
|
|
|
static int __init pcie_pme_setup(char *str)
|
|
{
|
|
- if (!strcmp(str, "off"))
|
|
- pcie_pme_disabled = true;
|
|
- else if (!strcmp(str, "force"))
|
|
+ if (!strncmp(str, "auto", 4))
|
|
+ pcie_pme_disabled = false;
|
|
+ else if (!strncmp(str, "force", 5))
|
|
pcie_pme_force_enable = true;
|
|
- else if (!strcmp(str, "nomsi"))
|
|
- pcie_pme_msi_disabled = true;
|
|
+
|
|
+ str = strchr(str, ',');
|
|
+ if (str) {
|
|
+ str++;
|
|
+ str += strspn(str, " \t");
|
|
+ if (*str && !strcmp(str, "nomsi"))
|
|
+ pcie_pme_msi_disabled = true;
|
|
+ }
|
|
+
|
|
return 1;
|
|
}
|
|
__setup("pcie_pme=", pcie_pme_setup);
|