06 Dec, 2011

1 commit

  • Right now we forcibly clear ASPM state on all devices if the BIOS indicates
    that the feature isn't supported. Based on the Microsoft presentation
    "PCI Express In Depth for Windows Vista and Beyond", I'm starting to think
    that this may be an error. The implication is that unless the platform
    grants full control via _OSC, Windows will not touch any PCIe features -
    including ASPM. In that case clearing ASPM state would be an error unless
    the platform has granted us that control.

    This patch reworks the ASPM disabling code such that the actual clearing
    of state is triggered by a successful handoff of PCIe control to the OS.
    The general ASPM code undergoes some changes in order to ensure that the
    ability to clear the bits isn't overridden by ASPM having already been
    disabled. Further, this theoretically now allows for situations where
    only a subset of PCIe roots hand over control, leaving the others in the
    BIOS state.

    It's difficult to know for sure that this is the right thing to do -
    there's zero public documentation on the interaction between all of these
    components. But enough vendors enable ASPM on platforms and then set this
    bit that it seems likely that they're expecting the OS to leave them alone.

    Measured to save around 5W on an idle Thinkpad X220.

    Signed-off-by: Matthew Garrett
    Signed-off-by: Jesse Barnes

    Matthew Garrett
     

14 Jul, 2011

1 commit


11 May, 2011

1 commit

  • If an attempt to get _OSC control of the PCIe native features from the
    BIOS fails, report the resulting mask of control flags the BIOS was
    willing to grant in the error message. Moreover, if the _OSC support
    mask is insufficient for requesting control of the PCIe native features
    or pcie_ports_disabled is set, print a diagnostic message containing the
    _OSC support mask. This helps to diagnose obscure _OSC-related problems
    on a number machines.

    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     

22 Mar, 2011

