diff options
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/pci_root.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 642554b1b60c..5b38a026d122 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/spinlock.h> | 31 | #include <linux/spinlock.h> |
32 | #include <linux/pm.h> | 32 | #include <linux/pm.h> |
33 | #include <linux/pci.h> | 33 | #include <linux/pci.h> |
34 | #include <linux/pci-acpi.h> | ||
34 | #include <linux/acpi.h> | 35 | #include <linux/acpi.h> |
35 | #include <acpi/acpi_bus.h> | 36 | #include <acpi/acpi_bus.h> |
36 | #include <acpi/acpi_drivers.h> | 37 | #include <acpi/acpi_drivers.h> |
@@ -193,6 +194,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device) | |||
193 | unsigned long long value = 0; | 194 | unsigned long long value = 0; |
194 | acpi_handle handle = NULL; | 195 | acpi_handle handle = NULL; |
195 | struct acpi_device *child; | 196 | struct acpi_device *child; |
197 | u32 flags, base_flags; | ||
196 | 198 | ||
197 | 199 | ||
198 | if (!device) | 200 | if (!device) |
@@ -210,6 +212,13 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device) | |||
210 | 212 | ||
211 | device->ops.bind = acpi_pci_bind; | 213 | device->ops.bind = acpi_pci_bind; |
212 | 214 | ||
215 | /* | ||
216 | * All supported architectures that use ACPI have support for | ||
217 | * PCI domains, so we indicate this in _OSC support capabilities. | ||
218 | */ | ||
219 | flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT; | ||
220 | pci_acpi_osc_support(device->handle, flags); | ||
221 | |||
213 | /* | 222 | /* |
214 | * Segment | 223 | * Segment |
215 | * ------- | 224 | * ------- |
@@ -335,6 +344,17 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device) | |||
335 | list_for_each_entry(child, &device->children, node) | 344 | list_for_each_entry(child, &device->children, node) |
336 | acpi_pci_bridge_scan(child); | 345 | acpi_pci_bridge_scan(child); |
337 | 346 | ||
347 | /* Indicate support for various _OSC capabilities. */ | ||
348 | if (pci_ext_cfg_avail(root->bus->self)) | ||
349 | flags |= OSC_EXT_PCI_CONFIG_SUPPORT; | ||
350 | if (pcie_aspm_enabled()) | ||
351 | flags |= OSC_ACTIVE_STATE_PWR_SUPPORT | | ||
352 | OSC_CLOCK_PWR_CAPABILITY_SUPPORT; | ||
353 | if (pci_msi_enabled()) | ||
354 | flags |= OSC_MSI_SUPPORT; | ||
355 | if (flags != base_flags) | ||
356 | pci_acpi_osc_support(device->handle, flags); | ||
357 | |||
338 | end: | 358 | end: |
339 | if (result) { | 359 | if (result) { |
340 | if (!list_empty(&root->node)) | 360 | if (!list_empty(&root->node)) |