Commit 4e0b26d3 authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki

ACPICA: Tables: Override all 64-bit GAS fields when acpi_gbl_use32_bit_fadt_addresses is TRUE

ACPICA commit aaace77db4c3b267a65b75c33f84ace6f65bbcf7

Originally, when acpi_gbl_use32_bit_fadt_addresses is TRUE, GAS override can
only happen when the Address field mismatches.

According to the investigation result, Windows may favor 32-bit FADT
addresses in some cases. So we need this quirk working after enabling full
GAS support. This requires us to override GAS access_size/bit_width/bit_offset
fields as long as acpi_gbl_use32_bit_fadt_addresses is TRUE.
This patch enhances this quirk mechanism to make it working with full GAS
support. Lv Zheng.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=151501
Link: https://github.com/acpica/acpica/commit/aaace77dReported-and-tested-by: default avatarAndrey Skvortsov <andrej.skvortzov@gmail.com>
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>
parent bdbe5df0
...@@ -558,30 +558,21 @@ static void acpi_tb_convert_fadt(void) ...@@ -558,30 +558,21 @@ static void acpi_tb_convert_fadt(void)
* *
* Address32 zero, Address64 [don't care] - Use Address64 * Address32 zero, Address64 [don't care] - Use Address64
* *
* No override: if acpi_gbl_use32_bit_fadt_addresses is FALSE, and:
* Address32 non-zero, Address64 zero - Copy/use Address32 * Address32 non-zero, Address64 zero - Copy/use Address32
* Address32 non-zero == Address64 non-zero - Use Address64 * Address32 non-zero == Address64 non-zero - Use Address64
* Address32 non-zero != Address64 non-zero - Warning, use Address64 * Address32 non-zero != Address64 non-zero - Warning, use Address64
* *
* Override: if acpi_gbl_use32_bit_fadt_addresses is TRUE, and: * Override: if acpi_gbl_use32_bit_fadt_addresses is TRUE, and:
* Address32 non-zero, Address64 zero - Copy/use Address32
* Address32 non-zero == Address64 non-zero - Copy/use Address32
* Address32 non-zero != Address64 non-zero - Warning, copy/use Address32 * Address32 non-zero != Address64 non-zero - Warning, copy/use Address32
* *
* Note: space_id is always I/O for 32-bit legacy address fields * Note: space_id is always I/O for 32-bit legacy address fields
*/ */
if (address32) { if (address32) {
if (!address64->address) { if (address64->address) {
if (address64->address != (u64)address32) {
/* 64-bit address is zero, use 32-bit address */
acpi_tb_init_generic_address(address64,
ACPI_ADR_SPACE_SYSTEM_IO,
*ACPI_ADD_PTR(u8,
&acpi_gbl_FADT,
fadt_info_table
[i].
length),
(u64)address32,
name, flags);
} else if (address64->address != (u64)address32) {
/* Address mismatch */ /* Address mismatch */
...@@ -593,41 +584,46 @@ static void acpi_tb_convert_fadt(void) ...@@ -593,41 +584,46 @@ static void acpi_tb_convert_fadt(void)
(address64->address), (address64->address),
acpi_gbl_use32_bit_fadt_addresses acpi_gbl_use32_bit_fadt_addresses
? 32 : 64)); ? 32 : 64));
}
if (acpi_gbl_use32_bit_fadt_addresses) { /*
* For each extended field, check for length mismatch
/* 32-bit address override */ * between the legacy length field and the corresponding
* 64-bit X length field.
acpi_tb_init_generic_address(address64, * Note: If the legacy length field is > 0xFF bits, ignore
ACPI_ADR_SPACE_SYSTEM_IO, * this check. (GPE registers can be larger than the
*ACPI_ADD_PTR * 64-bit GAS structure can accomodate, 0xFF bits).
(u8, */
&acpi_gbl_FADT, if ((ACPI_MUL_8(length) <= ACPI_UINT8_MAX) &&
fadt_info_table (address64->bit_width !=
[i]. ACPI_MUL_8(length))) {
length), ACPI_BIOS_WARNING((AE_INFO,
(u64) "32/64X length mismatch in FADT/%s: %u/%u",
address32,
name, name,
flags); ACPI_MUL_8(length),
} address64->
bit_width));
} }
} }
/* /*
* For each extended field, check for length mismatch between the * Hardware register access code always uses the 64-bit fields.
* legacy length field and the corresponding 64-bit X length field. * So if the 64-bit field is zero or is to be overridden,
* Note: If the legacy length field is > 0xFF bits, ignore this * initialize it with the 32-bit fields.
* check. (GPE registers can be larger than the 64-bit GAS structure * Note that when the 32-bit address favor is specified, the
* can accomodate, 0xFF bits). * 64-bit fields are always re-initialized so that
* access_size/bit_width/bit_offset fields can be correctly
* configured to the values to trigger a 32-bit compatible
* access mode in the hardware register access code.
*/ */
if (address64->address && if (!address64->address
(ACPI_MUL_8(length) <= ACPI_UINT8_MAX) && || acpi_gbl_use32_bit_fadt_addresses) {
(address64->bit_width != ACPI_MUL_8(length))) { acpi_tb_init_generic_address(address64,
ACPI_BIOS_WARNING((AE_INFO, ACPI_ADR_SPACE_SYSTEM_IO,
"32/64X length mismatch in FADT/%s: %u/%u", length,
name, ACPI_MUL_8(length), (u64)address32,
address64->bit_width)); name, flags);
}
} }
if (fadt_info_table[i].flags & ACPI_FADT_REQUIRED) { if (fadt_info_table[i].flags & ACPI_FADT_REQUIRED) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment