11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2a4f139d7SJerome Forissier /* 301254f1dSEtienne Carriere * Copyright (c) 2016-2021, Linaro Limited 4a4f139d7SJerome Forissier */ 5a4f139d7SJerome Forissier 6d50fee03SEtienne Carriere #ifndef __KERNEL_DT_H 7d50fee03SEtienne Carriere #define __KERNEL_DT_H 8a4f139d7SJerome Forissier 9a4f139d7SJerome Forissier #include <compiler.h> 10c0cfb36cSEtienne Carriere #include <kernel/panic.h> 1161bdedeaSJerome Forissier #include <scattered_array.h> 12a4f139d7SJerome Forissier #include <stdint.h> 1301254f1dSEtienne Carriere #include <tee_api_types.h> 14a4f139d7SJerome Forissier #include <types_ext.h> 159fe4c797SJerome Forissier #include <util.h> 169fe4c797SJerome Forissier 179fe4c797SJerome Forissier /* 1823b1daf4SPeng Fan * Bitfield to reflect status and secure-status values ("okay", "disabled" 1923b1daf4SPeng Fan * or not present) 209fe4c797SJerome Forissier */ 21b4bfc9a9SJens Wiklander #define DT_STATUS_DISABLED U(0) 229fe4c797SJerome Forissier #define DT_STATUS_OK_NSEC BIT(0) 239fe4c797SJerome Forissier #define DT_STATUS_OK_SEC BIT(1) 24a4f139d7SJerome Forissier 25c0cfb36cSEtienne Carriere #define DT_INFO_INVALID_REG ((paddr_t)-1) 26df7cecc0SLionel Debieve #define DT_INFO_INVALID_REG_SIZE ((size_t)-1) 27c0cfb36cSEtienne Carriere #define DT_INFO_INVALID_CLOCK -1 28c0cfb36cSEtienne Carriere #define DT_INFO_INVALID_RESET -1 2995cdc5e0SCedric Neveux #define DT_INFO_INVALID_INTERRUPT -1 3095cdc5e0SCedric Neveux 31c0cfb36cSEtienne Carriere /* 32c0cfb36cSEtienne Carriere * @status: Bit mask for DT_STATUS_* 33c0cfb36cSEtienne Carriere * @reg: Device register physical base address or DT_INFO_INVALID_REG 3406fd21ddSLionel Debieve * @reg_size: Device register size or DT_INFO_INVALID_REG_SIZE 35c0cfb36cSEtienne Carriere * @clock: Device identifier (positive value) or DT_INFO_INVALID_CLOCK 36c0cfb36cSEtienne Carriere * @reset: Device reset identifier (positive value) or DT_INFO_INVALID_CLOCK 377acb3a47SLudovic Barre * @interrupt: Device interrupt identifier (positive value) or 387acb3a47SLudovic Barre * DT_INFO_INVALID_INTERRUPT 39702fe5a7SClément Léger * @type: IRQ_TYPE_* value parsed from interrupts properties or IRQ_TYPE_NONE if 40702fe5a7SClément Léger * not present 41702fe5a7SClément Léger * @prio: interrupt priority parsed from interrupts properties or 0 if not 42702fe5a7SClément Léger * present 43c0cfb36cSEtienne Carriere */ 44c0cfb36cSEtienne Carriere struct dt_node_info { 45c0cfb36cSEtienne Carriere unsigned int status; 46c0cfb36cSEtienne Carriere paddr_t reg; 4706fd21ddSLionel Debieve size_t reg_size; 48c0cfb36cSEtienne Carriere int clock; 49c0cfb36cSEtienne Carriere int reset; 507acb3a47SLudovic Barre int interrupt; 51702fe5a7SClément Léger uint32_t type; 52702fe5a7SClément Léger uint32_t prio; 53c0cfb36cSEtienne Carriere }; 54c0cfb36cSEtienne Carriere 55a4f139d7SJerome Forissier /* 56a4f139d7SJerome Forissier * DT-aware drivers 57a4f139d7SJerome Forissier */ 58a4f139d7SJerome Forissier 59a4f139d7SJerome Forissier struct dt_device_match { 60a4f139d7SJerome Forissier const char *compatible; 617e6a39feSEtienne Carriere const void *compat_data; 62a4f139d7SJerome Forissier }; 63a4f139d7SJerome Forissier 6401254f1dSEtienne Carriere /* 65a5d5bbc8SVesa Jääskeläinen * DT_MAP_AUTO: Uses status properties from device tree to determine mapping. 66a5d5bbc8SVesa Jääskeläinen * DT_MAP_SECURE: Force mapping for device to be secure. 67a5d5bbc8SVesa Jääskeläinen * DT_MAP_NON_SECURE: Force mapping for device to be non-secure. 68a5d5bbc8SVesa Jääskeläinen */ 69a5d5bbc8SVesa Jääskeläinen enum dt_map_dev_directive { 70a5d5bbc8SVesa Jääskeläinen DT_MAP_AUTO, 71a5d5bbc8SVesa Jääskeläinen DT_MAP_SECURE, 72a5d5bbc8SVesa Jääskeläinen DT_MAP_NON_SECURE 73a5d5bbc8SVesa Jääskeläinen }; 74a5d5bbc8SVesa Jääskeläinen 754e45454aSJens Wiklander /* 76e6027f48SAlvin Chang * struct dt_descriptor - Descriptor of the device tree 77e6027f48SAlvin Chang * @blob: Pointer to the device tree binary 78e6027f48SAlvin Chang * @frag_id: Used ID of fragments for device tree overlay 79e6027f48SAlvin Chang */ 80e6027f48SAlvin Chang struct dt_descriptor { 81e6027f48SAlvin Chang void *blob; 82e6027f48SAlvin Chang #ifdef _CFG_USE_DTB_OVERLAY 83e6027f48SAlvin Chang int frag_id; 84e6027f48SAlvin Chang #endif 85e6027f48SAlvin Chang }; 86e6027f48SAlvin Chang 87e6027f48SAlvin Chang extern uint8_t embedded_secure_dtb[]; 88e6027f48SAlvin Chang 895a982d0eSJens Wiklander #ifdef CFG_DT 90e6027f48SAlvin Chang /* 914e45454aSJens Wiklander * dt_getprop_as_number() - get a DT property a unsigned number 924e45454aSJens Wiklander * @fdt: DT base address 934e45454aSJens Wiklander * @nodeoffset: node offset 944e45454aSJens Wiklander * @name: property string name 954e45454aSJens Wiklander * @num: output number read 964e45454aSJens Wiklander * Return 0 on success and a negative FDT error value on error 974e45454aSJens Wiklander * 984e45454aSJens Wiklander * The size of the property determines if it is read as an unsigned 32-bit 994e45454aSJens Wiklander * or 64-bit integer. 1004e45454aSJens Wiklander */ 1014e45454aSJens Wiklander int dt_getprop_as_number(const void *fdt, int nodeoffset, const char *name, 1024e45454aSJens Wiklander uint64_t *num); 1034e45454aSJens Wiklander 104a4f139d7SJerome Forissier /* 105a4f139d7SJerome Forissier * Find a driver that is suitable for the given DT node, that is, with 106a4f139d7SJerome Forissier * a matching "compatible" property. 107a4f139d7SJerome Forissier * 108a4f139d7SJerome Forissier * @fdt: pointer to the device tree 109a4f139d7SJerome Forissier * @offs: node offset 110a4f139d7SJerome Forissier */ 111a4f139d7SJerome Forissier const struct dt_driver *dt_find_compatible_driver(const void *fdt, int offs); 112a4f139d7SJerome Forissier 1139fe4c797SJerome Forissier /* 1147ba16abbSJerome Forissier * Map a device into secure or non-secure memory and return the base VA and 1157ba16abbSJerome Forissier * the mapping size. The mapping is done with type MEM_AREA_IO_SEC or 1167ba16abbSJerome Forissier * MEM_AREA_IO_NSEC, depending on the device status. 1177ba16abbSJerome Forissier * If the mapping already exists, the function simply returns the @vbase and 1187ba16abbSJerome Forissier * @size information. 1197ba16abbSJerome Forissier * 1207ba16abbSJerome Forissier * @offs is the offset of the node that describes the device in @fdt. 1217ba16abbSJerome Forissier * @base receives the base virtual address corresponding to the base physical 1227ba16abbSJerome Forissier * address of the "reg" property 1237ba16abbSJerome Forissier * @size receives the size of the mapping 124a5d5bbc8SVesa Jääskeläinen * @mapping what kind of mapping is done for memory. 1257ba16abbSJerome Forissier * 1267ba16abbSJerome Forissier * Returns 0 on success or -1 in case of error. 1277ba16abbSJerome Forissier */ 128a5d5bbc8SVesa Jääskeläinen int dt_map_dev(const void *fdt, int offs, vaddr_t *base, size_t *size, 129a5d5bbc8SVesa Jääskeläinen enum dt_map_dev_directive mapping); 1307ba16abbSJerome Forissier 1317ba16abbSJerome Forissier /* 13250f3b323SPeng Fan * Check whether the node at @offs contains the property with propname or not. 13350f3b323SPeng Fan * 13450f3b323SPeng Fan * @offs is the offset of the node that describes the device in @fdt. 13550f3b323SPeng Fan * @propname is the property that need to check 13650f3b323SPeng Fan * 13750f3b323SPeng Fan * Returns true on success or false if no propname. 13850f3b323SPeng Fan */ 13950f3b323SPeng Fan bool dt_have_prop(const void *fdt, int offs, const char *propname); 14050f3b323SPeng Fan 14150f3b323SPeng Fan /* 14295cdc5e0SCedric Neveux * Modify or add "status" property to "disabled" 14395cdc5e0SCedric Neveux * 14495cdc5e0SCedric Neveux * @fdt reference to the Device Tree 14595cdc5e0SCedric Neveux * @node is the node offset to modify 14695cdc5e0SCedric Neveux * 14795cdc5e0SCedric Neveux * Returns 0 on success or -1 on failure 14895cdc5e0SCedric Neveux */ 14995cdc5e0SCedric Neveux int dt_disable_status(void *fdt, int node); 15095cdc5e0SCedric Neveux 15195cdc5e0SCedric Neveux /* 15295cdc5e0SCedric Neveux * Force secure-status = "okay" and status="disabled" for the target node. 15395cdc5e0SCedric Neveux * 15495cdc5e0SCedric Neveux * @fdt reference to the Device Tree 15595cdc5e0SCedric Neveux * @node is the node offset to modify 15695cdc5e0SCedric Neveux * 15795cdc5e0SCedric Neveux * Returns 0 on success or -1 on failure 15895cdc5e0SCedric Neveux */ 15995cdc5e0SCedric Neveux int dt_enable_secure_status(void *fdt, int node); 16095cdc5e0SCedric Neveux 16195cdc5e0SCedric Neveux /* 1629fe4c797SJerome Forissier * FDT manipulation functions, not provided by <libfdt.h> 1639fe4c797SJerome Forissier */ 1649fe4c797SJerome Forissier 1659fe4c797SJerome Forissier /* 1669fe4c797SJerome Forissier * Return the base address for the "reg" property of the specified node or 1679fe4c797SJerome Forissier * (paddr_t)-1 in case of error 1689fe4c797SJerome Forissier */ 169f354a5d8SGatien Chevallier paddr_t fdt_reg_base_address(const void *fdt, int offs); 1709fe4c797SJerome Forissier 1719fe4c797SJerome Forissier /* 1729fe4c797SJerome Forissier * Return the reg size for the reg property of the specified node or -1 in case 1739fe4c797SJerome Forissier * of error 1749fe4c797SJerome Forissier */ 175f354a5d8SGatien Chevallier size_t fdt_reg_size(const void *fdt, int offs); 1769fe4c797SJerome Forissier 1779fe4c797SJerome Forissier /* 1789fe4c797SJerome Forissier * Read the status and secure-status properties into a bitfield. 179c020046dSEtienne Carriere * Return -1 on failure, DT_STATUS_DISABLED if the node is disabled, 180c020046dSEtienne Carriere * otherwise return a combination of DT_STATUS_OK_NSEC and DT_STATUS_OK_SEC. 1819fe4c797SJerome Forissier */ 182f354a5d8SGatien Chevallier int fdt_get_status(const void *fdt, int offs); 1839fe4c797SJerome Forissier 184c0cfb36cSEtienne Carriere /* 185c0cfb36cSEtienne Carriere * fdt_fill_device_info - Get generic device info from a node 186c0cfb36cSEtienne Carriere * 187c0cfb36cSEtienne Carriere * This function fills the generic information from a given node. 188c0cfb36cSEtienne Carriere * Currently supports a single base register, a single clock, 189c0cfb36cSEtienne Carriere * a single reset ID line and a single interrupt ID. 190c0cfb36cSEtienne Carriere * Default DT_INFO_* macros are used when the relate property is not found. 191c0cfb36cSEtienne Carriere */ 192f354a5d8SGatien Chevallier void fdt_fill_device_info(const void *fdt, struct dt_node_info *info, 193df45c114SEtienne Carriere int node); 194876826f3SGabriel Fernandez /* 195876826f3SGabriel Fernandez * Read cells from a given property of the given node. Any number of 32-bit 196876826f3SGabriel Fernandez * cells of the property can be read. Returns 0 on success, or a negative 197876826f3SGabriel Fernandez * FDT error value otherwise. 198876826f3SGabriel Fernandez */ 199f354a5d8SGatien Chevallier int fdt_read_uint32_array(const void *fdt, int node, const char *prop_name, 200876826f3SGabriel Fernandez uint32_t *array, size_t count); 201876826f3SGabriel Fernandez 202876826f3SGabriel Fernandez /* 2037c3a6b7bSGatien Chevallier * Read one cell from a given multi-value property of the given node. 2047c3a6b7bSGatien Chevallier * Returns 0 on success, or a negative FDT error value otherwise. 2057c3a6b7bSGatien Chevallier */ 2067c3a6b7bSGatien Chevallier int fdt_read_uint32_index(const void *fdt, int node, const char *prop_name, 2077c3a6b7bSGatien Chevallier int index, uint32_t *value); 2087c3a6b7bSGatien Chevallier 2097c3a6b7bSGatien Chevallier /* 210876826f3SGabriel Fernandez * Read one cell from a given property of the given node. 211876826f3SGabriel Fernandez * Returns 0 on success, or a negative FDT error value otherwise. 212876826f3SGabriel Fernandez */ 213f354a5d8SGatien Chevallier int fdt_read_uint32(const void *fdt, int node, const char *prop_name, 214876826f3SGabriel Fernandez uint32_t *value); 215876826f3SGabriel Fernandez 216876826f3SGabriel Fernandez /* 217876826f3SGabriel Fernandez * Read one cell from a property of a cell or default to a given value 218876826f3SGabriel Fernandez * Returns the 32bit cell value or @dflt_value on failure. 219876826f3SGabriel Fernandez */ 220f354a5d8SGatien Chevallier uint32_t fdt_read_uint32_default(const void *fdt, int node, 221876826f3SGabriel Fernandez const char *prop_name, uint32_t dflt_value); 222876826f3SGabriel Fernandez 223876826f3SGabriel Fernandez /* 22407ced948SGatien Chevallier * This function fills reg node info (base & size) with an index. 22507ced948SGatien Chevallier * 22607ced948SGatien Chevallier * Returns 0 on success and a negative FDT error code on failure. 22707ced948SGatien Chevallier */ 22807ced948SGatien Chevallier int fdt_get_reg_props_by_index(const void *fdt, int node, int index, 22907ced948SGatien Chevallier paddr_t *base, size_t *size); 23007ced948SGatien Chevallier 23107ced948SGatien Chevallier /* 23207ced948SGatien Chevallier * This function fills reg node info (base & size) with an index found by 23307ced948SGatien Chevallier * checking the reg-names node. 23407ced948SGatien Chevallier * 23507ced948SGatien Chevallier * Returns 0 on success and a negative FDT error code on failure. 23607ced948SGatien Chevallier */ 23707ced948SGatien Chevallier int fdt_get_reg_props_by_name(const void *fdt, int node, const char *name, 23807ced948SGatien Chevallier paddr_t *base, size_t *size); 23907ced948SGatien Chevallier 240c5e3e79fSSungbae Yoo /* 241c5e3e79fSSungbae Yoo * Returns embedded DTB if present, then external DTB if found, 242c5e3e79fSSungbae Yoo * then manifest DTB if found, then NULL. 243c5e3e79fSSungbae Yoo */ 244e6027f48SAlvin Chang void *get_dt(void); 245e6027f48SAlvin Chang 246e6027f48SAlvin Chang /* 247e6027f48SAlvin Chang * get_secure_dt() - returns secure DTB for drivers 248e6027f48SAlvin Chang * 249e6027f48SAlvin Chang * Returns device tree that is considered secure for drivers to use. 250e6027f48SAlvin Chang * 251e6027f48SAlvin Chang * 1. Returns embedded DTB if available, 252e6027f48SAlvin Chang * 2. Secure external DTB if available, 253c5e3e79fSSungbae Yoo * 3. Manifest DTB if available, 254c5e3e79fSSungbae Yoo * 4. If neither then NULL 255e6027f48SAlvin Chang */ 256e6027f48SAlvin Chang void *get_secure_dt(void); 257e6027f48SAlvin Chang 258e6027f48SAlvin Chang /* Returns embedded DTB location if present, otherwise NULL */ 259e6027f48SAlvin Chang void *get_embedded_dt(void); 260e6027f48SAlvin Chang 261e6027f48SAlvin Chang /* Returns true if passed DTB is same as Embedded DTB, otherwise false */ 262e6027f48SAlvin Chang static inline bool is_embedded_dt(void *fdt) 263e6027f48SAlvin Chang { 264e6027f48SAlvin Chang return fdt && fdt == get_embedded_dt(); 265e6027f48SAlvin Chang } 266e6027f48SAlvin Chang 267e6027f48SAlvin Chang /* Returns DTB descriptor of the external DTB if present, otherwise NULL */ 268e6027f48SAlvin Chang struct dt_descriptor *get_external_dt_desc(void); 269e6027f48SAlvin Chang 270e6027f48SAlvin Chang /* 271e6027f48SAlvin Chang * init_external_dt() - Initialize the external DTB located at given address. 272e6027f48SAlvin Chang * @phys_dt: Physical address where the external DTB located. 273dcff802bSRaymond Mao * @dt_sz: Maximum size of the external DTB. 274e6027f48SAlvin Chang * 275e6027f48SAlvin Chang * Initialize the external DTB. 276e6027f48SAlvin Chang * 277e6027f48SAlvin Chang * 1. Add MMU mapping of the external DTB, 278e6027f48SAlvin Chang * 2. Initialize device tree overlay 279e6027f48SAlvin Chang */ 280dcff802bSRaymond Mao void init_external_dt(unsigned long phys_dt, size_t dt_sz); 281e6027f48SAlvin Chang 282e6027f48SAlvin Chang /* Returns external DTB if present, otherwise NULL */ 283e6027f48SAlvin Chang void *get_external_dt(void); 284e6027f48SAlvin Chang 285e6027f48SAlvin Chang /* 286e6027f48SAlvin Chang * add_dt_path_subnode() - Add new child node into a parent node. 287e6027f48SAlvin Chang * @dt: Pointer to a device tree descriptor which has DTB. 288e6027f48SAlvin Chang * @path: Path to the parent node. 289e6027f48SAlvin Chang * @subnode: Name of the child node. 290e6027f48SAlvin Chang * 2910c49b6d6SAlvin Chang * Returns the offset of the child node in DTB on success or a negative libfdt 2920c49b6d6SAlvin Chang * error number. 293e6027f48SAlvin Chang */ 294e6027f48SAlvin Chang int add_dt_path_subnode(struct dt_descriptor *dt, const char *path, 295e6027f48SAlvin Chang const char *subnode); 296e6027f48SAlvin Chang 297e6027f48SAlvin Chang /* 298e6027f48SAlvin Chang * add_res_mem_dt_node() - Create "reserved-memory" parent and child nodes. 299e6027f48SAlvin Chang * @dt: Pointer to a device tree descriptor which has DTB. 300e6027f48SAlvin Chang * @name: Name of the child node. 301e6027f48SAlvin Chang * @pa: Physical address of specific reserved memory region. 302e6027f48SAlvin Chang * @size: Size of specific reserved memory region. 303e6027f48SAlvin Chang * 3040c49b6d6SAlvin Chang * Returns 0 if succeeds, otherwise a negative libfdt error number. 305e6027f48SAlvin Chang */ 306e6027f48SAlvin Chang int add_res_mem_dt_node(struct dt_descriptor *dt, const char *name, 307e6027f48SAlvin Chang paddr_t pa, size_t size); 308e6027f48SAlvin Chang 3094bc2c5f0SSungbae Yoo /* 3104bc2c5f0SSungbae Yoo * init_manifest_dt() - Initialize the manifest DTB to given address. 3114bc2c5f0SSungbae Yoo * @fdt: Physical address where the manifest DTB located. 3124bc2c5f0SSungbae Yoo * 3134bc2c5f0SSungbae Yoo * Initialize the manifest DTB to physical address 3144bc2c5f0SSungbae Yoo */ 3154bc2c5f0SSungbae Yoo void init_manifest_dt(void *fdt); 3164bc2c5f0SSungbae Yoo 3174bc2c5f0SSungbae Yoo /* 3184bc2c5f0SSungbae Yoo * reinit_manifest_dt() - Reinitialize the manifest DTB 3194bc2c5f0SSungbae Yoo * 3204bc2c5f0SSungbae Yoo * Add MMU mapping of the manifest DTB and initialize device tree overlay 3214bc2c5f0SSungbae Yoo */ 3224bc2c5f0SSungbae Yoo void reinit_manifest_dt(void); 3234bc2c5f0SSungbae Yoo 3244bc2c5f0SSungbae Yoo /* Returns TOS_FW_CONFIG DTB or SP manifest DTB if present, otherwise NULL */ 3254bc2c5f0SSungbae Yoo void *get_manifest_dt(void); 3264bc2c5f0SSungbae Yoo 3279fe4c797SJerome Forissier #else /* !CFG_DT */ 328a4f139d7SJerome Forissier 329a4f139d7SJerome Forissier static inline const struct dt_driver *dt_find_compatible_driver( 330a4f139d7SJerome Forissier const void *fdt __unused, 331a4f139d7SJerome Forissier int offs __unused) 332a4f139d7SJerome Forissier { 333a4f139d7SJerome Forissier return NULL; 334a4f139d7SJerome Forissier } 335a4f139d7SJerome Forissier 3367ba16abbSJerome Forissier static inline int dt_map_dev(const void *fdt __unused, int offs __unused, 337a5d5bbc8SVesa Jääskeläinen vaddr_t *vbase __unused, size_t *size __unused, 338a5d5bbc8SVesa Jääskeläinen enum dt_map_dev_directive mapping __unused) 3397ba16abbSJerome Forissier { 3407ba16abbSJerome Forissier return -1; 3417ba16abbSJerome Forissier } 3427ba16abbSJerome Forissier 343f354a5d8SGatien Chevallier static inline paddr_t fdt_reg_base_address(const void *fdt __unused, 3449fe4c797SJerome Forissier int offs __unused) 3459fe4c797SJerome Forissier { 3469fe4c797SJerome Forissier return (paddr_t)-1; 3479fe4c797SJerome Forissier } 3489fe4c797SJerome Forissier 349f354a5d8SGatien Chevallier static inline size_t fdt_reg_size(const void *fdt __unused, 3509fe4c797SJerome Forissier int offs __unused) 3519fe4c797SJerome Forissier { 352df7cecc0SLionel Debieve return (size_t)-1; 3539fe4c797SJerome Forissier } 3549fe4c797SJerome Forissier 355f354a5d8SGatien Chevallier static inline int fdt_get_status(const void *fdt __unused, int offs __unused) 3569fe4c797SJerome Forissier { 3579fe4c797SJerome Forissier return -1; 3589fe4c797SJerome Forissier } 3599fe4c797SJerome Forissier 3601e866588SJerome Forissier __noreturn 361f354a5d8SGatien Chevallier static inline void fdt_fill_device_info(const void *fdt __unused, 362c0cfb36cSEtienne Carriere struct dt_node_info *info __unused, 363c0cfb36cSEtienne Carriere int node __unused) 364c0cfb36cSEtienne Carriere { 365c0cfb36cSEtienne Carriere panic(); 366c0cfb36cSEtienne Carriere } 367876826f3SGabriel Fernandez 368f354a5d8SGatien Chevallier static inline int fdt_read_uint32_array(const void *fdt __unused, 369876826f3SGabriel Fernandez int node __unused, 370876826f3SGabriel Fernandez const char *prop_name __unused, 371876826f3SGabriel Fernandez uint32_t *array __unused, 372876826f3SGabriel Fernandez size_t count __unused) 373876826f3SGabriel Fernandez { 374876826f3SGabriel Fernandez return -1; 375876826f3SGabriel Fernandez } 376876826f3SGabriel Fernandez 377f354a5d8SGatien Chevallier static inline int fdt_read_uint32(const void *fdt __unused, 378876826f3SGabriel Fernandez int node __unused, 379876826f3SGabriel Fernandez const char *prop_name __unused, 380876826f3SGabriel Fernandez uint32_t *value __unused) 381876826f3SGabriel Fernandez { 382876826f3SGabriel Fernandez return -1; 383876826f3SGabriel Fernandez } 384876826f3SGabriel Fernandez 385f354a5d8SGatien Chevallier static inline uint32_t fdt_read_uint32_default(const void *fdt __unused, 386876826f3SGabriel Fernandez int node __unused, 387876826f3SGabriel Fernandez const char *prop_name __unused, 388876826f3SGabriel Fernandez uint32_t dflt_value __unused) 389876826f3SGabriel Fernandez { 390876826f3SGabriel Fernandez return dflt_value; 391876826f3SGabriel Fernandez } 392876826f3SGabriel Fernandez 3937c3a6b7bSGatien Chevallier static inline int fdt_read_uint32_index(const void *fdt __unused, 3947c3a6b7bSGatien Chevallier int node __unused, 3957c3a6b7bSGatien Chevallier const char *prop_name __unused, 3967c3a6b7bSGatien Chevallier int index __unused, 3977c3a6b7bSGatien Chevallier uint32_t *value __unused) 3987c3a6b7bSGatien Chevallier { 3997c3a6b7bSGatien Chevallier return -1; 4007c3a6b7bSGatien Chevallier } 4017c3a6b7bSGatien Chevallier 40207ced948SGatien Chevallier static inline int fdt_get_reg_props_by_index(const void *fdt __unused, 40307ced948SGatien Chevallier int node __unused, 40407ced948SGatien Chevallier int index __unused, 40507ced948SGatien Chevallier paddr_t *base __unused, 40607ced948SGatien Chevallier size_t *size __unused) 40707ced948SGatien Chevallier { 40807ced948SGatien Chevallier return -1; 40907ced948SGatien Chevallier } 41007ced948SGatien Chevallier 41107ced948SGatien Chevallier static inline int fdt_get_reg_props_by_name(const void *fdt __unused, 41207ced948SGatien Chevallier int node __unused, 41307ced948SGatien Chevallier const char *name __unused, 41407ced948SGatien Chevallier paddr_t *base __unused, 41507ced948SGatien Chevallier size_t *size __unused) 41607ced948SGatien Chevallier { 41707ced948SGatien Chevallier return -1; 41807ced948SGatien Chevallier } 41907ced948SGatien Chevallier 4205a982d0eSJens Wiklander static inline int dt_getprop_as_number(const void *fdt __unused, 4215a982d0eSJens Wiklander int nodeoffset __unused, 4225a982d0eSJens Wiklander const char *name __unused, 4235a982d0eSJens Wiklander uint64_t *num __unused) 4245a982d0eSJens Wiklander { 4255a982d0eSJens Wiklander return -1; 4265a982d0eSJens Wiklander } 4275a982d0eSJens Wiklander 428e6027f48SAlvin Chang static inline void *get_dt(void) 429e6027f48SAlvin Chang { 430e6027f48SAlvin Chang return NULL; 431e6027f48SAlvin Chang } 432e6027f48SAlvin Chang 433e6027f48SAlvin Chang static inline void *get_secure_dt(void) 434e6027f48SAlvin Chang { 435e6027f48SAlvin Chang return NULL; 436e6027f48SAlvin Chang } 437e6027f48SAlvin Chang 438e6027f48SAlvin Chang static inline void *get_embedded_dt(void) 439e6027f48SAlvin Chang { 440e6027f48SAlvin Chang return NULL; 441e6027f48SAlvin Chang } 442e6027f48SAlvin Chang 443e6027f48SAlvin Chang static inline bool is_embedded_dt(void *fdt __unused) 444e6027f48SAlvin Chang { 445e6027f48SAlvin Chang return false; 446e6027f48SAlvin Chang } 447e6027f48SAlvin Chang 448e6027f48SAlvin Chang static inline struct dt_descriptor *get_external_dt_desc(void) 449e6027f48SAlvin Chang { 450e6027f48SAlvin Chang return NULL; 451e6027f48SAlvin Chang } 452e6027f48SAlvin Chang 453dcff802bSRaymond Mao static inline void init_external_dt(unsigned long phys_dt __unused, 454dcff802bSRaymond Mao size_t dt_sz __unused) 455e6027f48SAlvin Chang { 456e6027f48SAlvin Chang } 457e6027f48SAlvin Chang 458e6027f48SAlvin Chang static inline void *get_external_dt(void) 459e6027f48SAlvin Chang { 460e6027f48SAlvin Chang return NULL; 461e6027f48SAlvin Chang } 462e6027f48SAlvin Chang 463e6027f48SAlvin Chang static inline int add_dt_path_subnode(struct dt_descriptor *dt __unused, 464e6027f48SAlvin Chang const char *path __unused, 465e6027f48SAlvin Chang const char *subnode __unused) 466e6027f48SAlvin Chang { 467e6027f48SAlvin Chang return -1; 468e6027f48SAlvin Chang } 469e6027f48SAlvin Chang 470e6027f48SAlvin Chang static inline int add_res_mem_dt_node(struct dt_descriptor *dt __unused, 471e6027f48SAlvin Chang const char *name __unused, 472e6027f48SAlvin Chang paddr_t pa __unused, 473e6027f48SAlvin Chang size_t size __unused) 474e6027f48SAlvin Chang { 475e6027f48SAlvin Chang return -1; 476e6027f48SAlvin Chang } 477e6027f48SAlvin Chang 4784bc2c5f0SSungbae Yoo static inline void init_manifest_dt(void *fdt __unused) 4794bc2c5f0SSungbae Yoo { 4804bc2c5f0SSungbae Yoo } 4814bc2c5f0SSungbae Yoo 4824bc2c5f0SSungbae Yoo static inline void reinit_manifest_dt(void) 4834bc2c5f0SSungbae Yoo { 4844bc2c5f0SSungbae Yoo } 4854bc2c5f0SSungbae Yoo 4864bc2c5f0SSungbae Yoo static inline void *get_manifest_dt(void) 4874bc2c5f0SSungbae Yoo { 4884bc2c5f0SSungbae Yoo return NULL; 4894bc2c5f0SSungbae Yoo } 4904bc2c5f0SSungbae Yoo 491a4f139d7SJerome Forissier #endif /* !CFG_DT */ 492*578bc4feSEtienne Carriere 493*578bc4feSEtienne Carriere #ifdef CFG_DT_CACHED_NODE_INFO 494*578bc4feSEtienne Carriere /* 495*578bc4feSEtienne Carriere * Find the offset of a parent node in the parent node cache 496*578bc4feSEtienne Carriere * @fdt: FDT to work on 497*578bc4feSEtienne Carriere * @node_offset: Offset of the node we look for its parent 498*578bc4feSEtienne Carriere * @parent_offset: Output parent node offset upon success 499*578bc4feSEtienne Carriere * @return 0 on success and -1 on failure 500*578bc4feSEtienne Carriere */ 501*578bc4feSEtienne Carriere int fdt_find_cached_parent_node(const void *fdt, int node_offset, 502*578bc4feSEtienne Carriere int *parent_offset); 503*578bc4feSEtienne Carriere 504*578bc4feSEtienne Carriere /* 505*578bc4feSEtienne Carriere * Find the address/size cells value of a parent node in the parent node cache 506*578bc4feSEtienne Carriere * @fdt: FDT to work on 507*578bc4feSEtienne Carriere * @node_offset: Offset of the node we look for its parent 508*578bc4feSEtienne Carriere * @address_cells: Pointer to output #address-cells value upon success or NULL 509*578bc4feSEtienne Carriere * @size_cells: Pointer to output #size-cells value upon success or NULL 510*578bc4feSEtienne Carriere * @return 0 on success and -FDT_ERR_NOTFOUND on failure 511*578bc4feSEtienne Carriere */ 512*578bc4feSEtienne Carriere int fdt_find_cached_parent_reg_cells(const void *fdt, int node_offset, 513*578bc4feSEtienne Carriere int *address_cells, int *size_cells); 514*578bc4feSEtienne Carriere /* 515*578bc4feSEtienne Carriere * Find the node offset from its phandle in the phandle cache 516*578bc4feSEtienne Carriere * @fdt: FDT to work on 517*578bc4feSEtienne Carriere * @phandle: Node phandle 518*578bc4feSEtienne Carriere * @node_offset: Pointer to output node offset upon success 519*578bc4feSEtienne Carriere * @return 0 on success and -FDT_ERR_NOTFOUND on failure 520*578bc4feSEtienne Carriere */ 521*578bc4feSEtienne Carriere int fdt_find_cached_node_phandle(const void *fdt, uint32_t phandle, 522*578bc4feSEtienne Carriere int *node_offset); 523*578bc4feSEtienne Carriere #else 524*578bc4feSEtienne Carriere static inline int fdt_find_cached_parent_node(const void *fdt __unused, 525*578bc4feSEtienne Carriere int node_offset __unused, 526*578bc4feSEtienne Carriere int *parent_offset __unused) 527*578bc4feSEtienne Carriere { 528*578bc4feSEtienne Carriere return -1; 529*578bc4feSEtienne Carriere } 530*578bc4feSEtienne Carriere 531*578bc4feSEtienne Carriere static inline int fdt_find_cached_parent_reg_cells(const void *fdt __unused, 532*578bc4feSEtienne Carriere int node_offset __unused, 533*578bc4feSEtienne Carriere int *address_cells __unused, 534*578bc4feSEtienne Carriere int *size_cells __unused) 535*578bc4feSEtienne Carriere { 536*578bc4feSEtienne Carriere return -1; 537*578bc4feSEtienne Carriere } 538*578bc4feSEtienne Carriere 539*578bc4feSEtienne Carriere static inline int fdt_find_cached_node_phandle(const void *fdt __unused, 540*578bc4feSEtienne Carriere uint32_t phandle __unused, 541*578bc4feSEtienne Carriere int *node_offset __unused) 542*578bc4feSEtienne Carriere { 543*578bc4feSEtienne Carriere return -1; 544*578bc4feSEtienne Carriere } 545*578bc4feSEtienne Carriere #endif /* CFG_DT_CACHED_NODE_INFO */ 546d50fee03SEtienne Carriere #endif /* __KERNEL_DT_H */ 547