~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/of_address.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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_bus;
 10 
 11 struct 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 
 23 struct 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 /*
 39  * of_range_count - Get the number of "ranges" or "dma-ranges" entries
 40  * @parser:     Parser state initialized by of_range_parser_init()
 41  *
 42  * Returns the number of entries or 0 if none.
 43  *
 44  * Note that calling this within or after the for_each_of_range() iterator will
 45  * be inaccurate giving the number of entries remaining.
 46  */
 47 static inline int of_range_count(const struct of_range_parser *parser)
 48 {
 49         if (!parser || !parser->node || !parser->range || parser->range == parser->end)
 50                 return 0;
 51         return (parser->end - parser->range) / (parser->na + parser->pna + parser->ns);
 52 }
 53 
 54 /* Translate a DMA address from device space to CPU space */
 55 extern u64 of_translate_dma_address(struct device_node *dev,
 56                                     const __be32 *in_addr);
 57 extern const __be32 *of_translate_dma_region(struct device_node *dev, const __be32 *addr,
 58                                              phys_addr_t *start, size_t *length);
 59 
 60 #ifdef CONFIG_OF_ADDRESS
 61 extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
 62 extern int of_address_to_resource(struct device_node *dev, int index,
 63                                   struct resource *r);
 64 extern void __iomem *of_iomap(struct device_node *device, int index);
 65 void __iomem *of_io_request_and_map(struct device_node *device,
 66                                     int index, const char *name);
 67 
 68 /* Extract an address from a device, returns the region size and
 69  * the address space flags too. The PCI version uses a BAR number
 70  * instead of an absolute index
 71  */
 72 extern const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no,
 73                                       u64 *size, unsigned int *flags);
 74 
 75 int of_property_read_reg(struct device_node *np, int idx, u64 *addr, u64 *size);
 76 
 77 extern int of_pci_range_parser_init(struct of_pci_range_parser *parser,
 78                         struct device_node *node);
 79 extern int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
 80                         struct device_node *node);
 81 extern struct of_pci_range *of_pci_range_parser_one(
 82                                         struct of_pci_range_parser *parser,
 83                                         struct of_pci_range *range);
 84 extern int of_pci_address_to_resource(struct device_node *dev, int bar,
 85                                       struct resource *r);
 86 extern int of_pci_range_to_resource(struct of_pci_range *range,
 87                                     struct device_node *np,
 88                                     struct resource *res);
 89 extern int of_range_to_resource(struct device_node *np, int index,
 90                                 struct resource *res);
 91 extern bool of_dma_is_coherent(struct device_node *np);
 92 #else /* CONFIG_OF_ADDRESS */
 93 static inline void __iomem *of_io_request_and_map(struct device_node *device,
 94                                                   int index, const char *name)
 95 {
 96         return IOMEM_ERR_PTR(-EINVAL);
 97 }
 98 
 99 static inline u64 of_translate_address(struct device_node *np,
100                                        const __be32 *addr)
101 {
102         return OF_BAD_ADDR;
103 }
104 
105 static inline const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no,
106                                              u64 *size, unsigned int *flags)
107 {
108         return NULL;
109 }
110 
111 static inline int of_property_read_reg(struct device_node *np, int idx, u64 *addr, u64 *size)
112 {
113         return -ENOSYS;
114 }
115 
116 static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser,
117                         struct device_node *node)
118 {
119         return -ENOSYS;
120 }
121 
122 static inline int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser,
123                         struct device_node *node)
124 {
125         return -ENOSYS;
126 }
127 
128 static inline struct of_pci_range *of_pci_range_parser_one(
129                                         struct of_pci_range_parser *parser,
130                                         struct of_pci_range *range)
131 {
132         return NULL;
133 }
134 
135 static inline int of_pci_address_to_resource(struct device_node *dev, int bar,
136                                              struct resource *r)
137 {
138         return -ENOSYS;
139 }
140 
141 static inline int of_pci_range_to_resource(struct of_pci_range *range,
142                                            struct device_node *np,
143                                            struct resource *res)
144 {
145         return -ENOSYS;
146 }
147 
148 static inline int of_range_to_resource(struct device_node *np, int index,
149                                        struct resource *res)
150 {
151         return -ENOSYS;
152 }
153 
154 static inline bool of_dma_is_coherent(struct device_node *np)
155 {
156         return false;
157 }
158 #endif /* CONFIG_OF_ADDRESS */
159 
160 #ifdef CONFIG_OF
161 extern int of_address_to_resource(struct device_node *dev, int index,
162                                   struct resource *r);
163 void __iomem *of_iomap(struct device_node *node, int index);
164 #else
165 static inline int of_address_to_resource(struct device_node *dev, int index,
166                                          struct resource *r)
167 {
168         return -EINVAL;
169 }
170 
171 static inline void __iomem *of_iomap(struct device_node *device, int index)
172 {
173         return NULL;
174 }
175 #endif
176 #define of_range_parser_init of_pci_range_parser_init
177 
178 static inline const __be32 *of_get_address(struct device_node *dev, int index,
179                                            u64 *size, unsigned int *flags)
180 {
181         return __of_get_address(dev, index, -1, size, flags);
182 }
183 
184 static inline const __be32 *of_get_pci_address(struct device_node *dev, int bar_no,
185                                                u64 *size, unsigned int *flags)
186 {
187         return __of_get_address(dev, -1, bar_no, size, flags);
188 }
189 
190 static inline int of_address_count(struct device_node *np)
191 {
192         struct resource res;
193         int count = 0;
194 
195         while (of_address_to_resource(np, count, &res) == 0)
196                 count++;
197 
198         return count;
199 }
200 
201 #endif /* __OF_ADDRESS_H */
202 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php