20 Jan, 2021

1 commit

  • commit a58015d638cd4e4555297b04bec9b49028369075 upstream.

    Linux VM on Hyper-V crashes with the latest mainline:

    [ 4.069624] detected buffer overflow in strcpy
    [ 4.077733] kernel BUG at lib/string.c:1149!
    ..
    [ 4.085819] RIP: 0010:fortify_panic+0xf/0x11
    ...
    [ 4.085819] Call Trace:
    [ 4.085819] acpi_device_add.cold.15+0xf2/0xfb
    [ 4.085819] acpi_add_single_object+0x2a6/0x690
    [ 4.085819] acpi_bus_check_add+0xc6/0x280
    [ 4.085819] acpi_ns_walk_namespace+0xda/0x1aa
    [ 4.085819] acpi_walk_namespace+0x9a/0xc2
    [ 4.085819] acpi_bus_scan+0x78/0x90
    [ 4.085819] acpi_scan_init+0xfa/0x248
    [ 4.085819] acpi_init+0x2c1/0x321
    [ 4.085819] do_one_initcall+0x44/0x1d0
    [ 4.085819] kernel_init_freeable+0x1ab/0x1f4

    This is because of the recent buffer overflow detection in the
    commit 6a39e62abbaf ("lib: string.h: detect intra-object overflow in
    fortified string functions")

    Here acpi_device_bus_id->bus_id can only hold 14 characters, while the
    the acpi_device_hid(device) returns a 22-char string
    "HYPER_V_GEN_COUNTER_V1".

    Per ACPI Spec v6.2, Section 6.1.5 _HID (Hardware ID), if the ID is a
    string, it must be of the form AAA#### or NNNN####, i.e. 7 chars or 8
    chars.

    The field bus_id in struct acpi_device_bus_id was originally defined as
    char bus_id[9], and later was enlarged to char bus_id[15] in 2007 in the
    commit bb0958544f3c ("ACPI: use more understandable bus_id for ACPI
    devices")

    Fix the issue by changing the field bus_id to const char *, and use
    kstrdup_const() to initialize it.

    Signed-off-by: Dexuan Cui
    Tested-By: Jethro Beekman
    [ rjw: Subject change, whitespace adjustment ]
    Cc: All applicable
    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Greg Kroah-Hartman

    Dexuan Cui
     

10 Nov, 2020

1 commit


11 May, 2020

1 commit

  • If the EC GPE status is not set after checking all of the other GPEs,
    acpi_s2idle_wake() returns 'false', to indicate that the SCI event
    that has just triggered is not a system wakeup one, but it does that
    without canceling the pending wakeup and re-arming the SCI for system
    wakeup which is a mistake, because it may cause s2idle_loop() to busy
    spin until the next valid wakeup event. [If that happens, the first
    spurious wakeup is still pending after acpi_s2idle_wake() has
    returned, so s2idle_enter() does nothing, acpi_s2idle_wake()
    is called again and it sees that the SCI has triggered, but no GPEs
    are active, so 'false' is returned again, and so on.]

    Fix that by moving all of the GPE checking logic from
    acpi_s2idle_wake() to acpi_ec_dispatch_gpe() and making the
    latter return 'true' only if a non-EC GPE has triggered and
    'false' otherwise, which will cause acpi_s2idle_wake() to
    cancel the pending SCI wakeup and re-arm the SCI for system
    wakeup regardless of the EC GPE status.

    This also addresses a lockup observed on an Elitegroup EF20EA laptop
    after attempting to wake it up from suspend-to-idle by a key press.

    Fixes: d5406284ff80 ("ACPI: PM: s2idle: Refine active GPEs check")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=207603
    Reported-by: Todd Brandt
    Fixes: fdde0ff8590b ("ACPI: PM: s2idle: Prevent spurious SCIs from waking up the system")
    Link: https://lore.kernel.org/linux-acpi/CAB4CAwdqo7=MvyG_PE+PGVfeA17AHF5i5JucgaKqqMX6mjArbQ@mail.gmail.com/
    Reported-by: Chris Chiu
    Tested-by: Chris Chiu
    Cc: 5.4+ # 5.4+
    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

31 Mar, 2020

1 commit

  • Pull ACPI updates from Rafael Wysocki:

    - Update the ACPICA code in the kernel to the 20200214 upstream
    release including:

    * Fix to re-enable the sleep button after wakeup (Anchal
    Agarwal).

    * Fixes for mistakes in comments and typos (Bob Moore).

    * ASL-ASL+ converter updates (Erik Kaneda).

    * Type casting cleanups (Sven Barth).

    - Clean up the intialization of the EC driver and eliminate some dead
    code from it (Rafael Wysocki).

    - Clean up the quirk tables in the AC and battery drivers (Hans de
    Goede).

    - Fix the global lock handling on x86 to ignore unspecified bit
    positions in the global lock field (Jan Engelhardt).

    - Add a new "tiny" driver for ACPI button devices exposed by VMs to
    guest kernels to send signals directly to init (Josh Triplett).

    - Add a kernel parameter to disable ACPI BGRT on x86 (Alex Hung).

    - Make the ACPI PCI host bridge and fan drivers use scnprintf() to
    avoid potential buffer overflows (Takashi Iwai).

    - Clean up assorted pieces of code:

    * Reorder "asmlinkage" to make g++ happy (Alexey Dobriyan).

    * Drop unneeded variable initialization (Colin Ian King).

    * Add missing __acquires/__releases annotations (Jules Irenge).

    * Replace list_for_each_safe() with list_for_each_entry_safe()
    (chenqiwu)"

    * tag 'acpi-5.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (31 commits)
    ACPICA: Update version to 20200214
    ACPI: PCI: Use scnprintf() for avoiding potential buffer overflow
    ACPI: fan: Use scnprintf() for avoiding potential buffer overflow
    ACPI: EC: Eliminate EC_FLAGS_QUERY_HANDSHAKE
    ACPI: EC: Do not clear boot_ec_is_ecdt in acpi_ec_add()
    ACPI: EC: Simplify acpi_ec_ecdt_start() and acpi_ec_init()
    ACPI: EC: Consolidate event handler installation code
    acpi/x86: ignore unspecified bit positions in the ACPI global lock field
    acpi/x86: add a kernel parameter to disable ACPI BGRT
    x86/acpi: make "asmlinkage" part first thing in the function definition
    ACPI: list_for_each_safe() -> list_for_each_entry_safe()
    ACPI: video: remove redundant assignments to variable result
    ACPI: OSL: Add missing __acquires/__releases annotations
    ACPI / battery: Cleanup Lenovo Ideapad Miix 320 DMI table entry
    ACPI / AC: Cleanup DMI quirk table
    ACPI: EC: Use fast path in acpi_ec_add() for DSDT boot EC
    ACPI: EC: Simplify acpi_ec_add()
    ACPI: EC: Drop AE_NOT_FOUND special case from ec_install_handlers()
    ACPI: EC: Avoid passing redundant argument to functions
    ACPI: EC: Avoid printing confusing messages in acpi_ec_setup()
    ...

    Linus Torvalds
     

25 Mar, 2020

1 commit

  • The check for any active GPEs added by commit fdde0ff8590b ("ACPI:
    PM: s2idle: Prevent spurious SCIs from waking up the system") turns
    out to be insufficiently precise to prevent some systems from
    resuming prematurely due to a spurious EC wakeup, so refine it
    by first checking if any GPEs other than the EC GPE are active
    and skipping all of the SCIs coming from the EC that do not produce
    any genuine wakeup events after processing.

    Link: https://bugzilla.kernel.org/show_bug.cgi?id=206629
    Fixes: fdde0ff8590b ("ACPI: PM: s2idle: Prevent spurious SCIs from waking up the system")
    Reported-by: Ondřej Caletka
    Tested-by: Ondřej Caletka
    Cc: 5.4+ # 5.4+
    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

14 Mar, 2020

1 commit

  • Notice that the return value of acpi_ec_init() is discarded anyway,
    so it can be void and it doesn't need to check the return values of
    acpi_bus_register_driver() and acpi_ec_ecdt_start() called by it.
    Thus the latter can be void too and it really has nothing to do
    if acpi_ec_add() has already found an EC matching the boot one in the
    namespace. Also, acpi_ec_ecdt_get_handle() can be folded into it.

    Modify the code accordingly and while at it create a propoer kerneldoc
    comment to document acpi_ec_ecdt_start() and move the remark regarding
    ASUS X550ZE along with the related bug URL from acpi_ec_init() into
    that comment.

    Additionally, fix up a stale comment in acpi_ec_init().

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

28 Oct, 2019

1 commit

  • As defined in the ACPI spec section 12.11, ACPI hardware-reduced
    platforms define the EC SCI interrupt as a GpioInt in the _CRS object.

    This replaces the previous way of using a GPE for this interrupt;
    GPE blocks are not available on reduced hardware platforms.

    Add support for handling this interrupt as an EC event source, and
    avoid GPE usage on reduced hardware platforms.

    This enables the use of several media keys (e.g. screen brightness
    up/down) on Asus UX434DA.

    Signed-off-by: Daniel Drake
    Signed-off-by: Rafael J. Wysocki

    Daniel Drake
     

08 Aug, 2019

2 commits


30 Jul, 2019

1 commit

  • The EC GPE needs to be set up for system wakeup only if there is a
    driver depending on it, either intel-hid or intel-vbtn, bound to a
    button device that is expected to wake up the system from sleep (such
    as the power button on some Dell systems, like the XPS13 9360). It
    doesn't need to be set up for waking up the system from sleep in any
    other cases and whether or not it is expected to wake up the system
    from sleep doesn't depend on whether or not the LPS0 device is
    present in the ACPI namespace.

    For this reason, rearrange the ACPI suspend-to-idle code to make the
    drivers depending on the EC GPE wakeup take care of setting it up and
    decouple that from the LPS0 device handling.

    While at it, make intel-hid and intel-vbtn prepare for system wakeup
    only if they are allowed to wake up the system from sleep by user
    space (via sysfs).

    [Note that acpi_ec_mark_gpe_for_wake() and acpi_ec_set_gpe_wake_mask()
    are there to prevent the EC GPE from being disabled by the
    acpi_enable_all_wakeup_gpes() call in acpi_s2idle_prepare(), so on
    systems with either intel-hid or intel-vbtn this change doesn't
    affect any interactions with the hardware or platform firmware.]

    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Andy Shevchenko

    Rafael J. Wysocki
     

23 Jul, 2019

1 commit

  • On some systems, if suspend-to-idle is used, the EC may signal system
    wakeup events (power button events, for example) as well as events
    that should not cause the system to resume and acpi_ec_dispatch_gpe()
    needs to be called to determine whether or not the system should
    resume then. In particular, if acpi_ec_dispatch_gpe() doesn't detect
    any EC events at all, the system should remain suspended, so it is
    useful to know when that is the case.

    For this reason, make acpi_ec_dispatch_gpe() return a bool value
    indicating whether or not any EC events have been detected by it.

    Signed-off-by: Rafael J. Wysocki
    Acked-by: Thomas Gleixner

    Rafael J. Wysocki
     

04 Jul, 2019

1 commit

  • Using acpi_device_get_power() outside of ACPI device initialization
    and ACPI sysfs is problematic due to the way in which power resources
    are handled by it, so unexport it and add a paragraph explaining the
    pitfalls to its kerneldoc comment.

    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Mika Westerberg

    Rafael J. Wysocki
     

05 Jun, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms and conditions of the gnu general public license
    version 2 as published by the free software foundation this program
    is distributed in the hope it will be useful but without any
    warranty without even the implied warranty of merchantability or
    fitness for a particular purpose see the gnu general public license
    for more details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 263 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Alexios Zavras
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190529141901.208660670@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

29 Jan, 2019

1 commit

  • Both acpi_ec_dsdt_probe() and acpi_ec_ecdt_probe() may be void as
    their return values are ignored anyway. This allows a couple of
    gotos and labels to go away from there.

    Moreover, acpi_ec_ecdt_probe() only needs to allocate the ec
    object after getting the ECDT pointer and checking it, so the
    pointless memory allocation and release on systems without the
    ECDT can be avoided by reordering it.

    No intentional functional impact.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

16 Jan, 2019

1 commit

  • After commit 5d32a66541c4 (PCI/ACPI: Allow ACPI to be built without
    CONFIG_PCI set), it is possible to build ACPI without any PCI support.

    This code depends on PCI. Compile only when PCI is present.

    Fixes: 5d32a66541c46 ("PCI/ACPI: Allow ACPI to be built without CONFIG_PCI set")
    Signed-off-by: Sinan Kaya
    Signed-off-by: Rafael J. Wysocki

    Sinan Kaya
     

26 Dec, 2018

2 commits

  • Pull device properties framework updates from Rafael Wysocki:
    "This introduces 'software nodes' that are analogous to the DT and ACPI
    firmware nodes except that they can be created by drivers themselves
    and do a couple of assorted cleanups.

    Specifics:

    - Introduce "software nodes", analogous to the DT and ACPI firmware
    nodes except that they can be created by kernel code, in order to
    complement fwnodes representing real firmware nodes when they are
    incomplete (for example missing device properties) and to supply
    the primary fwnode when the firmware lacks hardware description for
    a device completely, and replace the "property_set" struct
    fwnode_handle type with software nodes (Heikki Krogerus).

    - Clean up the just introduced software nodes support and fix a
    commet in the graph-handling code (Colin Ian King, Marco Felsch)"

    * tag 'devprop-4.21-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
    device property: fix fwnode_graph_get_next_endpoint() documentation
    drivers: base: swnode: remove need for a temporary string for the node name
    device property: Remove struct property_set
    device property: Move device_add_properties() to swnode.c
    drivers: base: Introducing software nodes to the firmware node framework
    ACPI / glue: Add acpi_platform_notify() function
    drivers core: Prepare support for multiple platform notifications
    driver core: platform: Remove duplicated device_remove_properties() call

    Linus Torvalds
     
  • Pull ACPI updates from Rafael Wysocki:
    "These update the ACPICA code in the kernel to the 20181213 upstream
    revision, make it possible to build the ACPI subsystem without PCI
    support, and a new OEM _OSI string, add a new device support to the
    ACPI driver for AMD SoCs and fix PM handling in the ACPI driver for
    Intel SoCs, fix the SPCR table handling and do some assorted fixes and
    cleanups.

    Specifics:

    - Update the ACPICA code in the kernel to the 20181213 upstream
    revision including:
    * New Windows _OSI strings (Bob Moore, Jung-uk Kim).
    * Buffers-to-string conversions update (Bob Moore).
    * Removal of support for expressions in package elements (Bob
    Moore).
    * New option to display method/object evaluation in debug output
    (Bob Moore).
    * Compiler improvements (Bob Moore, Erik Schmauss).
    * Minor debugger fix (Erik Schmauss).
    * Disassembler improvement (Erik Schmauss).
    * Assorted cleanups (Bob Moore, Colin Ian King, Erik Schmauss).

    - Add support for a new OEM _OSI string to indicate special handling
    of secondary graphics adapters on some systems (Alex Hung).

    - Make it possible to build the ACPI subystem without PCI support
    (Sinan Kaya).

    - Make the SPCR table handling regard baud rate 0 in accordance with
    the specification of it and make the DSDT override code support
    DSDT code names generated by recent ACPICA (Andy Shevchenko, Wang
    Dongsheng, Nathan Chancellor).

    - Add clock frequency for Hisilicon Hip08 SPI controller to the ACPI
    driver for AMD SoCs (APD) (Jay Fang).

    - Fix the PM handling during device init in the ACPI driver for Intel
    SoCs (LPSS) (Hans de Goede).

    - Avoid double panic()s by clearing the APEI GHES block_status before
    panic() (Lenny Szubowicz).

    - Clean up a function invocation in the ACPI core and get rid of some
    code duplication by using the DEFINE_SHOW_ATTRIBUTE macro in the
    APEI support code (Alexey Dobriyan, Yangtao Li)"

    * tag 'acpi-4.21-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (31 commits)
    ACPI / tables: Add an ifdef around amlcode and dsdt_amlcode
    ACPI/APEI: Clear GHES block_status before panic()
    ACPI: Make PCI slot detection driver depend on PCI
    ACPI/IORT: Stub out ACS functions when CONFIG_PCI is not set
    arm64: select ACPI PCI code only when both features are enabled
    PCI/ACPI: Allow ACPI to be built without CONFIG_PCI set
    ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is unset
    ACPI: Allow CONFIG_PCI to be unset for reboot
    ACPI: Move PCI reset to a separate function
    ACPI / OSI: Add OEM _OSI string to enable dGPU direct output
    ACPI / tables: add DSDT AmlCode new declaration name support
    ACPICA: Update version to 20181213
    ACPICA: change coding style to match ACPICA, no functional change
    ACPICA: Debug output: Add option to display method/object evaluation
    ACPICA: disassembler: disassemble OEMx tables as AML
    ACPICA: Add "Windows 2018.2" string in the _OSI support
    ACPICA: Expressions in package elements are not supported
    ACPICA: Update buffer-to-string conversions
    ACPICA: add comments, no functional change
    ACPICA: Remove defines that use deprecated flag
    ...

    Linus Torvalds
     

20 Dec, 2018

1 commit


18 Dec, 2018

1 commit

  • There are systems in which non-wakeup GPEs fire during the "noirq"
    suspend stage of suspending devices and that effectively prevents the
    system that tries to suspend to idle from entering any low-power
    state at all. If the offending GPE fires regularly and often enough,
    the system appears to be suspended, but in fact it is in a tight loop
    over "noirq" suspend and "noirq" resume of devices all the time.

    To prevent that from happening, disable all non-wakeup GPEs except
    for the EC GPE for suspend-to-idle (the EC GPE is special, because
    on some systems it has to be enabled for power button wakeup events
    to be generated as expected).

    Fixes: 147a7d9d25ca (ACPI / PM: Do not reconfigure GPEs for suspend-to-idle)
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=201987
    Reported-by: Zhang Rui
    Tested-by: Mika Westerberg
    Tested-by: Zhang Rui
    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

27 Nov, 2018

1 commit

  • Instead of relying on the "platform_notify" callback hook,
    introducing separate notification function
    acpi_platform_notify() and calling that directly from
    drivers core when device entries are added and removed.

    Signed-off-by: Heikki Krogerus
    Acked-by: Linus Walleij
    Reviewed-by: Andy Shevchenko
    Signed-off-by: Rafael J. Wysocki

    Heikki Krogerus
     

25 May, 2018

1 commit

  • On platforms where the Low Power S0 Idle _DSM interface is used,
    on wakeup from suspend-to-idle, when it is known that the ACPI SCI
    has triggered while suspended, dispatch the EC GPE in order to catch
    all EC events that may have triggered the wakeup before carrying out
    the noirq phase of device resume.

    That is needed to handle power button wakeup on some platforms where
    the EC goes into a low-power mode during suspend-to-idle and while in
    that mode it will discard events after a timeout. If that timeout is
    shorter than the time it takes to complete the noirq resume of
    devices, looking for EC events after the latter is too late.

    Signed-off-by: Rafael J. Wysocki
    Reported-by: Zhang Rui
    Tested-by: Wendy Wang

    Rafael J. Wysocki
     

04 Jan, 2018

1 commit

  • acpi_ec.gpe is "unsigned long", hence treating it as "u32" would expose
    the wrong half on big-endian 64-bit systems. Fix this by changing its
    type to "u32" and removing the cast, as all other code already uses u32
    or sometimes even only u8.

    Fixes: 1195a098168fcacf (ACPI: Provide /sys/kernel/debug/ec/...)
    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: Rafael J. Wysocki

    Geert Uytterhoeven
     

30 Nov, 2017

1 commit


21 Nov, 2017

1 commit

  • On platforms (ASUS X550ZE and possibly all ASUS X series) with valid ECDT
    EC but invalid DSDT EC, EC PM ops won't be invoked as ECDT EC is not an
    ACPI device. Thus the following commit actually removed post-resume
    acpi_ec_enable_event() invocation for such platforms, and triggered a
    regression on them that after being resumed, EC (actually should be ECDT)
    driver stops handling EC events:

    Commit: c2b46d679b30c5c0d7eb47a21085943242bdd8dc
    Subject: ACPI / EC: Add PM operations to improve event handling for resume process

    Notice that the root cause actually is "ECDT is not an ACPI device" rather
    than "the timing of acpi_ec_enable_event() invocation", this patch fixes
    this issue by enumerating ECDT EC as an ACPI device. Due to the existence
    of the noirq stage, the ability of tuning the timing of
    acpi_ec_enable_event() invocation is still meaningful.

    This patch is a little bit different from the posted fix by moving
    acpi_config_boot_ec() from acpi_ec_ecdt_start() to acpi_ec_add() to make
    sure that EC event handling won't be stopped as long as the ACPI EC driver
    is bound. Thus the following sequence shouldn't disable EC event handling:
    unbind,suspend,resume,bind.

    Fixes: c2b46d679b30 (ACPI / EC: Add PM operations to improve event handling for resume process)
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=196847
    Reported-by: Luya Tshimbalanga
    Tested-by: Luya Tshimbalanga
    Cc: 4.9+ # 4.9+
    Signed-off-by: Lv Zheng
    Signed-off-by: Rafael J. Wysocki

    Lv Zheng
     

11 Oct, 2017

1 commit

  • Add functionality to read LPIT table, which provides:

    - Sysfs interface to read residency counters via
    /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us
    /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us

    Here the count "low_power_idle_cpu_residency_us" shows the time spent
    by CPU package in low power state. This is read via MSR interface,
    which points to MSR for PKG C10.

    Here the count "low_power_idle_system_residency_us" show the count the
    system was in low power state. This is read via MMIO interface. This
    is mapped to SLP_S0 residency on modern Intel systems. This residency
    is achieved only when CPU is in PKG C10 and all functional blocks are
    in low power state.

    It is possible that none of the above counters present or anyone of the
    counter present or all counters present.

    For example: On my Kabylake system both of the above counters present.
    After suspend to idle these counts updated and prints:

    6916179
    6998564

    This counter can be read by tools like turbostat to display. Or it can
    be used to debug, if modern systems are reaching desired low power state.

    - Provides an interface to read residency counter memory address

    This address can be used to get the base address of PMC memory
    mapped IO. This is utilized by intel_pmc_core driver to print
    more debug information.

    In addition, to avoid code duplication to read iomem, removed the read of
    iomem from acpi_os_read_memory() in osl.c and made a common function
    acpi_os_read_iomem(). This new function is used for reading iomem in
    in both osl.c and acpi_lpit.c.

    Link: http://www.uefi.org/sites/default/files/resources/Intel_ACPI_Low_Power_S0_Idle.pdf
    Signed-off-by: Srinivas Pandruvada
    Signed-off-by: Rafael J. Wysocki

    Srinivas Pandruvada
     

04 Sep, 2017

1 commit

  • * acpi-x86:
    ACPI / boot: Add number of legacy IRQs to debug output
    ACPI / boot: Correct address space of __acpi_map_table()
    ACPI / boot: Don't define unused variables

    * acpi-soc:
    ACPI / LPSS: Don't abort ACPI scan on missing mem resource

    * acpi-pmic:
    ACPI / PMIC: xpower: Do pinswitch magic when reading GPADC

    * acpi-apple:
    spi: Use Apple device properties in absence of ACPI resources
    ACPI / scan: Recognize Apple SPI and I2C slaves
    ACPI / property: Support Apple _DSM properties
    ACPI / property: Don't evaluate objects for devices w/o handle
    treewide: Consolidate Apple DMI checks

    Rafael J. Wysocki
     

18 Aug, 2017

1 commit

  • Commit 2a5708409e4e (ACPI / EC: Fix a gap that ECDT EC cannot handle
    EC events) introduced acpi_ec_ecdt_start(), but that function is
    invoked before acpi_ec_query_init(), which is too early. This causes
    the kernel to crash if an EC event occurs after boot, when ec_query_wq
    is not valid:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000102
    ...
    Workqueue: events acpi_ec_event_handler
    task: ffff9f539790dac0 task.stack: ffffb437c0e10000
    RIP: 0010:__queue_work+0x32/0x430

    Normally, the DSDT EC should always be valid, so acpi_ec_ecdt_start()
    is actually a no-op in the majority of cases. However, commit
    c712bb58d827 (ACPI / EC: Add support to skip boot stage DSDT probe)
    caused the probing of the DSDT EC as the "boot EC" to be skipped when
    the ECDT EC is valid and uncovered the bug.

    Fix this issue by invoking acpi_ec_ecdt_start() after acpi_ec_query_init()
    in acpi_ec_init().

    Link: https://jira01.devtools.intel.com/browse/LCK-4348
    Fixes: 2a5708409e4e (ACPI / EC: Fix a gap that ECDT EC cannot handle EC events)
    Fixes: c712bb58d827 (ACPI / EC: Add support to skip boot stage DSDT probe)
    Reported-by: Wang Wendy
    Tested-by: Feng Chenzhou
    Signed-off-by: Lv Zheng
    [ rjw: Changelog ]
    Signed-off-by: Rafael J. Wysocki

    Lv Zheng
     

04 Aug, 2017

1 commit

  • While the rest of the world has standardized on _DSD as the way to store
    device properties in AML (introduced with ACPI 5.1 in 2014), Apple has
    been using a custom _DSM to achieve the same for much longer (ever since
    they switched from DeviceTree-based PowerPC to Intel in 2005, verified
    with MacOS X 10.4.11).

    The theory of operation on macOS is as follows: AppleACPIPlatform.kext
    invokes mergeEFIproperties() and mergeDSMproperties() for each device to
    merge properties conveyed by EFI drivers as well as properties stored in
    AML into the I/O Kit registry from which they can be retrieved by
    drivers. We've been supporting EFI properties since commit 58c5475aba67
    ("x86/efi: Retrieve and assign Apple device properties"). The present
    commit adds support for _DSM properties, thereby completing our support
    for Apple device properties. The _DSM properties are made available
    under the primary fwnode, the EFI properties under the secondary fwnode.
    So for devices which possess both property types, they can all be
    elegantly accessed with the uniform API in .

    Until recently we had no need to support _DSM properties, they contained
    only uninteresting garbage. The situation has changed with MacBooks and
    MacBook Pros introduced since 2015: Their keyboard is attached with SPI
    instead of USB and the _CRS data which is necessary to initialize the
    spi driver only contains valid information if OSPM responds "false" to
    _OSI("Darwin"). If OSPM responds "true", _CRS is empty and the spi
    driver fails to initialize. The rationale is very simple, Apple only
    cares about macOS and Windows: On Windows, _CRS contains valid data,
    whereas on macOS it is empty. Instead, macOS gleans the necessary data
    from the _DSM properties.

    Since Linux deliberately defaults to responding "true" to _OSI("Darwin"),
    we need to emulate macOS' behaviour by initializing the spi driver with
    data returned by the _DSM.

    An out-of-tree driver for the SPI keyboard exists which currently binds
    to the ACPI device, invokes the _DSM, parses the returned package and
    instantiates an SPI device with the data gleaned from the _DSM:
    https://github.com/cb22/macbook12-spi-driver/commit/9a416d699ef4
    https://github.com/cb22/macbook12-spi-driver/commit/0c34936ed9a1

    By adding support for Apple's _DSM properties in generic ACPI code, the
    out-of-tree driver will be able to register as a regular SPI driver,
    significantly reducing its amount of code and improving its chances to
    be mainlined.

    The SPI keyboard will not be the only user of this commit: E.g. on the
    MacBook8,1, the UART-attached Bluetooth device likewise returns empty
    _CRS data if OSPM returns "true" to _OSI("Darwin").

    The _DSM returns a Package whose format unfortunately deviates slightly
    from the _DSD spec: The properties are marshalled up in a single Package
    as alternating key/value elements, unlike _DSD which stores them as a
    Package of 2-element Packages. The present commit therefore converts
    the Package to _DSD format and the ACPI core can then treat the data as
    if Apple would follow the standard.

    Well, except for one small annoyance: The properties returned by the
    _DSM only ever have one of two types, Integer or Buffer. The former is
    retrievable as usual with device_property_read_u64(), but the latter is
    not part of the _DSD spec and it is not possible to retrieve Buffer
    properties with the device_property_read_*() functions due to the type
    checking performed in drivers/acpi/property.c. It is however possible
    to retrieve them with acpi_dev_get_property(). Apple is using the
    Buffer type somewhat sloppily to store null-terminated strings but also
    integers. The real data type is not distinguishable by the ACPI core
    and the onus is on the caller to use the contents of the Buffer in an
    appropriate way.

    In case Apple moves to _DSD in the future, this commit first checks for
    _DSD and falls back to _DSM only if _DSD is not found.

    Tested-by: Ronald Tschalär
    Acked-by: Mika Westerberg
    Reviewed-by: Andy Shevchenko
    Signed-off-by: Lukas Wunner
    Signed-off-by: Rafael J. Wysocki

    Lukas Wunner
     

20 Jul, 2017

1 commit

  • Commit eed4d47efe95 (ACPI / sleep: Ignore spurious SCI wakeups from
    suspend-to-idle) introduced acpi_freeze_sync() whose purpose is to
    flush all of the processing of possible wakeup events signaled via
    the ACPI SCI. However, it doesn't flush the query workqueue used
    by the EC driver, so the events generated by the EC may not be
    processed timely which leads to issues (increased overhead at least,
    lost events possibly).

    To fix that introduce acpi_ec_flush_work() that will flush all of
    the outstanding EC work and call it from acpi_freeze_sync().

    Fixes: eed4d47efe95 (ACPI / sleep: Ignore spurious SCI wakeups from suspend-to-idle)
    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

11 Jul, 2017

1 commit

  • Pull device properties framework updates from Rafael Wysocki:
    "These mostly rearrange the device properties core code and add a few
    helper functions to it as a foundation for future work.

    Specifics:

    - Rearrange the core device properties code by moving the code
    specific to each supported platform configuration framework (ACPI,
    DT and build-in) into a separate file (Sakari Ailus).

    - Add helper functions for accessing device properties in a
    firmware-agnostic way (Sakari Ailus, Kieran Bingham)"

    * tag 'devprop-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
    device property: Add fwnode_graph_get_port_parent
    device property: Add FW type agnostic fwnode_graph_get_remote_node
    device property: Introduce fwnode_device_is_available()
    device property: Move fwnode graph ops to firmware specific locations
    device property: Move FW type specific functionality to FW specific files
    ACPI: Constify argument to acpi_device_is_present()

    Linus Torvalds
     

23 Jun, 2017

1 commit

  • Some recent Dell laptops, including the XPS13 model numbers 9360 and
    9365, cannot be woken up from suspend-to-idle by pressing the power
    button which is unexpected and makes that feature less usable on
    those systems. Moreover, on the 9365 ACPI S3 (suspend-to-RAM) is
    not expected to be used at all (the OS these systems ship with never
    exercises the ACPI S3 path in the firmware) and suspend-to-idle is
    the only viable system suspend mechanism there.

    The reason why the power button wakeup from suspend-to-idle doesn't
    work on those systems is because their power button events are
    signaled by the EC (Embedded Controller), whose GPE (General Purpose
    Event) line is disabled during suspend-to-idle transitions in Linux.
    That is done on purpose, because in general the EC tends to be noisy
    for various reasons (battery and thermal updates and similar, for
    example) and all events signaled by it would kick the CPUs out of
    deep idle states while in suspend-to-idle, which effectively might
    defeat its purpose.

    Of course, on the Dell systems in question the EC GPE must be enabled
    during suspend-to-idle transitions for the button press events to
    be signaled while suspended at all, but fortunately there is a way
    out of this puzzle.

    First of all, those systems have the ACPI_FADT_LOW_POWER_S0 flag set
    in their ACPI tables, which means that the OS is expected to prefer
    the "low power S0 idle" system state over ACPI S3 on them. That
    causes the most recent versions of other OSes to simply ignore ACPI
    S3 on those systems, so it is reasonable to expect that it should not
    be necessary to block GPEs during suspend-to-idle on them.

    Second, in addition to that, the systems in question provide a special
    firmware interface that can be used to indicate to the platform that
    the OS is transitioning into a system-wide low-power state in which
    certain types of activity are not desirable or that it is leaving
    such a state and that (in principle) should allow the platform to
    adjust its operation mode accordingly.

    That interface is a special _DSM object under a System Power
    Management Controller device (PNP0D80). The expected way to use it
    is to invoke function 0 from it on system initialization, functions
    3 and 5 during suspend transitions and functions 4 and 6 during
    resume transitions (to reverse the actions carried out by the
    former). In particular, function 5 from the "Low-Power S0" device
    _DSM is expected to cause the platform to put itself into a low-power
    operation mode which should include making the EC less verbose (so to
    speak). Next, on resume, function 6 switches the platform back to
    the "working-state" operation mode.

    In accordance with the above, modify the ACPI suspend-to-idle code
    to look for the "Low-Power S0" _DSM interface on platforms with the
    ACPI_FADT_LOW_POWER_S0 flag set in the ACPI tables. If it's there,
    use it during suspend-to-idle transitions as prescribed and avoid
    changing the GPE configuration in that case. [That should reflect
    what the most recent versions of other OSes do.]

    Also modify the ACPI EC driver to make it handle events during
    suspend-to-idle in the usual way if the "Low-Power S0" _DSM interface
    is going to be used to make the power button events work while
    suspended on the Dell machines mentioned above

    Link: http://www.uefi.org/sites/default/files/resources/Intel_ACPI_Low_Power_S0_Idle.pdf
    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

22 Jun, 2017

1 commit


15 Jun, 2017

1 commit

  • The ACPI SCI (System Control Interrupt) is set up as a wakeup IRQ
    during suspend-to-idle transitions and, consequently, any events
    signaled through it wake up the system from that state. However,
    on some systems some of the events signaled via the ACPI SCI while
    suspended to idle should not cause the system to wake up. In fact,
    quite often they should just be discarded.

    Arguably, systems should not resume entirely on such events, but in
    order to decide which events really should cause the system to resume
    and which are spurious, it is necessary to resume up to the point
    when ACPI SCIs are actually handled and processed, which is after
    executing dpm_resume_noirq() in the system resume path.

    For this reasons, add a loop around freeze_enter() in which the
    platforms can process events signaled via multiplexed IRQ lines
    like the ACPI SCI and add suspend-to-idle hooks that can be
    used for this purpose to struct platform_freeze_ops.

    In the ACPI case, the ->wake hook is used for checking if the SCI
    has triggered while suspended and deferring the interrupt-induced
    system wakeup until the events signaled through it are actually
    processed sufficiently to decide whether or not the system should
    resume. In turn, the ->sync hook allows all of the relevant event
    queues to be flushed so as to prevent events from being missed due
    to race conditions.

    In addition to that, some ACPI code processing wakeup events needs
    to be modified to use the "hard" version of wakeup triggers, so that
    it will cause a system resume to happen on device-induced wakeup
    events even if the "soft" mechanism to prevent the system from
    suspending is not enabled. However, to preserve the existing
    behavior with respect to suspend-to-RAM, this only is done in
    the suspend-to-idle case and only if an SCI has occurred while
    suspended.

    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

13 Apr, 2017

1 commit

  • /sys/firmware/acpi/hotplug/force_remove was presumably added to support
    auto offlining in the past. This is, however, inherently dangerous for
    some hotplugable resources like memory. The memory offlining fails when
    the memory is still in use and cannot be dropped or migrated. If we
    ignore the failure we are basically allowing for subtle memory
    corruption or a crash.

    We have actually noticed the later while hitting BUG() during the memory
    hotremove (remove_memory):
    ret = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), NULL,
    check_memblock_offlined_cb);
    if (ret)
    BUG();

    it took us quite non-trivial time realize that the customer had
    force_remove enabled. Even if the BUG was removed here and we could
    propagate the error up the call chain it wouldn't help at all because
    then we would hit a crash or a memory corruption later and harder to
    debug. So force_remove is unfixable for the memory hotremove. We haven't
    checked other hotplugable resources to be prone to a similar problems.

    Remove the force_remove functionality because it is not fixable currently.
    Keep the sysfs file and report an error if somebody tries to enable it.
    Encourage users to report about the missing functionality and work with
    them with an alternative solution.

    Reviewed-by: Lee, Chun-Yi
    Signed-off-by: Michal Hocko
    Signed-off-by: Rafael J. Wysocki

    Michal Hocko
     

01 Mar, 2017

1 commit

  • The hot removal of IOAPIC is handling PCI and ACPI removal in one go. That
    only works when the PCI drivers released the interrupt resources, but
    breaks when a IOAPIC interrupt is still associated to a PCI device.

    The new pcibios_release_device() callback allows to solve that problem by
    splitting the removal into two steps:

    1) PCI removal:

    Release all PCI resources including eventually not yet released IOAPIC
    interrupts via the new pcibios_release_device() callback.

    2) ACPI removal:

    After release of all PCI resources the ACPI resources can be released
    without issue.

    [ tglx: Rewrote changelog ]

    Signed-off-by: Rui Wang
    Cc: tony.luck@intel.com
    Cc: linux-pci@vger.kernel.org
    Cc: rjw@rjwysocki.net
    Cc: linux-acpi@vger.kernel.org
    Cc: fengguang.wu@intel.com
    Cc: helgaas@kernel.org
    Cc: kbuild-all@01.org
    Cc: bhelgaas@google.com
    Link: http://lkml.kernel.org/r/1488288869-31290-3-git-send-email-rui.y.wang@intel.com
    Signed-off-by: Thomas Gleixner

    Rui Wang
     

