at v6.3 4.6 kB view raw
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 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/* 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); 41extern const __be32 *of_translate_dma_region(struct device_node *dev, const __be32 *addr, 42 phys_addr_t *start, size_t *length); 43 44#ifdef CONFIG_OF_ADDRESS 45extern u64 of_translate_address(struct device_node *np, const __be32 *addr); 46extern int of_address_to_resource(struct device_node *dev, int index, 47 struct resource *r); 48extern void __iomem *of_iomap(struct device_node *device, int index); 49void __iomem *of_io_request_and_map(struct device_node *device, 50 int index, const char *name); 51 52/* Extract an address from a device, returns the region size and 53 * the address space flags too. The PCI version uses a BAR number 54 * instead of an absolute index 55 */ 56extern const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no, 57 u64 *size, unsigned int *flags); 58 59extern int of_pci_range_parser_init(struct of_pci_range_parser *parser, 60 struct device_node *node); 61extern int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser, 62 struct device_node *node); 63extern struct of_pci_range *of_pci_range_parser_one( 64 struct of_pci_range_parser *parser, 65 struct of_pci_range *range); 66extern int of_pci_address_to_resource(struct device_node *dev, int bar, 67 struct resource *r); 68extern int of_pci_range_to_resource(struct of_pci_range *range, 69 struct device_node *np, 70 struct resource *res); 71extern bool of_dma_is_coherent(struct device_node *np); 72#else /* CONFIG_OF_ADDRESS */ 73static inline void __iomem *of_io_request_and_map(struct device_node *device, 74 int index, const char *name) 75{ 76 return IOMEM_ERR_PTR(-EINVAL); 77} 78 79static inline u64 of_translate_address(struct device_node *np, 80 const __be32 *addr) 81{ 82 return OF_BAD_ADDR; 83} 84 85static inline const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no, 86 u64 *size, unsigned int *flags) 87{ 88 return NULL; 89} 90 91static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser, 92 struct device_node *node) 93{ 94 return -ENOSYS; 95} 96 97static inline int of_pci_dma_range_parser_init(struct of_pci_range_parser *parser, 98 struct device_node *node) 99{ 100 return -ENOSYS; 101} 102 103static inline struct of_pci_range *of_pci_range_parser_one( 104 struct of_pci_range_parser *parser, 105 struct of_pci_range *range) 106{ 107 return NULL; 108} 109 110static inline int of_pci_address_to_resource(struct device_node *dev, int bar, 111 struct resource *r) 112{ 113 return -ENOSYS; 114} 115 116static inline int of_pci_range_to_resource(struct of_pci_range *range, 117 struct device_node *np, 118 struct resource *res) 119{ 120 return -ENOSYS; 121} 122 123static inline bool of_dma_is_coherent(struct device_node *np) 124{ 125 return false; 126} 127#endif /* CONFIG_OF_ADDRESS */ 128 129#ifdef CONFIG_OF 130extern int of_address_to_resource(struct device_node *dev, int index, 131 struct resource *r); 132void __iomem *of_iomap(struct device_node *node, int index); 133#else 134static inline int of_address_to_resource(struct device_node *dev, int index, 135 struct resource *r) 136{ 137 return -EINVAL; 138} 139 140static inline void __iomem *of_iomap(struct device_node *device, int index) 141{ 142 return NULL; 143} 144#endif 145#define of_range_parser_init of_pci_range_parser_init 146 147static inline const __be32 *of_get_address(struct device_node *dev, int index, 148 u64 *size, unsigned int *flags) 149{ 150 return __of_get_address(dev, index, -1, size, flags); 151} 152 153static inline const __be32 *of_get_pci_address(struct device_node *dev, int bar_no, 154 u64 *size, unsigned int *flags) 155{ 156 return __of_get_address(dev, -1, bar_no, size, flags); 157} 158 159static inline int of_address_count(struct device_node *np) 160{ 161 struct resource res; 162 int count = 0; 163 164 while (of_address_to_resource(np, count, &res) == 0) 165 count++; 166 167 return count; 168} 169 170#endif /* __OF_ADDRESS_H */