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>
This commit is contained in:
committed by
Patrick Georgi
parent
f36d53c653
commit
fbec63d15f
@@ -556,7 +556,7 @@ struct device_tree_node *dt_find_node(struct device_tree_node *parent,
|
||||
*
|
||||
* @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 @@ struct device_tree_node *dt_find_node(struct device_tree_node *parent,
|
||||
* @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 *dt_init_reserved_memory_node(struct device_tree *tree)
|
||||
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;
|
||||
|
Reference in New Issue
Block a user