hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/arch/arm64/include/asm/io.h
....@@ -1,37 +1,23 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * Based on arch/arm/include/asm/io.h
34 *
45 * Copyright (C) 1996-2000 Russell King
56 * Copyright (C) 2012 ARM Ltd.
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License version 2 as
9
- * published by the Free Software Foundation.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License
17
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
187 */
198 #ifndef __ASM_IO_H
209 #define __ASM_IO_H
2110
22
-#ifdef __KERNEL__
23
-
2411 #include <linux/types.h>
12
+#include <linux/log_mmiorw.h>
13
+#include <linux/pgtable.h>
2514
2615 #include <asm/byteorder.h>
2716 #include <asm/barrier.h>
2817 #include <asm/memory.h>
29
-#include <asm/pgtable.h>
3018 #include <asm/early_ioremap.h>
3119 #include <asm/alternative.h>
3220 #include <asm/cpufeature.h>
33
-
34
-#include <xen/xen.h>
3521
3622 /*
3723 * Generic IO read/write. These perform native-endian accesses.
....@@ -39,24 +25,28 @@
3925 #define __raw_writeb __raw_writeb
4026 static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
4127 {
28
+ log_write_mmio(val, 8, addr);
4229 asm volatile("strb %w0, [%1]" : : "rZ" (val), "r" (addr));
4330 }
4431
4532 #define __raw_writew __raw_writew
4633 static inline void __raw_writew(u16 val, volatile void __iomem *addr)
4734 {
35
+ log_write_mmio(val, 16, addr);
4836 asm volatile("strh %w0, [%1]" : : "rZ" (val), "r" (addr));
4937 }
5038
5139 #define __raw_writel __raw_writel
52
-static inline void __raw_writel(u32 val, volatile void __iomem *addr)
40
+static __always_inline void __raw_writel(u32 val, volatile void __iomem *addr)
5341 {
42
+ log_write_mmio(val, 32, addr);
5443 asm volatile("str %w0, [%1]" : : "rZ" (val), "r" (addr));
5544 }
5645
5746 #define __raw_writeq __raw_writeq
5847 static inline void __raw_writeq(u64 val, volatile void __iomem *addr)
5948 {
49
+ log_write_mmio(val, 64, addr);
6050 asm volatile("str %x0, [%1]" : : "rZ" (val), "r" (addr));
6151 }
6252
....@@ -64,10 +54,13 @@
6454 static inline u8 __raw_readb(const volatile void __iomem *addr)
6555 {
6656 u8 val;
57
+
58
+ log_read_mmio(8, addr);
6759 asm volatile(ALTERNATIVE("ldrb %w0, [%1]",
6860 "ldarb %w0, [%1]",
6961 ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
7062 : "=r" (val) : "r" (addr));
63
+ log_post_read_mmio(val, 8, addr);
7164 return val;
7265 }
7366
....@@ -76,21 +69,26 @@
7669 {
7770 u16 val;
7871
72
+ log_read_mmio(16, addr);
7973 asm volatile(ALTERNATIVE("ldrh %w0, [%1]",
8074 "ldarh %w0, [%1]",
8175 ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
8276 : "=r" (val) : "r" (addr));
77
+ log_post_read_mmio(val, 16, addr);
8378 return val;
8479 }
8580
8681 #define __raw_readl __raw_readl
87
-static inline u32 __raw_readl(const volatile void __iomem *addr)
82
+static __always_inline u32 __raw_readl(const volatile void __iomem *addr)
8883 {
8984 u32 val;
85
+
86
+ log_read_mmio(32, addr);
9087 asm volatile(ALTERNATIVE("ldr %w0, [%1]",
9188 "ldar %w0, [%1]",
9289 ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
9390 : "=r" (val) : "r" (addr));
91
+ log_post_read_mmio(val, 32, addr);
9492 return val;
9593 }
9694
....@@ -98,10 +96,13 @@
9896 static inline u64 __raw_readq(const volatile void __iomem *addr)
9997 {
10098 u64 val;
99
+
100
+ log_read_mmio(64, addr);
101101 asm volatile(ALTERNATIVE("ldr %0, [%1]",
102102 "ldar %0, [%1]",
103103 ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE)
104104 : "=r" (val) : "r" (addr));
105
+ log_post_read_mmio(val, 64, addr);
105106 return val;
106107 }
107108
....@@ -110,7 +111,7 @@
110111 ({ \
111112 unsigned long tmp; \
112113 \
113
- rmb(); \
114
+ dma_rmb(); \
114115 \
115116 /* \
116117 * Create a dummy control dependency from the IO read to any \
....@@ -123,9 +124,9 @@
123124 : "memory"); \
124125 })
125126
126
-#define __iowmb() wmb()
127
-
128
-#define mmiowb() do { } while (0)
127
+#define __io_par(v) __iormb(v)
128
+#define __iowmb() dma_wmb()
129
+#define __iomb() dma_mb()
129130
130131 /*
131132 * Relaxed I/O memory access primitives. These follow the Device memory
....@@ -179,14 +180,11 @@
179180 * I/O memory mapping functions.
180181 */
181182 extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot);
182
-extern void __iounmap(volatile void __iomem *addr);
183
+extern void iounmap(volatile void __iomem *addr);
183184 extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
184185
185186 #define ioremap(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
186
-#define ioremap_nocache(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
187187 #define ioremap_wc(addr, size) __ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
188
-#define ioremap_wt(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
189
-#define iounmap __iounmap
190188
191189 /*
192190 * PCI configuration space mapping function.
....@@ -221,12 +219,8 @@
221219
222220 extern int devmem_is_allowed(unsigned long pfn);
223221
224
-struct bio_vec;
225
-extern bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,
226
- const struct bio_vec *vec2);
227
-#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \
228
- (__BIOVEC_PHYS_MERGEABLE(vec1, vec2) && \
229
- (!xen_domain() || xen_biovec_phys_mergeable(vec1, vec2)))
222
+extern bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
223
+ unsigned long flags);
224
+#define arch_memremap_can_ram_remap arch_memremap_can_ram_remap
230225
231
-#endif /* __KERNEL__ */
232226 #endif /* __ASM_IO_H */