| Grant Likely | 6b884a8 | 2010-06-08 07:48:09 -0600 | [diff] [blame] | 1 | #ifndef __OF_ADDRESS_H | 
 | 2 | #define __OF_ADDRESS_H | 
 | 3 | #include <linux/ioport.h> | 
| Grant Likely | 99ce39e | 2011-07-05 23:42:37 -0600 | [diff] [blame] | 4 | #include <linux/errno.h> | 
| Grant Likely | 6b884a8 | 2010-06-08 07:48:09 -0600 | [diff] [blame] | 5 | #include <linux/of.h> | 
| Sudip Mukherjee | fcd71d9cc | 2015-12-08 14:17:55 +0530 | [diff] [blame] | 6 | #include <linux/io.h> | 
| Grant Likely | 6b884a8 | 2010-06-08 07:48:09 -0600 | [diff] [blame] | 7 |  | 
| Andrew Murray | 29b635c | 2013-05-16 17:55:17 +0200 | [diff] [blame] | 8 | struct of_pci_range_parser { | 
 | 9 | 	struct device_node *node; | 
 | 10 | 	const __be32 *range; | 
 | 11 | 	const __be32 *end; | 
 | 12 | 	int np; | 
 | 13 | 	int pna; | 
 | 14 | }; | 
 | 15 |  | 
 | 16 | struct of_pci_range { | 
 | 17 | 	u32 pci_space; | 
 | 18 | 	u64 pci_addr; | 
 | 19 | 	u64 cpu_addr; | 
 | 20 | 	u64 size; | 
 | 21 | 	u32 flags; | 
 | 22 | }; | 
 | 23 |  | 
 | 24 | #define for_each_of_pci_range(parser, range) \ | 
 | 25 | 	for (; of_pci_range_parser_one(parser, range);) | 
 | 26 |  | 
| Rob Herring | d0dfa16 | 2013-09-16 21:05:05 -0500 | [diff] [blame] | 27 | /* Translate a DMA address from device space to CPU space */ | 
 | 28 | extern u64 of_translate_dma_address(struct device_node *dev, | 
 | 29 | 				    const __be32 *in_addr); | 
 | 30 |  | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 31 | #ifdef CONFIG_OF_ADDRESS | 
| Sebastian Andrzej Siewior | 0131d89 | 2010-12-01 10:54:46 +0100 | [diff] [blame] | 32 | extern u64 of_translate_address(struct device_node *np, const __be32 *addr); | 
| Grant Likely | 1f5bef3 | 2010-06-08 07:48:09 -0600 | [diff] [blame] | 33 | extern int of_address_to_resource(struct device_node *dev, int index, | 
 | 34 | 				  struct resource *r); | 
| Grant Likely | 90e33f6 | 2011-07-05 23:42:28 -0600 | [diff] [blame] | 35 | extern struct device_node *of_find_matching_node_by_address( | 
 | 36 | 					struct device_node *from, | 
 | 37 | 					const struct of_device_id *matches, | 
 | 38 | 					u64 base_address); | 
| Grant Likely | 6b884a8 | 2010-06-08 07:48:09 -0600 | [diff] [blame] | 39 | extern void __iomem *of_iomap(struct device_node *device, int index); | 
| Sudip Mukherjee | fcd71d9cc | 2015-12-08 14:17:55 +0530 | [diff] [blame] | 40 | void __iomem *of_io_request_and_map(struct device_node *device, | 
 | 41 | 				    int index, const char *name); | 
| Grant Likely | 6b884a8 | 2010-06-08 07:48:09 -0600 | [diff] [blame] | 42 |  | 
| Grant Likely | 22ae782 | 2010-07-29 11:49:01 -0600 | [diff] [blame] | 43 | /* Extract an address from a device, returns the region size and | 
 | 44 |  * the address space flags too. The PCI version uses a BAR number | 
 | 45 |  * instead of an absolute index | 
 | 46 |  */ | 
