Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Add device_compatible_match_id() and device_compatible_l...



details:   https://anonhg.NetBSD.org/src/rev/f97b500d6038
branches:  trunk
changeset: 950390:f97b500d6038
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Wed Jan 27 04:54:08 2021 +0000

description:
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.

diffstat:

 sys/kern/subr_autoconf.c |  63 +++++++++++++++++++++++++++++++++++++++++++++--
 sys/sys/device.h         |  13 ++++++++-
 2 files changed, 71 insertions(+), 5 deletions(-)

diffs (132 lines):

diff -r 009f79abe7bf -r f97b500d6038 sys/kern/subr_autoconf.c
--- a/sys/kern/subr_autoconf.c  Wed Jan 27 04:35:15 2021 +0000
+++ b/sys/kern/subr_autoconf.c  Wed Jan 27 04:54:08 2021 +0000
@@ -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 @@
        unsigned int i;
 
        if (strings == NULL || nstrings == 0) {
-               return 0;
+               return false;
        }
 
        for (i = 0; i < nstrings; i++) {
@@ -2499,6 +2499,43 @@
            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_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.
  */
 
diff -r 009f79abe7bf -r f97b500d6038 sys/sys/device.h
--- a/sys/sys/device.h  Wed Jan 27 04:35:15 2021 +0000
+++ b/sys/sys/device.h  Wed Jan 27 04:54:08 2021 +0000
@@ -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 @@
 
 #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 @@
                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);
 



Home | Main Index | Thread Index | Old Index