| 1 |
|
| 2 | #ifndef _LINUX_OF_PRIVATE_H
|
| 3 | #define _LINUX_OF_PRIVATE_H
|
| 4 | |
| 5 | * Private symbols used by OF support code
|
| 6 | *
|
| 7 | * Paul Mackerras August 1996.
|
| 8 | * Copyright (C) 1996-2005 Paul Mackerras.
|
| 9 |
|
| 10 |
|
| 11 | #define FDT_ALIGN_SIZE 8
|
| 12 | #define MAX_RESERVED_REGIONS 64
|
| 13 |
|
| 14 | |
| 15 | * struct alias_prop - Alias property in 'aliases' node
|
| 16 | * @link: List node to link the structure in aliases_lookup list
|
| 17 | * @alias: Alias property name
|
| 18 | * @np: Pointer to device_node that the alias stands for
|
| 19 | * @id: Index value from end of alias name
|
| 20 | * @stem: Alias string without the index
|
| 21 | *
|
| 22 | * The structure represents one alias property of 'aliases' node as
|
| 23 | * an entry in aliases_lookup list.
|
| 24 |
|
| 25 | struct alias_prop {
|
| 26 | struct list_head link;
|
| 27 | const char *alias;
|
| 28 | struct device_node *np;
|
| 29 | int id;
|
| 30 | char stem[];
|
| 31 | };
|
| 32 |
|
| 33 | #if defined(CONFIG_SPARC)
|
| 34 | #define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 2
|
| 35 | #else
|
| 36 | #define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1
|
| 37 | #endif
|
| 38 |
|
| 39 | #define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
|
| 40 |
|
| 41 | extern struct mutex of_mutex;
|
| 42 | extern raw_spinlock_t devtree_lock;
|
| 43 | extern struct list_head aliases_lookup;
|
| 44 | extern struct kset *of_kset;
|
| 45 |
|
| 46 | struct kunit;
|
| 47 | extern void of_root_kunit_skip(struct kunit *test);
|
| 48 |
|
| 49 | #if defined(CONFIG_OF_DYNAMIC)
|
| 50 | extern int of_property_notify(int action, struct device_node *np,
|
| 51 | struct property *prop, struct property *old_prop);
|
| 52 | extern void of_node_release(struct kobject *kobj);
|
| 53 | extern int __of_changeset_apply_entries(struct of_changeset *ocs,
|
| 54 | int *ret_revert);
|
| 55 | extern int __of_changeset_apply_notify(struct of_changeset *ocs);
|
| 56 | extern int __of_changeset_revert_entries(struct of_changeset *ocs,
|
| 57 | int *ret_apply);
|
| 58 | extern int __of_changeset_revert_notify(struct of_changeset *ocs);
|
| 59 | #else
|
| 60 | static inline int of_property_notify(int action, struct device_node *np,
|
| 61 | struct property *prop, struct property *old_prop)
|
| 62 | {
|
| 63 | return 0;
|
| 64 | }
|
| 65 | #endif
|
| 66 |
|
| 67 | #if defined(CONFIG_OF_DYNAMIC) && defined(CONFIG_OF_ADDRESS)
|
| 68 | void of_platform_register_reconfig_notifier(void);
|
| 69 | #else
|
| 70 | static inline void of_platform_register_reconfig_notifier(void) { }
|
| 71 | #endif
|
| 72 |
|
| 73 | #if defined(CONFIG_OF_KOBJ)
|
| 74 | int of_node_is_attached(const struct device_node *node);
|
| 75 | int __of_add_property_sysfs(struct device_node *np, struct property *pp);
|
| 76 | void __of_remove_property_sysfs(struct device_node *np, const struct property *prop);
|
| 77 | void __of_update_property_sysfs(struct device_node *np, struct property *newprop,
|
| 78 | const struct property *oldprop);
|
| 79 | int __of_attach_node_sysfs(struct device_node *np);
|
| 80 | void __of_detach_node_sysfs(struct device_node *np);
|
| 81 | #else
|
| 82 | static inline int __of_add_property_sysfs(struct device_node *np, struct property *pp)
|
| 83 | {
|
| 84 | return 0;
|
| 85 | }
|
| 86 | static inline void __of_remove_property_sysfs(struct device_node *np, const struct property *prop) {}
|
| 87 | static inline void __of_update_property_sysfs(struct device_node *np,
|
| 88 | struct property *newprop, const struct property *oldprop) {}
|
| 89 | static inline int __of_attach_node_sysfs(struct device_node *np)
|
| 90 | {
|
| 91 | return 0;
|
| 92 | }
|
| 93 | static inline void __of_detach_node_sysfs(struct device_node *np) {}
|
| 94 | #endif
|
| 95 |
|
| 96 | #if defined(CONFIG_OF_RESOLVE)
|
| 97 | int of_resolve_phandles(struct device_node *tree);
|
| 98 | #endif
|
| 99 |
|
| 100 | void __of_phandle_cache_inv_entry(phandle handle);
|
| 101 |
|
| 102 | #if defined(CONFIG_OF_OVERLAY)
|
| 103 | void of_overlay_mutex_lock(void);
|
| 104 | void of_overlay_mutex_unlock(void);
|
| 105 | #else
|
| 106 | static inline void of_overlay_mutex_lock(void) {};
|
| 107 | static inline void of_overlay_mutex_unlock(void) {};
|
| 108 | #endif
|
| 109 |
|
| 110 | #if defined(CONFIG_OF_UNITTEST) && defined(CONFIG_OF_OVERLAY)
|
| 111 | extern void __init unittest_unflatten_overlay_base(void);
|
| 112 | #else
|
| 113 | static inline void unittest_unflatten_overlay_base(void) {};
|
| 114 | #endif
|
| 115 |
|
| 116 | extern void *__unflatten_device_tree(const void *blob,
|
| 117 | struct device_node *dad,
|
| 118 | struct device_node **mynodes,
|
| 119 | void *(*dt_alloc)(u64 size, u64 align),
|
| 120 | bool detached);
|
| 121 |
|
| 122 | void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align));
|
| 123 |
|
| 124 | |
| 125 | * General utilities for working with live trees.
|
| 126 | *
|
| 127 | * All functions with two leading underscores operate
|
| 128 | * without taking node references, so you either have to
|
| 129 | * own the devtree lock or work on detached trees only.
|
| 130 |
|
| 131 | struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
|
| 132 | void __of_prop_free(struct property *prop);
|
| 133 | struct device_node *__of_node_dup(const struct device_node *np,
|
| 134 | const char *full_name);
|
| 135 |
|
| 136 | struct device_node *__of_find_node_by_path(const struct device_node *parent,
|
| 137 | const char *path);
|
| 138 | struct device_node *__of_find_node_by_full_path(struct device_node *node,
|
| 139 | const char *path);
|
| 140 |
|
| 141 | extern const void *__of_get_property(const struct device_node *np,
|
| 142 | const char *name, int *lenp);
|
| 143 | extern int __of_add_property(struct device_node *np, struct property *prop);
|
| 144 | extern int __of_remove_property(struct device_node *np, struct property *prop);
|
| 145 | extern int __of_update_property(struct device_node *np,
|
| 146 | struct property *newprop, struct property **oldprop);
|
| 147 |
|
| 148 | extern void __of_detach_node(struct device_node *np);
|
| 149 |
|
| 150 | extern void __of_sysfs_remove_bin_file(struct device_node *np,
|
| 151 | const struct property *prop);
|
| 152 |
|
| 153 |
|
| 154 | #define OF_PHANDLE_ILLEGAL 0xdeadbeef
|
| 155 |
|
| 156 |
|
| 157 |
|
| 158 | #define for_each_transaction_entry(_oft, _te) \
|
| 159 | list_for_each_entry(_te, &(_oft)->te_list, node)
|
| 160 |
|
| 161 |
|
| 162 | #define for_each_transaction_entry_reverse(_oft, _te) \
|
| 163 | list_for_each_entry_reverse(_te, &(_oft)->te_list, node)
|
| 164 |
|
| 165 | extern int of_bus_n_addr_cells(struct device_node *np);
|
| 166 | extern int of_bus_n_size_cells(struct device_node *np);
|
| 167 |
|
| 168 | const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len,
|
| 169 | struct of_phandle_args *out_irq);
|
| 170 |
|
| 171 | struct bus_dma_region;
|
| 172 | #if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_HAS_DMA)
|
| 173 | int of_dma_get_range(struct device_node *np,
|
| 174 | const struct bus_dma_region **map);
|
| 175 | struct device_node *__of_get_dma_parent(const struct device_node *np);
|
| 176 | #else
|
| 177 | static inline int of_dma_get_range(struct device_node *np,
|
| 178 | const struct bus_dma_region **map)
|
| 179 | {
|
| 180 | return -ENODEV;
|
| 181 | }
|
| 182 | static inline struct device_node *__of_get_dma_parent(const struct device_node *np)
|
| 183 | {
|
| 184 | return of_get_parent(np);
|
| 185 | }
|
| 186 | #endif
|
| 187 |
|
| 188 | int fdt_scan_reserved_mem(void);
|
| 189 | void __init fdt_scan_reserved_mem_late(void);
|
| 190 |
|
| 191 | bool of_fdt_device_is_available(const void *blob, unsigned long node);
|
| 192 |
|
| 193 |
|
| 194 | #define OF_MAX_ADDR_CELLS 4
|
| 195 | #define OF_CHECK_ADDR_COUNT(na) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS)
|
| 196 | #define OF_CHECK_COUNTS(na, ns) (OF_CHECK_ADDR_COUNT(na) && (ns) > 0)
|
| 197 |
|
| 198 |
|
| 199 | #ifdef DEBUG
|
| 200 | static void __maybe_unused of_dump_addr(const char *s, const __be32 *addr, int na)
|
| 201 | {
|
| 202 | pr_debug("%s", s);
|
| 203 | while (na--)
|
| 204 | pr_cont(" %08x", be32_to_cpu(*(addr++)));
|
| 205 | pr_cont("\n");
|
| 206 | }
|
| 207 | #else
|
| 208 | static void __maybe_unused of_dump_addr(const char *s, const __be32 *addr, int na) { }
|
| 209 | #endif
|
| 210 |
|
| 211 | static inline bool is_pseudo_property(const char *prop_name)
|
| 212 | {
|
| 213 | return !of_prop_cmp(prop_name, "name") ||
|
| 214 | !of_prop_cmp(prop_name, "phandle") ||
|
| 215 | !of_prop_cmp(prop_name, "linux,phandle");
|
| 216 | }
|
| 217 |
|
| 218 | #if IS_ENABLED(CONFIG_KUNIT)
|
| 219 | int __of_address_resource_bounds(struct resource *r, u64 start, u64 size);
|
| 220 | #endif
|
| 221 |
|
| 222 | #endif
|