30 Jan, 2017

1 commit

  • When GPE is not enabled, it is not efficient to use the wait polling mode
    as it introduces an unexpected scheduler delay.
    So before the GPE handler is installed, this patch uses busy polling mode
    for all EC(s) and the logic can be applied to non boot EC(s) during the
    suspend/resume process.

    Link: https://bugzilla.kernel.org/show_bug.cgi?id=191561
    Tested-by: Jakobus Schurz
    Tested-by: Chen Yu
    Signed-off-by: Lv Zheng
    Signed-off-by: Rafael J. Wysocki

    Lv Zheng
     

27 Dec, 2016

1 commit

  • Sometimes, the users may require a quirk to be provided from ACPI subsystem
    core to prevent a GPE from flooding.
    Normally, if a GPE cannot be dispatched, ACPICA core automatically prevents
    the GPE from firing. But there are cases the GPE is dispatched by _Lxx/_Exx
    provided via AML table, and OSPM is lacking of the knowledge to get
    _Lxx/_Exx correctly executed to handle the GPE, thus the GPE flooding may
    still occur.

    The existing quirk mechanism can be enabled/disabled using the following
    commands to prevent such kind of GPE flooding during runtime:
    # echo mask > /sys/firmware/acpi/interrupts/gpe00
    # echo unmask > /sys/firmware/acpi/interrupts/gpe00
    To avoid GPE flooding during boot, we need a boot stage mechanism.

    This patch provides such a boot stage quirk mechanism to stop this kind of
    GPE flooding. This patch doesn't fix any feature gap but since the new
    feature gaps could be found in the future endlessly, and can disappear if
    the feature gaps are filled, providing a boot parameter rather than a DMI
    table should suffice.

    Link: https://bugzilla.kernel.org/show_bug.cgi?id=53071
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=117481
    Link: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/887793
    Signed-off-by: Lv Zheng
    Signed-off-by: Rafael J. Wysocki

    Lv Zheng
     

