Branch data Line data Source code
1 : : /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2 : : *
3 : : * Copyright 2010-2016 Freescale Semiconductor, Inc.
4 : : * Copyright 2017 NXP
5 : : *
6 : : */
7 : :
8 : : #ifndef __OF_H
9 : : #define __OF_H
10 : :
11 : : #include <unistd.h>
12 : : #include <stdio.h>
13 : : #include <string.h>
14 : : #include <stdbool.h>
15 : : #include <stdlib.h>
16 : : #include <inttypes.h>
17 : : #include <sys/stat.h>
18 : : #include <sys/types.h>
19 : : #include <dirent.h>
20 : : #include <fcntl.h>
21 : : #include <glob.h>
22 : : #include <errno.h>
23 : : #include <ctype.h>
24 : : #include <limits.h>
25 : : #include <rte_common.h>
26 : : #include <dpaa_list.h>
27 : : #include <rte_compat.h>
28 : :
29 : : #ifndef OF_INIT_DEFAULT_PATH
30 : : #define OF_INIT_DEFAULT_PATH "/proc/device-tree"
31 : : #endif
32 : :
33 : : #define OF_DEFAULT_NA 1
34 : : #define OF_DEFAULT_NS 1
35 : :
36 : : #define OF_FILE_BUF_MAX 256
37 : :
38 : : /**
39 : : * Layout of Device Tree:
40 : : * dt_dir
41 : : * |- dt_dir
42 : : * | |- dt_dir
43 : : * | | |- dt_dir
44 : : * | | | |- dt_file
45 : : * | | | ``- dt_file
46 : : * | | ``- dt_file
47 : : * | `-dt_file`
48 : : * ``- dt_file
49 : : *
50 : : * +------------------+
51 : : * |dt_dir |
52 : : * |+----------------+|
53 : : * ||dt_node ||
54 : : * ||+--------------+||
55 : : * |||device_node |||
56 : : * ||+--------------+||
57 : : * || list_dt_nodes ||
58 : : * |+----------------+|
59 : : * | list of subdir |
60 : : * | list of files |
61 : : * +------------------+
62 : : */
63 : :
64 : : /**
65 : : * Device description on of a device node in device tree.
66 : : */
67 : : struct device_node {
68 : : char name[NAME_MAX];
69 : : char full_name[PATH_MAX];
70 : : };
71 : :
72 : : /**
73 : : * List of device nodes available in a device tree layout
74 : : */
75 : : struct dt_node {
76 : : struct device_node node; /**< Property of node */
77 : : int is_file; /**< FALSE==dir, TRUE==file */
78 : : struct list_head list; /**< Nodes within a parent subdir */
79 : : };
80 : :
81 : : /**
82 : : * Types we use to represent directories and files
83 : : */
84 : : struct dt_file;
85 : : struct dt_dir {
86 : : struct dt_node node;
87 : : struct list_head subdirs;
88 : : struct list_head files;
89 : : struct list_head linear;
90 : : struct dt_dir *parent;
91 : : struct dt_file *compatible;
92 : : struct dt_file *status;
93 : : struct dt_file *lphandle;
94 : : struct dt_file *a_cells;
95 : : struct dt_file *s_cells;
96 : : struct dt_file *reg;
97 : : };
98 : :
99 : : struct dt_file {
100 : : struct dt_node node;
101 : : struct dt_dir *parent;
102 : : ssize_t len;
103 : : uint64_t buf[OF_FILE_BUF_MAX >> 3];
104 : : };
105 : :
106 : : __rte_internal
107 : : const struct device_node *of_find_compatible_node(
108 : : const struct device_node *from,
109 : : const char *type __rte_unused,
110 : : const char *compatible)
111 : : __attribute__((nonnull(3)));
112 : :
113 : : #define for_each_compatible_node(dev_node, type, compatible) \
114 : : for (dev_node = of_find_compatible_node(NULL, type, compatible); \
115 : : dev_node != NULL; \
116 : : dev_node = of_find_compatible_node(dev_node, type, compatible))
117 : :
118 : : __rte_internal
119 : : const void *of_get_property(const struct device_node *from, const char *name,
120 : : size_t *lenp) __attribute__((nonnull(2)));
121 : : __rte_internal
122 : : bool of_device_is_available(const struct device_node *dev_node);
123 : :
124 : : __rte_internal
125 : : const struct device_node *of_find_node_by_phandle(uint64_t ph);
126 : :
127 : : __rte_internal
128 : : const struct device_node *of_get_parent(const struct device_node *dev_node);
129 : :
130 : : __rte_internal
131 : : const struct device_node *of_get_next_child(const struct device_node *dev_node,
132 : : const struct device_node *prev);
133 : :
134 : : __rte_internal
135 : : const void *of_get_mac_address(const struct device_node *np);
136 : :
137 : : #define for_each_child_node(parent, child) \
138 : : for (child = of_get_next_child(parent, NULL); child != NULL; \
139 : : child = of_get_next_child(parent, child))
140 : :
141 : : __rte_internal
142 : : uint32_t of_n_addr_cells(const struct device_node *dev_node);
143 : : uint32_t of_n_size_cells(const struct device_node *dev_node);
144 : :
145 : : __rte_internal
146 : : const uint32_t *of_get_address(const struct device_node *dev_node, size_t idx,
147 : : uint64_t *size, uint32_t *flags);
148 : :
149 : : __rte_internal
150 : : uint64_t of_translate_address(const struct device_node *dev_node,
151 : : const uint32_t *addr) __attribute__((nonnull));
152 : :
153 : : __rte_internal
154 : : bool of_device_is_compatible(const struct device_node *dev_node,
155 : : const char *compatible);
156 : :
157 : : /* of_init() must be called prior to initialisation or use of any driver
158 : : * subsystem that is device-tree-dependent. Eg. Qman/Bman, config layers, etc.
159 : : * The path should usually be "/proc/device-tree".
160 : : */
161 : : __rte_internal
162 : : int of_init_path(const char *dt_path);
163 : :
164 : : /* of_finish() allows a controlled tear-down of the device-tree layer, eg. if a
165 : : * full reload is desired without a process exit.
166 : : */
167 : : void of_finish(void);
168 : :
169 : : /* Use of this wrapper is recommended. */
170 : : static inline int of_init(void)
171 : : {
172 : 0 : return of_init_path(OF_INIT_DEFAULT_PATH);
173 : : }
174 : :
175 : : /* Read a numeric property according to its size and return it as a 64-bit
176 : : * value.
177 : : */
178 : : static inline uint64_t of_read_number(const uint32_t *cell, int size)
179 : : {
180 : : uint64_t r = 0;
181 : :
182 [ # # # # : 0 : while (size--)
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # ]
183 : 0 : r = (r << 32) | be32toh(*(cell++));
184 : : return r;
185 : : }
186 : :
187 : : #endif /* __OF_H */
|