mirror of
https://github.com/dgibson/dtc.git
synced 2025-10-13 16:27:39 -04:00
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@au1.ibm.com> Signed-off-by: Jon Loeliger <jdl@freescale.com>
This commit is contained in:
parent
54382390e4
commit
32da475af1
5 changed files with 49 additions and 4 deletions
27
data.c
27
data.c
|
@ -197,6 +197,33 @@ struct data data_append_data(struct data d, void *p, int len)
|
||||||
return d;
|
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)
|
struct data data_append_cell(struct data d, cell_t word)
|
||||||
{
|
{
|
||||||
cell_t beword = cpu_to_be32(word);
|
cell_t beword = cpu_to_be32(word);
|
||||||
|
|
|
@ -123,6 +123,15 @@ REFCHAR ({PROPCHAR}|{UNITCHAR}|[/@])
|
||||||
return ']';
|
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}+ {
|
{PROPCHAR}+ {
|
||||||
yylloc.first_line = yylineno;
|
yylloc.first_line = yylineno;
|
||||||
DPRINT("PropName: %s\n", yytext);
|
DPRINT("PropName: %s\n", yytext);
|
||||||
|
|
13
dtc-parser.y
13
dtc-parser.y
|
@ -58,6 +58,7 @@ extern struct boot_info *the_boot_info;
|
||||||
%token <str> DT_REF
|
%token <str> DT_REF
|
||||||
|
|
||||||
%type <data> propdata
|
%type <data> propdata
|
||||||
|
%type <data> propdataprefix
|
||||||
%type <re> memreserve
|
%type <re> memreserve
|
||||||
%type <re> memreserves
|
%type <re> memreserves
|
||||||
%type <data> celllist
|
%type <data> celllist
|
||||||
|
@ -121,9 +122,15 @@ propdef: label DT_PROPNAME '=' propdata ';' {
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
propdata: DT_STRING { $$ = $1; }
|
propdata: propdataprefix DT_STRING { $$ = data_merge($1, $2); }
|
||||||
| '<' celllist '>' { $$ = $2; }
|
| propdataprefix '<' celllist '>' {
|
||||||
| '[' bytestring ']' { $$ = $2; }
|
$$ = 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); }
|
celllist: celllist DT_CELL { $$ = data_append_cell($1, $2); }
|
||||||
|
|
1
dtc.h
1
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_copy_file(FILE *f, size_t len);
|
||||||
|
|
||||||
struct data data_append_data(struct data d, void *p, int 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_cell(struct data d, cell_t word);
|
||||||
struct data data_append_re(struct data d, struct reserve_entry *re);
|
struct data data_append_re(struct data d, struct reserve_entry *re);
|
||||||
struct data data_append_addr(struct data d, u64 addr);
|
struct data data_append_addr(struct data d, u64 addr);
|
||||||
|
|
3
test.dts
3
test.dts
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "MyBoardName";
|
model = "MyBoardName";
|
||||||
compatible = "MyBoardFamilyName";
|
compatible = "MyBoardName", "MyBoardFamilyName";
|
||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@
|
||||||
string = "\xff\0stuffstuff\t\t\t\n\n\n";
|
string = "\xff\0stuffstuff\t\t\t\n\n\n";
|
||||||
blob = [0a 0b 0c 0d de ea ad be ef];
|
blob = [0a 0b 0c 0d de ea ad be ef];
|
||||||
ref = < &/memory@0 >;
|
ref = < &/memory@0 >;
|
||||||
|
mixed = "abc", [1234], <a b c>;
|
||||||
};
|
};
|
||||||
|
|
||||||
memory@0 {
|
memory@0 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue