Browse Source

Add merging of labelled subnodes. This patch allows the following

syntax:

/ {
	child {
		label: subchild {
		};
	};
};

&label {
	prop = "value";
};

which will result in the following tree:

/ {
	child {
		label: subchild {
			prop = "value";
		};
	};
};

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
main
David Gibson 14 years ago committed by Jon Loeliger
parent
commit
8773e12fa9
  1. 2
      dtc-lexer.l
  2. 28
      dtc-parser.y
  3. 10
      tests/nonexist-node-ref2.dts
  4. 3
      tests/run_tests.sh
  5. 2
      tests/test_tree1.dts
  6. 4
      tests/test_tree1_merge.dts
  7. 41
      tests/test_tree1_merge_labelled.dts

2
dtc-lexer.l

@ -109,7 +109,7 @@ static int pop_input_file(void);
return DT_LITERAL; return DT_LITERAL;
} }


\&{LABEL} { /* label reference */ <*>\&{LABEL} { /* label reference */
DPRINT("Ref: %s\n", yytext+1); DPRINT("Ref: %s\n", yytext+1);
yylval.labelref = xstrdup(yytext+1); yylval.labelref = xstrdup(yytext+1);
return DT_REF; return DT_REF;

28
dtc-parser.y

@ -75,7 +75,6 @@ static unsigned long long eval_literal(const char *s, int base, int bits);
%type <proplist> proplist %type <proplist> proplist


%type <node> devicetree %type <node> devicetree
%type <node> devicetrees
%type <node> nodedef %type <node> nodedef
%type <node> subnode %type <node> subnode
%type <nodelist> subnodes %type <nodelist> subnodes
@ -83,7 +82,7 @@ static unsigned long long eval_literal(const char *s, int base, int bits);
%% %%


sourcefile: sourcefile:
DT_V1 ';' memreserves devicetrees DT_V1 ';' memreserves devicetree
{ {
the_boot_info = build_boot_info($3, $4, the_boot_info = build_boot_info($3, $4,
guess_boot_cpuid($4)); guess_boot_cpuid($4));
@ -120,21 +119,26 @@ addr:
} }
; ;


devicetrees: devicetree:
devicetree '/' nodedef
{ {
$$ = $1; $$ = name_node($2, "");
} }
| devicetrees devicetree | devicetree '/' nodedef
{ {
$$ = merge_nodes($1, $2); $$ = merge_nodes($1, $3);
} }
; | devicetree DT_REF nodedef

devicetree:
'/' nodedef
{ {
$$ = name_node($2, ""); struct node *target;

target = get_node_by_label($1, $2);
if (target)
merge_nodes(target, $3);
else
yyerror("label does not exist in "
" node redefinition");
$$ = $1;
} }
; ;



10
tests/nonexist-node-ref2.dts

@ -0,0 +1,10 @@
/dts-v1/;

/ {
label: node {
};
};

/* Try to redefine a node using a non-existent label */
&nosuchnode {
};

3
tests/run_tests.sh

@ -300,6 +300,8 @@ dtc_tests () {
# Check merge/overlay functionality # Check merge/overlay functionality
run_dtc_test -I dts -O dtb -o dtc_tree1_merge.test.dtb test_tree1_merge.dts run_dtc_test -I dts -O dtb -o dtc_tree1_merge.test.dtb test_tree1_merge.dts
tree1_tests dtc_tree1_merge.test.dtb test_tree1.dtb tree1_tests dtc_tree1_merge.test.dtb test_tree1.dtb
run_dtc_test -I dts -O dtb -o dtc_tree1_merge_labelled.test.dtb test_tree1_merge_labelled.dts
tree1_tests dtc_tree1_merge_labelled.test.dtb test_tree1.dtb
run_dtc_test -I dts -O dtb -o multilabel_merge.test.dtb multilabel_merge.dts run_dtc_test -I dts -O dtb -o multilabel_merge.test.dtb multilabel_merge.dts
run_test references multilabel.test.dtb run_test references multilabel.test.dtb
run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb
@ -312,6 +314,7 @@ dtc_tests () {
check_tests minusone-phandle.dts explicit_phandles check_tests minusone-phandle.dts explicit_phandles
run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-node-ref.dts run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-node-ref.dts
run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-label-ref.dts run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-label-ref.dts
run_sh_test dtc-fatal.sh -I dts -O dtb nonexist-node-ref2.dts
check_tests bad-name-property.dts name_properties check_tests bad-name-property.dts name_properties


check_tests bad-ncells.dts address_cells_is_cell size_cells_is_cell interrupt_cells_is_cell check_tests bad-ncells.dts address_cells_is_cell size_cells_is_cell interrupt_cells_is_cell

2
tests/test_tree1.dts

@ -25,7 +25,7 @@
linux,phandle = <0x2000>; linux,phandle = <0x2000>;
prop-int = <123456789>; prop-int = <123456789>;


subsubnode@0 { ssn0: subsubnode@0 {
phandle = <0x2001>; phandle = <0x2001>;
compatible = "subsubnode2", "subsubnode"; compatible = "subsubnode2", "subsubnode";
prop-int = <0726746425>; prop-int = <0726746425>;

4
tests/test_tree1_merge.dts

@ -34,12 +34,10 @@
prop-int = [deadbeef]; prop-int = [deadbeef];
}; };
subnode@2 { subnode@2 {
subsubnode@0 { ssn0: subsubnode@0 {
phandle = <0x2001>; phandle = <0x2001>;
compatible = "subsubnode2", "subsubnode"; compatible = "subsubnode2", "subsubnode";
prop-int = <0726746425>; prop-int = <0726746425>;
}; };
}; };
}; };



41
tests/test_tree1_merge_labelled.dts

@ -0,0 +1,41 @@
/dts-v1/;

/memreserve/ 0xdeadbeef00000000 0x100000;
/memreserve/ 123456789 010000;

/ {
compatible = "test_tree1";
prop-int = <0xdeadbeef>;
prop-str = "hello world";

subnode@1 {
compatible = "subnode1";
prop-int = [deadbeef];

subsubnode {
compatible = "subsubnode1", "subsubnode";
prop-int = <0xdeadbeef>;
};

ss1 {
};
};

subnode@2 {
linux,phandle = <0x2000>;
prop-int = <123456789>;

ssn0: subsubnode@0 {
phandle = <0x2001>;
prop-int = <0xbad>;
};

ss2 {
};
};
};

&ssn0 {
compatible = "subsubnode2", "subsubnode";
prop-int = <0726746425>;
};
Loading…
Cancel
Save