[Crosstoolchain-logs] [device-tree-compiler] 75/357: Allow multipart property values
Hector Oron
zumbi at moszumanska.debian.org
Thu Dec 8 17:05:51 UTC 2016
This is an automated email from the git hooks/post-receive script.
zumbi pushed a commit to branch upstream/1.3.x
in repository device-tree-compiler.
commit 32da475af165a0e1e274aa9a8bbdfb873831efa7
Author: David Gibson <david at gibson.dropbear.id.au>
Date: Wed Feb 7 16:37:50 2007 +1100
Allow multipart property values
At present each property definition in a dts file must give as the
value either a string ("abc..."), a bytestring ([12abcd...]) or a cell
list (<1 2 3 ...>). This patch allows a property value to be given as
several of these, comma-separated. The final property value is just
the components appended together. So a property could have a list of
cells followed by a string, or a bytestring followed by some cells.
Cells are always aligned, so if cells are given following a string or
bytestring which is not a multiple of 4 bytes long, zero bytes are
inserted to align the following cells.
The primary motivation for this feature, however, is to allow defining
a property as a list of several strings. This is what's needed for
defining OF 'compatible' properties, and is less ugly and fiddly than
using embedded \0s in the strings.
Signed-off-by: David Gibson <dwg at au1.ibm.com>
Signed-off-by: Jon Loeliger <jdl at freescale.com>
---
data.c | 27 +++++++++++++++++++++++++++
dtc-lexer.l | 9 +++++++++
dtc-parser.y | 13 ++++++++++---
dtc.h | 1 +
test.dts | 3 ++-
5 files changed, 49 insertions(+), 4 deletions(-)
diff --git a/data.c b/data.c
index d3b55f9..1907a1a 100644
--- a/data.c
+++ b/data.c
@@ -197,6 +197,33 @@ struct data data_append_data(struct data d, void *p, int len)
return d;
}
+struct data data_merge(struct data d1, struct data d2)
+{
+ struct data d;
+ struct fixup **ff;
+ struct fixup *f, *f2;
+
+ d = data_append_data(d1, d2.val, d2.len);
+
+ /* Extract d2's fixups */
+ f2 = d2.refs;
+ d2.refs = NULL;
+
+ /* Tack them onto d's list of fixups */
+ ff = &d.refs;
+ while (*ff)
+ ff = &((*ff)->next);
+ *ff = f2;
+
+ /* And correct them for their new position */
+ for (f = f2; f; f = f->next)
+ f->offset += d1.len;
+
+ data_free(d2);
+
+ return d;
+}
+
struct data data_append_cell(struct data d, cell_t word)
{
cell_t beword = cpu_to_be32(word);
diff --git a/dtc-lexer.l b/dtc-lexer.l
index c082228..6146bad 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -123,6 +123,15 @@ REFCHAR ({PROPCHAR}|{UNITCHAR}|[/@])
return ']';
}
+, { /* Technically this is a valid property name,
+ but we'd rather use it as punctuation, so detect it
+ here in preference */
+ yylloc.first_line = yylineno;
+ DPRINT("Char (propname like): %c (\\x%02x)\n", yytext[0],
+ (unsigned)yytext[0]);
+ return yytext[0];
+ }
+
{PROPCHAR}+ {
yylloc.first_line = yylineno;
DPRINT("PropName: %s\n", yytext);
diff --git a/dtc-parser.y b/dtc-parser.y
index 16d2277..bd725fe 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -58,6 +58,7 @@ extern struct boot_info *the_boot_info;
%token <str> DT_REF
%type <data> propdata
+%type <data> propdataprefix
%type <re> memreserve
%type <re> memreserves
%type <data> celllist
@@ -121,9 +122,15 @@ propdef: label DT_PROPNAME '=' propdata ';' {
}
;
-propdata: DT_STRING { $$ = $1; }
- | '<' celllist '>' { $$ = $2; }
- | '[' bytestring ']' { $$ = $2; }
+propdata: propdataprefix DT_STRING { $$ = data_merge($1, $2); }
+ | propdataprefix '<' celllist '>' {
+ $$ = data_merge(data_append_align($1, sizeof(cell_t)), $3);
+ }
+ | propdataprefix '[' bytestring ']' { $$ = data_merge($1, $3); }
+ ;
+
+propdataprefix: propdata ',' { $$ = $1; }
+ | /* empty */ { $$ = empty_data; }
;
celllist: celllist DT_CELL { $$ = data_append_cell($1, $2); }
diff --git a/dtc.h b/dtc.h
index 42e9de0..8d3964c 100644
--- a/dtc.h
+++ b/dtc.h
@@ -119,6 +119,7 @@ struct data data_copy_escape_string(char *s, int len);
struct data data_copy_file(FILE *f, size_t len);
struct data data_append_data(struct data d, void *p, int len);
+struct data data_merge(struct data d1, struct data d2);
struct data data_append_cell(struct data d, cell_t word);
struct data data_append_re(struct data d, struct reserve_entry *re);
struct data data_append_addr(struct data d, u64 addr);
diff --git a/test.dts b/test.dts
index 742d874..ed2b178 100644
--- a/test.dts
+++ b/test.dts
@@ -4,7 +4,7 @@
/ {
model = "MyBoardName";
- compatible = "MyBoardFamilyName";
+ compatible = "MyBoardName", "MyBoardFamilyName";
#address-cells = <2>;
#size-cells = <2>;
@@ -39,6 +39,7 @@
string = "\xff\0stuffstuff\t\t\t\n\n\n";
blob = [0a 0b 0c 0d de ea ad be ef];
ref = < &/memory at 0 >;
+ mixed = "abc", [1234], <a b c>;
};
memory at 0 {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/crosstoolchain/device-tree-compiler.git
More information about the Crosstoolchain-logs
mailing list