From: Alexander Holler <holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
To: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: Jon Loeliger <jdl-CYoMK+44s/E@public.gmane.org>,
Alexander Holler <holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
Subject: [PATCH 2/3] deps: Add option to print initialization order
Date: Tue, 13 May 2014 10:54:02 +0200 [thread overview]
Message-ID: <1399971243-18153-3-git-send-email-holler@ahsoftware.de> (raw)
In-Reply-To: <1399971243-18153-1-git-send-email-holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
Add option -t to print the default initialization order.
No other output will be generated.
To print the order, just use something like this:
CROSS_COMPILE=gcc-foo ARCH=arm make foo.dtb
scripts/dtc/dtc -I dtb -t arch/arm/boot/dts/foo.dtb
Since it's now possible to check to for cycles in the dependency graph,
this is now done too.
Signed-off-by: Alexander Holler <holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
---
dependencies.c | 346 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
dtc.c | 24 +++-
dtc.h | 2 +
3 files changed, 371 insertions(+), 1 deletion(-)
diff --git a/dependencies.c b/dependencies.c
index dd4658c..8fe1a8c 100644
--- a/dependencies.c
+++ b/dependencies.c
@@ -106,3 +106,349 @@ void add_dependencies(struct boot_info *bi)
{
process_nodes_props(bi->dt, bi->dt);
}
+
+/*
+ * The code below is in large parts a copy of drivers/of/of_dependencies.c
+ * in the Linux kernel. So both files do share the same bugs.
+ * The next few ugly defines do exist to keep the differences at a minimum.
+ */
+static struct node *tree;
+#define pr_cont(format, ...) printf(format, ##__VA_ARGS__)
+#define pr_info(format, ...) printf(format, ##__VA_ARGS__)
+#define pr_warn(format, ...) printf(format, ##__VA_ARGS__)
+#define pr_err(format, ...) fprintf(stderr, format, ##__VA_ARGS__)
+typedef cell_t __be32;
+#define device_node node
+#define full_name fullpath
+#define __initdata
+#define __init
+#define unlikely(a) (a)
+#define of_node_put(a)
+#define of_find_node_by_phandle(v) get_node_by_phandle(tree, v)
+#define __of_get_property(a, b, c) get_property(a, b)
+#define for_each_child_of_node(a, b) for_each_child(a, b)
+
+
+#define MAX_DT_NODES 1000 /* maximum number of vertices */
+#define MAX_EDGES (MAX_DT_NODES*2) /* maximum number of edges (dependencies) */
+
+struct edgenode {
+ uint32_t y; /* phandle */
+ struct edgenode *next; /* next edge in list */
+};
+
+/*
+ * Vertex numbers do correspond to phandle numbers. That means the graph
+ * does contain as much vertices as the maximum of all phandles.
+ * Or in other words, we assume that for all phandles in the device tree
+ * 0 < phandle < MAX_DT_NODES+1 is true.
+ */
+struct dep_graph {
+ struct edgenode edge_slots[MAX_EDGES]; /* used to avoid kmalloc */
+ struct edgenode *edges[MAX_DT_NODES+1]; /* adjacency info */
+ unsigned nvertices; /* number of vertices in graph */
+ unsigned nedges; /* number of edges in graph */
+ bool processed[MAX_DT_NODES+1]; /* which vertices have been processed */
+ bool include_node[MAX_DT_NODES+1]; /* which nodes to consider */
+ bool discovered[MAX_DT_NODES+1]; /* which vertices have been found */
+ bool finished; /* if true, cut off search immediately */
+};
+static struct dep_graph graph __initdata;
+
+struct init_order {
+ uint32_t max_phandle; /* the max used phandle */
+ uint32_t old_max_phandle; /* used to keep track of added phandles */
+ struct device_node *order[MAX_DT_NODES+1];
+ unsigned count;
+ /* Used to keep track of parent devices in regard to the DT */
+ uint32_t parent_by_phandle[MAX_DT_NODES+1];
+ struct device *device_by_phandle[MAX_DT_NODES+1];
+};
+static struct init_order order __initdata;
+
+
+/* Copied from drivers/of/base.c (because it's lockless). */
+static int __init __of_device_is_available(struct device_node *device)
+{
+ struct property *status;
+
+ if (!device)
+ return 0;
+
+ status = get_property(device, "status");
+ if (status == NULL)
+ return 1;
+
+ if (status->val.len > 0) {
+ if (!strcmp(status->val.val, "okay") ||
+ !strcmp(status->val.val, "ok"))
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * x is a dependant of y or in other words
+ * y will be initialized before x.
+ */
+static int __init insert_edge(uint32_t x, uint32_t y)
+{
+ struct edgenode *p; /* temporary pointer */
+
+ if (unlikely(x > MAX_DT_NODES || y > MAX_DT_NODES)) {
+ pr_err("Node found with phandle 0x%x > MAX_DT_NODES (%d)!\n",
+ x > MAX_DT_NODES ? x : y, MAX_DT_NODES);
+ return -EINVAL;
+ }
+ if (unlikely(!x || !y))
+ return 0;
+ if (unlikely(graph.nedges >= MAX_EDGES)) {
+ pr_err("Maximum number of edges (%d) reached!\n", MAX_EDGES);
+ return -EINVAL;
+ }
+ p = &graph.edge_slots[graph.nedges++];
+ graph.include_node[x] = 1;
+ graph.include_node[y] = 1;
+ p->y = y;
+ p->next = graph.edges[x];
+ graph.edges[x] = p; /* insert at head of list */
+
+ graph.nvertices = (x > graph.nvertices) ? x : graph.nvertices;
+ graph.nvertices = (y > graph.nvertices) ? y : graph.nvertices;
+ return 0;
+}
+
+static void __init print_node_name(uint32_t v)
+{
+ struct device_node *node;
+
+ node = of_find_node_by_phandle(v);
+ if (!node) {
+ pr_err("Node for phandle 0x%x not found", v);
+ return;
+ }
+ if (node->name)
+ pr_err("%s", node->name);
+ if (node->full_name)
+ pr_err(" (%s)", node->full_name);
+ of_node_put(node);
+}
+
+/*
+ * I would prefer to use the BGL (Boost Graph Library), but as I can't use it
+ * here (for obvious reasons), the next four functions below are based on
+ * code of Steven Skiena's book 'The Algorithm Design Manual'.
+ */
+
+static void __init process_edge(uint32_t x, uint32_t y)
+{
+ if (unlikely(graph.discovered[y] && !graph.processed[y])) {
+ pr_err("Cycle found 0x%x ", x);
+ print_node_name(x);
+ pr_cont(" <-> 0x%x ", y);
+ print_node_name(y);
+ pr_cont("!\n");
+ graph.finished = 1;
+ }
+}
+
+static void __init process_vertex_late(uint32_t v)
+{
+ struct device_node *node;
+
+ node = of_find_node_by_phandle(v);
+ if (!node) {
+ pr_err("No node for phandle 0x%x not found", v);
+ return;
+ }
+ order.order[order.count++] = node;
+}
+
+static void __init depth_first_search(uint32_t v)
+{
+ struct edgenode *p;
+ uint32_t y; /* successor vertex */
+
+ if (graph.finished)
+ return;
+ graph.discovered[v] = 1;
+ p = graph.edges[v];
+ while (p) {
+ y = p->y;
+ if (!graph.discovered[y]) {
+ process_edge(v, y);
+ depth_first_search(y);
+ } else
+ process_edge(v, y);
+ if (graph.finished)
+ return;
+ p = p->next;
+ }
+ process_vertex_late(v);
+ graph.processed[v] = 1;
+}
+
+static void __init topological_sort(void)
+{
+ unsigned i;
+
+ for (i = 1; i <= graph.nvertices; ++i)
+ if (!graph.discovered[i] && graph.include_node[i])
+ depth_first_search(i);
+}
+
+static int __init add_dep_list(struct device_node *node)
+{
+ const __be32 *list, *list_end;
+ uint32_t ph;
+ struct property *prop;
+ int rc = 0;
+ struct device_node *dep;
+
+ prop = get_property(node, "dependencies");
+ if (!prop || !prop->val.len || prop->val.len%sizeof(*list))
+ return 0;
+ list = (const __be32 *)prop->val.val;
+ list_end = list + prop->val.len / sizeof(*list);
+ while (list < list_end) {
+ ph = fdt32_to_cpu(*list++);
+ if (unlikely(!ph)) {
+ /* Should never happen */
+ if (node->name)
+ pr_warn("phandle == 0 for %s\n", node->name);
+ continue;
+ }
+ dep = of_find_node_by_phandle(ph);
+ if (unlikely(!dep)) {
+ pr_err("No DT node for dependency with phandle 0x%x found\n",
+ ph);
+ continue;
+ }
+ rc = insert_edge(node->phandle, ph);
+ if (rc)
+ break;
+ }
+
+ return rc;
+}
+
+/* Copied from drivers/of/base.c */
+static const char *of_prop_next_string(struct property *prop, const char *cur)
+{
+ const char *curv = cur;
+
+ if (!prop)
+ return NULL;
+
+ if (!cur)
+ return prop->val.val;
+
+ curv += strlen(cur) + 1;
+ if (curv >= prop->val.val + prop->val.len)
+ return NULL;
+
+ return curv;
+}
+
+static int __init add_deps_lnx(struct device_node *parent,
+ struct device_node *node)
+{
+ struct device_node *child;
+ int rc = 0;
+
+ if (!__of_device_is_available(node))
+ return 0;
+ if (__of_get_property(node, "compatible", NULL)) {
+ if (!parent->phandle) {
+ if (__of_get_property(parent, "compatible", NULL))
+ parent->phandle = 1 + order.max_phandle++;
+ }
+ if (!node->phandle)
+ node->phandle = 1 + order.max_phandle++;
+ rc = insert_edge(node->phandle, parent->phandle);
+ if (rc)
+ return rc;
+ if (unlikely(order.parent_by_phandle[node->phandle])) {
+ /* sanity check */
+ pr_err("0x%x already has a parent!\n", node->phandle);
+ return -EINVAL;
+ }
+ order.parent_by_phandle[node->phandle] = parent->phandle;
+ rc = add_dep_list(node);
+ if (unlikely(rc))
+ return rc;
+ parent = node; /* change the parent only if node is a driver */
+ }
+ for_each_child_of_node(node, child) {
+ rc = add_deps_lnx(parent, child);
+ if (unlikely(rc))
+ break;
+ }
+
+ return rc;
+}
+
+static void calc_max_phandle(struct node *np)
+{
+ struct node *child;
+
+ if (!np || np->deleted)
+ return;
+ if (np->phandle > order.max_phandle)
+ order.max_phandle = np->phandle;
+
+ for_each_child(np, child)
+ calc_max_phandle(child);
+
+ return;
+}
+
+void __init of_init_print_order(const char *name)
+{
+ unsigned i;
+ struct property *prop;
+ const char *cp;
+
+ pr_info("Default initialization order for %s:\n", name);
+ for (i = 0; i < order.count; ++i) {
+ pr_info("init %u 0x%x", i, order.order[i]->phandle);
+ if (order.order[i]->name)
+ pr_cont(" %s", order.order[i]->name);
+ if (order.order[i]->full_name)
+ pr_cont(" (%s)", order.order[i]->full_name);
+ prop = get_property(order.order[i], "compatible");
+ for (cp = of_prop_next_string(prop, NULL); cp;
+ cp = of_prop_next_string(prop, cp))
+ pr_cont(" %s", cp);
+ pr_cont(" (parent 0x%x)\n",
+ order.parent_by_phandle[order.order[i]->phandle]);
+ }
+}
+
+int __init of_init_build_order(struct device_node *root)
+{
+ struct device_node *child;
+ int rc = 0;
+
+ tree = root;
+ if (unlikely(!root))
+ return -EINVAL;
+
+ calc_max_phandle(root);
+ order.old_max_phandle = order.max_phandle;
+
+ for_each_child_of_node(root, child) {
+ rc = add_deps_lnx(root, child);
+ if (unlikely(rc))
+ break;
+ }
+
+ of_node_put(root);
+ topological_sort();
+
+ if (graph.finished)
+ return -EINVAL; /* cycle found */
+
+ return rc;
+}
diff --git a/dtc.c b/dtc.c
index c0647da..c732bca 100644
--- a/dtc.c
+++ b/dtc.c
@@ -49,7 +49,7 @@ static void fill_fullpaths(struct node *tree, const char *prefix)
/* Usage related data. */
static const char usage_synopsis[] = "dtc [options] <input file>";
-static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sDW:E:hv";
+static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sDtW:E:hv";
static struct option const usage_long_opts[] = {
{"quiet", no_argument, NULL, 'q'},
{"in-format", a_argument, NULL, 'I'},
@@ -65,6 +65,7 @@ static struct option const usage_long_opts[] = {
{"include", a_argument, NULL, 'i'},
{"sort", no_argument, NULL, 's'},
{"no-dependencies", no_argument, NULL, 'D'},
+ {"print-init-order", no_argument, NULL, 't'},
{"phandle", a_argument, NULL, 'H'},
{"warning", a_argument, NULL, 'W'},
{"error", a_argument, NULL, 'E'},
@@ -93,6 +94,7 @@ static const char * const usage_opts_help[] = {
"\n\tAdd a path to search for include files",
"\n\tSort nodes and properties before outputting (useful for comparing trees)",
"\n\tDo not automatically add dependencies for phandle references",
+ "\n\tPrint (default) initialization order",
"\n\tValid phandle formats are:\n"
"\t\tlegacy - \"linux,phandle\" properties only\n"
"\t\tepapr - \"phandle\" properties only\n"
@@ -113,6 +115,7 @@ int main(int argc, char *argv[])
const char *depname = NULL;
bool force = false, sort = false;
bool dependencies = true;
+ bool init_order = false;
const char *arg;
int opt;
FILE *outf = NULL;
@@ -184,6 +187,10 @@ int main(int argc, char *argv[])
dependencies = false;
break;
+ case 't':
+ init_order = true;
+ break;
+
case 'W':
parse_checks_option(true, false, optarg);
break;
@@ -244,6 +251,13 @@ int main(int argc, char *argv[])
if (dependencies)
add_dependencies(bi);
+ if (init_order) {
+ if (of_init_build_order(bi->dt))
+ exit(2);
+ of_init_print_order(arg);
+ exit(0);
+ }
+
if (streq(outname, "-")) {
outf = stdout;
} else {
@@ -265,5 +279,13 @@ int main(int argc, char *argv[])
die("Unknown output format \"%s\"\n", outform);
}
+ /*
+ * Check for cycles by building the initialzation order.
+ * This is done after the output was saved because it
+ * changes the tree slightly.
+ */
+ if (of_init_build_order(bi->dt))
+ exit(2);
+
exit(0);
}
diff --git a/dtc.h b/dtc.h
index fa84017..e4097d4 100644
--- a/dtc.h
+++ b/dtc.h
@@ -268,5 +268,7 @@ struct boot_info *dt_from_fs(const char *dirname);
/* Dependencies */
void add_dependencies(struct boot_info *bi);
+void of_init_print_order(const char *name);
+int of_init_build_order(struct node *root);
#endif /* _DTC_H */
--
1.8.3.2
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-05-13 8:54 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-12 16:47 [RFC PATCH 0/9] dt: dependencies (for deterministic driver initialization order based on the DT) Alexander Holler
2014-05-12 16:47 ` [RFC PATCH 2/9] dt: deps: dependency based device creation Alexander Holler
2014-05-14 14:05 ` Grant Likely
[not found] ` <20140514140534.897F8C4153D-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-05-14 14:49 ` Alexander Holler
2014-05-14 17:20 ` Alexander Holler
[not found] ` <53738261.4000000-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-14 20:06 ` Grant Likely
2014-05-14 21:10 ` Alexander Holler
[not found] ` <5373DBCF.1080503-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-16 11:00 ` Grant Likely
2014-05-18 9:53 ` Alexander Holler
2014-05-16 17:31 ` Alexander Shiyan
2014-05-16 17:31 ` Alexander Shiyan
2014-05-16 17:31 ` Alexander Shiyan
2014-05-14 15:51 ` Alexander Holler
2014-05-17 14:24 ` Tomasz Figa
2014-05-18 14:59 ` Grant Likely
2014-05-19 8:41 ` Alexander Holler
2014-05-12 16:47 ` [RFC PATCH 4/9] dt: deps: dtc: Add option to print dependency graph as dot (Graphviz) Alexander Holler
2014-05-12 16:47 ` [RFC PATCH 7/9] dt: deps: kirkwood: make it possible to use CONFIG_OF_DEPENDENCIES Alexander Holler
2014-05-12 16:47 ` [RFC PATCH 8/9] dt: deps: dts: kirkwood: dockstar: add dependency ehci -> usb power regulator Alexander Holler
2014-05-12 16:48 ` [RFC PATCH 9/9] dt: deps: omap2: make it possible to use CONFIG_OF_DEPENDENCIES Alexander Holler
[not found] ` <1399913280-6915-1-git-send-email-holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-12 16:47 ` [RFC PATCH 1/9] dt: deps: dtc: Automatically add new property 'dependencies' which contains a list of referenced phandles Alexander Holler
[not found] ` <1399913280-6915-2-git-send-email-holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-17 12:16 ` Tomasz Figa
2014-05-19 12:35 ` Alexander Holler
2014-05-19 15:38 ` Jon Loeliger
2014-05-19 15:49 ` Jon Loeliger
[not found] ` <CAJgR-BhRtc1XGqk-TVOrf2y_pYS+nratkPrf+OenP4SFcyK3ng-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-05-19 17:26 ` Alexander Holler
[not found] ` <5379FAA5.10404-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-27 20:02 ` Grant Likely
2014-05-27 20:31 ` Alexander Holler
2014-05-12 16:47 ` [RFC PATCH 3/9] dt: deps: dtc: Add option to print initialization order Alexander Holler
2014-05-12 20:38 ` Jon Loeliger
[not found] ` <CAJgR-BhnFngGr9qxa7NvF7GExiCAr1=HS16AtN20uj7nCmLcKQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-05-12 22:58 ` Alexander Holler
[not found] ` <537151FF.8070104-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-13 8:54 ` [PATCH 0/3] add dependencies Alexander Holler
[not found] ` <1399971243-18153-1-git-send-email-holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-13 8:54 ` [PATCH 1/3] deps: Automatically add new property 'dependencies' which contains a list of referenced phandles Alexander Holler
2014-05-13 8:54 ` Alexander Holler [this message]
2014-05-13 8:54 ` [PATCH 3/3] deps: Add option to print dependency graph as dot (Graphviz) Alexander Holler
2014-05-13 18:48 ` [PATCH] deps: introduce new (virtual) property no-dependencies Alexander Holler
[not found] ` <1400006923-7950-1-git-send-email-holler-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-14 1:55 ` Alexander Holler
[not found] ` <5372CD15.5020001-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-14 7:02 ` Alexander Holler
2014-05-12 16:47 ` [RFC PATCH 5/9] dt: deps: register drivers based on the initialization order based on DT Alexander Holler
2014-05-14 14:13 ` Grant Likely
[not found] ` <20140514141300.67206C4153D-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-05-14 14:58 ` Alexander Holler
[not found] ` <53738496.2070800-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-14 19:32 ` Grant Likely
2014-05-12 16:47 ` [RFC PATCH 6/9] dt: deps: WIP: well done drivers Alexander Holler
2014-05-13 15:40 ` [PATCH 10/9] dt: deps: fix bug not registering late drivers when OF_DEPENDENCIES is disabled Alexander Holler
2014-05-13 19:27 ` [RFC PATCH 11/9] dt: deps: dtc: introduce new (virtual) property no-dependencies Alexander Holler
2014-05-14 14:19 ` [RFC PATCH 0/9] dt: dependencies (for deterministic driver initialization order based on the DT) Grant Likely
2014-05-14 15:02 ` Alexander Holler
[not found] ` <53738580.7000902-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-14 16:05 ` Grant Likely
[not found] ` <CACxGe6s4px_9CNk3bkc1OF1KGZGYdyh4gE_VufCKU5dLFBG48g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-05-14 16:23 ` Alexander Holler
2014-05-14 17:30 ` Rob Herring
2014-05-14 17:45 ` Alexander Holler
2014-05-14 17:53 ` Alexander Holler
[not found] ` <5373ADB6.1070702-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-14 18:16 ` Alexander Holler
2014-05-14 19:13 ` Alexander Holler
2014-05-14 19:06 ` Rob Herring
[not found] ` <CAL_JsqJ-=amrmRR9FfnOH1ELDQ1kTaG3e1n878mgpZP1FUw_jA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-05-14 19:24 ` Alexander Holler
[not found] ` <5373C2F4.50803-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-05-15 1:46 ` Alexander Holler
2014-05-14 23:00 ` Alexander Holler
[not found] ` <20140514141914.446F7C4153D-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-08-21 14:02 ` Thierry Reding
[not found] ` <20140821140211.GD19293-AwZRO8vwLAwmlAP/+Wk3EA@public.gmane.org>
2014-08-21 19:19 ` Alexander Holler
[not found] ` <53F64624.5000403-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-08-22 13:19 ` Mark Rutland
2014-08-22 15:45 ` Alexander Holler
2014-08-25 9:39 ` Thierry Reding
2014-08-25 13:08 ` Jon Loeliger
[not found] ` <E1XLu15-0002DP-6o-CYoMK+44s/E@public.gmane.org>
2014-08-25 13:37 ` Thierry Reding
[not found] ` <20140825133714.GH4163-AwZRO8vwLAwmlAP/+Wk3EA@public.gmane.org>
2014-08-25 14:13 ` Jon Loeliger
[not found] ` <E1XLv1z-0002Jv-VN-CYoMK+44s/E@public.gmane.org>
2014-08-25 14:41 ` Thierry Reding
2014-08-26 8:42 ` Grant Likely
2014-08-26 8:49 ` Thierry Reding
2014-08-26 9:42 ` Alexander Holler
2014-08-26 10:11 ` Mark Rutland
2014-08-26 10:24 ` Thierry Reding
2014-08-27 10:34 ` Grant Likely
[not found] ` <20140827103432.64927C409CB-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-08-27 14:44 ` Catalin Marinas
[not found] ` <20140827144403.GB13850-5wv7dgnIgG8@public.gmane.org>
2014-08-27 16:22 ` Stephen Warren
[not found] ` <53FE05AE.9000406-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-08-27 16:30 ` Alexander Holler
2014-08-27 16:37 ` Stephen Warren
2014-08-27 16:58 ` Alexander Holler
[not found] ` <53FE0966.5020206-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2014-08-27 17:52 ` Catalin Marinas
[not found] ` <20140827175243.GJ13850-5wv7dgnIgG8@public.gmane.org>
2014-08-27 18:14 ` Alexander Holler
2014-08-28 6:50 ` Alexander Holler
2014-08-28 9:23 ` Catalin Marinas
[not found] ` <20140828092308.GA31111-5wv7dgnIgG8@public.gmane.org>
2014-08-29 1:43 ` Alexander Holler
[not found] ` <53FC566C.30904-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-08-26 10:25 ` Thierry Reding
2014-08-26 10:44 ` Alexander Holler
[not found] ` <53FC6513.5040800-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-08-26 11:01 ` Alexander Holler
2014-08-26 11:08 ` Thierry Reding
2014-08-26 11:23 ` Alexander Holler
[not found] ` <53FC6E4A.6030407-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-08-26 11:47 ` Thierry Reding
2014-08-26 12:00 ` Alexander Holler
[not found] ` <53FC76E8.5050009-SXC+2es9fhnfWeYVQQPykw@public.gmane.org>
2014-08-26 13:58 ` Jon Loeliger
2014-08-26 14:17 ` Thierry Reding
[not found] ` <E1XMHGc-0008TS-CQ-CYoMK+44s/E@public.gmane.org>
2014-08-27 7:16 ` Alexander Holler
2014-08-27 9:26 ` Alexander Holler
2014-08-26 7:56 ` Alexander Holler
2014-08-26 8:51 ` Grant Likely
[not found] ` <20140826085128.958A9C40989-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-08-26 9:56 ` Alexander Holler
2014-08-26 10:18 ` Alexander Holler
2014-08-26 9:54 ` Mark Rutland
2014-05-14 8:20 ` dt: deps: some tips about how to debug/evaluate this feature Alexander Holler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1399971243-18153-3-git-send-email-holler@ahsoftware.de \
--to=holler-sxc+2es9fhnfweyvqqpykw@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=jdl-CYoMK+44s/E@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).