device_tree: Have absolute paths start with '/'

Currently DT paths are *not* expected to start with '/'. This is not
what the spec says (see Devicetree Specification v0.2, 2.2.3 Path Names)
and also not what is done by Linux.

Change dt_find_node_by_path() to expect paths to start with '/' and add
a leading '/' to all DT path strings. Besides the compatibility with the
spec this change is also needed to support aliases in the future.

This patch was adapted from depthcharge's http://crosreview.com/1252770

Change-Id: Ibdf59ccbb4ead38c6193b630642fd1f1e847dd89
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/32865
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/lib/device_tree.c b/src/lib/device_tree.c
index 3e1dd35..e26021e 100644
--- a/src/lib/device_tree.c
+++ b/src/lib/device_tree.c
@@ -556,7 +556,7 @@
  *
  * @param tree		The device tree to search.
  * @param path          A string representing a path in the device tree, with
- *			nodes separated by '/'. Example: "soc/firmware/coreboot"
+ *			nodes separated by '/'. Example: "/firmware/coreboot"
  * @param addrcp	Pointer that will be updated with any #address-cells
  *			value found in the path. May be NULL to ignore.
  * @param sizecp	Pointer that will be updated with any #size-cells
@@ -565,13 +565,13 @@
  * @return		The found/created node, or NULL.
  *
  * It is the caller responsibility to provide the correct path string, namely
- * not starting or ending with a '/', and not having "//" anywhere in it.
+ * starting with a '/', not ending in a '/' and not having "//" anywhere in it.
  */
 struct device_tree_node *dt_find_node_by_path(struct device_tree *tree,
 					      const char *path, u32 *addrcp,
 					      u32 *sizecp, int create)
 {
-	char *dup_path = strdup(path);
+	char *dup_path = strdup(&path[1]);	/* remove leading '/' */
 	/* Hopefully enough depth for any node. */
 	const char *path_array[15];
 	int i;
@@ -995,7 +995,7 @@
 	struct device_tree_node *reserved;
 	u32 addr = 0, size = 0;
 
-	reserved = dt_find_node_by_path(tree, "reserved-memory", &addr,
+	reserved = dt_find_node_by_path(tree, "/reserved-memory", &addr,
 					&size, 1);
 	if (!reserved)
 		return NULL;