From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D4E341A9FA4; Wed, 11 Feb 2026 12:32:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770813135; cv=none; b=Iqm4aSjMup+zRMvtB4Jd0Z774ldLvqnnqG8m7MtdEw4qqrJkccWqe0/VUfoaqzdCLz5mbUl2Kk9F8fx0gIJtFIUWl5L0fckAPD0gJSIGHbw1Pw0UduJ/Vsgwpyf1rm5KceocTGTPbQBMcE5Sq5H3wgqKyt8jxyIktFkhXGXuw0c= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770813135; c=relaxed/simple; bh=moKzAeFYlDBqh8t7VEdTHwMMA7bKkJkb3RAr0qipkoc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ilSNL38xj6QF5ABT6YAb8hzA26OcYPMGVZWkujYv91NbgBAaHk2MMrODyNdBZND4+z2dOlEmribzY5Xc+igtl0zUYv9PGBCJ/F4QRA5D50EpMhN1KRgtr+ZYYabNpc0JMMLmv3uv2VTt70CcelyFKZdfQLI42r+IbKQ8UkB+r0M= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l9m2NnXz; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="l9m2NnXz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 01568C19425; Wed, 11 Feb 2026 12:32:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770813135; bh=moKzAeFYlDBqh8t7VEdTHwMMA7bKkJkb3RAr0qipkoc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l9m2NnXzmq7E4dt6hMQJxMDtrIycioYeCGe+FpmdNuTQ8bfaDpTjgKJ1yZOr0487c zH6wDai9ypX2vvDO59+Q2YAoEzhBmhBAR6lrIrRbBJolnz/WUnYGKLTC32aUdOjxem yAvgnC4nWArBOjL5p3teLmm0BVKYCNioBH5NzJtW9mBYxoLcegk00ikZEL1oZpEZik 02pZCXb4TgxLHWjYGuNvtuITBadjQrH1NGsooyRASywVepBjmEIQNPMpkcw1ZDKumH 8Cb1LCKbeq/uUxOcHBAXMlFCPKvf6DABYjcYzFow8rsFw81nh6ghG69F1MjkTxoRtq g8b+CF9qHEGig== From: Sasha Levin To: patches@lists.linux.dev, stable@vger.kernel.org Cc: Ai Chao , "Rafael J. Wysocki" , Sasha Levin , rafael@kernel.org, linux-acpi@vger.kernel.org Subject: [PATCH AUTOSEL 6.19-6.12] ACPI: resource: Add JWIPC JVC9100 to irq1_level_low_skip_override[] Date: Wed, 11 Feb 2026 07:30:40 -0500 Message-ID: <20260211123112.1330287-30-sashal@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260211123112.1330287-1-sashal@kernel.org> References: <20260211123112.1330287-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: patches@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.19 Content-Transfer-Encoding: 8bit From: Ai Chao [ Upstream commit ba6ded26dffe511b862a98a25955955e7154bfa8 ] Like the JWIPC JVC9100 has its serial IRQ (10 and 11) described as ActiveLow in the DSDT, which the kernel overrides to EdgeHigh which breaks the serial. irq 10, level, active-low, shared, skip-override irq 11, level, active-low, shared, skip-override Add the JVC9100 to the irq1_level_low_skip_override[] quirk table to fix this. Signed-off-by: Ai Chao Link: https://patch.msgid.link/20260113072719.4154485-1-aichao@kylinos.cn Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- LLM Generated explanations, may be completely bogus: Now I have a complete picture. Let me compile the full analysis. --- ## Detailed Analysis ### 1. COMMIT MESSAGE ANALYSIS The commit adds the JWIPC JVC9100 industrial PC board to the `irq1_level_low_skip_override[]` DMI quirk table in `drivers/acpi/resource.c`. The commit message clearly states the problem: serial IRQs 10 and 11 are described as ActiveLow in the DSDT, but the kernel incorrectly overrides them to EdgeHigh, which **breaks serial communication** on the device. This is a classic ACPI IRQ override quirk - a well-established pattern in the stable kernel tree. The commit was authored by Ai Chao (Kylin OS engineer) and signed off by Rafael J. Wysocki, the ACPI subsystem maintainer, indicating proper review and acceptance. ### 2. CODE CHANGE ANALYSIS The patch makes two types of changes, both to data tables in `drivers/acpi/resource.c`: **Part 1 - DMI table addition** (lines 535-540 in the patch): A new DMI entry for the JWIPC JVC9100 board is added to `irq1_level_low_skip_override[]`: ```c { /* JWIPC JVC9100 */ .matches = { DMI_MATCH(DMI_BOARD_NAME, "JVC9100"), }, }, ``` **Part 2 - Override table entries** (new lines in `override_table[]`): ```c { irq1_level_low_skip_override, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 1, false }, { irq1_level_low_skip_override, 11, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 1, false }, ``` These entries tell `acpi_dev_irq_override()` to return `false` (skip the override) for IRQ 10 and 11 when they match level-sensitive, active-low, shared parameters on systems in the DMI table. **Why the override_table entries are needed**: Looking at the `acpi_dev_irq_override()` function: ```712:751:/home/sasha/linux-autosel/drivers/acpi/resource.c static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity, u8 shareable) { // ... iterates override_table ... // If no match found: if (gsi != 1 && gsi != 12) return true; // <-- IRQ 10/11 always gets overridden! ``` Without an `override_table` entry, IRQ 10 and 11 (not being 1 or 12) always fall through to `return true`, meaning the kernel **always** overrides the DSDT-specified IRQ configuration. The only way to prevent this for specific systems is to add explicit entries to `override_table[]`. ### 3. CLASSIFICATION This is a **hardware quirk / workaround** - one of the explicit exception categories that is appropriate for stable backporting. It follows the identical pattern of dozens of other IRQ override quirk additions that have been backported to stable trees. Checking the 6.12 stable branch confirms that numerous similar quirk additions (`Skip IRQ override on ASUS Vivobook`, `Add LG 16T90SP`, `Add Asus Vivobook X1504VAP`, etc.) have already been backported. ### 4. SCOPE AND RISK ASSESSMENT **Size**: 8 lines added, 1 file changed. Purely data table additions. **Nuance about `override_table` scope**: The new `override_table` entries for IRQ 10/11 reference `irq1_level_low_skip_override`, which contains ~20 other systems (Asus Vivobooks, Medion, LG laptops). This means if ANY of those systems also have IRQ 10/11 described as `ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, shareable=1` in their DSDT, the override would be skipped for those too. However: - Those are consumer laptops that typically don't have serial ports (IRQ 10/11 are serial controller IRQs) - Even if they matched, skipping the override is the correct behavior for these AMD Zen-based systems where the DSDT is authoritative - The match requires a 4-way parameter match (IRQ number + triggering + polarity + shareable), making false positives essentially impossible **Risk**: Very LOW. The change is purely additive to data tables. ### 5. USER IMPACT JWIPC is a Chinese industrial PC manufacturer. The JVC9100 is an industrial/embedded computing platform where serial ports (RS-232/RS-485) are critical for connecting to industrial equipment, sensors, PLCs, and other peripherals. Broken serial communication on an industrial PC renders the device significantly less useful or completely non-functional for its intended purpose. ### 6. STABILITY INDICATORS - Accepted by the ACPI subsystem maintainer (Rafael J. Wysocki) - Follows an extremely well-established quirk pattern with dozens of precedents - Author from Kylin OS (a widely-used Chinese enterprise Linux distribution), suggesting real-world testing ### 7. DEPENDENCY CHECK - **6.12 stable** (p-6.12): `irq1_level_low_skip_override[]` and the consolidated `override_table[]` structure exist. The patch should apply cleanly or with trivial context adjustments. - **6.6 stable** (p-6.6): Uses the **pre-consolidation** structure with separate per-vendor DMI tables (`medion_laptop[]`, `asus_laptop[]`, etc.) and 6 `override_table[]` entries. This patch would need rework - a new DMI table for the JVC9100 would be needed. - **6.1 stable and older**: Similar rework needed, plus the consolidation commit `d37273af0e428` introduced `irq1_level_low_skip_override` in v6.6-rc2. The essential infrastructure (`override_table[]`, `irq_override_cmp` struct with `override` bool, `acpi_dev_irq_override()` function) exists since v6.0, so backporting is feasible to all current stable trees with appropriate adjustments. ### 8. PRECEDENT Looking at both `p-6.12` and `p-6.6` branches, numerous virtually identical commits have been backported: - "Skip IRQ override on ASUS Vivobook Pro N6506CU" (6bb7489f38d9e in 6.12) - "Add Asus Vivobook X1504VAP to irq1_level_low_skip_override[]" (df8d1c8e67204 in 6.12) - "Add LG 16T90SP to irq1_level_low_skip_override[]" (53f1a907d36fb in 6.12, bdaab141edb6f in 6.6) - And many more This is one of the most commonly backported categories of changes in the ACPI subsystem. ### Summary This commit is a textbook stable-worthy hardware quirk. It adds a DMI match for a specific industrial PC board and corresponding `override_table` entries to prevent the kernel from incorrectly overriding serial IRQ configuration, which breaks serial ports. It is small (8 lines), contained (data-only), obviously correct (follows established patterns), fixes a real user-visible bug (broken serial ports on industrial hardware), and has zero risk of regression for other systems. The ACPI subsystem maintainer approved it. Dozens of virtually identical changes have been successfully backported to stable trees. **YES** drivers/acpi/resource.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index d16906f46484d..bc8050d8a6f51 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c @@ -532,6 +532,12 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = { DMI_MATCH(DMI_BOARD_NAME, "16T90SP"), }, }, + { + /* JWIPC JVC9100 */ + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "JVC9100"), + }, + }, { } }; @@ -706,6 +712,8 @@ struct irq_override_cmp { static const struct irq_override_cmp override_table[] = { { irq1_level_low_skip_override, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false }, + { irq1_level_low_skip_override, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 1, false }, + { irq1_level_low_skip_override, 11, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 1, false }, { irq1_edge_low_force_override, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true }, }; -- 2.51.0