Module Name: src Committed By: jmcneill Date: Sat Jan 11 11:40:43 UTC 2025
Modified Files: src/sys/arch/arm/acpi: acpipchb.c src/sys/dev/acpi: acpi_i2c.c acpi_util.c acpi_util.h ehci_acpi.c Log Message: acpi: i2c: only claim child devices with a _CRS or _ADR method acpi_enter_i2c_devs is too aggressive with claiming child device nodes. Restrict it to devices with either a _CRS or _ADR method. A driver is free to claim more if appropriate. Fixes missing HKEY (LEN0268) device on Thinkpad T14s Gen 6 (X1E). To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/arch/arm/acpi/acpipchb.c cvs rdiff -u -r1.18 -r1.19 src/sys/dev/acpi/acpi_i2c.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/acpi/acpi_util.c cvs rdiff -u -r1.15 -r1.16 src/sys/dev/acpi/acpi_util.h cvs rdiff -u -r1.9 -r1.10 src/sys/dev/acpi/ehci_acpi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/acpi/acpipchb.c diff -u src/sys/arch/arm/acpi/acpipchb.c:1.32 src/sys/arch/arm/acpi/acpipchb.c:1.33 --- src/sys/arch/arm/acpi/acpipchb.c:1.32 Sat Oct 15 11:07:38 2022 +++ src/sys/arch/arm/acpi/acpipchb.c Sat Jan 11 11:40:43 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: acpipchb.c,v 1.32 2022/10/15 11:07:38 jmcneill Exp $ */ +/* $NetBSD: acpipchb.c,v 1.33 2025/01/11 11:40:43 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v 1.32 2022/10/15 11:07:38 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v 1.33 2025/01/11 11:40:43 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -160,7 +160,7 @@ acpipchb_attach(device_t parent, device_ aprint_naive("\n"); aprint_normal(": PCI Express Host Bridge\n"); - acpi_claim_childdevs(self, aa->aa_node); + acpi_claim_childdevs(self, aa->aa_node, NULL); memset(&pba, 0, sizeof(pba)); pba.pba_flags = aa->aa_pciflags & Index: src/sys/dev/acpi/acpi_i2c.c diff -u src/sys/dev/acpi/acpi_i2c.c:1.18 src/sys/dev/acpi/acpi_i2c.c:1.19 --- src/sys/dev/acpi/acpi_i2c.c:1.18 Mon Dec 30 11:44:16 2024 +++ src/sys/dev/acpi/acpi_i2c.c Sat Jan 11 11:40:43 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_i2c.c,v 1.18 2024/12/30 11:44:16 jmcneill Exp $ */ +/* $NetBSD: acpi_i2c.c,v 1.19 2025/01/11 11:40:43 jmcneill Exp $ */ /*- * Copyright (c) 2017, 2021 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #include "iic.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_i2c.c,v 1.18 2024/12/30 11:44:16 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_i2c.c,v 1.19 2025/01/11 11:40:43 jmcneill Exp $"); #include <sys/device.h> @@ -190,7 +190,7 @@ acpi_enter_i2chid_devs(device_t dev, str i2cc.res_src == devnode) { aprint_debug_dev(dev, "claiming %s\n", ad->ad_name); ad->ad_device = dev; - acpi_claim_childdevs(dev, ad); + acpi_claim_childdevs(dev, ad, NULL); acpi_enter_i2c_device(ad, array); } } @@ -214,7 +214,8 @@ acpi_enter_i2c_devs(device_t dev, struct } if (dev != NULL) { - acpi_claim_childdevs(dev, devnode); + acpi_claim_childdevs(dev, devnode, "_CRS"); + acpi_claim_childdevs(dev, devnode, "_ADR"); acpi_enter_i2chid_devs(dev, devnode, array); } Index: src/sys/dev/acpi/acpi_util.c diff -u src/sys/dev/acpi/acpi_util.c:1.34 src/sys/dev/acpi/acpi_util.c:1.35 --- src/sys/dev/acpi/acpi_util.c:1.34 Mon Dec 30 19:07:31 2024 +++ src/sys/dev/acpi/acpi_util.c Sat Jan 11 11:40:43 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_util.c,v 1.34 2024/12/30 19:07:31 jmcneill Exp $ */ +/* $NetBSD: acpi_util.c,v 1.35 2025/01/11 11:40:43 jmcneill Exp $ */ /*- * Copyright (c) 2003, 2007, 2021 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.34 2024/12/30 19:07:31 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.35 2025/01/11 11:40:43 jmcneill Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -1212,17 +1212,29 @@ acpi_dsm_query(ACPI_HANDLE handle, uint8 } ACPI_STATUS -acpi_claim_childdevs(device_t dev, struct acpi_devnode *devnode) +acpi_claim_childdevs(device_t dev, struct acpi_devnode *devnode, + const char *method) { struct acpi_devnode *ad; SIMPLEQ_FOREACH(ad, &devnode->ad_child_head, ad_child_list) { if (ad->ad_device != NULL) continue; + + if (method != NULL) { + ACPI_HANDLE h; + ACPI_STATUS rv; + + rv = AcpiGetHandle(ad->ad_handle, method, &h); + if (ACPI_FAILURE(rv)) { + continue; + } + } + aprint_debug_dev(dev, "claiming %s\n", acpi_name(ad->ad_handle)); ad->ad_device = dev; - acpi_claim_childdevs(dev, ad); + acpi_claim_childdevs(dev, ad, method); } return AE_OK; Index: src/sys/dev/acpi/acpi_util.h diff -u src/sys/dev/acpi/acpi_util.h:1.15 src/sys/dev/acpi/acpi_util.h:1.16 --- src/sys/dev/acpi/acpi_util.h:1.15 Sat Jul 23 03:08:17 2022 +++ src/sys/dev/acpi/acpi_util.h Sat Jan 11 11:40:43 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_util.h,v 1.15 2022/07/23 03:08:17 thorpej Exp $ */ +/* $NetBSD: acpi_util.h,v 1.16 2025/01/11 11:40:43 jmcneill Exp $ */ /*- * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc. @@ -111,6 +111,7 @@ ACPI_STATUS acpi_dsm_integer(ACPI_HANDL ACPI_STATUS acpi_dsm_query(ACPI_HANDLE, uint8_t *, ACPI_INTEGER, ACPI_INTEGER *); -ACPI_STATUS acpi_claim_childdevs(device_t, struct acpi_devnode *); +ACPI_STATUS acpi_claim_childdevs(device_t, struct acpi_devnode *, + const char *); #endif /* !_SYS_DEV_ACPI_ACPI_UTIL_H */ Index: src/sys/dev/acpi/ehci_acpi.c diff -u src/sys/dev/acpi/ehci_acpi.c:1.9 src/sys/dev/acpi/ehci_acpi.c:1.10 --- src/sys/dev/acpi/ehci_acpi.c:1.9 Fri Dec 24 00:27:22 2021 +++ src/sys/dev/acpi/ehci_acpi.c Sat Jan 11 11:40:43 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: ehci_acpi.c,v 1.9 2021/12/24 00:27:22 jmcneill Exp $ */ +/* $NetBSD: ehci_acpi.c,v 1.10 2025/01/11 11:40:43 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ehci_acpi.c,v 1.9 2021/12/24 00:27:22 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ehci_acpi.c,v 1.10 2025/01/11 11:40:43 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -96,7 +96,7 @@ ehci_acpi_attach(device_t parent, device int error; void *ih; - acpi_claim_childdevs(self, aa->aa_node); + acpi_claim_childdevs(self, aa->aa_node, NULL); asc->sc_handle = aa->aa_node->ad_handle;