All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Add merging of labelled subnodes. This patch allows the following
@ 2010-03-01 15:54 Grant Likely
  2010-09-18 23:54 ` Grant Likely
  0 siblings, 1 reply; 7+ messages in thread
From: Grant Likely @ 2010-03-01 15:54 UTC (permalink / raw)
  To: david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+,
	jdl-CYoMK+44s/E, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ

From: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>

syntax:

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

&label {
	prop = "value";
};

which will result in the following tree:

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

[David's s-o-b needed here]
Signed-off-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
---

Hi Jon,

This works well for me.  I've added another test case to ensure that using
a non-existent label will fail.  This patch is primarily from David now, so
I've changed the From: attribution, but it still needs his s-o-b line.

Cheers,
g.

 dtc-lexer.l                         |    2 +-
 dtc-parser.y                        |   24 ++++++++++++--------
 tests/nonexist-node-ref2.dts        |   10 +++++++++
 tests/run_tests.sh                  |    3 +++
 tests/test_tree1.dts                |    2 +-
 tests/test_tree1_merge.dts          |    4 +--
 tests/test_tree1_merge_labelled.dts |   41 +++++++++++++++++++++++++++++++++++
 7 files changed, 71 insertions(+), 15 deletions(-)
 create mode 100644 tests/nonexist-node-ref2.dts
 create mode 100644 tests/test_tree1_merge_labelled.dts

diff --git a/dtc-lexer.l b/dtc-lexer.l
index 3c3434c..5a7e476 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -109,7 +109,7 @@ static int pop_input_file(void);
 			return DT_LITERAL;
 		}
 
-\&{LABEL}	{	/* label reference */
+<*>\&{LABEL}	{	/* label reference */
 			DPRINT("Ref: %s\n", yytext+1);
 			yylval.labelref = xstrdup(yytext+1);
 			return DT_REF;
diff --git a/dtc-parser.y b/dtc-parser.y
index dea19c1..ed87d3b 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -74,7 +74,6 @@ static unsigned long long eval_literal(const char *s, int base, int bits);
 %type <prop> propdef
 %type <proplist> proplist
 
-%type <node> devicetree
 %type <node> devicetrees
 %type <node> nodedef
 %type <node> subnode
@@ -121,20 +120,25 @@ addr:
 	  ;
 
 devicetrees:
-	  devicetree
+	  '/' nodedef
 		{
-			$$ = $1;
+			$$ = name_node($2, "");
 		}
-	| devicetrees devicetree
+	| devicetrees '/' nodedef
 		{
-			$$ = merge_nodes($1, $2);
+			$$ = merge_nodes($1, $3);
 		}
-	;
-
-devicetree:
-	  '/' nodedef
+	| devicetrees DT_REF 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;
 		}
 	;
 
diff --git a/tests/nonexist-node-ref2.dts b/tests/nonexist-node-ref2.dts
new file mode 100644
index 0000000..44b4ebe
--- /dev/null
+++ b/tests/nonexist-node-ref2.dts
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+	label: node {
+	};
+};
+
+/* Try to redefine a node using a non-existent label */
+&nosuchnode {
+};
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 43b9d44..3ce71c4 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -300,6 +300,8 @@ dtc_tests () {
     # Check merge/overlay functionality
     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
+    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_test references multilabel.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
     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-fatal.sh -I dts -O dtb nonexist-node-ref2.dts
     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
diff --git a/tests/test_tree1.dts b/tests/test_tree1.dts
index 218c382..4f0ce45 100644
--- a/tests/test_tree1.dts
+++ b/tests/test_tree1.dts
@@ -25,7 +25,7 @@
 		linux,phandle = <0x2000>;
 		prop-int = <123456789>;
 
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
diff --git a/tests/test_tree1_merge.dts b/tests/test_tree1_merge.dts
index f580da8..fc191fd 100644
--- a/tests/test_tree1_merge.dts
+++ b/tests/test_tree1_merge.dts
@@ -34,12 +34,10 @@
 		prop-int = [deadbeef];
 	};
 	subnode@2 {
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
 		};
 	};
 };
-
-
diff --git a/tests/test_tree1_merge_labelled.dts b/tests/test_tree1_merge_labelled.dts
new file mode 100644
index 0000000..46a6840
--- /dev/null
+++ b/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>;
+};

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add merging of labelled subnodes. This patch allows the following
  2010-03-01 15:54 [PATCH] Add merging of labelled subnodes. This patch allows the following Grant Likely
@ 2010-09-18 23:54 ` Grant Likely
  0 siblings, 0 replies; 7+ messages in thread
