platform/x86: panasonic-laptop: Allocate 1 entry extra in the sinf array
authorHans de Goede <hdegoede@redhat.com>
Mon, 9 Sep 2024 11:32:26 +0000 (13:32 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 9 Sep 2024 17:50:21 +0000 (20:50 +0300)
Some DSDT-s have an off-by-one bug where the SINF package count is
one higher than the SQTY reported value, allocate 1 entry extra.

Also make the SQTY <-> SINF package count mismatch error more verbose
to help debugging similar issues in the future.

This fixes the panasonic-laptop driver failing to probe() on some
devices with the following errors:

[    3.958887] SQTY reports bad SINF length SQTY: 37 SINF-pkg-count: 38
[    3.958892] Couldn't retrieve BIOS data
[    3.983685] Panasonic Laptop Support - With Macros: probe of MAT0019:00 failed with error -5

Fixes: 709ee531c153 ("panasonic-laptop: add Panasonic Let's Note laptop extras driver v0.94")
Cc: stable@vger.kernel.org
Tested-by: James Harmison <jharmison@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20240909113227.254470-2-hdegoede@redhat.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/panasonic-laptop.c

index 39044119d2a6ef45dc3749a14b3264985f1336c8..ebd81846e2d564347c945b38504bb246cb58d6f9 100644 (file)
@@ -337,7 +337,8 @@ static int acpi_pcc_retrieve_biosdata(struct pcc_acpi *pcc)
        }
 
        if (pcc->num_sifr < hkey->package.count) {
-               pr_err("SQTY reports bad SINF length\n");
+               pr_err("SQTY reports bad SINF length SQTY: %lu SINF-pkg-count: %u\n",
+                      pcc->num_sifr, hkey->package.count);
                status = AE_ERROR;
                goto end;
        }
@@ -994,6 +995,12 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device)
                return -ENODEV;
        }
 
+       /*
+        * Some DSDT-s have an off-by-one bug where the SINF package count is
+        * one higher than the SQTY reported value, allocate 1 entry extra.
+        */
+       num_sifr++;
+
        pcc = kzalloc(sizeof(struct pcc_acpi), GFP_KERNEL);
        if (!pcc) {
                pr_err("Couldn't allocate mem for pcc");