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: Rob Herring <robh@kernel.org>
This commit is contained in:
Rob Herring 2021-02-03 15:26:03 -06:00
parent b775f49fbc
commit 79edff1206
15 changed files with 350 additions and 71 deletions

View File

@ -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)
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;

View File

@ -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[])
#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")) {

View File

@ -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);
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,
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,

208
scripts/dtc/fdtoverlay.c Normal file
View File

@ -0,0 +1,208 @@
// 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;
}

View File

@ -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 = {
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,
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)
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";

View File

@ -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)) {

View File

@ -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)
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,
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,
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,
/* 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,
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,
} }
*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)
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,

View File

@ -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) ||

View File

@ -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;

View File

@ -14,6 +14,7 @@ extern "C" {
#endif #endif
#define FDT_FIRST_SUPPORTED_VERSION 0x02 #define FDT_FIRST_SUPPORTED_VERSION 0x02
#define FDT_LAST_COMPATIBLE_VERSION 0x10
#define FDT_LAST_SUPPORTED_VERSION 0x11 #define FDT_LAST_SUPPORTED_VERSION 0x11
/* Error codes: informative error codes */ /* Error codes: informative error codes */
@ -101,7 +102,11 @@ extern "C" {
/* FDT_ERR_BADFLAGS: The function was passed a flags field that /* FDT_ERR_BADFLAGS: The function was passed a flags field that
* contains invalid flags or an invalid combination of flags. */ * contains invalid flags or an invalid combination of flags. */
#define FDT_ERR_MAX 18 #define FDT_ERR_ALIGNMENT 19
/* FDT_ERR_ALIGNMENT: The device tree base address is not 8-byte
* aligned. */
#define FDT_ERR_MAX 19
/* constants */ /* constants */
#define FDT_MAX_PHANDLE 0xfffffffe #define FDT_MAX_PHANDLE 0xfffffffe
@ -122,12 +127,10 @@ static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
/* /*
* Alignment helpers: * External helpers to access words from a device tree blob. They're built
* These helpers access words from a device tree blob. They're * to work even with unaligned pointers on platforms (such as ARMv5) that don't
* built to work even with unaligned pointers on platforms (ike * like unaligned loads and stores.
* ARM) that don't like unaligned loads and stores
*/ */
static inline uint32_t fdt32_ld(const fdt32_t *p) static inline uint32_t fdt32_ld(const fdt32_t *p)
{ {
const uint8_t *bp = (const uint8_t *)p; const uint8_t *bp = (const uint8_t *)p;
@ -184,23 +187,23 @@ int fdt_next_node(const void *fdt, int offset, int *depth);
/** /**
* fdt_first_subnode() - get offset of first direct subnode * fdt_first_subnode() - get offset of first direct subnode
*
* @fdt: FDT blob * @fdt: FDT blob
* @offset: Offset of node to check * @offset: Offset of node to check
* @return offset of first subnode, or -FDT_ERR_NOTFOUND if there is none *
* Return: offset of first subnode, or -FDT_ERR_NOTFOUND if there is none
*/ */
int fdt_first_subnode(const void *fdt, int offset); int fdt_first_subnode(const void *fdt, int offset);
/** /**
* fdt_next_subnode() - get offset of next direct subnode * fdt_next_subnode() - get offset of next direct subnode
* @fdt: FDT blob
* @offset: Offset of previous subnode
* *
* After first calling fdt_first_subnode(), call this function repeatedly to * After first calling fdt_first_subnode(), call this function repeatedly to
* get direct subnodes of a parent node. * get direct subnodes of a parent node.
* *
* @fdt: FDT blob * Return: offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more
* @offset: Offset of previous subnode * subnodes
* @return offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more
* subnodes
*/ */
int fdt_next_subnode(const void *fdt, int offset); int fdt_next_subnode(const void *fdt, int offset);
@ -225,7 +228,6 @@ int fdt_next_subnode(const void *fdt, int offset);
* Note that this is implemented as a macro and @node is used as * Note that this is implemented as a macro and @node is used as
* iterator in the loop. The parent variable be constant or even a * iterator in the loop. The parent variable be constant or even a
* literal. * literal.
*
*/ */
#define fdt_for_each_subnode(node, fdt, parent) \ #define fdt_for_each_subnode(node, fdt, parent) \
for (node = fdt_first_subnode(fdt, parent); \ for (node = fdt_first_subnode(fdt, parent); \
@ -269,17 +271,21 @@ fdt_set_hdr_(size_dt_struct);
/** /**
* fdt_header_size - return the size of the tree's header * fdt_header_size - return the size of the tree's header
* @fdt: pointer to a flattened device tree * @fdt: pointer to a flattened device tree
*
* Return: size of DTB header in bytes
*/ */
size_t fdt_header_size(const void *fdt); size_t fdt_header_size(const void *fdt);
/** /**
* fdt_header_size_ - internal function which takes a version number * fdt_header_size_ - internal function to get header size from a version number
* @version: devicetree version number
*
* Return: size of DTB header in bytes
*/ */
size_t fdt_header_size_(uint32_t version); size_t fdt_header_size_(uint32_t version);
/** /**
* fdt_check_header - sanity check a device tree header * fdt_check_header - sanity check a device tree header
* @fdt: pointer to data which might be a flattened device tree * @fdt: pointer to data which might be a flattened device tree
* *
* fdt_check_header() checks that the given buffer contains what * fdt_check_header() checks that the given buffer contains what
@ -404,8 +410,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 * highest phandle value in the device tree blob) will be returned in the
* @phandle parameter. * @phandle parameter.
* *
* Returns: * Return: 0 on success or a negative error-code on failure
* 0 on success or a negative error-code on failure
*/ */
int fdt_generate_phandle(const void *fdt, uint32_t *phandle); int fdt_generate_phandle(const void *fdt, uint32_t *phandle);
@ -425,9 +430,11 @@ int fdt_num_mem_rsv(const void *fdt);
/** /**
* fdt_get_mem_rsv - retrieve one memory reserve map entry * fdt_get_mem_rsv - retrieve one memory reserve map entry
* @fdt: pointer to the device tree blob * @fdt: pointer to the device tree blob
* @address, @size: pointers to 64-bit variables * @n: index of reserve map entry
* @address: pointer to 64-bit variable to hold the start address
* @size: pointer to 64-bit variable to hold the size of the entry
* *
* On success, *address and *size will contain the address and size of * On success, @address and @size will contain the address and size of
* the n-th reserve map entry from the device tree blob, in * the n-th reserve map entry from the device tree blob, in
* native-endian format. * native-endian format.
* *
@ -450,6 +457,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
* namelen characters of name for matching the subnode name. This is * namelen characters of name for matching the subnode name. This is
* useful for finding subnodes based on a portion of a larger string, * useful for finding subnodes based on a portion of a larger string,
* such as a full path. * such as a full path.
*
* Return: offset of the subnode or -FDT_ERR_NOTFOUND if name not found.
*/ */
#ifndef SWIG /* Not available in Python */ #ifndef SWIG /* Not available in Python */
int fdt_subnode_offset_namelen(const void *fdt, int parentoffset, int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
@ -489,6 +498,8 @@ int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
* *
* Identical to fdt_path_offset(), but only consider the first namelen * Identical to fdt_path_offset(), but only consider the first namelen
* characters of path as the path name. * characters of path as the path name.
*
* Return: offset of the node or negative libfdt error value otherwise
*/ */
#ifndef SWIG /* Not available in Python */ #ifndef SWIG /* Not available in Python */
int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen); int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
@ -588,9 +599,9 @@ int fdt_next_property_offset(const void *fdt, int offset);
/** /**
* fdt_for_each_property_offset - iterate over all properties of a node * fdt_for_each_property_offset - iterate over all properties of a node
* *
* @property_offset: property offset (int, lvalue) * @property: property offset (int, lvalue)
* @fdt: FDT blob (const void *) * @fdt: FDT blob (const void *)
* @node: node offset (int) * @node: node offset (int)
* *
* This is actually a wrapper around a for loop and would be used like so: * This is actually a wrapper around a for loop and would be used like so:
* *
@ -653,6 +664,9 @@ const struct fdt_property *fdt_get_property_by_offset(const void *fdt,
* *
* Identical to fdt_get_property(), but only examine the first namelen * Identical to fdt_get_property(), but only examine the first namelen
* characters of name for matching the property name. * characters of name for matching the property name.
*
* Return: pointer to the structure representing the property, or NULL
* if not found
*/ */
#ifndef SWIG /* Not available in Python */ #ifndef SWIG /* Not available in Python */
const struct fdt_property *fdt_get_property_namelen(const void *fdt, const struct fdt_property *fdt_get_property_namelen(const void *fdt,
@ -745,6 +759,8 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
* *
* Identical to fdt_getprop(), but only examine the first namelen * Identical to fdt_getprop(), but only examine the first namelen
* characters of name for matching the property name. * characters of name for matching the property name.
*
* Return: pointer to the property's value or NULL on error
*/ */
#ifndef SWIG /* Not available in Python */ #ifndef SWIG /* Not available in Python */
const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
@ -766,10 +782,10 @@ static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset,
* @lenp: pointer to an integer variable (will be overwritten) or NULL * @lenp: pointer to an integer variable (will be overwritten) or NULL
* *
* fdt_getprop() retrieves a pointer to the value of the property * fdt_getprop() retrieves a pointer to the value of the property
* named 'name' of the node at offset nodeoffset (this will be a * named @name of the node at offset @nodeoffset (this will be a
* pointer to within the device blob itself, not a copy of the value). * pointer 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 * If @lenp is non-NULL, the length of the property value is also
* returned, in the integer pointed to by lenp. * returned, in the integer pointed to by @lenp.
* *
* returns: * returns:
* pointer to the property's value * pointer to the property's value
@ -814,8 +830,11 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
* @name: name of the alias th look up * @name: name of the alias th 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
* characters of name for matching the alias name. * characters of @name for matching the alias name.
*
* Return: a pointer to the expansion of the alias named @name, if it exists,
* NULL otherwise
*/ */
#ifndef SWIG /* Not available in Python */ #ifndef SWIG /* Not available in Python */
const char *fdt_get_alias_namelen(const void *fdt, const char *fdt_get_alias_namelen(const void *fdt,
@ -828,7 +847,7 @@ const char *fdt_get_alias_namelen(const void *fdt,
* @name: name of the alias th look up * @name: name of the alias th 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.
* *
* returns: * returns:
* a pointer to the expansion of the alias named 'name', if it exists * a pointer to the expansion of the alias named 'name', if it exists
@ -1004,14 +1023,13 @@ int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle); int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
/** /**
* fdt_node_check_compatible: check a node's compatible property * fdt_node_check_compatible - check a node's compatible property
* @fdt: pointer to the device tree blob * @fdt: pointer to the device tree blob
* @nodeoffset: offset of a tree node * @nodeoffset: offset of a tree node
* @compatible: string to match against * @compatible: string to match against
* *
*
* fdt_node_check_compatible() returns 0 if the given node contains a * fdt_node_check_compatible() returns 0 if the given node contains a
* 'compatible' property with the given string as one of its elements, * @compatible property with the given string as one of its elements,
* it returns non-zero otherwise, or on error. * it returns non-zero otherwise, or on error.
* *
* returns: * returns:
@ -1075,7 +1093,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 * one or more strings, each terminated by \0, as is found in a device tree
* "compatible" property. * "compatible" property.
* *
* @return: 1 if the string is found in the list, 0 not found, or invalid list * Return: 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); int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);
@ -1084,7 +1102,8 @@ int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);
* @fdt: pointer to the device tree blob * @fdt: pointer to the device tree blob
* @nodeoffset: offset of a tree node * @nodeoffset: offset of a tree node
* @property: name of the property containing the string list * @property: name of the property containing the string list
* @return: *
* Return:
* the number of strings in the given property * the number of strings in the given property
* -FDT_ERR_BADVALUE if the property value is not NUL-terminated * -FDT_ERR_BADVALUE if the property value is not NUL-terminated
* -FDT_ERR_NOTFOUND if the property does not exist * -FDT_ERR_NOTFOUND if the property does not exist
@ -1104,7 +1123,7 @@ int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property);
* small-valued cell properties, such as #address-cells, when searching for * small-valued cell properties, such as #address-cells, when searching for
* the empty string. * the empty string.
* *
* @return: * return:
* the index of the string in the list of strings * the index of the string in the list of strings
* -FDT_ERR_BADVALUE if the property value is not NUL-terminated * -FDT_ERR_BADVALUE if the property value is not NUL-terminated
* -FDT_ERR_NOTFOUND if the property does not exist or does not contain * -FDT_ERR_NOTFOUND if the property does not exist or does not contain
@ -1128,7 +1147,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 * 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. * (on failure) will be stored in the integer pointer to by lenp.
* *
* @return: * Return:
* A pointer to the string at the given index in the string list or NULL on * 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 * 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 * location pointed to by the lenp parameter, if non-NULL. On failure one of
@ -1217,6 +1236,8 @@ int fdt_size_cells(const void *fdt, int nodeoffset);
* starting from the given index, and using only the first characters * starting from the given index, and using only the first characters
* of the name. It is useful when you want to manipulate only one value of * 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. * an array and you have a string that doesn't end with \0.
*
* Return: 0 on success, negative libfdt error value otherwise
*/ */
#ifndef SWIG /* Not available in Python */ #ifndef SWIG /* Not available in Python */
int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
@ -1330,8 +1351,13 @@ static inline int fdt_setprop_inplace_u64(void *fdt, int nodeoffset,
/** /**
* fdt_setprop_inplace_cell - change the value of a single-cell property * fdt_setprop_inplace_cell - change the value of a single-cell property
* @fdt: pointer to the device tree blob
* @nodeoffset: offset of the node containing the property
* @name: name of the property to change the value of
* @val: new value of the 32-bit cell
* *
* This is an alternative name for fdt_setprop_inplace_u32() * This is an alternative name for fdt_setprop_inplace_u32()
* Return: 0 on success, negative libfdt error number otherwise.
*/ */
static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset, static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
const char *name, uint32_t val) const char *name, uint32_t val)
@ -1403,7 +1429,7 @@ int fdt_nop_node(void *fdt, int nodeoffset);
/** /**
* fdt_create_with_flags - begin creation of a new fdt * fdt_create_with_flags - begin creation of a new fdt
* @fdt: pointer to memory allocated where fdt will be created * @buf: pointer to memory allocated where fdt will be created
* @bufsize: size of the memory space at fdt * @bufsize: size of the memory space at fdt
* @flags: a valid combination of FDT_CREATE_FLAG_ flags, or 0. * @flags: a valid combination of FDT_CREATE_FLAG_ flags, or 0.
* *
@ -1421,7 +1447,7 @@ int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags);
/** /**
* fdt_create - begin creation of a new fdt * fdt_create - begin creation of a new fdt
* @fdt: pointer to memory allocated where fdt will be created * @buf: pointer to memory allocated where fdt will be created
* @bufsize: size of the memory space at fdt * @bufsize: size of the memory space at fdt
* *
* fdt_create() is equivalent to fdt_create_with_flags() with flags=0. * fdt_create() is equivalent to fdt_create_with_flags() with flags=0.
@ -1486,7 +1512,8 @@ int fdt_pack(void *fdt);
/** /**
* fdt_add_mem_rsv - add one memory reserve map entry * fdt_add_mem_rsv - add one memory reserve map entry
* @fdt: pointer to the device tree blob * @fdt: pointer to the device tree blob
* @address, @size: 64-bit values (native endian) * @address: 64-bit start address of the reserve map entry
* @size: 64-bit size of the reserved region
* *
* Adds a reserve map entry to the given blob reserving a region at * Adds a reserve map entry to the given blob reserving a region at
* address address of length size. * address address of length size.
@ -1691,8 +1718,14 @@ static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *name,
/** /**
* fdt_setprop_cell - set a property to a single cell value * fdt_setprop_cell - set a property to a single cell value
* @fdt: pointer to the device tree blob
* @nodeoffset: offset of the node whose property to change
* @name: name of the property to change
* @val: 32-bit integer value for the property (native endian)
* *
* This is an alternative name for fdt_setprop_u32() * This is an alternative name for fdt_setprop_u32()
*
* Return: 0 on success, negative libfdt error value otherwise.
*/ */
static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name, static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
uint32_t val) uint32_t val)
@ -1863,8 +1896,14 @@ static inline int fdt_appendprop_u64(void *fdt, int nodeoffset,
/** /**
* fdt_appendprop_cell - append a single cell value to a property * fdt_appendprop_cell - append a single cell value to 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
* @val: 32-bit integer value to append to the property (native endian)
* *
* This is an alternative name for fdt_appendprop_u32() * This is an alternative name for fdt_appendprop_u32()
*
* Return: 0 on success, negative libfdt error value otherwise.
*/ */
static inline int fdt_appendprop_cell(void *fdt, int nodeoffset, static inline int fdt_appendprop_cell(void *fdt, int nodeoffset,
const char *name, uint32_t val) const char *name, uint32_t val)
@ -1967,13 +2006,16 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name);
* fdt_add_subnode_namelen - creates a new node based on substring * fdt_add_subnode_namelen - creates a new node based on substring
* @fdt: pointer to the device tree blob * @fdt: pointer to the device tree blob
* @parentoffset: structure block offset of a node * @parentoffset: structure block offset of a node
* @name: name of the subnode to locate * @name: name of the subnode to create
* @namelen: number of characters of name to consider * @namelen: number of characters of name to consider
* *
* Identical to fdt_add_subnode(), but use only the first namelen * Identical to fdt_add_subnode(), but use only the first @namelen
* characters of name as the name of the new node. This is useful for * characters of @name as the name of the new node. This is useful for
* creating subnodes based on a portion of a larger string, such as a * creating subnodes based on a portion of a larger string, such as a
* full path. * full path.
*
* Return: structure block offset of the created subnode (>=0),
* negative libfdt error value otherwise
*/ */
#ifndef SWIG /* Not available in Python */ #ifndef SWIG /* Not available in Python */
int fdt_add_subnode_namelen(void *fdt, int parentoffset, int fdt_add_subnode_namelen(void *fdt, int parentoffset,
@ -1992,7 +2034,7 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
* *
* This function will insert data into the blob, and will therefore * This function will insert data into the blob, and will therefore
* 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 nodeequested subnode (>=0), on
* success * success

View File

@ -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)
/**********************************************************************/ /**********************************************************************/

View File

@ -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));

View File

@ -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)

View File

@ -1 +1 @@
#define DTC_VERSION "DTC 1.6.0-gcbca977e" #define DTC_VERSION "DTC 1.6.0-g183df9e9"

View File

@ -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)
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 */