| Kim Phillips | 47b1e68 | 2012-10-08 19:41:58 -0500 | [diff] [blame] | 47 | extern const __be32 *of_get_address(struct device_node *dev, int index, | 
| Grant Likely | 22ae782 | 2010-07-29 11:49:01 -0600 | [diff] [blame] | 48 | 			   u64 *size, unsigned int *flags); | 
 | 49 |  | 
| Andrew Murray | 29b635c | 2013-05-16 17:55:17 +0200 | [diff] [blame] | 50 | extern int of_pci_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); | 
| Grygorii Strashko | 18308c9 | 2014-04-24 11:30:02 -0400 | [diff] [blame] | 55 | extern int of_dma_get_range(struct device_node *np, u64 *dma_addr, | 
 | 56 | 				u64 *paddr, u64 *size); | 
| Santosh Shilimkar | 92ea637 | 2014-04-24 11:30:03 -0400 | [diff] [blame] | 57 | extern bool of_dma_is_coherent(struct device_node *np); | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 58 | #else /* CONFIG_OF_ADDRESS */ | 
| Sudip Mukherjee | fcd71d9cc | 2015-12-08 14:17:55 +0530 | [diff] [blame] | 59 | static inline void __iomem *of_io_request_and_map(struct device_node *device, | 
 | 60 | 						  int index, const char *name) | 
 | 61 | { | 
 | 62 | 	return IOMEM_ERR_PTR(-EINVAL); | 
 | 63 | } | 
| Guenter Roeck | b1d06b6 | 2015-11-06 19:28:22 -0800 | [diff] [blame] | 64 |  | 
 | 65 | static inline u64 of_translate_address(struct device_node *np, | 
 | 66 | 				       const __be32 *addr) | 
 | 67 | { | 
 | 68 | 	return OF_BAD_ADDR; | 
 | 69 | } | 
 | 70 |  | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 71 | static inline struct device_node *of_find_matching_node_by_address( | 
 | 72 | 					struct device_node *from, | 
 | 73 | 					const struct of_device_id *matches, | 
 | 74 | 					u64 base_address) | 
 | 75 | { | 
 | 76 | 	return NULL; | 
 | 77 | } | 
| Rob Herring | 4acf4b9 | 2013-09-16 21:03:24 -0500 | [diff] [blame] | 78 |  | 
| Kim Phillips | 47b1e68 | 2012-10-08 19:41:58 -0500 | [diff] [blame] | 79 | static inline const __be32 *of_get_address(struct device_node *dev, int index, | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 80 | 					u64 *size, unsigned int *flags) | 
 | 81 | { | 
 | 82 | 	return NULL; | 
 | 83 | } | 
| Andrew Murray | 29b635c | 2013-05-16 17:55:17 +0200 | [diff] [blame] | 84 |  | 
 | 85 | static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser, | 
 | 86 | 			struct device_node *node) | 
 | 87 | { | 
 | 88 | 	return -1; | 
 | 89 | } | 
 | 90 |  | 
 | 91 | static inline struct of_pci_range *of_pci_range_parser_one( | 
 | 92 | 					struct of_pci_range_parser *parser, | 
 | 93 | 					struct of_pci_range *range) | 
 | 94 | { | 
 | 95 | 	return NULL; | 
 | 96 | } | 
| Grygorii Strashko | 18308c9 | 2014-04-24 11:30:02 -0400 | [diff] [blame] | 97 |  | 
 | 98 | static inline int of_dma_get_range(struct device_node *np, u64 *dma_addr, | 
 | 99 | 				u64 *paddr, u64 *size) | 
 | 100 | { | 
 | 101 | 	return -ENODEV; | 
 | 102 | } | 
| Santosh Shilimkar | 92ea637 | 2014-04-24 11:30:03 -0400 | [diff] [blame] | 103 |  | 
 | 104 | static inline bool of_dma_is_coherent(struct device_node *np) | 
 | 105 | { | 
 | 106 | 	return false; | 
 | 107 | } | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 108 | #endif /* CONFIG_OF_ADDRESS */ | 
 | 109 |  | 
