From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Lv Zheng <lv.zheng@intel.com>
Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
Len Brown <len.brown@intel.com>, Lv Zheng <zetalog@gmail.com>,
linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org,
Bob Moore <robert.moore@intel.com>
Subject: Re: [PATCH v2 05/28] ACPICA: Hardware: Enable firmware waking vector for both 32-bit and 64-bit FACS.
Date: Thu, 25 Jun 2015 01:57:03 +0200 [thread overview]
Message-ID: <24343352.3W7mrSPtdt@vostro.rjw.lan> (raw)
In-Reply-To: <a618fa9001af107d725f2ce97a88bae99fbdcc2b.1435114811.git.lv.zheng@intel.com>
On Wednesday, June 24, 2015 11:02:54 AM Lv Zheng wrote:
> ACPICA commit 368eb60778b27b6ae94d3658ddc902ca1342a963
> ACPICA commit 70f62a80d65515e1285fdeeb50d94ee6f07df4bd
>
> The following commit is reported to have broken s2ram on some platforms:
> Commit: 0249ed2444d65d65fc3f3f64f398f1ad0b7e54cd
> 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 2.
>
> There is no handshaking mechanism can be used by OSPM to tell BIOS which
> FACS is currently used. Thus the FACS reported by "FIRMWARE_CTRL" may still
> be used by BIOS and the 0 value of the 32-bit firmware waking vector might
> trigger such failure.
>
> This patch enables the firmware waking vectors for both 32bit/64bit FACS
> tables in order to ensure we can exclude the cases that trigger the bugs
> caused by the root cause 2. The exclusion is split into 2 commits so that
> if it turns out not to be necessary, this single commit can be reverted
> without affecting the useful one. Lv Zheng, Bob Moore.
>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=74021
> Link: https://github.com/acpica/acpica/commit/368eb607
> Link: https://github.com/acpica/acpica/commit/70f62a80
> Reported-and-tested-by: Oswald Buddenhagen <ossi@kde.org>
> Signed-off-by: Lv Zheng <lv.zheng@intel.com>
> Signed-off-by: Bob Moore <robert.moore@intel.com>
> ---
> drivers/acpi/acpica/acglobal.h | 2 ++
> drivers/acpi/acpica/hwxfsleep.c | 74 ++++++++++++++++++++++++++++++++-------
> drivers/acpi/acpica/tbutils.c | 14 ++++----
> 3 files changed, 71 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h
> index a0c4787..53f96a3 100644
> --- a/drivers/acpi/acpica/acglobal.h
> +++ b/drivers/acpi/acpica/acglobal.h
> @@ -61,6 +61,8 @@ ACPI_GLOBAL(struct acpi_table_header, acpi_gbl_original_dsdt_header);
>
> #if (!ACPI_REDUCED_HARDWARE)
> ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_FACS);
> +ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_facs32);
> +ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_facs64);
>
> #endif /* !ACPI_REDUCED_HARDWARE */
>
> diff --git a/drivers/acpi/acpica/hwxfsleep.c b/drivers/acpi/acpica/hwxfsleep.c
> index c67cd32..e273b2e 100644
> --- a/drivers/acpi/acpica/hwxfsleep.c
> +++ b/drivers/acpi/acpica/hwxfsleep.c
> @@ -50,6 +50,13 @@
> ACPI_MODULE_NAME("hwxfsleep")
>
> /* Local prototypes */
> +#if (!ACPI_REDUCED_HARDWARE)
> +static acpi_status
> +acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
> + acpi_physical_address physical_address,
> + acpi_physical_address physical_address64);
> +#endif
> +
> static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id);
>
> /*
> @@ -79,9 +86,10 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
> #if (!ACPI_REDUCED_HARDWARE)
> /*******************************************************************************
> *
> - * FUNCTION: acpi_set_firmware_waking_vector
> + * FUNCTION: acpi_hw_set_firmware_waking_vector
> *
> - * PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
> + * PARAMETERS: facs - Pointer to FACS table
> + * physical_address - 32-bit physical address of ACPI real mode
> * entry point
> * physical_address64 - 64-bit physical address of ACPI protected
> * entry point
> @@ -92,11 +100,12 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
> *
> ******************************************************************************/
>
> -acpi_status
> -acpi_set_firmware_waking_vector(acpi_physical_address physical_address,
> - acpi_physical_address physical_address64)
> +static acpi_status
> +acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
> + acpi_physical_address physical_address,
> + acpi_physical_address physical_address64)
> {
> - ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
> + ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vector);
>
>
> /*
> @@ -109,25 +118,66 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address,
>
> /* Set the 32-bit vector */
>
> - acpi_gbl_FACS->firmware_waking_vector = (u32)physical_address;
> + facs->firmware_waking_vector = (u32)physical_address;
>
> - if (acpi_gbl_FACS->length > 32) {
> - if (acpi_gbl_FACS->version >= 1) {
> + if (facs->length > 32) {
> + if (facs->version >= 1) {
>
> /* Set the 64-bit vector */
>
> - acpi_gbl_FACS->xfirmware_waking_vector =
> - physical_address64;
> + facs->xfirmware_waking_vector = physical_address64;
> } else {
> /* Clear the 64-bit vector if it exists */
>
> - acpi_gbl_FACS->xfirmware_waking_vector = 0;
> + facs->xfirmware_waking_vector = 0;
> }
> }
>
> return_ACPI_STATUS(AE_OK);
> }
>
> +/*******************************************************************************
> + *
> + * FUNCTION: acpi_set_firmware_waking_vector
> + *
> + * PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
> + * entry point
> + * physical_address64 - 64-bit physical address of ACPI protected
> + * entry point
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
> + *
> + ******************************************************************************/
> +
> +acpi_status
> +acpi_set_firmware_waking_vector(acpi_physical_address physical_address,
> + acpi_physical_address physical_address64)
The question here is: Why does the host OS need to care about the second
argument of this function that will always be 0? Why didn't you keep the
old header of acpi_set_firmware_waking_vector() as a one-argument function
taking a u32 and why didn't you add something like
acpi_status acpi_set_firmware_waking_vector_full(u32 real_mode_address,
acpi_physical_address high_address)
and why didn't you redefine acpi_set_firmware_waking_vector() as
acpi_status acpi_set_firmware_waking_vector(u32 real_mode_address)
{
return acpi_set_firmware_waking_vector_full(real_mode_address, 0);
}
?
If you did that, there wouldn't be any need to touch the code in
drivers/acpi/sleep.c and the arch headers, so can you please explain to me
why *exactly* you didn't do that?
Rafael
next prev parent reply other threads:[~2015-06-24 23:31 UTC|newest]
Thread overview: 118+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-19 3:38 [PATCH 00/32] ACPICA: 20150619 Release Lv Zheng
2015-06-19 3:38 ` [PATCH 01/32] ACPICA: Linuxize: Reduce divergences for 20150616 release Lv Zheng
2015-06-19 3:38 ` [PATCH 02/32] ACPICA: Linuxize: Replace __FUNCTION__ with __func__ Lv Zheng
2015-06-19 3:38 ` [PATCH 03/32] ACPICA: Hardware: Enable 64-bit firmware waking vector for selected FACS Lv Zheng
2015-06-19 23:40 ` Rafael J. Wysocki
2015-06-19 23:46 ` Rafael J. Wysocki
2015-06-23 15:20 ` Rafael J. Wysocki
2015-06-24 0:13 ` Zheng, Lv
2015-06-24 0:30 ` Rafael J. Wysocki
2015-06-24 0:15 ` Zheng, Lv
2015-06-19 3:38 ` [PATCH 04/32] ACPI: sleep: Update acpi_set_firmware_waking_vector() invocations to favor 32-bit firmware waking vector Lv Zheng
2015-06-19 6:26 ` Ingo Molnar
2015-06-19 23:42 ` Rafael J. Wysocki
2015-06-19 3:38 ` [PATCH 06/32] ACPICA: Hardware: Enable firmware waking vector for both 32-bit and 64-bit FACS Lv Zheng
2015-06-19 3:38 ` [PATCH 07/32] ACPICA: Hardware: Cleanup the return values in acpi_set_waking_vector() Lv Zheng
2015-06-19 3:39 ` [PATCH 08/32] ACPICA: Tables: Fix an issue that FACS initialization is performed twice Lv Zheng
2015-06-19 3:39 ` [PATCH 09/32] ACPICA: Tables: Fix an issue that ACPI initialization is blocked due to no FACS Lv Zheng
2015-06-19 3:39 ` [PATCH 10/32] ACPICA: Remove a prototype for the reduced hardware case Lv Zheng
2015-06-19 3:39 ` [PATCH 11/32] ACPICA: Tables: Enable default 64-bit FADT addresses favor Lv Zheng
2015-06-19 3:39 ` [PATCH 12/32] ACPICA: MSVC6: Fix build issue for variable argument macros Lv Zheng
2015-06-19 3:39 ` [PATCH 13/32] ACPICA: EFI: Add EFI interface definitions to eliminate dependency of GNU EFI Lv Zheng
2015-06-19 3:39 ` [PATCH 14/32] ACPICA: Add dragon_fly support to unix file mapping file Lv Zheng
2015-06-19 3:39 ` [PATCH 15/32] ACPICA: Utilities: Add _CLS processing Lv Zheng
2015-06-19 3:40 ` [PATCH 16/32] ACPICA: ACPI 6.0: Add values for MADT GIC version field Lv Zheng
2015-06-19 3:40 ` [PATCH 17/32] ACPICA: Namespace: Add support to allow overriding objects Lv Zheng
2015-06-19 3:40 ` [PATCH 18/32] ACPICA: Namespace: Add support of OSDT table Lv Zheng
2015-06-19 3:40 ` [PATCH 19/32] ACPICA: Namespace: Change namespace override to avoid node deletion Lv Zheng
2015-06-19 3:40 ` [PATCH 20/32] ACPICA: Update for acpi_install_table memory types Lv Zheng
2015-06-19 3:40 ` [PATCH 21/32] ACPICA: Cleanup output for the ASL Debug object Lv Zheng
2015-06-19 3:40 ` [PATCH 22/32] ACPICA: acpidump: Allow customized tables to be dumped without accessing /dev/mem Lv Zheng
2015-06-19 3:40 ` [PATCH 23/32] ACPICA: acpidump: Convert the default behavior to dump from /sys/firmware/acpi/tables Lv Zheng
2015-06-19 3:40 ` [PATCH 24/32] ACPI / acpidump: Update acpidump manual Lv Zheng
2015-06-19 3:41 ` [PATCH 25/32] ACPICA: De-macroize calls to standard C library functions Lv Zheng
2015-06-19 3:41 ` [PATCH 26/32] ACPICA: Clib: Correct memset() declarations Lv Zheng
2015-06-19 3:41 ` [PATCH 27/32] ACPICA: Finish C library name transition Lv Zheng
2015-06-19 3:41 ` [PATCH 28/32] ACPICA: Split C library prototypes to new header Lv Zheng
2015-06-19 3:41 ` [PATCH 29/32] ACPICA: Update definitions for the TCPA and TPM2 ACPI tables Lv Zheng
2015-06-19 3:41 ` [PATCH 30/32] ACPICA: Update TPM2 ACPI table Lv Zheng
2015-06-19 3:41 ` [PATCH 31/32] ACPICA: Comment update, no functional change Lv Zheng
2015-06-19 3:41 ` [PATCH 32/32] ACPICA: Update version to 20150619 Lv Zheng
2015-06-19 3:43 ` [PATCH 05/32] ACPICA: Tables: Enable both 32-bit and 64-bit FACS Lv Zheng
2015-06-24 0:31 ` Rafael J. Wysocki
2015-06-24 0:17 ` Zheng, Lv
2015-06-24 3:01 ` [PATCH v2 00/28] ACPICA: 20150619 Release Lv Zheng
2015-06-24 3:01 ` [PATCH v2 01/28] ACPICA: Linuxize: Reduce divergences for 20150619 release Lv Zheng
2015-06-24 3:02 ` [PATCH v2 02/28] ACPICA: Linuxize: Replace __FUNCTION__ with __func__ Lv Zheng
2015-06-24 12:55 ` Christoph Hellwig
2015-06-25 0:24 ` Zheng, Lv
2015-06-24 3:02 ` [PATCH v2 03/28] ACPICA: Hardware: Enable 64-bit firmware waking vector for selected FACS Lv Zheng
2015-06-24 14:05 ` Rafael J. Wysocki
2015-06-24 23:24 ` Rafael J. Wysocki
2015-06-25 0:29 ` Zheng, Lv
2015-06-26 1:20 ` Rafael J. Wysocki
2015-06-26 1:39 ` Zheng, Lv
2015-06-25 1:09 ` Zheng, Lv
2015-06-24 3:02 ` [PATCH v2 04/28] ACPICA: Tables: Enable both 32-bit and 64-bit FACS Lv Zheng
2015-06-24 3:02 ` [PATCH v2 05/28] ACPICA: Hardware: Enable firmware waking vector for " Lv Zheng
2015-06-24 23:57 ` Rafael J. Wysocki [this message]
2015-06-25 0:43 ` Zheng, Lv
2015-06-26 0:44 ` Rafael J. Wysocki
2015-06-26 0:51 ` Zheng, Lv
2015-06-26 1:41 ` Rafael J. Wysocki
2015-06-26 1:41 ` Zheng, Lv
2015-06-24 3:03 ` [PATCH v2 06/28] ACPICA: Hardware: Cleanup the return values in acpi_set_waking_vector() Lv Zheng
2015-06-24 3:03 ` [PATCH v2 07/28] ACPICA: Tables: Fix an issue that FACS initialization is performed twice Lv Zheng
2015-06-24 3:03 ` [PATCH v2 08/28] ACPICA: Tables: Fix an issue that ACPI initialization is blocked due to no FACS Lv Zheng
2015-06-24 3:03 ` [PATCH v2 09/28] ACPICA: Tables: Enable default 64-bit FADT addresses favor Lv Zheng
2015-06-24 3:03 ` [PATCH v2 10/28] ACPICA: MSVC6: Fix build issue for variable argument macros Lv Zheng
2015-06-24 3:03 ` [PATCH v2 11/28] ACPICA: EFI: Add EFI interface definitions to eliminate dependency of GNU EFI Lv Zheng
2015-06-24 3:04 ` [PATCH v2 12/28] ACPICA: Add dragon_fly support to unix file mapping file Lv Zheng
2015-06-24 3:04 ` [PATCH v2 13/28] ACPICA: Utilities: Add _CLS processing Lv Zheng
2015-06-24 3:04 ` [PATCH v2 14/28] ACPICA: ACPI 6.0: Add values for MADT GIC version field Lv Zheng
2015-06-24 3:04 ` [PATCH v2 15/28] ACPICA: Namespace: Add support to allow overriding objects Lv Zheng
2015-06-24 3:04 ` [PATCH v2 16/28] ACPICA: Namespace: Add support of OSDT table Lv Zheng
2015-06-24 19:08 ` Al Stone
2015-06-24 20:02 ` Moore, Robert
2015-06-24 3:04 ` [PATCH v2 17/28] ACPICA: Namespace: Change namespace override to avoid node deletion Lv Zheng
2015-06-24 3:04 ` [PATCH v2 18/28] ACPICA: Update for acpi_install_table memory types Lv Zheng
2015-06-24 3:04 ` [PATCH v2 19/28] ACPICA: Cleanup output for the ASL Debug object Lv Zheng
2015-06-24 3:05 ` [PATCH v2 20/28] ACPICA: acpidump: Allow customized tables to be dumped without accessing /dev/mem Lv Zheng
2015-06-24 3:05 ` [PATCH v2 21/28] ACPICA: acpidump: Convert the default behavior to dump from /sys/firmware/acpi/tables Lv Zheng
2015-06-24 3:05 ` [PATCH v2 22/28] ACPI / acpidump: Update acpidump manual Lv Zheng
2015-06-24 3:05 ` [PATCH v2 23/28] ACPICA: De-macroize calls to standard C library functions Lv Zheng
2015-06-24 3:05 ` [PATCH v2 24/28] ACPICA: Split C library prototypes to new header Lv Zheng
2015-06-24 3:05 ` [PATCH v2 25/28] ACPICA: Update definitions for the TCPA and TPM2 ACPI tables Lv Zheng
2015-06-24 3:05 ` [PATCH v2 26/28] ACPICA: Update TPM2 ACPI table Lv Zheng
2015-06-24 3:05 ` [PATCH v2 27/28] ACPICA: Comment update, no functional change Lv Zheng
2015-06-24 3:05 ` [PATCH v2 28/28] ACPICA: Update version to 20150619 Lv Zheng
2015-07-01 6:42 ` [PATCH v3 00/26] ACPICA: 20150619 Release Lv Zheng
2015-07-01 6:42 ` [PATCH v3 01/26] ACPICA: Linuxize: Reduce divergences for 20150619 release Lv Zheng
2015-07-01 6:42 ` [PATCH v3 02/26] ACPICA: Linuxize: Replace __FUNCTION__ with __func__ Lv Zheng
2015-07-01 6:43 ` [PATCH v3 03/26] ACPICA: Hardware: Enable 64-bit firmware waking vector for selected FACS Lv Zheng
2015-07-01 6:43 ` [PATCH v3 04/26] ACPICA: Tables: Enable both 32-bit and 64-bit FACS Lv Zheng
2015-07-01 6:43 ` [PATCH v3 05/26] ACPICA: Hardware: Enable firmware waking vector for " Lv Zheng
2015-07-01 6:43 ` [PATCH v3 06/26] ACPICA: Tables: Fix an issue that FACS initialization is performed twice Lv Zheng
2015-07-01 6:43 ` [PATCH v3 07/26] ACPICA: Tables: Enable default 64-bit FADT addresses favor Lv Zheng
2015-07-01 6:43 ` [PATCH v3 08/26] ACPICA: MSVC6: Fix build issue for variable argument macros Lv Zheng
2015-07-01 6:43 ` [PATCH v3 09/26] ACPICA: EFI: Add EFI interface definitions to eliminate dependency of GNU EFI Lv Zheng
2015-07-01 6:43 ` [PATCH v3 10/26] ACPICA: Add dragon_fly support to unix file mapping file Lv Zheng
2015-07-01 6:44 ` [PATCH v3 11/26] ACPICA: Utilities: Add _CLS processing Lv Zheng
2015-07-01 6:44 ` [PATCH v3 12/26] ACPICA: ACPI 6.0: Add values for MADT GIC version field Lv Zheng
2015-07-01 6:44 ` [PATCH v3 13/26] ACPICA: Namespace: Add support to allow overriding objects Lv Zheng
2015-07-01 6:44 ` [PATCH v3 14/26] ACPICA: Namespace: Add support of OSDT table Lv Zheng
2015-07-01 6:44 ` [PATCH v3 15/26] ACPICA: Namespace: Change namespace override to avoid node deletion Lv Zheng
2015-07-01 6:44 ` [PATCH v3 16/26] ACPICA: Update for acpi_install_table memory types Lv Zheng
2015-07-01 6:44 ` [PATCH v3 17/26] ACPICA: Cleanup output for the ASL Debug object Lv Zheng
2015-07-01 6:44 ` [PATCH v3 18/26] ACPICA: acpidump: Allow customized tables to be dumped without accessing /dev/mem Lv Zheng
2015-07-01 6:44 ` [PATCH v3 19/26] ACPICA: acpidump: Convert the default behavior to dump from /sys/firmware/acpi/tables Lv Zheng
2015-07-01 6:45 ` [PATCH v3 20/26] ACPI / acpidump: Update acpidump manual Lv Zheng
2015-07-01 6:45 ` [PATCH v3 21/26] ACPICA: De-macroize calls to standard C library functions Lv Zheng
2015-07-01 6:45 ` [PATCH v3 22/26] ACPICA: Split C library prototypes to new header Lv Zheng
2015-07-01 6:45 ` [PATCH v3 23/26] ACPICA: Update definitions for the TCPA and TPM2 ACPI tables Lv Zheng
2015-07-01 6:45 ` [PATCH v3 24/26] ACPICA: Update TPM2 ACPI table Lv Zheng
2015-07-01 6:45 ` [PATCH v3 25/26] ACPICA: Comment update, no functional change Lv Zheng
2015-07-01 6:45 ` [PATCH v3 26/26] ACPICA: Update version to 20150619 Lv Zheng
2015-07-01 23:14 ` [PATCH v3 00/26] ACPICA: 20150619 Release Rafael J. Wysocki
2015-07-02 6:10 ` Zheng, Lv
2015-07-02 20:00 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=24343352.3W7mrSPtdt@vostro.rjw.lan \
--to=rjw@rjwysocki.net \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lv.zheng@intel.com \
--cc=rafael.j.wysocki@intel.com \
--cc=robert.moore@intel.com \
--cc=zetalog@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®