| From cebbert@redhat.com Thu Oct 16 16:07:33 2008 |
| From: Shaohua Li <shaohua.li@intel.com> |
| Date: Mon, 13 Oct 2008 19:38:11 -0400 |
| Subject: PCI: disable ASPM per ACPI FADT setting |
| To: stable@kernel.org |
| Cc: Jesse Barnes <jbarnes@virtuousgeek.org> |
| Message-ID: <20081013193811.1baf8b98@redhat.com> |
| |
| |
| From: Shaohua Li <shaohua.li@intel.com> |
| commit 5fde244d39b88625ac578d83e6625138714de031 upstream |
| |
| The ACPI FADT table includes an ASPM control bit. If the bit is set, do |
| not enable ASPM since it may indicate that the platform doesn't actually |
| support the feature. |
| |
| Tested-by: Jack Howarth <howarth@bromo.msbb.uc.edu> |
| Signed-off-by: Shaohua Li <shaohua.li@intel.com> |
| Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> |
| Cc: Chuck Ebbert <cebbert@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/pci/pci-acpi.c | 7 +++++++ |
| drivers/pci/pcie/aspm.c | 5 +++++ |
| include/acpi/actbl.h | 1 + |
| include/linux/pci-aspm.h | 5 +++++ |
| 4 files changed, 18 insertions(+) |
| |
| --- a/drivers/pci/pci-acpi.c |
| +++ b/drivers/pci/pci-acpi.c |
| @@ -11,6 +11,7 @@ |
| #include <linux/init.h> |
| #include <linux/pci.h> |
| #include <linux/module.h> |
| +#include <linux/pci-aspm.h> |
| #include <acpi/acpi.h> |
| #include <acpi/acnamesp.h> |
| #include <acpi/acresrc.h> |
| @@ -394,6 +395,12 @@ static int __init acpi_pci_init(void) |
| printk(KERN_INFO"ACPI FADT declares the system doesn't support MSI, so disable it\n"); |
| pci_no_msi(); |
| } |
| + |
| + if (acpi_gbl_FADT.boot_flags & BAF_PCIE_ASPM_CONTROL) { |
| + printk(KERN_INFO"ACPI FADT declares the system doesn't support PCIe ASPM, so disable it\n"); |
| + pcie_no_aspm(); |
| + } |
| + |
| ret = register_acpi_bus_type(&acpi_pci_bus); |
| if (ret) |
| return 0; |
| --- a/drivers/pci/pcie/aspm.c |
| +++ b/drivers/pci/pcie/aspm.c |
| @@ -808,6 +808,11 @@ static int __init pcie_aspm_disable(char |
| |
| __setup("pcie_noaspm", pcie_aspm_disable); |
| |
| +void pcie_no_aspm(void) |
| +{ |
| + aspm_disabled = 1; |
| +} |
| + |
| #ifdef CONFIG_ACPI |
| #include <acpi/acpi_bus.h> |
| #include <linux/pci-acpi.h> |
| --- a/include/acpi/actbl.h |
| +++ b/include/acpi/actbl.h |
| @@ -277,6 +277,7 @@ enum acpi_prefered_pm_profiles { |
| #define BAF_LEGACY_DEVICES 0x0001 |
| #define BAF_8042_KEYBOARD_CONTROLLER 0x0002 |
| #define BAF_MSI_NOT_SUPPORTED 0x0008 |
| +#define BAF_PCIE_ASPM_CONTROL 0x0010 |
| |
| #define FADT2_REVISION_ID 3 |
| #define FADT2_MINUS_REVISION_ID 2 |
| --- a/include/linux/pci-aspm.h |
| +++ b/include/linux/pci-aspm.h |
| @@ -27,6 +27,7 @@ extern void pcie_aspm_init_link_state(st |
| extern void pcie_aspm_exit_link_state(struct pci_dev *pdev); |
| extern void pcie_aspm_pm_state_change(struct pci_dev *pdev); |
| extern void pci_disable_link_state(struct pci_dev *pdev, int state); |
| +extern void pcie_no_aspm(void); |
| #else |
| static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) |
| { |
| @@ -40,6 +41,10 @@ static inline void pcie_aspm_pm_state_ch |
| static inline void pci_disable_link_state(struct pci_dev *pdev, int state) |
| { |
| } |
| + |
| +static inline void pcie_no_aspm(void) |
| +{ |
| +} |
| #endif |
| |
| #ifdef CONFIG_PCIEASPM_DEBUG /* this depends on CONFIG_PCIEASPM */ |