1
2#ifndef __OF_ADDRESS_H
3#define __OF_ADDRESS_H
4#include <linux/ioport.h>
5#include <linux/errno.h>
6#include <linux/of.h>
7#include <linux/io.h>
8
9struct of_bus;
10
11struct of_pci_range_parser {
12 struct device_node *node;
13 struct of_bus *bus;
14 const __be32 *range;
15 const __be32 *end;
16 int na;
17 int ns;
18 int pna;
19 bool dma;
20};
21#define of_range_parser of_pci_range_parser
22
23struct of_pci_range {
24 union {
25 u64 pci_addr;
26 u64 bus_addr;
27 };
28 u64 cpu_addr;
29 u64 size;
30 u32 flags;
31};
32#define of_range of_pci_range
33
34#define for_each_of_pci_range(parser, range) \
35 for (; of_pci_range_parser_one(parser, range);)
36#define for_each_of_range for_each_of_pci_range
37
38
39extern u64 of_translate_dma_address(struct device_node *dev,
40 const __be32 *in_addr);
41
42#ifdef CONFIG_OF_ADDRESS
43extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
44extern int of_address_to_resource(struct device_node *dev, int index,
45 struct resource *r);
46extern void __iomem *of_iomap(struct device_node *device, int index);
47void __iomem *of_io_request_and_map(struct device_node *device,
48 int index, const char *name);
49
50
51
52
53
54extern const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no,
55 u64 *size, unsigned int *flags);
56
57extern int of_pci_range_parser_init(struct of_pci_range_parser *parser,
58 struct device_node *node);
59extern int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
60 struct device_node *node);
61extern struct of_pci_range *of_pci_range_parser_one(
62 struct of_pci_range_parser *parser,
63 struct of_pci_range *range);
64extern int of_pci_address_to_resource(struct device_node *dev, int bar,
65 struct resource *r);
66extern int of_pci_range_to_resource(struct of_pci_range *range,
67 struct device_node *np,
68 struct resource *res);
69extern bool of_dma_is_coherent(struct device_node *np);
70#else
71static inline void __iomem *of_io_request_and_map(struct device_node *device,
72 int index, const char *name)
73{
74 return IOMEM_ERR_PTR(-EINVAL);
75}
76
77static inline u64 of_translate_address(struct device_node *np,
78 const __be32 *addr)
79{
80 return OF_BAD_ADDR;
81}
82
83static inline const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no,
84 u64 *size, unsigned int *flags)
85{
86 return NULL;
87}
88
89static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser,
90 struct device_node *node)
91{
92 return -ENOSYS;
93}
94
95static inline int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
96 struct device_node *node)
97{
98 return -ENOSYS;
99}
100
101static inline struct of_pci_range *of_pci_range_parser_one(
102 struct of_pci_range_parser *parser,
103 struct of_pci_range *range)
104{
105 return NULL;
106}
107
108static inline int of_pci_address_to_resource(struct device_node *dev, int bar,
109 struct resource *r)
110{
111 return -ENOSYS;
112}
113
114static inline int of_pci_range_to_resource(struct of_pci_range *range,
115 struct device_node *np,
116 struct resource *res)
117{
118 return -ENOSYS;
119}
120
121static inline bool of_dma_is_coherent(struct device_node *np)
122{
123 return false;
124}
125#endif
126
127#ifdef CONFIG_OF
128extern int of_address_to_resource(struct device_node *dev, int index,
129 struct resource *r);
130void __iomem *of_iomap(struct device_node *node, int index);
131#else
132static inline int of_address_to_resource(struct device_node *dev, int index,
133 struct resource *r)
134{
135 return -EINVAL;
136}
137
138static inline void __iomem *of_iomap(struct device_node *device, int index)
139{
140 return NULL;
141}
142#endif
143#define of_range_parser_init of_pci_range_parser_init
144
145static inline const __be32 *of_get_address(struct device_node *dev, int index,
146 u64 *size, unsigned int *flags)
147{
148 return __of_get_address(dev, index, -1, size, flags);
149}
150
151static inline const __be32 *of_get_pci_address(struct device_node *dev, int bar_no,
152 u64 *size, unsigned int *flags)
153{
154 return __of_get_address(dev, -1, bar_no, size, flags);
155}
156
157#endif
158