mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 09:34:18 +00:00
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>
This commit is contained in:
parent
7ad6d36201
commit
60e2e27db5
4 changed files with 53 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -32,5 +32,6 @@ int fdt_get_reg_props_by_index(const void *dtb, int node, int index,
|
|||
uintptr_t *base, size_t *size);
|
||||
int fdt_get_reg_props_by_name(const void *dtb, int node, const char *name,
|
||||
uintptr_t *base, size_t *size);
|
||||
int fdt_get_stdout_node_offset(const void *dtb);
|
||||
|
||||
#endif /* FDT_WRAPPERS_H */
|
||||
|
|
|
@ -24,11 +24,13 @@ fdt fdt_setprop_inplace_namelen_partial
|
|||
fdt fdt_first_subnode
|
||||
fdt fdt_next_subnode
|
||||
fdt fdt_path_offset
|
||||
fdt fdt_path_offset_namelen
|
||||
fdt fdt_subnode_offset
|
||||
fdt fdt_address_cells
|
||||
fdt fdt_size_cells
|
||||
fdt fdt_parent_offset
|
||||
fdt fdt_stringlist_search
|
||||
fdt fdt_get_alias_namelen
|
||||
mbedtls mbedtls_asn1_get_alg
|
||||
mbedtls mbedtls_asn1_get_alg_null
|
||||
mbedtls mbedtls_asn1_get_bitstring_null
|
||||
|
|
|
@ -25,6 +25,9 @@ fdt fdt_first_subnode
|
|||
fdt fdt_next_subnode
|
||||
fdt fdt_parent_offset
|
||||
fdt fdt_stringlist_search
|
||||
fdt fdt_get_alias_namelen
|
||||
fdt fdt_path_offset
|
||||
fdt fdt_path_offset_namelen
|
||||
mbedtls mbedtls_asn1_get_alg
|
||||
mbedtls mbedtls_asn1_get_alg_null
|
||||
mbedtls mbedtls_asn1_get_bitstring_null
|
||||
|
|
Loading…
Add table
Reference in a new issue