[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240521-board-ids-v3-3-e6c71d05f4d2@quicinc.com>
Date: Tue, 21 May 2024 11:38:00 -0700
From: Elliot Berman <quic_eberman@...cinc.com>
To: Rob Herring <robh+dt@...nel.org>, Frank Rowand <frowand.list@...il.com>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@...aro.org>,
Conor Dooley
<conor+dt@...nel.org>,
Bjorn Andersson <andersson@...nel.org>,
Konrad Dybcio
<konrad.dybcio@...aro.org>
CC: Amrit Anand <quic_amrianan@...cinc.com>,
Peter Griffin
<peter.griffin@...aro.org>,
Caleb Connolly <caleb.connolly@...aro.org>,
"Andy
Gross" <agross@...nel.org>,
Konrad Dybcio <konrad.dybcio@...aro.org>,
"Doug
Anderson" <dianders@...omium.org>,
Simon Glass <sjg@...omium.org>, "Chen-Yu
Tsai" <wenst@...omium.org>,
Julius Werner <jwerner@...omium.org>,
"Humphreys,
Jonathan" <j-humphreys@...com>,
Sumit Garg <sumit.garg@...aro.org>,
"Jon
Hunter" <jonathanh@...dia.org>,
Michal Simek <michal.simek@....com>,
<boot-architecture@...ts.linaro.org>, <devicetree@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, <linux-arm-kernel@...ts.infradead.org>,
<linux-arm-msm@...r.kernel.org>,
Elliot Berman <quic_eberman@...cinc.com>
Subject: [PATCH RFC v3 3/9] fdt-select-board: Add test tool for selecting
dtbs based on board-id
Introduce a tool which scores devicetrees based on their board-id and a
supplied reference devicetree. This mechanism would be most similar to
an proposal to EBBR where firmware provides a reference devicetree which
contains the actual board identifier values, and an OS loader can
choose to replace (or overlay) the firmware-provided devicetree.
Signed-off-by: Elliot Berman <quic_eberman@...cinc.com>
---
scripts/dtc/.gitignore | 1 +
scripts/dtc/Makefile | 3 +-
scripts/dtc/fdt-select-board.c | 126 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 129 insertions(+), 1 deletion(-)
diff --git a/scripts/dtc/.gitignore b/scripts/dtc/.gitignore
index e0b5c1d2464a..7f6d5202c0ba 100644
--- a/scripts/dtc/.gitignore
+++ b/scripts/dtc/.gitignore
@@ -1,3 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
/dtc
/fdtoverlay
+/fdt-select-board
diff --git a/scripts/dtc/Makefile b/scripts/dtc/Makefile
index 4d32b9497da9..a331f07091b3 100644
--- a/scripts/dtc/Makefile
+++ b/scripts/dtc/Makefile
@@ -2,7 +2,7 @@
# scripts/dtc makefile
# *** Also keep .gitignore in sync when changing ***
-hostprogs-always-$(CONFIG_DTC) += dtc fdtoverlay
+hostprogs-always-$(CONFIG_DTC) += dtc fdtoverlay fdt-select-board
hostprogs-always-$(CHECK_DT_BINDING) += dtc
dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
@@ -14,6 +14,7 @@ dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
libfdt-objs := fdt.o fdt_ro.o fdt_wip.o fdt_sw.o fdt_rw.o fdt_strerror.o fdt_empty_tree.o fdt_addresses.o fdt_overlay.o
libfdt = $(addprefix libfdt/,$(libfdt-objs))
fdtoverlay-objs := $(libfdt) fdtoverlay.o util.o
+fdt-select-board-objs := $(libfdt) fdt-select-board.o util.o
# Source files need to get at the userspace version of libfdt_env.h to compile
HOST_EXTRACFLAGS += -I $(srctree)/$(src)/libfdt
diff --git a/scripts/dtc/fdt-select-board.c b/scripts/dtc/fdt-select-board.c
new file mode 100644
index 000000000000..a7f3dc715ed1
--- /dev/null
+++ b/scripts/dtc/fdt-select-board.c
@@ -0,0 +1,126 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+#include <ctype.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include <libfdt.h>
+
+#include "util.h"
+
+static const char usage_synopsis[] =
+ "find the best matching device tree from a reference board\n"
+ " fdt-select-board <options> [<candidate.dtb>]\n"
+ "\n";
+static const char usage_short_opts[] = "r:av" USAGE_COMMON_SHORT_OPTS;
+static const struct option usage_long_opts[] = {
+ {"reference", required_argument, NULL, 'r'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"all", no_argument, NULL, 'a'},
+ USAGE_COMMON_LONG_OPTS
+};
+
+static const char * const usage_opts_help[] = {
+ "Reference DTB",
+ "Verbose messages",
+ "List all matches",
+ USAGE_COMMON_OPTS_HELP
+};
+
+int verbose = 0;
+
+struct context {
+ const void *fdt;
+ int node;
+};
+
+static const void *get_board_id(void *ctx, const char *name, int *datalen)
+{
+ struct context *c = ctx;
+
+ return fdt_getprop(c->fdt, c->node, name, datalen);
+}
+
+int main(int argc, char *argv[])
+{
+ int opt;
+ char *input_filename = NULL;
+ const void *fdt;
+ const void *ref;
+ int ref_node;
+ int max_score = -1;
+ const char *best_match = NULL;
+ struct context ctx;
+ int all = 0;
+
+ while ((opt = util_getopt_long()) != EOF) {
+ switch (opt) {
+ case_USAGE_COMMON_FLAGS
+
+ case 'a':
+ all = 1;
+ break;
+ case 'r':
+ input_filename = optarg;
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ }
+ }
+
+ if (!input_filename)
+ usage("missing reference file");
+
+ argv += optind;
+ argc -= optind;
+
+ if (argc <= 0)
+ usage("missing candidate dtbs");
+
+ ref = utilfdt_read(input_filename, NULL);
+ if (!ref) {
+ fprintf(stderr, "failed to read reference %s\n", input_filename);
+ return -1;
+ }
+
+ ref_node = fdt_path_offset(ref, "/board-id");
+ if (ref_node < 0) {
+ fprintf(stderr, "reference blob doesn't have a board-id\n");
+ return -1;
+ }
+
+ ctx.fdt = ref;
+ ctx.node = ref_node;
+
+ for (; argc > 0; --argc, ++argv) {
+ int score;
+
+ fdt = utilfdt_read(*argv, NULL);
+ if (!fdt) {
+ fprintf(stderr, "failed to read %s\n", *argv);
+ return -1;
+ }
+
+ score = fdt_board_id_score(fdt, get_board_id, &ctx);
+ if (verbose || (score > 0 && all))
+ printf("%s: %d\n", *argv, score);
+
+ if (score > max_score) {
+ max_score = score;
+ best_match = *argv;
+ }
+
+ free(fdt);
+ }
+
+ if (best_match && !all)
+ printf("%s\n", best_match);
+
+ return 0;
+}
--
2.34.1
Powered by blists - more mailing lists