2 commits

  • 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 852972acff8f10f3a15679be2059bb94916cba5d (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
    Cc: Rafael J. Wysocki
    Cc: Matthew Garrett
    Signed-off-by: Jesse Barnes

    Naga Chumbalkar
     
  • We need to distinguish the situation in which ASPM support is
    disabled from the command line or through .config from the situation
    in which it is disabled, because the hardware or BIOS can't handle
    it. In the former case we should not report ASPM support to the BIOS
    through ACPI _OSC, but in the latter case we should do that.

    Introduce pcie_aspm_support_enabled() that can be used by
    acpi_pci_root_add() to determine whether or not it should report ASPM
    support to the BIOS through _OSC.

    Cc: stable@kernel.org
    References: https://bugzilla.kernel.org/show_bug.cgi?id=29722
    References: https://bugzilla.kernel.org/show_bug.cgi?id=20232
    Reported-and-tested-by: Ortwin Glück
    Reviewed-by: Kenji Kaneshige
    Tested-by: Kenji Kaneshige
    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     

17 Jan, 2011

1 commit

  • Commit 415e12b23792 ("PCI/ACPI: Request _OSC control once for each root
    bridge (v3)") put the acpi_hest_init() call in acpi_pci_root_init() into
    a wrong place, presumably because the author confused acpi_pci_disabled
    with acpi_disabled. Bring the code ordering in acpi_pci_root_init()
    back to sanity.

    Additionally, make sure that hest_disable is set when acpi_disabled is
    set, which is going to prevent acpi_hest_parse(), that still may be
    executed for acpi_disabled=1 through aer_acpi_firmware_first(), from
    crashing because of uninitialized hest_tab.

    Reported-and-tested-by: Andres Salomon
    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Linus Torvalds

    Rafael J. Wysocki
     

15 Jan, 2011

1 commit

  • Move the evaluation of acpi_pci_osc_control_set() (to request control of
    PCI Express native features) into acpi_pci_root_add() to avoid calling
    it many times for the same root complex with the same arguments.
    Additionally, check if all of the requisite _OSC support bits are set
    before calling acpi_pci_osc_control_set() for a given root complex.

    References: https://bugzilla.kernel.org/show_bug.cgi?id=20232
    Reported-by: Ozan Caglayan
    Tested-by: Ozan Caglayan
    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     

16 Oct, 2010

1 commit


25 Aug, 2010

5 commits

  • After commit 852972acff8f10f3a15679be2059bb94916cba5d (ACPI: Disable
    ASPM if the platform won't provide _OSC control for PCIe) control of
    the PCIe Capability Structure is unconditionally requested by
    acpi_pci_root_add(), which in principle may cause problems to
    happen in two ways. First, the BIOS may refuse to give control of
    the PCIe Capability Structure if it is not asked for any of the
    _OSC features depending on it at the same time. Second, the BIOS may
    assume that control of the _OSC features depending on the PCIe
    Capability Structure will be requested in the future and may behave
    incorrectly if that doesn't happen. For this reason, control of
    the PCIe Capability Structure should always be requested along with
    control of any other _OSC features that may depend on it (ie. PCIe
    native PME, PCIe native hot-plug, PCIe AER).

    Rework the PCIe port driver so that (1) it checks which native PCIe
    port services can be enabled, according to the BIOS, and (2) it
    requests control of all these services simultaneously. In
    particular, this causes pcie_portdrv_probe() to fail if the BIOS
    refuses to grant control of the PCIe Capability Structure, which
    means that no native PCIe port services can be enabled for the PCIe
    Root Complex the given port belongs to. If that happens, ASPM is
    disabled to avoid problems with mishandling it by the part of the
    PCIe hierarchy for which control of the PCIe Capability Structure
    has not been received.

    Make it possible to override this behavior using 'pcie_ports=native'
    (use the PCIe native services regardless of the BIOS response to the
    control request), or 'pcie_ports=compat' (do not use the PCIe native
    services at all).

    Accordingly, rework the existing PCIe port service drivers so that
    they don't request control of the services directly.

    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     
  • It is possible that the BIOS will not grant control of all _OSC
    features requested via acpi_pci_osc_control_set(), so it is
    recommended to negotiate the final set of _OSC features with the
    query flag set before calling _OSC to request control of these
    features.

    To implement it, rework acpi_pci_osc_control_set() so that the caller
    can specify the mask of _OSC control bits to negotiate and the mask
    of _OSC control bits that are absolutely necessary to it. Then,
    acpi_pci_osc_control_set() will run _OSC queries in a loop until
    the mask of _OSC control bits returned by the BIOS is equal to the
    mask passed to it. Also, before running the _OSC request
    acpi_pci_osc_control_set() will check if the caller's required
    control bits are present in the final mask.

    Using this mechanism we will be able to avoid situations in which the
    BIOS doesn't grant control of certain _OSC features, because they
    depend on some other _OSC features that have not been requested.

    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     
  • There is the assumption in acpi_pci_osc_control_set() that it is
    always sufficient to compare the mask of _OSC control bits to be
    requested with the result of an _OSC query where all of the known
    control bits have been checked. However, in general, that need not
    be the case. For example, if an _OSC feature A depends on an _OSC
    feature B and control of A, B plus another _OSC feature C is
    requested simultaneously, the BIOS may return A, B, C, while it would
    only return C if A and C were requested without B.

    That may result in passing a wrong mask of _OSC control bits to an
    _OSC control request, in which case the BIOS may only grant control
    of a subset of the requested features. Moreover, acpi_pci_run_osc()
    will return error code if that happens and the caller of
    acpi_pci_osc_control_set() will not know that it's been granted
    control of some _OSC features. Consequently, the system will
    generally not work as expected.

    Apart from this acpi_pci_osc_control_set() always uses the mask
    of _OSC control bits returned by the very first invocation of
    acpi_pci_query_osc(), but that is done with the second argument
    equal to OSC_PCI_SEGMENT_GROUPS_SUPPORT which generally happens
    to affect the returned _OSC control bits.

    For these reasons, make acpi_pci_osc_control_set() always check if
    control of the requested _OSC features will be granted before making
    the final control request. As a result, the osc_control_qry and
    osc_queried members of struct acpi_pci_root are not necessary any
    more, so drop them and remove the remaining code referring to them.

    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     
  • Make acpi_pci_query_osc() use an additional pointer argument to
    return the mask of control bits obtained from the BIOS to the
    caller.

    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     
  • Make acpi_pci_osc_control_set() attempt to find the handle of the
    _OSC object under the given PCI root bridge object after verifying
    that its second argument is correct and that there is a struct
    acpi_pci_root object for the given root bridge handle, which is
    more logical than the old code.

    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Hidetoshi Seto
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     

31 Jul, 2010

1 commit

  • 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.

    Acked-by: Rafael J. Wysocki
    Signed-off-by: Matthew Garrett
    Signed-off-by: Jesse Barnes

    Matthew Garrett
     

29 May, 2010

1 commit


04 Apr, 2010

2 commits

  • The acpi_pci_root structure contains all the individual items (acpi_device,
    domain, bus number) we pass to pci_acpi_scan_root(), so just pass the
    single acpi_pci_root pointer directly.

    This will make it easier to add _CBA support later. For _CBA, we need the
    entire downstream bus range, not just the base bus number. We have that in
    the acpi_pci_root structure, so passing the pointer makes it available to
    the arch-specific code.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Kenji Kaneshige
    Signed-off-by: Len Brown

    Bjorn Helgaas
     
  • Previously, we only saved the root bus number, i.e., the beginning of the
    downstream bus range. We now support IORESOURCE_BUS resources, so this
    patch uses that to keep track of both the beginning and the end of the
    downstream bus range.

    It's important to know both the beginning and the end for supporting _CBA
    (see PCI Firmware spec, rev 3.0, sec 4.1.3) and so we know the limits for
    any possible PCI bus renumbering (we can't renumber downstream buses to be
    outside the bus number range claimed by the host bridge).

    It's clear from the spec that the bus range is supposed to be in _CRS, but
    if we don't find it there, we'll assume [_BBN - 0xFF] or [0 - 0xFF].

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Kenji Kaneshige
    Signed-off-by: Len Brown

    Bjorn Helgaas
     

30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

24 Feb, 2010

1 commit

  • The main benefit of using ACPI host bridge window information is that
    we can do better resource allocation in systems with multiple host bridges,
    e.g., http://bugzilla.kernel.org/show_bug.cgi?id=14183

    Sometimes we need _CRS information even if we only have one host bridge,
    e.g., https://bugs.launchpad.net/ubuntu/+source/linux/+bug/341681

    Most of these systems are relatively new, so this patch turns on
    "pci=use_crs" only on machines with a BIOS date of 2008 or newer.

    Signed-off-by: Bjorn Helgaas
    Signed-off-by: Jesse Barnes

    Bjorn Helgaas
     

23 Feb, 2010

1 commit

  • Although the majority of PCI devices can generate PMEs that in
    principle may be used to wake up devices suspended at run time,
    platform support is generally necessary to convert PMEs into wake-up
    events that can be delivered to the kernel. If ACPI is used for this
    purpose, PME signals generated by a PCI device will trigger the ACPI
    GPE associated with the device to generate an ACPI wake-up event that
    we can set up a handler for, provided that everything is configured
    correctly.

    Unfortunately, the subset of PCI devices that have GPEs associated
    with them is quite limited. The devices without dedicated GPEs have
    to rely on the GPEs associated with other devices (in the majority of
    cases their upstream bridges and, possibly, the root bridge) to
    generate ACPI wake-up events in response to PME signals from them.

    Add ACPI platform support for PCI PME wake-up:
    o Add a framework making is possible to use ACPI system notify
    handlers for run-time PM.
    o Add new PCI platform callback ->run_wake() to struct
    pci_platform_pm_ops allowing us to enable/disable the platform to
    generate wake-up events for given device. Implemet this callback
    for the ACPI platform.
    o Define ACPI wake-up handlers for PCI devices and PCI root buses and
    make the PCI-ACPI binding code register wake-up notifiers for all
    PCI devices present in the ACPI tables.
    o Add function pci_dev_run_wake() which can be used by PCI drivers to
    check if given device is capable of generating wake-up events at
    run time.

    Developed in cooperation with Matthew Garrett .

    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Jesse Barnes

    Rafael J. Wysocki
     

17 Jan, 2010

1 commit

  • The ids field of the struct acpi_driver is constant in
    so it is worth to make the initialization data also constant.

    The semantic match that finds this kind of pattern is as follows:
    (http://coccinelle.lip6.fr/)

    //
    @r@
    disable decl_init,const_decl_init;
    identifier I1, I2, x;
    @@
    struct I1 {
    ...
    const struct I2 *x;
    ...
    };
    @s@
    identifier r.I1, y;
    identifier r.x, E;
    @@
    struct I1 y = {
    .x = E,
    };
    @c@
    identifier r.I2;
    identifier s.E;
    @@
    const struct I2 E[] = ... ;
    @depends on !c@
    identifier r.I2;
    identifier s.E;
    @@
    + const
    struct I2 E[] = ...;
    //

    Signed-off-by: Márton Németh
    Cc: Julia Lawall
    Cc: cocci@diku.dk
    Signed-off-by: Len Brown

    Márton Németh
     

17 Dec, 2009

1 commit


13 Oct, 2009

1 commit

  • acpi_get_pci_dev() may be called for a non-PCI device, in which case
    it should return NULL. However, it assumes that every handle it
    finds in the ACPI CA name space, between given device handle and the
    PCI root bridge handle, corresponds to a PCI-to-PCI bridge with an
    existing secondary bus. For this reason, when it finds a struct
    pci_dev object corresponding to one of them, it doesn't check if
    its 'subordinate' field is a valid pointer. This obviously leads to
    a NULL pointer dereference if acpi_get_pci_dev() is called for a
    non-PCI device with a PCI parent which is not a bridge.

    To fix this issue make acpi_get_pci_dev() check if pdev->subordinate
    is not NULL for every device it finds on the path between the root
    bridge and the device it's supposed to get to and return NULL if the
    "target" device cannot be found.

    http://bugzilla.kernel.org/show_bug.cgi?id=14129
    (worked in 2.6.30, regression in 2.6.31)

    Signed-off-by: Rafael J. Wysocki
    Reported-by: Danny Feng
    Reviewed-by: Alex Chiang
    Tested-by: chepioq
    Signed-off-by: Len Brown

    Rafael J. Wysocki
     

19 Sep, 2009

1 commit


10 Sep, 2009

1 commit


29 Aug, 2009

1 commit

  • Linux/ACPI core files using internal.h all PREFIX "ACPI: ",
    however, not all ACPI drivers use/want it -- and they
    should not have to #undef PREFIX to define their own.

    Add GPL commment to internal.h while we are there.

    This does not change any actual console output,
    asside from a whitespace fix.

    Signed-off-by: Len Brown

    Len Brown
     

26 Jun, 2009

1 commit

  • ref: http://thread.gmane.org/gmane.linux.kernel/857228/focus=857468

    When the ACPI video driver initializes, it does a namespace walk
    looking for for supported devices. When we find an appropriate
    handle, we walk up the ACPI tree looking for a PCI root bus, and
    then walk back down the PCI bus, assuming that every device
    inbetween is a P2P bridge.

    This assumption is not correct, and is reported broken on at
    least:

    Dell Latitude E6400
    ThinkPad X61
    Dell XPS M1330

    Add a NULL deref check to prevent boot panics.

    Reported-by: Alessandro Suardi
    Signed-off-by: Troy Moure
    Signed-off-by: Alex Chiang
    Signed-off-by: Len Brown

    Troy Moure
     

24 Jun, 2009

1 commit


20 Jun, 2009

5 commits

  • We never use the PCI device & function number, so remove it to make
    it clear that it's not needed. Many PCI host bridges don't even
    appear in config space, so it's meaningless to look at stuff from
    _ADR, which doesn't exist in that case.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Alex Chiang
    Signed-off-by: Len Brown

    Bjorn Helgaas
     
  • Using list_for_each_entry() makes traversing the root list easier.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Alex Chiang
    Signed-off-by: Len Brown

    Bjorn Helgaas
     
  • There's no need to search the list to find the acpi_pci_root
    structure. We saved it as device->driver_data when we added
    the device.

    Signed-off-by: Bjorn Helgaas
    Signed-off-by: Len Brown

    Bjorn Helgaas
     
  • By looking up the segment & bus number earlier, we don't have to
    worry about cleaning up if it fails.

    Signed-off-by: Bjorn Helgaas
    Signed-off-by: Len Brown

    Bjorn Helgaas
     
  • To find a host bridge's downstream bus number, we currently look at _BBN
    first. If _BBN returns a bus number we've already seen, we conclude that
    _BBN was wrong and look for a bus number in _CRS.

    However, the spec[1] (figure 5-5 and the example in sec 9.12.1) and an ACPI
    FAQ[2] suggest that the OS should use _CRS to discover the bus number
    range, and that _BBN is really intended to bootstrap _CRS methods that
    reference PCI opregions.

    This patch makes us always look at _CRS first. If _CRS doesn't supply a
    bus number, we look at _BBN. If _BBN doesn't exist, we default to zero.
    This makes the behavior consistent regardless of device discovery order.
    Previously, if A and B had duplicate _BBNs and we found A first, we'd only
    look at B's _CRS, whereas if we found B first, we'd only look at A's _CRS.

    I'm told that Windows discovers host bridge bus numbers using _CRS, so
    it should be fairly safe to rely on this BIOS functionality.

    This patch also removes two misleading messages: we printed the "Wrong _BBN
    value, reboot and use option 'pci=noacpi'" message before looking at _CRS,
    so we would likely find the bus number in _CRS, the system would work fine,
    and the user would be confused. The "PCI _CRS %d overrides _BBN 0" message
    incorrectly assumes _BBN was zero, and it's useless anyway because we
    print the segment/bus number a few lines later.

    References:
    [1] http://www.acpi.info/DOWNLOADS/ACPIspec30b.pdf
    [2] http://www.acpi.info/acpi_faq.htm _BBN/_CRS discussion
    http://download.microsoft.com/download/9/8/f/98f3fe47-dfc3-4e74-92a3-088782200fe7/TWAR05005_WinHEC05.ppt (slide 17)
    http://bugzilla.kernel.org/show_bug.cgi?id=1662 ASUS PR-DLS
    http://bugzilla.kernel.org/show_bug.cgi?id=1127 ASUS PR-DLSW
    http://bugzilla.kernel.org/show_bug.cgi?id=1741 ASUS PR-DLS533

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Alex Chiang
    CC: Shaohua Li
    CC: Kenji Kaneshige
    Signed-off-by: Len Brown

    Bjorn Helgaas
     

18 Jun, 2009

5 commits

  • A PCI domain cannot change as you descend down subordinate buses, which
    makes the 'segment' argument to acpi_pci_irq_add_prt() useless.

    Change the interface to take a struct pci_bus *, from whence we can derive
    the bus number and segment. Reducing the number of arguments makes life
    simpler for callers.

    Signed-off-by: Alex Chiang
    Acked-by: Bjorn Helgaas
    Signed-off-by: Len Brown

    Alexander Chiang
     
  • Now that we can dynamically convert an ACPI CA handle to a
    struct pci_dev at runtime, there's no need to statically bind
    them during boot.

    acpi_pci_bind/unbind are vastly simplified, and are only used
    to evaluate _PRT methods on P2P bridges and non-bridge children.

    This patch also changes the time-space tradeoff ever so slightly.

    Looking up the ACPI-PCI binding is never in the performance path, and by
    eliminating this caching, we save 24 bytes for each _ADR device in the
    ACPI namespace.

    This patch lays further groundwork to eventually eliminate
    the acpi_driver_ops.bind callback.

    Signed-off-by: Alex Chiang
    Acked-by: Bjorn Helgaas
    Signed-off-by: Len Brown

    Alexander Chiang
     
  • Convert an ACPI CA handle to a struct pci_dev.

    Performing this lookup dynamically allows us to get rid of the
    ACPI-PCI binding code, which:

    - eliminates struct acpi_device vs struct pci_dev lifetime issues
    - lays more groundwork for eliminating .start from acpi_device_ops
    and thus simplifying ACPI drivers
    - whacks out a lot of code

    This change lays the groundwork for eliminating much of pci_bind.c.

    Although pci_root.c may not be the most logical place for this
    change, putting it here saves us from having to export acpi_pci_find_root.

    Signed-off-by: Alex Chiang
    Acked-by: Bjorn Helgaas
    Signed-off-by: Len Brown

    Alexander Chiang
     
  • Returns whether an ACPI CA node is a PCI root bridge or not.

    This API is generically useful, and shouldn't just be a hotplug function.

    The implementation becomes much simpler as well.

    Signed-off-by: Alex Chiang
    Acked-by: Bjorn Helgaas
    Signed-off-by: Len Brown

    Alexander Chiang
     
  • acpi_pci_root_add() explicitly assigns device->ops.bind, and later
    calls acpi_pci_bind_root(), which also does the same thing.

    We don't need to repeat ourselves; removing the explicit assignment
    allows us to make acpi_pci_bind() static.

    Signed-off-by: Alex Chiang
    Acked-by: Bjorn Helgaas
    Signed-off-by: Len Brown

    Alexander Chiang
     

20 Mar, 2009

2 commits

  • - Rename pci_osc_control_set() to acpi_pci_osc_control_set() according
    to the other API names in drivers/acpi/pci_root.c.

    - Move _OSC related definitions to include/linux/acpi.h because _OSC
    related API is implemented in drivers/acpi/pci_root.c now.

    Signed-off-by: Kenji Kaneshige
    Reviewed-by: Andrew Patterson
    Tested-by: Andrew Patterson
    Signed-off-by: Jesse Barnes

    Kenji Kaneshige
     
  • Move PCI _OSC management code from drivers/pci/pci-acpi.c to
    drivers/acpi/pci_root.c. The benefits are

    - We no longer need struct osc_data and its management code (contents
    are moved to struct acpi_pci_root). This simplify the code, and we
    no longer care about kmalloc() failure.

    - We can make pci_acpi_osc_support() be a static function, which is
    called only from drivers/acpi/pci_root.c.

    Signed-off-by: Kenji Kaneshige
    Reviewed-by: Andrew Patterson
    Tested-by: Andrew Patterson
    Acked-by: Alex Chiang
    Signed-off-by: Jesse Barnes

    Kenji Kaneshige