Commit 79edff12 authored by Rob Herring's avatar Rob Herring

scripts/dtc: Update to upstream version v1.6.0-51-g183df9e9c2b9

This adds the following commits from upstream:

183df9e9c2b9 gitignore: Ignore the swp files
0db6d09584e1 gitignore: Add cscope files
307afa1a7be8 Update Jon Loeliger's email
ca16a723fa9d fdtdump: Fix gcc11 warning
64990a272e8f srcpos: increase MAX_SRCFILE_DEPTH
163f0469bf2e dtc: Allow overlays to have .dtbo extension
3b01518e688d Set last_comp_version correctly in new dtb and fix potential version issues in fdt_open_into
f7e5737f26aa tests: Fix overlay_overlay_nosugar test case
7cd5d5fe43d5 libfdt: Tweak description of assume-aligned load helpers
a7c404099349 libfdt: Internally perform potentially unaligned loads
bab85e48a6f4 meson: increase default timeout for tests
f8b46098824d meson: do not assume python is installed, skip tests
30a56bce4f0b meson: fix -Wall warning
5e735860c478 libfdt: Check for 8-byte address alignment in fdt_ro_probe_()
67849a327927 build-sys: add meson build
05874d08212d pylibfdt: allow build out of tree
3bc3a6b9fe0c dtc: Fix signedness comparisons warnings: Wrap (-1)
e1147b159e92 dtc: Fix signedness comparisons warnings: change types
04cf1fdc0fcf convert-dtsv0: Fix signedness comparisons warning
b30013edb878 libfdt: Fix kernel-doc comments
Signed-off-by: default avatarRob Herring <robh@kernel.org>
parent b775f49f
...@@ -21,10 +21,10 @@ void data_free(struct data d) ...@@ -21,10 +21,10 @@ void data_free(struct data d)
free(d.val); free(d.val);
} }
struct data data_grow_for(struct data d, int xlen) struct data data_grow_for(struct data d, unsigned int xlen)
{ {
struct data nd; struct data nd;
int newsize; unsigned int newsize;
if (xlen == 0) if (xlen == 0)
return d; return d;
...@@ -84,7 +84,7 @@ struct data data_copy_file(FILE *f, size_t maxlen) ...@@ -84,7 +84,7 @@ struct data data_copy_file(FILE *f, size_t maxlen)
while (!feof(f) && (d.len < maxlen)) { while (!feof(f) && (d.len < maxlen)) {
size_t chunksize, ret; size_t chunksize, ret;
if (maxlen == -1) if (maxlen == (size_t)-1)
chunksize = 4096; chunksize = 4096;
else else
chunksize = maxlen - d.len; chunksize = maxlen - d.len;
......
...@@ -122,6 +122,8 @@ static const char *guess_type_by_name(const char *fname, const char *fallback) ...@@ -122,6 +122,8 @@ static const char *guess_type_by_name(const char *fname, const char *fallback)
return "dts"; return "dts";
if (!strcasecmp(s, ".yaml")) if (!strcasecmp(s, ".yaml"))
return "yaml"; return "yaml";
if (!strcasecmp(s, ".dtbo"))
return "dtb";
if (!strcasecmp(s, ".dtb")) if (!strcasecmp(s, ".dtb"))
return "dtb"; return "dtb";
return fallback; return fallback;
...@@ -357,6 +359,8 @@ int main(int argc, char *argv[]) ...@@ -357,6 +359,8 @@ int main(int argc, char *argv[])
#endif #endif
} else if (streq(outform, "dtb")) { } else if (streq(outform, "dtb")) {
dt_to_blob(outf, dti, outversion); dt_to_blob(outf, dti, outversion);
} else if (streq(outform, "dtbo")) {
dt_to_blob(outf, dti, outversion);
} else if (streq(outform, "asm")) { } else if (streq(outform, "asm")) {
dt_to_asm(outf, dti, outversion); dt_to_asm(outf, dti, outversion);
} else if (streq(outform, "null")) { } else if (streq(outform, "null")) {
......
...@@ -105,13 +105,13 @@ extern const char *markername(enum markertype markertype); ...@@ -105,13 +105,13 @@ extern const char *markername(enum markertype markertype);
struct marker { struct marker {
enum markertype type; enum markertype type;
int offset; unsigned int offset;
char *ref; char *ref;
struct marker *next; struct marker *next;
}; };
struct data { struct data {
int len; unsigned int len;
char *val; char *val;
struct marker *markers; struct marker *markers;
}; };
...@@ -129,7 +129,7 @@ size_t type_marker_length(struct marker *m); ...@@ -129,7 +129,7 @@ size_t type_marker_length(struct marker *m);
void data_free(struct data d); void data_free(struct data d);
struct data data_grow_for(struct data d, int xlen); struct data data_grow_for(struct data d, unsigned int xlen);
struct data data_copy_mem(const char *mem, int len); struct data data_copy_mem(const char *mem, int len);
struct data data_copy_escape_string(const char *s, int len); struct data data_copy_escape_string(const char *s, int len);
...@@ -253,7 +253,7 @@ void append_to_property(struct node *node, ...@@ -253,7 +253,7 @@ void append_to_property(struct node *node,
const char *get_unitname(struct node *node); const char *get_unitname(struct node *node);
struct property *get_property(struct node *node, const char *propname); struct property *get_property(struct node *node, const char *propname);
cell_t propval_cell(struct property *prop); cell_t propval_cell(struct property *prop);
cell_t propval_cell_n(struct property *prop, int n); cell_t propval_cell_n(struct property *prop, unsigned int n);
struct property *get_property_by_label(struct node *tree, const char *label, struct property *get_property_by_label(struct node *tree, const char *label,
struct node **node); struct node **node);
struct marker *get_marker_label(struct node *tree, const char *label, struct marker *get_marker_label(struct node *tree, const char *label,
......
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2017 Konsulko Group Inc. All rights reserved.
*
* Author:
* Pantelis Antoniou <pantelis.antoniou@konsulko.com>
*/
#include <assert.h>
#include <ctype.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <libfdt.h>
#include "util.h"
#define BUF_INCREMENT 65536
/* Usage related data. */
static const char usage_synopsis[] =
"apply a number of overlays to a base blob\n"
" fdtoverlay <options> [<overlay.dtbo> [<overlay.dtbo>]]\n"
"\n"
USAGE_TYPE_MSG;
static const char usage_short_opts[] = "i:o:v" USAGE_COMMON_SHORT_OPTS;
static struct option const usage_long_opts[] = {
{"input", required_argument, NULL, 'i'},
{"output", required_argument, NULL, 'o'},
{"verbose", no_argument, NULL, 'v'},
USAGE_COMMON_LONG_OPTS,
};
static const char * const usage_opts_help[] = {
"Input base DT blob",
"Output DT blob",
"Verbose messages",
USAGE_COMMON_OPTS_HELP
};
int verbose = 0;
static void *apply_one(char *base, const char *overlay, size_t *buf_len,
const char *name)
{
char *tmp = NULL;
char *tmpo;
int ret;
/*
* We take a copies first, because a a failed apply can trash
* both the base blob and the overlay
*/
tmpo = xmalloc(fdt_totalsize(overlay));
do {
tmp = xrealloc(tmp, *buf_len);
ret = fdt_open_into(base, tmp, *buf_len);
if (ret) {
fprintf(stderr,
"\nFailed to make temporary copy: %s\n",
fdt_strerror(ret));
goto fail;
}
memcpy(tmpo, overlay, fdt_totalsize(overlay));
ret = fdt_overlay_apply(tmp, tmpo);
if (ret == -FDT_ERR_NOSPACE) {
*buf_len += BUF_INCREMENT;
}
} while (ret == -FDT_ERR_NOSPACE);
if (ret) {
fprintf(stderr, "\nFailed to apply '%s': %s\n",
name, fdt_strerror(ret));
goto fail;
}
free(base);
free(tmpo);
return tmp;
fail:
free(tmpo);
if (tmp)
free(tmp);
return NULL;
}
static int do_fdtoverlay(const char *input_filename,
const char *output_filename,
int argc, char *argv[])
{
char *blob = NULL;
char **ovblob = NULL;
size_t buf_len;
int i, ret = -1;
blob = utilfdt_read(input_filename, &buf_len);
if (!blob) {
fprintf(stderr, "\nFailed to read '%s'\n", input_filename);
goto out_err;
}
if (fdt_totalsize(blob) > buf_len) {
fprintf(stderr,
"\nBase blob is incomplete (%lu / %" PRIu32 " bytes read)\n",
(unsigned long)buf_len, fdt_totalsize(blob));
goto out_err;
}
/* allocate blob pointer array */
ovblob = xmalloc(sizeof(*ovblob) * argc);
memset(ovblob, 0, sizeof(*ovblob) * argc);
/* read and keep track of the overlay blobs */
for (i = 0; i < argc; i++) {
size_t ov_len;
ovblob[i] = utilfdt_read(argv[i], &ov_len);
if (!ovblob[i]) {
fprintf(stderr, "\nFailed to read '%s'\n", argv[i]);
goto out_err;
}
if (fdt_totalsize(ovblob[i]) > ov_len) {
fprintf(stderr,
"\nOverlay '%s' is incomplete (%lu / %" PRIu32 " bytes read)\n",
argv[i], (unsigned long)ov_len,
fdt_totalsize(ovblob[i]));
goto out_err;
}
}
buf_len = fdt_totalsize(blob);
/* apply the overlays in sequence */
for (i = 0; i < argc; i++) {
blob = apply_one(blob, ovblob[i], &buf_len, argv[i]);
if (!blob)
goto out_err;
}
fdt_pack(blob);
ret = utilfdt_write(output_filename, blob);
if (ret)
fprintf(stderr, "\nFailed to write '%s'\n",
output_filename);
out_err:
if (ovblob) {
for (i = 0; i < argc; i++) {
if (ovblob[i])
free(ovblob[i]);
}
free(ovblob);
}
free(blob);
return ret;
}
int main(int argc, char *argv[])
{
int opt, i;
char *input_filename = NULL;
char *output_filename = NULL;
while ((opt = util_getopt_long()) != EOF) {
switch (opt) {
case_USAGE_COMMON_FLAGS
case 'i':
input_filename = optarg;
break;
case 'o':
output_filename = optarg;
break;
case 'v':
verbose = 1;
break;
}
}
if (!input_filename)
usage("missing input file");
if (!output_filename)
usage("missing output file");
argv += optind;
argc -= optind;
if (argc <= 0)
usage("missing overlay file(s)");
if (verbose) {
printf("input = %s\n", input_filename);
printf("output = %s\n", output_filename);
for (i = 0; i < argc; i++)
printf("overlay[%d] = %s\n", i, argv[i]);
}
if (do_fdtoverlay(input_filename, output_filename, argc, argv))
return 1;
return 0;
}
...@@ -149,7 +149,7 @@ static void asm_emit_align(void *e, int a) ...@@ -149,7 +149,7 @@ static void asm_emit_align(void *e, int a)
static void asm_emit_data(void *e, struct data d) static void asm_emit_data(void *e, struct data d)
{ {
FILE *f = e; FILE *f = e;
int off = 0; unsigned int off = 0;
struct marker *m = d.markers; struct marker *m = d.markers;
for_each_marker_of_type(m, LABEL) for_each_marker_of_type(m, LABEL)
...@@ -219,7 +219,7 @@ static struct emitter asm_emitter = { ...@@ -219,7 +219,7 @@ static struct emitter asm_emitter = {
static int stringtable_insert(struct data *d, const char *str) static int stringtable_insert(struct data *d, const char *str)
{ {
int i; unsigned int i;
/* FIXME: do this more efficiently? */ /* FIXME: do this more efficiently? */
...@@ -345,7 +345,7 @@ static void make_fdt_header(struct fdt_header *fdt, ...@@ -345,7 +345,7 @@ static void make_fdt_header(struct fdt_header *fdt,
void dt_to_blob(FILE *f, struct dt_info *dti, int version) void dt_to_blob(FILE *f, struct dt_info *dti, int version)
{ {
struct version_info *vi = NULL; struct version_info *vi = NULL;
int i; unsigned int i;
struct data blob = empty_data; struct data blob = empty_data;
struct data reservebuf = empty_data; struct data reservebuf = empty_data;
struct data dtbuf = empty_data; struct data dtbuf = empty_data;
...@@ -446,7 +446,7 @@ static void dump_stringtable_asm(FILE *f, struct data strbuf) ...@@ -446,7 +446,7 @@ static void dump_stringtable_asm(FILE *f, struct data strbuf)
void dt_to_asm(FILE *f, struct dt_info *dti, int version) void dt_to_asm(FILE *f, struct dt_info *dti, int version)
{ {
struct version_info *vi = NULL; struct version_info *vi = NULL;
int i; unsigned int i;
struct data strbuf = empty_data; struct data strbuf = empty_data;
struct reserve_info *re; struct reserve_info *re;
const char *symprefix = "dt"; const char *symprefix = "dt";
......
...@@ -22,6 +22,10 @@ int32_t fdt_ro_probe_(const void *fdt) ...@@ -22,6 +22,10 @@ int32_t fdt_ro_probe_(const void *fdt)
if (can_assume(VALID_DTB)) if (can_assume(VALID_DTB))
return totalsize; return totalsize;
/* The device tree must be at an 8-byte aligned address */
if ((uintptr_t)fdt & 7)
return -FDT_ERR_ALIGNMENT;
if (fdt_magic(fdt) == FDT_MAGIC) { if (fdt_magic(fdt) == FDT_MAGIC) {
/* Complete tree */ /* Complete tree */
if (!can_assume(LATEST)) { if (!can_assume(LATEST)) {
......
...@@ -181,8 +181,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) ...@@ -181,8 +181,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
if (!can_assume(VALID_INPUT) && !re) if (!can_assume(VALID_INPUT) && !re)
return -FDT_ERR_BADOFFSET; return -FDT_ERR_BADOFFSET;
*address = fdt64_ld(&re->address); *address = fdt64_ld_(&re->address);
*size = fdt64_ld(&re->size); *size = fdt64_ld_(&re->size);
return 0; return 0;
} }
...@@ -192,7 +192,7 @@ int fdt_num_mem_rsv(const void *fdt) ...@@ -192,7 +192,7 @@ int fdt_num_mem_rsv(const void *fdt)
const struct fdt_reserve_entry *re; const struct fdt_reserve_entry *re;
for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) { for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) {
if (fdt64_ld(&re->size) == 0) if (fdt64_ld_(&re->size) == 0)
return i; return i;
} }
return -FDT_ERR_TRUNCATED; return -FDT_ERR_TRUNCATED;
...@@ -370,7 +370,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt, ...@@ -370,7 +370,7 @@ static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt,
prop = fdt_offset_ptr_(fdt, offset); prop = fdt_offset_ptr_(fdt, offset);
if (lenp) if (lenp)
*lenp = fdt32_ld(&prop->len); *lenp = fdt32_ld_(&prop->len);
return prop; return prop;
} }
...@@ -408,7 +408,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt, ...@@ -408,7 +408,7 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt,
offset = -FDT_ERR_INTERNAL; offset = -FDT_ERR_INTERNAL;
break; break;
} }
if (fdt_string_eq_(fdt, fdt32_ld(&prop->nameoff), if (fdt_string_eq_(fdt, fdt32_ld_(&prop->nameoff),
name, namelen)) { name, namelen)) {
if (poffset) if (poffset)
*poffset = offset; *poffset = offset;
...@@ -461,7 +461,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, ...@@ -461,7 +461,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
/* Handle realignment */ /* Handle realignment */
if (!can_assume(LATEST) && fdt_version(fdt) < 0x10 && if (!can_assume(LATEST) && fdt_version(fdt) < 0x10 &&
(poffset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) (poffset + sizeof(*prop)) % 8 && fdt32_ld_(&prop->len) >= 8)
return prop->data + 4; return prop->data + 4;
return prop->data; return prop->data;
} }
...@@ -479,7 +479,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, ...@@ -479,7 +479,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
int namelen; int namelen;
if (!can_assume(VALID_INPUT)) { if (!can_assume(VALID_INPUT)) {
name = fdt_get_string(fdt, fdt32_ld(&prop->nameoff), name = fdt_get_string(fdt, fdt32_ld_(&prop->nameoff),
&namelen); &namelen);
if (!name) { if (!name) {
if (lenp) if (lenp)
...@@ -488,13 +488,13 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, ...@@ -488,13 +488,13 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
} }
*namep = name; *namep = name;
} else { } else {
*namep = fdt_string(fdt, fdt32_ld(&prop->nameoff)); *namep = fdt_string(fdt, fdt32_ld_(&prop->nameoff));
} }
} }
/* Handle realignment */ /* Handle realignment */
if (!can_assume(LATEST) && fdt_version(fdt) < 0x10 && if (!can_assume(LATEST) && fdt_version(fdt) < 0x10 &&
(offset + sizeof(*prop)) % 8 && fdt32_ld(&prop->len) >= 8) (offset + sizeof(*prop)) % 8 && fdt32_ld_(&prop->len) >= 8)
return prop->data + 4; return prop->data + 4;
return prop->data; return prop->data;
} }
...@@ -519,7 +519,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) ...@@ -519,7 +519,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
return 0; return 0;
} }
return fdt32_ld(php); return fdt32_ld_(php);
} }
const char *fdt_get_alias_namelen(const void *fdt, const char *fdt_get_alias_namelen(const void *fdt,
......
...@@ -428,12 +428,14 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize) ...@@ -428,12 +428,14 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
if (can_assume(LATEST) || fdt_version(fdt) >= 17) { if (can_assume(LATEST) || fdt_version(fdt) >= 17) {
struct_size = fdt_size_dt_struct(fdt); struct_size = fdt_size_dt_struct(fdt);
} else { } else if (fdt_version(fdt) == 16) {
struct_size = 0; struct_size = 0;
while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END) while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
; ;
if (struct_size < 0) if (struct_size < 0)
return struct_size; return struct_size;
} else {
return -FDT_ERR_BADVERSION;
} }
if (can_assume(LIBFDT_ORDER) || if (can_assume(LIBFDT_ORDER) ||
......
...@@ -377,7 +377,7 @@ int fdt_finish(void *fdt) ...@@ -377,7 +377,7 @@ int fdt_finish(void *fdt)
fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt)); fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
/* And fix up fields that were keeping intermediate state. */ /* And fix up fields that were keeping intermediate state. */
fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); fdt_set_last_comp_version(fdt, FDT_LAST_COMPATIBLE_VERSION);
fdt_set_magic(fdt, FDT_MAGIC); fdt_set_magic(fdt, FDT_MAGIC);
return 0; return 0;
......
This diff is collapsed.
...@@ -46,6 +46,25 @@ static inline struct fdt_reserve_entry *fdt_mem_rsv_w_(void *fdt, int n) ...@@ -46,6 +46,25 @@ static inline struct fdt_reserve_entry *fdt_mem_rsv_w_(void *fdt, int n)
return (void *)(uintptr_t)fdt_mem_rsv_(fdt, n); return (void *)(uintptr_t)fdt_mem_rsv_(fdt, n);
} }
/*
* Internal helpers to access tructural elements of the device tree
* blob (rather than for exaple reading integers from within property
* values). We assume that we are either given a naturally aligned
* address for the platform or if we are not, we are on a platform
* where unaligned memory reads will be handled in a graceful manner.
* If not the external helpers fdtXX_ld() from libfdt.h can be used
* instead.
*/
static inline uint32_t fdt32_ld_(const fdt32_t *p)
{
return fdt32_to_cpu(*p);
}
static inline uint64_t fdt64_ld_(const fdt64_t *p)
{
return fdt64_to_cpu(*p);
}
#define FDT_SW_MAGIC (~FDT_MAGIC) #define FDT_SW_MAGIC (~FDT_MAGIC)
/**********************************************************************/ /**********************************************************************/
......
...@@ -438,7 +438,7 @@ cell_t propval_cell(struct property *prop) ...@@ -438,7 +438,7 @@ cell_t propval_cell(struct property *prop)
return fdt32_to_cpu(*((fdt32_t *)prop->val.val)); return fdt32_to_cpu(*((fdt32_t *)prop->val.val));
} }
cell_t propval_cell_n(struct property *prop, int n) cell_t propval_cell_n(struct property *prop, unsigned int n)
{ {
assert(prop->val.len / sizeof(cell_t) >= n); assert(prop->val.len / sizeof(cell_t) >= n);
return fdt32_to_cpu(*((fdt32_t *)prop->val.val + n)); return fdt32_to_cpu(*((fdt32_t *)prop->val.val + n));
......
...@@ -20,7 +20,7 @@ struct search_path { ...@@ -20,7 +20,7 @@ struct search_path {
static struct search_path *search_path_head, **search_path_tail; static struct search_path *search_path_head, **search_path_tail;
/* Detect infinite include recursion. */ /* Detect infinite include recursion. */
#define MAX_SRCFILE_DEPTH (100) #define MAX_SRCFILE_DEPTH (200)
static int srcfile_depth; /* = 0 */ static int srcfile_depth; /* = 0 */
static char *get_dirname(const char *path) static char *get_dirname(const char *path)
......
#define DTC_VERSION "DTC 1.6.0-gcbca977e" #define DTC_VERSION "DTC 1.6.0-g183df9e9"
...@@ -29,11 +29,11 @@ char *yaml_error_name[] = { ...@@ -29,11 +29,11 @@ char *yaml_error_name[] = {
(emitter)->problem, __func__, __LINE__); \ (emitter)->problem, __func__, __LINE__); \
}) })
static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, char *data, int len, int width) static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, char *data, unsigned int len, int width)
{ {
yaml_event_t event; yaml_event_t event;
void *tag; void *tag;
int off, start_offset = markers->offset; unsigned int off, start_offset = markers->offset;
switch(width) { switch(width) {
case 1: tag = "!u8"; break; case 1: tag = "!u8"; break;
...@@ -112,7 +112,7 @@ static void yaml_propval_string(yaml_emitter_t *emitter, char *str, int len) ...@@ -112,7 +112,7 @@ static void yaml_propval_string(yaml_emitter_t *emitter, char *str, int len)
static void yaml_propval(yaml_emitter_t *emitter, struct property *prop) static void yaml_propval(yaml_emitter_t *emitter, struct property *prop)
{ {
yaml_event_t event; yaml_event_t event;
int len = prop->val.len; unsigned int len = prop->val.len;
struct marker *m = prop->val.markers; struct marker *m = prop->val.markers;
/* Emit the property name */ /* Emit the property name */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment