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 166 167 168 169 170 171 172 | /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright 2006 PathScale, Inc. All Rights Reserved. */ #ifndef _LINUX_IO_H #define _LINUX_IO_H #include <linux/types.h> #include <linux/init.h> #include <linux/bug.h> #include <linux/err.h> #include <asm/io.h> #include <asm/page.h> struct device; struct resource; __visible void __iowrite32_copy(void __iomem *to, const void *from, size_t count); void __ioread32_copy(void *to, const void __iomem *from, size_t count); void __iowrite64_copy(void __iomem *to, const void *from, size_t count); #ifdef CONFIG_MMU int ioremap_page_range(unsigned long addr, unsigned long end, phys_addr_t phys_addr, pgprot_t prot); #else static inline int ioremap_page_range(unsigned long addr, unsigned long end, phys_addr_t phys_addr, pgprot_t prot) { return 0; } #endif /* * Managed iomap interface */ #ifdef CONFIG_HAS_IOPORT_MAP void __iomem * devm_ioport_map(struct device *dev, unsigned long port, unsigned int nr); void devm_ioport_unmap(struct device *dev, void __iomem *addr); #else static inline void __iomem *devm_ioport_map(struct device *dev, unsigned long port, unsigned int nr) { return NULL; } static inline void devm_ioport_unmap(struct device *dev, void __iomem *addr) { } #endif #define IOMEM_ERR_PTR(err) (__force void __iomem *)ERR_PTR(err) void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, resource_size_t size); void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset, resource_size_t size); void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, resource_size_t size); void devm_iounmap(struct device *dev, void __iomem *addr); int check_signature(const volatile void __iomem *io_addr, const unsigned char *signature, int length); void devm_ioremap_release(struct device *dev, void *res); void *devm_memremap(struct device *dev, resource_size_t offset, size_t size, unsigned long flags); void devm_memunmap(struct device *dev, void *addr); #ifdef CONFIG_PCI /* * The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and * Posting") mandate non-posted configuration transactions. This default * implementation attempts to use the ioremap_np() API to provide this * on arches that support it, and falls back to ioremap() on those that * don't. Overriding this function is deprecated; arches that properly * support non-posted accesses should implement ioremap_np() instead, which * this default implementation can then use to return mappings compliant with * the PCI specification. */ #ifndef pci_remap_cfgspace #define pci_remap_cfgspace pci_remap_cfgspace static inline void __iomem *pci_remap_cfgspace(phys_addr_t offset, size_t size) { return ioremap_np(offset, size) ?: ioremap(offset, size); } #endif #endif /* * Some systems do not have legacy ISA devices. * /dev/port is not a valid interface on these systems. * So for those archs, <asm/io.h> should define the following symbol. */ #ifndef arch_has_dev_port #define arch_has_dev_port() (1) #endif /* * Some systems (x86 without PAT) have a somewhat reliable way to mark a * physical address range such that uncached mappings will actually * end up write-combining. This facility should be used in conjunction * with pgprot_writecombine, ioremap-wc, or set_memory_wc, since it has * no effect if the per-page mechanisms are functional. * (On x86 without PAT, these functions manipulate MTRRs.) * * arch_phys_del_wc(0) or arch_phys_del_wc(any error code) is guaranteed * to have no effect. */ #ifndef arch_phys_wc_add static inline int __must_check arch_phys_wc_add(unsigned long base, unsigned long size) { return 0; /* It worked (i.e. did nothing). */ } static inline void arch_phys_wc_del(int handle) { } #define arch_phys_wc_add arch_phys_wc_add #ifndef arch_phys_wc_index static inline int arch_phys_wc_index(int handle) { return -1; } #define arch_phys_wc_index arch_phys_wc_index #endif #endif int devm_arch_phys_wc_add(struct device *dev, unsigned long base, unsigned long size); enum { /* See memremap() kernel-doc for usage description... */ MEMREMAP_WB = 1 << 0, MEMREMAP_WT = 1 << 1, MEMREMAP_WC = 1 << 2, MEMREMAP_ENC = 1 << 3, MEMREMAP_DEC = 1 << 4, }; void *memremap(resource_size_t offset, size_t size, unsigned long flags); void memunmap(void *addr); /* * On x86 PAT systems we have memory tracking that keeps track of * the allowed mappings on memory ranges. This tracking works for * all the in-kernel mapping APIs (ioremap*), but where the user * wishes to map a range from a physical device into user memory * the tracking won't be updated. This API is to be used by * drivers which remap physical device pages into userspace, * and wants to make sure they are mapped WC and not UC. */ #ifndef arch_io_reserve_memtype_wc static inline int arch_io_reserve_memtype_wc(resource_size_t base, resource_size_t size) { return 0; } static inline void arch_io_free_memtype_wc(resource_size_t base, resource_size_t size) { } #endif int devm_arch_io_reserve_memtype_wc(struct device *dev, resource_size_t start, resource_size_t size); #endif /* _LINUX_IO_H */ |