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 /* 178*de56c16dSEtienne Carriere * Read the base address and/or reg size for the "reg" property of the 179*de56c16dSEtienne Carriere * specified node. 180*de56c16dSEtienne Carriere * @fdt: Reference to the Device Tree 181*de56c16dSEtienne Carriere * @offs: Offset to the node to read "reg" property from 182*de56c16dSEtienne Carriere * @base: Pointer to the output base address value, or NULL 183*de56c16dSEtienne Carriere * @size: Pointer to the output size value, or NULL 184*de56c16dSEtienne Carriere * Returns 0 on success and a negative FDT error value in case of failure 185*de56c16dSEtienne Carriere */ 186*de56c16dSEtienne Carriere int fdt_reg_info(const void *fdt, int offs, paddr_t *base, size_t *size); 187*de56c16dSEtienne Carriere 188*de56c16dSEtienne Carriere /* 1899fe4c797SJerome Forissier * Read the status and secure-status properties into a bitfield. 190c020046dSEtienne Carriere * Return -1 on failure, DT_STATUS_DISABLED if the node is disabled, 191c020046dSEtienne Carriere * otherwise return a combination of DT_STATUS_OK_NSEC and DT_STATUS_OK_SEC. 1929fe4c797SJerome Forissier */ 193f354a5d8SGatien Chevallier int fdt_get_status(const void *fdt, int offs); 1949fe4c797SJerome Forissier 195c0cfb36cSEtienne Carriere /* 196c0cfb36cSEtienne Carriere * fdt_fill_device_info - Get generic device info from a node 197c0cfb36cSEtienne Carriere * 198c0cfb36cSEtienne Carriere * This function fills the generic information from a given node. 199c0cfb36cSEtienne Carriere * Currently supports a single base register, a single clock, 200c0cfb36cSEtienne Carriere * a single reset ID line and a single interrupt ID. 201c0cfb36cSEtienne Carriere * Default DT_INFO_* macros are used when the relate property is not found. 202c0cfb36cSEtienne Carriere */ 203f354a5d8SGatien Chevallier void fdt_fill_device_info(const void *fdt, struct dt_node_info *info, 204df45c114SEtienne Carriere int node); 205876826f3SGabriel Fernandez /* 206876826f3SGabriel Fernandez * Read cells from a given property of the given node. Any number of 32-bit 207876826f3SGabriel Fernandez * cells of the property can be read. Returns 0 on success, or a negative 208876826f3SGabriel Fernandez * FDT error value otherwise. 209876826f3SGabriel Fernandez */ 210f354a5d8SGatien Chevallier int fdt_read_uint32_array(const void *fdt, int node, const char *prop_name, 211876826f3SGabriel Fernandez uint32_t *array, size_t count); 212876826f3SGabriel Fernandez 213876826f3SGabriel Fernandez /* 2147c3a6b7bSGatien Chevallier * Read one cell from a given multi-value property of the given node. 2157c3a6b7bSGatien Chevallier * Returns 0 on success, or a negative FDT error value otherwise. 2167c3a6b7bSGatien Chevallier */ 2177c3a6b7bSGatien Chevallier int fdt_read_uint32_index(const void *fdt, int node, const char *prop_name, 2187c3a6b7bSGatien Chevallier int index, uint32_t *value); 2197c3a6b7bSGatien Chevallier 2207c3a6b7bSGatien Chevallier /* 221876826f3SGabriel Fernandez * Read one cell from a given property of the given node. 222876826f3SGabriel Fernandez * Returns 0 on success, or a negative FDT error value otherwise. 223876826f3SGabriel Fernandez */ 224f354a5d8SGatien Chevallier int fdt_read_uint32(const void *fdt, int node, const char *prop_name, 225876826f3SGabriel Fernandez uint32_t *value); 226876826f3SGabriel Fernandez 227876826f3SGabriel Fernandez /* 228876826f3SGabriel Fernandez * Read one cell from a property of a cell or default to a given value 229876826f3SGabriel Fernandez * Returns the 32bit cell value or @dflt_value on failure. 230876826f3SGabriel Fernandez */ 231f354a5d8SGatien Chevallier uint32_t fdt_read_uint32_default(const void *fdt, int node, 232876826f3SGabriel Fernandez const char *prop_name, uint32_t dflt_value); 233876826f3SGabriel Fernandez 234876826f3SGabriel Fernandez /* 23507ced948SGatien Chevallier * This function fills reg node info (base & size) with an index. 23607ced948SGatien Chevallier * 23707ced948SGatien Chevallier * Returns 0 on success and a negative FDT error code on failure. 23807ced948SGatien Chevallier */ 23907ced948SGatien Chevallier int fdt_get_reg_props_by_index(const void *fdt, int node, int index, 24007ced948SGatien Chevallier paddr_t *base, size_t *size); 24107ced948SGatien Chevallier 24207ced948SGatien Chevallier /* 24307ced948SGatien Chevallier * This function fills reg node info (base & size) with an index found by 24407ced948SGatien Chevallier * checking the reg-names node. 24507ced948SGatien Chevallier * 24607ced948SGatien Chevallier * Returns 0 on success and a negative FDT error code on failure. 24707ced948SGatien Chevallier */ 24807ced948SGatien Chevallier int fdt_get_reg_props_by_name(const void *fdt, int node, const char *name, 24907ced948SGatien Chevallier paddr_t *base, size_t *size); 25007ced948SGatien Chevallier 251c5e3e79fSSungbae Yoo /* 252c5e3e79fSSungbae Yoo * Returns embedded DTB if present, then external DTB if found, 253c5e3e79fSSungbae Yoo * then manifest DTB if found, then NULL. 254c5e3e79fSSungbae Yoo */ 255e6027f48SAlvin Chang void *get_dt(void); 256e6027f48SAlvin Chang 257e6027f48SAlvin Chang /* 258e6027f48SAlvin Chang * get_secure_dt() - returns secure DTB for drivers 259e6027f48SAlvin Chang * 260e6027f48SAlvin Chang * Returns device tree that is considered secure for drivers to use. 261e6027f48SAlvin Chang * 262e6027f48SAlvin Chang * 1. Returns embedded DTB if available, 263e6027f48SAlvin Chang * 2. Secure external DTB if available, 264c5e3e79fSSungbae Yoo * 3. Manifest DTB if available, 265c5e3e79fSSungbae Yoo * 4. If neither then NULL 266e6027f48SAlvin Chang */ 267e6027f48SAlvin Chang void *get_secure_dt(void); 268e6027f48SAlvin Chang 269e6027f48SAlvin Chang /* Returns embedded DTB location if present, otherwise NULL */ 270e6027f48SAlvin Chang void *get_embedded_dt(void); 271e6027f48SAlvin Chang 272e6027f48SAlvin Chang /* Returns true if passed DTB is same as Embedded DTB, otherwise false */ 273e6027f48SAlvin Chang static inline bool is_embedded_dt(void *fdt) 274e6027f48SAlvin Chang { 275e6027f48SAlvin Chang return fdt && fdt == get_embedded_dt(); 276e6027f48SAlvin Chang } 277e6027f48SAlvin Chang 278e6027f48SAlvin Chang /* Returns DTB descriptor of the external DTB if present, otherwise NULL */ 279e6027f48SAlvin Chang struct dt_descriptor *get_external_dt_desc(void); 280e6027f48SAlvin Chang 281e6027f48SAlvin Chang /* 282e6027f48SAlvin Chang * init_external_dt() - Initialize the external DTB located at given address. 283e6027f48SAlvin Chang * @phys_dt: Physical address where the external DTB located. 284dcff802bSRaymond Mao * @dt_sz: Maximum size of the external DTB. 285e6027f48SAlvin Chang * 286e6027f48SAlvin Chang * Initialize the external DTB. 287e6027f48SAlvin Chang * 288e6027f48SAlvin Chang * 1. Add MMU mapping of the external DTB, 289e6027f48SAlvin Chang * 2. Initialize device tree overlay 290e6027f48SAlvin Chang */ 291dcff802bSRaymond Mao void init_external_dt(unsigned long phys_dt, size_t dt_sz); 292e6027f48SAlvin Chang 293e6027f48SAlvin Chang /* Returns external DTB if present, otherwise NULL */ 294e6027f48SAlvin Chang void *get_external_dt(void); 295e6027f48SAlvin Chang 296e6027f48SAlvin Chang /* 297e6027f48SAlvin Chang * add_dt_path_subnode() - Add new child node into a parent node. 298e6027f48SAlvin Chang * @dt: Pointer to a device tree descriptor which has DTB. 299e6027f48SAlvin Chang * @path: Path to the parent node. 300e6027f48SAlvin Chang * @subnode: Name of the child node. 301e6027f48SAlvin Chang * 3020c49b6d6SAlvin Chang * Returns the offset of the child node in DTB on success or a negative libfdt 3030c49b6d6SAlvin Chang * error number. 304e6027f48SAlvin Chang */ 305e6027f48SAlvin Chang int add_dt_path_subnode(struct dt_descriptor *dt, const char *path, 306e6027f48SAlvin Chang const char *subnode); 307e6027f48SAlvin Chang 308e6027f48SAlvin Chang /* 309e6027f48SAlvin Chang * add_res_mem_dt_node() - Create "reserved-memory" parent and child nodes. 310e6027f48SAlvin Chang * @dt: Pointer to a device tree descriptor which has DTB. 311e6027f48SAlvin Chang * @name: Name of the child node. 312e6027f48SAlvin Chang * @pa: Physical address of specific reserved memory region. 313e6027f48SAlvin Chang * @size: Size of specific reserved memory region. 314e6027f48SAlvin Chang * 3150c49b6d6SAlvin Chang * Returns 0 if succeeds, otherwise a negative libfdt error number. 316e6027f48SAlvin Chang */ 317e6027f48SAlvin Chang int add_res_mem_dt_node(struct dt_descriptor *dt, const char *name, 318e6027f48SAlvin Chang paddr_t pa, size_t size); 319e6027f48SAlvin Chang 3204bc2c5f0SSungbae Yoo /* 3214bc2c5f0SSungbae Yoo * init_manifest_dt() - Initialize the manifest DTB to given address. 3224bc2c5f0SSungbae Yoo * @fdt: Physical address where the manifest DTB located. 3234bc2c5f0SSungbae Yoo * 3244bc2c5f0SSungbae Yoo * Initialize the manifest DTB to physical address 3254bc2c5f0SSungbae Yoo */ 3264bc2c5f0SSungbae Yoo void init_manifest_dt(void *fdt); 3274bc2c5f0SSungbae Yoo 3284bc2c5f0SSungbae Yoo /* 3294bc2c5f0SSungbae Yoo * reinit_manifest_dt() - Reinitialize the manifest DTB 3304bc2c5f0SSungbae Yoo * 3314bc2c5f0SSungbae Yoo * Add MMU mapping of the manifest DTB and initialize device tree overlay 3324bc2c5f0SSungbae Yoo */ 3334bc2c5f0SSungbae Yoo void reinit_manifest_dt(void); 3344bc2c5f0SSungbae Yoo 3354bc2c5f0SSungbae Yoo /* Returns TOS_FW_CONFIG DTB or SP manifest DTB if present, otherwise NULL */ 3364bc2c5f0SSungbae Yoo void *get_manifest_dt(void); 3374bc2c5f0SSungbae Yoo 3389fe4c797SJerome Forissier #else /* !CFG_DT */ 339a4f139d7SJerome Forissier 340a4f139d7SJerome Forissier static inline const struct dt_driver *dt_find_compatible_driver( 341a4f139d7SJerome Forissier const void *fdt __unused, 342a4f139d7SJerome Forissier int offs __unused) 343a4f139d7SJerome Forissier { 344a4f139d7SJerome Forissier return NULL; 345a4f139d7SJerome Forissier } 346a4f139d7SJerome Forissier 3477ba16abbSJerome Forissier static inline int dt_map_dev(const void *fdt __unused, int offs __unused, 348a5d5bbc8SVesa Jääskeläinen vaddr_t *vbase __unused, size_t *size __unused, 349a5d5bbc8SVesa Jääskeläinen enum dt_map_dev_directive mapping __unused) 3507ba16abbSJerome Forissier { 3517ba16abbSJerome Forissier return -1; 3527ba16abbSJerome Forissier } 3537ba16abbSJerome Forissier 354f354a5d8SGatien Chevallier static inline paddr_t fdt_reg_base_address(const void *fdt __unused, 3559fe4c797SJerome Forissier int offs __unused) 3569fe4c797SJerome Forissier { 3579fe4c797SJerome Forissier return (paddr_t)-1; 3589fe4c797SJerome Forissier } 3599fe4c797SJerome Forissier 360f354a5d8SGatien Chevallier static inline size_t fdt_reg_size(const void *fdt __unused, 3619fe4c797SJerome Forissier int offs __unused) 3629fe4c797SJerome Forissier { 363df7cecc0SLionel Debieve return (size_t)-1; 3649fe4c797SJerome Forissier } 3659fe4c797SJerome Forissier 366*de56c16dSEtienne Carriere static inline int fdt_reg_info(const void *fdt __unused, int offs __unused, 367*de56c16dSEtienne Carriere paddr_t *base __unused, size_t *size __unused) 368*de56c16dSEtienne Carriere { 369*de56c16dSEtienne Carriere return -1; 370*de56c16dSEtienne Carriere } 371*de56c16dSEtienne Carriere 372f354a5d8SGatien Chevallier static inline int fdt_get_status(const void *fdt __unused, int offs __unused) 3739fe4c797SJerome Forissier { 3749fe4c797SJerome Forissier return -1; 3759fe4c797SJerome Forissier } 3769fe4c797SJerome Forissier 3771e866588SJerome Forissier __noreturn 378f354a5d8SGatien Chevallier static inline void fdt_fill_device_info(const void *fdt __unused, 379c0cfb36cSEtienne Carriere struct dt_node_info *info __unused, 380c0cfb36cSEtienne Carriere int node __unused) 381c0cfb36cSEtienne Carriere { 382c0cfb36cSEtienne Carriere panic(); 383c0cfb36cSEtienne Carriere } 384876826f3SGabriel Fernandez 385f354a5d8SGatien Chevallier static inline int fdt_read_uint32_array(const void *fdt __unused, 386876826f3SGabriel Fernandez int node __unused, 387876826f3SGabriel Fernandez const char *prop_name __unused, 388876826f3SGabriel Fernandez uint32_t *array __unused, 389876826f3SGabriel Fernandez size_t count __unused) 390876826f3SGabriel Fernandez { 391876826f3SGabriel Fernandez return -1; 392876826f3SGabriel Fernandez } 393876826f3SGabriel Fernandez 394f354a5d8SGatien Chevallier static inline int fdt_read_uint32(const void *fdt __unused, 395876826f3SGabriel Fernandez int node __unused, 396876826f3SGabriel Fernandez const char *prop_name __unused, 397876826f3SGabriel Fernandez uint32_t *value __unused) 398876826f3SGabriel Fernandez { 399876826f3SGabriel Fernandez return -1; 400876826f3SGabriel Fernandez } 401876826f3SGabriel Fernandez 402f354a5d8SGatien Chevallier static inline uint32_t fdt_read_uint32_default(const void *fdt __unused, 403876826f3SGabriel Fernandez int node __unused, 404876826f3SGabriel Fernandez const char *prop_name __unused, 405876826f3SGabriel Fernandez uint32_t dflt_value __unused) 406876826f3SGabriel Fernandez { 407876826f3SGabriel Fernandez return dflt_value; 408876826f3SGabriel Fernandez } 409876826f3SGabriel Fernandez 4107c3a6b7bSGatien Chevallier static inline int fdt_read_uint32_index(const void *fdt __unused, 4117c3a6b7bSGatien Chevallier int node __unused, 4127c3a6b7bSGatien Chevallier const char *prop_name __unused, 4137c3a6b7bSGatien Chevallier int index __unused, 4147c3a6b7bSGatien Chevallier uint32_t *value __unused) 4157c3a6b7bSGatien Chevallier { 4167c3a6b7bSGatien Chevallier return -1; 4177c3a6b7bSGatien Chevallier } 4187c3a6b7bSGatien Chevallier 41907ced948SGatien Chevallier static inline int fdt_get_reg_props_by_index(const void *fdt __unused, 42007ced948SGatien Chevallier int node __unused, 42107ced948SGatien Chevallier int index __unused, 42207ced948SGatien Chevallier paddr_t *base __unused, 42307ced948SGatien Chevallier size_t *size __unused) 42407ced948SGatien Chevallier { 42507ced948SGatien Chevallier return -1; 42607ced948SGatien Chevallier } 42707ced948SGatien Chevallier 42807ced948SGatien Chevallier static inline int fdt_get_reg_props_by_name(const void *fdt __unused, 42907ced948SGatien Chevallier int node __unused, 43007ced948SGatien Chevallier const char *name __unused, 43107ced948SGatien Chevallier paddr_t *base __unused, 43207ced948SGatien Chevallier size_t *size __unused) 43307ced948SGatien Chevallier { 43407ced948SGatien Chevallier return -1; 43507ced948SGatien Chevallier } 43607ced948SGatien Chevallier 4375a982d0eSJens Wiklander static inline int dt_getprop_as_number(const void *fdt __unused, 4385a982d0eSJens Wiklander int nodeoffset __unused, 4395a982d0eSJens Wiklander const char *name __unused, 4405a982d0eSJens Wiklander uint64_t *num __unused) 4415a982d0eSJens Wiklander { 4425a982d0eSJens Wiklander return -1; 4435a982d0eSJens Wiklander } 4445a982d0eSJens Wiklander 445e6027f48SAlvin Chang static inline void *get_dt(void) 446e6027f48SAlvin Chang { 447e6027f48SAlvin Chang return NULL; 448e6027f48SAlvin Chang } 449e6027f48SAlvin Chang 450e6027f48SAlvin Chang static inline void *get_secure_dt(void) 451e6027f48SAlvin Chang { 452e6027f48SAlvin Chang return NULL; 453e6027f48SAlvin Chang } 454e6027f48SAlvin Chang 455e6027f48SAlvin Chang static inline void *get_embedded_dt(void) 456e6027f48SAlvin Chang { 457e6027f48SAlvin Chang return NULL; 458e6027f48SAlvin Chang } 459e6027f48SAlvin Chang 460e6027f48SAlvin Chang static inline bool is_embedded_dt(void *fdt __unused) 461e6027f48SAlvin Chang { 462e6027f48SAlvin Chang return false; 463e6027f48SAlvin Chang } 464e6027f48SAlvin Chang 465e6027f48SAlvin Chang static inline struct dt_descriptor *get_external_dt_desc(void) 466e6027f48SAlvin Chang { 467e6027f48SAlvin Chang return NULL; 468e6027f48SAlvin Chang } 469e6027f48SAlvin Chang 470dcff802bSRaymond Mao static inline void init_external_dt(unsigned long phys_dt __unused, 471dcff802bSRaymond Mao size_t dt_sz __unused) 472e6027f48SAlvin Chang { 473e6027f48SAlvin Chang } 474e6027f48SAlvin Chang 475e6027f48SAlvin Chang static inline void *get_external_dt(void) 476e6027f48SAlvin Chang { 477e6027f48SAlvin Chang return NULL; 478e6027f48SAlvin Chang } 479e6027f48SAlvin Chang 480e6027f48SAlvin Chang static inline int add_dt_path_subnode(struct dt_descriptor *dt __unused, 481e6027f48SAlvin Chang const char *path __unused, 482e6027f48SAlvin Chang const char *subnode __unused) 483e6027f48SAlvin Chang { 484e6027f48SAlvin Chang return -1; 485e6027f48SAlvin Chang } 486e6027f48SAlvin Chang 487e6027f48SAlvin Chang static inline int add_res_mem_dt_node(struct dt_descriptor *dt __unused, 488e6027f48SAlvin Chang const char *name __unused, 489e6027f48SAlvin Chang paddr_t pa __unused, 490e6027f48SAlvin Chang size_t size __unused) 491e6027f48SAlvin Chang { 492e6027f48SAlvin Chang return -1; 493e6027f48SAlvin Chang } 494e6027f48SAlvin Chang 4954bc2c5f0SSungbae Yoo static inline void init_manifest_dt(void *fdt __unused) 4964bc2c5f0SSungbae Yoo { 4974bc2c5f0SSungbae Yoo } 4984bc2c5f0SSungbae Yoo 4994bc2c5f0SSungbae Yoo static inline void reinit_manifest_dt(void) 5004bc2c5f0SSungbae Yoo { 5014bc2c5f0SSungbae Yoo } 5024bc2c5f0SSungbae Yoo 5034bc2c5f0SSungbae Yoo static inline void *get_manifest_dt(void) 5044bc2c5f0SSungbae Yoo { 5054bc2c5f0SSungbae Yoo return NULL; 5064bc2c5f0SSungbae Yoo } 5074bc2c5f0SSungbae Yoo 508a4f139d7SJerome Forissier #endif /* !CFG_DT */ 509578bc4feSEtienne Carriere 510578bc4feSEtienne Carriere #ifdef CFG_DT_CACHED_NODE_INFO 511578bc4feSEtienne Carriere /* 512578bc4feSEtienne Carriere * Find the offset of a parent node in the parent node cache 513578bc4feSEtienne Carriere * @fdt: FDT to work on 514578bc4feSEtienne Carriere * @node_offset: Offset of the node we look for its parent 515578bc4feSEtienne Carriere * @parent_offset: Output parent node offset upon success 516578bc4feSEtienne Carriere * @return 0 on success and -1 on failure 517578bc4feSEtienne Carriere */ 518578bc4feSEtienne Carriere int fdt_find_cached_parent_node(const void *fdt, int node_offset, 519578bc4feSEtienne Carriere int *parent_offset); 520578bc4feSEtienne Carriere 521578bc4feSEtienne Carriere /* 522578bc4feSEtienne Carriere * Find the address/size cells value of a parent node in the parent node cache 523578bc4feSEtienne Carriere * @fdt: FDT to work on 524578bc4feSEtienne Carriere * @node_offset: Offset of the node we look for its parent 525578bc4feSEtienne Carriere * @address_cells: Pointer to output #address-cells value upon success or NULL 526578bc4feSEtienne Carriere * @size_cells: Pointer to output #size-cells value upon success or NULL 527578bc4feSEtienne Carriere * @return 0 on success and -FDT_ERR_NOTFOUND on failure 528578bc4feSEtienne Carriere */ 529578bc4feSEtienne Carriere int fdt_find_cached_parent_reg_cells(const void *fdt, int node_offset, 530578bc4feSEtienne Carriere int *address_cells, int *size_cells); 531578bc4feSEtienne Carriere /* 532578bc4feSEtienne Carriere * Find the node offset from its phandle in the phandle cache 533578bc4feSEtienne Carriere * @fdt: FDT to work on 534578bc4feSEtienne Carriere * @phandle: Node phandle 535578bc4feSEtienne Carriere * @node_offset: Pointer to output node offset upon success 536578bc4feSEtienne Carriere * @return 0 on success and -FDT_ERR_NOTFOUND on failure 537578bc4feSEtienne Carriere */ 538578bc4feSEtienne Carriere int fdt_find_cached_node_phandle(const void *fdt, uint32_t phandle, 539578bc4feSEtienne Carriere int *node_offset); 540578bc4feSEtienne Carriere #else 541578bc4feSEtienne Carriere static inline int fdt_find_cached_parent_node(const void *fdt __unused, 542578bc4feSEtienne Carriere int node_offset __unused, 543578bc4feSEtienne Carriere int *parent_offset __unused) 544578bc4feSEtienne Carriere { 545578bc4feSEtienne Carriere return -1; 546578bc4feSEtienne Carriere } 547578bc4feSEtienne Carriere 548578bc4feSEtienne Carriere static inline int fdt_find_cached_parent_reg_cells(const void *fdt __unused, 549578bc4feSEtienne Carriere int node_offset __unused, 550578bc4feSEtienne Carriere int *address_cells __unused, 551578bc4feSEtienne Carriere int *size_cells __unused) 552578bc4feSEtienne Carriere { 553578bc4feSEtienne Carriere return -1; 554578bc4feSEtienne Carriere } 555578bc4feSEtienne Carriere 556578bc4feSEtienne Carriere static inline int fdt_find_cached_node_phandle(const void *fdt __unused, 557578bc4feSEtienne Carriere uint32_t phandle __unused, 558578bc4feSEtienne Carriere int *node_offset __unused) 559578bc4feSEtienne Carriere { 560578bc4feSEtienne Carriere return -1; 561578bc4feSEtienne Carriere } 562578bc4feSEtienne Carriere #endif /* CFG_DT_CACHED_NODE_INFO */ 563d50fee03SEtienne Carriere #endif /* __KERNEL_DT_H */ 564