Skip to contentSkip to conversation

DTC unit-address checks

PATCH Applied Rob Herring 2 participants 11 messages Feb 11, 2016 – Feb 25, 2016 8 messages not in the archive

lore
Share & tools
lore
#0 lore raw

cover DTC unit-address checks

I've been much more active in reviewing bindings lately and a few things are getting old repeating. One is unit-address issues. I happened to be looking at the old dtc C schema today and found this old patch[1] from Stephen which never got merged. It derailed into how to updated ePAPR to clarify for unit-address with ranges property, but didn't seem to have any other objections. So, I've refreshed Stephen's patch and skip the check if non-empty ranges is present.

I also added a 2nd patch with checks for leading '0x' or 0s. This should never be valid. Also, I think Stephen's comment about checking the address value being difficult is wrong. We should be able to check that as any bus specific unit addresses should contain commas.

On a build of all dtbs, ARM has 36K warnings! The good news is arm64 is *only* 400 or so. I've skimmed thru them and they all looked valid to me.

Any objections to this series will result in getting added as a DT binding maintainer. :)

Rob

[1] https://lkml.org/lkml/2013/9/19/301

Rob Herring (1):
Warn on node name unit-addresses with '0x' or leading 0s

Stephen Warren (1):
Warn on node name unit-address presence/absence mismatch

 checks.c                        | 38 ++++++++++++++++++++++++++++++++++++--
 tests/reg-without-unit-addr.dts | 10 ++++++++++
 tests/run_tests.sh              |  4 ++++
 tests/unit-addr-leading-0s.dts  | 10 ++++++++++
 tests/unit-addr-leading-0x.dts  | 10 ++++++++++
 tests/unit-addr-without-reg.dts |  9 +++++++++
 6 files changed, 79 insertions(+), 2 deletions(-)
 create mode 100644 tests/reg-without-unit-addr.dts
 create mode 100644 tests/unit-addr-leading-0s.dts
 create mode 100644 tests/unit-addr-leading-0x.dts
 create mode 100644 tests/unit-addr-without-reg.dts
Signature · 1 line
2.5.0

A message that is not in the archive (sent off-list or not yet received): 1455223619-16052-1-git-send-email-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org

#2 lore raw

PATCH 1/2 Warn on node name unit-address presence/absence mismatch

From: Stephen Warren <[email protected]>

ePAPR 1.1 section 2.2.1.1 "Node Name Requirements" specifies that any node that has a reg property must include a unit address in its name with value matching the first entry in its reg property. Conversely, if a node does not have a reg property, the node name must not include a unit address. Also allow ranges property as it is deemed valid, but ePAPR is not clear about it.

Implement a check for this. The code doesn't validate the format of the unit address; ePAPR implies this may vary from (containing bus) binding to binding, so doing so would be much more complex.

[robh: also allow non-empty ranges]
---
 checks.c                        | 28 ++++++++++++++++++++++++++--
 tests/reg-without-unit-addr.dts | 10 ++++++++++
 tests/run_tests.sh              |  2 ++
 tests/unit-addr-without-reg.dts |  9 +++++++++
 4 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 tests/reg-without-unit-addr.dts
 create mode 100644 tests/unit-addr-without-reg.dts
checks.c +26 -2
index 0c03ac9..4001b8c 100644
@@ -294,6 +294,30 @@ static void check_node_name_format(struct check *c, struct node *dt,
 }
 NODE_ERROR(node_name_format, NULL, &node_name_chars);
 
