* [PATCH 1/2] dtc: add ability to make nodes conditional on them being referenced
@ 2018-02-03 9:14 Maxime Ripard
[not found] ` <20180203091432.19463-1-maxime.ripard-LDxbnhwyfcJBDgjK7y7TUQ@public.gmane.org>
0 siblings, 1 reply; 2+ messages in thread
From: Maxime Ripard @ 2018-02-03 9:14 UTC (permalink / raw)
To: David Gibson
Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA, Heiko Stübner,
Heiko Stuebner, Maxime Ripard
From: Heiko Stuebner <heiko.stuebner-K3U4GQvHnyU@public.gmane.org>
On i.MX, which carries a lot of pin-groups of which most are unused on
individual boards, they noticed that this plethora of nodes also results
in the runtime-lookup-performance also degrading [0].
A i.MX-specific solution defining the pingroups in the board files but
using macros to reference the pingroup-data was not well received.
This patch is trying to solve this issue in a more general way, by
adding the ability to mark nodes as needing to be referenced somewhere
in the tree.
To mark a node a needing to be referenced it must be prefixed with
/delete-if-unreferenced/. This makes dtc check the nodes reference-status
when creating the flattened tree, dropping it if unreferenced.
For example, the i.MX6SL pingroup
/delete-if-unreferenced/ pinctrl_ecspi1_1: ecspi1grp-1 {
fsl,pins = <
MX6SL_PAD_ECSPI1_MISO__ECSPI1_MISO 0x100b1
MX6SL_PAD_ECSPI1_MOSI__ECSPI1_MOSI 0x100b1
MX6SL_PAD_ECSPI1_SCLK__ECSPI1_SCLK 0x100b1
>;
};
would only be included in the dtb if it got referenced somewhere
as pingroup via
node {
pinctrl-0 <&pinctrl_ecscpi1_1>;
};
[0] http://thread.gmane.org/gmane.linux.ports.arm.kernel/275912/
Signed-off-by: Heiko Stuebner <heiko.stuebner-K3U4GQvHnyU@public.gmane.org>
Signed-off-by: Maxime Ripard <maxime.ripard-LDxbnhwyfcJBDgjK7y7TUQ@public.gmane.org>
---
Hi,
This is a respin of the patch previously sent by Heiko here:
https://patchwork.kernel.org/patch/3840371/
With hopefully all your comments addressed.
Let me know what you think,
Maxime
checks.c | 2 ++
dtc-lexer.l | 7 +++++++
dtc-parser.y | 5 +++++
dtc.h | 4 ++++
flattree.c | 3 +++
livetree.c | 14 ++++++++++++++
6 files changed, 35 insertions(+)
diff --git a/checks.c b/checks.c
index 1cded3658491..a1e0ad91b083 100644
--- a/checks.c
+++ b/checks.c
@@ -571,6 +571,8 @@ static void fixup_phandle_references(struct check *c, struct dt_info *dti,
phandle = get_node_phandle(dt, refnode);
*((fdt32_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
+
+ reference_node(refnode);
}
}
}
diff --git a/dtc-lexer.l b/dtc-lexer.l
index fd825ebba69c..2afde3acad8a 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -153,6 +153,13 @@ static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
return DT_DEL_NODE;
}
+<*>"/delete-if-unreferenced/" {
+ DPRINT("Keyword: /delete-if-unreferenced/\n");
+ DPRINT("<PROPNODENAME>\n");
+ BEGIN(PROPNODENAME);
+ return DT_DEL_UNREFERENCED;
+ }
+
<*>{LABEL}: {
DPRINT("Label: %s\n", yytext);
yylval.labelref = xstrdup(yytext);
diff --git a/dtc-parser.y b/dtc-parser.y
index 44af170abfea..55c951c5327f 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -63,6 +63,7 @@ extern bool treesource_error;
%token DT_BITS
%token DT_DEL_PROP
%token DT_DEL_NODE
+%token DT_DEL_UNREFERENCED
%token <propnodename> DT_PROPNODENAME
%token <integer> DT_LITERAL
%token <integer> DT_CHAR_LITERAL
@@ -523,6 +524,10 @@ subnode:
{
$$ = name_node(build_node_delete(), $2);
}
+ | DT_DEL_UNREFERENCED subnode
+ {
+ $$ = mark_node_needs_reference($2);
+ }
| DT_LABEL subnode
{
add_label(&$2->labels, $1);
diff --git a/dtc.h b/dtc.h
index 3b18a42b866e..cb7e3752af5a 100644
--- a/dtc.h
+++ b/dtc.h
@@ -168,6 +168,8 @@ struct node {
struct label *labels;
const struct bus_type *bus;
+
+ int needs_reference, is_referenced;
};
#define for_each_label_withdel(l0, l) \
@@ -202,6 +204,8 @@ struct property *reverse_properties(struct property *first);
struct node *build_node(struct property *proplist, struct node *children);
struct node *build_node_delete(void);
struct node *name_node(struct node *node, char *name);
+struct node *mark_node_needs_reference(struct node *node);
+struct node *reference_node(struct node *node);
struct node *chain_node(struct node *first, struct node *list);
struct node *merge_nodes(struct node *old_node, struct node *new_node);
struct node *add_orphan_node(struct node *old_node, struct node *new_node, char *ref);
diff --git a/flattree.c b/flattree.c
index 8d268fb785db..39eb9934457b 100644
--- a/flattree.c
+++ b/flattree.c
@@ -258,6 +258,9 @@ static void flatten_tree(struct node *tree, struct emitter *emit,
if (tree->deleted)
return;
+ if (tree->needs_reference && !tree->is_referenced)
+ return;
+
emit->beginnode(etarget, tree->labels);
if (vi->flags & FTF_FULLPATH)
diff --git a/livetree.c b/livetree.c
index 57b7db2ed153..4b595c4b5e0a 100644
--- a/livetree.c
+++ b/livetree.c
@@ -134,6 +134,20 @@ struct node *name_node(struct node *node, char *name)
return node;
}
+struct node *mark_node_needs_reference(struct node *node)
+{
+ node->needs_reference = 1;
+
+ return node;
+}
+
+struct node *reference_node(struct node *node)
+{
+ node->is_referenced = 1;
+
+ return node;
+}
+
struct node *merge_nodes(struct node *old_node, struct node *new_node)
{
struct property *new_prop, *old_prop;
--
2.14.3
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH 2/2] tests: Add a test case for the delete-if-unreferenced keyword
[not found] ` <20180203091432.19463-1-maxime.ripard-LDxbnhwyfcJBDgjK7y7TUQ@public.gmane.org>
@ 2018-02-03 9:14 ` Maxime Ripard
0 siblings, 0 replies; 2+ messages in thread
From: Maxime Ripard @ 2018-02-03 9:14 UTC (permalink / raw)
To: David Gibson
Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA, Heiko Stübner,
Maxime Ripard
The newly introduced /delete-if-unreferenced/ needs a few test cases, make
sure to test them.
Signed-off-by: Maxime Ripard <maxime.ripard-LDxbnhwyfcJBDgjK7y7TUQ@public.gmane.org>
---
tests/delete-unreferenced.dts | 15 +++++++++++++++
tests/run_tests.sh | 5 +++++
2 files changed, 20 insertions(+)
create mode 100644 tests/delete-unreferenced.dts
diff --git a/tests/delete-unreferenced.dts b/tests/delete-unreferenced.dts
new file mode 100644
index 000000000000..f119eec6a65d
--- /dev/null
+++ b/tests/delete-unreferenced.dts
@@ -0,0 +1,15 @@
+/dts-v1/;
+
+/ {
+ /delete-if-unreferenced/ node1: node1 {
+ bar = <0xdeadbeef>;
+ };
+
+ /delete-if-unreferenced/ node2: node2 {
+ foo = <0x42>;
+ };
+
+ node3: node3 {
+ test = <&node2>;
+ };
+};
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 0d30edfc0bc4..f0941c7757f4 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -543,6 +543,11 @@ dtc_tests () {
run_dtc_test -I dts -O dtb -o dtc_tree1_delete.test.dtb test_tree1_delete.dts
tree1_tests dtc_tree1_delete.test.dtb
+ # Check delete-if-unreferenced functionality
+ run_dtc_test -I dts -O dtb -o delete-unreferenced.test.dtb delete-unreferenced.dts
+ run_test check_path delete-unreferenced.test.dtb not-exists "/node1"
+ run_test check_path delete-unreferenced.test.dtb exists "/node2"
+
run_dtc_test -I dts -O dts -o delete_reinstate_multilabel.dts.test.dts delete_reinstate_multilabel.dts
run_wrap_test cmp delete_reinstate_multilabel.dts.test.dts delete_reinstate_multilabel_ref.dts
--
2.14.3
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-02-03 9:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-03 9:14 [PATCH 1/2] dtc: add ability to make nodes conditional on them being referenced Maxime Ripard
[not found] ` <20180203091432.19463-1-maxime.ripard-LDxbnhwyfcJBDgjK7y7TUQ@public.gmane.org>
2018-02-03 9:14 ` [PATCH 2/2] tests: Add a test case for the delete-if-unreferenced keyword Maxime Ripard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).