From: Grant Likely @ 2010-09-18 23:54 UTC (permalink / raw)
  To: david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+,
	jdl-CYoMK+44s/E, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ

David, can you please ack adding your s-o-b to this one?  It is mostly
your patch anyway, but I had tested it and added a failure test case.
Then Jon will be able to merge it.

g.

---------- Forwarded message ----------
From: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
Date: Mon, Mar 1, 2010 at 9:54 AM
Subject: [PATCH] Add merging of labelled subnodes. This patch allows
the following
To: david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org, jdl-CYoMK+44s/E@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org


From: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>

syntax:

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

&label {
       prop = "value";
};

which will result in the following tree:

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

[David's s-o-b needed here]
Signed-off-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
---

Hi Jon,

This works well for me.  I've added another test case to ensure that using
a non-existent label will fail.  This patch is primarily from David now, so
I've changed the From: attribution, but it still needs his s-o-b line.

Cheers,
g.

 dtc-lexer.l                         |    2 +-
 dtc-parser.y                        |   24 ++++++++++++--------
 tests/nonexist-node-ref2.dts        |   10 +++++++++
 tests/run_tests.sh                  |    3 +++
 tests/test_tree1.dts                |    2 +-
 tests/test_tree1_merge.dts          |    4 +--
 tests/test_tree1_merge_labelled.dts |   41 +++++++++++++++++++++++++++++++++++
 7 files changed, 71 insertions(+), 15 deletions(-)
 create mode 100644 tests/nonexist-node-ref2.dts
 create mode 100644 tests/test_tree1_merge_labelled.dts

diff --git a/dtc-lexer.l b/dtc-lexer.l
index 3c3434c..5a7e476 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -109,7 +109,7 @@ static int pop_input_file(void);
                       return DT_LITERAL;
               }

