* [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga
@ 2026-10-20 15:35 Douglas Anderson
2026-10-20 15:35 ` [RFC PATCH 1/7] scripts/dtc: Add fdtget.c and fdtput.c to sync script Douglas Anderson
` (7 more replies)
0 siblings, 8 replies; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson, Alice Ryhl,
Andrew Jones, Bjorn Andersson, Breno Leitao, David Sterba,
Gary Guo, Josh Poimboeuf, Luis Augenstein, Marco Elver,
Mark Rutland, Masahiro Yamada, Miguel Ojeda, Nick Terrell,
Peter Zijlstra (Intel), Rong Xu, Thomas Weißschuh,
cros-qcom-dts-watchers, devicetree, linux-samsung-soc
The end goal of this series is to move forward on producing a
"universal" Pixel 10 boot image that can boot on a variety of Pixel
10 devices (frankel, blazer, and mustang and eventually multiple
revisions of each). At the moment, this is impossible since the Pixel
10 bootloader:
* Picks the base devicetree based on SoC ID information.
* Picks an overlay devicetree based on Board ID information.
* Needs metadata associated with each overlay to match it up.
Since we don't have per-board overlays and don't have per-board
metadata, that means that today you need to pick exactly one revision
of one board and build a boot image just for that.
How does this series help us?
1. It uses a checked-in .its script to associate metadata with each
board's devicetree. Other tools can parse this metadata in order to
craft a package that the Pixel bootloader can understand.
2. It integrates a call to the new `fdtfactor` tool [1], which results
in a "base dtb + board dtbo" that looks like what the bootloader
needs, at least as long as all the boards have the same SoC.
What happens if everyone hates this series and it gets dropped on the
floor? Honestly, everything here could just go out of tree and it
would be "fine". IMO it's nice to have the Board ID / SoC ID
information for each devicetree stored in the same repository as the
devicetrees themselves are, but if this has to live somewhere else
then so be it.
NOTE: from reading the above, you might wonder why the sc7180-trogdor
.its script is part of this series. The answer: it's a board I was
previously deeply involved in and it is a convenient way for me to
prove out that the Chromebook use case works well. I did hack up some
changes to the ChromeOS build system to use the provided FIT image and
it worked great, but since I'm not on the ChromeOS team these days
it's not something I personally plan to follow-up with. It sounds
plausible that Chen-Yu may follow-up with it or post a similar change
for some Mediatek Chromebooks.
[1] http://lore.kernel.org/r/20261015182221.2931742-1-dianders@chromium.org
Douglas Anderson (7):
scripts/dtc: Add fdtget.c and fdtput.c to sync script
scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b
scripts/dtc: Build fdtget and fdtput host tools
arm64: boot: Support building image.fit from a specified FIT_ITS
script
kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor
arm64: dts: google: lga: Add lga.its FIT image script
arm64: dts: qcom: sc7180: Add sc7180-trogdor.its FIT image script
Makefile | 2 +-
arch/arm64/Makefile | 3 +
arch/arm64/boot/Makefile | 9 +-
arch/arm64/boot/dts/google/lga.its | 68 ++
arch/arm64/boot/dts/qcom/sc7180-trogdor.its | 728 ++++++++++++++++++++
scripts/Makefile.dtbs | 51 +-
scripts/Makefile.lib | 67 +-
scripts/dtc/.gitignore | 2 +
scripts/dtc/Makefile | 6 +-
scripts/dtc/checks.c | 2 +-
scripts/dtc/fdtget.c | 207 +++---
scripts/dtc/fdtput.c | 280 ++++++--
scripts/dtc/libfdt/fdt_ro.c | 2 +
scripts/dtc/libfdt/fdt_rw.c | 41 +-
scripts/dtc/libfdt/fdt_sw.c | 3 +-
scripts/dtc/libfdt/libfdt.h | 70 +-
scripts/dtc/livetree.c | 2 +-
scripts/dtc/update-dtc-source.sh | 4 +-
scripts/dtc/version_gen.h | 2 +-
19 files changed, 1322 insertions(+), 227 deletions(-)
create mode 100644 arch/arm64/boot/dts/google/lga.its
create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor.its
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply [flat|nested] 19+ messages in thread
* [RFC PATCH 1/7] scripts/dtc: Add fdtget.c and fdtput.c to sync script
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
@ 2026-10-20 15:35 ` Douglas Anderson
2026-10-24 8:16 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 2/7] scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b Douglas Anderson
` (6 subsequent siblings)
7 siblings, 1 reply; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson, devicetree
fdtget.c and fdtput.c were imported into scripts/dtc/ in commit
cd296721a964 ("dtc: import latest upstream dtc") prior to the creation
of update-dtc-source.sh, and were never added to the sync script.
Add FDTGET_SOURCE and FDTPUT_SOURCE to update-dtc-source.sh so they are
kept in sync with the rest of scripts/dtc/.
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
scripts/dtc/update-dtc-source.sh | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/scripts/dtc/update-dtc-source.sh b/scripts/dtc/update-dtc-source.sh
index 94627541533e..f21da460742e 100755
--- a/scripts/dtc/update-dtc-source.sh
+++ b/scripts/dtc/update-dtc-source.sh
@@ -38,6 +38,8 @@ LIBFDT_SOURCE="fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \
fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \
fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"
FDTOVERLAY_SOURCE=fdtoverlay.c
+FDTGET_SOURCE=fdtget.c
+FDTPUT_SOURCE=fdtput.c
get_last_dtc_version() {
git log --oneline scripts/dtc/ | grep 'upstream' | head -1 | sed -e 's/^.* \(.*\)/\1/'
@@ -55,7 +57,7 @@ dtc_log=$(git log --oneline ${last_dtc_ver}..)
# Copy the files into the Linux tree
cd $DTC_LINUX_PATH
-for f in $DTC_SOURCE $FDTOVERLAY_SOURCE; do
+for f in $DTC_SOURCE $FDTOVERLAY_SOURCE $FDTGET_SOURCE $FDTPUT_SOURCE; do
cp ${DTC_UPSTREAM_PATH}/${f} ${f}
git add ${f}
done
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 2/7] scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
2026-10-20 15:35 ` [RFC PATCH 1/7] scripts/dtc: Add fdtget.c and fdtput.c to sync script Douglas Anderson
@ 2026-10-20 15:35 ` Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 3/7] scripts/dtc: Build fdtget and fdtput host tools Douglas Anderson
` (5 subsequent siblings)
7 siblings, 1 reply; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson, devicetree
This adds the following commits from upstream:
f3451d12532b meson: Only take the version from dtc's own git repository
7a1e01792600 libfdt: pass sources as keyword argument to library()
8c37c14c95d9 fdtget: Use libfdt iterators instead of open coded loops
89c99ce78ac8 pylibfdt: Add add_mem_rsv() and del_mem_rsv()
3750493c8b0f pylibfdt: Add address_cells() and size_cells()
0748c384fde6 pylibfdt: Grow the FdtSw buffer geometrically
5008d1d6a356 pylibfdt: Replace removed SWIG Python 2 compatibility macros
66e1201c3775 libfdt: fdt_check_full: Add can_assume(PERFECT) check
214372a27398 tests: Replace trees.S/dumptrees with treegen for making test dtbs
4df9ca4c8ddb tests: Add treegen, a pure C replacement for trees.S + dumptrees
f116f4800edc tests: Dont have test cases link directly against example dtb data
9b53b9a4c2f9 tests: Add missing unterminated_memrsv to dumptrees
5f919a25d71b ci: Merge make and meson jobs using build matrix
6c1426dfa963 ci: Add macOS support to install-deps.sh
23fd89bc8ed8 ci: Move FreeBSD CI from Cirrus CI to GitHub Actions
3ad5ebbdd9d5 ci: Upgrade actions/checkout v4 to v6 for Node.js 24 support
4ad496846a12 Set default permissions for workflows
c0e1d0fd58d4 livetree: Fix a comparison of integers with different signedness
d245851f0629 tests: Avoid -Wconstant-logical-operand warnings in integer-expressions.c
a74b952f94c8 tests: Fix mkdir() call for Windows compatibility
d320877b07d1 tests: More portable installation of SIGINT handler
84d13508d59d tests: Remove unused cleanup() mechanism from tests
8f48565e5cfe Bump version to v1.8.1
25a368100a98 docs: Improvements to release creation tooling
040c1f7e29e2 libfdt: Revert accidental ABI breakage
b1337df19598 Bump version to v1.8.0
83cdc93ca900 ci: Add macOS build to GitHub Actions
1aaa44849b9a ci: Skip swig install for mingw32 Windows build
dd1c7f1a919e docs: Add CLAUDE.md referencing AGENTS.md
7fdf750154e9 docs: Add release tagging procedure and finalize-release script
5c35036b2c83 docs: Add AI contribution guidelines
f57e7df35df4 libfdt: fix UBSAN null pointer in fdt_property()
2164019f8483 checks: Add missing phandle_references prereq to interrupts_property
47d7c01ba8a1 libfdt: Fix bugs with unchecked usage of fdt_num_mem_rsv()
f551be7b39c8 libfdt: Standardise returns annotation in function documentation
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
scripts/dtc/checks.c | 2 +-
scripts/dtc/fdtget.c | 207 +++++++++++++-------------
scripts/dtc/fdtput.c | 280 +++++++++++++++++++++++++++---------
scripts/dtc/libfdt/fdt_ro.c | 2 +
scripts/dtc/libfdt/fdt_rw.c | 41 +++++-
scripts/dtc/libfdt/fdt_sw.c | 3 +-
scripts/dtc/libfdt/libfdt.h | 70 +++++----
scripts/dtc/livetree.c | 2 +-
scripts/dtc/version_gen.h | 2 +-
9 files changed, 391 insertions(+), 218 deletions(-)
diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c
index 946c1429e0f1..a6037ed08000 100644
--- a/scripts/dtc/checks.c
+++ b/scripts/dtc/checks.c
@@ -1769,7 +1769,7 @@ static void check_interrupts_property(struct check *c,
irq_prop->val.len, (int)(irq_cells * sizeof(cell_t)));
}
}
-WARNING(interrupts_property, check_interrupts_property, &phandle_references);
+WARNING(interrupts_property, check_interrupts_property, NULL, &phandle_references);
static const struct bus_type graph_port_bus = {
.name = "graph-port",
diff --git a/scripts/dtc/fdtget.c b/scripts/dtc/fdtget.c
index c922f82246c6..c61696912cda 100644
--- a/scripts/dtc/fdtget.c
+++ b/scripts/dtc/fdtget.c
@@ -39,6 +39,43 @@ static void report_error(const char *where, int err)
fprintf(stderr, "Error at '%s': %s\n", where, fdt_strerror(err));
}
+/**
+ * Shows a list of cells in the requested format
+ *
+ * @param disp Display information / options
+ * @param data Data to display
+ * @param len Maximum length of buffer
+ * @param size Data size to use for display (e.g. 4 for 32-bit)
+ * @return 0 if ok, -1 on error
+ */
+static int show_cell_list(struct display_info *disp, const char *data, int len,
+ int size)
+{
+ const uint8_t *p = (const uint8_t *)data;
+ char fmt[3];
+ int value;
+ int i;
+
+ fmt[0] = '%';
+ fmt[1] = disp->type ? disp->type : 'd';
+ fmt[2] = '\0';
+ for (i = 0; i < len; i += size, p += size) {
+ if (i)
+ printf(" ");
+ switch (size) {
+ case 4: value = fdt32_ld((const fdt32_t *)p); break;
+ case 2: value = fdt16_ld((const fdt16_t *)p); break;
+ case 1:
+ default:
+ value = *p;
+ break;
+ }
+ printf(fmt, value);
+ }
+
+ return 0;
+}
+
/**
* Displays data of a given length according to selected options
*
@@ -52,17 +89,19 @@ static void report_error(const char *where, int err)
*/
static int show_data(struct display_info *disp, const char *data, int len)
{
- int i, size;
- const uint8_t *p = (const uint8_t *)data;
+ int size;
const char *s;
- int value;
int is_string;
- char fmt[3];
/* no data, don't print */
if (len == 0)
return 0;
+ if (disp->type == 'r') {
+ fwrite(data, 1, len, stdout);
+ return 0;
+ }
+
is_string = (disp->type) == 's' ||
(!disp->type && util_is_printable_string(data, len));
if (is_string) {
@@ -85,17 +124,8 @@ static int show_data(struct display_info *disp, const char *data, int len)
"selected data size\n");
return -1;
}
- fmt[0] = '%';
- fmt[1] = disp->type ? disp->type : 'd';
- fmt[2] = '\0';
- for (i = 0; i < len; i += size, p += size) {
- if (i)
- printf(" ");
- value = size == 4 ? fdt32_to_cpu(*(const uint32_t *)p) :
- size == 2 ? (*p << 8) | p[1] : *p;
- printf(fmt, value);
- }
- return 0;
+
+ return show_cell_list(disp, data, len, size);
}
/**
@@ -107,24 +137,21 @@ static int show_data(struct display_info *disp, const char *data, int len)
*/
static int list_properties(const void *blob, int node)
{
- const struct fdt_property *data;
const char *name;
+ const void *p;
int prop;
- prop = fdt_first_property_offset(blob, node);
- do {
- /* Stop silently when there are no more properties */
- if (prop < 0)
- return prop == -FDT_ERR_NOTFOUND ? 0 : prop;
- data = fdt_get_property_by_offset(blob, prop, NULL);
- name = fdt_string(blob, fdt32_to_cpu(data->nameoff));
- if (name)
+ fdt_for_each_property_offset(prop, blob, node) {
+ p = fdt_getprop_by_offset(blob, prop, &name, NULL);
+ if (p && name)
puts(name);
- prop = fdt_next_property_offset(blob, prop);
- } while (1);
-}
+ }
-#define MAX_LEVEL 32 /* how deeply nested we will go */
+ if ((prop < 0) && (prop != -FDT_ERR_NOTFOUND))
+ return prop;
+
+ return 0;
+}
/**
* List all subnodes in a node, one per line
@@ -135,47 +162,21 @@ static int list_properties(const void *blob, int node)
*/
static int list_subnodes(const void *blob, int node)
{
- int nextoffset; /* next node offset from libfdt */
- uint32_t tag; /* current tag */
- int level = 0; /* keep track of nesting level */
const char *pathp;
- int depth = 1; /* the assumed depth of this node */
-
- while (level >= 0) {
- tag = fdt_next_tag(blob, node, &nextoffset);
- switch (tag) {
- case FDT_BEGIN_NODE:
- pathp = fdt_get_name(blob, node, NULL);
- if (level <= depth) {
- if (pathp == NULL)
- pathp = "/* NULL pointer error */";
- if (*pathp == '\0')
- pathp = "/"; /* root is nameless */
- if (level == 1)
- puts(pathp);
- }
- level++;
- if (level >= MAX_LEVEL) {
- printf("Nested too deep, aborting.\n");
- return 1;
- }
- break;
- case FDT_END_NODE:
- level--;
- if (level == 0)
- level = -1; /* exit the loop */
- break;
- case FDT_END:
- return 1;
- case FDT_PROP:
- break;
- default:
- if (level <= depth)
- printf("Unknown tag 0x%08X\n", tag);
- return 1;
- }
- node = nextoffset;
+ int subnode;
+
+ fdt_for_each_subnode(subnode, blob, node) {
+ pathp = fdt_get_name(blob, subnode, NULL);
+ if (pathp == NULL)
+ pathp = "/* NULL pointer error */";
+ if (*pathp == '\0')
+ pathp = "/"; /* root is nameless */
+ puts(pathp);
}
+
+ if (subnode < 0 && (subnode != -FDT_ERR_NOTFOUND))
+ return subnode;
+
return 0;
}
@@ -231,7 +232,7 @@ static int show_data_for_item(const void *blob, struct display_info *disp,
* @param filename Filename of blob file
* @param arg List of arguments to process
* @param arg_count Number of arguments
- * @param return 0 if ok, -ve on error
+ * @return 0 if ok, -ve on error
*/
static int do_fdtget(struct display_info *disp, const char *filename,
char **arg, int arg_count, int args_per_step)
@@ -240,7 +241,7 @@ static int do_fdtget(struct display_info *disp, const char *filename,
const char *prop;
int i, node;
- blob = utilfdt_read(filename);
+ blob = utilfdt_read(filename, NULL);
if (!blob)
return -1;
@@ -252,44 +253,50 @@ static int do_fdtget(struct display_info *disp, const char *filename,
continue;
} else {
report_error(arg[i], node);
+ free(blob);
return -1;
}
}
prop = args_per_step == 1 ? NULL : arg[i + 1];
- if (show_data_for_item(blob, disp, node, prop))
+ if (show_data_for_item(blob, disp, node, prop)) {
+ free(blob);
return -1;
+ }
}
+
+ free(blob);
+
return 0;
}
-static const char *usage_msg =
- "fdtget - read values from device tree\n"
- "\n"
- "Each value is printed on a new line.\n\n"
- "Usage:\n"
+/* Usage related data. */
+static const char usage_synopsis[] =
+ "read values from device tree\n"
" fdtget <options> <dt file> [<node> <property>]...\n"
" fdtget -p <options> <dt file> [<node> ]...\n"
- "Options:\n"
- "\t-t <type>\tType of data\n"
- "\t-p\t\tList properties for each node\n"
- "\t-l\t\tList subnodes for each node\n"
- "\t-d\t\tDefault value to display when the property is "
- "missing\n"
- "\t-h\t\tPrint this help\n\n"
+ "\n"
+ "Each value is printed on a new line.\n"
USAGE_TYPE_MSG;
-
-static void usage(const char *msg)
-{
- if (msg)
- fprintf(stderr, "Error: %s\n\n", msg);
-
- fprintf(stderr, "%s", usage_msg);
- exit(2);
-}
+static const char usage_short_opts[] = "t:pld:" USAGE_COMMON_SHORT_OPTS;
+static struct option const usage_long_opts[] = {
+ {"type", a_argument, NULL, 't'},
+ {"properties", no_argument, NULL, 'p'},
+ {"list", no_argument, NULL, 'l'},
+ {"default", a_argument, NULL, 'd'},
+ USAGE_COMMON_LONG_OPTS,
+};
+static const char * const usage_opts_help[] = {
+ "Type of data",
+ "List properties for each node",
+ "List subnodes for each node",
+ "Default value to display when the property is missing",
+ USAGE_COMMON_OPTS_HELP
+};
int main(int argc, char *argv[])
{
+ int opt;
char *filename = NULL;
struct display_info disp;
int args_per_step = 2;
@@ -298,20 +305,14 @@ int main(int argc, char *argv[])
memset(&disp, '\0', sizeof(disp));
disp.size = -1;
disp.mode = MODE_SHOW_VALUE;
- for (;;) {
- int c = getopt(argc, argv, "d:hlpt:");
- if (c == -1)
- break;
-
- switch (c) {
- case 'h':
- case '?':
- usage(NULL);
+ while ((opt = util_getopt_long()) != EOF) {
+ switch (opt) {
+ case_USAGE_COMMON_FLAGS
case 't':
if (utilfdt_decode_type(optarg, &disp.type,
&disp.size))
- usage("Invalid type string");
+ usage("invalid type string");
break;
case 'p':
@@ -333,7 +334,7 @@ int main(int argc, char *argv[])
if (optind < argc)
filename = argv[optind++];
if (!filename)
- usage("Missing filename");
+ usage("missing filename");
argv += optind;
argc -= optind;
@@ -344,7 +345,7 @@ int main(int argc, char *argv[])
/* Check for node, property arguments */
if (args_per_step == 2 && (argc % 2))
- usage("Must have an even number of arguments");
+ usage("must have an even number of arguments");
if (do_fdtget(&disp, filename, argv, argc, args_per_step))
return 1;
diff --git a/scripts/dtc/fdtput.c b/scripts/dtc/fdtput.c
index a363c3cabc59..fdb581a24271 100644
--- a/scripts/dtc/fdtput.c
+++ b/scripts/dtc/fdtput.c
@@ -9,6 +9,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include <libfdt.h>
@@ -18,6 +19,8 @@
enum oper_type {
OPER_WRITE_PROP, /* Write a property in a node */
OPER_CREATE_NODE, /* Create a new node */
+ OPER_REMOVE_NODE, /* Delete a node */
+ OPER_DELETE_PROP, /* Delete a property in a node */
};
struct display_info {
@@ -51,7 +54,7 @@ static void report_error(const char *name, int namelen, int err)
* @param arg List of arguments from command line
* @param arg_count Number of arguments (may be 0)
* @param valuep Returns buffer containing value
- * @param *value_len Returns length of value encoded
+ * @param value_len Returns length of value encoded
*/
static int encode_value(struct display_info *disp, char **arg, int arg_count,
char **valuep, int *value_len)
@@ -62,16 +65,12 @@ static int encode_value(struct display_info *disp, char **arg, int arg_count,
int len; /* length of this cell/string/byte */
int ival;
int upto; /* the number of bytes we have written to buf */
- char fmt[3];
upto = 0;
if (disp->verbose)
fprintf(stderr, "Decoding value:\n");
- fmt[0] = '%';
- fmt[1] = disp->type ? disp->type : 'd';
- fmt[2] = '\0';
for (; arg_count > 0; arg++, arg_count--, upto += len) {
/* assume integer unless told otherwise */
if (disp->type == 's')
@@ -82,12 +81,7 @@ static int encode_value(struct display_info *disp, char **arg, int arg_count,
/* enlarge our value buffer by a suitable margin if needed */
if (upto + len > value_size) {
value_size = (upto + len) + 500;
- value = realloc(value, value_size);
- if (!value) {
- fprintf(stderr, "Out of mmory: cannot alloc "
- "%d bytes\n", value_size);
- return -1;
- }
+ value = xrealloc(value, value_size);
}
ptr = value + upto;
@@ -96,8 +90,35 @@ static int encode_value(struct display_info *disp, char **arg, int arg_count,
if (disp->verbose)
fprintf(stderr, "\tstring: '%s'\n", ptr);
} else {
- int *iptr = (int *)ptr;
- sscanf(*arg, fmt, &ival);
+ fdt32_t *iptr = (fdt32_t *)ptr;
+ char *endptr;
+
+ errno = 0;
+ switch (disp->type) {
+ case 'x':
+ ival = strtoul(*arg, &endptr, 16);
+ break;
+ case 'o':
+ ival = strtoul(*arg, &endptr, 8);
+ break;
+ case 'i':
+ ival = strtol(*arg, &endptr, 0);
+ break;
+ case 'u':
+ ival = strtoul(*arg, &endptr, 0);
+ break;
+ default: /* 0 or 'd' */
+ ival = strtol(*arg, &endptr, 10);
+ }
+
+ if (*endptr != '\0' || errno) {
+ if (disp->verbose) {
+ fprintf(stderr,
+ "Couldn't parse \"%s\" as an integer\n",
+ *arg);
+ }
+ return -1;
+ }
if (len == 4)
*iptr = cpu_to_fdt32(ival);
else
@@ -117,19 +138,59 @@ static int encode_value(struct display_info *disp, char **arg, int arg_count,
return 0;
}
-static int store_key_value(void *blob, const char *node_name,
+#define ALIGN(x) (((x) + (FDT_TAGSIZE) - 1) & ~((FDT_TAGSIZE) - 1))
+
+static char *realloc_fdt(char *fdt, int delta)
+{
+ int new_sz = fdt_totalsize(fdt) + delta;
+ fdt = xrealloc(fdt, new_sz);
+ fdt_open_into(fdt, fdt, new_sz);
+ return fdt;
+}
+
+static char *realloc_node(char *fdt, const char *name)
+{
+ int delta;
+ /* FDT_BEGIN_NODE, node name in off_struct and FDT_END_NODE */
+ delta = sizeof(struct fdt_node_header) + ALIGN(strlen(name) + 1)
+ + FDT_TAGSIZE;
+ return realloc_fdt(fdt, delta);
+}
+
+static char *realloc_property(char *fdt, int nodeoffset,
+ const char *name, int newlen)
+{
+ int delta = 0;
+ int oldlen = 0;
+
+ if (!fdt_get_property(fdt, nodeoffset, name, &oldlen))
+ /* strings + property header */
+ delta = sizeof(struct fdt_property) + strlen(name) + 1;
+
+ if (newlen > oldlen)
+ /* actual value in off_struct */
+ delta += ALIGN(newlen) - ALIGN(oldlen);
+
+ return realloc_fdt(fdt, delta);
+}
+
+static int store_key_value(char **blob, const char *node_name,
const char *property, const char *buf, int len)
{
int node;
int err;
- node = fdt_path_offset(blob, node_name);
+ node = fdt_path_offset(*blob, node_name);
if (node < 0) {
report_error(node_name, -1, node);
return -1;
}
- err = fdt_setprop(blob, node, property, buf, len);
+ err = fdt_setprop(*blob, node, property, buf, len);
+ if (err == -FDT_ERR_NOSPACE) {
+ *blob = realloc_property(*blob, node, property, len);
+ err = fdt_setprop(*blob, node, property, buf, len);
+ }
if (err) {
report_error(property, -1, err);
return -1;
@@ -147,7 +208,7 @@ static int store_key_value(void *blob, const char *node_name,
* @param in_path Path to process
* @return 0 if ok, -1 on error
*/
-static int create_paths(void *blob, const char *in_path)
+static int create_paths(char **blob, const char *in_path)
{
const char *path = in_path;
const char *sep;
@@ -163,10 +224,11 @@ static int create_paths(void *blob, const char *in_path)
if (!sep)
sep = path + strlen(path);
- node = fdt_subnode_offset_namelen(blob, offset, path,
+ node = fdt_subnode_offset_namelen(*blob, offset, path,
sep - path);
if (node == -FDT_ERR_NOTFOUND) {
- node = fdt_add_subnode_namelen(blob, offset, path,
+ *blob = realloc_node(*blob, path);
+ node = fdt_add_subnode_namelen(*blob, offset, path,
sep - path);
}
if (node < 0) {
@@ -189,27 +251,31 @@ static int create_paths(void *blob, const char *in_path)
* @param node_name Name of node to create
* @return new node offset if found, or -1 on failure
*/
-static int create_node(void *blob, const char *node_name)
+static int create_node(char **blob, const char *node_name)
{
int node = 0;
- char *p;
+ const char *p;
+ char *path = NULL;
p = strrchr(node_name, '/');
if (!p) {
report_error(node_name, -1, -FDT_ERR_BADPATH);
return -1;
}
- *p = '\0';
+
+ *blob = realloc_node(*blob, p + 1);
if (p > node_name) {
- node = fdt_path_offset(blob, node_name);
+ path = xstrndup(node_name, (size_t)(p - node_name));
+ node = fdt_path_offset(*blob, path);
+ free(path);
if (node < 0) {
report_error(node_name, -1, node);
return -1;
}
}
- node = fdt_add_subnode(blob, node, p + 1);
+ node = fdt_add_subnode(*blob, node, p + 1);
if (node < 0) {
report_error(p + 1, -1, node);
return -1;
@@ -218,14 +284,68 @@ static int create_node(void *blob, const char *node_name)
return 0;
}
+/**
+ * Delete a property of a node in the fdt.
+ *
+ * @param blob FDT blob to write into
+ * @param node_name Path to node containing the property to delete
+ * @param prop_name Name of property to delete
+ * @return 0 on success, or -1 on failure
+ */
+static int delete_prop(char *blob, const char *node_name, const char *prop_name)
+{
+ int node = 0;
+
+ node = fdt_path_offset(blob, node_name);
+ if (node < 0) {
+ report_error(node_name, -1, node);
+ return -1;
+ }
+
+ node = fdt_delprop(blob, node, prop_name);
+ if (node < 0) {
+ report_error(node_name, -1, node);
+ return -1;
+ }
+
+ return 0;
+}
+
+/**
+ * Delete a node in the fdt.
+ *
+ * @param blob FDT blob to write into
+ * @param node_name Name of node to delete
+ * @return 0 on success, or -1 on failure
+ */
+static int delete_node(char *blob, const char *node_name)
+{
+ int node = 0;
+
+ node = fdt_path_offset(blob, node_name);
+ if (node < 0) {
+ report_error(node_name, -1, node);
+ return -1;
+ }
+
+ node = fdt_del_node(blob, node);
+ if (node < 0) {
+ report_error(node_name, -1, node);
+ return -1;
+ }
+
+ return 0;
+}
+
static int do_fdtput(struct display_info *disp, const char *filename,
char **arg, int arg_count)
{
- char *value;
+ char *value = NULL;
char *blob;
+ char *node;
int len, ret = 0;
- blob = utilfdt_read(filename);
+ blob = utilfdt_read(filename, NULL);
if (!blob)
return -1;
@@ -236,82 +356,102 @@ static int do_fdtput(struct display_info *disp, const char *filename,
* store them into the property.
*/
assert(arg_count >= 2);
- if (disp->auto_path && create_paths(blob, *arg))
+ if (disp->auto_path && create_paths(&blob, *arg))
return -1;
if (encode_value(disp, arg + 2, arg_count - 2, &value, &len) ||
- store_key_value(blob, *arg, arg[1], value, len))
+ store_key_value(&blob, *arg, arg[1], value, len))
ret = -1;
break;
case OPER_CREATE_NODE:
for (; ret >= 0 && arg_count--; arg++) {
if (disp->auto_path)
- ret = create_paths(blob, *arg);
+ ret = create_paths(&blob, *arg);
else
- ret = create_node(blob, *arg);
+ ret = create_node(&blob, *arg);
}
break;
+ case OPER_REMOVE_NODE:
+ for (; ret >= 0 && arg_count--; arg++)
+ ret = delete_node(blob, *arg);
+ break;
+ case OPER_DELETE_PROP:
+ node = *arg;
+ for (arg++; ret >= 0 && arg_count-- > 1; arg++)
+ ret = delete_prop(blob, node, *arg);
+ break;
}
- if (ret >= 0)
+ if (ret >= 0) {
+ fdt_pack(blob);
ret = utilfdt_write(filename, blob);
+ }
free(blob);
+
+ if (value) {
+ free(value);
+ }
+
return ret;
}
-static const char *usage_msg =
- "fdtput - write a property value to a device tree\n"
- "\n"
- "The command line arguments are joined together into a single value.\n"
- "\n"
- "Usage:\n"
+/* Usage related data. */
+static const char usage_synopsis[] =
+ "write a property value to a device tree\n"
" fdtput <options> <dt file> <node> <property> [<value>...]\n"
" fdtput -c <options> <dt file> [<node>...]\n"
- "Options:\n"
- "\t-c\t\tCreate nodes if they don't already exist\n"
- "\t-p\t\tAutomatically create nodes as needed for the node path\n"
- "\t-t <type>\tType of data\n"
- "\t-v\t\tVerbose: display each value decoded from command line\n"
- "\t-h\t\tPrint this help\n\n"
+ " fdtput -r <options> <dt file> [<node>...]\n"
+ " fdtput -d <options> <dt file> <node> [<property>...]\n"
+ "\n"
+ "The command line arguments are joined together into a single value.\n"
USAGE_TYPE_MSG;
-
-static void usage(const char *msg)
-{
- if (msg)
- fprintf(stderr, "Error: %s\n\n", msg);
-
- fprintf(stderr, "%s", usage_msg);
- exit(2);
-}
+static const char usage_short_opts[] = "crdpt:v" USAGE_COMMON_SHORT_OPTS;
+static struct option const usage_long_opts[] = {
+ {"create", no_argument, NULL, 'c'},
+ {"remove", no_argument, NULL, 'r'},
+ {"delete", no_argument, NULL, 'd'},
+ {"auto-path", no_argument, NULL, 'p'},
+ {"type", a_argument, NULL, 't'},
+ {"verbose", no_argument, NULL, 'v'},
+ USAGE_COMMON_LONG_OPTS,
+};
+static const char * const usage_opts_help[] = {
+ "Create nodes",
+ "Delete nodes (and any subnodes)",
+ "Delete properties if they already exist",
+ "Automatically create nodes as needed for the node path",
+ "Type of data",
+ "Display each value decoded from command line",
+ USAGE_COMMON_OPTS_HELP
+};
int main(int argc, char *argv[])
{
+ int opt;
struct display_info disp;
char *filename = NULL;
memset(&disp, '\0', sizeof(disp));
disp.size = -1;
disp.oper = OPER_WRITE_PROP;
- for (;;) {
- int c = getopt(argc, argv, "chpt:v");
- if (c == -1)
- break;
-
+ while ((opt = util_getopt_long()) != EOF) {
/*
* TODO: add options to:
- * - delete property
- * - delete node (optionally recursively)
* - rename node
* - pack fdt before writing
* - set amount of free space when writing
- * - expand fdt if value doesn't fit
*/
- switch (c) {
+ switch (opt) {
+ case_USAGE_COMMON_FLAGS
+
case 'c':
disp.oper = OPER_CREATE_NODE;
break;
- case 'h':
- case '?':
- usage(NULL);
+ case 'r':
+ disp.oper = OPER_REMOVE_NODE;
+ break;
+ case 'd':
+ disp.oper = OPER_DELETE_PROP;
+ break;
case 'p':
disp.auto_path = 1;
break;
@@ -319,6 +459,8 @@ int main(int argc, char *argv[])
if (utilfdt_decode_type(optarg, &disp.type,
&disp.size))
usage("Invalid type string");
+ if (disp.type == 'r')
+ usage("Unsupported raw data type");
break;
case 'v':
@@ -330,18 +472,22 @@ int main(int argc, char *argv[])
if (optind < argc)
filename = argv[optind++];
if (!filename)
- usage("Missing filename");
+ usage("missing filename");
argv += optind;
argc -= optind;
if (disp.oper == OPER_WRITE_PROP) {
if (argc < 1)
- usage("Missing node");
+ usage("missing node");
if (argc < 2)
- usage("Missing property");
+ usage("missing property");
}
+ if (disp.oper == OPER_DELETE_PROP)
+ if (argc < 1)
+ usage("missing node");
+
if (do_fdtput(&disp, filename, argv, argc))
return 1;
return 0;
diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c
index 63494fb7ad90..11f2e2ee0be3 100644
--- a/scripts/dtc/libfdt/fdt_ro.c
+++ b/scripts/dtc/libfdt/fdt_ro.c
@@ -191,6 +191,8 @@ int fdt_num_mem_rsv(const void *fdt)
int i;
const struct fdt_reserve_entry *re;
+ FDT_RO_PROBE(fdt);
+
for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) {
if (fdt64_ld_(&re->size) == 0)
return i;
diff --git a/scripts/dtc/libfdt/fdt_rw.c b/scripts/dtc/libfdt/fdt_rw.c
index 90ea14e944cc..850aafe44d27 100644
--- a/scripts/dtc/libfdt/fdt_rw.c
+++ b/scripts/dtc/libfdt/fdt_rw.c
@@ -166,7 +166,11 @@ int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
FDT_RW_PROBE(fdt);
- re = fdt_mem_rsv_w_(fdt, fdt_num_mem_rsv(fdt));
+ err = fdt_num_mem_rsv(fdt);
+ if (err < 0)
+ return err;
+
+ re = fdt_mem_rsv_w_(fdt, err);
err = fdt_splice_mem_rsv_(fdt, re, 0, 1);
if (err)
return err;
@@ -179,10 +183,15 @@ int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
int fdt_del_mem_rsv(void *fdt, int n)
{
struct fdt_reserve_entry *re = fdt_mem_rsv_w_(fdt, n);
+ int num;
FDT_RW_PROBE(fdt);
- if (n >= fdt_num_mem_rsv(fdt))
+ num = fdt_num_mem_rsv(fdt);
+ if (num < 0)
+ return num;
+
+ if (n >= num)
return -FDT_ERR_NOTFOUND;
return fdt_splice_mem_rsv_(fdt, re, 1, 0);
@@ -283,6 +292,13 @@ int fdt_setprop_placeholder_namelen(void *fdt, int nodeoffset, const char *name,
return 0;
}
+int fdt_setprop_placeholder(void *fdt, int nodeoffset,
+ const char *name, int len, void **prop_data)
+{
+ return fdt_setprop_placeholder_namelen(fdt, nodeoffset, name,
+ strlen(name), len, prop_data);
+}
+
int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name,
int namelen, const void *val, int len)
{
@@ -299,6 +315,13 @@ int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name,
return 0;
}
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+ const void *val, int len)
+{
+ return fdt_setprop_namelen(fdt, nodeoffset, name, strlen(name), val,
+ len);
+}
+
int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
const void *val, int len)
{
@@ -439,8 +462,10 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
FDT_RO_PROBE(fdt);
- mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
- * sizeof(struct fdt_reserve_entry);
+ err = fdt_num_mem_rsv(fdt);
+ if (err < 0)
+ return err;
+ mem_rsv_size = (err + 1) * sizeof(struct fdt_reserve_entry);
if (can_assume(LATEST) || fdt_version(fdt) >= 17) {
struct_size = fdt_size_dt_struct(fdt);
@@ -498,12 +523,14 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
int fdt_pack(void *fdt)
{
- int mem_rsv_size;
+ int err, mem_rsv_size;
FDT_RW_PROBE(fdt);
- mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
- * sizeof(struct fdt_reserve_entry);
+ err = fdt_num_mem_rsv(fdt);
+ if (err < 0)
+ return err;
+ mem_rsv_size = (err+1) * sizeof(struct fdt_reserve_entry);
fdt_packblocks_(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt),
fdt_size_dt_strings(fdt));
fdt_set_totalsize(fdt, fdt_data_size_(fdt));
diff --git a/scripts/dtc/libfdt/fdt_sw.c b/scripts/dtc/libfdt/fdt_sw.c
index 4c569ee7eb0d..96d4cf571319 100644
--- a/scripts/dtc/libfdt/fdt_sw.c
+++ b/scripts/dtc/libfdt/fdt_sw.c
@@ -330,7 +330,8 @@ int fdt_property(void *fdt, const char *name, const void *val, int len)
ret = fdt_property_placeholder(fdt, name, len, &ptr);
if (ret)
return ret;
- memcpy(ptr, val, len);
+ if (len)
+ memcpy(ptr, val, len);
return 0;
}
diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
index 81aaf7cbae13..ca91d712efe8 100644
--- a/scripts/dtc/libfdt/libfdt.h
+++ b/scripts/dtc/libfdt/libfdt.h
@@ -225,7 +225,7 @@ int fdt_next_node(const void *fdt, int offset, int *depth);
* @fdt: FDT blob
* @offset: Offset of node to check
*
- * Return: offset of first subnode, or -FDT_ERR_NOTFOUND if there is none
+ * returns: offset of first subnode, or -FDT_ERR_NOTFOUND if there is none
*/
int fdt_first_subnode(const void *fdt, int offset);
@@ -237,8 +237,8 @@ int fdt_first_subnode(const void *fdt, int offset);
* After first calling fdt_first_subnode(), call this function repeatedly to
* get direct subnodes of a parent node.
*
- * Return: offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more
- * subnodes
+ * returns: offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more
+ * subnodes
*/
int fdt_next_subnode(const void *fdt, int offset);
@@ -307,7 +307,7 @@ fdt_set_hdr_(size_dt_struct)
* fdt_header_size - return the size of the tree's header
* @fdt: pointer to a flattened device tree
*
- * Return: size of DTB header in bytes
+ * returns: size of DTB header in bytes
*/
size_t fdt_header_size(const void *fdt);
@@ -315,7 +315,7 @@ size_t fdt_header_size(const void *fdt);
* fdt_header_size_ - internal function to get header size from a version number
* @version: device tree version number
*
- * Return: size of DTB header in bytes
+ * returns: size of DTB header in bytes
*/
size_t fdt_header_size_(uint32_t version);
@@ -462,7 +462,7 @@ static inline uint32_t fdt_get_max_phandle(const void *fdt)
* highest phandle value in the device tree blob) will be returned in the
* @phandle parameter.
*
- * Return: 0 on success or a negative error-code on failure
+ * returns: 0 on success or a negative error-code on failure
*/
int fdt_generate_phandle(const void *fdt, uint32_t *phandle);
@@ -475,7 +475,12 @@ int fdt_generate_phandle(const void *fdt, uint32_t *phandle);
* or any other (0,0) entries reserved for expansion.
*
* returns:
- * the number of entries
+ * the number of entries, on success
+ * -FDT_ERR_ALIGNMENT,
+ * -FDT_ERR_BADMAGIC,
+ * -FDT_ERR_BADVERSION,
+ * -FDT_ERR_BADSTATE,
+ * -FDT_ERR_TRUNCATED, standard meanings
*/
int fdt_num_mem_rsv(const void *fdt);
@@ -510,7 +515,7 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
* useful for finding subnodes based on a portion of a larger string,
* such as a full path.
*
- * Return: offset of the subnode or -FDT_ERR_NOTFOUND if name not found.
+ * returns: offset of the subnode or -FDT_ERR_NOTFOUND if name not found.
*/
#ifndef SWIG /* Not available in Python */
int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
@@ -551,7 +556,7 @@ int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
* Identical to fdt_path_offset(), but only consider the first namelen
* characters of path as the path name.
*
- * Return: offset of the node or negative libfdt error value otherwise
+ * returns: offset of the node or negative libfdt error value otherwise
*/
#ifndef SWIG /* Not available in Python */
int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
@@ -749,7 +754,7 @@ static inline struct fdt_property *fdt_get_property_by_offset_w(void *fdt,
* Identical to fdt_get_property(), but only examine the first namelen
* characters of name for matching the property name.
*
- * Return: pointer to the structure representing the property, or NULL
+ * returns: pointer to the structure representing the property, or NULL
* if not found
*/
#ifndef SWIG /* Not available in Python */
@@ -851,7 +856,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
* Identical to fdt_getprop(), but only examine the first namelen
* characters of name for matching the property name.
*
- * Return: pointer to the property's value or NULL on error
+ * returns: pointer to the property's value or NULL on error
*/
#ifndef SWIG /* Not available in Python */
const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
@@ -924,8 +929,8 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
* Identical to fdt_get_alias(), but only examine the first @namelen
* characters of @name for matching the alias name.
*
- * Return: a pointer to the expansion of the alias named @name, if it exists,
- * NULL otherwise
+ * returns: a pointer to the expansion of the alias named @name, if it exists,
+ * NULL otherwise
*/
#ifndef SWIG /* Not available in Python */
const char *fdt_get_alias_namelen(const void *fdt,
@@ -955,8 +960,8 @@ const char *fdt_get_alias(const void *fdt, const char *name);
* Identical to fdt_get_symbol(), but only examine the first @namelen
* characters of @name for matching the symbol name.
*
- * Return: a pointer to the expansion of the symbol named @name, if it exists,
- * NULL otherwise
+ * returns: a pointer to the expansion of the symbol named @name, if it exists,
+ * NULL otherwise
*/
#ifndef SWIG /* Not available in Python */
const char *fdt_get_symbol_namelen(const void *fdt,
@@ -1220,7 +1225,7 @@ int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
* one or more strings, each terminated by \0, as is found in a device tree
* "compatible" property.
*
- * Return: 1 if the string is found in the list, 0 not found, or invalid list
+ * returns: 1 if the string is found in the list, 0 not found, or invalid list
*/
int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);
@@ -1230,7 +1235,7 @@ int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);
* @nodeoffset: offset of a tree node
* @property: name of the property containing the string list
*
- * Return:
+ * returns:
* the number of strings in the given property
* -FDT_ERR_BADVALUE if the property value is not NUL-terminated
* -FDT_ERR_NOTFOUND if the property does not exist
@@ -1274,7 +1279,7 @@ int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
* If non-NULL, the length of the string (on success) or a negative error-code
* (on failure) will be stored in the integer pointer to by lenp.
*
- * Return:
+ * returns:
* A pointer to the string at the given index in the string list or NULL on
* failure. On success the length of the string will be stored in the memory
* location pointed to by the lenp parameter, if non-NULL. On failure one of
@@ -1364,7 +1369,7 @@ int fdt_size_cells(const void *fdt, int nodeoffset);
* of the name. It is useful when you want to manipulate only one value of
* an array and you have a string that doesn't end with \0.
*
- * Return: 0 on success, negative libfdt error value otherwise
+ * returns: 0 on success, negative libfdt error value otherwise
*/
#ifndef SWIG /* Not available in Python */
int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
@@ -1484,7 +1489,7 @@ static inline int fdt_setprop_inplace_u64(void *fdt, int nodeoffset,
* @val: new value of the 32-bit cell
*
* This is an alternative name for fdt_setprop_inplace_u32()
- * Return: 0 on success, negative libfdt error number otherwise.
+ * returns: 0 on success, negative libfdt error number otherwise.
*/
static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
const char *name, uint32_t val)
@@ -1930,12 +1935,8 @@ int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name,
* -FDT_ERR_BADLAYOUT,
* -FDT_ERR_TRUNCATED, standard meanings
*/
-static inline int fdt_setprop(void *fdt, int nodeoffset, const char *name,
- const void *val, int len)
-{
- return fdt_setprop_namelen(fdt, nodeoffset, name, strlen(name), val,
- len);
-}
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+ const void *val, int len);
/**
* fdt_setprop_placeholder_namelen - allocate space for a property
@@ -1997,13 +1998,8 @@ int fdt_setprop_placeholder_namelen(void *fdt, int nodeoffset, const char *name,
* -FDT_ERR_BADLAYOUT,
* -FDT_ERR_TRUNCATED, standard meanings
*/
-static inline int fdt_setprop_placeholder(void *fdt, int nodeoffset,
- const char *name, int len,
- void **prop_data)
-{
- return fdt_setprop_placeholder_namelen(fdt, nodeoffset, name,
- strlen(name), len, prop_data);
-}
+int fdt_setprop_placeholder(void *fdt, int nodeoffset,
+ const char *name, int len, void **prop_data);
/**
* fdt_setprop_u32 - set a property to a 32-bit integer
@@ -2084,7 +2080,7 @@ static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *name,
*
* This is an alternative name for fdt_setprop_u32()
*
- * Return: 0 on success, negative libfdt error value otherwise.
+ * returns: 0 on success, negative libfdt error value otherwise.
*/
static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
uint32_t val)
@@ -2294,7 +2290,7 @@ static inline int fdt_appendprop_u64(void *fdt, int nodeoffset,
*
* This is an alternative name for fdt_appendprop_u32()
*
- * Return: 0 on success, negative libfdt error value otherwise.
+ * returns: 0 on success, negative libfdt error value otherwise.
*/
static inline int fdt_appendprop_cell(void *fdt, int nodeoffset,
const char *name, uint32_t val)
@@ -2405,8 +2401,8 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name);
* creating subnodes based on a portion of a larger string, such as a
* full path.
*
- * Return: structure block offset of the created subnode (>=0),
- * negative libfdt error value otherwise
+ * returns: structure block offset of the created subnode (>=0),
+ * negative libfdt error value otherwise
*/
#ifndef SWIG /* Not available in Python */
int fdt_add_subnode_namelen(void *fdt, int parentoffset,
diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c
index 5d72abceb526..8baed1fca8c5 100644
--- a/scripts/dtc/livetree.c
+++ b/scripts/dtc/livetree.c
@@ -1234,7 +1234,7 @@ void fixup_phandles(struct dt_info *dti, const char *name)
continue;
offset = strtol(soffset, NULL, 0);
- if (offset < 0 || offset + 4 > p->val.len) {
+ if (offset < 0 || (unsigned int)offset + 4 > p->val.len) {
if (quiet < 1)
fprintf(stderr,
"Warning: Label %s contains invalid offset for property %s in node %s\n",
diff --git a/scripts/dtc/version_gen.h b/scripts/dtc/version_gen.h
index 122e684e76a1..0e11fc60b1f8 100644
--- a/scripts/dtc/version_gen.h
+++ b/scripts/dtc/version_gen.h
@@ -1 +1 @@
-#define DTC_VERSION "DTC 1.7.2-g53373d13"
+#define DTC_VERSION "DTC 1.8.1-gf3451d12"
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 3/7] scripts/dtc: Build fdtget and fdtput host tools
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
2026-10-20 15:35 ` [RFC PATCH 1/7] scripts/dtc: Add fdtget.c and fdtput.c to sync script Douglas Anderson
2026-10-20 15:35 ` [RFC PATCH 2/7] scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b Douglas Anderson
@ 2026-10-20 15:35 ` Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 4/7] arm64: boot: Support building image.fit from a specified FIT_ITS script Douglas Anderson
` (4 subsequent siblings)
7 siblings, 1 reply; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson, devicetree
Build `fdtget` and `fdtput` alongside `dtc` and `fdtoverlay` when
`CONFIG_DTC` is enabled so Kbuild rules can query and update properties
in compiled device tree / FIT blobs.
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
scripts/dtc/.gitignore | 2 ++
scripts/dtc/Makefile | 6 ++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/scripts/dtc/.gitignore b/scripts/dtc/.gitignore
index e0b5c1d2464a..24357adc8896 100644
--- a/scripts/dtc/.gitignore
+++ b/scripts/dtc/.gitignore
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-only
/dtc
/fdtoverlay
+/fdtget
+/fdtput
diff --git a/scripts/dtc/Makefile b/scripts/dtc/Makefile
index b47f4daa4515..6bce3542d8a9 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 fdtget fdtput
hostprogs-always-$(CHECK_DTBS) += dtc
dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
@@ -10,10 +10,12 @@ dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
# The upstream project builds libfdt as a separate library. We are choosing to
-# instead directly link the libfdt object files into fdtoverlay.
+# instead directly link the libfdt object files into the host tools.
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
+fdtget-objs := $(libfdt) fdtget.o util.o
+fdtput-objs := $(libfdt) fdtput.o util.o
# Source files need to get at the userspace version of libfdt_env.h to compile
HOST_EXTRACFLAGS += -I $(src)/libfdt
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 4/7] arm64: boot: Support building image.fit from a specified FIT_ITS script
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
` (2 preceding siblings ...)
2026-10-20 15:35 ` [RFC PATCH 3/7] scripts/dtc: Build fdtget and fdtput host tools Douglas Anderson
@ 2026-10-20 15:35 ` Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 5/7] kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor Douglas Anderson
` (3 subsequent siblings)
7 siblings, 1 reply; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson, Andrew Jones,
Breno Leitao, David Sterba, Gary Guo, Josh Poimboeuf,
Luis Augenstein, Marco Elver, Mark Rutland, Masahiro Yamada,
Miguel Ojeda, Nick Terrell, Peter Zijlstra, Rong Xu,
Thomas Weißschuh, devicetree
Allow passing `FIT_ITS=<path>` on the make command line (relative to
either `$(srctree)` or `arch/arm64/boot/dts/`) when building `image.fit`
to assemble the FIT image from a checked-in `.its` script via `mkimage`
instead of auto-generating a FIT image with `scripts/make_fit.py`. When
`FIT_ITS` is not specified, `image.fit` continues to be built using
`scripts/make_fit.py` as before.
Supporting a checked-in `.its` script includes:
- Adding `cmd_lz4_frame` (`Image-framed.lz4` and `%.dtb.lz4`) for
standard LZ4 frame compression (magic `0x184d2204`) expected by FIT
bootloaders such as U-Boot and depthcharge, plus generic compressed
DTB rules (`bz2`, `gz`, `lz4`, `lzma`, `lzo`, `zst`, `xz`) in
`scripts/Makefile.dtbs`.
- Restricting `$(dtb-y)` to the DTBs referenced via `/incbin/(...)` in
`$(FIT_ITS)` and automatically building the referenced kernel image
target (e.g. `Image-framed.lz4`) and any compressed `.dtb.<ext>`
blobs.
- Populating any omitted `compatible` property on
`/configurations/conf-*` nodes in `cmd_fit_its` from the
corresponding uncompressed `.dtb`'s root `/compatible` property
using `fdtget` and `fdtput`. This is useful so we don't have to
manually keep the .its script in sync with the source. This is extra
important if compression is used since the bootloader may not be
able to easily peek into the device trees itself.
The main motivation for checking in an .its script instead of using an
auto-generated one is to be able to manually set the "description"
field of the configurations. This allows us to provide information that
the bootloader can use to figure out which configuration(s) to load.
This idea came from Michal Simek.
Assisted-by: Gemini:gemini-pro-prerelease
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
Makefile | 2 +-
arch/arm64/Makefile | 3 ++
arch/arm64/boot/Makefile | 9 ++++--
scripts/Makefile.dtbs | 43 ++++++++++++++++++++++++++++-
scripts/Makefile.lib | 59 ++++++++++++++++++++++++++++++++++++++++
5 files changed, 111 insertions(+), 5 deletions(-)
diff --git a/Makefile b/Makefile
index 0dc1a9f4e63e..8c5500179e2e 100644
--- a/Makefile
+++ b/Makefile
@@ -2239,7 +2239,7 @@ clean: $(clean-dirs)
\( -name '*.[aios]' -o -name '*.rsi' -o -name '*.ko' -o -name '.*.cmd' \
-o -name '*.ko.*' -o -name '*.o.thinlto.bc' \
-o -name '*.dtb' -o -name '*.dtbo' \
- -o -name '*.dtb.S' -o -name '*.dtbo.S' \
+ -o -name '*.dtb.*' -o -name '*.dtbo.S' \
-o -name '*.dt.yaml' -o -name 'dtbs-list' \
-o -name '*.dwo' -o -name '*.lst' \
-o -name '*.su' -o -name '*.mod' \
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 6b005c8fef70..f9a25db9ae03 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -185,6 +185,9 @@ $(BOOT_TARGETS): vmlinux
Image.%: Image
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
+Image-framed.%: Image
+ $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
+
ifeq ($(CONFIG_COMPRESSED_INSTALL),y)
DEFAULT_KBUILD_IMAGE = $(KBUILD_IMAGE)
else
diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile
index b5a08333bc57..fe21bace3692 100644
--- a/arch/arm64/boot/Makefile
+++ b/arch/arm64/boot/Makefile
@@ -16,8 +16,8 @@
OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
-targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo \
- Image.zst Image.xz image.fit
+targets := Image Image.bz2 Image.gz Image.lz4 Image-framed.lz4 Image.lzma \
+ Image.lzo Image.zst Image.xz image.fit
$(obj)/Image: vmlinux FORCE
$(call if_changed,objcopy)
@@ -31,6 +31,9 @@ $(obj)/Image.gz: $(obj)/Image FORCE
$(obj)/Image.lz4: $(obj)/Image FORCE
$(call if_changed,lz4)
+$(obj)/Image-framed.lz4: $(obj)/Image FORCE
+ $(call if_changed,lz4_frame)
+
$(obj)/Image.lzma: $(obj)/Image FORCE
$(call if_changed,lzma)
@@ -44,7 +47,7 @@ $(obj)/Image.xz: $(obj)/Image FORCE
$(call if_changed,xzkern)
$(obj)/image.fit: $(obj)/Image $(obj)/dts/dtbs-list FORCE
- $(call if_changed,fit)
+ $(if $(FIT_ITS_FILE),$(call if_changed,fit_its),$(call if_changed,fit))
EFI_ZBOOT_PAYLOAD := Image
EFI_ZBOOT_BFD_TARGET := elf64-littleaarch64
diff --git a/scripts/Makefile.dtbs b/scripts/Makefile.dtbs
index c4e466390284..1bc42b30cc52 100644
--- a/scripts/Makefile.dtbs
+++ b/scripts/Makefile.dtbs
@@ -5,6 +5,26 @@ all-dtb := $(dtb-y) $(dtb-)
# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
dtb-$(CONFIG_OF_ALL_DTBS) += $(dtb-)
+# If FIT_ITS is specified, restrict $(dtb-y) to only the DTBs referenced via
+# /incbin/(...) in $(FIT_ITS_FILE) and also build any compressed .dtb.<ext>
+# blobs referenced there alongside their base .dtb.
+ifdef FIT_ITS_FILE
+ifneq ($(filter arch/$(SRCARCH)/boot/dts%, $(obj)),)
+its-dtb-files := $(notdir $(shell $(call fit_its_incbin,\.dtb)))
+
+# Strip compression and .dtb suffixes to get stem names (e.g. "foo", "bar"),
+# then intersect with the stems in this directory's $(all-dtb).
+its-dtb-stems := $(patsubst %.dtb, %, \
+ $(filter %.dtb, $(its-dtb-files) $(basename $(its-dtb-files))))
+its-local-stems := $(filter $(patsubst %.dtb, %, $(all-dtb)), $(its-dtb-stems))
+
+# Build only the matching base .dtb files and any compressed .dtb.<ext> variants
+dtb-y := $(addsuffix .dtb, $(its-local-stems))
+its-dtb-comp := $(addprefix $(obj)/, \
+ $(foreach d, $(its-local-stems), $(filter $(d).dtb.%, $(its-dtb-files))))
+endif
+endif
+
# Composite DTB (i.e. DTB constructed by overlay)
multi-dtb-y := $(call multi-search, $(dtb-y), .dtb, -dtbs)
# Primitive DTB compiled from *.dts
@@ -23,7 +43,7 @@ dtb-y := $(addprefix $(obj)/, $(dtb-y))
multi-dtb-y := $(addprefix $(obj)/, $(multi-dtb-y))
real-dtb-y := $(addprefix $(obj)/, $(real-dtb-y))
-always-y += $(dtb-y)
+always-y += $(dtb-y) $(its-dtb-comp)
targets += $(real-dtb-y)
# dtbs-list
@@ -142,6 +162,27 @@ $(obj)/%.dtb: $(obj)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
$(obj)/%.dtbo: $(src)/%.dtso $(DTC) FORCE
$(call if_changed_dep,dtc)
+$(obj)/%.dtb.bz2: $(obj)/%.dtb FORCE
+ $(call if_changed,bzip2)
+
+$(obj)/%.dtb.gz: $(obj)/%.dtb FORCE
+ $(call if_changed,gzip)
+
+$(obj)/%.dtb.lz4: $(obj)/%.dtb FORCE
+ $(call if_changed,lz4_frame)
+
+$(obj)/%.dtb.lzma: $(obj)/%.dtb FORCE
+ $(call if_changed,lzma)
+
+$(obj)/%.dtb.lzo: $(obj)/%.dtb FORCE
+ $(call if_changed,lzo)
+
+$(obj)/%.dtb.zst: $(obj)/%.dtb FORCE
+ $(call if_changed,zstd)
+
+$(obj)/%.dtb.xz: $(obj)/%.dtb FORCE
+ $(call if_changed,xzmisc)
+
# targets
# ---------------------------------------------------------------------------
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 0a4fdd8bd975..91880648fe21 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -383,9 +383,16 @@ quiet_cmd_lzo = LZO $@
quiet_cmd_lzo_with_size = LZO $@
cmd_lzo_with_size = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@
+# cmd_lz4 uses -l (legacy format, magic 0x184c2102) required by the kernel's
+# in-tree decompressor (lib/decompress_unlz4.c). Bootloaders that decompress
+# FIT images (such as U-Boot and depthcharge) require the standard LZ4 frame
+# format (magic 0x184d2204, without -l), provided by cmd_lz4_frame.
quiet_cmd_lz4 = LZ4 $@
cmd_lz4 = cat $(real-prereqs) | $(LZ4) -l -9 - - > $@
+quiet_cmd_lz4_frame = LZ4 $@
+ cmd_lz4_frame = $(LZ4) -12 -z -f -q $< $@
+
quiet_cmd_lz4_with_size = LZ4 $@
cmd_lz4_with_size = { cat $(real-prereqs) | $(LZ4) -l -9 - -; \
$(size_append); } > $@
@@ -429,6 +436,58 @@ quiet_cmd_fit = FIT $@
$(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \
--compress $(FIT_COMPRESSION) -k $< @$(word 2,$^)
+# If FIT_ITS is specified on the command line (either relative to $(srctree)
+# or relative to arch/$(SRCARCH)/boot/dts/), locate that .its script and
+# define a helper to extract /incbin/("...") paths from it.
+ifdef FIT_ITS
+FIT_ITS_FILE := $(firstword $(wildcard \
+ $(FIT_ITS) \
+ $(srctree)/$(FIT_ITS) \
+ $(srctree)/arch/$(SRCARCH)/boot/dts/$(FIT_ITS)))
+ifeq ($(FIT_ITS_FILE),)
+$(error FIT_ITS '$(FIT_ITS)' not found)
+endif
+
+# Extract /incbin/("...") path(s) from $(FIT_ITS_FILE).
+# $(1): optional pattern to match inside the /incbin/("...") path
+# $(2): optional image node name to restrict the search to
+fit_its_incbin = sed -n \
+ "$(if $(2),/^[[:space:]]*$(2)[[:space:]]*{/$(comma)/\/incbin\//) \
+ s|.*/incbin/(\"\([^\"]*$(1)[^\"]*\)\").*|\1|p" \
+ $(FIT_ITS_FILE)
+
+ifneq ($(filter image.fit,$(targets)),)
+FIT_ITS_IMAGES := $(addprefix $(obj)/, \
+ $(notdir $(shell $(call fit_its_incbin,Image))))
+FIT_ITS_DTBS := $(addprefix $(objtree)/, \
+ $(shell $(call fit_its_incbin,\.dtb)))
+$(obj)/image.fit: $(FIT_ITS_IMAGES) $(FIT_ITS_DTBS) $(FIT_ITS_FILE)
+endif
+endif
+
+# Build the FIT image from the .its script with mkimage and populate any
+# missing 'compatible' property on /configurations/conf-* nodes from the
+# corresponding uncompressed .dtb's root '/compatible' property using
+# fdtget/fdtput.
+quiet_cmd_fit_its = FIT $@
+ cmd_fit_its = \
+ PATH="$(abspath $(objtree))/scripts/dtc:$(PATH)"; \
+ $(BASH) $(MKIMAGE) \
+ -D "-I dts -O dtb -i $(objtree) -i $(srctree)" \
+ -f $(FIT_ITS_FILE) $@; \
+ configs=$$(fdtget -l $@ /configurations); \
+ for c in $$configs; do \
+ conf=/configurations/$$c; \
+ if [ -n "$$(fdtget -d '' $@ $$conf compatible)" ]; then \
+ continue; \
+ fi; \
+ fdt=$$(fdtget $@ $$conf fdt); \
+ inc=$$($(call fit_its_incbin,\.dtb,$$fdt)); \
+ dtb="$(objtree)/$${inc%.dtb*}.dtb"; \
+ compat=$$(fdtget -ts "$$dtb" / compatible); \
+ fdtput -ts $@ $$conf compatible $$compat; \
+ done
+
# XZ
# ---------------------------------------------------------------------------
# Use xzkern or xzkern_with_size to compress the kernel image and xzmisc to
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 5/7] kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
` (3 preceding siblings ...)
2026-10-20 15:35 ` [RFC PATCH 4/7] arm64: boot: Support building image.fit from a specified FIT_ITS script Douglas Anderson
@ 2026-10-20 15:35 ` Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script Douglas Anderson
` (2 subsequent siblings)
7 siblings, 1 reply; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson, Alice Ryhl,
Josh Poimboeuf, Marco Elver, Peter Zijlstra (Intel), Rong Xu,
devicetree
Add opt-in support for factoring the DTBs inside a compiled FIT image
into shared base DTBs and per-board overlays using `fdtfactor` when
`FIT_FACTOR_DTBS=1` is passed to make:
- When `FIT_FACTOR_DTBS` is set, pass `-@ -L` to `dtc` for the DTBs
included in the FIT image so they retain `/__symbols__` and
`/__local_fixups__` metadata needed for factoring.
- Run `$(FDTFACTOR) $(FDTFACTOR_ARGS) -f $@` (with `FDTFACTOR_ARGS`
defaulting to `--strip-local-fixups`) at the end of `cmd_fit` and
`cmd_fit_its` when `FIT_FACTOR_DTBS` is set.
Assisted-by: Gemini:gemini-pro-prerelease
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
You can see the fdtfactor post at:
http://lore.kernel.org/r/20261015182221.2931742-1-dianders@chromium.org
This patch obviously could only land if some form of that series
lands. Presumably we'd also want to import fdtfactor into the local
kernel copy of the devicetree compiler before this patch.
If people hate this patch, we could certainly just run `fdtfactor`
after the kernel build finishes.
scripts/Makefile.dtbs | 8 ++++++++
scripts/Makefile.lib | 18 ++++++++++++------
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/scripts/Makefile.dtbs b/scripts/Makefile.dtbs
index 1bc42b30cc52..4b8d7039e45d 100644
--- a/scripts/Makefile.dtbs
+++ b/scripts/Makefile.dtbs
@@ -137,6 +137,14 @@ DTC_FLAGS += -Wnode_name_chars_strict \
-Wunique_unit_address
endif
+# When FIT_FACTOR_DTBS is set, pass -@ -L to dtc so the built DTBs retain the
+# /__symbols__ and /__local_fixups__ nodes required by fdtfactor.
+ifneq ($(FIT_FACTOR_DTBS),)
+ifneq ($(filter arch/$(SRCARCH)/boot/dts%, $(obj)),)
+DTC_FLAGS += -@ -L
+endif
+endif
+
DTC_FLAGS += $(DTC_FLAGS_$(target-stem))
# Set -@ if the target is a base DTB that overlay is applied onto
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 91880648fe21..bcb2b0e749a3 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -425,6 +425,8 @@ quiet_cmd_uimage = UIMAGE $@
# ---------------------------------------------------------------------------
MAKE_FIT := $(srctree)/scripts/make_fit.py
+FDTFACTOR ?= fdtfactor
+FDTFACTOR_ARGS ?= --strip-local-fixups
# Use this to override the compression algorithm
FIT_COMPRESSION ?= gzip
@@ -434,7 +436,9 @@ quiet_cmd_fit = FIT $@
--name '$(UIMAGE_NAME)' $(FIT_EXTRA_ARGS) \
$(if $(findstring 1,$(KBUILD_VERBOSE)),-v) \
$(if $(FIT_DECOMPOSE_DTBS),--decompose-dtbs) \
- --compress $(FIT_COMPRESSION) -k $< @$(word 2,$^)
+ --compress $(FIT_COMPRESSION) -k $< @$(word 2,$^) \
+ $(if $(FIT_FACTOR_DTBS),&& $(FDTFACTOR) $(FDTFACTOR_ARGS) \
+ $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) -f $@)
# If FIT_ITS is specified on the command line (either relative to $(srctree)
# or relative to arch/$(SRCARCH)/boot/dts/), locate that .its script and
@@ -465,10 +469,10 @@ $(obj)/image.fit: $(FIT_ITS_IMAGES) $(FIT_ITS_DTBS) $(FIT_ITS_FILE)
endif
endif
-# Build the FIT image from the .its script with mkimage and populate any
-# missing 'compatible' property on /configurations/conf-* nodes from the
-# corresponding uncompressed .dtb's root '/compatible' property using
-# fdtget/fdtput.
+# Build the FIT image from the .its script with mkimage, populate any missing
+# 'compatible' property on /configurations/conf-* nodes from the corresponding
+# uncompressed .dtb's root '/compatible' property using fdtget/fdtput, and
+# optionally factor the DTBs with fdtfactor when FIT_FACTOR_DTBS is set.
quiet_cmd_fit_its = FIT $@
cmd_fit_its = \
PATH="$(abspath $(objtree))/scripts/dtc:$(PATH)"; \
@@ -486,7 +490,9 @@ quiet_cmd_fit_its = FIT $@
dtb="$(objtree)/$${inc%.dtb*}.dtb"; \
compat=$$(fdtget -ts "$$dtb" / compatible); \
fdtput -ts $@ $$conf compatible $$compat; \
- done
+ done \
+ $(if $(FIT_FACTOR_DTBS),; $(FDTFACTOR) $(FDTFACTOR_ARGS) \
+ $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) -f $@)
# XZ
# ---------------------------------------------------------------------------
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
` (4 preceding siblings ...)
2026-10-20 15:35 ` [RFC PATCH 5/7] kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor Douglas Anderson
@ 2026-10-20 15:35 ` Douglas Anderson
2026-10-21 6:47 ` Michal Simek
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its " Douglas Anderson
2026-10-24 8:16 ` [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Simon Glass
7 siblings, 2 replies; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson, devicetree,
linux-samsung-soc
Add an Image Tree Source (`lga.its`) describing the FIT image for Google
Tensor G5 (LGA) Pixel 10 family boards (`lga-blazer.dtb`,
`lga-frankel.dtb`, and `lga-mustang.dtb`) with board and SoC ID/revision
metadata in the configuration descriptions, allowing the LGA FIT image
to be built with:
make \
FIT_ITS=google/lga.its \
FIT_FACTOR_DTBS=1 \
FDTFACTOR_ARGS="--strip-local-fixups --single-base-dtb" \
image.fit
NOTE: At the moment, Pixel 10 doesn't directly boot from a FIT
image. However, packaging scripts will be able to take an image as
built above and convert it into a format that the bootloader can
handle.
It should also be noted that the "description" of the various
configurations here is expected to be parsed to help figure out which
configuration to use on which board. This idea came out of discussions
at Linux Plumbers Conference 2026 and means we don't need "loader"
info polluting device trees. Having a structured (and upstream) place
to store this data is part of the motivation for landing this FIT
image.
Side note: at the moment, the Pixel bootloader can't handle picking
overlays based on the soc_id and soc_rev (it only uses those to pick
base dtb files), so for now we won't be able to support boards that
might have different SoCs. I've included the soc_id and soc_rev in
this FIT image in the hopes that we can improve the bootloader in the
future, though.
Assisted-by: Gemini:gemini-pro-prerelease
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
Note that building `image.fit` with `lga.its` requires the Pixel 10
(`lga-blazer.dtb`, `lga-frankel.dtb`, and `lga-mustang.dtb`) device
trees, which are currently in linux-next and not yet in mainline.
arch/arm64/boot/dts/google/lga.its | 68 ++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
create mode 100644 arch/arm64/boot/dts/google/lga.its
diff --git a/arch/arm64/boot/dts/google/lga.its b/arch/arm64/boot/dts/google/lga.its
new file mode 100644
index 000000000000..5ba19c0b5411
--- /dev/null
+++ b/arch/arm64/boot/dts/google/lga.its
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/dts-v1/;
+
+/ {
+ description = "Google Tensor G5 (LGA) kernel and device trees";
+ #address-cells = <1>;
+
+ images {
+ kernel-1 {
+ description = "Linux kernel";
+ data = /incbin/("arch/arm64/boot/Image");
+ type = "kernel_noload";
+ arch = "arm64";
+ os = "linux";
+ compression = "none";
+ load = <0>;
+ entry = <0>;
+ };
+ fdt-1 {
+ description = "lga-blazer.dtb";
+ data = /incbin/("arch/arm64/boot/dts/google/lga-blazer.dtb");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "none";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-2 {
+ description = "lga-frankel.dtb";
+ data = /incbin/("arch/arm64/boot/dts/google/lga-frankel.dtb");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "none";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-3 {
+ description = "lga-mustang.dtb";
+ data = /incbin/("arch/arm64/boot/dts/google/lga-mustang.dtb");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "none";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ };
+
+ configurations {
+ conf-1 {
+ description = "Blazer (board_id=0x070406,board_rev=0x010000,soc_id=0x0005,soc_rev=0x010000)";
+ kernel = "kernel-1";
+ fdt = "fdt-1";
+ };
+ conf-2 {
+ description = "Frankel (board_id=0x070306,board_rev=0x010000,soc_id=0x0005,soc_rev=0x010000)";
+ kernel = "kernel-1";
+ fdt = "fdt-2";
+ };
+ conf-3 {
+ description = "Mustang (board_id=0x070506,board_rev=0x010000,soc_id=0x0005,soc_rev=0x010000)";
+ kernel = "kernel-1";
+ fdt = "fdt-3";
+ };
+ };
+};
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its FIT image script
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
` (5 preceding siblings ...)
2026-10-20 15:35 ` [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script Douglas Anderson
@ 2026-10-20 15:35 ` Douglas Anderson
2026-10-21 6:49 ` Michal Simek
` (2 more replies)
2026-10-24 8:16 ` [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Simon Glass
7 siblings, 3 replies; 19+ messages in thread
From: Douglas Anderson @ 2026-10-20 15:35 UTC (permalink / raw)
To: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Douglas Anderson,
Bjorn Andersson, cros-qcom-dts-watchers, devicetree
Add an Image Tree Source (`sc7180-trogdor.its`) describing the FIT
image for SC7180 Trogdor family boards using `Image-framed.lz4` and
LZ4-compressed board DTBs (`*.dtb.lz4`), allowing the Trogdor FIT image
to be built with:
make FIT_ITS=qcom/sc7180-trogdor.its image.fit
Assisted-by: Gemini:gemini-pro-prerelease
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
As mentioned in the cover letter, there is no desperate need to land
this. The FIT image created here is pretty much the same as what the
downstream build scripts for ChromeOS programmatically
produce. Switching over to this would have a few benefits:
* It makes it easy to use fdtfactor on the trogdor kernel image.
* It would set the path for future Chromebooks, and on those
Chromebooks maybe we could use the "description" of the
configurations to help the bootloader so we didn't need the awkward
piles of "compatible" strings that we have.
* It could potentially be useful to people in the community putting
upstream kernels on sc7180-trogdor devices.
This all being said, there's nothing terribly critical here, so if
it's controversial or people hate it then it's fine not to land it.
arch/arm64/boot/dts/qcom/sc7180-trogdor.its | 728 ++++++++++++++++++++
1 file changed, 728 insertions(+)
create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor.its
diff --git a/arch/arm64/boot/dts/qcom/sc7180-trogdor.its b/arch/arm64/boot/dts/qcom/sc7180-trogdor.its
new file mode 100644
index 000000000000..310c286706f1
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/sc7180-trogdor.its
@@ -0,0 +1,728 @@
+// SPDX-License-Identifier: (GPL-2.0-or-later OR MIT)
+/dts-v1/;
+
+/ {
+ description = "Chrome OS kernel image with one or more FDT blobs";
+ #address-cells = <1>;
+
+ images {
+ kernel-1 {
+ description = "Linux kernel";
+ data = /incbin/("arch/arm64/boot/Image-framed.lz4");
+ type = "kernel_noload";
+ arch = "arm64";
+ os = "linux";
+ compression = "lz4";
+ load = <0>;
+ entry = <0>;
+ };
+ fdt-1 {
+ description = "sc7180-trogdor-coachz-r1-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-2 {
+ description = "sc7180-trogdor-coachz-r1.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-3 {
+ description = "sc7180-trogdor-coachz-r3-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-4 {
+ description = "sc7180-trogdor-coachz-r3.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-5 {
+ description = "sc7180-trogdor-homestar-r2.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r2.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-6 {
+ description = "sc7180-trogdor-homestar-r3.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r3.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-7 {
+ description = "sc7180-trogdor-homestar-r4.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-homestar-r4.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-8 {
+ description = "sc7180-trogdor-kingoftown.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-kingoftown.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-9 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r10.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r10.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-10 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r4.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r4.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-11 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r5.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r5.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-12 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r9.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-nots-r9.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-13 {
+ description = "sc7180-trogdor-lazor-limozeen-r10.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r10.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-14 {
+ description = "sc7180-trogdor-lazor-limozeen-r4.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r4.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-15 {
+ description = "sc7180-trogdor-lazor-limozeen-r9.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-limozeen-r9.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-16 {
+ description = "sc7180-trogdor-lazor-r1-kb.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-kb.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-17 {
+ description = "sc7180-trogdor-lazor-r1-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-18 {
+ description = "sc7180-trogdor-lazor-r1.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-19 {
+ description = "sc7180-trogdor-lazor-r10-kb.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10-kb.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-20 {
+ description = "sc7180-trogdor-lazor-r10-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-21 {
+ description = "sc7180-trogdor-lazor-r10.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r10.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-22 {
+ description = "sc7180-trogdor-lazor-r3-kb.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-kb.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-23 {
+ description = "sc7180-trogdor-lazor-r3-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-24 {
+ description = "sc7180-trogdor-lazor-r3.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-25 {
+ description = "sc7180-trogdor-lazor-r9-kb.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-kb.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-26 {
+ description = "sc7180-trogdor-lazor-r9-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-27 {
+ description = "sc7180-trogdor-lazor-r9.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r9.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-28 {
+ description = "sc7180-trogdor-pazquel-lte-parade.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-lte-parade.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-29 {
+ description = "sc7180-trogdor-pazquel-lte-ti.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-lte-ti.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-30 {
+ description = "sc7180-trogdor-pazquel-parade.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-parade.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-31 {
+ description = "sc7180-trogdor-pazquel-ti.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel-ti.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-32 {
+ description = "sc7180-trogdor-pazquel360-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel360-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-33 {
+ description = "sc7180-trogdor-pazquel360-wifi.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pazquel360-wifi.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-34 {
+ description = "sc7180-trogdor-pompom-r1-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-35 {
+ description = "sc7180-trogdor-pompom-r1.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-36 {
+ description = "sc7180-trogdor-pompom-r2-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-37 {
+ description = "sc7180-trogdor-pompom-r2.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-38 {
+ description = "sc7180-trogdor-pompom-r3-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-39 {
+ description = "sc7180-trogdor-pompom-r3.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-40 {
+ description = "sc7180-trogdor-quackingstick-r0-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-quackingstick-r0-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-41 {
+ description = "sc7180-trogdor-quackingstick-r0.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-quackingstick-r0.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-42 {
+ description = "sc7180-trogdor-r1-lte.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-r1-lte.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-43 {
+ description = "sc7180-trogdor-r1.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-r1.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-44 {
+ description = "sc7180-trogdor-wormdingler-rev1-boe-rt5682s.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-boe-rt5682s.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-45 {
+ description = "sc7180-trogdor-wormdingler-rev1-boe.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-boe.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-46 {
+ description = "sc7180-trogdor-wormdingler-rev1-inx-rt5682s.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-inx-rt5682s.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ fdt-47 {
+ description = "sc7180-trogdor-wormdingler-rev1-inx.dtb.lz4";
+ data = /incbin/("arch/arm64/boot/dts/qcom/sc7180-trogdor-wormdingler-rev1-inx.dtb.lz4");
+ type = "flat_dt";
+ arch = "arm64";
+ compression = "lz4";
+ hash-1 {
+ algo = "sha1";
+ };
+ };
+ };
+
+ configurations {
+ conf-1 {
+ description = "sc7180-trogdor-coachz-r1-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-1";
+ };
+ conf-2 {
+ description = "sc7180-trogdor-coachz-r1";
+ kernel = "kernel-1";
+ fdt = "fdt-2";
+ };
+ conf-3 {
+ description = "sc7180-trogdor-coachz-r3-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-3";
+ };
+ conf-4 {
+ description = "sc7180-trogdor-coachz-r3";
+ kernel = "kernel-1";
+ fdt = "fdt-4";
+ };
+ conf-5 {
+ description = "sc7180-trogdor-homestar-r2";
+ kernel = "kernel-1";
+ fdt = "fdt-5";
+ };
+ conf-6 {
+ description = "sc7180-trogdor-homestar-r3";
+ kernel = "kernel-1";
+ fdt = "fdt-6";
+ };
+ conf-7 {
+ description = "sc7180-trogdor-homestar-r4";
+ kernel = "kernel-1";
+ fdt = "fdt-7";
+ };
+ conf-8 {
+ description = "sc7180-trogdor-kingoftown";
+ kernel = "kernel-1";
+ fdt = "fdt-8";
+ };
+ conf-9 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r10";
+ kernel = "kernel-1";
+ fdt = "fdt-9";
+ };
+ conf-10 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r4";
+ kernel = "kernel-1";
+ fdt = "fdt-10";
+ };
+ conf-11 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r5";
+ kernel = "kernel-1";
+ fdt = "fdt-11";
+ };
+ conf-12 {
+ description = "sc7180-trogdor-lazor-limozeen-nots-r9";
+ kernel = "kernel-1";
+ fdt = "fdt-12";
+ };
+ conf-13 {
+ description = "sc7180-trogdor-lazor-limozeen-r10";
+ kernel = "kernel-1";
+ fdt = "fdt-13";
+ };
+ conf-14 {
+ description = "sc7180-trogdor-lazor-limozeen-r4";
+ kernel = "kernel-1";
+ fdt = "fdt-14";
+ };
+ conf-15 {
+ description = "sc7180-trogdor-lazor-limozeen-r9";
+ kernel = "kernel-1";
+ fdt = "fdt-15";
+ };
+ conf-16 {
+ description = "sc7180-trogdor-lazor-r1-kb";
+ kernel = "kernel-1";
+ fdt = "fdt-16";
+ };
+ conf-17 {
+ description = "sc7180-trogdor-lazor-r1-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-17";
+ };
+ conf-18 {
+ description = "sc7180-trogdor-lazor-r1";
+ kernel = "kernel-1";
+ fdt = "fdt-18";
+ };
+ conf-19 {
+ description = "sc7180-trogdor-lazor-r10-kb";
+ kernel = "kernel-1";
+ fdt = "fdt-19";
+ };
+ conf-20 {
+ description = "sc7180-trogdor-lazor-r10-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-20";
+ };
+ conf-21 {
+ description = "sc7180-trogdor-lazor-r10";
+ kernel = "kernel-1";
+ fdt = "fdt-21";
+ };
+ conf-22 {
+ description = "sc7180-trogdor-lazor-r3-kb";
+ kernel = "kernel-1";
+ fdt = "fdt-22";
+ };
+ conf-23 {
+ description = "sc7180-trogdor-lazor-r3-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-23";
+ };
+ conf-24 {
+ description = "sc7180-trogdor-lazor-r3";
+ kernel = "kernel-1";
+ fdt = "fdt-24";
+ };
+ conf-25 {
+ description = "sc7180-trogdor-lazor-r9-kb";
+ kernel = "kernel-1";
+ fdt = "fdt-25";
+ };
+ conf-26 {
+ description = "sc7180-trogdor-lazor-r9-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-26";
+ };
+ conf-27 {
+ description = "sc7180-trogdor-lazor-r9";
+ kernel = "kernel-1";
+ fdt = "fdt-27";
+ };
+ conf-28 {
+ description = "sc7180-trogdor-pazquel-lte-parade";
+ kernel = "kernel-1";
+ fdt = "fdt-28";
+ };
+ conf-29 {
+ description = "sc7180-trogdor-pazquel-lte-ti";
+ kernel = "kernel-1";
+ fdt = "fdt-29";
+ };
+ conf-30 {
+ description = "sc7180-trogdor-pazquel-parade";
+ kernel = "kernel-1";
+ fdt = "fdt-30";
+ };
+ conf-31 {
+ description = "sc7180-trogdor-pazquel-ti";
+ kernel = "kernel-1";
+ fdt = "fdt-31";
+ };
+ conf-32 {
+ description = "sc7180-trogdor-pazquel360-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-32";
+ };
+ conf-33 {
+ description = "sc7180-trogdor-pazquel360-wifi";
+ kernel = "kernel-1";
+ fdt = "fdt-33";
+ };
+ conf-34 {
+ description = "sc7180-trogdor-pompom-r1-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-34";
+ };
+ conf-35 {
+ description = "sc7180-trogdor-pompom-r1";
+ kernel = "kernel-1";
+ fdt = "fdt-35";
+ };
+ conf-36 {
+ description = "sc7180-trogdor-pompom-r2-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-36";
+ };
+ conf-37 {
+ description = "sc7180-trogdor-pompom-r2";
+ kernel = "kernel-1";
+ fdt = "fdt-37";
+ };
+ conf-38 {
+ description = "sc7180-trogdor-pompom-r3-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-38";
+ };
+ conf-39 {
+ description = "sc7180-trogdor-pompom-r3";
+ kernel = "kernel-1";
+ fdt = "fdt-39";
+ };
+ conf-40 {
+ description = "sc7180-trogdor-quackingstick-r0-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-40";
+ };
+ conf-41 {
+ description = "sc7180-trogdor-quackingstick-r0";
+ kernel = "kernel-1";
+ fdt = "fdt-41";
+ };
+ conf-42 {
+ description = "sc7180-trogdor-r1-lte";
+ kernel = "kernel-1";
+ fdt = "fdt-42";
+ };
+ conf-43 {
+ description = "sc7180-trogdor-r1";
+ kernel = "kernel-1";
+ fdt = "fdt-43";
+ };
+ conf-44 {
+ description = "sc7180-trogdor-wormdingler-rev1-boe-rt5682s";
+ kernel = "kernel-1";
+ fdt = "fdt-44";
+ };
+ conf-45 {
+ description = "sc7180-trogdor-wormdingler-rev1-boe";
+ kernel = "kernel-1";
+ fdt = "fdt-45";
+ };
+ conf-46 {
+ description = "sc7180-trogdor-wormdingler-rev1-inx-rt5682s";
+ kernel = "kernel-1";
+ fdt = "fdt-46";
+ };
+ conf-47 {
+ description = "sc7180-trogdor-wormdingler-rev1-inx";
+ kernel = "kernel-1";
+ fdt = "fdt-47";
+ };
+ };
+};
--
2.56.0.212.g129ede20d9-goog
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script
2026-10-20 15:35 ` [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script Douglas Anderson
@ 2026-10-21 6:47 ` Michal Simek
2026-10-24 8:17 ` Simon Glass
1 sibling, 0 replies; 19+ messages in thread
From: Michal Simek @ 2026-10-21 6:47 UTC (permalink / raw)
To: Douglas Anderson, Devicetree-compiler, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
André Draszik, linux-samsung-soc
On 10/20/26 17:35, Douglas Anderson wrote:
> Add an Image Tree Source (`lga.its`) describing the FIT image for Google
> Tensor G5 (LGA) Pixel 10 family boards (`lga-blazer.dtb`,
> `lga-frankel.dtb`, and `lga-mustang.dtb`) with board and SoC ID/revision
> metadata in the configuration descriptions, allowing the LGA FIT image
> to be built with:
>
> make \
> FIT_ITS=google/lga.its \
> FIT_FACTOR_DTBS=1 \
> FDTFACTOR_ARGS="--strip-local-fixups --single-base-dtb" \
> image.fit
>
> NOTE: At the moment, Pixel 10 doesn't directly boot from a FIT
> image. However, packaging scripts will be able to take an image as
> built above and convert it into a format that the bootloader can
> handle.
>
> It should also be noted that the "description" of the various
> configurations here is expected to be parsed to help figure out which
> configuration to use on which board. This idea came out of discussions
> at Linux Plumbers Conference 2026 and means we don't need "loader"
> info polluting device trees. Having a structured (and upstream) place
> to store this data is part of the motivation for landing this FIT
> image.
>
> Side note: at the moment, the Pixel bootloader can't handle picking
> overlays based on the soc_id and soc_rev (it only uses those to pick
> base dtb files), so for now we won't be able to support boards that
> might have different SoCs. I've included the soc_id and soc_rev in
> this FIT image in the hopes that we can improve the bootloader in the
> future, though.
>
> Assisted-by: Gemini:gemini-pro-prerelease
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
> ---
> Note that building `image.fit` with `lga.its` requires the Pixel 10
> (`lga-blazer.dtb`, `lga-frankel.dtb`, and `lga-mustang.dtb`) device
> trees, which are currently in linux-next and not yet in mainline.
>
> arch/arm64/boot/dts/google/lga.its | 68 ++++++++++++++++++++++++++++++
> 1 file changed, 68 insertions(+)
> create mode 100644 arch/arm64/boot/dts/google/lga.its
Looks good to me.
Acked-by: Michal Simek <michal.simek@amd.com>
Cheers,
Michal
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its FIT image script
2026-10-20 15:35 ` [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its " Douglas Anderson
@ 2026-10-21 6:49 ` Michal Simek
2026-10-21 7:52 ` Konrad Dybcio
2026-10-24 8:17 ` Simon Glass
2 siblings, 0 replies; 19+ messages in thread
From: Michal Simek @ 2026-10-21 6:49 UTC (permalink / raw)
To: Douglas Anderson, Devicetree-compiler, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
André Draszik, Bjorn Andersson, cros-qcom-dts-watchers
On 10/20/26 17:35, Douglas Anderson wrote:
> Add an Image Tree Source (`sc7180-trogdor.its`) describing the FIT
> image for SC7180 Trogdor family boards using `Image-framed.lz4` and
> LZ4-compressed board DTBs (`*.dtb.lz4`), allowing the Trogdor FIT image
> to be built with:
>
> make FIT_ITS=qcom/sc7180-trogdor.its image.fit
>
> Assisted-by: Gemini:gemini-pro-prerelease
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
> ---
> As mentioned in the cover letter, there is no desperate need to land
> this. The FIT image created here is pretty much the same as what the
> downstream build scripts for ChromeOS programmatically
> produce. Switching over to this would have a few benefits:
> * It makes it easy to use fdtfactor on the trogdor kernel image.
> * It would set the path for future Chromebooks, and on those
> Chromebooks maybe we could use the "description" of the
> configurations to help the bootloader so we didn't need the awkward
> piles of "compatible" strings that we have.
> * It could potentially be useful to people in the community putting
> upstream kernels on sc7180-trogdor devices.
>
> This all being said, there's nothing terribly critical here, so if
> it's controversial or people hate it then it's fine not to land it.
>
> arch/arm64/boot/dts/qcom/sc7180-trogdor.its | 728 ++++++++++++++++++++
> 1 file changed, 728 insertions(+)
> create mode 100644 arch/arm64/boot/dts/qcom/sc7180-trogdor.its
Acked-by: Michal Simek <michal.simek@amd.com>
I would consider in this case to put it to any folder. There are a lot of
dts/dtsi/dtso files in qcom folder. That having subfolder would be IMHO better
structure.
Thanks,
Michal
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its FIT image script
2026-10-20 15:35 ` [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its " Douglas Anderson
2026-10-21 6:49 ` Michal Simek
@ 2026-10-21 7:52 ` Konrad Dybcio
2026-10-24 8:17 ` Simon Glass
2 siblings, 0 replies; 19+ messages in thread
From: Konrad Dybcio @ 2026-10-21 7:52 UTC (permalink / raw)
To: Douglas Anderson, Devicetree-compiler, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Konrad Dybcio
Cc: linux-kbuild, Brian Norris, Catalin Marinas, linux-kernel,
linux-arm-kernel, Simon Glass, Chen-Yu Tsai, linux-arm-msm,
Nicolas Schier, Peter Griffin, Nathan Chancellor, Tudor Ambarus,
Devicetree, Julius Werner, Saravana Kannan, Will Deacon,
Michal Simek, André Draszik, Bjorn Andersson,
cros-qcom-dts-watchers
On 10/20/26 5:35 PM, Douglas Anderson wrote:
> Add an Image Tree Source (`sc7180-trogdor.its`) describing the FIT
> image for SC7180 Trogdor family boards using `Image-framed.lz4` and
> LZ4-compressed board DTBs (`*.dtb.lz4`), allowing the Trogdor FIT image
> to be built with:
>
> make FIT_ITS=qcom/sc7180-trogdor.its image.fit
>
> Assisted-by: Gemini:gemini-pro-prerelease
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
> ---
Acked-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
` (6 preceding siblings ...)
2026-10-20 15:35 ` [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its " Douglas Anderson
@ 2026-10-24 8:16 ` Simon Glass
7 siblings, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:16 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik,
Alice Ryhl, Andrew Jones, Bjorn Andersson, Breno Leitao,
David Sterba, Gary Guo, Josh Poimboeuf, Luis Augenstein,
Marco Elver, Mark Rutland, Masahiro Yamada, Miguel Ojeda,
Nick Terrell, Peter Zijlstra (Intel), Rong Xu,
Thomas Weißschuh, cros-qcom-dts-watchers, linux-samsung-soc
Hi Doug!
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> 1. It uses a checked-in .its script to associate metadata with each
> board's devicetree. Other tools can parse this metadata in order to
> craft a package that the Pixel bootloader can understand.
One thing I'd like to check before this goes further. In lga.its the
metadata is a string packed into the configuration description
(board_id=...,board_rev=...,soc_id=...,soc_rev=...). The FIT spec
treats 'description' as human-readable text, so this turns a
free-form, undocumented string into an ABI that bootloaders and
packaging tools must parse. I'd much prefer proper properties in the
configuration node, defined in the FIT spec [1], so that every tool
can rely on the same names and types. I'm happy to help get that into
the spec. What do you think?
> How does this series help us?
The FIT_ITS path is a second way to build image.fit alongside
make_fit.py, and much of it repeats what make_fit.py already does: it
puts the root compatible from each DTB into the configuration and
compresses the DTBs. The series adds fdtget/fdtput, sed parsing of
/incbin/ paths and a shell loop in Makefile.lib to do the same for a
hand-written .its file, and the .its files repeat the DTB lists from
the Makefiles. Have you thought about extending make_fit.py to take
the per-board metadata (e.g. from a small file next to the DTs, or via
FIT_EXTRA_ARGS) and to run fdtfactor itself? That would avoid the
in-tree fdtget/fdtput, the mkimage dependency and most of the Makefile
logic, and trogdor would come almost for free.
The new FIT_ITS, FIT_FACTOR_DTBS and FDTFACTOR_ARGS variables aren't
documented anywhere, including the image.fit entry in the arm64 'make
help' output. Please can you add something, perhaps alongside wherever
FIT_DECOMPOSE_DTBS ends up being described.
[1] https://github.com/open-source-firmware/flat-image-tree
Regards,
Simon
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 1/7] scripts/dtc: Add fdtget.c and fdtput.c to sync script
2026-10-20 15:35 ` [RFC PATCH 1/7] scripts/dtc: Add fdtget.c and fdtput.c to sync script Douglas Anderson
@ 2026-10-24 8:16 ` Simon Glass
0 siblings, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:16 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> scripts/dtc: Add fdtget.c and fdtput.c to sync script
>
> fdtget.c and fdtput.c were imported into scripts/dtc/ in commit
> cd296721a964 ("dtc: import latest upstream dtc") prior to the creation
> of update-dtc-source.sh, and were never added to the sync script.
>
> Add FDTGET_SOURCE and FDTPUT_SOURCE to update-dtc-source.sh so they are
> kept in sync with the rest of scripts/dtc/.
>
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
>
> scripts/dtc/update-dtc-source.sh | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
Reviewed-by: Simon Glass <sjg@chromium.org>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 2/7] scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b
2026-10-20 15:35 ` [RFC PATCH 2/7] scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b Douglas Anderson
@ 2026-10-24 8:17 ` Simon Glass
0 siblings, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:17 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik
Hi Doug,
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b
>
> This adds the following commits from upstream:
>
> f3451d12532b meson: Only take the version from dtc's own git repository
The script builds this list from the last sync point (v1.7.2-69), so
fdtget.c and fdtput.c get loads of changes beyond what this lists.
That's fine, but you could mention it (e.g. the new -r and -d options
in fdtput, automatic growth of the blob, long options, strtol()
instead of sscanf() for parsing integers, fdt_pack() before writing,
the libfdt iterators in fdtget)
I built scripts/dtc and lib/fdt_rw.o at this patch with no warnings,
which covers the in-kernel libfdt now that fdt_setprop() and
fdt_setprop_placeholder() are no longer inline.
>
> f3451d12532b meson: Only take the version from dtc's own git repository
> 7a1e01792600 libfdt: pass sources as keyword argument to library()
> 8c37c14c95d9 fdtget: Use libfdt iterators instead of open coded loops
> 89c99ce78ac8 pylibfdt: Add add_mem_rsv() and del_mem_rsv()
> 3750493c8b0f pylibfdt: Add address_cells() and size_cells()
> 0748c384fde6 pylibfdt: Grow the FdtSw buffer geometrically
> 5008d1d6a356 pylibfdt: Replace removed SWIG Python 2 compatibility macros
> 66e1201c3775 libfdt: fdt_check_full: Add can_assume(PERFECT) check
> 214372a27398 tests: Replace trees.S/dumptrees with treegen for making test dtbs
> 4df9ca4c8ddb tests: Add treegen, a pure C replacement for trees.S + dumptrees
> f116f4800edc tests: Dont have test cases link directly against example dtb data
> 9b53b9a4c2f9 tests: Add missing unterminated_memrsv to dumptrees
> 5f919a25d71b ci: Merge make and meson jobs using build matrix
> 6c1426dfa963 ci: Add macOS support to install-deps.sh
> 23fd89bc8ed8 ci: Move FreeBSD CI from Cirrus CI to GitHub Actions
> 3ad5ebbdd9d5 ci: Upgrade actions/checkout v4 to v6 for Node.js 24 support
> [...]
>
> scripts/dtc/checks.c | 2 +-
> scripts/dtc/fdtget.c | 207 ++++++++++++++++----------------
> scripts/dtc/fdtput.c | 280 +++++++++++++++++++++++++++++++++-----------
> scripts/dtc/libfdt/fdt_ro.c | 2 +
> scripts/dtc/libfdt/fdt_rw.c | 41 +++++--
> scripts/dtc/libfdt/fdt_sw.c | 3 +-
> scripts/dtc/libfdt/libfdt.h | 70 ++++++-----
> scripts/dtc/livetree.c | 2 +-
> scripts/dtc/version_gen.h | 2 +-
> 9 files changed, 391 insertions(+), 218 deletions(-)
Regards,
Simon
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 3/7] scripts/dtc: Build fdtget and fdtput host tools
2026-10-20 15:35 ` [RFC PATCH 3/7] scripts/dtc: Build fdtget and fdtput host tools Douglas Anderson
@ 2026-10-24 8:17 ` Simon Glass
0 siblings, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:17 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> scripts/dtc: Build fdtget and fdtput host tools
>
> Build `fdtget` and `fdtput` alongside `dtc` and `fdtoverlay` when
> `CONFIG_DTC` is enabled so Kbuild rules can query and update properties
> in compiled device tree / FIT blobs.
>
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
>
> scripts/dtc/.gitignore | 2 ++
> scripts/dtc/Makefile | 6 ++++--
> 2 files changed, 6 insertions(+), 2 deletions(-)
Reviewed-by: Simon Glass <sjg@chromium.org>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 4/7] arm64: boot: Support building image.fit from a specified FIT_ITS script
2026-10-20 15:35 ` [RFC PATCH 4/7] arm64: boot: Support building image.fit from a specified FIT_ITS script Douglas Anderson
@ 2026-10-24 8:17 ` Simon Glass
0 siblings, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:17 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik,
Andrew Jones, Breno Leitao, David Sterba, Gary Guo,
Josh Poimboeuf, Luis Augenstein, Marco Elver, Mark Rutland,
Masahiro Yamada, Miguel Ojeda, Nick Terrell, Peter Zijlstra,
Rong Xu, Thomas Weißschuh
Hi Doug,
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> arm64: boot: Support building image.fit from a specified FIT_ITS script
Most of this patch is generic kbuild rather than arm64: the top-level
Makefile clean pattern, cmd_lz4_frame, the compressed .dtb rules, the
dtb-y filtering in Makefile.dtbs and the FIT_ITS handling in
Makefile.lib. Please can you split the lz4-frame and compressed-DTB
rules into their own 'kbuild:' patch, with the kbuild maintainers on
Cc?
>
> Allow passing `FIT_ITS=<path>` on the make command line (relative to
> either `$(srctree)` or `arch/arm64/boot/dts/`) when building `image.fit`
> to assemble the FIT image from a checked-in `.its` script via `mkimage`
> instead of auto-generating a FIT image with `scripts/make_fit.py`. When
> `FIT_ITS` is not specified, `image.fit` continues to be built using
> `scripts/make_fit.py` as before.
>
> Supporting a checked-in `.its` script includes:
> - Adding `cmd_lz4_frame` (`Image-framed.lz4` and `%.dtb.lz4`) for
> standard LZ4 frame compression (magic `0x184d2204`) expected by FIT
> bootloaders such as U-Boot and depthcharge, plus generic compressed
> DTB rules (`bz2`, `gz`, `lz4`, `lzma`, `lzo`, `zst`, `xz`) in
> `scripts/Makefile.dtbs`.
> - Restricting `$(dtb-y)` to the DTBs referenced via `/incbin/(...)` in
> `$(FIT_ITS)` and automatically building the referenced kernel image
> target (e.g. `Image-framed.lz4`) and any compressed `.dtb.<ext>`
> blobs.
> - Populating any omitted `compatible` property on
> [...]
>
> Makefile | 2 +-
> arch/arm64/Makefile | 3 +++
> arch/arm64/boot/Makefile | 9 +++++---
> scripts/Makefile.dtbs | 43 ++++++++++++++++++++++++++++++++++-
> scripts/Makefile.lib | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 111 insertions(+), 5 deletions(-)
> diff --git a/scripts/Makefile.dtbs b/scripts/Makefile.dtbs
> @@ -5,6 +5,26 @@ all-dtb := $(dtb-y) $(dtb-)
> +ifdef FIT_ITS_FILE
> +ifneq ($(filter arch/$(SRCARCH)/boot/dts%, $(obj)),)
> +its-dtb-files := $(notdir $(shell $(call fit_its_incbin,\.dtb)))
Just to check, is it intended that this also restricts 'make dtbs' and
'make dtbs_install' whenever FIT_ITS is set, not just image.fit? If
so, please say so in the commit message. Also, matching on notdir
means a DTB with the same name in another vendor directory would be
built too. There are no such duplicates today, but comparing the
directory with $(obj) would be more robust.
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> @@ -429,6 +436,58 @@ quiet_cmd_fit = FIT $@
> + fdt=$$(fdtget $@ $$conf fdt); \
> + inc=$$($(call fit_its_incbin,\.dtb,$$fdt)); \
> + dtb="$(objtree)/$${inc%.dtb*}.dtb"; \
> + compat=$$(fdtget -ts "$$dtb" / compatible); \
A FIT configuration can list more than one fdt (a base followed by
overlays, e.g. fdt = 'fdt-1', 'fdt-2'). Then $$fdt is 'fdt-1 fdt-2',
the sed range never matches, $$inc is empty and fdtget fails on
'$(objtree)/.dtb', breaking the build. Please can you use only the
first word here, since the base DTB carries the root compatible?
> + configs=$$(fdtget -l $@ /configurations); \
> + for c in $$configs; do \
BTW, adding 'compatible' to the configuration nodes after mkimage runs
would break any configuration signature, since the properties of a
signed config node are hashed. mkimage isn't given -k here, so signing
isn't supported anyway, but a comment would stop someone adding
signing later without noticing.
Regards,
Simon
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 5/7] kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor
2026-10-20 15:35 ` [RFC PATCH 5/7] kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor Douglas Anderson
@ 2026-10-24 8:17 ` Simon Glass
0 siblings, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:17 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik,
Alice Ryhl, Josh Poimboeuf, Marco Elver, Peter Zijlstra (Intel),
Rong Xu
Hi Doug,
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor
>
> Add opt-in support for factoring the DTBs inside a compiled FIT image
> into shared base DTBs and per-board overlays using `fdtfactor` when
> `FIT_FACTOR_DTBS=1` is passed to make:
Please can you add a short paragraph at the start saying why this is
wanted (the bootloader needs a base DTB plus a per-board DTBO) and
where fdtfactor comes from? It is not in scripts/dtc, so someone
reading the git log won't know where the tool lives or which version
is needed. A link to the dtc series would help.
>
> - When `FIT_FACTOR_DTBS` is set, pass `-@ -L` to `dtc` for the DTBs
> included in the FIT image so they retain `/__symbols__` and
> `/__local_fixups__` metadata needed for factoring.
> - Run `$(FDTFACTOR) $(FDTFACTOR_ARGS) -f $@` (with `FDTFACTOR_ARGS`
> defaulting to `--strip-local-fixups`) at the end of `cmd_fit` and
> `cmd_fit_its` when `FIT_FACTOR_DTBS` is set.
>
> Assisted-by: Gemini:gemini-pro-prerelease
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
>
> scripts/Makefile.dtbs | 8 ++++++++
> scripts/Makefile.lib | 18 ++++++++++++------
> 2 files changed, 20 insertions(+), 6 deletions(-)
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> @@ -425,6 +425,8 @@ quiet_cmd_uimage = UIMAGE $@
> MAKE_FIT := $(srctree)/scripts/make_fit.py
> +FDTFACTOR ?= fdtfactor
> +FDTFACTOR_ARGS ?= --strip-local-fixups
Patches 1-3 go to some trouble to build fdtget and fdtput in-tree, and
cmd_fit_its puts scripts/dtc on the PATH, but fdtfactor comes from the
host. So FIT_FACTOR_DTBS=1 uses whatever fdtfactor happens to be on
the PATH, and the build does not depend on it. Is the plan to sync
fdtfactor.c into scripts/dtc once it lands upstream? If so, it would
be worth saying so under the --- line.
> diff --git a/scripts/Makefile.dtbs b/scripts/Makefile.dtbs
> @@ -137,6 +137,14 @@ DTC_FLAGS += -Wnode_name_chars_strict \
> +# When FIT_FACTOR_DTBS is set, pass -@ -L to dtc so the built DTBs retain the
> +# /__symbols__ and /__local_fixups__ nodes required by fdtfactor.
> +ifneq ($(FIT_FACTOR_DTBS),)
> +ifneq ($(filter arch/$(SRCARCH)/boot/dts%, $(obj)),)
> +DTC_FLAGS += -@ -L
> +endif
> +endif
One thing I'd like to check is composite DTBs (the foo-dtbs :=
base.dtb bar.dtbo entries built by cmd_fdtoverlay). My understanding
is that fdt_overlay_apply() merges the overlay's __symbols__ into the
base but drops its __local_fixups__ after using them to renumber
phandles inside the overlay. So the __local_fixups__ in a composite
DTB only cover the base part, even though both inputs were built with
-L
This doesn't affect lga or trogdor, but the make_fit.py path packs
every DTB in dtbs-list, and qcom has lots of composite entries
(lemans-evk-camera.dtb, etc). If fdtfactor relies on __local_fixups__
to find phandle properties, it may silently produce a bad overlay for
these. Please can you check this? It might be enough to detect such
DTBs and skip or refuse them.
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> @@ -486,7 +490,9 @@ quiet_cmd_fit_its = FIT $@
> - done
> + done \
> + $(if $(FIT_FACTOR_DTBS),; $(FDTFACTOR) $(FDTFACTOR_ARGS) \
> + $(if $(findstring 1,$(KBUILD_VERBOSE)),-v) -f $@)
Just to check, does fdtfactor handle compressed DTBs in the FIT, i.e.
nodes with compression = 'lz4' as in sc7180-trogdor.its from patch 7?
If not, FIT_FACTOR_DTBS=1 with that .its will either fail or silently
skip the DTBs. Either way, it would be worth mentioning in the commit
message.
Regards,
Simon
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script
2026-10-20 15:35 ` [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script Douglas Anderson
2026-10-21 6:47 ` Michal Simek
@ 2026-10-24 8:17 ` Simon Glass
1 sibling, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:17 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik,
linux-samsung-soc
Hi Doug,
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> arm64: dts: google: lga: Add lga.its FIT image script
>
> Add an Image Tree Source (`lga.its`) describing the FIT image for Google
> Tensor G5 (LGA) Pixel 10 family boards (`lga-blazer.dtb`,
> `lga-frankel.dtb`, and `lga-mustang.dtb`) with board and SoC ID/revision
> metadata in the configuration descriptions, allowing the LGA FIT image
> to be built with:
>
> make \
> FIT_ITS=google/lga.its \
> FIT_FACTOR_DTBS=1 \
> FDTFACTOR_ARGS="--strip-local-fixups --single-base-dtb" \
> image.fit
>
> NOTE: At the moment, Pixel 10 doesn't directly boot from a FIT
> image. However, packaging scripts will be able to take an image as
> built above and convert it into a format that the bootloader can
> handle.
>
> It should also be noted that the "description" of the various
> [...]
>
> arch/arm64/boot/dts/google/lga.its | 68 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 68 insertions(+)
> diff --git a/arch/arm64/boot/dts/google/lga.its b/arch/arm64/boot/dts/google/lga.its
> @@ -0,0 +1,68 @@
> + fdt-1 {
> + description = "lga-blazer.dtb";
> + data = /incbin/("arch/arm64/boot/dts/google/lga-blazer.dtb");
> + type = "flat_dt";
> + arch = "arm64";
> + compression = "none";
> + hash-1 {
> + algo = "sha1";
> + };
> + };
Just to check, does fdtfactor recalculate hash-1 when it rewrites the
fdt-N data? With FIT_FACTOR_DTBS=1 (as used in the commit message),
mkimage computes the sha1 over the full lga-blazer.dtb and then the
data is replaced by the base or overlay. If the hash is not updated,
anything that verifies it will reject the image. I'm also not sure why
the FDTs get a hash but kernel-1 does not. If the hashes are only
there because the trogdor script has them, it might be simpler to drop
them here, since the packaging scripts repack everything anyway.
> diff --git a/arch/arm64/boot/dts/google/lga.its b/arch/arm64/boot/dts/google/lga.its
> @@ -0,0 +1,68 @@
> + conf-1 {
> + description = "Blazer (board_id=0x070406,board_rev=0x010000,soc_id=0x0005,soc_rev=0x010000)";
Since tools are expected to parse this string, please can you add a
comment at the top of the file describing the format? For example: are
the keys required or optional, can they come in any order, are the
numbers always hex, and does the width matter (6 digits for board_id
but 4 for soc_id)? Otherwise the format is whatever the first
packaging script happens to accept, and anyone adding a board or
revision has to copy the existing lines and hope. But I think we
should get this into the FIT spec - will mention that on the cover
letter.
Regards,
Simon
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its FIT image script
2026-10-20 15:35 ` [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its " Douglas Anderson
2026-10-21 6:49 ` Michal Simek
2026-10-21 7:52 ` Konrad Dybcio
@ 2026-10-24 8:17 ` Simon Glass
2 siblings, 0 replies; 19+ messages in thread
From: Simon Glass @ 2026-10-24 8:17 UTC (permalink / raw)
To: dianders
Cc: Devicetree-compiler, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Konrad Dybcio, linux-kbuild, Brian Norris,
Catalin Marinas, linux-kernel, linux-arm-kernel, Simon Glass,
Chen-Yu Tsai, linux-arm-msm, Nicolas Schier, Peter Griffin,
Nathan Chancellor, Tudor Ambarus, Devicetree, Julius Werner,
Saravana Kannan, Will Deacon, Michal Simek, André Draszik,
Bjorn Andersson, cros-qcom-dts-watchers
Hi Doug,
On 2026-10-20T15:35:18, Douglas Anderson <dianders@chromium.org> wrote:
> arm64: dts: qcom: sc7180: Add sc7180-trogdor.its FIT image script
>
> Add an Image Tree Source (`sc7180-trogdor.its`) describing the FIT
> image for SC7180 Trogdor family boards using `Image-framed.lz4` and
> LZ4-compressed board DTBs (`*.dtb.lz4`), allowing the Trogdor FIT image
> to be built with:
This says what the file is but not why it is wanted. Please can you
move a short version of your notes below the --- into the commit
message (matching what the ChromeOS scripts produce, a model for
future Chromebooks, helping people who run upstream kernels on
trogdor)?
>
> make FIT_ITS=qcom/sc7180-trogdor.its image.fit
>
> Assisted-by: Gemini:gemini-pro-prerelease
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
>
> arch/arm64/boot/dts/qcom/sc7180-trogdor.its | 728 ++++++++++++++++++++++++++++
> 1 file changed, 728 insertions(+)
> diff --git a/arch/arm64/boot/dts/qcom/sc7180-trogdor.its b/arch/arm64/boot/dts/qcom/sc7180-trogdor.its
> @@ -0,0 +1,728 @@
> + configurations {
> + conf-1 {
> + description = "sc7180-trogdor-coachz-r1-lte";
> + kernel = "kernel-1";
> + fdt = "fdt-1";
> + };
One thing I'd like to check. Patch 4 says the main reason for a
checked-in .its is to have a hand-written description per
configuration, but here each description is just the DTB filename, the
compatible is filled in automatically, and patch 5 adds fdtfactor to
cmd_fit too. So as far as I can tell, the only thing this file gives
over 'make FIT_COMPRESSION=lz4 image.fit' is limiting the FIT to the
trogdor DTBs. In exchange there are 47 entries which must be updated
by hand whenever a trogdor board is added to or removed from
qcom/Makefile, and nothing checks this. The list matches the Makefile
today, but the two are likely to drift apart. Would a way to filter
the dtbs-list passed to make_fit.py (e.g. by a pattern such as
sc7180-trogdor-*) get you the same result without the duplication?
What do you think?
Regards,
Simon
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2026-10-24 8:17 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-20 15:35 [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Douglas Anderson
2026-10-20 15:35 ` [RFC PATCH 1/7] scripts/dtc: Add fdtget.c and fdtput.c to sync script Douglas Anderson
2026-10-24 8:16 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 2/7] scripts/dtc: Update to upstream version v1.8.1-22-gf3451d12532b Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 3/7] scripts/dtc: Build fdtget and fdtput host tools Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 4/7] arm64: boot: Support building image.fit from a specified FIT_ITS script Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 5/7] kbuild: fit: Add opt-in FIT_FACTOR_DTBS support using fdtfactor Douglas Anderson
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 6/7] arm64: dts: google: lga: Add lga.its FIT image script Douglas Anderson
2026-10-21 6:47 ` Michal Simek
2026-10-24 8:17 ` Simon Glass
2026-10-20 15:35 ` [RFC PATCH 7/7] arm64: dts: qcom: sc7180: Add sc7180-trogdor.its " Douglas Anderson
2026-10-21 6:49 ` Michal Simek
2026-10-21 7:52 ` Konrad Dybcio
2026-10-24 8:17 ` Simon Glass
2026-10-24 8:16 ` [RFC PATCH 0/7] arm64: Add fit images for sc7180-trogdor and google,lga Simon Glass
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox