[PATCH 3/3] ACPI: x86: Repair broken PEG0._STA on Samsung Galaxy Book 930XDB

From: Leonard Lausen

Date: Mon Oct 19 2026 - 13:14:17 EST


The SaSsdt table on the Samsung Galaxy Book 930XDB with BIOS
P11RFX.067.230331.SP declares PG0E as an external object at the namespace
root. PEG0._STA nevertheless encodes PG0E as an unqualified NameSeg.

Namespace lookup from PEG0 finds the unrelated empty Package at
\_SB.PC00.PG0E before the intended integer field at \PG0E. Comparing
that Package with One aborts _STA with AE_AML_OPERAND_TYPE.

A regular acpi_device status override is too late to prevent this.
ACPICA evaluates _STA while initializing namespace objects, before
struct acpi_device exists, and acpi_get_devices() evaluates it again
without going through acpi_bus_get_status().

Replace only PEG0._STA after the tables have been loaded and before ACPI
objects are initialized. The replacement retains the firmware logic but
uses an absolute path for \PG0E, so every _STA evaluation follows the
intended namespace object. Match the vendor and full DMI product string,
930XDB/931XDB/930XDY.

Signed-off-by: Leonard Lausen <leonard@xxxxxxxxx>
---
drivers/acpi/bus.c | 2 ++
drivers/acpi/x86/utils.c | 53 ++++++++++++++++++++++++++++++++++++++++
include/acpi/acpi_bus.h | 2 ++
3 files changed, 57 insertions(+)

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 808c6746be14..555270fb49dd 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1376,6 +1376,8 @@ static int __init acpi_bus_init(void)
goto error1;
}

+ acpi_quirk_override_broken_methods();
+
/*
* ACPI 2.0 requires the EC driver to be loaded and work before the EC
* device is found in the namespace.
diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c
index 418951639f51..661267a5f8ba 100644
--- a/drivers/acpi/x86/utils.c
+++ b/drivers/acpi/x86/utils.c
@@ -67,6 +67,59 @@ struct override_status_id {
#define NOT_PRESENT_ENTRY_PATH(path, cpu_vfm, dmi...) \
ENTRY(0, "", NULL, path, cpu_vfm, dmi)

+/*
+ * The firmware method is equivalent to this ASL, except that it references
+ * PG0E without the root prefix and resolves to an unrelated Package object:
+ *
+ * Method (\_SB.PC00.PEG0._STA, 0, NotSerialized)
+ * {
+ * If ((\PG0E == One))
+ * Return (0x0F)
+ *
+ * Return (Zero)
+ * }
+ *
+ * acpi_install_method() requires a complete table containing one method. The
+ * AML below was generated from the ASL above with iasl 20250404.
+ */
+static u8 samsung_930xdb_peg0_sta[] __initdata = {
+ 0x53, 0x53, 0x44, 0x54, 0x48, 0x00, 0x00, 0x00,
+ 0x02, 0xc8, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x20,
+ 0x50, 0x45, 0x47, 0x30, 0x53, 0x54, 0x41, 0x20,
+ 0x01, 0x00, 0x00, 0x00, 0x49, 0x4e, 0x54, 0x4c,
+ 0x04, 0x04, 0x25, 0x20, 0x14, 0x23, 0x5c, 0x2f,
+ 0x04, 0x5f, 0x53, 0x42, 0x5f, 0x50, 0x43, 0x30,
+ 0x30, 0x50, 0x45, 0x47, 0x30, 0x5f, 0x53, 0x54,
+ 0x41, 0x00, 0xa0, 0x0b, 0x93, 0x5c, 0x50, 0x47,
+ 0x30, 0x45, 0x01, 0xa4, 0x0a, 0x0f, 0xa4, 0x00,
+};
+
+static const struct dmi_system_id acpi_method_override_dmi_ids[] __initconst = {
+ {
+ .ident = "Samsung Galaxy Book 930XDB/931XDB/930XDY",
+ .matches = {
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "930XDB/931XDB/930XDY"),
+ },
+ },
+ {}
+};
+
+void __init acpi_quirk_override_broken_methods(void)
+{
+ acpi_status status;
+
+ if (!dmi_check_system(acpi_method_override_dmi_ids))
+ return;
+
+ status = acpi_install_method(samsung_930xdb_peg0_sta);
+ if (ACPI_FAILURE(status))
+ pr_warn(FW_BUG "Failed to replace broken PEG0._STA: %s\n",
+ acpi_format_exception(status));
+ else
+ pr_info(FW_BUG "Replaced broken PEG0._STA method\n");
+}
+
static const struct override_status_id override_status_ids[] = {
/*
* Bay / Cherry Trail PWM directly poked by GPU driver in win10,
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index a10a591c18b2..ebdd197dbbc4 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -713,10 +713,12 @@ int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state);
int acpi_disable_wakeup_device_power(struct acpi_device *dev);

#ifdef CONFIG_X86
+void acpi_quirk_override_broken_methods(void);
bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *status);
bool acpi_quirk_skip_acpi_ac_and_battery(void);
int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip);
#else
+static inline void acpi_quirk_override_broken_methods(void) { }
static inline bool acpi_device_override_status(struct acpi_device *adev,
unsigned long long *status)
{
--
2.55.0