04 Oct, 2016

1 commit

  • Pull x86 apic updates from Ingo Molnar:
    "The main changes are:

    - Persistent CPU/node numbering across CPU hotplug/unplug events.
    This is a pretty involved series of changes that first fetches all
    the information during bootup and then uses it for the various
    hotplug/unplug methods. (Gu Zheng, Dou Liyang)

    - IO-APIC hot-add/remove fixes and enhancements. (Rui Wang)

    - ... various fixes, cleanups and enhancements"

    * 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (22 commits)
    x86/apic: Fix silent & fatal merge conflict in __generic_processor_info()
    acpi: Fix broken error check in map_processor()
    acpi: Validate processor id when mapping the processor
    acpi: Provide mechanism to validate processors in the ACPI tables
    x86/acpi: Set persistent cpuid nodeid mapping when booting
    x86/acpi: Enable MADT APIs to return disabled apicids
    x86/acpi: Introduce persistent storage for cpuid apicid mapping
    x86/acpi: Enable acpi to register all possible cpus at boot time
    x86/numa: Online memory-less nodes at boot time
    x86/apic: Get rid of apic_version[] array
    x86/apic: Order irq_enter/exit() calls correctly vs. ack_APIC_irq()
    x86/ioapic: Ignore root bridges without a companion ACPI device
    x86/apic: Update comment about disabling processor focus
    x86/smpboot: Check APIC ID before setting up default routing
    x86/ioapic: Fix IOAPIC failing to request resource
    x86/ioapic: Fix lost IOAPIC resource after hot-removal and hotadd
    x86/ioapic: Fix setup_res() failing to get resource
    x86/ioapic: Support hot-removal of IOAPICs present during boot
    x86/ioapic: Change prototype of acpi_ioapic_add()
    x86/apic, ACPI: Fix incorrect assignment when handling apic/x2apic entries
    ...

    Linus Torvalds
     