-\&{LABEL}      {       /* label reference */
+<*>\&{LABEL}   {       /* label reference */
                       DPRINT("Ref: %s\n", yytext+1);
                       yylval.labelref = xstrdup(yytext+1);
                       return DT_REF;
diff --git a/dtc-parser.y b/dtc-parser.y
index dea19c1..ed87d3b 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -74,7 +74,6 @@ static unsigned long long eval_literal(const char
*s, int base, int bits);
 %type <prop> propdef
 %type <proplist> proplist

-%type <node> devicetree
 %type <node> devicetrees
 %type <node> nodedef
 %type <node> subnode
@@ -121,20 +120,25 @@ addr:
         ;

 devicetrees:
-         devicetree
+         '/' nodedef
               {
-                       $$ = $1;
+                       $$ = name_node($2, "");
               }
-       | devicetrees devicetree
+       | devicetrees '/' nodedef
               {
-                       $$ = merge_nodes($1, $2);
+                       $$ = merge_nodes($1, $3);
               }
-       ;
-
-devicetree:
-         '/' nodedef
+       | devicetrees DT_REF 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;
               }
       ;

diff --git a/tests/nonexist-node-ref2.dts b/tests/nonexist-node-ref2.dts
new file mode 100644
index 0000000..44b4ebe
--- /dev/null
+++ b/tests/nonexist-node-ref2.dts
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+       label: node {
+       };
+};
+
+/* Try to redefine a node using a non-existent label */
+&nosuchnode {
+};
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 43b9d44..3ce71c4 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -300,6 +300,8 @@ dtc_tests () {
    # Check merge/overlay functionality
    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
+    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_test references multilabel.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
    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-fatal.sh -I dts -O dtb nonexist-node-ref2.dts
    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
diff --git a/tests/test_tree1.dts b/tests/test_tree1.dts
index 218c382..4f0ce45 100644
--- a/tests/test_tree1.dts
+++ b/tests/test_tree1.dts
@@ -25,7 +25,7 @@
               linux,phandle = <0x2000>;
               prop-int = <123456789>;

-               subsubnode@0 {
+               ssn0: subsubnode@0 {
                       phandle = <0x2001>;
                       compatible = "subsubnode2", "subsubnode";
                       prop-int = <0726746425>;
diff --git a/tests/test_tree1_merge.dts b/tests/test_tree1_merge.dts
index f580da8..fc191fd 100644
--- a/tests/test_tree1_merge.dts
+++ b/tests/test_tree1_merge.dts
@@ -34,12 +34,10 @@
               prop-int = [deadbeef];
       };
       subnode@2 {
-               subsubnode@0 {
+               ssn0: subsubnode@0 {
                       phandle = <0x2001>;
                       compatible = "subsubnode2", "subsubnode";
                       prop-int = <0726746425>;
               };
       };
 };
-
-
diff --git a/tests/test_tree1_merge_labelled.dts
b/tests/test_tree1_merge_labelled.dts
new file mode 100644
index 0000000..46a6840
--- /dev/null
+++ b/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>;
+};




-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add merging of labelled subnodes. This patch allows the following
  2010-09-20 22:33 Grant Likely
@ 2010-09-21 15:17 ` Jon Loeliger
  0 siblings, 0 replies; 7+ messages in thread
From: Jon Loeliger @ 2010-09-21 15:17 UTC (permalink / raw)
  To: Grant Likely; +Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ

> From: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
> 
> 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-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
> Signed-off-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>

Applied and pushed out.

Thanks!
jdl

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] Add merging of labelled subnodes. This patch allows the following
@ 2010-09-20 22:33 Grant Likely
  2010-09-21 15:17 ` Jon Loeliger
  0 siblings, 1 reply; 7+ messages in thread
From: Grant Likely @ 2010-09-20 22:33 UTC (permalink / raw)
  To: jdl-CYoMK+44s/E; +Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ

From: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>

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-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
Signed-off-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
---
 dtc-lexer.l                         |    2 +-
 dtc-parser.y                        |   28 ++++++++++++++----------
 tests/nonexist-node-ref2.dts        |   10 +++++++++
 tests/run_tests.sh                  |    3 +++
 tests/test_tree1.dts                |    2 +-
 tests/test_tree1_merge.dts          |    4 +--
 tests/test_tree1_merge_labelled.dts |   41 +++++++++++++++++++++++++++++++++++
 7 files changed, 73 insertions(+), 17 deletions(-)
 create mode 100644 tests/nonexist-node-ref2.dts
 create mode 100644 tests/test_tree1_merge_labelled.dts

diff --git a/dtc-lexer.l b/dtc-lexer.l
index f8953f4..081e13a 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -109,7 +109,7 @@ static int pop_input_file(void);
 			return DT_LITERAL;
 		}
 
-\&{LABEL}	{	/* label reference */
+<*>\&{LABEL}	{	/* label reference */
 			DPRINT("Ref: %s\n", yytext+1);
 			yylval.labelref = xstrdup(yytext+1);
 			return DT_REF;
diff --git a/dtc-parser.y b/dtc-parser.y
index dea19c1..0aaf8e8 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -75,7 +75,6 @@ static unsigned long long eval_literal(const char *s, int base, int bits);
 %type <proplist> proplist
 
 %type <node> devicetree
-%type <node> devicetrees
 %type <node> nodedef
 %type <node> subnode
 %type <nodelist> subnodes
@@ -83,7 +82,7 @@ static unsigned long long eval_literal(const char *s, int base, int bits);
 %%
 
 sourcefile:
-	  DT_V1 ';' memreserves devicetrees
+	  DT_V1 ';' memreserves devicetree
 		{
 			the_boot_info = build_boot_info($3, $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:
-	  '/' nodedef
+	| devicetree DT_REF 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;
 		}
 	;
 
diff --git a/tests/nonexist-node-ref2.dts b/tests/nonexist-node-ref2.dts
new file mode 100644
index 0000000..44b4ebe
--- /dev/null
+++ b/tests/nonexist-node-ref2.dts
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+	label: node {
+	};
+};
+
+/* Try to redefine a node using a non-existent label */
+&nosuchnode {
+};
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 4cec62c..7437add 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -300,6 +300,8 @@ dtc_tests () {
     # Check merge/overlay functionality
     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
+    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_test references multilabel.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
     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-fatal.sh -I dts -O dtb nonexist-node-ref2.dts
     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
diff --git a/tests/test_tree1.dts b/tests/test_tree1.dts
index 218c382..4f0ce45 100644
--- a/tests/test_tree1.dts
+++ b/tests/test_tree1.dts
@@ -25,7 +25,7 @@
 		linux,phandle = <0x2000>;
 		prop-int = <123456789>;
 
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
diff --git a/tests/test_tree1_merge.dts b/tests/test_tree1_merge.dts
index f580da8..fc191fd 100644
--- a/tests/test_tree1_merge.dts
+++ b/tests/test_tree1_merge.dts
@@ -34,12 +34,10 @@
 		prop-int = [deadbeef];
 	};
 	subnode@2 {
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
 		};
 	};
 };
