mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
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:
parent
b775f49fbc
commit
79edff1206
@ -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;
|
||||||
|
@ -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")) {
|
||||||
|
@ -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
208
scripts/dtc/fdtoverlay.c
Normal 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;
|
||||||
|
}
|
@ -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";
|
||||||
|
@ -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)
|
|||||||
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,
|
||||||
|
@ -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)
|
|||||||
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;
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
|||||||
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 {
|
|||||||
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)
|
||||||
|
@ -1 +1 @@
|
|||||||
#define DTC_VERSION "DTC 1.6.0-gcbca977e"
|
#define DTC_VERSION "DTC 1.6.0-g183df9e9"
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user