02 Oct, 2016

1 commit

  • * acpi-wdat:
    watchdog: wdat_wdt: Fix warning for using 0 as NULL
    watchdog: wdat_wdt: fix return value check in wdat_wdt_probe()
    platform/x86: intel_pmc_ipc: Do not create iTCO watchdog when WDAT table exists
    i2c: i801: Do not create iTCO watchdog when WDAT table exists
    mfd: lpc_ich: Do not create iTCO watchdog when WDAT table exists
    ACPI / watchdog: Add support for WDAT hardware watchdog

    * acpi-ec:
    ACPI / EC: Fix issues related to boot_ec
    ACPI / EC: Fix a gap that ECDT EC cannot handle EC events
    ACPI / EC: Fix a memory leakage issue in acpi_ec_add()
    ACPI / EC: Cleanup first_ec/boot_ec code
    ACPI / EC: Enable event freeze mode to improve event handling for suspend process
    ACPI / EC: Add PM operations to improve event handling for suspend process
    ACPI / EC: Add PM operations to improve event handling for resume process
    ACPI / EC: Fix an issue that SCI_EVT cannot be detected after event is enabled
    ACPI / EC: Add EC_FLAGS_QUERY_ENABLED to reveal a hidden logic
    ACPI / EC: Add PM operations for suspend/resume noirq stage

    Rafael J. Wysocki
     

24 Sep, 2016

1 commit

  • Starting from Intel Skylake the iTCO watchdog timer registers were moved to
    reside in the same register space with SMBus host controller. Not all
    needed registers are available though and we need to unhide P2SB (Primary
    to Sideband) device briefly to be able to read status of required NO_REBOOT
    bit. The i2c-i801.c SMBus driver used to handle this and creation of the
    iTCO watchdog platform device.

    Windows, on the other hand, does not use the iTCO watchdog hardware
    directly even if it is available. Instead it relies on ACPI Watchdog Action
    Table (WDAT) table to describe the watchdog hardware to the OS. This table
    contains necessary information about the the hardware and also set of
    actions which are executed by a driver as needed.

    This patch implements a new watchdog driver that takes advantage of the
    ACPI WDAT table. We split the functionality into two parts: first part
    enumerates the WDAT table and if found, populates resources and creates
    platform device for the actual driver. The second part is the driver
    itself.

    The reason for the split is that this way we can make the driver itself to
    be a module and loaded automatically if the WDAT table is found. Otherwise
    the module is not loaded.

    Signed-off-by: Mika Westerberg
    Reviewed-by: Guenter Roeck
    Signed-off-by: Rafael J. Wysocki

    Mika Westerberg