• Lv Zheng's avatar
    ACPICA: Hardware: Enable 64-bit firmware waking vector for selected FACS · aca2a5d3
    Lv Zheng authored
    ACPICA commit 7aa598d711644ab0de5f70ad88f1e2de253115e4
    
    The following commit is reported to have broken s2ram on some platforms:
     Commit: 0249ed24
     ACPICA: Add option to favor 32-bit FADT addresses.
    The platform reports 2 FACS tables (which is not allowed by ACPI
    specification) and the new 32-bit address favor rule forces OSPMs to use
    the FACS table reported via FADT's X_FIRMWARE_CTRL field.
    
    The root cause of the reported bug might be one of the followings:
    1. BIOS may favor the 64-bit firmware waking vector address when the
       version of the FACS is greater than 0 and Linux currently only supports
       resuming from the real mode, so the 64-bit firmware waking vector has
       never been set and might be invalid to BIOS while the commit enables
       higher version FACS.
    2. BIOS may favor the FACS reported via the "FIRMWARE_CTRL" field in the
       FADT while the commit doesn't set the firmware waking vector address of
       the FACS reported by "FIRMWARE_CTRL", it only sets the firware waking
       vector address of the FACS reported by "X_FIRMWARE_CTRL".
    
    This patch excludes the cases that can trigger the bugs caused by the root
    cause 1.
    
    ACPI specification says:
    A. 32-bit FACS address (FIRMWARE_CTRL field in FADT):
       Physical memory address of the FACS, where OSPM and firmware exchange
       control information.
       If the X_FIRMWARE_CTRL field contains a non zero value then this field
       must be zero.
       A zero value indicates that no FACS is specified by this field.
    B. 64-bit FACS address (X_FIRMWARE_CTRL field in FADT):
       64bit physical memory address of the FACS.
       This field is used when the physical address of the FACS is above 4GB.
       If the FIRMWARE_CTRL field contains a non zero value then this field
       must be zero.
       A zero value indicates that no FACS is specified by this field.
    Thus the 32bit and 64bit firmware waking vector should indicate completely
    different resuming environment - real mode (1MB addressable) and non real
    mode (4GB+ addressable) and currently Linux only supports resuming from
    real mode.
    
    This patch enables 64-bit firmware waking vector for selected FACS via new
    acpi_set_firmware_waking_vectors() API so that it's up to OSPMs to
    determine which resuming mode should be used by BIOS and ACPICA changes
    won't trigger the bugs caused by the root cause 1. Lv Zheng.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=74021
    Link: https://github.com/acpica/acpica/commit/7aa598d7Reported-and-tested-by: default avatarOswald Buddenhagen <ossi@kde.org>
    Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
    Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    aca2a5d3
hwxfsleep.c 13.9 KB