]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
platform/x86/amd: pmc: Drop SMU F/W match for Cezanne
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 24 Jul 2025 18:51:08 +0000 (13:51 -0500)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 12 Aug 2025 12:02:31 +0000 (15:02 +0300)
Chris reported that even on a BIOS that has a new enough SMU F/W
version there is still a spurious IRQ1.  Although the solution was
added to SMU F/W 64.66.0 it turns out there needs to be a matching
SBIOS change to activate it.  Thus Linux shouldn't be avoiding the
IRQ1 workaround on newer SMU F/W because there is no indication the
BIOS change is in place.

Drop the match for 64.66.0+ and instead match all RN/CZN/BRC (they
all share same SMU F/W). Adjust the quirk infrastructure to allow
quirking the workaround on or off and also adjust existing quirks
to match properly.

Unfortunately this may cause some systems that did have the SBIOS
change in place to regress in keyboard wakeup but we don't have a
way to know.  If a user reports a keyboard wakeup regression they can
run with amd_pmc.disable_workarounds=1 to deactivate the workaround
and share DMI data so that their system can be quirked not to use
the workaround in the upstream kernel.

Reported-by: Chris Bainbridge <chris.bainbridge@gmail.com>
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4449
Tested-by: Chris Bainbridge <chris.bainbridge@gmail.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20250724185156.1827592-1-superm1@kernel.org
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/amd/pmc/pmc-quirks.c
drivers/platform/x86/amd/pmc/pmc.c

index ded4c84f5ed149d76a0aafca17aa762438dc98aa..7ffc659b2794413ad36a869cf2dd8f682c2fbfe8 100644 (file)
@@ -28,10 +28,15 @@ static struct quirk_entry quirk_spurious_8042 = {
        .spurious_8042 = true,
 };
 
+static struct quirk_entry quirk_s2idle_spurious_8042 = {
+       .s2idle_bug_mmio = FCH_PM_BASE + FCH_PM_SCRATCH,
+       .spurious_8042 = true,
+};
+
 static const struct dmi_system_id fwbug_list[] = {
        {
                .ident = "L14 Gen2 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20X5"),
@@ -39,7 +44,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "T14s Gen2 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20XF"),
@@ -47,7 +52,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "X13 Gen2 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20XH"),
@@ -55,7 +60,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "T14 Gen2 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20XK"),
@@ -63,7 +68,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "T14 Gen1 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20UD"),
@@ -71,7 +76,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "T14 Gen1 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20UE"),
@@ -79,7 +84,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "T14s Gen1 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20UH"),
@@ -87,7 +92,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "T14s Gen1 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20UJ"),
@@ -95,7 +100,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "P14s Gen1 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "20Y1"),
@@ -103,7 +108,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "P14s Gen2 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "21A0"),
@@ -111,7 +116,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "P14s Gen2 AMD",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "21A1"),
@@ -152,7 +157,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "IdeaPad 1 14AMN7",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "82VF"),
@@ -160,7 +165,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "IdeaPad 1 15AMN7",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "82VG"),
@@ -168,7 +173,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "IdeaPad 1 15AMN7",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "82X5"),
@@ -176,7 +181,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "IdeaPad Slim 3 14AMN8",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "82XN"),
@@ -184,7 +189,7 @@ static const struct dmi_system_id fwbug_list[] = {
        },
        {
                .ident = "IdeaPad Slim 3 15AMN8",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "82XQ"),
@@ -193,7 +198,7 @@ static const struct dmi_system_id fwbug_list[] = {
        /* https://gitlab.freedesktop.org/drm/amd/-/issues/4434 */
        {
                .ident = "Lenovo Yoga 6 13ALC6",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "82ND"),
@@ -202,7 +207,7 @@ static const struct dmi_system_id fwbug_list[] = {
        /* https://gitlab.freedesktop.org/drm/amd/-/issues/2684 */
        {
                .ident = "HP Laptop 15s-eq2xxx",
-               .driver_data = &quirk_s2idle_bug,
+               .driver_data = &quirk_s2idle_spurious_8042,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "HP"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "HP Laptop 15s-eq2xxx"),
@@ -285,6 +290,16 @@ void amd_pmc_quirks_init(struct amd_pmc_dev *dev)
 {
        const struct dmi_system_id *dmi_id;
 
+       /*
+        * IRQ1 may cause an interrupt during resume even without a keyboard
+        * press.
+        *
+        * Affects Renoir, Cezanne and Barcelo SoCs
+        *
+        * A solution is available in PMFW 64.66.0, but it must be activated by
+        * SBIOS. If SBIOS is known to have the fix a quirk can be added for
+        * a given system to avoid workaround.
+        */
        if (dev->cpu_id == AMD_CPU_ID_CZN)
                dev->disable_8042_wakeup = true;
 
@@ -295,6 +310,5 @@ void amd_pmc_quirks_init(struct amd_pmc_dev *dev)
        if (dev->quirks->s2idle_bug_mmio)
                pr_info("Using s2idle quirk to avoid %s platform firmware bug\n",
                        dmi_id->ident);
-       if (dev->quirks->spurious_8042)
-               dev->disable_8042_wakeup = true;
+       dev->disable_8042_wakeup = dev->quirks->spurious_8042;
 }
index 0b9b23eb7c2c300645601316d3caabcf28483656..bd318fd02ccf4ae0c6b7690cf07a0f5231752db2 100644 (file)
@@ -530,19 +530,6 @@ static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev)
 static int amd_pmc_wa_irq1(struct amd_pmc_dev *pdev)
 {
        struct device *d;
-       int rc;
-
-       /* cezanne platform firmware has a fix in 64.66.0 */
-       if (pdev->cpu_id == AMD_CPU_ID_CZN) {
-               if (!pdev->major) {
-                       rc = amd_pmc_get_smu_version(pdev);
-                       if (rc)
-                               return rc;
-               }
-
-               if (pdev->major > 64 || (pdev->major == 64 && pdev->minor > 65))
-                       return 0;
-       }
 
        d = bus_find_device_by_name(&serio_bus, NULL, "serio0");
        if (!d)