Module Name:    src
Committed By:   thorpej
Date:           Wed Jan 27 04:54:08 UTC 2021

Modified Files:
        src/sys/kern: subr_autoconf.c
        src/sys/sys: device.h

Log Message:
Add device_compatible_match_id() and device_compatible_lookup_id(), which
are like device_compatible_match() and device_compatible_lookup(), but
take a single scalar value as an ID.

Add a "uintptr_t id" field to device_compatible_entry, in an anonymous
union with the existing "const char *compat" field.


To generate a diff of this commit:
cvs rdiff -u -r1.276 -r1.277 src/sys/kern/subr_autoconf.c
cvs rdiff -u -r1.163 -r1.164 src/sys/sys/device.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/subr_autoconf.c
diff -u src/sys/kern/subr_autoconf.c:1.276 src/sys/kern/subr_autoconf.c:1.277
--- src/sys/kern/subr_autoconf.c:1.276	Sun Jan 24 17:42:36 2021
+++ src/sys/kern/subr_autoconf.c	Wed Jan 27 04:54:08 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_autoconf.c,v 1.276 2021/01/24 17:42:36 thorpej Exp $ */
+/* $NetBSD: subr_autoconf.c,v 1.277 2021/01/27 04:54:08 thorpej Exp $ */
 
 /*
  * Copyright (c) 1996, 2000 Christopher G. Demetriou
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.276 2021/01/24 17:42:36 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.277 2021/01/27 04:54:08 thorpej Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -2345,7 +2345,7 @@ strarray_match_internal(const char ** co
 	unsigned int i;
 
 	if (strings == NULL || nstrings == 0) {
-		return 0;
+		return false;
 	}
 
 	for (i = 0; i < nstrings; i++) {
@@ -2499,6 +2499,43 @@ device_compatible_pmatch_strlist(
 	    device_compatsize, driver_compats, NULL, strlist_pmatch);
 }
 
+static int
+device_compatible_match_id_internal(
+    uintptr_t const id, uintptr_t const mask, uintptr_t const sentinel_id,
+    const struct device_compatible_entry *driver_compats,
+    const struct device_compatible_entry **matching_entryp)
+{
+	const struct device_compatible_entry *dce = NULL;
+
+	if (mask == 0)
+		return 0;
+
+	for (dce = driver_compats; dce->id != sentinel_id; dce++) {
+		if ((id & mask) == dce->id) {
+			if (matching_entryp != NULL) {
+				*matching_entryp = dce;
+			}
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/*
+ * device_compatible_match_id:
+ *
+ *	Like device_compatible_match(), but takes a single
+ *	unsigned integer device ID.
+ */
+int
+device_compatible_match_id(
+    uintptr_t const id, uintptr_t const sentinel_id,
+    const struct device_compatible_entry *driver_compats)
+{
+	return device_compatible_match_id_internal(id, (uintptr_t)-1,
+	    sentinel_id, driver_compats, NULL);
+}
+
 /*
  * device_compatible_lookup:
  *
@@ -2580,6 +2617,26 @@ device_compatible_plookup_strlist(
 }
 
 /*
+ * device_compatible_lookup_id:
+ *
+ *	Like device_compatible_lookup(), but takes a single
+ *	unsigned integer device ID.
+ */
+const struct device_compatible_entry *
+device_compatible_lookup_id(
+    uintptr_t const id, uintptr_t const sentinel_id,
+    const struct device_compatible_entry *driver_compats)
+{
+	const struct device_compatible_entry *dce;
+
+	if (device_compatible_match_id_internal(id, (uintptr_t)-1,
+	    sentinel_id, driver_compats, &dce)) {
+		return dce;
+	}
+	return NULL;
+}
+
+/*
  * Power management related functions.
  */
 

Index: src/sys/sys/device.h
diff -u src/sys/sys/device.h:1.163 src/sys/sys/device.h:1.164
--- src/sys/sys/device.h:1.163	Wed Jan 27 01:00:05 2021
+++ src/sys/sys/device.h	Wed Jan 27 04:54:08 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: device.h,v 1.163 2021/01/27 01:00:05 thorpej Exp $ */
+/* $NetBSD: device.h,v 1.164 2021/01/27 04:54:08 thorpej Exp $ */
 
 /*
  * Copyright (c) 1996, 2000 Christopher G. Demetriou
@@ -124,7 +124,10 @@ typedef struct cfattach *cfattach_t;
 
 #if defined(_KERNEL) || defined(_KMEMUSER)
 struct device_compatible_entry {
-	const char	*compat;
+	union {
+		const char *compat;
+		uintptr_t id;
+	};
 	union {
 		const void *data;
 		uintptr_t value;
@@ -567,6 +570,12 @@ const struct device_compatible_entry *
 		device_compatible_plookup_strlist(const char *, size_t,
 				const struct device_compatible_entry *);
 
+int		device_compatible_match_id(uintptr_t const, uintptr_t const,
+				const struct device_compatible_entry *);
+const struct device_compatible_entry *
+		device_compatible_lookup_id(uintptr_t const, uintptr_t const,
+				const struct device_compatible_entry *);
+
 bool		device_pmf_is_registered(device_t);
 bool		device_pmf_is_registered(device_t);
 

Reply via email to