Soby Mathew | b9fccca | 2017-11-06 13:56:40 +0000 | [diff] [blame] | 1 | /* |
Nicolas Le Bayon | 51f9440 | 2023-05-17 12:36:01 +0200 | [diff] [blame] | 2 | * Copyright (c) 2018-2024, Arm Limited and Contributors. All rights reserved. |
Soby Mathew | b9fccca | 2017-11-06 13:56:40 +0000 | [diff] [blame] | 3 | * |
| 4 | * SPDX-License-Identifier: BSD-3-Clause |
| 5 | */ |
| 6 | |
| 7 | /* Helper functions to offer easier navigation of Device Tree Blob */ |
| 8 | |
Antonio Nino Diaz | 5eb8837 | 2018-11-08 10:20:19 +0000 | [diff] [blame] | 9 | #ifndef FDT_WRAPPERS_H |
| 10 | #define FDT_WRAPPERS_H |
Soby Mathew | b9fccca | 2017-11-06 13:56:40 +0000 | [diff] [blame] | 11 | |
Andre Przywara | 97c6e90 | 2020-07-09 12:33:17 +0100 | [diff] [blame] | 12 | #include <libfdt_env.h> |
Andre Przywara | 8def196 | 2023-02-03 11:11:18 +0000 | [diff] [blame] | 13 | #include <libfdt.h> |
Andre Przywara | 97c6e90 | 2020-07-09 12:33:17 +0100 | [diff] [blame] | 14 | |
Soby Mathew | b9fccca | 2017-11-06 13:56:40 +0000 | [diff] [blame] | 15 | /* Number of cells, given total length in bytes. Each cell is 4 bytes long */ |
Antonio Nino Diaz | f0b14cf | 2018-10-04 09:55:23 +0100 | [diff] [blame] | 16 | #define NCELLS(len) ((len) / 4U) |
Soby Mathew | b9fccca | 2017-11-06 13:56:40 +0000 | [diff] [blame] | 17 | |
Andre Przywara | fe5bdf5 | 2020-03-26 11:22:37 +0000 | [diff] [blame] | 18 | int fdt_read_uint32(const void *dtb, int node, const char *prop_name, |
| 19 | uint32_t *value); |
Andre Przywara | 2d5690c | 2020-03-26 11:50:33 +0000 | [diff] [blame] | 20 | uint32_t fdt_read_uint32_default(const void *dtb, int node, |
| 21 | const char *prop_name, uint32_t dflt_value); |
Andre Przywara | fe5bdf5 | 2020-03-26 11:22:37 +0000 | [diff] [blame] | 22 | int fdt_read_uint64(const void *dtb, int node, const char *prop_name, |
| 23 | uint64_t *value); |
Nicolas Le Bayon | 51f9440 | 2023-05-17 12:36:01 +0200 | [diff] [blame] | 24 | uint64_t fdt_read_uint64_default(const void *dtb, int node, |
| 25 | const char *prop_name, uint64_t dflt_value); |
Andre Przywara | 6cf6a1b | 2020-03-30 23:21:13 +0100 | [diff] [blame] | 26 | int fdt_read_uint32_array(const void *dtb, int node, const char *prop_name, |
| 27 | unsigned int cells, uint32_t *value); |
Antonio Nino Diaz | d85c878 | 2018-06-26 10:34:07 +0100 | [diff] [blame] | 28 | int fdtw_read_string(const void *dtb, int node, const char *prop, |
| 29 | char *str, size_t size); |
David Horstmann | a65a8ff | 2021-03-01 19:34:37 +0000 | [diff] [blame] | 30 | int fdtw_read_uuid(const void *dtb, int node, const char *prop, |
| 31 | unsigned int length, uint8_t *uuid); |
Soby Mathew | b9fccca | 2017-11-06 13:56:40 +0000 | [diff] [blame] | 32 | int fdtw_write_inplace_cells(void *dtb, int node, const char *prop, |
| 33 | unsigned int cells, void *value); |
Alexei Fedorov | 2de82fc | 2020-01-29 16:21:28 +0000 | [diff] [blame] | 34 | int fdtw_read_bytes(const void *dtb, int node, const char *prop, |
| 35 | unsigned int length, void *value); |
| 36 | int fdtw_write_inplace_bytes(void *dtb, int node, const char *prop, |
| 37 | unsigned int length, const void *data); |
Andre Przywara | e183e15 | 2020-03-26 11:57:43 +0000 | [diff] [blame] | 38 | int fdt_get_reg_props_by_index(const void *dtb, int node, int index, |
| 39 | uintptr_t *base, size_t *size); |
Andre Przywara | 4a1c874 | 2020-03-26 12:11:34 +0000 | [diff] [blame] | 40 | int fdt_get_reg_props_by_name(const void *dtb, int node, const char *name, |
| 41 | uintptr_t *base, size_t *size); |
Andre Przywara | a0eaca5 | 2020-03-26 12:52:06 +0000 | [diff] [blame] | 42 | int fdt_get_stdout_node_offset(const void *dtb); |
Antonio Nino Diaz | d85c878 | 2018-06-26 10:34:07 +0100 | [diff] [blame] | 43 | |
Madhukar Pappireddy | 361c1b3 | 2020-03-24 10:03:34 -0500 | [diff] [blame] | 44 | uint64_t fdtw_translate_address(const void *dtb, int bus_node, |
| 45 | uint64_t base_address); |
| 46 | |
Chris Kay | 93c9db0 | 2021-09-28 16:06:25 +0100 | [diff] [blame] | 47 | int fdtw_for_each_cpu(const void *fdt, |
| 48 | int (*callback)(const void *dtb, int node, uintptr_t mpidr)); |
| 49 | |
Ruchika Gupta | d480202 | 2022-04-08 13:16:16 +0530 | [diff] [blame] | 50 | int fdtw_find_or_add_subnode(void *fdt, int parentoffset, const char *name); |
| 51 | |
Andre Przywara | 97c6e90 | 2020-07-09 12:33:17 +0100 | [diff] [blame] | 52 | static inline uint32_t fdt_blob_size(const void *dtb) |
| 53 | { |
Juan Pablo Conde | c322999 | 2023-06-22 16:33:15 -0500 | [diff] [blame] | 54 | const uint32_t *dtb_header = (const uint32_t *)dtb; |
Andre Przywara | 97c6e90 | 2020-07-09 12:33:17 +0100 | [diff] [blame] | 55 | |
| 56 | return fdt32_to_cpu(dtb_header[1]); |
| 57 | } |
| 58 | |
Andre Przywara | 8def196 | 2023-02-03 11:11:18 +0000 | [diff] [blame] | 59 | static inline bool fdt_node_is_enabled(const void *fdt, int node) |
| 60 | { |
| 61 | int len; |
| 62 | const void *prop = fdt_getprop(fdt, node, "status", &len); |
| 63 | |
| 64 | /* A non-existing status property means the device is enabled. */ |
Juan Pablo Conde | c322999 | 2023-06-22 16:33:15 -0500 | [diff] [blame] | 65 | return (prop == NULL) || (len == 5 && strcmp((const char *)prop, |
| 66 | "okay") == 0); |
Andre Przywara | 8def196 | 2023-02-03 11:11:18 +0000 | [diff] [blame] | 67 | } |
| 68 | |
Laurent Carlier | 246b1ad | 2021-09-30 15:57:09 +0100 | [diff] [blame] | 69 | #define fdt_for_each_compatible_node(dtb, node, compatible_str) \ |
| 70 | for (node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); \ |
| 71 | node >= 0; \ |
| 72 | node = fdt_node_offset_by_compatible(dtb, node, compatible_str)) |
| 73 | |
Antonio Nino Diaz | 5eb8837 | 2018-11-08 10:20:19 +0000 | [diff] [blame] | 74 | #endif /* FDT_WRAPPERS_H */ |