ata: ahci: Disallow LPM for ASUSPRO-D840SA motherboard
authorNiklas Cassel <cassel@kernel.org>
Thu, 12 Jun 2025 14:17:51 +0000 (16:17 +0200)
committerNiklas Cassel <cassel@kernel.org>
Fri, 13 Jun 2025 12:51:37 +0000 (14:51 +0200)
A user has bisected a regression which causes graphical corruptions on his
screen to commit 7627a0edef54 ("ata: ahci: Drop low power policy board
type").

Simply reverting commit 7627a0edef54 ("ata: ahci: Drop low power policy
board type") makes the graphical corruptions on his screen to go away.
(Note: there are no visible messages in dmesg that indicates a problem
with AHCI.)

The user also reports that the problem occurs regardless if there is an
HDD or an SSD connected via AHCI, so the problem is not device related.

The devices also work fine on other motherboards, so it seems specific to
the ASUSPRO-D840SA motherboard.

While enabling low power modes for AHCI is not supposed to affect
completely unrelated hardware, like a graphics card, it does however
allow the system to enter deeper PC-states, which could expose ACPI issues
that were previously not visible (because the system never entered these
lower power states before).

There are previous examples where enabling LPM exposed serious BIOS/ACPI
bugs, see e.g. commit 240630e61870 ("ahci: Disable LPM on Lenovo 50 series
laptops with a too old BIOS").

Since there hasn't been any BIOS update in years for the ASUSPRO-D840SA
motherboard, disable LPM for this board, in order to avoid entering lower
PC-states, which triggers graphical corruptions.

Cc: stable@vger.kernel.org
Reported-by: Andy Yang <andyybtc79@gmail.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220111
Fixes: 7627a0edef54 ("ata: ahci: Drop low power policy board type")
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hans de Goede <hansg@kernel.org>
Link: https://lore.kernel.org/r/20250612141750.2108342-2-cassel@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
drivers/ata/ahci.c

index e7c8357cbc541667779709ca36ed673e1539349e..c8ad8ace7496dfab59a879139e64016c3e559bd1 100644 (file)
@@ -1410,8 +1410,15 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
 
 static bool ahci_broken_lpm(struct pci_dev *pdev)
 {
+       /*
+        * Platforms with LPM problems.
+        * If driver_data is NULL, there is no existing BIOS version with
+        * functioning LPM.
+        * If driver_data is non-NULL, then driver_data contains the DMI BIOS
+        * build date of the first BIOS version with functioning LPM (i.e. older
+        * BIOS versions have broken LPM).
+        */
        static const struct dmi_system_id sysids[] = {
-               /* Various Lenovo 50 series have LPM issues with older BIOSen */
                {
                        .matches = {
                                DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1440,6 +1447,13 @@ static bool ahci_broken_lpm(struct pci_dev *pdev)
                        },
                        .driver_data = "20180409", /* 2.35 */
                },
+               {
+                       .matches = {
+                               DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+                               DMI_MATCH(DMI_PRODUCT_VERSION, "ASUSPRO D840MB_M840SA"),
+                       },
+                       /* 320 is broken, there is no known good version yet. */
+               },
                { }     /* terminate list */
        };
        const struct dmi_system_id *dmi = dmi_first_match(sysids);
@@ -1449,6 +1463,9 @@ static bool ahci_broken_lpm(struct pci_dev *pdev)
        if (!dmi)
                return false;
 
+       if (!dmi->driver_data)
+               return true;
+
        dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
        snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);