Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */
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 : :
9 : : struct of_pci_range_parser {
10 : : struct device_node *node;
11 : : const __be32 *range;
12 : : const __be32 *end;
13 : : int np;
14 : : int pna;
15 : : bool dma;
16 : : };
17 : :
18 : : struct of_pci_range {
19 : : u32 pci_space;
20 : : u64 pci_addr;
21 : : u64 cpu_addr;
22 : : u64 size;
23 : : u32 flags;
24 : : };
25 : :
26 : : #define for_each_of_pci_range(parser, range) \
27 : : for (; of_pci_range_parser_one(parser, range);)
28 : :
29 : : /* Translate a DMA address from device space to CPU space */
30 : : extern u64 of_translate_dma_address(struct device_node *dev,
31 : : const __be32 *in_addr);
32 : :
33 : : #ifdef CONFIG_OF_ADDRESS
34 : : extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
35 : : extern int of_address_to_resource(struct device_node *dev, int index,
36 : : struct resource *r);
37 : : extern void __iomem *of_iomap(struct device_node *device, int index);
38 : : void __iomem *of_io_request_and_map(struct device_node *device,
39 : : int index, const char *name);
40 : :
41 : : /* Extract an address from a device, returns the region size and
42 : : * the address space flags too. The PCI version uses a BAR number
43 : : * instead of an absolute index
44 : : */
45 : : extern const __be32 *of_get_address(struct device_node *dev, int index,
46 : : u64 *size, unsigned int *flags);
47 : :
48 : : extern int of_pci_range_parser_init(struct of_pci_range_parser *parser,
49 : : struct device_node *node);
50 : : extern int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
51 : : struct device_node *node);
52 : : extern struct of_pci_range *of_pci_range_parser_one(
53 : : struct of_pci_range_parser *parser,
54 : : struct of_pci_range *range);
55 : : extern bool of_dma_is_coherent(struct device_node *np);
56 : : #else /* CONFIG_OF_ADDRESS */
57 : : static inline void __iomem *of_io_request_and_map(struct device_node *device,
58 : : int index, const char *name)
59 : : {
60 : : return IOMEM_ERR_PTR(-EINVAL);
61 : : }
62 : :
63 : : static inline u64 of_translate_address(struct device_node *np,
64 : : const __be32 *addr)
65 : : {
66 : : return OF_BAD_ADDR;
67 : : }
68 : :
69 : : static inline const __be32 *of_get_address(struct device_node *dev, int index,
70 : : u64 *size, unsigned int *flags)
71 : : {
72 : : return NULL;
73 : : }
74 : :
75 : : static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser,
76 : : struct device_node *node)
77 : : {
78 : : return -ENOSYS;
79 : : }
80 : :
81 : : static inline int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
82 : : struct device_node *node)
83 : : {
84 : : return -ENOSYS;
85 : : }
86 : :
87 : : static inline struct of_pci_range *of_pci_range_parser_one(
88 : : struct of_pci_range_parser *parser,
89 : : struct of_pci_range *range)
90 : : {
91 : : return NULL;
92 : : }
93 : :
94 : : static inline bool of_dma_is_coherent(struct device_node *np)
95 : : {
96 : : return false;
97 : : }
98 : : #endif /* CONFIG_OF_ADDRESS */
99 : :
100 : : #ifdef CONFIG_OF
101 : : extern int of_address_to_resource(struct device_node *dev, int index,
102 : : struct resource *r);
103 : : void __iomem *of_iomap(struct device_node *node, int index);
104 : : #else
105 : 0 : static inline int of_address_to_resource(struct device_node *dev, int index,
106 : : struct resource *r)
107 : : {
108 : 0 : return -EINVAL;
109 : : }
110 : :
111 : : static inline void __iomem *of_iomap(struct device_node *device, int index)
112 : : {
113 : : return NULL;
114 : : }
115 : : #endif
116 : :
117 : : #if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_PCI)
118 : : extern const __be32 *of_get_pci_address(struct device_node *dev, int bar_no,
119 : : u64 *size, unsigned int *flags);
120 : : extern int of_pci_address_to_resource(struct device_node *dev, int bar,
121 : : struct resource *r);
122 : : extern int of_pci_range_to_resource(struct of_pci_range *range,
123 : : struct device_node *np,
124 : : struct resource *res);
125 : : #else /* CONFIG_OF_ADDRESS && CONFIG_PCI */
126 : : static inline int of_pci_address_to_resource(struct device_node *dev, int bar,
127 : : struct resource *r)
128 : : {
129 : : return -ENOSYS;
130 : : }
131 : :
132 : : static inline const __be32 *of_get_pci_address(struct device_node *dev,
133 : : int bar_no, u64 *size, unsigned int *flags)
134 : : {
135 : : return NULL;
136 : : }
137 : : static inline int of_pci_range_to_resource(struct of_pci_range *range,
138 : : struct device_node *np,
139 : : struct resource *res)
140 : : {
141 : : return -ENOSYS;
142 : : }
143 : : #endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */
144 : :
145 : : #endif /* __OF_ADDRESS_H */
146 : :
|