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;