mirror of https://github.com/torvalds/linux.git
scripts/dtc: Update to upstream version v1.7.2-35-g52f07dcca47c
This adds the following commits from upstream: 52f07dcca47c dtc: Add informative error for stray identifier 9cabae6b0351 checks: Fix detection of 'i2c-bus' node 605dc044c3fe New helper to add markers 7da5d106c740 fdtput: Fix documentation about existing nodes 53c63dd421d7 dtdiff: Use input format dtb for dtbo files 84d9dd2fcbc8 dtc: Add data_insert_data function 97011d1f4e98 meson: use override_find_program/override_dependency b841391bbd08 srcpos: Define srcpos_free e0b7749c26a9 Add alloc_marker ecb21febfdd3 meson: port python bindings to build natively via meson and meson-python 7ebfcac8520e Makefile: deprecate in favor of Meson f4c53f4ebf78 Use __ASSEMBLER__ instead of __ASSEMBLY__ 205fbef17b7b Fix some typos da85f91931e5 Remove duplicated words in documentation and comments dd1b3e532d22 meson: support building libfdt without static library 1ccd232709d4 meson: don't build test programs by default ce1d8588880a tests: When building .so from -O asm output mark as non-executable stack 915daadbb62d Start with empty __local_fixups__ and __fixups__ nodes 4ea851f5a44d Let get_subnode() not return deleted nodes 175d2a564c47 Use build_root_node() instead of open-coding it 18f4f305fdd7 build: fix -Dtools=false build 267efc7d4694 checks: Warn about missing #address-cells for interrupt parents 755db115355b libfdt: Add fdt_setprop_namelen_string() bdca8612009e libfdt: Add fdt_setprop_namelen() 0f69cedc08fc libfdt_internal: fdt_find_string_len_() 56b2b30c5bd0 libfdt: add fdt_get_property_namelen_w() 1e8c5f60e127 Add clang-format config 6f183c7d9246 checks: Relax avoid_unnecessary_addr_size check to allow child ranges properties 66c7d0e6f4f3 tests/sw_tree1.c: fix unitialized saveptr 9a969f3b70b0 pylibfdt/libfdt.i: fix backwards compatibility of return values 4292b072a23a .github/workflows: update ubuntu runner to supported version 1c745a9bd169 libfdt: Remove fdt parameter from overlay_fixup_one_phandle b3bbee6b1242 libfdt: Move the SBOM authors section d1656730abfb Add a SBOM file in CycloneDX format b75515af4576 libfdt: Remove extra semi-colons outside functions 2d10aa2afe35 Bump version to v1.7.2 48795c82bdb6 pylibfdt: Don't emit warnings from swig generate C code 838f11e830e3 fdtoverlay: provide better error message for missing `/__symbols__` d1e2384185c5 pylibfdt/libfdt.i: Use SWIG_AppendOutput 18aa49a9f68d Escape spaces in depfile with backslashes. f9968fa06921 libfdt.h: whitespace consistency fixups 9b5f65fb3d8d libfdt.h: typo and consistency fixes 99031e3a4a6e Bump version to v1.7.1 3d5e376925fd setup: Move setting of srcdir down to the bottom e277553b9880 setup: Collect top-level code together 7e5a88984081 setup: Move version and full_description into a function 78b6a85c113b Tidy up some pylint warnings 3501d373f0a2 Require Python 3 The added include of string.h in libfdt_internal.h breaks the kernel overriding libfdt_env.h with its own string functions, so it is dropped. An upstream fix is pending. Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
This commit is contained in:
parent
684339e80a
commit
c072d2b495
|
|
@ -97,6 +97,7 @@ DTC_FLAGS += -Wno-unit_address_vs_reg \
|
||||||
-Wno-avoid_unnecessary_addr_size \
|
-Wno-avoid_unnecessary_addr_size \
|
||||||
-Wno-alias_paths \
|
-Wno-alias_paths \
|
||||||
-Wno-graph_child_address \
|
-Wno-graph_child_address \
|
||||||
|
-Wno-interrupt_map \
|
||||||
-Wno-simple_bus_reg
|
-Wno-simple_bus_reg
|
||||||
else
|
else
|
||||||
DTC_FLAGS += -Wunique_unit_address_if_enabled
|
DTC_FLAGS += -Wunique_unit_address_if_enabled
|
||||||
|
|
|
||||||
|
|
@ -1024,7 +1024,7 @@ static void check_i2c_bus_bridge(struct check *c, struct dt_info *dti, struct no
|
||||||
} else if (strprefixeq(node->name, node->basenamelen, "i2c")) {
|
} else if (strprefixeq(node->name, node->basenamelen, "i2c")) {
|
||||||
struct node *child;
|
struct node *child;
|
||||||
for_each_child(node, child) {
|
for_each_child(node, child) {
|
||||||
if (strprefixeq(child->name, node->basenamelen, "i2c-bus"))
|
if (strprefixeq(child->name, child->basenamelen, "i2c-bus"))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
node->bus = &i2c_bus;
|
node->bus = &i2c_bus;
|
||||||
|
|
@ -1217,9 +1217,7 @@ WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL,
|
||||||
static void check_avoid_unnecessary_addr_size(struct check *c, struct dt_info *dti,
|
static void check_avoid_unnecessary_addr_size(struct check *c, struct dt_info *dti,
|
||||||
struct node *node)
|
struct node *node)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
|
||||||
struct node *child;
|
struct node *child;
|
||||||
bool has_reg = false;
|
|
||||||
|
|
||||||
if (!node->parent || node->addr_cells < 0 || node->size_cells < 0)
|
if (!node->parent || node->addr_cells < 0 || node->size_cells < 0)
|
||||||
return;
|
return;
|
||||||
|
|
@ -1228,13 +1226,18 @@ static void check_avoid_unnecessary_addr_size(struct check *c, struct dt_info *d
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for_each_child(node, child) {
|
for_each_child(node, child) {
|
||||||
prop = get_property(child, "reg");
|
/*
|
||||||
if (prop)
|
* Even if the child devices' address space is not mapped into
|
||||||
has_reg = true;
|
* the parent bus (no 'ranges' property on node), children can
|
||||||
|
* still have registers on a local bus, or map local addresses
|
||||||
|
* to another subordinate address space. The properties on the
|
||||||
|
* child nodes then make #address-cells/#size-cells necessary:
|
||||||
|
*/
|
||||||
|
if (get_property(child, "reg") || get_property(child, "ranges"))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!has_reg)
|
FAIL(c, dti, node, "unnecessary #address-cells/#size-cells without \"ranges\", \"dma-ranges\" or child \"reg\" or \"ranges\" property");
|
||||||
FAIL(c, dti, node, "unnecessary #address-cells/#size-cells without \"ranges\", \"dma-ranges\" or child \"reg\" property");
|
|
||||||
}
|
}
|
||||||
WARNING(avoid_unnecessary_addr_size, check_avoid_unnecessary_addr_size, NULL, &avoid_default_addr_size);
|
WARNING(avoid_unnecessary_addr_size, check_avoid_unnecessary_addr_size, NULL, &avoid_default_addr_size);
|
||||||
|
|
||||||
|
|
@ -1673,6 +1676,10 @@ static void check_interrupt_map(struct check *c,
|
||||||
cellprop = get_property(provider_node, "#address-cells");
|
cellprop = get_property(provider_node, "#address-cells");
|
||||||
if (cellprop)
|
if (cellprop)
|
||||||
parent_cellsize += propval_cell(cellprop);
|
parent_cellsize += propval_cell(cellprop);
|
||||||
|
else
|
||||||
|
FAIL_PROP(c, dti, node, irq_map_prop,
|
||||||
|
"Missing property '#address-cells' in node %s, using 0 as fallback",
|
||||||
|
provider_node->fullpath);
|
||||||
|
|
||||||
cell += 1 + parent_cellsize;
|
cell += 1 + parent_cellsize;
|
||||||
if (cell > map_cells)
|
if (cell > map_cells)
|
||||||
|
|
|
||||||
|
|
@ -228,11 +228,7 @@ struct data data_add_marker(struct data d, enum markertype type, char *ref)
|
||||||
{
|
{
|
||||||
struct marker *m;
|
struct marker *m;
|
||||||
|
|
||||||
m = xmalloc(sizeof(*m));
|
m = alloc_marker(d.len, type, ref);
|
||||||
m->offset = d.len;
|
|
||||||
m->type = type;
|
|
||||||
m->ref = ref;
|
|
||||||
m->next = NULL;
|
|
||||||
|
|
||||||
return data_append_markers(d, m);
|
return data_append_markers(d, m);
|
||||||
}
|
}
|
||||||
|
|
@ -254,3 +250,44 @@ bool data_is_one_string(struct data d)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct data data_insert_data(struct data d, struct marker *m, struct data old)
|
||||||
|
{
|
||||||
|
unsigned int offset = m->offset;
|
||||||
|
struct marker *next = m->next;
|
||||||
|
struct marker *marker;
|
||||||
|
struct data new_data;
|
||||||
|
char *ref;
|
||||||
|
|
||||||
|
new_data = data_insert_at_marker(d, m, old.val, old.len);
|
||||||
|
|
||||||
|
/* Copy all markers from old value */
|
||||||
|
marker = old.markers;
|
||||||
|
for_each_marker(marker) {
|
||||||
|
ref = NULL;
|
||||||
|
|
||||||
|
if (marker->ref)
|
||||||
|
ref = xstrdup(marker->ref);
|
||||||
|
|
||||||
|
m->next = alloc_marker(marker->offset + offset, marker->type,
|
||||||
|
ref);
|
||||||
|
m = m->next;
|
||||||
|
}
|
||||||
|
m->next = next;
|
||||||
|
|
||||||
|
return new_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct marker *alloc_marker(unsigned int offset, enum markertype type,
|
||||||
|
char *ref)
|
||||||
|
{
|
||||||
|
struct marker *m;
|
||||||
|
|
||||||
|
m = xmalloc(sizeof(*m));
|
||||||
|
m->offset = offset;
|
||||||
|
m->type = type;
|
||||||
|
m->ref = ref;
|
||||||
|
m->next = NULL;
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,21 @@ static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
|
||||||
return DT_LABEL;
|
return DT_LABEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<V1>{LABEL} {
|
||||||
|
/* Missed includes or macro definitions while
|
||||||
|
* preprocessing can lead to unexpected identifiers in
|
||||||
|
* the input. Report a slightly more informative error
|
||||||
|
* in this case */
|
||||||
|
|
||||||
|
lexical_error("Unexpected '%s'", yytext);
|
||||||
|
|
||||||
|
/* Treat it as a literal which often generates further
|
||||||
|
* useful error messages */
|
||||||
|
|
||||||
|
yylval.integer = 0;
|
||||||
|
return DT_LITERAL;
|
||||||
|
}
|
||||||
|
|
||||||
<V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
|
<V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
|
||||||
char *e;
|
char *e;
|
||||||
DPRINT("Integer Literal: '%s'\n", yytext);
|
DPRINT("Integer Literal: '%s'\n", yytext);
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ int quiet; /* Level of quietness */
|
||||||
unsigned int reservenum;/* Number of memory reservation slots */
|
unsigned int reservenum;/* Number of memory reservation slots */
|
||||||
int minsize; /* Minimum blob size */
|
int minsize; /* Minimum blob size */
|
||||||
int padsize; /* Additional padding to blob */
|
int padsize; /* Additional padding to blob */
|
||||||
int alignsize; /* Additional padding to blob accroding to the alignsize */
|
int alignsize; /* Additional padding to blob according to the alignsize */
|
||||||
int phandle_format = PHANDLE_EPAPR; /* Use linux,phandle or phandle properties */
|
int phandle_format = PHANDLE_EPAPR; /* Use linux,phandle or phandle properties */
|
||||||
int generate_symbols; /* enable symbols & fixup support */
|
int generate_symbols; /* enable symbols & fixup support */
|
||||||
int generate_fixups; /* suppress generation of fixups on symbol support */
|
int generate_fixups; /* suppress generation of fixups on symbol support */
|
||||||
|
|
@ -289,7 +289,9 @@ int main(int argc, char *argv[])
|
||||||
if (!depfile)
|
if (!depfile)
|
||||||
die("Couldn't open dependency file %s: %s\n", depname,
|
die("Couldn't open dependency file %s: %s\n", depname,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
fprintf(depfile, "%s:", outname);
|
|
||||||
|
fprint_path_escaped(depfile, outname);
|
||||||
|
fputc(':', depfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inform == NULL)
|
if (inform == NULL)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ extern int quiet; /* Level of quietness */
|
||||||
extern unsigned int reservenum; /* Number of memory reservation slots */
|
extern unsigned int reservenum; /* Number of memory reservation slots */
|
||||||
extern int minsize; /* Minimum blob size */
|
extern int minsize; /* Minimum blob size */
|
||||||
extern int padsize; /* Additional padding to blob */
|
extern int padsize; /* Additional padding to blob */
|
||||||
extern int alignsize; /* Additional padding to blob accroding to the alignsize */
|
extern int alignsize; /* Additional padding to blob according to the alignsize */
|
||||||
extern int phandle_format; /* Use linux,phandle or phandle properties */
|
extern int phandle_format; /* Use linux,phandle or phandle properties */
|
||||||
extern int generate_symbols; /* generate symbols for nodes with labels */
|
extern int generate_symbols; /* generate symbols for nodes with labels */
|
||||||
extern int generate_fixups; /* generate fixups */
|
extern int generate_fixups; /* generate fixups */
|
||||||
|
|
@ -182,7 +182,10 @@ struct data data_append_addr(struct data d, uint64_t addr);
|
||||||
struct data data_append_byte(struct data d, uint8_t byte);
|
struct data data_append_byte(struct data d, uint8_t byte);
|
||||||
struct data data_append_zeroes(struct data d, int len);
|
struct data data_append_zeroes(struct data d, int len);
|
||||||
struct data data_append_align(struct data d, int align);
|
struct data data_append_align(struct data d, int align);
|
||||||
|
struct data data_insert_data(struct data d, struct marker *m, struct data old);
|
||||||
|
|
||||||
|
struct marker *alloc_marker(unsigned int offset, enum markertype type,
|
||||||
|
char *ref);
|
||||||
struct data data_add_marker(struct data d, enum markertype type, char *ref);
|
struct data data_add_marker(struct data d, enum markertype type, char *ref);
|
||||||
|
|
||||||
bool data_is_one_string(struct data d);
|
bool data_is_one_string(struct data d);
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ static void *apply_one(char *base, const char *overlay, size_t *buf_len,
|
||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
char *tmpo;
|
char *tmpo;
|
||||||
int ret;
|
int ret;
|
||||||
|
bool has_symbols;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We take copies first, because a failed apply can trash
|
* We take copies first, because a failed apply can trash
|
||||||
|
|
@ -62,6 +63,8 @@ static void *apply_one(char *base, const char *overlay, size_t *buf_len,
|
||||||
fdt_strerror(ret));
|
fdt_strerror(ret));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
ret = fdt_path_offset(tmp, "/__symbols__");
|
||||||
|
has_symbols = ret >= 0;
|
||||||
|
|
||||||
memcpy(tmpo, overlay, fdt_totalsize(overlay));
|
memcpy(tmpo, overlay, fdt_totalsize(overlay));
|
||||||
|
|
||||||
|
|
@ -74,6 +77,11 @@ static void *apply_one(char *base, const char *overlay, size_t *buf_len,
|
||||||
if (ret) {
|
if (ret) {
|
||||||
fprintf(stderr, "\nFailed to apply '%s': %s\n",
|
fprintf(stderr, "\nFailed to apply '%s': %s\n",
|
||||||
name, fdt_strerror(ret));
|
name, fdt_strerror(ret));
|
||||||
|
if (!has_symbols) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"base blob does not have a '/__symbols__' node, "
|
||||||
|
"make sure you have compiled the base blob with '-@' option\n");
|
||||||
|
}
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -503,7 +503,7 @@ void dt_to_asm(FILE *f, struct dt_info *dti, int version)
|
||||||
* Reserve map entries.
|
* Reserve map entries.
|
||||||
* Align the reserve map to a doubleword boundary.
|
* Align the reserve map to a doubleword boundary.
|
||||||
* Each entry is an (address, size) pair of u64 values.
|
* Each entry is an (address, size) pair of u64 values.
|
||||||
* Always supply a zero-sized temination entry.
|
* Always supply a zero-sized termination entry.
|
||||||
*/
|
*/
|
||||||
asm_emit_align(f, 8);
|
asm_emit_align(f, 8);
|
||||||
emit_label(f, symprefix, "reserve_map");
|
emit_label(f, symprefix, "reserve_map");
|
||||||
|
|
|
||||||
|
|
@ -312,14 +312,14 @@ int fdt_next_subnode(const void *fdt, int offset)
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *fdt_find_string_(const char *strtab, int tabsize, const char *s)
|
const char *fdt_find_string_len_(const char *strtab, int tabsize, const char *s,
|
||||||
|
int slen)
|
||||||
{
|
{
|
||||||
int len = strlen(s) + 1;
|
const char *last = strtab + tabsize - (slen + 1);
|
||||||
const char *last = strtab + tabsize - len;
|
|
||||||
const char *p;
|
const char *p;
|
||||||
|
|
||||||
for (p = strtab; p <= last; p++)
|
for (p = strtab; p <= last; p++)
|
||||||
if (memcmp(p, s, len) == 0)
|
if (memcmp(p, s, slen) == 0 && p[slen] == '\0')
|
||||||
return p;
|
return p;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
* Copyright 2012 Kim Phillips, Freescale Semiconductor.
|
* Copyright 2012 Kim Phillips, Freescale Semiconductor.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
struct fdt_header {
|
struct fdt_header {
|
||||||
fdt32_t magic; /* magic word FDT_MAGIC */
|
fdt32_t magic; /* magic word FDT_MAGIC */
|
||||||
|
|
@ -45,7 +45,7 @@ struct fdt_property {
|
||||||
char data[];
|
char data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY */
|
#endif /* !__ASSEMBLER__ */
|
||||||
|
|
||||||
#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
|
#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
|
||||||
#define FDT_TAGSIZE sizeof(fdt32_t)
|
#define FDT_TAGSIZE sizeof(fdt32_t)
|
||||||
|
|
|
||||||
|
|
@ -307,7 +307,6 @@ static int overlay_update_local_references(void *fdto, uint32_t delta)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* overlay_fixup_one_phandle - Set an overlay phandle to the base one
|
* overlay_fixup_one_phandle - Set an overlay phandle to the base one
|
||||||
* @fdt: Base Device Tree blob
|
|
||||||
* @fdto: Device tree overlay blob
|
* @fdto: Device tree overlay blob
|
||||||
* @symbols_off: Node offset of the symbols node in the base device tree
|
* @symbols_off: Node offset of the symbols node in the base device tree
|
||||||
* @path: Path to a node holding a phandle in the overlay
|
* @path: Path to a node holding a phandle in the overlay
|
||||||
|
|
@ -328,8 +327,7 @@ static int overlay_update_local_references(void *fdto, uint32_t delta)
|
||||||
* 0 on success
|
* 0 on success
|
||||||
* Negative error code on failure
|
* Negative error code on failure
|
||||||
*/
|
*/
|
||||||
static int overlay_fixup_one_phandle(void *fdt, void *fdto,
|
static int overlay_fixup_one_phandle(void *fdto, int symbols_off,
|
||||||
int symbols_off,
|
|
||||||
const char *path, uint32_t path_len,
|
const char *path, uint32_t path_len,
|
||||||
const char *name, uint32_t name_len,
|
const char *name, uint32_t name_len,
|
||||||
int poffset, uint32_t phandle)
|
int poffset, uint32_t phandle)
|
||||||
|
|
@ -351,7 +349,7 @@ static int overlay_fixup_one_phandle(void *fdt, void *fdto,
|
||||||
name, name_len, poffset,
|
name, name_len, poffset,
|
||||||
&phandle_prop,
|
&phandle_prop,
|
||||||
sizeof(phandle_prop));
|
sizeof(phandle_prop));
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* overlay_fixup_phandle - Set an overlay phandle to the base one
|
* overlay_fixup_phandle - Set an overlay phandle to the base one
|
||||||
|
|
@ -443,7 +441,7 @@ static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,
|
||||||
if ((*endptr != '\0') || (endptr <= (sep + 1)))
|
if ((*endptr != '\0') || (endptr <= (sep + 1)))
|
||||||
return -FDT_ERR_BADOVERLAY;
|
return -FDT_ERR_BADOVERLAY;
|
||||||
|
|
||||||
ret = overlay_fixup_one_phandle(fdt, fdto, symbols_off,
|
ret = overlay_fixup_one_phandle(fdto, symbols_off,
|
||||||
path, path_len, name, name_len,
|
path, path_len, name, name_len,
|
||||||
poffset, phandle);
|
poffset, phandle);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
||||||
|
|
@ -124,31 +124,33 @@ static int fdt_splice_string_(void *fdt, int newlen)
|
||||||
* allocated. Ignored if can_assume(NO_ROLLBACK)
|
* allocated. Ignored if can_assume(NO_ROLLBACK)
|
||||||
* @return offset of string in the string table (whether found or added)
|
* @return offset of string in the string table (whether found or added)
|
||||||
*/
|
*/
|
||||||
static int fdt_find_add_string_(void *fdt, const char *s, int *allocated)
|
static int fdt_find_add_string_(void *fdt, const char *s, int slen,
|
||||||
|
int *allocated)
|
||||||
{
|
{
|
||||||
char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
|
char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
|
||||||
const char *p;
|
const char *p;
|
||||||
char *new;
|
char *new;
|
||||||
int len = strlen(s) + 1;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!can_assume(NO_ROLLBACK))
|
if (!can_assume(NO_ROLLBACK))
|
||||||
*allocated = 0;
|
*allocated = 0;
|
||||||
|
|
||||||
p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s);
|
p = fdt_find_string_len_(strtab, fdt_size_dt_strings(fdt), s, slen);
|
||||||
if (p)
|
if (p)
|
||||||
/* found it */
|
/* found it */
|
||||||
return (p - strtab);
|
return (p - strtab);
|
||||||
|
|
||||||
new = strtab + fdt_size_dt_strings(fdt);
|
new = strtab + fdt_size_dt_strings(fdt);
|
||||||
err = fdt_splice_string_(fdt, len);
|
err = fdt_splice_string_(fdt, slen + 1);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (!can_assume(NO_ROLLBACK))
|
if (!can_assume(NO_ROLLBACK))
|
||||||
*allocated = 1;
|
*allocated = 1;
|
||||||
|
|
||||||
memcpy(new, s, len);
|
memcpy(new, s, slen);
|
||||||
|
new[slen] = '\0';
|
||||||
|
|
||||||
return (new - strtab);
|
return (new - strtab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -181,13 +183,15 @@ int fdt_del_mem_rsv(void *fdt, int n)
|
||||||
return fdt_splice_mem_rsv_(fdt, re, 1, 0);
|
return fdt_splice_mem_rsv_(fdt, re, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name,
|
static int fdt_resize_property_(void *fdt, int nodeoffset,
|
||||||
|
const char *name, int namelen,
|
||||||
int len, struct fdt_property **prop)
|
int len, struct fdt_property **prop)
|
||||||
{
|
{
|
||||||
int oldlen;
|
int oldlen;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
*prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
|
*prop = fdt_get_property_namelen_w(fdt, nodeoffset, name, namelen,
|
||||||
|
&oldlen);
|
||||||
if (!*prop)
|
if (!*prop)
|
||||||
return oldlen;
|
return oldlen;
|
||||||
|
|
||||||
|
|
@ -200,7 +204,7 @@ static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fdt_add_property_(void *fdt, int nodeoffset, const char *name,
|
static int fdt_add_property_(void *fdt, int nodeoffset, const char *name,
|
||||||
int len, struct fdt_property **prop)
|
int namelen, int len, struct fdt_property **prop)
|
||||||
{
|
{
|
||||||
int proplen;
|
int proplen;
|
||||||
int nextoffset;
|
int nextoffset;
|
||||||
|
|
@ -211,7 +215,7 @@ static int fdt_add_property_(void *fdt, int nodeoffset, const char *name,
|
||||||
if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0)
|
if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0)
|
||||||
return nextoffset;
|
return nextoffset;
|
||||||
|
|
||||||
namestroff = fdt_find_add_string_(fdt, name, &allocated);
|
namestroff = fdt_find_add_string_(fdt, name, namelen, &allocated);
|
||||||
if (namestroff < 0)
|
if (namestroff < 0)
|
||||||
return namestroff;
|
return namestroff;
|
||||||
|
|
||||||
|
|
@ -255,17 +259,18 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
|
int fdt_setprop_placeholder_namelen(void *fdt, int nodeoffset, const char *name,
|
||||||
int len, void **prop_data)
|
int namelen, int len, void **prop_data)
|
||||||
{
|
{
|
||||||
struct fdt_property *prop;
|
struct fdt_property *prop;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
FDT_RW_PROBE(fdt);
|
FDT_RW_PROBE(fdt);
|
||||||
|
|
||||||
err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop);
|
err = fdt_resize_property_(fdt, nodeoffset, name, namelen, len, &prop);
|
||||||
if (err == -FDT_ERR_NOTFOUND)
|
if (err == -FDT_ERR_NOTFOUND)
|
||||||
err = fdt_add_property_(fdt, nodeoffset, name, len, &prop);
|
err = fdt_add_property_(fdt, nodeoffset, name, namelen, len,
|
||||||
|
&prop);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
@ -273,13 +278,14 @@ int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fdt_setprop(void *fdt, int nodeoffset, const char *name,
|
int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name,
|
||||||
const void *val, int len)
|
int namelen, const void *val, int len)
|
||||||
{
|
{
|
||||||
void *prop_data;
|
void *prop_data;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data);
|
err = fdt_setprop_placeholder_namelen(fdt, nodeoffset, name, namelen,
|
||||||
|
len, &prop_data);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
@ -307,7 +313,8 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
|
||||||
prop->len = cpu_to_fdt32(newlen);
|
prop->len = cpu_to_fdt32(newlen);
|
||||||
memcpy(prop->data + oldlen, val, len);
|
memcpy(prop->data + oldlen, val, len);
|
||||||
} else {
|
} else {
|
||||||
err = fdt_add_property_(fdt, nodeoffset, name, len, &prop);
|
err = fdt_add_property_(fdt, nodeoffset, name, strlen(name),
|
||||||
|
len, &prop);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
memcpy(prop->data, val, len);
|
memcpy(prop->data, val, len);
|
||||||
|
|
|
||||||
|
|
@ -263,16 +263,16 @@ int fdt_next_subnode(const void *fdt, int offset);
|
||||||
struct fdt_header *fdth = (struct fdt_header *)fdt; \
|
struct fdt_header *fdth = (struct fdt_header *)fdt; \
|
||||||
fdth->name = cpu_to_fdt32(val); \
|
fdth->name = cpu_to_fdt32(val); \
|
||||||
}
|
}
|
||||||
fdt_set_hdr_(magic);
|
fdt_set_hdr_(magic)
|
||||||
fdt_set_hdr_(totalsize);
|
fdt_set_hdr_(totalsize)
|
||||||
fdt_set_hdr_(off_dt_struct);
|
fdt_set_hdr_(off_dt_struct)
|
||||||
fdt_set_hdr_(off_dt_strings);
|
fdt_set_hdr_(off_dt_strings)
|
||||||
fdt_set_hdr_(off_mem_rsvmap);
|
fdt_set_hdr_(off_mem_rsvmap)
|
||||||
fdt_set_hdr_(version);
|
fdt_set_hdr_(version)
|
||||||
fdt_set_hdr_(last_comp_version);
|
fdt_set_hdr_(last_comp_version)
|
||||||
fdt_set_hdr_(boot_cpuid_phys);
|
fdt_set_hdr_(boot_cpuid_phys)
|
||||||
fdt_set_hdr_(size_dt_strings);
|
fdt_set_hdr_(size_dt_strings)
|
||||||
fdt_set_hdr_(size_dt_struct);
|
fdt_set_hdr_(size_dt_struct)
|
||||||
#undef fdt_set_hdr_
|
#undef fdt_set_hdr_
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -712,6 +712,13 @@ const struct fdt_property *fdt_get_property_namelen(const void *fdt,
|
||||||
int nodeoffset,
|
int nodeoffset,
|
||||||
const char *name,
|
const char *name,
|
||||||
int namelen, int *lenp);
|
int namelen, int *lenp);
|
||||||
|
static inline struct fdt_property *
|
||||||
|
fdt_get_property_namelen_w(void *fdt, int nodeoffset, const char *name,
|
||||||
|
int namelen, int *lenp)
|
||||||
|
{
|
||||||
|
return (struct fdt_property *)(uintptr_t)fdt_get_property_namelen(
|
||||||
|
fdt, nodeoffset, name, namelen, lenp);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -764,7 +771,7 @@ static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
|
||||||
* to within the device blob itself, not a copy of the value). If
|
* to within the device blob itself, not a copy of the value). If
|
||||||
* lenp is non-NULL, the length of the property value is also
|
* lenp is non-NULL, the length of the property value is also
|
||||||
* returned, in the integer pointed to by lenp. If namep is non-NULL,
|
* returned, in the integer pointed to by lenp. If namep is non-NULL,
|
||||||
* the property's namne will also be returned in the char * pointed to
|
* the property's name will also be returned in the char * pointed to
|
||||||
* by namep (this will be a pointer to within the device tree's string
|
* by namep (this will be a pointer to within the device tree's string
|
||||||
* block, not a new copy of the name).
|
* block, not a new copy of the name).
|
||||||
*
|
*
|
||||||
|
|
@ -772,7 +779,7 @@ static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
|
||||||
* pointer to the property's value
|
* pointer to the property's value
|
||||||
* if lenp is non-NULL, *lenp contains the length of the property
|
* if lenp is non-NULL, *lenp contains the length of the property
|
||||||
* value (>=0)
|
* value (>=0)
|
||||||
* if namep is non-NULL *namep contiains a pointer to the property
|
* if namep is non-NULL *namep contains a pointer to the property
|
||||||
* name.
|
* name.
|
||||||
* NULL, on error
|
* NULL, on error
|
||||||
* if lenp is non-NULL, *lenp contains an error code (<0):
|
* if lenp is non-NULL, *lenp contains an error code (<0):
|
||||||
|
|
@ -866,7 +873,7 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
|
||||||
/**
|
/**
|
||||||
* fdt_get_alias_namelen - get alias based on substring
|
* fdt_get_alias_namelen - get alias based on substring
|
||||||
* @fdt: pointer to the device tree blob
|
* @fdt: pointer to the device tree blob
|
||||||
* @name: name of the alias th look up
|
* @name: name of the alias to look up
|
||||||
* @namelen: number of characters of name to consider
|
* @namelen: number of characters of name to consider
|
||||||
*
|
*
|
||||||
* Identical to fdt_get_alias(), but only examine the first @namelen
|
* Identical to fdt_get_alias(), but only examine the first @namelen
|
||||||
|
|
@ -883,7 +890,7 @@ const char *fdt_get_alias_namelen(const void *fdt,
|
||||||
/**
|
/**
|
||||||
* fdt_get_alias - retrieve the path referenced by a given alias
|
* fdt_get_alias - retrieve the path referenced by a given alias
|
||||||
* @fdt: pointer to the device tree blob
|
* @fdt: pointer to the device tree blob
|
||||||
* @name: name of the alias th look up
|
* @name: name of the alias to look up
|
||||||
*
|
*
|
||||||
* fdt_get_alias() retrieves the value of a given alias. That is, the
|
* fdt_get_alias() retrieves the value of a given alias. That is, the
|
||||||
* value of the property named @name in the node /aliases.
|
* value of the property named @name in the node /aliases.
|
||||||
|
|
@ -1562,7 +1569,7 @@ static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
|
||||||
* @fdt: pointer to the device tree blob
|
* @fdt: pointer to the device tree blob
|
||||||
* @name: name of property to add
|
* @name: name of property to add
|
||||||
* @len: length of property value in bytes
|
* @len: length of property value in bytes
|
||||||
* @valp: returns a pointer to where where the value should be placed
|
* @valp: returns a pointer to where the value should be placed
|
||||||
*
|
*
|
||||||
* returns:
|
* returns:
|
||||||
* 0, on success
|
* 0, on success
|
||||||
|
|
@ -1659,6 +1666,38 @@ int fdt_del_mem_rsv(void *fdt, int n);
|
||||||
*/
|
*/
|
||||||
int fdt_set_name(void *fdt, int nodeoffset, const char *name);
|
int fdt_set_name(void *fdt, int nodeoffset, const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fdt_setprop_namelen - create or change a property
|
||||||
|
* @fdt: pointer to the device tree blob
|
||||||
|
* @nodeoffset: offset of the node whose property to change
|
||||||
|
* @name: name of the property to change
|
||||||
|
* @namelen: length of the name
|
||||||
|
* @val: pointer to data to set the property value to
|
||||||
|
* @len: length of the property value
|
||||||
|
*
|
||||||
|
* fdt_setprop_namelen() sets the value of the named property in the given
|
||||||
|
* node to the given value and length, creating the property if it
|
||||||
|
* does not already exist.
|
||||||
|
*
|
||||||
|
* This function may insert or delete data from the blob, and will
|
||||||
|
* therefore change the offsets of some existing nodes.
|
||||||
|
*
|
||||||
|
* returns:
|
||||||
|
* 0, on success
|
||||||
|
* -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
|
||||||
|
* contain the new property value
|
||||||
|
* -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
|
||||||
|
* -FDT_ERR_BADLAYOUT,
|
||||||
|
* -FDT_ERR_BADMAGIC,
|
||||||
|
* -FDT_ERR_BADVERSION,
|
||||||
|
* -FDT_ERR_BADSTATE,
|
||||||
|
* -FDT_ERR_BADSTRUCTURE,
|
||||||
|
* -FDT_ERR_BADLAYOUT,
|
||||||
|
* -FDT_ERR_TRUNCATED, standard meanings
|
||||||
|
*/
|
||||||
|
int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name,
|
||||||
|
int namelen, const void *val, int len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fdt_setprop - create or change a property
|
* fdt_setprop - create or change a property
|
||||||
* @fdt: pointer to the device tree blob
|
* @fdt: pointer to the device tree blob
|
||||||
|
|
@ -1687,18 +1726,23 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name);
|
||||||
* -FDT_ERR_BADLAYOUT,
|
* -FDT_ERR_BADLAYOUT,
|
||||||
* -FDT_ERR_TRUNCATED, standard meanings
|
* -FDT_ERR_TRUNCATED, standard meanings
|
||||||
*/
|
*/
|
||||||
int fdt_setprop(void *fdt, int nodeoffset, const char *name,
|
static inline int fdt_setprop(void *fdt, int nodeoffset, const char *name,
|
||||||
const void *val, int len);
|
const void *val, int len)
|
||||||
|
{
|
||||||
|
return fdt_setprop_namelen(fdt, nodeoffset, name, strlen(name), val,
|
||||||
|
len);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fdt_setprop_placeholder - allocate space for a property
|
* fdt_setprop_placeholder_namelen - allocate space for a property
|
||||||
* @fdt: pointer to the device tree blob
|
* @fdt: pointer to the device tree blob
|
||||||
* @nodeoffset: offset of the node whose property to change
|
* @nodeoffset: offset of the node whose property to change
|
||||||
* @name: name of the property to change
|
* @name: name of the property to change
|
||||||
|
* @namelen: length of the name
|
||||||
* @len: length of the property value
|
* @len: length of the property value
|
||||||
* @prop_data: return pointer to property data
|
* @prop_data: return pointer to property data
|
||||||
*
|
*
|
||||||
* fdt_setprop_placeholer() allocates the named property in the given node.
|
* fdt_setprop_placeholder_namelen() allocates the named property in the given node.
|
||||||
* If the property exists it is resized. In either case a pointer to the
|
* If the property exists it is resized. In either case a pointer to the
|
||||||
* property data is returned.
|
* property data is returned.
|
||||||
*
|
*
|
||||||
|
|
@ -1718,8 +1762,44 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,
|
||||||
* -FDT_ERR_BADLAYOUT,
|
* -FDT_ERR_BADLAYOUT,
|
||||||
* -FDT_ERR_TRUNCATED, standard meanings
|
* -FDT_ERR_TRUNCATED, standard meanings
|
||||||
*/
|
*/
|
||||||
int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
|
int fdt_setprop_placeholder_namelen(void *fdt, int nodeoffset, const char *name,
|
||||||
int len, void **prop_data);
|
int namelen, int len, void **prop_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fdt_setprop_placeholder - allocate space for a property
|
||||||
|
* @fdt: pointer to the device tree blob
|
||||||
|
* @nodeoffset: offset of the node whose property to change
|
||||||
|
* @name: name of the property to change
|
||||||
|
* @len: length of the property value
|
||||||
|
* @prop_data: return pointer to property data
|
||||||
|
*
|
||||||
|
* fdt_setprop_placeholder() allocates the named property in the given node.
|
||||||
|
* If the property exists it is resized. In either case a pointer to the
|
||||||
|
* property data is returned.
|
||||||
|
*
|
||||||
|
* This function may insert or delete data from the blob, and will
|
||||||
|
* therefore change the offsets of some existing nodes.
|
||||||
|
*
|
||||||
|
* returns:
|
||||||
|
* 0, on success
|
||||||
|
* -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
|
||||||
|
* contain the new property value
|
||||||
|
* -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
|
||||||
|
* -FDT_ERR_BADLAYOUT,
|
||||||
|
* -FDT_ERR_BADMAGIC,
|
||||||
|
* -FDT_ERR_BADVERSION,
|
||||||
|
* -FDT_ERR_BADSTATE,
|
||||||
|
* -FDT_ERR_BADSTRUCTURE,
|
||||||
|
* -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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fdt_setprop_u32 - set a property to a 32-bit integer
|
* fdt_setprop_u32 - set a property to a 32-bit integer
|
||||||
|
|
@ -1839,6 +1919,38 @@ static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
|
||||||
#define fdt_setprop_string(fdt, nodeoffset, name, str) \
|
#define fdt_setprop_string(fdt, nodeoffset, name, str) \
|
||||||
fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
|
fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fdt_setprop_namelen_string - set a property to a string value
|
||||||
|
* @fdt: pointer to the device tree blob
|
||||||
|
* @nodeoffset: offset of the node whose property to change
|
||||||
|
* @name: name of the property to change
|
||||||
|
* @namelen: number of characters of name to consider
|
||||||
|
* @str: string value for the property
|
||||||
|
*
|
||||||
|
* fdt_setprop_namelen_string() sets the value of the named property in the
|
||||||
|
* given node to the given string value (using the length of the
|
||||||
|
* string to determine the new length of the property), or creates a
|
||||||
|
* new property with that value if it does not already exist.
|
||||||
|
*
|
||||||
|
* This function may insert or delete data from the blob, and will
|
||||||
|
* therefore change the offsets of some existing nodes.
|
||||||
|
*
|
||||||
|
* returns:
|
||||||
|
* 0, on success
|
||||||
|
* -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
|
||||||
|
* contain the new property value
|
||||||
|
* -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
|
||||||
|
* -FDT_ERR_BADLAYOUT,
|
||||||
|
* -FDT_ERR_BADMAGIC,
|
||||||
|
* -FDT_ERR_BADVERSION,
|
||||||
|
* -FDT_ERR_BADSTATE,
|
||||||
|
* -FDT_ERR_BADSTRUCTURE,
|
||||||
|
* -FDT_ERR_BADLAYOUT,
|
||||||
|
* -FDT_ERR_TRUNCATED, standard meanings
|
||||||
|
*/
|
||||||
|
#define fdt_setprop_namelen_string(fdt, nodeoffset, name, namelen, str) \
|
||||||
|
fdt_setprop_namelen((fdt), (nodeoffset), (name), (namelen), (str), \
|
||||||
|
strlen(str) + 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fdt_setprop_empty - set a property to an empty value
|
* fdt_setprop_empty - set a property to an empty value
|
||||||
|
|
@ -2059,7 +2171,7 @@ int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset,
|
||||||
* @nodeoffset: offset of the node whose property to nop
|
* @nodeoffset: offset of the node whose property to nop
|
||||||
* @name: name of the property to nop
|
* @name: name of the property to nop
|
||||||
*
|
*
|
||||||
* fdt_del_property() will delete the given property.
|
* fdt_delprop() will delete the given property.
|
||||||
*
|
*
|
||||||
* This function will delete data from the blob, and will therefore
|
* This function will delete data from the blob, and will therefore
|
||||||
* change the offsets of some existing nodes.
|
* change the offsets of some existing nodes.
|
||||||
|
|
@ -2111,8 +2223,7 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
|
||||||
* change the offsets of some existing nodes.
|
* change the offsets of some existing nodes.
|
||||||
*
|
*
|
||||||
* returns:
|
* returns:
|
||||||
* structure block offset of the created nodeequested subnode (>=0), on
|
* structure block offset of the created subnode (>=0), on success
|
||||||
* success
|
|
||||||
* -FDT_ERR_NOTFOUND, if the requested subnode does not exist
|
* -FDT_ERR_NOTFOUND, if the requested subnode does not exist
|
||||||
* -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE
|
* -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE
|
||||||
* tag
|
* tag
|
||||||
|
|
@ -2167,7 +2278,7 @@ int fdt_del_node(void *fdt, int nodeoffset);
|
||||||
* returns:
|
* returns:
|
||||||
* 0, on success
|
* 0, on success
|
||||||
* -FDT_ERR_NOSPACE, there's not enough space in the base device tree
|
* -FDT_ERR_NOSPACE, there's not enough space in the base device tree
|
||||||
* -FDT_ERR_NOTFOUND, the overlay points to some inexistant nodes or
|
* -FDT_ERR_NOTFOUND, the overlay points to some nonexistent nodes or
|
||||||
* properties in the base DT
|
* properties in the base DT
|
||||||
* -FDT_ERR_BADPHANDLE,
|
* -FDT_ERR_BADPHANDLE,
|
||||||
* -FDT_ERR_BADOVERLAY,
|
* -FDT_ERR_BADOVERLAY,
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,15 @@ int32_t fdt_ro_probe_(const void *fdt);
|
||||||
|
|
||||||
int fdt_check_node_offset_(const void *fdt, int offset);
|
int fdt_check_node_offset_(const void *fdt, int offset);
|
||||||
int fdt_check_prop_offset_(const void *fdt, int offset);
|
int fdt_check_prop_offset_(const void *fdt, int offset);
|
||||||
const char *fdt_find_string_(const char *strtab, int tabsize, const char *s);
|
|
||||||
|
const char *fdt_find_string_len_(const char *strtab, int tabsize, const char *s,
|
||||||
|
int s_len);
|
||||||
|
static inline const char *fdt_find_string_(const char *strtab, int tabsize,
|
||||||
|
const char *s)
|
||||||
|
{
|
||||||
|
return fdt_find_string_len_(strtab, tabsize, s, strlen(s));
|
||||||
|
}
|
||||||
|
|
||||||
int fdt_node_end_offset_(void *fdt, int nodeoffset);
|
int fdt_node_end_offset_(void *fdt, int nodeoffset);
|
||||||
|
|
||||||
static inline const void *fdt_offset_ptr_(const void *fdt, int offset)
|
static inline const void *fdt_offset_ptr_(const void *fdt, int offset)
|
||||||
|
|
@ -47,8 +55,8 @@ static inline struct fdt_reserve_entry *fdt_mem_rsv_w_(void *fdt, int n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal helpers to access tructural elements of the device tree
|
* Internal helpers to access structural elements of the device tree
|
||||||
* blob (rather than for exaple reading integers from within property
|
* blob (rather than for example reading integers from within property
|
||||||
* values). We assume that we are either given a naturally aligned
|
* 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
|
* 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.
|
* where unaligned memory reads will be handled in a graceful manner.
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,7 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
|
||||||
|
|
||||||
old_prop->val = new_prop->val;
|
old_prop->val = new_prop->val;
|
||||||
old_prop->deleted = 0;
|
old_prop->deleted = 0;
|
||||||
free(old_prop->srcpos);
|
srcpos_free(old_prop->srcpos);
|
||||||
old_prop->srcpos = new_prop->srcpos;
|
old_prop->srcpos = new_prop->srcpos;
|
||||||
free(new_prop);
|
free(new_prop);
|
||||||
new_prop = NULL;
|
new_prop = NULL;
|
||||||
|
|
@ -504,7 +504,7 @@ struct node *get_subnode(struct node *node, const char *nodename)
|
||||||
struct node *child;
|
struct node *child;
|
||||||
|
|
||||||
for_each_child(node, child)
|
for_each_child(node, child)
|
||||||
if (streq(child->name, nodename))
|
if (streq(child->name, nodename) && !child->deleted)
|
||||||
return child;
|
return child;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -1014,9 +1014,7 @@ static void add_local_fixup_entry(struct dt_info *dti,
|
||||||
/* walk the path components creating nodes if they don't exist */
|
/* walk the path components creating nodes if they don't exist */
|
||||||
for (wn = lfn, i = 1; i < depth; i++, wn = nwn) {
|
for (wn = lfn, i = 1; i < depth; i++, wn = nwn) {
|
||||||
/* if no node exists, create it */
|
/* if no node exists, create it */
|
||||||
nwn = get_subnode(wn, compp[i]);
|
nwn = build_root_node(wn, compp[i]);
|
||||||
if (!nwn)
|
|
||||||
nwn = build_and_name_child_node(wn, compp[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(compp);
|
free(compp);
|
||||||
|
|
@ -1058,16 +1056,29 @@ void generate_label_tree(struct dt_info *dti, const char *name, bool allocph)
|
||||||
|
|
||||||
void generate_fixups_tree(struct dt_info *dti, const char *name)
|
void generate_fixups_tree(struct dt_info *dti, const char *name)
|
||||||
{
|
{
|
||||||
|
struct node *n = get_subnode(dti->dt, name);
|
||||||
|
|
||||||
|
/* Start with an empty __fixups__ node to not get duplicates */
|
||||||
|
if (n)
|
||||||
|
n->deleted = true;
|
||||||
|
|
||||||
if (!any_fixup_tree(dti, dti->dt))
|
if (!any_fixup_tree(dti, dti->dt))
|
||||||
return;
|
return;
|
||||||
generate_fixups_tree_internal(dti, build_root_node(dti->dt, name),
|
generate_fixups_tree_internal(dti,
|
||||||
|
build_and_name_child_node(dti->dt, name),
|
||||||
dti->dt);
|
dti->dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void generate_local_fixups_tree(struct dt_info *dti, const char *name)
|
void generate_local_fixups_tree(struct dt_info *dti, const char *name)
|
||||||
{
|
{
|
||||||
|
struct node *n = get_subnode(dti->dt, name);
|
||||||
|
|
||||||
|
/* Start with an empty __local_fixups__ node to not get duplicates */
|
||||||
|
if (n)
|
||||||
|
n->deleted = true;
|
||||||
if (!any_local_fixup_tree(dti, dti->dt))
|
if (!any_local_fixup_tree(dti, dti->dt))
|
||||||
return;
|
return;
|
||||||
generate_local_fixups_tree_internal(dti, build_root_node(dti->dt, name),
|
generate_local_fixups_tree_internal(dti,
|
||||||
|
build_and_name_child_node(dti->dt, name),
|
||||||
dti->dt);
|
dti->dt);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -160,8 +160,10 @@ FILE *srcfile_relative_open(const char *fname, char **fullnamep)
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (depfile)
|
if (depfile) {
|
||||||
fprintf(depfile, " %s", fullname);
|
fputc(' ', depfile);
|
||||||
|
fprint_path_escaped(depfile, fullname);
|
||||||
|
}
|
||||||
|
|
||||||
if (fullnamep)
|
if (fullnamep)
|
||||||
*fullnamep = fullname;
|
*fullnamep = fullname;
|
||||||
|
|
@ -285,6 +287,17 @@ struct srcpos *srcpos_extend(struct srcpos *pos, struct srcpos *newtail)
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void srcpos_free(struct srcpos *pos)
|
||||||
|
{
|
||||||
|
struct srcpos *p_next;
|
||||||
|
|
||||||
|
while (pos) {
|
||||||
|
p_next = pos->next;
|
||||||
|
free(pos);
|
||||||
|
pos = p_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
srcpos_string(struct srcpos *pos)
|
srcpos_string(struct srcpos *pos)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,7 @@ extern void srcpos_update(struct srcpos *pos, const char *text, int len);
|
||||||
extern struct srcpos *srcpos_copy(struct srcpos *pos);
|
extern struct srcpos *srcpos_copy(struct srcpos *pos);
|
||||||
extern struct srcpos *srcpos_extend(struct srcpos *new_srcpos,
|
extern struct srcpos *srcpos_extend(struct srcpos *new_srcpos,
|
||||||
struct srcpos *old_srcpos);
|
struct srcpos *old_srcpos);
|
||||||
|
extern void srcpos_free(struct srcpos *pos);
|
||||||
extern char *srcpos_string(struct srcpos *pos);
|
extern char *srcpos_string(struct srcpos *pos);
|
||||||
extern char *srcpos_string_first(struct srcpos *pos, int level);
|
extern char *srcpos_string_first(struct srcpos *pos, int level);
|
||||||
extern char *srcpos_string_last(struct srcpos *pos, int level);
|
extern char *srcpos_string_last(struct srcpos *pos, int level);
|
||||||
|
|
|
||||||
|
|
@ -139,26 +139,48 @@ static const char *delim_end[] = {
|
||||||
[TYPE_STRING] = "",
|
[TYPE_STRING] = "",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The invariants in the marker list are:
|
||||||
|
* - offsets are non-strictly monotonically increasing
|
||||||
|
* - for a single offset there is at most one type marker
|
||||||
|
* - for a single offset that has both a type marker and non-type markers, the
|
||||||
|
* type marker appears before the others.
|
||||||
|
*/
|
||||||
|
static struct marker **add_marker(struct marker **mi,
|
||||||
|
enum markertype type, unsigned int offset, char *ref)
|
||||||
|
{
|
||||||
|
struct marker *nm;
|
||||||
|
|
||||||
|
while (*mi && (*mi)->offset < offset)
|
||||||
|
mi = &(*mi)->next;
|
||||||
|
|
||||||
|
if (*mi && (*mi)->offset == offset && is_type_marker((*mi)->type)) {
|
||||||
|
if (is_type_marker(type))
|
||||||
|
return mi;
|
||||||
|
mi = &(*mi)->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*mi && (*mi)->offset == offset && type == (*mi)->type)
|
||||||
|
return mi;
|
||||||
|
|
||||||
|
nm = xmalloc(sizeof(*nm));
|
||||||
|
nm->type = type;
|
||||||
|
nm->offset = offset;
|
||||||
|
nm->ref = ref;
|
||||||
|
nm->next = *mi;
|
||||||
|
*mi = nm;
|
||||||
|
|
||||||
|
return &nm->next;
|
||||||
|
}
|
||||||
|
|
||||||
static void add_string_markers(struct property *prop)
|
static void add_string_markers(struct property *prop)
|
||||||
{
|
{
|
||||||
int l, len = prop->val.len;
|
int l, len = prop->val.len;
|
||||||
const char *p = prop->val.val;
|
const char *p = prop->val.val;
|
||||||
|
struct marker **mi = &prop->val.markers;
|
||||||
|
|
||||||
for (l = strlen(p) + 1; l < len; l += strlen(p + l) + 1) {
|
for (l = strlen(p) + 1; l < len; l += strlen(p + l) + 1)
|
||||||
struct marker *m, **nextp;
|
mi = add_marker(mi, TYPE_STRING, l, NULL);
|
||||||
|
|
||||||
m = xmalloc(sizeof(*m));
|
|
||||||
m->offset = l;
|
|
||||||
m->type = TYPE_STRING;
|
|
||||||
m->ref = NULL;
|
|
||||||
m->next = NULL;
|
|
||||||
|
|
||||||
/* Find the end of the markerlist */
|
|
||||||
nextp = &prop->val.markers;
|
|
||||||
while (*nextp)
|
|
||||||
nextp = &((*nextp)->next);
|
|
||||||
*nextp = m;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum markertype guess_value_type(struct property *prop)
|
static enum markertype guess_value_type(struct property *prop)
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,22 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "version_gen.h"
|
#include "version_gen.h"
|
||||||
|
|
||||||
|
void fprint_path_escaped(FILE *fp, const char *path)
|
||||||
|
{
|
||||||
|
const char *p = path;
|
||||||
|
|
||||||
|
while (*p) {
|
||||||
|
if (*p == ' ') {
|
||||||
|
fputc('\\', fp);
|
||||||
|
fputc(' ', fp);
|
||||||
|
} else {
|
||||||
|
fputc(*p, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char *xstrdup(const char *s)
|
char *xstrdup(const char *s)
|
||||||
{
|
{
|
||||||
int len = strlen(s) + 1;
|
int len = strlen(s) + 1;
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,11 @@ static inline void NORETURN PRINTF(1, 2) die(const char *str, ...)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes path to fp, escaping spaces with a backslash.
|
||||||
|
*/
|
||||||
|
void fprint_path_escaped(FILE *fp, const char *path);
|
||||||
|
|
||||||
static inline void *xmalloc(size_t len)
|
static inline void *xmalloc(size_t len)
|
||||||
{
|
{
|
||||||
void *new = malloc(len);
|
void *new = malloc(len);
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
#define DTC_VERSION "DTC 1.7.0-gbcd02b52"
|
#define DTC_VERSION "DTC 1.7.2-g52f07dcc"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue