1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
4 #include <linux/of_device.h>
5 #include <linux/of_address.h>
6 #include <linux/of_iommu.h>
7 #include <linux/of_reserved_mem.h>
8 #include <linux/dma-direct.h> /* for bus_dma_region */
9 #include <linux/dma-map-ops.h>
10 #include <linux/init.h>
11 #include <linux/mod_devicetable.h>
12 #include <linux/slab.h>
13 #include <linux/platform_device.h>
15 #include <asm/errno.h>
16 #include "of_private.h"
19 * of_match_device - Tell if a struct device matches an of_device_id list
20 * @matches: array of of device match structures to search in
21 * @dev: the of device structure to match against
23 * Used by a driver to check whether an platform_device present in the
24 * system is in its list of supported devices.
26 const struct of_device_id
*of_match_device(const struct of_device_id
*matches
,
27 const struct device
*dev
)
29 if (!matches
|| !dev
->of_node
|| dev
->of_node_reused
)
31 return of_match_node(matches
, dev
->of_node
);
33 EXPORT_SYMBOL(of_match_device
);
36 of_dma_set_restricted_buffer(struct device
*dev
, struct device_node
*np
)
38 struct device_node
*node
, *of_node
= dev
->of_node
;
41 if (!IS_ENABLED(CONFIG_DMA_RESTRICTED_POOL
))
44 count
= of_property_count_elems_of_size(of_node
, "memory-region",
47 * If dev->of_node doesn't exist or doesn't contain memory-region, try
48 * the OF node having DMA configuration.
52 count
= of_property_count_elems_of_size(
53 of_node
, "memory-region", sizeof(u32
));
56 for (i
= 0; i
< count
; i
++) {
57 node
= of_parse_phandle(of_node
, "memory-region", i
);
59 * There might be multiple memory regions, but only one
60 * restricted-dma-pool region is allowed.
62 if (of_device_is_compatible(node
, "restricted-dma-pool") &&
63 of_device_is_available(node
)) {
71 * Attempt to initialize a restricted-dma-pool region if one was found.
72 * Note that count can hold a negative error code.
74 if (i
< count
&& of_reserved_mem_device_init_by_idx(dev
, of_node
, i
))
75 dev_warn(dev
, "failed to initialise \"restricted-dma-pool\" memory node\n");
79 * of_dma_configure_id - Setup DMA configuration
80 * @dev: Device to apply DMA configuration
81 * @np: Pointer to OF node having DMA configuration
82 * @force_dma: Whether device is to be set up by of_dma_configure() even if
83 * DMA capability is not explicitly described by firmware.
84 * @id: Optional const pointer value input id
86 * Try to get devices's DMA configuration from DT and update it
89 * If platform code needs to use its own special DMA configuration, it
90 * can use a platform bus notifier and handle BUS_NOTIFY_ADD_DEVICE events
91 * to fix up DMA configuration.
93 int of_dma_configure_id(struct device
*dev
, struct device_node
*np
,
94 bool force_dma
, const u32
*id
)
96 const struct bus_dma_region
*map
= NULL
;
97 struct device_node
*bus_np
;
99 bool coherent
, set_map
= false;
102 if (np
== dev
->of_node
)
103 bus_np
= __of_get_dma_parent(np
);
105 bus_np
= of_node_get(np
);
107 ret
= of_dma_get_range(bus_np
, &map
);
111 * For legacy reasons, we have to assume some devices need
112 * DMA configuration regardless of whether "dma-ranges" is
113 * correctly specified or not.
116 return ret
== -ENODEV
? 0 : ret
;
118 /* Determine the overall bounds of all DMA regions */
119 end
= dma_range_map_max(map
);
124 * If @dev is expected to be DMA-capable then the bus code that created
125 * it should have initialised its dma_mask pointer by this point. For
126 * now, we'll continue the legacy behaviour of coercing it to the
127 * coherent mask if not, but we'll no longer do so quietly.
129 if (!dev
->dma_mask
) {
130 dev_warn(dev
, "DMA mask not set\n");
131 dev
->dma_mask
= &dev
->coherent_dma_mask
;
134 if (!end
&& dev
->coherent_dma_mask
)
135 end
= dev
->coherent_dma_mask
;
137 end
= (1ULL << 32) - 1;
140 * Limit coherent and dma mask based on size and default mask
143 mask
= DMA_BIT_MASK(ilog2(end
) + 1);
144 dev
->coherent_dma_mask
&= mask
;
145 *dev
->dma_mask
&= mask
;
146 /* ...but only set bus limit and range map if we found valid dma-ranges earlier */
148 dev
->bus_dma_limit
= end
;
149 dev
->dma_range_map
= map
;
152 coherent
= of_dma_is_coherent(np
);
153 dev_dbg(dev
, "device is%sdma coherent\n",
154 coherent
? " " : " not ");
156 ret
= of_iommu_configure(dev
, np
, id
);
157 if (ret
== -EPROBE_DEFER
) {
158 /* Don't touch range map if it wasn't set from a valid dma-ranges */
160 dev
->dma_range_map
= NULL
;
162 return -EPROBE_DEFER
;
164 /* Take all other IOMMU errors to mean we'll just carry on without it */
165 dev_dbg(dev
, "device is%sbehind an iommu\n",
166 !ret
? " " : " not ");
168 arch_setup_dma_ops(dev
, coherent
);
171 of_dma_set_restricted_buffer(dev
, np
);
175 EXPORT_SYMBOL_GPL(of_dma_configure_id
);
177 const void *of_device_get_match_data(const struct device
*dev
)
179 const struct of_device_id
*match
;
181 match
= of_match_device(dev
->driver
->of_match_table
, dev
);
187 EXPORT_SYMBOL(of_device_get_match_data
);
190 * of_device_modalias - Fill buffer with newline terminated modalias string
191 * @dev: Calling device
192 * @str: Modalias string
195 ssize_t
of_device_modalias(struct device
*dev
, char *str
, ssize_t len
)
199 if (!dev
|| !dev
->of_node
|| dev
->of_node_reused
)
202 sl
= of_modalias(dev
->of_node
, str
, len
- 2);
212 EXPORT_SYMBOL_GPL(of_device_modalias
);
215 * of_device_uevent - Display OF related uevent information
216 * @dev: Device to display the uevent information for
217 * @env: Kernel object's userspace event reference to fill up
219 void of_device_uevent(const struct device
*dev
, struct kobj_uevent_env
*env
)
221 const char *compat
, *type
;
222 struct alias_prop
*app
;
226 if ((!dev
) || (!dev
->of_node
))
229 add_uevent_var(env
, "OF_NAME=%pOFn", dev
->of_node
);
230 add_uevent_var(env
, "OF_FULLNAME=%pOF", dev
->of_node
);
231 type
= of_node_get_device_type(dev
->of_node
);
233 add_uevent_var(env
, "OF_TYPE=%s", type
);
235 /* Since the compatible field can contain pretty much anything
236 * it's not really legal to split it out with commas. We split it
237 * up using a number of environment variables instead. */
238 of_property_for_each_string(dev
->of_node
, "compatible", p
, compat
) {
239 add_uevent_var(env
, "OF_COMPATIBLE_%d=%s", seen
, compat
);
242 add_uevent_var(env
, "OF_COMPATIBLE_N=%d", seen
);
245 mutex_lock(&of_mutex
);
246 list_for_each_entry(app
, &aliases_lookup
, link
) {
247 if (dev
->of_node
== app
->np
) {
248 add_uevent_var(env
, "OF_ALIAS_%d=%s", seen
,
253 mutex_unlock(&of_mutex
);
255 EXPORT_SYMBOL_GPL(of_device_uevent
);
257 int of_device_uevent_modalias(const struct device
*dev
, struct kobj_uevent_env
*env
)
261 if ((!dev
) || (!dev
->of_node
) || dev
->of_node_reused
)
264 /* Devicetree modalias is tricky, we add it in 2 steps */
265 if (add_uevent_var(env
, "MODALIAS="))
268 sl
= of_modalias(dev
->of_node
, &env
->buf
[env
->buflen
-1],
269 sizeof(env
->buf
) - env
->buflen
);
272 if (sl
>= (sizeof(env
->buf
) - env
->buflen
))
278 EXPORT_SYMBOL_GPL(of_device_uevent_modalias
);
281 * of_device_make_bus_id - Use the device node data to assign a unique name
282 * @dev: pointer to device structure that is linked to a device tree node
284 * This routine will first try using the translated bus address to
285 * derive a unique name. If it cannot, then it will prepend names from
286 * parent nodes until a unique name can be derived.
288 void of_device_make_bus_id(struct device
*dev
)
290 struct device_node
*node
= dev
->of_node
;
295 /* Construct the name, using parent nodes if necessary to ensure uniqueness */
296 while (node
->parent
) {
298 * If the address can be translated, then that is as much
299 * uniqueness as we need. Make it the first component and return
301 reg
= of_get_property(node
, "reg", NULL
);
302 if (reg
&& (addr
= of_translate_address(node
, reg
)) != OF_BAD_ADDR
) {
303 if (!of_property_read_u32(node
, "mask", &mask
))
304 dev_set_name(dev
, dev_name(dev
) ? "%llx.%x.%pOFn:%s" : "%llx.%x.%pOFn",
305 addr
, ffs(mask
) - 1, node
, dev_name(dev
));
308 dev_set_name(dev
, dev_name(dev
) ? "%llx.%pOFn:%s" : "%llx.%pOFn",
309 addr
, node
, dev_name(dev
));
313 /* format arguments only used if dev_name() resolves to NULL */
314 dev_set_name(dev
, dev_name(dev
) ? "%s:%s" : "%s",
315 kbasename(node
->full_name
), dev_name(dev
));
319 EXPORT_SYMBOL_GPL(of_device_make_bus_id
);