1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright 2006 PathScale, Inc. All Rights Reserved. |
4 | */ |
5 | |
6 | #ifndef _LINUX_IO_H |
7 | #define _LINUX_IO_H |
8 | |
9 | #include <linux/types.h> |
10 | #include <linux/init.h> |
11 | #include <linux/bug.h> |
12 | #include <linux/err.h> |
13 | #include <asm/io.h> |
14 | #include <asm/page.h> |
15 | |
16 | struct device; |
17 | struct resource; |
18 | |
19 | __visible void __iowrite32_copy(void __iomem *to, const void *from, size_t count); |
20 | void __ioread32_copy(void *to, const void __iomem *from, size_t count); |
21 | void __iowrite64_copy(void __iomem *to, const void *from, size_t count); |
22 | |
23 | #ifdef CONFIG_MMU |
24 | int ioremap_page_range(unsigned long addr, unsigned long end, |
25 | phys_addr_t phys_addr, pgprot_t prot); |
26 | #else |
27 | static inline int ioremap_page_range(unsigned long addr, unsigned long end, |
28 | phys_addr_t phys_addr, pgprot_t prot) |
29 | { |
30 | return 0; |
31 | } |
32 | #endif |
33 | |
34 | /* |
35 | * Managed iomap interface |
36 | */ |
37 | #ifdef CONFIG_HAS_IOPORT_MAP |
38 | void __iomem * devm_ioport_map(struct device *dev, unsigned long port, |
39 | unsigned int nr); |
40 | void devm_ioport_unmap(struct device *dev, void __iomem *addr); |
41 | #else |
42 | static inline void __iomem *devm_ioport_map(struct device *dev, |
43 | unsigned long port, |
44 | unsigned int nr) |
45 | { |
46 | return NULL; |
47 | } |
48 | |
49 | static inline void devm_ioport_unmap(struct device *dev, void __iomem *addr) |
50 | { |
51 | } |
52 | #endif |
53 | |
54 | #define IOMEM_ERR_PTR(err) (__force void __iomem *)ERR_PTR(err) |
55 | |
56 | void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, |
57 | resource_size_t size); |
58 | void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset, |
59 | resource_size_t size); |
60 | void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, |
61 | resource_size_t size); |
62 | void devm_iounmap(struct device *dev, void __iomem *addr); |
63 | int check_signature(const volatile void __iomem *io_addr, |
64 | const unsigned char *signature, int length); |
65 | void devm_ioremap_release(struct device *dev, void *res); |
66 | |
67 | void *devm_memremap(struct device *dev, resource_size_t offset, |
68 | size_t size, unsigned long flags); |
69 | void devm_memunmap(struct device *dev, void *addr); |
70 | |
71 | /* architectures can override this */ |
72 | pgprot_t __init early_memremap_pgprot_adjust(resource_size_t phys_addr, |
73 | unsigned long size, pgprot_t prot); |
74 | |
75 | |
76 | #ifdef CONFIG_PCI |
77 | /* |
78 | * The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and |
79 | * Posting") mandate non-posted configuration transactions. This default |
80 | * implementation attempts to use the ioremap_np() API to provide this |
81 | * on arches that support it, and falls back to ioremap() on those that |
82 | * don't. Overriding this function is deprecated; arches that properly |
83 | * support non-posted accesses should implement ioremap_np() instead, which |
84 | * this default implementation can then use to return mappings compliant with |
85 | * the PCI specification. |
86 | */ |
87 | #ifndef pci_remap_cfgspace |
88 | #define pci_remap_cfgspace pci_remap_cfgspace |
89 | static inline void __iomem *pci_remap_cfgspace(phys_addr_t offset, |
90 | size_t size) |
91 | { |
92 | return ioremap_np(offset, size) ?: ioremap(offset, size); |
93 | } |
94 | #endif |
95 | #endif |
96 | |
97 | /* |
98 | * Some systems do not have legacy ISA devices. |
99 | * /dev/port is not a valid interface on these systems. |
100 | * So for those archs, <asm/io.h> should define the following symbol. |
101 | */ |
102 | #ifndef arch_has_dev_port |
103 | #define arch_has_dev_port() (1) |
104 | #endif |
105 | |
106 | /* |
107 | * Some systems (x86 without PAT) have a somewhat reliable way to mark a |
108 | * physical address range such that uncached mappings will actually |
109 | * end up write-combining. This facility should be used in conjunction |
110 | * with pgprot_writecombine, ioremap-wc, or set_memory_wc, since it has |
111 | * no effect if the per-page mechanisms are functional. |
112 | * (On x86 without PAT, these functions manipulate MTRRs.) |
113 | * |
114 | * arch_phys_del_wc(0) or arch_phys_del_wc(any error code) is guaranteed |
115 | * to have no effect. |
116 | */ |
117 | #ifndef arch_phys_wc_add |
118 | static inline int __must_check arch_phys_wc_add(unsigned long base, |
119 | unsigned long size) |
120 | { |
121 | return 0; /* It worked (i.e. did nothing). */ |
122 | } |
123 | |
124 | static inline void arch_phys_wc_del(int handle) |
125 | { |
126 | } |
127 | |
128 | #define arch_phys_wc_add arch_phys_wc_add |
129 | #ifndef arch_phys_wc_index |
130 | static inline int arch_phys_wc_index(int handle) |
131 | { |
132 | return -1; |
133 | } |
134 | #define arch_phys_wc_index arch_phys_wc_index |
135 | #endif |
136 | #endif |
137 | |
138 | int devm_arch_phys_wc_add(struct device *dev, unsigned long base, unsigned long size); |
139 | |
140 | enum { |
141 | /* See memremap() kernel-doc for usage description... */ |
142 | MEMREMAP_WB = 1 << 0, |
143 | MEMREMAP_WT = 1 << 1, |
144 | MEMREMAP_WC = 1 << 2, |
145 | MEMREMAP_ENC = 1 << 3, |
146 | MEMREMAP_DEC = 1 << 4, |
147 | }; |
148 | |
149 | void *memremap(resource_size_t offset, size_t size, unsigned long flags); |
150 | void memunmap(void *addr); |
151 | |
152 | /* |
153 | * On x86 PAT systems we have memory tracking that keeps track of |
154 | * the allowed mappings on memory ranges. This tracking works for |
155 | * all the in-kernel mapping APIs (ioremap*), but where the user |
156 | * wishes to map a range from a physical device into user memory |
157 | * the tracking won't be updated. This API is to be used by |
158 | * drivers which remap physical device pages into userspace, |
159 | * and wants to make sure they are mapped WC and not UC. |
160 | */ |
161 | #ifndef arch_io_reserve_memtype_wc |
162 | static inline int arch_io_reserve_memtype_wc(resource_size_t base, |
163 | resource_size_t size) |
164 | { |
165 | return 0; |
166 | } |
167 | |
168 | static inline void arch_io_free_memtype_wc(resource_size_t base, |
169 | resource_size_t size) |
170 | { |
171 | } |
172 | #endif |
173 | |
174 | int devm_arch_io_reserve_memtype_wc(struct device *dev, resource_size_t start, |
175 | resource_size_t size); |
176 | |
177 | #endif /* _LINUX_IO_H */ |
178 | |