]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - include/linux/of_address.h
Merge tag 'printk-for-5.13-fixup' of git://git.kernel.org/pub/scm/linux/kernel/git...
[mirror_ubuntu-jammy-kernel.git] / include / linux / of_address.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
6b884a8d
GL
2#ifndef __OF_ADDRESS_H
3#define __OF_ADDRESS_H
4#include <linux/ioport.h>
99ce39e3 5#include <linux/errno.h>
6b884a8d 6#include <linux/of.h>
fcd71d9c 7#include <linux/io.h>
6b884a8d 8
2f96593e
JY
9struct of_bus;
10
29b635c0
AM
11struct of_pci_range_parser {
12 struct device_node *node;
2f96593e 13 struct of_bus *bus;
29b635c0
AM
14 const __be32 *range;
15 const __be32 *end;
bc5e522e
RH
16 int na;
17 int ns;
29b635c0 18 int pna;
645c1386 19 bool dma;
29b635c0 20};
bc5e522e 21#define of_range_parser of_pci_range_parser
29b635c0
AM
22
23struct of_pci_range {
bc5e522e
RH
24 union {
25 u64 pci_addr;
26 u64 bus_addr;
27 };
29b635c0
AM
28 u64 cpu_addr;
29 u64 size;
30 u32 flags;
31};
bc5e522e 32#define of_range of_pci_range
29b635c0
AM
33
34#define for_each_of_pci_range(parser, range) \
35 for (; of_pci_range_parser_one(parser, range);)
bc5e522e 36#define for_each_of_range for_each_of_pci_range
29b635c0 37
d0dfa16a
RH
38/* Translate a DMA address from device space to CPU space */
39extern u64 of_translate_dma_address(struct device_node *dev,
40 const __be32 *in_addr);
41
a850a755 42#ifdef CONFIG_OF_ADDRESS
0131d897 43extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
1f5bef30
GL
44extern int of_address_to_resource(struct device_node *dev, int index,
45 struct resource *r);
6b884a8d 46extern void __iomem *of_iomap(struct device_node *device, int index);
fcd71d9c
SM
47void __iomem *of_io_request_and_map(struct device_node *device,
48 int index, const char *name);
6b884a8d 49
22ae782f
GL
50/* Extract an address from a device, returns the region size and
51 * the address space flags too. The PCI version uses a BAR number
52 * instead of an absolute index
53 */
47b1e689 54extern const __be32 *of_get_address(struct device_node *dev, int index,
22ae782f
GL
55 u64 *size, unsigned int *flags);
56
29b635c0
AM
57extern int of_pci_range_parser_init(struct of_pci_range_parser *parser,
58 struct device_node *node);
a060c210
MG
59extern int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
60 struct device_node *node);
29b635c0
AM
61extern struct of_pci_range *of_pci_range_parser_one(
62 struct of_pci_range_parser *parser,
63 struct of_pci_range *range);
92ea637e 64extern bool of_dma_is_coherent(struct device_node *np);
a850a755 65#else /* CONFIG_OF_ADDRESS */
fcd71d9c
SM
66static inline void __iomem *of_io_request_and_map(struct device_node *device,
67 int index, const char *name)
68{
69 return IOMEM_ERR_PTR(-EINVAL);
70}
b1d06b60
GR
71
72static inline u64 of_translate_address(struct device_node *np,
73 const __be32 *addr)
74{
75 return OF_BAD_ADDR;
76}
77
47b1e689 78static inline const __be32 *of_get_address(struct device_node *dev, int index,
a850a755
GL
79 u64 *size, unsigned int *flags)
80{
81 return NULL;
82}
29b635c0
AM
83
84static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser,
85 struct device_node *node)
86{
a060c210
MG
87 return -ENOSYS;
88}
89
90static inline int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
91 struct device_node *node)
92{
93 return -ENOSYS;
29b635c0
AM
94}
95
96static inline struct of_pci_range *of_pci_range_parser_one(
97 struct of_pci_range_parser *parser,
98 struct of_pci_range *range)
99{
100 return NULL;
101}
18308c94 102
92ea637e
SS
103static inline bool of_dma_is_coherent(struct device_node *np)
104{
105 return false;
106}
a850a755
GL
107#endif /* CONFIG_OF_ADDRESS */
108
4acf4b9c
RH
109#ifdef CONFIG_OF
110extern int of_address_to_resource(struct device_node *dev, int index,
111 struct resource *r);
112void __iomem *of_iomap(struct device_node *node, int index);
113#else
114static inline int of_address_to_resource(struct device_node *dev, int index,
115 struct resource *r)
116{
117 return -EINVAL;
118}
119
120static inline void __iomem *of_iomap(struct device_node *device, int index)
121{
122 return NULL;
123}
124#endif
2f96593e 125#define of_range_parser_init of_pci_range_parser_init
a850a755
GL
126
127#if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_PCI)
0131d897 128extern const __be32 *of_get_pci_address(struct device_node *dev, int bar_no,
22ae782f
GL
129 u64 *size, unsigned int *flags);
130extern int of_pci_address_to_resource(struct device_node *dev, int bar,
131 struct resource *r);
0b0b0893
LD
132extern int of_pci_range_to_resource(struct of_pci_range *range,
133 struct device_node *np,
134 struct resource *res);
a850a755 135#else /* CONFIG_OF_ADDRESS && CONFIG_PCI */
22ae782f
GL
136static inline int of_pci_address_to_resource(struct device_node *dev, int bar,
137 struct resource *r)
138{
139 return -ENOSYS;
140}
141
0131d897 142static inline const __be32 *of_get_pci_address(struct device_node *dev,
22ae782f
GL
143 int bar_no, u64 *size, unsigned int *flags)
144{
145 return NULL;
146}
0b0b0893
LD
147static inline int of_pci_range_to_resource(struct of_pci_range *range,
148 struct device_node *np,
149 struct resource *res)
83bbde1c
LD
150{
151 return -ENOSYS;
152}
a850a755 153#endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */
22ae782f 154
6b884a8d 155#endif /* __OF_ADDRESS_H */