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