uboot/include/fdt_support.h
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2007
   3 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7
   8#ifndef __FDT_SUPPORT_H
   9#define __FDT_SUPPORT_H
  10
  11#ifdef CONFIG_OF_LIBFDT
  12
  13#include <libfdt.h>
  14
  15u32 fdt_getprop_u32_default_node(const void *fdt, int off, int cell,
  16                                const char *prop, const u32 dflt);
  17u32 fdt_getprop_u32_default(const void *fdt, const char *path,
  18                                const char *prop, const u32 dflt);
  19
  20/**
  21 * Add data to the root of the FDT before booting the OS.
  22 *
  23 * See doc/device-tree-bindings/root.txt
  24 *
  25 * @param fdt           FDT address in memory
  26 * @return 0 if ok, or -FDT_ERR_... on error
  27 */
  28int fdt_root(void *fdt);
  29
  30/**
  31 * Add chosen data the FDT before booting the OS.
  32 *
  33 * In particular, this adds the kernel command line (bootargs) to the FDT.
  34 *
  35 * @param fdt           FDT address in memory
  36 * @return 0 if ok, or -FDT_ERR_... on error
  37 */
  38int fdt_chosen(void *fdt);
  39
  40/**
  41 * Add initrd information to the FDT before booting the OS.
  42 *
  43 * @param fdt           FDT address in memory
  44 * @return 0 if ok, or -FDT_ERR_... on error
  45 */
  46int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end);
  47
  48void do_fixup_by_path(void *fdt, const char *path, const char *prop,
  49                      const void *val, int len, int create);
  50void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop,
  51                          u32 val, int create);
  52
  53static inline void do_fixup_by_path_string(void *fdt, const char *path,
  54                                           const char *prop, const char *status)
  55{
  56        do_fixup_by_path(fdt, path, prop, status, strlen(status) + 1, 1);
  57}
  58
  59void do_fixup_by_prop(void *fdt,
  60                      const char *pname, const void *pval, int plen,
  61                      const char *prop, const void *val, int len,
  62                      int create);
  63void do_fixup_by_prop_u32(void *fdt,
  64                          const char *pname, const void *pval, int plen,
  65                          const char *prop, u32 val, int create);
  66void do_fixup_by_compat(void *fdt, const char *compat,
  67                        const char *prop, const void *val, int len, int create);
  68void do_fixup_by_compat_u32(void *fdt, const char *compat,
  69                            const char *prop, u32 val, int create);
  70/**
  71 * Setup the memory node in the DT. Creates one if none was existing before.
  72 * Calls fdt_fixup_memory_banks() to populate a single reg pair covering the
  73 * whole memory.
  74 *
  75 * @param blob          FDT blob to update
  76 * @param start         Begin of DRAM mapping in physical memory
  77 * @param size          Size of the single memory bank
  78 * @return 0 if ok, or -1 or -FDT_ERR_... on error
  79 */
  80int fdt_fixup_memory(void *blob, u64 start, u64 size);
  81
  82/**
  83 * Fill the DT memory node with multiple memory banks.
  84 * Creates the node if none was existing before.
  85 * If banks is 0, it will not touch the existing reg property. This allows
  86 * boards to not mess with the existing DT setup, which may have been
  87 * filled in properly before.
  88 *
  89 * @param blob          FDT blob to update
  90 * @param start         Array of size <banks> to hold the start addresses.
  91 * @param size          Array of size <banks> to hold the size of each region.
  92 * @param banks         Number of memory banks to create. If 0, the reg
  93 *                      property will be left untouched.
  94 * @return 0 if ok, or -1 or -FDT_ERR_... on error
  95 */
  96#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY
  97int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks);
  98#else
  99static inline int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[],
 100                                         int banks)
 101{
 102        return 0;
 103}
 104#endif
 105
 106void fdt_fixup_ethernet(void *fdt);
 107int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
 108                         const void *val, int len, int create);
 109void fdt_fixup_qe_firmware(void *fdt);
 110
 111/**
 112 * Update native-mode property of display-timings node to the phandle
 113 * of the timings matching a display by name (case insensitive).
 114 *
 115 * see kernel Documentation/devicetree/bindings/video/display-timing.txt
 116 *
 117 * @param blob          FDT blob to update
 118 * @param path          path within dt
 119 * @param display       name of display timing to match
 120 * @return 0 if ok, or -FDT_ERR_... on error
 121 */
 122int fdt_fixup_display(void *blob, const char *path, const char *display);
 123
 124#if defined(CONFIG_USB_EHCI_FSL) || defined(CONFIG_USB_XHCI_FSL)
 125void fsl_fdt_fixup_dr_usb(void *blob, bd_t *bd);
 126#else
 127static inline void fsl_fdt_fixup_dr_usb(void *blob, bd_t *bd) {}
 128#endif /* defined(CONFIG_USB_EHCI_FSL) || defined(CONFIG_USB_XHCI_FSL) */
 129
 130#if defined(CONFIG_SYS_FSL_SEC_COMPAT)
 131void fdt_fixup_crypto_node(void *blob, int sec_rev);
 132#else
 133static inline void fdt_fixup_crypto_node(void *blob, int sec_rev) {}
 134#endif
 135
 136#ifdef CONFIG_PCI
 137#include <pci.h>
 138int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);
 139#endif
 140
 141int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name);
 142
 143/**
 144 * Add board-specific data to the FDT before booting the OS.
 145 *
 146 * Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
 147 * This function is called if CONFIG_OF_BOARD_SETUP is defined
 148 *
 149 * @param blob          FDT blob to update
 150 * @param bd_t          Pointer to board data
 151 * @return 0 if ok, or -FDT_ERR_... on error
 152 */
 153int ft_board_setup(void *blob, bd_t *bd);
 154
 155/*
 156 * The keystone2 SOC requires all 32 bit aliased addresses to be converted
 157 * to their 36 physical format. This has to happen after all fdt nodes
 158 * are added or modified by the image_setup_libfdt(). The ft_board_setup_ex()
 159 * called at the end of the image_setup_libfdt() is to do that convertion.
 160 */
 161void ft_board_setup_ex(void *blob, bd_t *bd);
 162void ft_cpu_setup(void *blob, bd_t *bd);
 163void ft_pci_setup(void *blob, bd_t *bd);
 164
 165/**
 166 * Add system-specific data to the FDT before booting the OS.
 167 *
 168 * Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
 169 * This function is called if CONFIG_OF_SYSTEM_SETUP is defined
 170 *
 171 * @param blob          FDT blob to update
 172 * @param bd_t          Pointer to board data
 173 * @return 0 if ok, or -FDT_ERR_... on error
 174 */
 175int ft_system_setup(void *blob, bd_t *bd);
 176
 177void set_working_fdt_addr(ulong addr);
 178
 179/**
 180 * shrink down the given blob to minimum size + some extrasize if required
 181 *
 182 * @param blob          FDT blob to update
 183 * @param extrasize     additional bytes needed
 184 * @return 0 if ok, or -FDT_ERR_... on error
 185 */
 186int fdt_shrink_to_minimum(void *blob, uint extrasize);
 187int fdt_increase_size(void *fdt, int add_len);
 188
 189int fdt_fixup_nor_flash_size(void *blob);
 190
 191#if defined(CONFIG_FDT_FIXUP_PARTITIONS)
 192void fdt_fixup_mtdparts(void *fdt, void *node_info, int node_info_size);
 193#else
 194static inline void fdt_fixup_mtdparts(void *fdt, void *node_info,
 195                                        int node_info_size) {}
 196#endif
 197
 198void fdt_del_node_and_alias(void *blob, const char *alias);
 199u64 fdt_translate_address(const void *blob, int node_offset,
 200                          const __be32 *in_addr);
 201int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
 202                                        phys_addr_t compat_off);
 203int fdt_alloc_phandle(void *blob);
 204int fdt_set_phandle(void *fdt, int nodeoffset, uint32_t phandle);
 205unsigned int fdt_create_phandle(void *fdt, int nodeoffset);
 206int fdt_add_edid(void *blob, const char *compat, unsigned char *buf);
 207
 208int fdt_verify_alias_address(void *fdt, int anode, const char *alias,
 209                              u64 addr);
 210u64 fdt_get_base_address(void *fdt, int node);
 211int fdt_read_range(void *fdt, int node, int n, uint64_t *child_addr,
 212                   uint64_t *addr, uint64_t *len);
 213
 214enum fdt_status {
 215        FDT_STATUS_OKAY,
 216        FDT_STATUS_DISABLED,
 217        FDT_STATUS_FAIL,
 218        FDT_STATUS_FAIL_ERROR_CODE,
 219};
 220int fdt_set_node_status(void *fdt, int nodeoffset,
 221                        enum fdt_status status, unsigned int error_code);
 222static inline int fdt_status_okay(void *fdt, int nodeoffset)
 223{
 224        return fdt_set_node_status(fdt, nodeoffset, FDT_STATUS_OKAY, 0);
 225}
 226static inline int fdt_status_disabled(void *fdt, int nodeoffset)
 227{
 228        return fdt_set_node_status(fdt, nodeoffset, FDT_STATUS_DISABLED, 0);
 229}
 230static inline int fdt_status_fail(void *fdt, int nodeoffset)
 231{
 232        return fdt_set_node_status(fdt, nodeoffset, FDT_STATUS_FAIL, 0);
 233}
 234
 235int fdt_set_status_by_alias(void *fdt, const char *alias,
 236                            enum fdt_status status, unsigned int error_code);
 237static inline int fdt_status_okay_by_alias(void *fdt, const char *alias)
 238{
 239        return fdt_set_status_by_alias(fdt, alias, FDT_STATUS_OKAY, 0);
 240}
 241static inline int fdt_status_disabled_by_alias(void *fdt, const char *alias)
 242{
 243        return fdt_set_status_by_alias(fdt, alias, FDT_STATUS_DISABLED, 0);
 244}
 245static inline int fdt_status_fail_by_alias(void *fdt, const char *alias)
 246{
 247        return fdt_set_status_by_alias(fdt, alias, FDT_STATUS_FAIL, 0);
 248}
 249
 250/* Helper to read a big number; size is in cells (not bytes) */
 251static inline u64 of_read_number(const fdt32_t *cell, int size)
 252{
 253        u64 r = 0;
 254        while (size--)
 255                r = (r << 32) | fdt32_to_cpu(*(cell++));
 256        return r;
 257}
 258
 259void of_bus_default_count_cells(const void *blob, int parentoffset,
 260                                        int *addrc, int *sizec);
 261int ft_verify_fdt(void *fdt);
 262int arch_fixup_memory_node(void *blob);
 263
 264int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
 265                            u32 height, u32 stride, const char *format);
 266
 267#endif /* ifdef CONFIG_OF_LIBFDT */
 268
 269#ifdef USE_HOSTCC
 270int fdtdec_get_int(const void *blob, int node, const char *prop_name,
 271                int default_val);
 272#endif
 273#endif /* ifndef __FDT_SUPPORT_H */
 274