mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-22 14:51:41 +00:00
1248 lines
35 KiB
Diff
1248 lines
35 KiB
Diff
diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
index 64c24377..6b016dba 100644
|
|
--- a/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
+++ b/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
@@ -9,7 +9,7 @@
|
|
#define FLEX_SCANNER
|
|
#define YY_FLEX_MAJOR_VERSION 2
|
|
#define YY_FLEX_MINOR_VERSION 6
|
|
-#define YY_FLEX_SUBMINOR_VERSION 1
|
|
+#define YY_FLEX_SUBMINOR_VERSION 0
|
|
#if YY_FLEX_SUBMINOR_VERSION > 0
|
|
#define FLEX_BETA
|
|
#endif
|
|
@@ -88,13 +88,25 @@ typedef unsigned int flex_uint32_t;
|
|
|
|
#endif /* ! FLEXINT_H */
|
|
|
|
-/* TODO: this is always defined, so inline it */
|
|
-#define yyconst const
|
|
+#ifdef __cplusplus
|
|
|
|
-#if defined(__GNUC__) && __GNUC__ >= 3
|
|
-#define yynoreturn __attribute__((__noreturn__))
|
|
+/* The "const" storage-class-modifier is valid. */
|
|
+#define YY_USE_CONST
|
|
+
|
|
+#else /* ! __cplusplus */
|
|
+
|
|
+/* C99 requires __STDC__ to be defined as 1. */
|
|
+#if defined (__STDC__)
|
|
+
|
|
+#define YY_USE_CONST
|
|
+
|
|
+#endif /* defined (__STDC__) */
|
|
+#endif /* ! __cplusplus */
|
|
+
|
|
+#ifdef YY_USE_CONST
|
|
+#define yyconst const
|
|
#else
|
|
-#define yynoreturn
|
|
+#define yyconst
|
|
#endif
|
|
|
|
/* Returned upon end-of-file. */
|
|
@@ -155,7 +167,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
|
|
typedef size_t yy_size_t;
|
|
#endif
|
|
|
|
-extern int yyleng;
|
|
+extern yy_size_t yyleng;
|
|
|
|
extern FILE *yyin, *yyout;
|
|
|
|
@@ -194,7 +206,7 @@ struct yy_buffer_state
|
|
/* Size of input buffer in bytes, not including room for EOB
|
|
* characters.
|
|
*/
|
|
- int yy_buf_size;
|
|
+ yy_size_t yy_buf_size;
|
|
|
|
/* Number of characters read into yy_ch_buf, not including EOB
|
|
* characters.
|
|
@@ -222,7 +234,7 @@ struct yy_buffer_state
|
|
|
|
int yy_bs_lineno; /**< The line count. */
|
|
int yy_bs_column; /**< The column count. */
|
|
-
|
|
+
|
|
/* Whether to try to fill the input buffer when we reach the
|
|
* end of it.
|
|
*/
|
|
@@ -250,7 +262,7 @@ struct yy_buffer_state
|
|
/* Stack of input buffers. */
|
|
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
|
|
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
|
|
-static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
|
|
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
|
|
|
|
/* We provide macros for accessing buffer states in case in the
|
|
* future we want to put the buffer states in a more general
|
|
@@ -270,10 +282,10 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
|
|
/* yy_hold_char holds the character lost when yytext is formed. */
|
|
static char yy_hold_char;
|
|
static int yy_n_chars; /* number of characters read into yy_ch_buf */
|
|
-int yyleng;
|
|
+yy_size_t yyleng;
|
|
|
|
/* Points to current character in buffer. */
|
|
-static char *yy_c_buf_p = NULL;
|
|
+static char *yy_c_buf_p = (char *) 0;
|
|
static int yy_init = 0; /* whether we need to initialize */
|
|
static int yy_start = 0; /* start state number */
|
|
|
|
@@ -298,7 +310,7 @@ static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
|
|
|
|
YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
|
|
YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
|
|
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
|
|
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len );
|
|
|
|
void *yyalloc (yy_size_t );
|
|
void *yyrealloc (void *,yy_size_t );
|
|
@@ -335,7 +347,7 @@ void yyfree (void * );
|
|
|
|
typedef unsigned char YY_CHAR;
|
|
|
|
-FILE *yyin = NULL, *yyout = NULL;
|
|
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
|
|
|
|
typedef int yy_state_type;
|
|
|
|
@@ -352,14 +364,17 @@ extern char *yytext;
|
|
static yy_state_type yy_get_previous_state (void );
|
|
static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
|
|
static int yy_get_next_buffer (void );
|
|
-static void yynoreturn yy_fatal_error (yyconst char* msg );
|
|
+#if defined(__GNUC__) && __GNUC__ >= 3
|
|
+__attribute__((__noreturn__))
|
|
+#endif
|
|
+static void yy_fatal_error (yyconst char msg[] );
|
|
|
|
/* Done after the current pattern has been matched and before the
|
|
* corresponding action - sets up yytext.
|
|
*/
|
|
#define YY_DO_BEFORE_ACTION \
|
|
(yytext_ptr) = yy_bp; \
|
|
- yyleng = (int) (yy_cp - yy_bp); \
|
|
+ yyleng = (size_t) (yy_cp - yy_bp); \
|
|
(yy_hold_char) = *yy_cp; \
|
|
*yy_cp = '\0'; \
|
|
(yy_c_buf_p) = yy_cp;
|
|
@@ -657,7 +672,7 @@ static void push_input_file(const char *filename);
|
|
static bool pop_input_file(void);
|
|
static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
|
|
|
|
-#line 661 "dtc-lexer.lex.c"
|
|
+#line 676 "dtc-lexer.lex.c"
|
|
|
|
#define INITIAL 0
|
|
#define BYTESTRING 1
|
|
@@ -699,7 +714,7 @@ FILE *yyget_out (void );
|
|
|
|
void yyset_out (FILE * _out_str );
|
|
|
|
- int yyget_leng (void );
|
|
+yy_size_t yyget_leng (void );
|
|
|
|
char *yyget_text (void );
|
|
|
|
@@ -756,7 +771,7 @@ static int input (void );
|
|
/* This used to be an fputs(), but since the string might contain NUL's,
|
|
* we now use fwrite().
|
|
*/
|
|
-#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
|
|
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
|
|
#endif
|
|
|
|
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
|
|
@@ -780,7 +795,7 @@ static int input (void );
|
|
else \
|
|
{ \
|
|
errno=0; \
|
|
- while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
|
|
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
|
|
{ \
|
|
if( errno != EINTR) \
|
|
{ \
|
|
@@ -881,7 +896,7 @@ YY_DECL
|
|
{
|
|
#line 69 "dtc-lexer.l"
|
|
|
|
-#line 885 "dtc-lexer.lex.c"
|
|
+#line 900 "dtc-lexer.lex.c"
|
|
|
|
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
|
|
{
|
|
@@ -912,7 +927,7 @@ yy_match:
|
|
if ( yy_current_state >= 166 )
|
|
yy_c = yy_meta[(unsigned int) yy_c];
|
|
}
|
|
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
|
|
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
|
++yy_cp;
|
|
}
|
|
while ( yy_current_state != 165 );
|
|
@@ -1253,7 +1268,7 @@ YY_RULE_SETUP
|
|
#line 272 "dtc-lexer.l"
|
|
ECHO;
|
|
YY_BREAK
|
|
-#line 1257 "dtc-lexer.lex.c"
|
|
+#line 1272 "dtc-lexer.lex.c"
|
|
|
|
case YY_END_OF_BUFFER:
|
|
{
|
|
@@ -1439,7 +1454,7 @@ static int yy_get_next_buffer (void)
|
|
|
|
else
|
|
{
|
|
- int num_to_read =
|
|
+ yy_size_t num_to_read =
|
|
YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
|
|
|
|
while ( num_to_read <= 0 )
|
|
@@ -1453,7 +1468,7 @@ static int yy_get_next_buffer (void)
|
|
|
|
if ( b->yy_is_our_buffer )
|
|
{
|
|
- int new_size = b->yy_buf_size * 2;
|
|
+ yy_size_t new_size = b->yy_buf_size * 2;
|
|
|
|
if ( new_size <= 0 )
|
|
b->yy_buf_size += b->yy_buf_size / 8;
|
|
@@ -1466,7 +1481,7 @@ static int yy_get_next_buffer (void)
|
|
}
|
|
else
|
|
/* Can't grow it, we don't own it. */
|
|
- b->yy_ch_buf = NULL;
|
|
+ b->yy_ch_buf = 0;
|
|
|
|
if ( ! b->yy_ch_buf )
|
|
YY_FATAL_ERROR(
|
|
@@ -1549,7 +1564,7 @@ static int yy_get_next_buffer (void)
|
|
if ( yy_current_state >= 166 )
|
|
yy_c = yy_meta[(unsigned int) yy_c];
|
|
}
|
|
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
|
|
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
|
}
|
|
|
|
return yy_current_state;
|
|
@@ -1577,7 +1592,7 @@ static int yy_get_next_buffer (void)
|
|
if ( yy_current_state >= 166 )
|
|
yy_c = yy_meta[(unsigned int) yy_c];
|
|
}
|
|
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
|
|
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
|
|
yy_is_jam = (yy_current_state == 165);
|
|
|
|
return yy_is_jam ? 0 : yy_current_state;
|
|
@@ -1611,7 +1626,7 @@ static int yy_get_next_buffer (void)
|
|
|
|
else
|
|
{ /* need more input */
|
|
- int offset = (yy_c_buf_p) - (yytext_ptr);
|
|
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
|
|
++(yy_c_buf_p);
|
|
|
|
switch ( yy_get_next_buffer( ) )
|
|
@@ -1635,7 +1650,7 @@ static int yy_get_next_buffer (void)
|
|
case EOB_ACT_END_OF_FILE:
|
|
{
|
|
if ( yywrap( ) )
|
|
- return 0;
|
|
+ return EOF;
|
|
|
|
if ( ! (yy_did_buffer_switch_on_eof) )
|
|
YY_NEW_FILE;
|
|
@@ -1885,7 +1900,7 @@ void yypop_buffer_state (void)
|
|
*/
|
|
static void yyensure_buffer_stack (void)
|
|
{
|
|
- int num_to_alloc;
|
|
+ yy_size_t num_to_alloc;
|
|
|
|
if (!(yy_buffer_stack)) {
|
|
|
|
@@ -1893,15 +1908,15 @@ static void yyensure_buffer_stack (void)
|
|
* scanner will even need a stack. We use 2 instead of 1 to avoid an
|
|
* immediate realloc on the next call.
|
|
*/
|
|
- num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
|
|
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
|
|
(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
|
|
(num_to_alloc * sizeof(struct yy_buffer_state*)
|
|
);
|
|
if ( ! (yy_buffer_stack) )
|
|
YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
|
|
-
|
|
+
|
|
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
|
|
-
|
|
+
|
|
(yy_buffer_stack_max) = num_to_alloc;
|
|
(yy_buffer_stack_top) = 0;
|
|
return;
|
|
@@ -1930,7 +1945,7 @@ static void yyensure_buffer_stack (void)
|
|
* @param base the character buffer
|
|
* @param size the size in bytes of the character buffer
|
|
*
|
|
- * @return the newly allocated buffer state object.
|
|
+ * @return the newly allocated buffer state object.
|
|
*/
|
|
YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
|
|
{
|
|
@@ -1940,7 +1955,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
|
|
base[size-2] != YY_END_OF_BUFFER_CHAR ||
|
|
base[size-1] != YY_END_OF_BUFFER_CHAR )
|
|
/* They forgot to leave room for the EOB's. */
|
|
- return NULL;
|
|
+ return 0;
|
|
|
|
b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
|
|
if ( ! b )
|
|
@@ -1949,7 +1964,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
|
|
b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
|
|
b->yy_buf_pos = b->yy_ch_buf = base;
|
|
b->yy_is_our_buffer = 0;
|
|
- b->yy_input_file = NULL;
|
|
+ b->yy_input_file = 0;
|
|
b->yy_n_chars = b->yy_buf_size;
|
|
b->yy_is_interactive = 0;
|
|
b->yy_at_bol = 1;
|
|
@@ -1972,7 +1987,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
|
|
YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
|
|
{
|
|
|
|
- return yy_scan_bytes(yystr,(int) strlen(yystr) );
|
|
+ return yy_scan_bytes(yystr,strlen(yystr) );
|
|
}
|
|
|
|
/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
|
|
@@ -1982,7 +1997,7 @@ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
|
|
*
|
|
* @return the newly allocated buffer state object.
|
|
*/
|
|
-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
|
|
+YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
|
|
{
|
|
YY_BUFFER_STATE b;
|
|
char *buf;
|
|
@@ -1990,7 +2005,7 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
|
|
yy_size_t i;
|
|
|
|
/* Get memory for full buffer, including space for trailing EOB's. */
|
|
- n = (yy_size_t) _yybytes_len + 2;
|
|
+ n = _yybytes_len + 2;
|
|
buf = (char *) yyalloc(n );
|
|
if ( ! buf )
|
|
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
|
|
@@ -2016,7 +2031,7 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
|
|
#define YY_EXIT_FAILURE 2
|
|
#endif
|
|
|
|
-static void yynoreturn yy_fatal_error (yyconst char* msg )
|
|
+static void yy_fatal_error (yyconst char* msg )
|
|
{
|
|
(void) fprintf( stderr, "%s\n", msg );
|
|
exit( YY_EXIT_FAILURE );
|
|
@@ -2046,7 +2061,7 @@ static void yynoreturn yy_fatal_error (yyconst char* msg )
|
|
*/
|
|
int yyget_lineno (void)
|
|
{
|
|
-
|
|
+
|
|
return yylineno;
|
|
}
|
|
|
|
@@ -2069,7 +2084,7 @@ FILE *yyget_out (void)
|
|
/** Get the length of the current token.
|
|
*
|
|
*/
|
|
-int yyget_leng (void)
|
|
+yy_size_t yyget_leng (void)
|
|
{
|
|
return yyleng;
|
|
}
|
|
@@ -2125,10 +2140,10 @@ static int yy_init_globals (void)
|
|
* This function is called from yylex_destroy(), so don't allocate here.
|
|
*/
|
|
|
|
- (yy_buffer_stack) = NULL;
|
|
+ (yy_buffer_stack) = 0;
|
|
(yy_buffer_stack_top) = 0;
|
|
(yy_buffer_stack_max) = 0;
|
|
- (yy_c_buf_p) = NULL;
|
|
+ (yy_c_buf_p) = (char *) 0;
|
|
(yy_init) = 0;
|
|
(yy_start) = 0;
|
|
|
|
@@ -2137,8 +2152,8 @@ static int yy_init_globals (void)
|
|
yyin = stdin;
|
|
yyout = stdout;
|
|
#else
|
|
- yyin = NULL;
|
|
- yyout = NULL;
|
|
+ yyin = (FILE *) 0;
|
|
+ yyout = (FILE *) 0;
|
|
#endif
|
|
|
|
/* For future reference: Set errno on error, since we are called by
|
|
@@ -2196,7 +2211,7 @@ static int yy_flex_strlen (yyconst char * s )
|
|
|
|
void *yyalloc (yy_size_t size )
|
|
{
|
|
- return malloc(size);
|
|
+ return (void *) malloc( size );
|
|
}
|
|
|
|
void *yyrealloc (void * ptr, yy_size_t size )
|
|
@@ -2209,7 +2224,7 @@ void *yyrealloc (void * ptr, yy_size_t size )
|
|
* any pointer type to void*, and deal with argument conversions
|
|
* as though doing an assignment.
|
|
*/
|
|
- return realloc(ptr, size);
|
|
+ return (void *) realloc( (char *) ptr, size );
|
|
}
|
|
|
|
void yyfree (void * ptr )
|
|
diff --git a/scripts/dtc/libfdt/fdt_empty_tree.c b/scripts/dtc/libfdt/fdt_empty_tree.c
|
|
index f72d13b1..f2ae9b77 100644
|
|
--- a/scripts/dtc/libfdt/fdt_empty_tree.c
|
|
+++ b/scripts/dtc/libfdt/fdt_empty_tree.c
|
|
@@ -81,4 +81,3 @@ int fdt_create_empty_tree(void *buf, int bufsize)
|
|
|
|
return fdt_open_into(buf, buf, bufsize);
|
|
}
|
|
-
|
|
diff --git a/scripts/dtc/libfdt/fdt_overlay.c b/scripts/dtc/libfdt/fdt_overlay.c
|
|
new file mode 100644
|
|
index 00000000..ceb96878
|
|
--- /dev/null
|
|
+++ b/scripts/dtc/libfdt/fdt_overlay.c
|
|
@@ -0,0 +1,677 @@
|
|
+#include "libfdt_env.h"
|
|
+
|
|
+#include <fdt.h>
|
|
+#include <libfdt.h>
|
|
+
|
|
+#include "libfdt_internal.h"
|
|
+
|
|
+/**
|
|
+ * overlay_get_target_phandle - retrieves the target phandle of a fragment
|
|
+ * @fdto: pointer to the device tree overlay blob
|
|
+ * @fragment: node offset of the fragment in the overlay
|
|
+ *
|
|
+ * overlay_get_target_phandle() retrieves the target phandle of an
|
|
+ * overlay fragment when that fragment uses a phandle (target
|
|
+ * property) instead of a path (target-path property).
|
|
+ *
|
|
+ * returns:
|
|
+ * the phandle pointed by the target property
|
|
+ * 0, if the phandle was not found
|
|
+ * -1, if the phandle was malformed
|
|
+ */
|
|
+static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)
|
|
+{
|
|
+ const fdt32_t *val;
|
|
+ int len;
|
|
+
|
|
+ val = fdt_getprop(fdto, fragment, "target", &len);
|
|
+ if (!val)
|
|
+ return 0;
|
|
+
|
|
+ if ((len != sizeof(*val)) || (fdt32_to_cpu(*val) == (uint32_t)-1))
|
|
+ return (uint32_t)-1;
|
|
+
|
|
+ return fdt32_to_cpu(*val);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_get_target - retrieves the offset of a fragment's target
|
|
+ * @fdt: Base device tree blob
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @fragment: node offset of the fragment in the overlay
|
|
+ *
|
|
+ * overlay_get_target() retrieves the target offset in the base
|
|
+ * device tree of a fragment, no matter how the actual targetting is
|
|
+ * done (through a phandle or a path)
|
|
+ *
|
|
+ * returns:
|
|
+ * the targetted node offset in the base device tree
|
|
+ * Negative error code on error
|
|
+ */
|
|
+static int overlay_get_target(const void *fdt, const void *fdto,
|
|
+ int fragment)
|
|
+{
|
|
+ uint32_t phandle;
|
|
+ const char *path;
|
|
+ int path_len;
|
|
+
|
|
+ /* Try first to do a phandle based lookup */
|
|
+ phandle = overlay_get_target_phandle(fdto, fragment);
|
|
+ if (phandle == (uint32_t)-1)
|
|
+ return -FDT_ERR_BADPHANDLE;
|
|
+
|
|
+ if (phandle)
|
|
+ return fdt_node_offset_by_phandle(fdt, phandle);
|
|
+
|
|
+ /* And then a path based lookup */
|
|
+ path = fdt_getprop(fdto, fragment, "target-path", &path_len);
|
|
+ if (!path) {
|
|
+ /*
|
|
+ * If we haven't found either a target or a
|
|
+ * target-path property in a node that contains a
|
|
+ * __overlay__ subnode (we wouldn't be called
|
|
+ * otherwise), consider it a improperly written
|
|
+ * overlay
|
|
+ */
|
|
+ if (path_len == -FDT_ERR_NOTFOUND)
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ return path_len;
|
|
+ }
|
|
+
|
|
+ return fdt_path_offset(fdt, path);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_phandle_add_offset - Increases a phandle by an offset
|
|
+ * @fdt: Base device tree blob
|
|
+ * @node: Device tree overlay blob
|
|
+ * @name: Name of the property to modify (phandle or linux,phandle)
|
|
+ * @delta: offset to apply
|
|
+ *
|
|
+ * overlay_phandle_add_offset() increments a node phandle by a given
|
|
+ * offset.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success.
|
|
+ * Negative error code on error
|
|
+ */
|
|
+static int overlay_phandle_add_offset(void *fdt, int node,
|
|
+ const char *name, uint32_t delta)
|
|
+{
|
|
+ const fdt32_t *val;
|
|
+ uint32_t adj_val;
|
|
+ int len;
|
|
+
|
|
+ val = fdt_getprop(fdt, node, name, &len);
|
|
+ if (!val)
|
|
+ return len;
|
|
+
|
|
+ if (len != sizeof(*val))
|
|
+ return -FDT_ERR_BADPHANDLE;
|
|
+
|
|
+ adj_val = fdt32_to_cpu(*val);
|
|
+ if ((adj_val + delta) < adj_val)
|
|
+ return -FDT_ERR_NOPHANDLES;
|
|
+
|
|
+ adj_val += delta;
|
|
+ if (adj_val == (uint32_t)-1)
|
|
+ return -FDT_ERR_NOPHANDLES;
|
|
+
|
|
+ return fdt_setprop_inplace_u32(fdt, node, name, adj_val);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_adjust_node_phandles - Offsets the phandles of a node
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @node: Offset of the node we want to adjust
|
|
+ * @delta: Offset to shift the phandles of
|
|
+ *
|
|
+ * overlay_adjust_node_phandles() adds a constant to all the phandles
|
|
+ * of a given node. This is mainly use as part of the overlay
|
|
+ * application process, when we want to update all the overlay
|
|
+ * phandles to not conflict with the overlays of the base device tree.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_adjust_node_phandles(void *fdto, int node,
|
|
+ uint32_t delta)
|
|
+{
|
|
+ int child;
|
|
+ int ret;
|
|
+
|
|
+ ret = overlay_phandle_add_offset(fdto, node, "phandle", delta);
|
|
+ if (ret && ret != -FDT_ERR_NOTFOUND)
|
|
+ return ret;
|
|
+
|
|
+ ret = overlay_phandle_add_offset(fdto, node, "linux,phandle", delta);
|
|
+ if (ret && ret != -FDT_ERR_NOTFOUND)
|
|
+ return ret;
|
|
+
|
|
+ fdt_for_each_subnode(child, fdto, node) {
|
|
+ ret = overlay_adjust_node_phandles(fdto, child, delta);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_adjust_local_phandles - Adjust the phandles of a whole overlay
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @delta: Offset to shift the phandles of
|
|
+ *
|
|
+ * overlay_adjust_local_phandles() adds a constant to all the
|
|
+ * phandles of an overlay. This is mainly use as part of the overlay
|
|
+ * application process, when we want to update all the overlay
|
|
+ * phandles to not conflict with the overlays of the base device tree.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_adjust_local_phandles(void *fdto, uint32_t delta)
|
|
+{
|
|
+ /*
|
|
+ * Start adjusting the phandles from the overlay root
|
|
+ */
|
|
+ return overlay_adjust_node_phandles(fdto, 0, delta);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_update_local_node_references - Adjust the overlay references
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @tree_node: Node offset of the node to operate on
|
|
+ * @fixup_node: Node offset of the matching local fixups node
|
|
+ * @delta: Offset to shift the phandles of
|
|
+ *
|
|
+ * overlay_update_local_nodes_references() update the phandles
|
|
+ * pointing to a node within the device tree overlay by adding a
|
|
+ * constant delta.
|
|
+ *
|
|
+ * This is mainly used as part of a device tree application process,
|
|
+ * where you want the device tree overlays phandles to not conflict
|
|
+ * with the ones from the base device tree before merging them.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_update_local_node_references(void *fdto,
|
|
+ int tree_node,
|
|
+ int fixup_node,
|
|
+ uint32_t delta)
|
|
+{
|
|
+ int fixup_prop;
|
|
+ int fixup_child;
|
|
+ int ret;
|
|
+
|
|
+ fdt_for_each_property_offset(fixup_prop, fdto, fixup_node) {
|
|
+ const fdt32_t *fixup_val;
|
|
+ const char *tree_val;
|
|
+ const char *name;
|
|
+ int fixup_len;
|
|
+ int tree_len;
|
|
+ int i;
|
|
+
|
|
+ fixup_val = fdt_getprop_by_offset(fdto, fixup_prop,
|
|
+ &name, &fixup_len);
|
|
+ if (!fixup_val)
|
|
+ return fixup_len;
|
|
+
|
|
+ if (fixup_len % sizeof(uint32_t))
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ tree_val = fdt_getprop(fdto, tree_node, name, &tree_len);
|
|
+ if (!tree_val) {
|
|
+ if (tree_len == -FDT_ERR_NOTFOUND)
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ return tree_len;
|
|
+ }
|
|
+
|
|
+ for (i = 0; i < (fixup_len / sizeof(uint32_t)); i++) {
|
|
+ fdt32_t adj_val;
|
|
+ uint32_t poffset;
|
|
+
|
|
+ poffset = fdt32_to_cpu(fixup_val[i]);
|
|
+
|
|
+ /*
|
|
+ * phandles to fixup can be unaligned.
|
|
+ *
|
|
+ * Use a memcpy for the architectures that do
|
|
+ * not support unaligned accesses.
|
|
+ */
|
|
+ memcpy(&adj_val, tree_val + poffset, sizeof(adj_val));
|
|
+
|
|
+ adj_val = cpu_to_fdt32(fdt32_to_cpu(adj_val) + delta);
|
|
+
|
|
+ ret = fdt_setprop_inplace_namelen_partial(fdto,
|
|
+ tree_node,
|
|
+ name,
|
|
+ strlen(name),
|
|
+ poffset,
|
|
+ &adj_val,
|
|
+ sizeof(adj_val));
|
|
+ if (ret == -FDT_ERR_NOSPACE)
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ fdt_for_each_subnode(fixup_child, fdto, fixup_node) {
|
|
+ const char *fixup_child_name = fdt_get_name(fdto, fixup_child,
|
|
+ NULL);
|
|
+ int tree_child;
|
|
+
|
|
+ tree_child = fdt_subnode_offset(fdto, tree_node,
|
|
+ fixup_child_name);
|
|
+ if (tree_child == -FDT_ERR_NOTFOUND)
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+ if (tree_child < 0)
|
|
+ return tree_child;
|
|
+
|
|
+ ret = overlay_update_local_node_references(fdto,
|
|
+ tree_child,
|
|
+ fixup_child,
|
|
+ delta);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_update_local_references - Adjust the overlay references
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @delta: Offset to shift the phandles of
|
|
+ *
|
|
+ * overlay_update_local_references() update all the phandles pointing
|
|
+ * to a node within the device tree overlay by adding a constant
|
|
+ * delta to not conflict with the base overlay.
|
|
+ *
|
|
+ * This is mainly used as part of a device tree application process,
|
|
+ * where you want the device tree overlays phandles to not conflict
|
|
+ * with the ones from the base device tree before merging them.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_update_local_references(void *fdto, uint32_t delta)
|
|
+{
|
|
+ int fixups;
|
|
+
|
|
+ fixups = fdt_path_offset(fdto, "/__local_fixups__");
|
|
+ if (fixups < 0) {
|
|
+ /* There's no local phandles to adjust, bail out */
|
|
+ if (fixups == -FDT_ERR_NOTFOUND)
|
|
+ return 0;
|
|
+
|
|
+ return fixups;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Update our local references from the root of the tree
|
|
+ */
|
|
+ return overlay_update_local_node_references(fdto, 0, fixups,
|
|
+ delta);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_fixup_one_phandle - Set an overlay phandle to the base one
|
|
+ * @fdt: Base Device Tree blob
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @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_len: number of path characters to consider
|
|
+ * @name: Name of the property holding the phandle reference in the overlay
|
|
+ * @name_len: number of name characters to consider
|
|
+ * @poffset: Offset within the overlay property where the phandle is stored
|
|
+ * @label: Label of the node referenced by the phandle
|
|
+ *
|
|
+ * overlay_fixup_one_phandle() resolves an overlay phandle pointing to
|
|
+ * a node in the base device tree.
|
|
+ *
|
|
+ * This is part of the device tree overlay application process, when
|
|
+ * you want all the phandles in the overlay to point to the actual
|
|
+ * base dt nodes.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_fixup_one_phandle(void *fdt, void *fdto,
|
|
+ int symbols_off,
|
|
+ const char *path, uint32_t path_len,
|
|
+ const char *name, uint32_t name_len,
|
|
+ int poffset, const char *label)
|
|
+{
|
|
+ const char *symbol_path;
|
|
+ uint32_t phandle;
|
|
+ fdt32_t phandle_prop;
|
|
+ int symbol_off, fixup_off;
|
|
+ int prop_len;
|
|
+
|
|
+ if (symbols_off < 0)
|
|
+ return symbols_off;
|
|
+
|
|
+ symbol_path = fdt_getprop(fdt, symbols_off, label,
|
|
+ &prop_len);
|
|
+ if (!symbol_path)
|
|
+ return prop_len;
|
|
+
|
|
+ symbol_off = fdt_path_offset(fdt, symbol_path);
|
|
+ if (symbol_off < 0)
|
|
+ return symbol_off;
|
|
+
|
|
+ phandle = fdt_get_phandle(fdt, symbol_off);
|
|
+ if (!phandle)
|
|
+ return -FDT_ERR_NOTFOUND;
|
|
+
|
|
+ fixup_off = fdt_path_offset_namelen(fdto, path, path_len);
|
|
+ if (fixup_off == -FDT_ERR_NOTFOUND)
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+ if (fixup_off < 0)
|
|
+ return fixup_off;
|
|
+
|
|
+ phandle_prop = cpu_to_fdt32(phandle);
|
|
+ return fdt_setprop_inplace_namelen_partial(fdto, fixup_off,
|
|
+ name, name_len, poffset,
|
|
+ &phandle_prop,
|
|
+ sizeof(phandle_prop));
|
|
+};
|
|
+
|
|
+/**
|
|
+ * overlay_fixup_phandle - Set an overlay phandle to the base one
|
|
+ * @fdt: Base Device Tree blob
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @symbols_off: Node offset of the symbols node in the base device tree
|
|
+ * @property: Property offset in the overlay holding the list of fixups
|
|
+ *
|
|
+ * overlay_fixup_phandle() resolves all the overlay phandles pointed
|
|
+ * to in a __fixups__ property, and updates them to match the phandles
|
|
+ * in use in the base device tree.
|
|
+ *
|
|
+ * This is part of the device tree overlay application process, when
|
|
+ * you want all the phandles in the overlay to point to the actual
|
|
+ * base dt nodes.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,
|
|
+ int property)
|
|
+{
|
|
+ const char *value;
|
|
+ const char *label;
|
|
+ int len;
|
|
+
|
|
+ value = fdt_getprop_by_offset(fdto, property,
|
|
+ &label, &len);
|
|
+ if (!value) {
|
|
+ if (len == -FDT_ERR_NOTFOUND)
|
|
+ return -FDT_ERR_INTERNAL;
|
|
+
|
|
+ return len;
|
|
+ }
|
|
+
|
|
+ do {
|
|
+ const char *path, *name, *fixup_end;
|
|
+ const char *fixup_str = value;
|
|
+ uint32_t path_len, name_len;
|
|
+ uint32_t fixup_len;
|
|
+ char *sep, *endptr;
|
|
+ int poffset, ret;
|
|
+
|
|
+ fixup_end = memchr(value, '\0', len);
|
|
+ if (!fixup_end)
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+ fixup_len = fixup_end - fixup_str;
|
|
+
|
|
+ len -= fixup_len + 1;
|
|
+ value += fixup_len + 1;
|
|
+
|
|
+ path = fixup_str;
|
|
+ sep = memchr(fixup_str, ':', fixup_len);
|
|
+ if (!sep || *sep != ':')
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ path_len = sep - path;
|
|
+ if (path_len == (fixup_len - 1))
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ fixup_len -= path_len + 1;
|
|
+ name = sep + 1;
|
|
+ sep = memchr(name, ':', fixup_len);
|
|
+ if (!sep || *sep != ':')
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ name_len = sep - name;
|
|
+ if (!name_len)
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ poffset = strtoul(sep + 1, &endptr, 10);
|
|
+ if ((*endptr != '\0') || (endptr <= (sep + 1)))
|
|
+ return -FDT_ERR_BADOVERLAY;
|
|
+
|
|
+ ret = overlay_fixup_one_phandle(fdt, fdto, symbols_off,
|
|
+ path, path_len, name, name_len,
|
|
+ poffset, label);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ } while (len > 0);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_fixup_phandles - Resolve the overlay phandles to the base
|
|
+ * device tree
|
|
+ * @fdt: Base Device Tree blob
|
|
+ * @fdto: Device tree overlay blob
|
|
+ *
|
|
+ * overlay_fixup_phandles() resolves all the overlay phandles pointing
|
|
+ * to nodes in the base device tree.
|
|
+ *
|
|
+ * This is one of the steps of the device tree overlay application
|
|
+ * process, when you want all the phandles in the overlay to point to
|
|
+ * the actual base dt nodes.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_fixup_phandles(void *fdt, void *fdto)
|
|
+{
|
|
+ int fixups_off, symbols_off;
|
|
+ int property;
|
|
+
|
|
+ /* We can have overlays without any fixups */
|
|
+ fixups_off = fdt_path_offset(fdto, "/__fixups__");
|
|
+ if (fixups_off == -FDT_ERR_NOTFOUND)
|
|
+ return 0; /* nothing to do */
|
|
+ if (fixups_off < 0)
|
|
+ return fixups_off;
|
|
+
|
|
+ /* And base DTs without symbols */
|
|
+ symbols_off = fdt_path_offset(fdt, "/__symbols__");
|
|
+ if ((symbols_off < 0 && (symbols_off != -FDT_ERR_NOTFOUND)))
|
|
+ return symbols_off;
|
|
+
|
|
+ fdt_for_each_property_offset(property, fdto, fixups_off) {
|
|
+ int ret;
|
|
+
|
|
+ ret = overlay_fixup_phandle(fdt, fdto, symbols_off, property);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_apply_node - Merges a node into the base device tree
|
|
+ * @fdt: Base Device Tree blob
|
|
+ * @target: Node offset in the base device tree to apply the fragment to
|
|
+ * @fdto: Device tree overlay blob
|
|
+ * @node: Node offset in the overlay holding the changes to merge
|
|
+ *
|
|
+ * overlay_apply_node() merges a node into a target base device tree
|
|
+ * node pointed.
|
|
+ *
|
|
+ * This is part of the final step in the device tree overlay
|
|
+ * application process, when all the phandles have been adjusted and
|
|
+ * resolved and you just have to merge overlay into the base device
|
|
+ * tree.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_apply_node(void *fdt, int target,
|
|
+ void *fdto, int node)
|
|
+{
|
|
+ int property;
|
|
+ int subnode;
|
|
+
|
|
+ fdt_for_each_property_offset(property, fdto, node) {
|
|
+ const char *name;
|
|
+ const void *prop;
|
|
+ int prop_len;
|
|
+ int ret;
|
|
+
|
|
+ prop = fdt_getprop_by_offset(fdto, property, &name,
|
|
+ &prop_len);
|
|
+ if (prop_len == -FDT_ERR_NOTFOUND)
|
|
+ return -FDT_ERR_INTERNAL;
|
|
+ if (prop_len < 0)
|
|
+ return prop_len;
|
|
+
|
|
+ ret = fdt_setprop(fdt, target, name, prop, prop_len);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ fdt_for_each_subnode(subnode, fdto, node) {
|
|
+ const char *name = fdt_get_name(fdto, subnode, NULL);
|
|
+ int nnode;
|
|
+ int ret;
|
|
+
|
|
+ nnode = fdt_add_subnode(fdt, target, name);
|
|
+ if (nnode == -FDT_ERR_EXISTS) {
|
|
+ nnode = fdt_subnode_offset(fdt, target, name);
|
|
+ if (nnode == -FDT_ERR_NOTFOUND)
|
|
+ return -FDT_ERR_INTERNAL;
|
|
+ }
|
|
+
|
|
+ if (nnode < 0)
|
|
+ return nnode;
|
|
+
|
|
+ ret = overlay_apply_node(fdt, nnode, fdto, subnode);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * overlay_merge - Merge an overlay into its base device tree
|
|
+ * @fdt: Base Device Tree blob
|
|
+ * @fdto: Device tree overlay blob
|
|
+ *
|
|
+ * overlay_merge() merges an overlay into its base device tree.
|
|
+ *
|
|
+ * This is the final step in the device tree overlay application
|
|
+ * process, when all the phandles have been adjusted and resolved and
|
|
+ * you just have to merge overlay into the base device tree.
|
|
+ *
|
|
+ * returns:
|
|
+ * 0 on success
|
|
+ * Negative error code on failure
|
|
+ */
|
|
+static int overlay_merge(void *fdt, void *fdto)
|
|
+{
|
|
+ int fragment;
|
|
+
|
|
+ fdt_for_each_subnode(fragment, fdto, 0) {
|
|
+ int overlay;
|
|
+ int target;
|
|
+ int ret;
|
|
+
|
|
+ /*
|
|
+ * Each fragments will have an __overlay__ node. If
|
|
+ * they don't, it's not supposed to be merged
|
|
+ */
|
|
+ overlay = fdt_subnode_offset(fdto, fragment, "__overlay__");
|
|
+ if (overlay == -FDT_ERR_NOTFOUND)
|
|
+ continue;
|
|
+
|
|
+ if (overlay < 0)
|
|
+ return overlay;
|
|
+
|
|
+ target = overlay_get_target(fdt, fdto, fragment);
|
|
+ if (target < 0)
|
|
+ return target;
|
|
+
|
|
+ ret = overlay_apply_node(fdt, target, fdto, overlay);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int fdt_overlay_apply(void *fdt, void *fdto)
|
|
+{
|
|
+ uint32_t delta = fdt_get_max_phandle(fdt);
|
|
+ int ret;
|
|
+
|
|
+ FDT_CHECK_HEADER(fdt);
|
|
+ FDT_CHECK_HEADER(fdto);
|
|
+
|
|
+ ret = overlay_adjust_local_phandles(fdto, delta);
|
|
+ if (ret)
|
|
+ goto err;
|
|
+
|
|
+ ret = overlay_update_local_references(fdto, delta);
|
|
+ if (ret)
|
|
+ goto err;
|
|
+
|
|
+ ret = overlay_fixup_phandles(fdt, fdto);
|
|
+ if (ret)
|
|
+ goto err;
|
|
+
|
|
+ ret = overlay_merge(fdt, fdto);
|
|
+ if (ret)
|
|
+ goto err;
|
|
+
|
|
+ /*
|
|
+ * The overlay has been damaged, erase its magic.
|
|
+ */
|
|
+ fdt_set_magic(fdto, ~0);
|
|
+
|
|
+ return 0;
|
|
+
|
|
+err:
|
|
+ /*
|
|
+ * The overlay might have been damaged, erase its magic.
|
|
+ */
|
|
+ fdt_set_magic(fdto, ~0);
|
|
+
|
|
+ /*
|
|
+ * The base device tree might have been damaged, erase its
|
|
+ * magic.
|
|
+ */
|
|
+ fdt_set_magic(fdt, ~0);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c
|
|
index 3d00d2ee..08de2cce 100644
|
|
--- a/scripts/dtc/libfdt/fdt_ro.c
|
|
+++ b/scripts/dtc/libfdt/fdt_ro.c
|
|
@@ -60,7 +60,7 @@ static int _fdt_nodename_eq(const void *fdt, int offset,
|
|
{
|
|
const char *p = fdt_offset_ptr(fdt, offset + FDT_TAGSIZE, len+1);
|
|
|
|
- if (! p)
|
|
+ if (!p)
|
|
/* short match */
|
|
return 0;
|
|
|
|
@@ -327,7 +327,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
|
|
const struct fdt_property *prop;
|
|
|
|
prop = fdt_get_property_namelen(fdt, nodeoffset, name, namelen, lenp);
|
|
- if (! prop)
|
|
+ if (!prop)
|
|
return NULL;
|
|
|
|
return prop->data;
|
|
diff --git a/scripts/dtc/libfdt/fdt_rw.c b/scripts/dtc/libfdt/fdt_rw.c
|
|
index 3fd58473..8b487f6c 100644
|
|
--- a/scripts/dtc/libfdt/fdt_rw.c
|
|
+++ b/scripts/dtc/libfdt/fdt_rw.c
|
|
@@ -207,7 +207,7 @@ static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name,
|
|
int err;
|
|
|
|
*prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
|
|
- if (! (*prop))
|
|
+ if (!*prop)
|
|
return oldlen;
|
|
|
|
if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen),
|
|
@@ -323,7 +323,7 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name)
|
|
FDT_RW_CHECK_HEADER(fdt);
|
|
|
|
prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
|
|
- if (! prop)
|
|
+ if (!prop)
|
|
return len;
|
|
|
|
proplen = sizeof(*prop) + FDT_TAGALIGN(len);
|
|
diff --git a/scripts/dtc/libfdt/fdt_sw.c b/scripts/dtc/libfdt/fdt_sw.c
|
|
index 6a804859..2bd15e7a 100644
|
|
--- a/scripts/dtc/libfdt/fdt_sw.c
|
|
+++ b/scripts/dtc/libfdt/fdt_sw.c
|
|
@@ -220,7 +220,7 @@ static int _fdt_find_add_string(void *fdt, const char *s)
|
|
return offset;
|
|
}
|
|
|
|
-int fdt_property(void *fdt, const char *name, const void *val, int len)
|
|
+int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
|
|
{
|
|
struct fdt_property *prop;
|
|
int nameoff;
|
|
@@ -238,7 +238,19 @@ int fdt_property(void *fdt, const char *name, const void *val, int len)
|
|
prop->tag = cpu_to_fdt32(FDT_PROP);
|
|
prop->nameoff = cpu_to_fdt32(nameoff);
|
|
prop->len = cpu_to_fdt32(len);
|
|
- memcpy(prop->data, val, len);
|
|
+ *valp = prop->data;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int fdt_property(void *fdt, const char *name, const void *val, int len)
|
|
+{
|
|
+ void *ptr;
|
|
+ int ret;
|
|
+
|
|
+ ret = fdt_property_placeholder(fdt, name, len, &ptr);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ memcpy(ptr, val, len);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/scripts/dtc/libfdt/fdt_wip.c b/scripts/dtc/libfdt/fdt_wip.c
|
|
index 6aaab399..5e859198 100644
|
|
--- a/scripts/dtc/libfdt/fdt_wip.c
|
|
+++ b/scripts/dtc/libfdt/fdt_wip.c
|
|
@@ -82,7 +82,7 @@ int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
|
|
int proplen;
|
|
|
|
propval = fdt_getprop(fdt, nodeoffset, name, &proplen);
|
|
- if (! propval)
|
|
+ if (!propval)
|
|
return proplen;
|
|
|
|
if (proplen != len)
|
|
@@ -107,7 +107,7 @@ int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
|
|
int len;
|
|
|
|
prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
|
|
- if (! prop)
|
|
+ if (!prop)
|
|
return len;
|
|
|
|
_fdt_nop_region(prop, len + sizeof(*prop));
|
|
diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
|
|
index ba86caa7..707b5069 100644
|
|
--- a/scripts/dtc/libfdt/libfdt.h
|
|
+++ b/scripts/dtc/libfdt/libfdt.h
|
|
@@ -1314,6 +1314,22 @@ static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
|
|
{
|
|
return fdt_property_u32(fdt, name, val);
|
|
}
|
|
+
|
|
+/**
|
|
+ * fdt_property_placeholder - add a new property and return a ptr to its value
|
|
+ *
|
|
+ * @fdt: pointer to the device tree blob
|
|
+ * @name: name of property to add
|
|
+ * @len: length of property value in bytes
|
|
+ * @valp: returns a pointer to where where the value should be placed
|
|
+ *
|
|
+ * returns:
|
|
+ * 0, on success
|
|
+ * -FDT_ERR_BADMAGIC,
|
|
+ * -FDT_ERR_NOSPACE, standard meanings
|
|
+ */
|
|
+int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp);
|
|
+
|
|
#define fdt_property_string(fdt, name, str) \
|
|
fdt_property(fdt, name, str, strlen(str)+1)
|
|
int fdt_end_node(void *fdt);
|
|
diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c
|
|
index 3673de07..aecd2787 100644
|
|
--- a/scripts/dtc/livetree.c
|
|
+++ b/scripts/dtc/livetree.c
|
|
@@ -478,7 +478,8 @@ struct node *get_node_by_path(struct node *tree, const char *path)
|
|
p = strchr(path, '/');
|
|
|
|
for_each_child(tree, child) {
|
|
- if (p && strneq(path, child->name, p-path))
|
|
+ if (p && (strlen(child->name) == p-path) &&
|
|
+ strneq(path, child->name, p-path))
|
|
return get_node_by_path(child, p+1);
|
|
else if (!p && streq(path, child->name))
|
|
return child;
|
|
diff --git a/scripts/dtc/version_gen.h b/scripts/dtc/version_gen.h
|
|
index 1229e07b..f63127a4 100644
|
|
--- a/scripts/dtc/version_gen.h
|
|
+++ b/scripts/dtc/version_gen.h
|
|
@@ -1 +1 @@
|
|
-#define DTC_VERSION "DTC 1.4.4-g756ffc4f"
|
|
+#define DTC_VERSION "DTC 1.4.4-gd990b801"
|