diff options
author | Andre Przywara <andre.przywara@arm.com> | 2020-03-26 12:52:06 +0000 |
---|---|---|
committer | Andre Przywara <andre.przywara@arm.com> | 2020-05-05 15:36:51 +0100 |
commit | 60e2e27db51df2b819ad10521a0821544f2f8ce0 (patch) | |
tree | 8dd9febc432f5657e73bad5d0c4939562a6d1dc2 /common | |
parent | 7ad6d362016a875eaee0d227365b74acd464050b (diff) | |
download | arm-trusted-firmware-60e2e27db51df2b819ad10521a0821544f2f8ce0.tar.gz |
fdt/wrappers: Introduce code to find UART DT node
The stdout-path property in the /chosen node of a DTB points to a device
node, which is used for boot console output.
On most (if not all) ARM based platforms this is the debug UART.
The ST platform code contains a function to parse this property and
chase down eventual aliases to learn the node offset of this UART node.
Introduce a slightly more generalised version of this ST platform function
in the generic fdt_wrappers code. This will be useful for other platforms
as well.
Change-Id: Ie6da47ace7833861b5e35fe8cba49835db3659a5
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Diffstat (limited to 'common')
-rw-r--r-- | common/fdt_wrappers.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/common/fdt_wrappers.c b/common/fdt_wrappers.c index 2c4b9c353..1901a2040 100644 --- a/common/fdt_wrappers.c +++ b/common/fdt_wrappers.c @@ -294,3 +294,50 @@ int fdt_get_reg_props_by_name(const void *dtb, int node, const char *name, return fdt_get_reg_props_by_index(dtb, node, index, base, size); } + +/******************************************************************************* + * This function gets the stdout path node. + * It reads the value indicated inside the device tree. + * Returns node offset on success and a negative FDT error code on failure. + ******************************************************************************/ +int fdt_get_stdout_node_offset(const void *dtb) +{ + int node; + const char *prop, *path; + int len; + + /* The /secure-chosen node takes precedence over the standard one. */ + node = fdt_path_offset(dtb, "/secure-chosen"); + if (node < 0) { + node = fdt_path_offset(dtb, "/chosen"); + if (node < 0) { + return -FDT_ERR_NOTFOUND; + } + } + + prop = fdt_getprop(dtb, node, "stdout-path", NULL); + if (prop == NULL) { + return -FDT_ERR_NOTFOUND; + } + + /* Determine the actual path length, as a colon terminates the path. */ + path = strchr(prop, ':'); + if (path == NULL) { + len = strlen(prop); + } else { + len = path - prop; + } + + /* Aliases cannot start with a '/', so it must be the actual path. */ + if (prop[0] == '/') { + return fdt_path_offset_namelen(dtb, prop, len); + } + + /* Lookup the alias, as this contains the actual path. */ + path = fdt_get_alias_namelen(dtb, prop, len); + if (path == NULL) { + return -FDT_ERR_NOTFOUND; + } + + return fdt_path_offset(dtb, path); +} |