-
-
diff --git a/tests/test_tree1_merge_labelled.dts b/tests/test_tree1_merge_labelled.dts
new file mode 100644
index 0000000..46a6840
--- /dev/null
+++ b/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>;
+};

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add merging of labelled subnodes. This patch allows the following
  2010-03-01  6:22 ` David Gibson
@ 2010-03-01  6:49   ` Grant Likely
  0 siblings, 0 replies; 7+ messages in thread
From: Grant Likely @ 2010-03-01  6:49 UTC (permalink / raw)
  To: David Gibson; +Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ

On Sun, Feb 28, 2010 at 11:22 PM, David Gibson
<david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org> wrote:
> On Fri, Feb 26, 2010 at 12:07:28PM -0700, Grant Likely wrote:
>> syntax:
>>
>> / {
>>       child {
>>               label: subchild {
>>               };
>>       };
>> };
>>
>> &label {
>>       prop = "value";
>> };
>>
>> which will result in the following tree:
>> / {
>>       child {
>>               label: subchild {
>>                       prop = "value";
>>               };
>>       };
>> };
>>
>> ---
>>
>> Hi Jon and David
>>
>> This patch isn't quite finished yet, but I'm getting it out there for
>> feedback.  In particular, I'm don't know how best to handle errors in
>> livetree.c.  The way I'm currently handling it is calling yyerror()
>> from livetree.c, which results in a compile warning.
>
> Hrm, that's a bit ugly.
>
>> I also don't yet have a test case for referencing a label that doesn't
>> exist in the main tree.
>
> Ah, yeah.  Testcases for incorrect input are often the fiddliest.
>
> So, here's my counter-proposal.  By rearranging the grammar a little,
> and putting the labelled merge logic into dtc-parser.y itself, it
> accomplishes the same thing without the warning, and with a bit less
> code.

Nice.  I like.  I'll give it a spin tomorrow.

g.