| Rob Herring | 4acf4b9 | 2013-09-16 21:03:24 -0500 | [diff] [blame] | 110 | #ifdef CONFIG_OF | 
 | 111 | extern int of_address_to_resource(struct device_node *dev, int index, | 
 | 112 | 				  struct resource *r); | 
 | 113 | void __iomem *of_iomap(struct device_node *node, int index); | 
 | 114 | #else | 
 | 115 | static inline int of_address_to_resource(struct device_node *dev, int index, | 
 | 116 | 					 struct resource *r) | 
 | 117 | { | 
 | 118 | 	return -EINVAL; | 
 | 119 | } | 
 | 120 |  | 
 | 121 | static inline void __iomem *of_iomap(struct device_node *device, int index) | 
 | 122 | { | 
 | 123 | 	return NULL; | 
 | 124 | } | 
 | 125 | #endif | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 126 |  | 
 | 127 | #if defined(CONFIG_OF_ADDRESS) && defined(CONFIG_PCI) | 
| Sebastian Andrzej Siewior | 0131d89 | 2010-12-01 10:54:46 +0100 | [diff] [blame] | 128 | extern const __be32 *of_get_pci_address(struct device_node *dev, int bar_no, | 
| Grant Likely | 22ae782 | 2010-07-29 11:49:01 -0600 | [diff] [blame] | 129 | 			       u64 *size, unsigned int *flags); | 
 | 130 | extern int of_pci_address_to_resource(struct device_node *dev, int bar, | 
 | 131 | 				      struct resource *r); | 
| Liviu Dudau | 0b0b089 | 2014-09-29 15:29:25 +0100 | [diff] [blame] | 132 | extern int of_pci_range_to_resource(struct of_pci_range *range, | 
 | 133 | 				    struct device_node *np, | 
 | 134 | 				    struct resource *res); | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 135 | #else /* CONFIG_OF_ADDRESS && CONFIG_PCI */ | 
| Grant Likely | 22ae782 | 2010-07-29 11:49:01 -0600 | [diff] [blame] | 136 | static inline int of_pci_address_to_resource(struct device_node *dev, int bar, | 
 | 137 | 				             struct resource *r) | 
 | 138 | { | 
 | 139 | 	return -ENOSYS; | 
 | 140 | } | 
 | 141 |  | 
| Sebastian Andrzej Siewior | 0131d89 | 2010-12-01 10:54:46 +0100 | [diff] [blame] | 142 | static inline const __be32 *of_get_pci_address(struct device_node *dev, | 
| Grant Likely | 22ae782 | 2010-07-29 11:49:01 -0600 | [diff] [blame] | 143 | 		int bar_no, u64 *size, unsigned int *flags) | 
 | 144 | { | 
 | 145 | 	return NULL; | 
 | 146 | } | 
| Liviu Dudau | 0b0b089 | 2014-09-29 15:29:25 +0100 | [diff] [blame] | 147 | static inline int of_pci_range_to_resource(struct of_pci_range *range, | 
 | 148 | 					   struct device_node *np, | 
 | 149 | 					   struct resource *res) | 
| Liviu Dudau | 83bbde1 | 2014-09-29 15:29:24 +0100 | [diff] [blame] | 150 | { | 
 | 151 | 	return -ENOSYS; | 
 | 152 | } | 
| Grant Likely | a850a75 | 2012-02-14 14:06:55 -0700 | [diff] [blame] | 153 | #endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */ | 
| Grant Likely | 22ae782 | 2010-07-29 11:49:01 -0600 | [diff] [blame] | 154 |  | 
| Grant Likely | 6b884a8 | 2010-06-08 07:48:09 -0600 | [diff] [blame] | 155 | #endif /* __OF_ADDRESS_H */ | 
 | 156 |  |