diff options
-rw-r--r-- | drivers/acpi/pci_root.c | 19 | ||||
-rw-r--r-- | drivers/pci/pcie/aspm.c | 18 | ||||
-rw-r--r-- | include/linux/pci-aspm.h | 4 |
3 files changed, 8 insertions, 33 deletions
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 68a5f712cd19..1b5569c092c6 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
@@ -423,8 +423,7 @@ out: | |||
423 | } | 423 | } |
424 | EXPORT_SYMBOL(acpi_pci_osc_control_set); | 424 | EXPORT_SYMBOL(acpi_pci_osc_control_set); |
425 | 425 | ||
426 | static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm, | 426 | static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm) |
427 | int *clear_aspm) | ||
428 | { | 427 | { |
429 | u32 support, control, requested; | 428 | u32 support, control, requested; |
430 | acpi_status status; | 429 | acpi_status status; |
@@ -495,10 +494,12 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm, | |||
495 | decode_osc_control(root, "OS now controls", control); | 494 | decode_osc_control(root, "OS now controls", control); |
496 | if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) { | 495 | if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) { |
497 | /* | 496 | /* |
498 | * We have ASPM control, but the FADT indicates | 497 | * We have ASPM control, but the FADT indicates that |
499 | * that it's unsupported. Clear it. | 498 | * it's unsupported. Leave existing configuration |
499 | * intact and prevent the OS from touching it. | ||
500 | */ | 500 | */ |
501 | *clear_aspm = 1; | 501 | dev_info(&device->dev, "FADT indicates ASPM is unsupported, using BIOS configuration\n"); |
502 | *no_aspm = 1; | ||
502 | } | 503 | } |
503 | } else { | 504 | } else { |
504 | decode_osc_control(root, "OS requested", requested); | 505 | decode_osc_control(root, "OS requested", requested); |
@@ -525,7 +526,7 @@ static int acpi_pci_root_add(struct acpi_device *device, | |||
525 | int result; | 526 | int result; |
526 | struct acpi_pci_root *root; | 527 | struct acpi_pci_root *root; |
527 | acpi_handle handle = device->handle; | 528 | acpi_handle handle = device->handle; |
528 | int no_aspm = 0, clear_aspm = 0; | 529 | int no_aspm = 0; |
529 | bool hotadd = system_state != SYSTEM_BOOTING; | 530 | bool hotadd = system_state != SYSTEM_BOOTING; |
530 | 531 | ||
531 | root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); | 532 | root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); |
@@ -584,7 +585,7 @@ static int acpi_pci_root_add(struct acpi_device *device, | |||
584 | 585 | ||
585 | root->mcfg_addr = acpi_pci_root_get_mcfg_addr(handle); | 586 | root->mcfg_addr = acpi_pci_root_get_mcfg_addr(handle); |
586 | 587 | ||
587 | negotiate_os_control(root, &no_aspm, &clear_aspm); | 588 | negotiate_os_control(root, &no_aspm); |
588 | 589 | ||
589 | /* | 590 | /* |
590 | * TBD: Need PCI interface for enumeration/configuration of roots. | 591 | * TBD: Need PCI interface for enumeration/configuration of roots. |
@@ -607,10 +608,6 @@ static int acpi_pci_root_add(struct acpi_device *device, | |||
607 | goto remove_dmar; | 608 | goto remove_dmar; |
608 | } | 609 | } |
609 | 610 | ||
610 | if (clear_aspm) { | ||
611 | dev_info(&device->dev, "Disabling ASPM (FADT indicates it is unsupported)\n"); | ||
612 | pcie_clear_aspm(root->bus); | ||
613 | } | ||
614 | if (no_aspm) | 611 | if (no_aspm) |
615 | pcie_no_aspm(); | 612 | pcie_no_aspm(); |
616 | 613 | ||
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 820740a22e94..7d4fcdc512aa 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c | |||
@@ -782,24 +782,6 @@ void pci_disable_link_state(struct pci_dev *pdev, int state) | |||
782 | } | 782 | } |
783 | EXPORT_SYMBOL(pci_disable_link_state); | 783 | EXPORT_SYMBOL(pci_disable_link_state); |
784 | 784 | ||
785 | void pcie_clear_aspm(struct pci_bus *bus) | ||
786 | { | ||
787 | struct pci_dev *child; | ||
788 | |||
789 | if (aspm_force) | ||
790 | return; | ||
791 | |||
792 | /* | ||
793 | * Clear any ASPM setup that the firmware has carried out on this bus | ||
794 | */ | ||
795 | list_for_each_entry(child, &bus->devices, bus_list) { | ||
796 | __pci_disable_link_state(child, PCIE_LINK_STATE_L0S | | ||
797 | PCIE_LINK_STATE_L1 | | ||
798 | PCIE_LINK_STATE_CLKPM, | ||
799 | false, true); | ||
800 | } | ||
801 | } | ||
802 | |||
803 | static int pcie_aspm_set_policy(const char *val, struct kernel_param *kp) | 785 | static int pcie_aspm_set_policy(const char *val, struct kernel_param *kp) |
804 | { | 786 | { |
805 | int i; | 787 | int i; |
diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h index 8af4610c2e41..207c561fb40e 100644 --- a/include/linux/pci-aspm.h +++ b/include/linux/pci-aspm.h | |||
@@ -29,7 +29,6 @@ void pcie_aspm_pm_state_change(struct pci_dev *pdev); | |||
29 | void pcie_aspm_powersave_config_link(struct pci_dev *pdev); | 29 | void pcie_aspm_powersave_config_link(struct pci_dev *pdev); |
30 | void pci_disable_link_state(struct pci_dev *pdev, int state); | 30 | void pci_disable_link_state(struct pci_dev *pdev, int state); |
31 | void pci_disable_link_state_locked(struct pci_dev *pdev, int state); | 31 | void pci_disable_link_state_locked(struct pci_dev *pdev, int state); |
32 | void pcie_clear_aspm(struct pci_bus *bus); | ||
33 | void pcie_no_aspm(void); | 32 | void pcie_no_aspm(void); |
34 | #else | 33 | #else |
35 | static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) | 34 | static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) |
@@ -47,9 +46,6 @@ static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) | |||
47 | static inline void pci_disable_link_state(struct pci_dev *pdev, int state) | 46 | static inline void pci_disable_link_state(struct pci_dev *pdev, int state) |
48 | { | 47 | { |
49 | } | 48 | } |
50 | static inline void pcie_clear_aspm(struct pci_bus *bus) | ||
51 | { | ||
52 | } | ||
53 | static inline void pcie_no_aspm(void) | 49 | static inline void pcie_no_aspm(void) |
54 | { | 50 | { |
55 | } | 51 | } |