xref: /linux/tools/arch/x86/include/asm/io.h (revision 55a42f78ffd386e01a5404419f8c5ded7db70a21)
1ce5dc9aaSDavid Matlack /* SPDX-License-Identifier: GPL-2.0 */
2ce5dc9aaSDavid Matlack #ifndef _TOOLS_ASM_X86_IO_H
3ce5dc9aaSDavid Matlack #define _TOOLS_ASM_X86_IO_H
4ce5dc9aaSDavid Matlack 
5ce5dc9aaSDavid Matlack #include <linux/compiler.h>
6ce5dc9aaSDavid Matlack #include <linux/types.h>
7*3fe30577SDavid Matlack #include "special_insns.h"
8ce5dc9aaSDavid Matlack 
9ce5dc9aaSDavid Matlack #define build_mmio_read(name, size, type, reg, barrier) \
10ce5dc9aaSDavid Matlack static inline type name(const volatile void __iomem *addr) \
11ce5dc9aaSDavid Matlack { type ret; asm volatile("mov" size " %1,%0":reg (ret) \
12ce5dc9aaSDavid Matlack :"m" (*(volatile type __force *)addr) barrier); return ret; }
13ce5dc9aaSDavid Matlack 
14ce5dc9aaSDavid Matlack #define build_mmio_write(name, size, type, reg, barrier) \
15ce5dc9aaSDavid Matlack static inline void name(type val, volatile void __iomem *addr) \
16ce5dc9aaSDavid Matlack { asm volatile("mov" size " %0,%1": :reg (val), \
17ce5dc9aaSDavid Matlack "m" (*(volatile type __force *)addr) barrier); }
18ce5dc9aaSDavid Matlack 
19ce5dc9aaSDavid Matlack build_mmio_read(readb, "b", unsigned char, "=q", :"memory")
20ce5dc9aaSDavid Matlack build_mmio_read(readw, "w", unsigned short, "=r", :"memory")
21ce5dc9aaSDavid Matlack build_mmio_read(readl, "l", unsigned int, "=r", :"memory")
22ce5dc9aaSDavid Matlack 
23ce5dc9aaSDavid Matlack build_mmio_read(__readb, "b", unsigned char, "=q", )
24ce5dc9aaSDavid Matlack build_mmio_read(__readw, "w", unsigned short, "=r", )
25ce5dc9aaSDavid Matlack build_mmio_read(__readl, "l", unsigned int, "=r", )
26ce5dc9aaSDavid Matlack 
27ce5dc9aaSDavid Matlack build_mmio_write(writeb, "b", unsigned char, "q", :"memory")
28ce5dc9aaSDavid Matlack build_mmio_write(writew, "w", unsigned short, "r", :"memory")
29ce5dc9aaSDavid Matlack build_mmio_write(writel, "l", unsigned int, "r", :"memory")
30ce5dc9aaSDavid Matlack 
31ce5dc9aaSDavid Matlack build_mmio_write(__writeb, "b", unsigned char, "q", )
32ce5dc9aaSDavid Matlack build_mmio_write(__writew, "w", unsigned short, "r", )
33ce5dc9aaSDavid Matlack build_mmio_write(__writel, "l", unsigned int, "r", )
34ce5dc9aaSDavid Matlack 
35ce5dc9aaSDavid Matlack #define readb readb
36ce5dc9aaSDavid Matlack #define readw readw
37ce5dc9aaSDavid Matlack #define readl readl
38ce5dc9aaSDavid Matlack #define readb_relaxed(a) __readb(a)
39ce5dc9aaSDavid Matlack #define readw_relaxed(a) __readw(a)
40ce5dc9aaSDavid Matlack #define readl_relaxed(a) __readl(a)
41ce5dc9aaSDavid Matlack #define __raw_readb __readb
42ce5dc9aaSDavid Matlack #define __raw_readw __readw
43ce5dc9aaSDavid Matlack #define __raw_readl __readl
44ce5dc9aaSDavid Matlack 
45ce5dc9aaSDavid Matlack #define writeb writeb
46ce5dc9aaSDavid Matlack #define writew writew
47ce5dc9aaSDavid Matlack #define writel writel
48ce5dc9aaSDavid Matlack #define writeb_relaxed(v, a) __writeb(v, a)
49ce5dc9aaSDavid Matlack #define writew_relaxed(v, a) __writew(v, a)
50ce5dc9aaSDavid Matlack #define writel_relaxed(v, a) __writel(v, a)
51ce5dc9aaSDavid Matlack #define __raw_writeb __writeb
52ce5dc9aaSDavid Matlack #define __raw_writew __writew
53ce5dc9aaSDavid Matlack #define __raw_writel __writel
54ce5dc9aaSDavid Matlack 
55ce5dc9aaSDavid Matlack #ifdef __x86_64__
56ce5dc9aaSDavid Matlack 
57ce5dc9aaSDavid Matlack build_mmio_read(readq, "q", u64, "=r", :"memory")
58ce5dc9aaSDavid Matlack build_mmio_read(__readq, "q", u64, "=r", )
59ce5dc9aaSDavid Matlack build_mmio_write(writeq, "q", u64, "r", :"memory")
60ce5dc9aaSDavid Matlack build_mmio_write(__writeq, "q", u64, "r", )
61ce5dc9aaSDavid Matlack 
62ce5dc9aaSDavid Matlack #define readq_relaxed(a)	__readq(a)
63ce5dc9aaSDavid Matlack #define writeq_relaxed(v, a)	__writeq(v, a)
64ce5dc9aaSDavid Matlack 
65ce5dc9aaSDavid Matlack #define __raw_readq		__readq
66ce5dc9aaSDavid Matlack #define __raw_writeq		__writeq
67ce5dc9aaSDavid Matlack 
68ce5dc9aaSDavid Matlack /* Let people know that we have them */
69ce5dc9aaSDavid Matlack #define readq			readq
70ce5dc9aaSDavid Matlack #define writeq			writeq
71ce5dc9aaSDavid Matlack 
72ce5dc9aaSDavid Matlack #endif /* __x86_64__ */
73ce5dc9aaSDavid Matlack 
74ce5dc9aaSDavid Matlack #include <asm-generic/io.h>
75ce5dc9aaSDavid Matlack 
76*3fe30577SDavid Matlack /**
77*3fe30577SDavid Matlack  * iosubmit_cmds512 - copy data to single MMIO location, in 512-bit units
78*3fe30577SDavid Matlack  * @dst: destination, in MMIO space (must be 512-bit aligned)
79*3fe30577SDavid Matlack  * @src: source
80*3fe30577SDavid Matlack  * @count: number of 512 bits quantities to submit
81*3fe30577SDavid Matlack  *
82*3fe30577SDavid Matlack  * Submit data from kernel space to MMIO space, in units of 512 bits at a
83*3fe30577SDavid Matlack  * time.  Order of access is not guaranteed, nor is a memory barrier
84*3fe30577SDavid Matlack  * performed afterwards.
85*3fe30577SDavid Matlack  *
86*3fe30577SDavid Matlack  * Warning: Do not use this helper unless your driver has checked that the CPU
87*3fe30577SDavid Matlack  * instruction is supported on the platform.
88*3fe30577SDavid Matlack  */
89*3fe30577SDavid Matlack static inline void iosubmit_cmds512(void __iomem *dst, const void *src,
90*3fe30577SDavid Matlack 				    size_t count)
91*3fe30577SDavid Matlack {
92*3fe30577SDavid Matlack 	const u8 *from = src;
93*3fe30577SDavid Matlack 	const u8 *end = from + count * 64;
94*3fe30577SDavid Matlack 
95*3fe30577SDavid Matlack 	while (from < end) {
96*3fe30577SDavid Matlack 		movdir64b(dst, from);
97*3fe30577SDavid Matlack 		from += 64;
98*3fe30577SDavid Matlack 	}
99*3fe30577SDavid Matlack }
100*3fe30577SDavid Matlack 
101ce5dc9aaSDavid Matlack #endif /* _TOOLS_ASM_X86_IO_H */
102