diff options
-rw-r--r-- | Documentation/PCI/pci.txt | 12 | ||||
-rw-r--r-- | drivers/acpi/pci_root.c | 19 | ||||
-rw-r--r-- | drivers/pci/host-bridge.c | 6 | ||||
-rw-r--r-- | drivers/pci/pci-acpi.c | 83 | ||||
-rw-r--r-- | drivers/pci/pci-label.c | 11 | ||||
-rw-r--r-- | drivers/pci/pci.c | 11 | ||||
-rw-r--r-- | drivers/pci/pci.h | 2 | ||||
-rw-r--r-- | drivers/pci/pcie/aspm.c | 18 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 2 | ||||
-rw-r--r-- | include/linux/pci-acpi.h | 5 | ||||
-rw-r--r-- | include/linux/pci-aspm.h | 4 | ||||
-rw-r--r-- | include/linux/pci.h | 1 |
12 files changed, 118 insertions, 56 deletions
diff --git a/Documentation/PCI/pci.txt b/Documentation/PCI/pci.txt index 9518006f6675..123881f62219 100644 --- a/Documentation/PCI/pci.txt +++ b/Documentation/PCI/pci.txt | |||
@@ -564,14 +564,14 @@ to be handled by platform and generic code, not individual drivers. | |||
564 | 8. Vendor and device identifications | 564 | 8. Vendor and device identifications |
565 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 565 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
566 | 566 | ||
567 | One is not required to add new device ids to include/linux/pci_ids.h. | 567 | Do not add new device or vendor IDs to include/linux/pci_ids.h unless they |
568 | Please add PCI_VENDOR_ID_xxx for vendors and a hex constant for device ids. | 568 | are shared across multiple drivers. You can add private definitions in |
569 | your driver if they're helpful, or just use plain hex constants. | ||
569 | 570 | ||
570 | PCI_VENDOR_ID_xxx constants are re-used. The device ids are arbitrary | 571 | The device IDs are arbitrary hex numbers (vendor controlled) and normally used |
571 | hex numbers (vendor controlled) and normally used only in a single | 572 | only in a single location, the pci_device_id table. |
572 | location, the pci_device_id table. | ||
573 | 573 | ||
574 | Please DO submit new vendor/device ids to pciids.sourceforge.net project. | 574 | Please DO submit new vendor/device IDs to http://pciids.sourceforge.net/. |
575 | 575 | ||
576 | 576 | ||
577 | 577 | ||
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/host-bridge.c b/drivers/pci/host-bridge.c index 3e5bbf9e8889..5f4a2e04c8d7 100644 --- a/drivers/pci/host-bridge.c +++ b/drivers/pci/host-bridge.c | |||
@@ -16,7 +16,7 @@ static struct pci_bus *find_pci_root_bus(struct pci_bus *bus) | |||
16 | return bus; | 16 | return bus; |
17 | } | 17 | } |
18 | 18 | ||
19 | static struct pci_host_bridge *find_pci_host_bridge(struct pci_bus *bus) | 19 | struct pci_host_bridge *pci_find_host_bridge(struct pci_bus *bus) |
20 | { | 20 | { |
21 | struct pci_bus *root_bus = find_pci_root_bus(bus); | 21 | struct pci_bus *root_bus = find_pci_root_bus(bus); |
22 | 22 | ||
@@ -48,7 +48,7 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge, | |||
48 | void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region, | 48 | void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region, |
49 | struct resource *res) | 49 | struct resource *res) |
50 | { | 50 | { |
51 | struct pci_host_bridge *bridge = find_pci_host_bridge(bus); | 51 | struct pci_host_bridge *bridge = pci_find_host_bridge(bus); |
52 | struct resource_entry *window; | 52 | struct resource_entry *window; |
53 | resource_size_t offset = 0; | 53 | resource_size_t offset = 0; |
54 | 54 | ||
@@ -73,7 +73,7 @@ static bool region_contains(struct pci_bus_region *region1, | |||
73 | void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res, | 73 | void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res, |
74 | struct pci_bus_region *region) | 74 | struct pci_bus_region *region) |
75 | { | 75 | { |
76 | struct pci_host_bridge *bridge = find_pci_host_bridge(bus); | 76 | struct pci_host_bridge *bridge = pci_find_host_bridge(bus); |
77 | struct resource_entry *window; | 77 | struct resource_entry *window; |
78 | resource_size_t offset = 0; | 78 | resource_size_t offset = 0; |
79 | 79 | ||
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 489063987325..5eba74716900 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -18,6 +18,15 @@ | |||
18 | #include <linux/pm_qos.h> | 18 | #include <linux/pm_qos.h> |
19 | #include "pci.h" | 19 | #include "pci.h" |
20 | 20 | ||
21 | /* | ||
22 | * The UUID is defined in the PCI Firmware Specification available here: | ||
23 | * https://www.pcisig.com/members/downloads/pcifw_r3_1_13Dec10.pdf | ||
24 | */ | ||
25 | const u8 pci_acpi_dsm_uuid[] = { | ||
26 | 0xd0, 0x37, 0xc9, 0xe5, 0x53, 0x35, 0x7a, 0x4d, | ||
27 | 0x91, 0x17, 0xea, 0x4d, 0x19, 0xc3, 0x43, 0x4d | ||
28 | }; | ||
29 | |||
21 | phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle) | 30 | phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle) |
22 | { | 31 | { |
23 | acpi_status status = AE_NOT_EXIST; | 32 | acpi_status status = AE_NOT_EXIST; |
@@ -528,11 +537,32 @@ static struct pci_platform_pm_ops acpi_pci_platform_pm = { | |||
528 | 537 | ||
529 | void acpi_pci_add_bus(struct pci_bus *bus) | 538 | void acpi_pci_add_bus(struct pci_bus *bus) |
530 | { | 539 | { |
540 | union acpi_object *obj; | ||
541 | struct pci_host_bridge *bridge; | ||
542 | |||
531 | if (acpi_pci_disabled || !bus->bridge) | 543 | if (acpi_pci_disabled || !bus->bridge) |
532 | return; | 544 | return; |
533 | 545 | ||
534 | acpi_pci_slot_enumerate(bus); | 546 | acpi_pci_slot_enumerate(bus); |
535 | acpiphp_enumerate_slots(bus); | 547 | acpiphp_enumerate_slots(bus); |
548 | |||
549 | /* | ||
550 | * For a host bridge, check its _DSM for function 8 and if | ||
551 | * that is available, mark it in pci_host_bridge. | ||
552 | */ | ||
553 | if (!pci_is_root_bus(bus)) | ||
554 | return; | ||
555 | |||
556 | obj = acpi_evaluate_dsm(ACPI_HANDLE(bus->bridge), pci_acpi_dsm_uuid, 3, | ||
557 | RESET_DELAY_DSM, NULL); | ||
558 | if (!obj) | ||
559 | return; | ||
560 | |||
561 | if (obj->type == ACPI_TYPE_INTEGER && obj->integer.value == 1) { | ||
562 | bridge = pci_find_host_bridge(bus); | ||
563 | bridge->ignore_reset_delay = 1; | ||
564 | } | ||
565 | ACPI_FREE(obj); | ||
536 | } | 566 | } |
537 | 567 | ||
538 | void acpi_pci_remove_bus(struct pci_bus *bus) | 568 | void acpi_pci_remove_bus(struct pci_bus *bus) |
@@ -558,6 +588,57 @@ static struct acpi_device *acpi_pci_find_companion(struct device *dev) | |||
558 | check_children); | 588 | check_children); |
559 | } | 589 | } |
560 | 590 | ||
591 | /** | ||
592 | * pci_acpi_optimize_delay - optimize PCI D3 and D3cold delay from ACPI | ||
593 | * @pdev: the PCI device whose delay is to be updated | ||
594 | * @adev: the companion ACPI device of this PCI device | ||
595 | * | ||
596 | * Update the d3_delay and d3cold_delay of a PCI device from the ACPI _DSM | ||
597 | * control method of either the device itself or the PCI host bridge. | ||
598 | * | ||
599 | * Function 8, "Reset Delay," applies to the entire hierarchy below a PCI | ||
600 | * host bridge. If it returns one, the OS may assume that all devices in | ||
601 | * the hierarchy have already completed power-on reset delays. | ||
602 | * | ||
603 | * Function 9, "Device Readiness Durations," applies only to the object | ||
604 | * where it is located. It returns delay durations required after various | ||
605 | * events if the device requires less time than the spec requires. Delays | ||
606 | * from this function take precedence over the Reset Delay function. | ||
607 | * | ||
608 | * These _DSM functions are defined by the draft ECN of January 28, 2014, | ||
609 | * titled "ACPI additions for FW latency optimizations." | ||
610 | */ | ||
611 | static void pci_acpi_optimize_delay(struct pci_dev *pdev, | ||
612 | acpi_handle handle) | ||
613 | { | ||
614 | struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus); | ||
615 | int value; | ||
616 | union acpi_object *obj, *elements; | ||
617 | |||
618 | if (bridge->ignore_reset_delay) | ||
619 | pdev->d3cold_delay = 0; | ||
620 | |||
621 | obj = acpi_evaluate_dsm(handle, pci_acpi_dsm_uuid, 3, | ||
622 | FUNCTION_DELAY_DSM, NULL); | ||
623 | if (!obj) | ||
624 | return; | ||
625 | |||
626 | if (obj->type == ACPI_TYPE_PACKAGE && obj->package.count == 5) { | ||
627 | elements = obj->package.elements; | ||
628 | if (elements[0].type == ACPI_TYPE_INTEGER) { | ||
629 | value = (int)elements[0].integer.value / 1000; | ||
630 | if (value < PCI_PM_D3COLD_WAIT) | ||
631 | pdev->d3cold_delay = value; | ||
632 | } | ||
633 | if (elements[3].type == ACPI_TYPE_INTEGER) { | ||
634 | value = (int)elements[3].integer.value / 1000; | ||
635 | if (value < PCI_PM_D3_WAIT) | ||
636 | pdev->d3_delay = value; | ||
637 | } | ||
638 | } | ||
639 | ACPI_FREE(obj); | ||
640 | } | ||
641 | |||
561 | static void pci_acpi_setup(struct device *dev) | 642 | static void pci_acpi_setup(struct device *dev) |
562 | { | 643 | { |
563 | struct pci_dev *pci_dev = to_pci_dev(dev); | 644 | struct pci_dev *pci_dev = to_pci_dev(dev); |
@@ -566,6 +647,8 @@ static void pci_acpi_setup(struct device *dev) | |||
566 | if (!adev) | 647 | if (!adev) |
567 | return; | 648 | return; |
568 | 649 | ||
650 | pci_acpi_optimize_delay(pci_dev, adev->handle); | ||
651 | |||
569 | pci_acpi_add_pm_notifier(adev, pci_dev); | 652 | pci_acpi_add_pm_notifier(adev, pci_dev); |
570 | if (!adev->wakeup.flags.valid) | 653 | if (!adev->wakeup.flags.valid) |
571 | return; | 654 | return; |
diff --git a/drivers/pci/pci-label.c b/drivers/pci/pci-label.c index 2ab1b47c7651..024b5c179348 100644 --- a/drivers/pci/pci-label.c +++ b/drivers/pci/pci-label.c | |||
@@ -31,8 +31,6 @@ | |||
31 | #include <linux/pci-acpi.h> | 31 | #include <linux/pci-acpi.h> |
32 | #include "pci.h" | 32 | #include "pci.h" |
33 | 33 | ||
34 | #define DEVICE_LABEL_DSM 0x07 | ||
35 | |||
36 | #ifdef CONFIG_DMI | 34 | #ifdef CONFIG_DMI |
37 | enum smbios_attr_enum { | 35 | enum smbios_attr_enum { |
38 | SMBIOS_ATTR_NONE = 0, | 36 | SMBIOS_ATTR_NONE = 0, |
@@ -148,11 +146,6 @@ static inline void pci_remove_smbiosname_file(struct pci_dev *pdev) | |||
148 | #endif | 146 | #endif |
149 | 147 | ||
150 | #ifdef CONFIG_ACPI | 148 | #ifdef CONFIG_ACPI |
151 | static const char device_label_dsm_uuid[] = { | ||
152 | 0xD0, 0x37, 0xC9, 0xE5, 0x53, 0x35, 0x7A, 0x4D, | ||
153 | 0x91, 0x17, 0xEA, 0x4D, 0x19, 0xC3, 0x43, 0x4D | ||
154 | }; | ||
155 | |||
156 | enum acpi_attr_enum { | 149 | enum acpi_attr_enum { |
157 | ACPI_ATTR_LABEL_SHOW, | 150 | ACPI_ATTR_LABEL_SHOW, |
158 | ACPI_ATTR_INDEX_SHOW, | 151 | ACPI_ATTR_INDEX_SHOW, |
@@ -179,7 +172,7 @@ static int dsm_get_label(struct device *dev, char *buf, | |||
179 | if (!handle) | 172 | if (!handle) |
180 | return -1; | 173 | return -1; |
181 | 174 | ||
182 | obj = acpi_evaluate_dsm(handle, device_label_dsm_uuid, 0x2, | 175 | obj = acpi_evaluate_dsm(handle, pci_acpi_dsm_uuid, 0x2, |
183 | DEVICE_LABEL_DSM, NULL); | 176 | DEVICE_LABEL_DSM, NULL); |
184 | if (!obj) | 177 | if (!obj) |
185 | return -1; | 178 | return -1; |
@@ -219,7 +212,7 @@ static bool device_has_dsm(struct device *dev) | |||
219 | if (!handle) | 212 | if (!handle) |
220 | return false; | 213 | return false; |
221 | 214 | ||
222 | return !!acpi_check_dsm(handle, device_label_dsm_uuid, 0x2, | 215 | return !!acpi_check_dsm(handle, pci_acpi_dsm_uuid, 0x2, |
223 | 1 << DEVICE_LABEL_DSM); | 216 | 1 << DEVICE_LABEL_DSM); |
224 | } | 217 | } |
225 | 218 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 061fdce8f8e1..acc4b6ef78c4 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -146,19 +146,22 @@ static int __pci_find_next_cap_ttl(struct pci_bus *bus, unsigned int devfn, | |||
146 | u8 pos, int cap, int *ttl) | 146 | u8 pos, int cap, int *ttl) |
147 | { | 147 | { |
148 | u8 id; | 148 | u8 id; |
149 | u16 ent; | ||
150 | |||
151 | pci_bus_read_config_byte(bus, devfn, pos, &pos); | ||
149 | 152 | ||
150 | while ((*ttl)--) { | 153 | while ((*ttl)--) { |
151 | pci_bus_read_config_byte(bus, devfn, pos, &pos); | ||
152 | if (pos < 0x40) | 154 | if (pos < 0x40) |
153 | break; | 155 | break; |
154 | pos &= ~3; | 156 | pos &= ~3; |
155 | pci_bus_read_config_byte(bus, devfn, pos + PCI_CAP_LIST_ID, | 157 | pci_bus_read_config_word(bus, devfn, pos, &ent); |
156 | &id); | 158 | |
159 | id = ent & 0xff; | ||
157 | if (id == 0xff) | 160 | if (id == 0xff) |
158 | break; | 161 | break; |
159 | if (id == cap) | 162 | if (id == cap) |
160 | return pos; | 163 | return pos; |
161 | pos += PCI_CAP_LIST_NEXT; | 164 | pos = (ent >> 8); |
162 | } | 165 | } |
163 | return 0; | 166 | return 0; |
164 | } | 167 | } |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 4091f82239cd..d72f849174a4 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -321,4 +321,6 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe) | |||
321 | } | 321 | } |
322 | #endif | 322 | #endif |
323 | 323 | ||
324 | struct pci_host_bridge *pci_find_host_bridge(struct pci_bus *bus); | ||
325 | |||
324 | #endif /* DRIVERS_PCI_H */ | 326 | #endif /* DRIVERS_PCI_H */ |
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/drivers/pci/quirks.c b/drivers/pci/quirks.c index 1bde3972e318..c6dc1dfd25d5 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -3182,7 +3182,7 @@ static void quirk_apple_wait_for_thunderbolt(struct pci_dev *dev) | |||
3182 | || nhi->subsystem_vendor != 0x2222 | 3182 | || nhi->subsystem_vendor != 0x2222 |
3183 | || nhi->subsystem_device != 0x1111) | 3183 | || nhi->subsystem_device != 0x1111) |
3184 | goto out; | 3184 | goto out; |
3185 | dev_info(&dev->dev, "quirk: wating for thunderbolt to reestablish pci tunnels...\n"); | 3185 | dev_info(&dev->dev, "quirk: waiting for thunderbolt to reestablish PCI tunnels...\n"); |
3186 | device_pm_wait_for_dev(&dev->dev, &nhi->dev); | 3186 | device_pm_wait_for_dev(&dev->dev, &nhi->dev); |
3187 | out: | 3187 | out: |
3188 | pci_dev_put(nhi); | 3188 | pci_dev_put(nhi); |
diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index 24c7728ca681..a965efa52152 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h | |||
@@ -77,6 +77,11 @@ static inline void acpiphp_remove_slots(struct pci_bus *bus) { } | |||
77 | static inline void acpiphp_check_host_bridge(struct acpi_device *adev) { } | 77 | static inline void acpiphp_check_host_bridge(struct acpi_device *adev) { } |
78 | #endif | 78 | #endif |
79 | 79 | ||
80 | extern const u8 pci_acpi_dsm_uuid[]; | ||
81 | #define DEVICE_LABEL_DSM 0x07 | ||
82 | #define RESET_DELAY_DSM 0x08 | ||
83 | #define FUNCTION_DELAY_DSM 0x09 | ||
84 | |||
80 | #else /* CONFIG_ACPI */ | 85 | #else /* CONFIG_ACPI */ |
81 | static inline void acpi_pci_add_bus(struct pci_bus *bus) { } | 86 | static inline void acpi_pci_add_bus(struct pci_bus *bus) { } |
82 | static inline void acpi_pci_remove_bus(struct pci_bus *bus) { } | 87 | static inline void acpi_pci_remove_bus(struct pci_bus *bus) { } |
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 | } |
diff --git a/include/linux/pci.h b/include/linux/pci.h index a379513bddef..e63112fb55be 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -406,6 +406,7 @@ struct pci_host_bridge { | |||
406 | struct list_head windows; /* resource_entry */ | 406 | struct list_head windows; /* resource_entry */ |
407 | void (*release_fn)(struct pci_host_bridge *); | 407 | void (*release_fn)(struct pci_host_bridge *); |
408 | void *release_data; | 408 | void *release_data; |
409 | unsigned int ignore_reset_delay:1; /* for entire hierarchy */ | ||
409 | }; | 410 | }; |
410 | 411 | ||
411 | #define to_pci_host_bridge(n) container_of(n, struct pci_host_bridge, dev) | 412 | #define to_pci_host_bridge(n) container_of(n, struct pci_host_bridge, dev) |