Module Name: src
Committed By: thorpej
Date: Mon Jun 18 15:36:54 UTC 2018
Modified Files:
src/sys/kern: subr_autoconf.c
src/sys/sys: device.h
Log Message:
Add device_compatible_match(), a generalized routine for weighted
matching of device_compatible_entry data to a device's "compatible"
strings.
To generate a diff of this commit:
cvs rdiff -u -r1.257 -r1.258 src/sys/kern/subr_autoconf.c
cvs rdiff -u -r1.152 -r1.153 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.257 src/sys/kern/subr_autoconf.c:1.258
--- src/sys/kern/subr_autoconf.c:1.257 Sun Mar 4 07:12:18 2018
+++ src/sys/kern/subr_autoconf.c Mon Jun 18 15:36:54 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_autoconf.c,v 1.257 2018/03/04 07:12:18 mlelstv Exp $ */
+/* $NetBSD: subr_autoconf.c,v 1.258 2018/06/18 15:36:54 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.257 2018/03/04 07:12:18 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_autoconf.c,v 1.258 2018/06/18 15:36:54 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -2275,6 +2275,69 @@ device_find_by_driver_unit(const char *n
}
/*
+ * device_compatible_entry_matches:
+ *
+ * Helper function to determine if a device_compatible_entry
+ * contains a match for the specified "compatible" string.
+ */
+static bool
+device_compatible_entry_matches(const struct device_compatible_entry *dce,
+ const char *compatible)
+{
+ const char **cpp = DEVICE_COMPAT_ENTRY_GET_STRINGS(dce);
+
+ if (cpp == NULL)
+ return false;
+
+ while (*cpp != NULL)
+ if (strcmp(*cpp, compatible) == 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * device_compatible_match:
+ *
+ * Match a driver's "compatible" data against a device's
+ * "compatible" strings. If a match is found, we return
+ * the matching device_compatible_entry, along with a
+ * matching weight.
+ */
+const struct device_compatible_entry *
+device_compatible_match(const char **device_compats, int ndevice_compats,
+ const struct device_compatible_entry *driver_compats,
+ int *match_weightp)
+{
+ const struct device_compatible_entry *dce = NULL;
+ int i, match_weight;
+
+ if (ndevice_compats == 0 || device_compats == NULL ||
+ driver_compats == NULL)
+ return NULL;
+
+ /*
+ * We take the first match because we start with the most-specific
+ * device compatible string.
+ */
+ for (i = 0, match_weight = ndevice_compats - 1;
+ i < ndevice_compats;
+ i++, match_weight--) {
+ for (dce = driver_compats;
+ DEVICE_COMPAT_ENTRY_IS_TERMINATOR(dce) == false; dce++) {
+ if (device_compatible_entry_matches(dce,
+ device_compats[i])) {
+ KASSERT(match_weight >= 0);
+ if (match_weightp)
+ *match_weightp = match_weight;
+ return dce;
+ }
+ }
+ }
+ return NULL;
+}
+
+/*
* Power management related functions.
*/
Index: src/sys/sys/device.h
diff -u src/sys/sys/device.h:1.152 src/sys/sys/device.h:1.153
--- src/sys/sys/device.h:1.152 Sun Jun 17 15:06:27 2018
+++ src/sys/sys/device.h Mon Jun 18 15:36:54 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: device.h,v 1.152 2018/06/17 15:06:27 thorpej Exp $ */
+/* $NetBSD: device.h,v 1.153 2018/06/18 15:36:54 thorpej Exp $ */
/*
* Copyright (c) 1996, 2000 Christopher G. Demetriou
@@ -552,6 +552,11 @@ bool device_is_a(device_t, const char *
device_t device_find_by_xname(const char *);
device_t device_find_by_driver_unit(const char *, int);
+const struct device_compatible_entry *
+ device_compatible_match(const char **, int,
+ const struct device_compatible_entry *,
+ int *);
+
bool device_pmf_is_registered(device_t);
bool device_pmf_driver_suspend(device_t, const pmf_qual_t *);