>
> Index: dtc/dtc-lexer.l
> ===================================================================
> --- dtc.orig/dtc-lexer.l        2010-02-09 10:26:06.840350087 +1100
> +++ dtc/dtc-lexer.l     2010-03-01 14:22:26.927391539 +1100
> @@ -109,7 +109,7 @@ static int pop_input_file(void);
>                        return DT_LITERAL;
>                }
>
> -\&{LABEL}      {       /* label reference */
> +<*>\&{LABEL}   {       /* label reference */
>                        DPRINT("Ref: %s\n", yytext+1);
>                        yylval.labelref = xstrdup(yytext+1);
>                        return DT_REF;
> Index: dtc/dtc-parser.y
> ===================================================================
> --- dtc.orig/dtc-parser.y       2010-02-26 10:40:00.136001074 +1100
> +++ dtc/dtc-parser.y    2010-03-01 17:15:59.779380861 +1100
> @@ -74,7 +74,6 @@ static unsigned long long eval_literal(c
>  %type <prop> propdef
>  %type <proplist> proplist
>
> -%type <node> devicetree
>  %type <node> devicetrees
>  %type <node> nodedef
>  %type <node> subnode
> @@ -121,20 +120,25 @@ addr:
>          ;
>
>  devicetrees:
> -         devicetree
> +         '/' nodedef
>                {
> -                       $$ = $1;
> +                       $$ = name_node($2, "");
>                }
> -       | devicetrees devicetree
> +       | devicetrees '/' nodedef
>                {
> -                       $$ = merge_nodes($1, $2);
> +                       $$ = merge_nodes($1, $3);
>                }
> -       ;
> -
> -devicetree:
> -         '/' nodedef
> +       | devicetrees DT_REF 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;
>                }
>        ;
>
> Index: dtc/tests/run_tests.sh
> ===================================================================
> --- dtc.orig/tests/run_tests.sh 2010-03-01 14:21:48.607391244 +1100
> +++ dtc/tests/run_tests.sh      2010-03-01 14:22:26.931385551 +1100
> @@ -301,6 +301,8 @@ dtc_tests () {
>     # Check merge/overlay functionality
>     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
> +    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_test references multilabel.test.dtb
>     run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb
> Index: dtc/tests/test_tree1.dts
> ===================================================================
> --- dtc.orig/tests/test_tree1.dts       2009-11-27 08:45:46.000000000 +1100
> +++ dtc/tests/test_tree1.dts    2010-03-01 14:22:26.959424732 +1100
> @@ -25,7 +25,7 @@
>                linux,phandle = <0x2000>;
>                prop-int = <123456789>;
>
> -               subsubnode@0 {
> +               ssn0: subsubnode@0 {
>                        phandle = <0x2001>;
>                        compatible = "subsubnode2", "subsubnode";
>                        prop-int = <0726746425>;
> Index: dtc/tests/test_tree1_merge.dts
> ===================================================================
> --- dtc.orig/tests/test_tree1_merge.dts 2010-02-26 10:40:00.136001074 +1100
> +++ dtc/tests/test_tree1_merge.dts      2010-03-01 14:22:26.967424771 +1100
> @@ -34,12 +34,10 @@
>                prop-int = [deadbeef];
>        };
>        subnode@2 {
> -               subsubnode@0 {
> +               ssn0: subsubnode@0 {
>                        phandle = <0x2001>;
>                        compatible = "subsubnode2", "subsubnode";
>                        prop-int = <0726746425>;
>                };
>        };
>  };
> -
> -
> Index: dtc/tests/test_tree1_merge_labelled.dts
> ===================================================================
> --- /dev/null   1970-01-01 00:00:00.000000000 +0000
> +++ dtc/tests/test_tree1_merge_labelled.dts     2010-03-01 14:22:26.967424771 +1100
> @@ -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>;
> +};
>
>
> --
> David Gibson                    | I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
>                                | _way_ _around_!
> http://www.ozlabs.org/~dgibson
>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Add merging of labelled subnodes. This patch allows the following
  2010-02-26 19:07 Grant Likely
@ 2010-03-01  6:22 ` David Gibson
  2010-03-01  6:49   ` Grant Likely
  0 siblings, 1 reply; 7+ messages in thread
From: David Gibson @ 2010-03-01  6:22 UTC (permalink / raw)
  To: Grant Likely; +Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ

On Fri, Feb 26, 2010 at 12:07:28PM -0700, Grant Likely wrote:
> syntax:
> 
> / {
> 	child {
> 		label: subchild {
> 		};
> 	};
> };
> 
> &label {
> 	prop = "value";
> };
> 
> which will result in the following tree:
> / {
> 	child {
> 		label: subchild {
> 			prop = "value";
> 		};
> 	};
> };
> 
> ---
> 
> Hi Jon and David
> 
> This patch isn't quite finished yet, but I'm getting it out there for
> feedback.  In particular, I'm don't know how best to handle errors in
> livetree.c.  The way I'm currently handling it is calling yyerror()
> from livetree.c, which results in a compile warning.

Hrm, that's a bit ugly.

> I also don't yet have a test case for referencing a label that doesn't
> exist in the main tree.

Ah, yeah.  Testcases for incorrect input are often the fiddliest.

So, here's my counter-proposal.  By rearranging the grammar a little,
and putting the labelled merge logic into dtc-parser.y itself, it
accomplishes the same thing without the warning, and with a bit less
code.

Index: dtc/dtc-lexer.l
===================================================================
--- dtc.orig/dtc-lexer.l	2010-02-09 10:26:06.840350087 +1100
+++ dtc/dtc-lexer.l	2010-03-01 14:22:26.927391539 +1100
@@ -109,7 +109,7 @@ static int pop_input_file(void);
 			return DT_LITERAL;
 		}
 
-\&{LABEL}	{	/* label reference */
+<*>\&{LABEL}	{	/* label reference */
 			DPRINT("Ref: %s\n", yytext+1);
 			yylval.labelref = xstrdup(yytext+1);
 			return DT_REF;
Index: dtc/dtc-parser.y
===================================================================
--- dtc.orig/dtc-parser.y	2010-02-26 10:40:00.136001074 +1100
+++ dtc/dtc-parser.y	2010-03-01 17:15:59.779380861 +1100
@@ -74,7 +74,6 @@ static unsigned long long eval_literal(c
 %type <prop> propdef
 %type <proplist> proplist
 
-%type <node> devicetree
 %type <node> devicetrees
 %type <node> nodedef
 %type <node> subnode
@@ -121,20 +120,25 @@ addr:
 	  ;
 
 devicetrees:
-	  devicetree
+	  '/' nodedef
 		{
-			$$ = $1;
+			$$ = name_node($2, "");
 		}
-	| devicetrees devicetree
+	| devicetrees '/' nodedef
 		{
-			$$ = merge_nodes($1, $2);
+			$$ = merge_nodes($1, $3);
 		}
-	;
-
-devicetree:
-	  '/' nodedef
+	| devicetrees DT_REF 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;
 		}
 	;
 
Index: dtc/tests/run_tests.sh
===================================================================
--- dtc.orig/tests/run_tests.sh	2010-03-01 14:21:48.607391244 +1100
+++ dtc/tests/run_tests.sh	2010-03-01 14:22:26.931385551 +1100
@@ -301,6 +301,8 @@ dtc_tests () {
     # Check merge/overlay functionality
     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
+    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_test references multilabel.test.dtb
     run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb
Index: dtc/tests/test_tree1.dts
===================================================================
--- dtc.orig/tests/test_tree1.dts	2009-11-27 08:45:46.000000000 +1100
+++ dtc/tests/test_tree1.dts	2010-03-01 14:22:26.959424732 +1100
@@ -25,7 +25,7 @@
 		linux,phandle = <0x2000>;
 		prop-int = <123456789>;
 
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
Index: dtc/tests/test_tree1_merge.dts
===================================================================
--- dtc.orig/tests/test_tree1_merge.dts	2010-02-26 10:40:00.136001074 +1100
+++ dtc/tests/test_tree1_merge.dts	2010-03-01 14:22:26.967424771 +1100
@@ -34,12 +34,10 @@
 		prop-int = [deadbeef];
 	};
 	subnode@2 {
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
 		};
 	};
 };
-
-
Index: dtc/tests/test_tree1_merge_labelled.dts
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ dtc/tests/test_tree1_merge_labelled.dts	2010-03-01 14:22:26.967424771 +1100
@@ -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>;
+};


-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] Add merging of labelled subnodes. This patch allows the following
@ 2010-02-26 19:07 Grant Likely
  2010-03-01  6:22 ` David Gibson
  0 siblings, 1 reply; 7+ messages in thread
From: Grant Likely @ 2010-02-26 19:07 UTC (permalink / raw)
  To: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, jdl-CYoMK+44s/E,
	david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+

syntax:

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

&label {
	prop = "value";
};

which will result in the following tree:
/ {
	child {
		label: subchild {
			prop = "value";
		};
	};
};

---

Hi Jon and David

This patch isn't quite finished yet, but I'm getting it out there for
feedback.  In particular, I'm don't know how best to handle errors in
livetree.c.  The way I'm currently handling it is calling yyerror()
from livetree.c, which results in a compile warning.

I also don't yet have a test case for referencing a label that doesn't
exist in the main tree.

I could use some help on how I should be implementing the error
handling.

Thanks,
g.
---

 dtc-lexer.l                         |    2 +-
 dtc-parser.y                        |   13 +++++++++++
 dtc.h                               |    1 +
 livetree.c                          |   30 ++++++++++++++++++++++++++
 tests/run_tests.sh                  |    2 ++
 tests/test_tree1.dts                |    2 +-
 tests/test_tree1_merge.dts          |    4 +--
 tests/test_tree1_merge_labelled.dts |   41 +++++++++++++++++++++++++++++++++++
 8 files changed, 90 insertions(+), 5 deletions(-)
 create mode 100644 tests/test_tree1_merge_labelled.dts

diff --git a/dtc-lexer.l b/dtc-lexer.l
index 3c3434c..5a7e476 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -109,7 +109,7 @@ static int pop_input_file(void);
 			return DT_LITERAL;
 		}
 
-\&{LABEL}	{	/* label reference */
+<*>\&{LABEL}	{	/* label reference */
 			DPRINT("Ref: %s\n", yytext+1);
 			yylval.labelref = xstrdup(yytext+1);
 			return DT_REF;
diff --git a/dtc-parser.y b/dtc-parser.y
index dea19c1..be86e5b 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -76,6 +76,7 @@ static unsigned long long eval_literal(const char *s, int base, int bits);
 
 %type <node> devicetree
 %type <node> devicetrees
+%type <node> labelledtree
 %type <node> nodedef
 %type <node> subnode
 %type <nodelist> subnodes
@@ -129,6 +130,10 @@ devicetrees:
 		{
 			$$ = merge_nodes($1, $2);
 		}
+	| devicetrees labelledtree
+		{
+			$$ = merge_labelled_node($1, $2);
+		}
 	;
 
 devicetree:
@@ -138,6 +143,14 @@ devicetree:
 		}
 	;
 
+labelledtree:
+	  DT_REF nodedef
+		{
+			add_label(&$2->labels, $1);
+			$$ = $2;
+		}
+	;
+
 nodedef:
 	  '{' proplist subnodes '}' ';'
 		{
diff --git a/dtc.h b/dtc.h
index b36ac5d..af5e28c 100644
--- a/dtc.h
+++ b/dtc.h
@@ -175,6 +175,7 @@ struct node *build_node(struct property *proplist, struct node *children);
 struct node *name_node(struct node *node, char *name);
 struct node *chain_node(struct node *first, struct node *list);
 struct node *merge_nodes(struct node *old_node, struct node *new_node);
+struct node *merge_labelled_node(struct node *tree, struct node *labelled_node);
 
 void add_property(struct node *node, struct property *prop);
 void add_child(struct node *parent, struct node *child);
diff --git a/livetree.c b/livetree.c
index 13c5f10..0c8a24d 100644
--- a/livetree.c
+++ b/livetree.c
@@ -167,6 +167,36 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
 	return old_node;
 }
 
+struct node *merge_labelled_node(struct node *tree, struct node *labelled_node)
+{
+	struct node *child, *rn;
+	struct label *tree_label, *child_label;
+
+	/* First, check if this node matches */
+	for_each_label(tree->labels, tree_label) {
+		for_each_label(labelled_node->labels, child_label) {
+			if (streq(tree_label->label, child_label->label))
+				return merge_nodes(tree, labelled_node);
+		}
+	}
+
+	/* Otherwise, recursivelly search the children for something matching */
+	for_each_child(tree, child) {
+		rn = merge_labelled_node(child, labelled_node);
+		if (rn)
+			return tree;
+	}
+
+	/* Nothing matched.  If this is the root node, then this is an error */
+	if (!tree->parent) {
+		yyerror("parse error: undefined label in node redefinition");
+		return tree;
+	}
+
+	/* return NULL so that recursive call knows nothing matched */
+	return NULL;
+}
+
 struct node *chain_node(struct node *first, struct node *list)
 {
 	assert(first->next_sibling == NULL);
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 43b9d44..80a1e3c 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -300,6 +300,8 @@ dtc_tests () {
     # Check merge/overlay functionality
     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
+    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_test references multilabel.test.dtb
     run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb
diff --git a/tests/test_tree1.dts b/tests/test_tree1.dts
index 218c382..4f0ce45 100644
--- a/tests/test_tree1.dts
+++ b/tests/test_tree1.dts
@@ -25,7 +25,7 @@
 		linux,phandle = <0x2000>;
 		prop-int = <123456789>;
 
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
diff --git a/tests/test_tree1_merge.dts b/tests/test_tree1_merge.dts
index f580da8..fc191fd 100644
--- a/tests/test_tree1_merge.dts
+++ b/tests/test_tree1_merge.dts
@@ -34,12 +34,10 @@
 		prop-int = [deadbeef];
 	};
 	subnode@2 {
-		subsubnode@0 {
+		ssn0: subsubnode@0 {
 			phandle = <0x2001>;
 			compatible = "subsubnode2", "subsubnode";
 			prop-int = <0726746425>;
 		};
 	};
 };
-
-
diff --git a/tests/test_tree1_merge_labelled.dts b/tests/test_tree1_merge_labelled.dts
new file mode 100644
index 0000000..46a6840
--- /dev/null
+++ b/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>;
+};

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-09-21 15:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-01 15:54 [PATCH] Add merging of labelled subnodes. This patch allows the following Grant Likely
2010-09-18 23:54 ` Grant Likely
  -- strict thread matches above, loose matches on Subject: below --
2010-09-20 22:33 Grant Likely
2010-09-21 15:17 ` Jon Loeliger
2010-02-26 19:07 Grant Likely
2010-03-01  6:22 ` David Gibson
2010-03-01  6:49   ` Grant Likely

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.