linux/drivers/acpi
Naga Chumbalkar eca67315e0 PCI: Disable ASPM when _OSC control is not granted for PCIe services
v3 -> v2: Added text to describe the problem
v2 -> v1: Split this patch from v1
v1	: Part of: http://marc.info/?l=linux-pci&m=130042212003242&w=2

Disable ASPM when no _OSC control for PCIe services is granted
by the BIOS. This is to protect systems with a buggy BIOS that
did not set the ACPI FADT "ASPM Controls" bit even though the
underlying HW can't do ASPM.

To turn "on" ASPM the minimum the BIOS needs to do:
1. Clear the ACPI FADT "ASPM Controls" bit.
2. Support _OSC appropriately

There is no _OSC Control bit for ASPM. However, we expect the BIOS to
support _OSC for a Root Bridge that originates a PCIe hierarchy. If this
is not the case - we are better off not enabling ASPM on that server.

Commit 852972acff (ACPI: Disable ASPM if the
Platform won't provide _OSC control for PCIe) describes the above scenario.
To quote verbatim from there:
[The PCI SIG documentation for the _OSC OS/firmware handshaking interface
states:

"If the _OSC control method is absent from the scope of a host bridge
device, then the operating system must not enable or attempt to use any
features defined in this section for the hierarchy originated by the host
bridge."

The obvious interpretation of this is that the OS should not attempt to use
PCIe hotplug, PME or AER - however, the specification also notes that an
_OSC method is *required* for PCIe hierarchies, and experimental validation
with An Alternative OS indicates that it doesn't use any PCIe functionality
if the _OSC method is missing. That arguably means we shouldn't be using
MSI or extended config space, but right now our problems seem to be limited
to vendors being surprised when ASPM gets enabled on machines when other
OSs refuse to do so. So, for now, let's just disable ASPM if the _OSC
method doesn't exist or refuses to hand over PCIe capability control.]

Signed-off-by: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
2011-03-21 09:41:08 -07:00
..
acpica ACPI / ACPICA: Implicit notify for multiple devices 2011-02-24 19:59:21 +01:00
apei Pull pstorev4 into release branch 2011-03-16 09:58:31 -07:00
ac.c Merge branch 'procfs-cleanup' into release 2011-01-12 05:00:07 -05:00
acpi_ipmi.c IPMI/ACPI: Add the IPMI opregion driver to enable ACPI to access BMC controller 2010-12-14 00:22:14 -05:00
acpi_memhotplug.c
acpi_pad.c
atomicio.c
battery.c ACPI / Battery: remove battery refresh on resume 2011-01-20 13:14:10 -08:00
blacklist.c
bus.c PM: Drop pm_flags that is not necessary 2011-03-15 00:43:16 +01:00
button.c ACPI / PM: Report wakeup events from buttons 2011-01-07 01:18:16 -05:00
cm_sbs.c
container.c
debugfs.c ACPI / debugfs: Fix buffer overflows, double free 2011-02-24 19:59:06 +01:00
dock.c ACPICA: Rename some function and variable names 2011-01-12 04:24:40 -05:00
ec_sys.c
ec.c ACPICA: Implicit notify support 2011-01-12 04:27:00 -05:00
event.c
fan.c ACPI / Fan: Rework the handling of power resources 2011-01-12 04:48:45 -05:00
glue.c ACPI / PM: Drop special ACPI wakeup flags 2011-01-07 01:18:00 -05:00
hed.c
internal.h Merge branch 'suspend-ioremap-cache' into release 2011-01-12 16:11:46 -05:00
Kconfig PM / ACPI: Remove references to pm_flags from bus.c 2011-03-15 00:43:15 +01:00
Makefile Merge branch 'ipmi' into release 2011-01-12 05:03:13 -05:00
numa.c x86-64, NUMA: Unify {acpi|amd}_{numa_init|scan_nodes}() arguments and return values 2011-02-16 12:13:06 +01:00
nvs.c ACPI: Introduce acpi_os_ioremap() 2011-01-20 18:30:17 -08:00
osl.c Merge branch 'master' into for-2.6.39 2011-02-21 09:43:56 +01:00
pci_bind.c
pci_irq.c
pci_link.c
pci_root.c PCI: Disable ASPM when _OSC control is not granted for PCIe services 2011-03-21 09:41:08 -07:00
pci_slot.c
power_meter.c
power.c ACPI / PM: Check status of power resources under mutexes 2011-01-12 05:05:39 -05:00
proc.c ACPI / PM: Use device wakeup flags for handling ACPI wakeup devices 2011-01-07 01:17:41 -05:00
processor_core.c ACPI, intel_idle: Cleanup idle= internal variables 2011-01-12 12:47:30 -05:00
processor_driver.c Merge branch 'throttling' into release 2011-01-12 05:01:08 -05:00
processor_idle.c Merge branch 'linus' into idle-test 2011-01-12 18:06:06 -05:00
processor_perflib.c
processor_thermal.c ACPI thermal: remove two unused functions 2010-12-11 02:01:47 -05:00
processor_throttling.c Merge branch 'throttling' into release 2011-01-12 05:01:08 -05:00
reboot.c
sbs.c ACPI: delete CONFIG_ACPI_PROCFS_POWER and power procfs I/F in 2.6.39 2011-01-12 00:36:17 -05:00
sbshc.c
sbshc.h
scan.c ACPI: Drop device flag wake_capable 2011-01-12 05:06:01 -05:00
sleep.c Merge branch 'x86-trampoline-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2011-03-16 10:10:02 -07:00
sleep.h
sysfs.c ACPICA: Global event handler 2011-01-12 04:27:00 -05:00
tables.c
thermal.c ACPI / Fan: Rework the handling of power resources 2011-01-12 04:48:45 -05:00
utils.c
video_detect.c ACPI / Video: Probe for output switch method when searching video devices. 2011-02-12 01:40:16 +01:00
video.c Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2011-01-13 20:15:35 -08:00
wakeup.c ACPI / Wakeup: Enable button GPEs unconditionally during initialization 2011-02-12 01:39:53 +01:00