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;
 

Reply via email to