| From e1d9148582ab2c3dada5c5cf8ca7531ca269fee5 Mon Sep 17 00:00:00 2001 |
| From: Mario Limonciello <mario.limonciello@amd.com> |
| Date: Thu, 15 Dec 2022 09:51:20 -0600 |
| Subject: [PATCH] ACPICA: Drop port I/O validation for some regions |
| Git-commit: e1d9148582ab2c3dada5c5cf8ca7531ca269fee5 |
| Patch-mainline: v6.3-rc1 |
| References: git-fixes |
| |
| Microsoft introduced support in Windows XP for blocking port I/O |
| to various regions. For Windows compatibility ACPICA has adopted |
| the same protections and will disallow writes to those |
| (presumably) the same regions. |
| |
| On some systems the AML included with the firmware will issue 4 byte |
| long writes to 0x80. These writes aren't making it over because of this |
| blockage. The first 4 byte write attempt is rejected, and then |
| subsequently 1 byte at a time each offset is tried. The first at 0x80 |
| works, but then the next 3 bytes are rejected. |
| |
| This manifests in bizarre failures for devices that expected the AML to |
| write all 4 bytes. Trying the same AML on Windows 10 or 11 doesn't hit |
| this failure and all 4 bytes are written. |
| |
| Either some of these regions were wrong or some point after Windows XP |
| some of these regions blocks have been lifted. |
| |
| In the last 15 years there doesn't seem to be any reports popping up of |
| this error in the Windows event viewer anymore. There is no documentation |
| at Microsoft's developer site indicating that Windows ACPI interpreter |
| blocks these regions. Between the lack of documentation and the fact that |
| the writes actually do work in Windows 10 and 11, it's quite likely |
| Windows doesn't actually enforce this anymore. |
| |
| So to help the issue, only enforce Windows XP specific entries if the |
| latest _OSI supported is Windows XP. Continue to enforce the |
| ALWAYS_ILLEGAL entries. |
| |
| Link: https://github.com/acpica/acpica/pull/817 |
| Fixes: 7f0719039085 ("ACPICA: New: I/O port protection") |
| Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Acked-by: Takashi Iwai <tiwai@suse.de> |
| |
| |
| drivers/acpi/acpica/hwvalid.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/acpi/acpica/hwvalid.c b/drivers/acpi/acpica/hwvalid.c |
| index 915b26448d2c..0d392e7b0747 100644 |
| |
| |
| @@ -23,8 +23,8 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width); |
| * |
| * The table is used to implement the Microsoft port access rules that |
| * first appeared in Windows XP. Some ports are always illegal, and some |
| - * ports are only illegal if the BIOS calls _OSI with a win_XP string or |
| - * later (meaning that the BIOS itelf is post-XP.) |
| + * ports are only illegal if the BIOS calls _OSI with nothing newer than |
| + * the specific _OSI strings. |
| * |
| * This provides ACPICA with the desired port protections and |
| * Microsoft compatibility. |
| @@ -145,7 +145,8 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width) |
| |
| /* Port illegality may depend on the _OSI calls made by the BIOS */ |
| |
| - if (acpi_gbl_osi_data >= port_info->osi_dependency) { |
| + if (port_info->osi_dependency == ACPI_ALWAYS_ILLEGAL || |
| + acpi_gbl_osi_data == port_info->osi_dependency) { |
| ACPI_DEBUG_PRINT((ACPI_DB_VALUES, |
| "Denied AML access to port 0x%8.8X%8.8X/%X (%s 0x%.4X-0x%.4X)\n", |
| ACPI_FORMAT_UINT64(address), |
| -- |
| 2.35.3 |
| |