+static void check_unit_address_vs_reg(struct check *c, struct node *dt,
+			     struct node *node)
+{
+	const char *unitname = get_unitname(node);
+	struct property *prop = get_property(node, "reg");
+
+	if (!prop) {
+		prop = get_property(node, "ranges");
+		if (prop && !prop->val.len)
+			prop = NULL;
+	}
+
+	if (prop) {
+		if (!unitname[0])
+			FAIL(c, "Node %s has a reg or ranges property, but no unit name",
+			    node->fullpath);
+	} else {
+		if (unitname[0])
+			FAIL(c, "Node %s has a unit name, but no reg property",
+			    node->fullpath);
+	}
+}
+NODE_WARNING(unit_address_vs_reg, NULL);
+
 static void check_property_name_chars(struct check *c, struct node *dt,
 				      struct node *node, struct property *prop)
 {
@@ -654,8 +678,8 @@ TREE_WARNING(obsolete_chosen_interrupt_controller, NULL);
 
 static struct check *check_table[] = {
 	&duplicate_node_names, &duplicate_property_names,
-	&node_name_chars, &node_name_format, &property_name_chars,
-	&name_is_string, &name_properties,
+	&node_name_chars, &node_name_format, &unit_address_vs_reg,
+	&property_name_chars, &name_is_string, &name_properties,
 
 	&duplicate_label,
 
tests/reg-without-unit-addr.dts new file +10 -0
new file mode 100644
index 0000000..aaf8af7
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	node {
+		reg = <0 1>;
+	};
+};
tests/run_tests.sh +2 -0
index 8863c9a..4b7a131 100755
@@ -443,6 +443,8 @@ dtc_tests () {
     check_tests reg-ranges-root.dts reg_format ranges_format
     check_tests default-addr-size.dts avoid_default_addr_size
     check_tests obsolete-chosen-interrupt-controller.dts obsolete_chosen_interrupt_controller
+    check_tests reg-without-unit-addr.dts unit_address_vs_reg
+    check_tests unit-addr-without-reg.dts unit_address_vs_reg
     run_sh_test dtc-checkfails.sh node_name_chars -- -I dtb -O dtb bad_node_char.dtb
     run_sh_test dtc-checkfails.sh node_name_format -- -I dtb -O dtb bad_node_format.dtb
     run_sh_test dtc-checkfails.sh prop_name_chars -- -I dtb -O dtb bad_prop_char.dtb
tests/unit-addr-without-reg.dts new file +9 -0
new file mode 100644
index 0000000..ac786eb
@@ -0,0 +1,9 @@
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	node@1 {
+	};
+};
Signature · 1 line
2.5.0

A message that is not in the archive (sent off-list or not yet received): 1455223619-16052-2-git-send-email-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org

Applied
#4 lore raw

Re: [PATCH 1/2] Warn on node name unit-address presence/absence mismatch

Quoted 9 lines · Rob Herring

From: Stephen Warren <[email protected]>

ePAPR 1.1 section 2.2.1.1 "Node Name Requirements" specifies that any node that has a reg property must include a unit address in its name with value matching the first entry in its reg property. Conversely, if a node does not have a reg property, the node name must not include a unit address. Also allow ranges property as it is deemed valid, but ePAPR is not clear about it.

Quoted 7 lines

Implement a check for this. The code doesn't validate the format of the unit address; ePAPR implies this may vary from (containing bus) binding to binding, so doing so would be much more complex.

[robh: also allow non-empty ranges]

I've applied this to master.

[snip]

checks.c TREE_WARNING(obsolete_chosen_interrupt_controller, NULL); · line 683

Quoted 9 lines
checks.c +2 -2
@@ -654,8 +678,8 @@ TREE_WARNING(obsolete_chosen_interrupt_controller, NULL);
 
 static struct check *check_table[] = {
 	&duplicate_node_names, &duplicate_property_names,
-	&node_name_chars, &node_name_format, &property_name_chars,
-	&name_is_string, &name_properties,
+	&node_name_chars, &node_name_format, &unit_address_vs_reg,
+	&property_name_chars, &name_is_string, &name_properties,
 

However, I've moved the new test around in check_table. It's original test placed it next to very basic structural tests, further down with more semantic tests makes more sense.

Signature · 4 lines
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
#5 lore raw

PATCH 2/2 Warn on node name unit-addresses with '0x' or leading 0s

In reply to a message not in the archive

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

---
 checks.c                       | 10 ++++++++++
 tests/run_tests.sh             |  2 ++
 tests/unit-addr-leading-0s.dts | 10 ++++++++++
 tests/unit-addr-leading-0x.dts | 10 ++++++++++
 4 files changed, 32 insertions(+)
 create mode 100644 tests/unit-addr-leading-0s.dts
 create mode 100644 tests/unit-addr-leading-0x.dts
checks.c +10 -0
index 4001b8c..300ab43 100644
@@ -310,6 +310,16 @@ static void check_unit_address_vs_reg(struct check *c, struct node *dt,
 		if (!unitname[0])
 			FAIL(c, "Node %s has a reg or ranges property, but no unit name",
 			    node->fullpath);
+
+		if (strstr(unitname, "0x") == unitname) {
+			FAIL(c, "Node %s unit name should not have leading \"0x\"",
+			    node->fullpath);
+			/* skip over 0x for next test */
+			unitname += 2;
+		}
+		if (unitname[0] == '0' && isxdigit(unitname[1]))
+			FAIL(c, "Node %s unit name should not have leading 0s",
+			    node->fullpath);
 	} else {
 		if (unitname[0])
 			FAIL(c, "Node %s has a unit name, but no reg property",
tests/run_tests.sh +2 -0
index 4b7a131..502caa6 100755
@@ -445,6 +445,8 @@ dtc_tests () {
     check_tests obsolete-chosen-interrupt-controller.dts obsolete_chosen_interrupt_controller
     check_tests reg-without-unit-addr.dts unit_address_vs_reg
     check_tests unit-addr-without-reg.dts unit_address_vs_reg
+    check_tests unit-addr-leading-0x.dts unit_address_vs_reg
+    check_tests unit-addr-leading-0s.dts unit_address_vs_reg
     run_sh_test dtc-checkfails.sh node_name_chars -- -I dtb -O dtb bad_node_char.dtb
     run_sh_test dtc-checkfails.sh node_name_format -- -I dtb -O dtb bad_node_format.dtb
     run_sh_test dtc-checkfails.sh prop_name_chars -- -I dtb -O dtb bad_prop_char.dtb
tests/unit-addr-leading-0s.dts new file +10 -0
new file mode 100644
index 0000000..7c8e2ce
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	node@001 {
+		reg = <1 0>;
+	};
+};
tests/unit-addr-leading-0x.dts new file +10 -0
new file mode 100644
index 0000000..7ed7254
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	node@0x1 {
+		reg = <1 0>;
+	};
+};
Signature · 1 line
2.5.0

A message that is not in the archive (sent off-list or not yet received): 1455223619-16052-3-git-send-email-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org

#7 lore raw

Re: [PATCH 2/2] Warn on node name unit-addresses with '0x' or leading 0s

Quoted 3 lines · Rob Herring

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

Hmm.. I'm pretty sure that's true in practice, but it's not true in theory. A bus could define it's unit address format just about however it wants, including with leading 0s.

I think a better approach would be to add a test specific to simple-bus devices (by looking at compatible on the parent) that fully checks the unit address.

From there we can start adding tests for other bus types.

Quoted 19 lines
---
 checks.c                       | 10 ++++++++++
 tests/run_tests.sh             |  2 ++
 tests/unit-addr-leading-0s.dts | 10 ++++++++++
 tests/unit-addr-leading-0x.dts | 10 ++++++++++
 4 files changed, 32 insertions(+)
 create mode 100644 tests/unit-addr-leading-0s.dts
 create mode 100644 tests/unit-addr-leading-0x.dts
checks.c +0 -0
index 4001b8c..300ab43 100644
@@ -310,6 +310,16 @@ static void check_unit_address_vs_reg(struct check *c, struct node *dt,
 		if (!unitname[0])
 			FAIL(c, "Node %s has a reg or ranges property, but no unit name",
 			    node->fullpath);

checks.c static void check_unit_address_vs_reg(struct check *c, struct node *dt, · line 322

Quoted 10 lines
checks.c +10 -0
+
+		if (strstr(unitname, "0x") == unitname) {
+			FAIL(c, "Node %s unit name should not have leading \"0x\"",
+			    node->fullpath);
+			/* skip over 0x for next test */
+			unitname += 2;
+		}
+		if (unitname[0] == '0' && isxdigit(unitname[1]))
+			FAIL(c, "Node %s unit name should not have leading 0s",
+			    node->fullpath);

I'd also prefer to see these extensions (or ones like them) as separate checjs from the basic "is unit address present" test. Makes the output easier to interpret and allows easier control of which checks are active.

Quoted 48 lines
checks.c +0 -0
 	} else {
 		if (unitname[0])
 			FAIL(c, "Node %s has a unit name, but no reg property",
tests/run_tests.sh +2 -0
index 4b7a131..502caa6 100755
@@ -445,6 +445,8 @@ dtc_tests () {
     check_tests obsolete-chosen-interrupt-controller.dts obsolete_chosen_interrupt_controller
     check_tests reg-without-unit-addr.dts unit_address_vs_reg
     check_tests unit-addr-without-reg.dts unit_address_vs_reg
+    check_tests unit-addr-leading-0x.dts unit_address_vs_reg
+    check_tests unit-addr-leading-0s.dts unit_address_vs_reg
     run_sh_test dtc-checkfails.sh node_name_chars -- -I dtb -O dtb bad_node_char.dtb
     run_sh_test dtc-checkfails.sh node_name_format -- -I dtb -O dtb bad_node_format.dtb
     run_sh_test dtc-checkfails.sh prop_name_chars -- -I dtb -O dtb bad_prop_char.dtb
tests/unit-addr-leading-0s.dts new file +10 -0
new file mode 100644
index 0000000..7c8e2ce
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	node@001 {
+		reg = <1 0>;
+	};
+};
tests/unit-addr-leading-0x.dts new file +10 -0
new file mode 100644
index 0000000..7ed7254
@@ -0,0 +1,10 @@
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	node@0x1 {
+		reg = <1 0>;
+	};
+};
Signature · 4 lines
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

A message that is not in the archive (sent off-list or not yet received): [email protected]

#9 lore raw

Re: [PATCH 2/2] Warn on node name unit-addresses with '0x' or leading 0s

Quoted 8 lines · David Gibson
Quoted 3 lines · Rob Herring

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

Hmm.. I'm pretty sure that's true in practice, but it's not true in theory. A bus could define it's unit address format just about however it wants, including with leading 0s.

Only if it is not reviewed... This whole check is about what best practices are, not what is possible.

Quoted 5 lines

I think a better approach would be to add a test specific to simple-bus devices (by looking at compatible on the parent) that fully checks the unit address.

From there we can start adding tests for other bus types.

simple-bus is easy enough, but then next up would be I2C and SPI. We can't generically tell if a node is on I2C or SPI bus. If we do have some bus with wacky addresses, it should definitely have a bus compatible and then we can simply exclude it from the check.

Another option would be skipping the test if there are any commas (or periods, etc.) in the unit address. That's pretty rare to begin with and a single number is pretty much not a bus specific unit-address.

Rob

A message that is not in the archive (sent off-list or not yet received): CAL_JsqLDdyLd4z_Pmsr7+vtnMZsusEpJYZ4tdZmjQFt0PD_Fbw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#11 lore raw

Re: [PATCH 2/2] Warn on node name unit-addresses with '0x' or leading 0s

Quoted 7 lines · Rob Herring
Quoted 5 lines · David Gibson
Quoted 3 lines · Rob Herring

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

Quoted 6 lines
Quoted 3 lines

Hmm.. I'm pretty sure that's true in practice, but it's not true in theory. A bus could define it's unit address format just about however it wants, including with leading 0s.

Only if it is not reviewed... This whole check is about what best practices are, not what is possible.

Hmm. dtc checks are really about checking for best practice at the level of individual dts files, though, not bindings.

Quoted 7 lines
Quoted 5 lines

I think a better approach would be to add a test specific to simple-bus devices (by looking at compatible on the parent) that fully checks the unit address.

From there we can start adding tests for other bus types.

simple-bus is easy enough,

So, start with that, then tackle the next problem.

Quoted 2 lines

but then next up would be I2C and SPI. We can't generically tell if a node is on I2C or SPI bus.

Why not? Or perhaps.. how generically do you need? I think having a big list of i2c / spi controllers would be acceptable here, if not ideal.

Quoted 7 lines

If we do have
some bus with wacky addresses, it should definitely have a bus compatible and then we can simply exclude it from the check.

Another option would be skipping the test if there are any commas (or periods, etc.) in the unit address. That's pretty rare to begin with and a single number is pretty much not a bus specific unit-address.

Um.. no.. there are definitely bus types that don't typically use commas. ISA, for one.

Signature · 4 lines
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

A message that is not in the archive (sent off-list or not yet received): [email protected]

#13 lore raw

Re: [PATCH 2/2] Warn on node name unit-addresses with '0x' or leading 0s

Quoted 12 lines · David Gibson
Quoted 11 lines · Rob Herring
Quoted 8 lines · David Gibson
Quoted 3 lines · Rob Herring

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

Hmm.. I'm pretty sure that's true in practice, but it's not true in theory. A bus could define it's unit address format just about however it wants, including with leading 0s.

Quoted 5 lines
Quoted 2 lines

Only if it is not reviewed... This whole check is about what best practices are, not what is possible.

Hmm. dtc checks are really about checking for best practice at the level of individual dts files, though, not bindings.

Checking simple-bus specifically would be checking a binding.

Quoted 8 lines
Quoted 7 lines
Quoted 5 lines

I think a better approach would be to add a test specific to simple-bus devices (by looking at compatible on the parent) that fully checks the unit address.

From there we can start adding tests for other bus types.

simple-bus is easy enough,

Quoted 8 lines

So, start with that, then tackle the next problem.

Quoted 2 lines

but then next up would be I2C and SPI. We can't generically tell if a node is on I2C or SPI bus.

Why not? Or perhaps.. how generically do you need? I think having a big list of i2c / spi controllers would be acceptable here, if not ideal.

So someone adds a new controller, puts crap in for unit addresses, and then no warnings until that compatible string is added to dtc. And I'm still left spending my time in reviews telling them to fix this trivial crap.

That's roughly 60 I2C controllers (families, so multiple compatible strings each) plus similar number of SPI controllers, OF-graph binding, and random other things where reg gets used.

Quoted 11 lines
Quoted 8 lines

If we do have
some bus with wacky addresses, it should definitely have a bus compatible and then we can simply exclude it from the check.

Another option would be skipping the test if there are any commas (or periods, etc.) in the unit address. That's pretty rare to begin with and a single number is pretty much not a bus specific unit-address.

Um.. no.. there are definitely bus types that don't typically use commas. ISA, for one.

All the cases of ISA in the kernel tree at least would pass this test. But we could either blacklist ISA or skip if any non-hex characters are present.

BTW, my next patch is stricter node and property name checks on the use of '#', '?', '.', '+', '*', and '_'. So if you don't think these kinds to checks belong in dtc, then tell me and suggest how we should check for this.

Rob

A message that is not in the archive (sent off-list or not yet received): CAL_Jsq+Nr6uzA0xzc=zKG4diZwDrgsbLAKDb80m6ZSq2NXcGgA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org

#15 lore raw

Re: [PATCH 2/2] Warn on node name unit-addresses with '0x' or leading 0s

Quoted 14 lines · Rob Herring
Quoted 12 lines · David Gibson
Quoted 11 lines · Rob Herring
Quoted 8 lines · David Gibson
Quoted 3 lines · Rob Herring

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

Hmm.. I'm pretty sure that's true in practice, but it's not true in theory. A bus could define it's unit address format just about however it wants, including with leading 0s.

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

Only if it is not reviewed... This whole check is about what best practices are, not what is possible.

Hmm. dtc checks are really about checking for best practice at the level of individual dts files, though, not bindings.

Checking simple-bus specifically would be checking a binding.

Sorry, I wasn't clear. dtc checking the dts against a binding is fine, but checking the sanity of the binding itself is beyond its scope.

Quoted 17 lines
Quoted 8 lines
Quoted 7 lines
Quoted 5 lines

I think a better approach would be to add a test specific to simple-bus devices (by looking at compatible on the parent) that fully checks the unit address.

From there we can start adding tests for other bus types.

simple-bus is easy enough,

Quoted 8 lines

So, start with that, then tackle the next problem.

Quoted 2 lines

but then next up would be I2C and SPI. We can't generically tell if a node is on I2C or SPI bus.

Why not? Or perhaps.. how generically do you need? I think having a big list of i2c / spi controllers would be acceptable here, if not ideal.

Quoted 8 lines

So someone adds a new controller, puts crap in for unit addresses, and then no warnings until that compatible string is added to dtc. And I'm still left spending my time in reviews telling them to fix this trivial crap.

That's roughly 60 I2C controllers (families, so multiple compatible strings each) plus similar number of SPI controllers, OF-graph binding, and random other things where reg gets used.

Ah, I see.

Ok, I guess we do need to have an option for a "fallback" scheme for unit addresses (i.e. hex) for bus types we don't specifically recognize. But I'd still like the logic to be:
if (known bus type)
check against format for this bus type
else
check against fallback format

Rather than putting the second test in with a hacked up set of exclusions.

To do this nicely, I think the best way will be to add a bus_type field to the node structure in dtc, and have it populated (with an option for "unknown") in an early check pass, that later unit address tests can references as a prereq.

Pointer to a struct with unit address formatting functions, with NULL for unknown is the obvious choice to me for bus_type.

Quoted 11 lines
Quoted 10 lines
Quoted 7 lines

If we do have
some bus with wacky addresses, it should definitely have a bus compatible and then we can simply exclude it from the check.

Another option would be skipping the test if there are any commas (or periods, etc.) in the unit address. That's pretty rare to begin with and a single number is pretty much not a bus specific unit-address.

Um.. no.. there are definitely bus types that don't typically use commas. ISA, for one.

Quoted 8 lines

All the cases of ISA in the kernel tree at least would pass this test. But we could either blacklist ISA or skip if any non-hex characters are present.

BTW, my next patch is stricter node and property name checks on the use of '#', '?', '.', '+', '*', and '_'. So if you don't think these kinds to checks belong in dtc, then tell me and suggest how we should check for this.

That sounds reasonable on the face of it.

Signature · 4 lines
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

A message that is not in the archive (sent off-list or not yet received): [email protected]

#17 lore raw

Re: [PATCH 2/2] Warn on node name unit-addresses with '0x' or leading 0s

Quoted 63 lines · David Gibson
Quoted 14 lines · Rob Herring
Quoted 12 lines · David Gibson
Quoted 11 lines · Rob Herring
Quoted 8 lines · David Gibson
Quoted 3 lines · Rob Herring

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

Hmm.. I'm pretty sure that's true in practice, but it's not true in theory. A bus could define it's unit address format just about however it wants, including with leading 0s.

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

Only if it is not reviewed... This whole check is about what best practices are, not what is possible.

Hmm. dtc checks are really about checking for best practice at the level of individual dts files, though, not bindings.

Checking simple-bus specifically would be checking a binding.

Sorry, I wasn't clear. dtc checking the dts against a binding is fine, but checking the sanity of the binding itself is beyond its scope.

Quoted 17 lines
Quoted 8 lines
Quoted 7 lines
Quoted 5 lines

I think a better approach would be to add a test specific to simple-bus devices (by looking at compatible on the parent) that fully checks the unit address.

From there we can start adding tests for other bus types.

simple-bus is easy enough,

Quoted 8 lines

So, start with that, then tackle the next problem.

Quoted 2 lines

but then next up would be I2C and SPI. We can't generically tell if a node is on I2C or SPI bus.

Why not? Or perhaps.. how generically do you need? I think having a big list of i2c / spi controllers would be acceptable here, if not ideal.

Quoted 8 lines

So someone adds a new controller, puts crap in for unit addresses, and then no warnings until that compatible string is added to dtc. And I'm still left spending my time in reviews telling them to fix this trivial crap.

That's roughly 60 I2C controllers (families, so multiple compatible strings each) plus similar number of SPI controllers, OF-graph binding, and random other things where reg gets used.

Ah, I see.

Ok, I guess we do need to have an option for a "fallback" scheme for unit addresses (i.e. hex) for bus types we don't specifically recognize. But I'd still like the logic to be:
if (known bus type)
check against format for this bus type
else
check against fallback format

Quoted 2 lines

Rather than putting the second test in with a hacked up set of exclusions.

Okay, makes sense.

Do you think we still need simple-bus as an explicit type given the check is the same as the default? Might be useful to have if we want to add some checks that address translations work.

Quoted 7 lines

To do this nicely, I think the best way will be to add a bus_type field to the node structure in dtc, and have it populated (with an option for "unknown") in an early check pass, that later unit address tests can references as a prereq.

Pointer to a struct with unit address formatting functions, with NULL for unknown is the obvious choice to me for bus_type.

So, something like this for the first stage:

static bool pci_bus_check_is_type(struct node *node)

{
	struct property *prop;
	
	if (!node || !node->parent)
		return false;

	prop = get_property(node->parent, "device_type");
	if (!prop)
		return false;
		
	if (strcmp(prop->val, "pci") == 0)
		return true;
		
	return false;
}

static void pci_bus_check_unit_address()
{

}

struct bus_type_fns {
.check_is_type = pci_bus_check_is_type, .check_unit_address = pci_bus_check_unit_address,
} pci_bus_fns;

struct bus_type_fns * {
	&pci_bus_fns,
	NULL
} bus_types;

static void fixup_bus_type(struct check *c, struct node *root,
struct node *node)

{
	struct bus_type_fns **bus;
	
	for (bus = bus_types; *bus != NULL; bus++) {
		if (!(*bus)->check_is_type(node))
			continue;

		node->bus_type = *bus;
		break;
	}
}

ERROR(bus_type, NULL, NULL, fixup_bus_type, NULL, NULL);

Rob
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

#18 lore raw

Re: [PATCH 2/2] Warn on node name unit-addresses with '0x' or leading 0s

Quoted 64 lines · Rob Herring
Quoted 63 lines · David Gibson
Quoted 14 lines · Rob Herring
Quoted 12 lines · David Gibson
Quoted 11 lines · Rob Herring
Quoted 8 lines · David Gibson
Quoted 3 lines · Rob Herring

Node name unit-addresses should never begin with 0x or leading 0s regardless of whether they have a bus specific address (i.e. one with commas) or not. Add warnings to check for these cases.

Hmm.. I'm pretty sure that's true in practice, but it's not true in theory. A bus could define it's unit address format just about however it wants, including with leading 0s.

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

Only if it is not reviewed... This whole check is about what best practices are, not what is possible.

Hmm. dtc checks are really about checking for best practice at the level of individual dts files, though, not bindings.

Checking simple-bus specifically would be checking a binding.

Sorry, I wasn't clear. dtc checking the dts against a binding is fine, but checking the sanity of the binding itself is beyond its scope.

Quoted 17 lines
Quoted 8 lines
Quoted 7 lines
Quoted 5 lines

I think a better approach would be to add a test specific to simple-bus devices (by looking at compatible on the parent) that fully checks the unit address.

From there we can start adding tests for other bus types.

simple-bus is easy enough,

Quoted 8 lines

So, start with that, then tackle the next problem.

Quoted 2 lines

but then next up would be I2C and SPI. We can't generically tell if a node is on I2C or SPI bus.

Why not? Or perhaps.. how generically do you need? I think having a big list of i2c / spi controllers would be acceptable here, if not ideal.

Quoted 8 lines

So someone adds a new controller, puts crap in for unit addresses, and then no warnings until that compatible string is added to dtc. And I'm still left spending my time in reviews telling them to fix this trivial crap.

That's roughly 60 I2C controllers (families, so multiple compatible strings each) plus similar number of SPI controllers, OF-graph binding, and random other things where reg gets used.

Ah, I see.

Ok, I guess we do need to have an option for a "fallback" scheme for unit addresses (i.e. hex) for bus types we don't specifically recognize. But I'd still like the logic to be:
if (known bus type)
check against format for this bus type
else
check against fallback format

Quoted 8 lines
Quoted 2 lines

Rather than putting the second test in with a hacked up set of exclusions.

Okay, makes sense.

Do you think we still need simple-bus as an explicit type given the check is the same as the default? Might be useful to have if we want to add some checks that address translations work.

So they should be able to have common code to actually do the check / formatting, but yes, I'd like an explicit check for simple-bus as well.

Quoted 55 lines
Quoted 7 lines

To do this nicely, I think the best way will be to add a bus_type field to the node structure in dtc, and have it populated (with an option for "unknown") in an early check pass, that later unit address tests can references as a prereq.

Pointer to a struct with unit address formatting functions, with NULL for unknown is the obvious choice to me for bus_type.

So, something like this for the first stage:

static bool pci_bus_check_is_type(struct node *node)

{
	struct property *prop;
	
	if (!node || !node->parent)
		return false;

	prop = get_property(node->parent, "device_type");
	if (!prop)
		return false;
		
	if (strcmp(prop->val, "pci") == 0)
		return true;
		
	return false;
}

static void pci_bus_check_unit_address()
{

}

struct bus_type_fns {
.check_is_type = pci_bus_check_is_type, .check_unit_address = pci_bus_check_unit_address,
} pci_bus_fns;

struct bus_type_fns * {
	&pci_bus_fns,
	NULL
} bus_types;

static void fixup_bus_type(struct check *c, struct node *root,
struct node *node)

{
	struct bus_type_fns **bus;
	
	for (bus = bus_types; *bus != NULL; bus++) {
		if (!(*bus)->check_is_type(node))
			continue;

		node->bus_type = *bus;
		break;
	}
}
Quoted 1 line

ERROR(bus_type, NULL, NULL, fixup_bus_type, NULL, NULL);

Uh.. close-ish, but I think we can a bit better. This approach means the checks won't happen if someone forgets the device_type. So, I think it's preferable to determine bus types (where we can) for the bus parent node, rather than the child nodes; then make the checks on the child nodes based on the bus_type of the parent. So maybe something like

struct bus_type {
.expected_addr_cells = 3,
.expected_size_cells = 2,
.is_type = is_pci_bridge,
.check_unit_addr = pci_unit_addr,
} pci_bus_type;

struct bus_type {
	.expected_addr_cells = -1, /* For don't care */
	.expected_size_cells = -1,
	.is_type = is_simple_bridge,
	.check_unit_addr = default_unit_addr,
} simple_bus_type;

Checking the addr and size cells here means you can make the unit address checker have the "reg" format checker as a prereq, so you don't have to worry about badly constructed "reg" properties in the unit address format function.

static void check_unit_address_format(struct check *c,
struct node *dt, struct node *node)

{
	struct bus_type *bt;
	char expected
	
	if (!node->parent)
		return;
	bt = node->parent->bus_type;
	if (!bt)
		bt = default_bus_type;

	bt->check_unit_addr(c, dt, node);
}
Signature · 4 lines
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