Browse Source

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>
main
David Gibson 18 years ago committed by Jon Loeliger
parent
commit
32da475af1
  1. 27
      data.c
  2. 9
      dtc-lexer.l
  3. 13
      dtc-parser.y
  4. 1
      dtc.h
  5. 3
      test.dts

27
data.c

@ -197,6 +197,33 @@ struct data data_append_data(struct data d, void *p, int len) @@ -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);

9
dtc-lexer.l

@ -123,6 +123,15 @@ REFCHAR ({PROPCHAR}|{UNITCHAR}|[/@]) @@ -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);

13
dtc-parser.y

@ -58,6 +58,7 @@ extern struct boot_info *the_boot_info; @@ -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 ';' { @@ -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); }

1
dtc.h

@ -119,6 +119,7 @@ struct data data_copy_escape_string(char *s, int len); @@ -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);

3
test.dts

@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@

/ {
model = "MyBoardName";
compatible = "MyBoardFamilyName";
compatible = "MyBoardName", "MyBoardFamilyName";
#address-cells = <2>;
#size-cells = <2>;

@ -39,6 +39,7 @@ @@ -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@0 >;
mixed = "abc", [1234], <a b c>;
};

memory@0 {

Loading…
Cancel
Save