Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/alpha/include/asm/io_trivial.h
26481 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/* Trivial implementations of basic i/o routines. Assumes that all
3
of the hard work has been done by ioremap and ioportmap, and that
4
access to i/o space is linear. */
5
6
/* This file may be included multiple times. */
7
8
#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
9
__EXTERN_INLINE u8
10
IO_CONCAT(__IO_PREFIX,ioread8)(const void __iomem *a)
11
{
12
return __kernel_ldbu(*(const volatile u8 __force *)a);
13
}
14
15
__EXTERN_INLINE u16
16
IO_CONCAT(__IO_PREFIX,ioread16)(const void __iomem *a)
17
{
18
return __kernel_ldwu(*(const volatile u16 __force *)a);
19
}
20
21
__EXTERN_INLINE void
22
IO_CONCAT(__IO_PREFIX,iowrite8)(u8 b, void __iomem *a)
23
{
24
__kernel_stb(b, *(volatile u8 __force *)a);
25
}
26
27
__EXTERN_INLINE void
28
IO_CONCAT(__IO_PREFIX,iowrite16)(u16 b, void __iomem *a)
29
{
30
__kernel_stw(b, *(volatile u16 __force *)a);
31
}
32
#endif
33
34
#if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
35
__EXTERN_INLINE u32
36
IO_CONCAT(__IO_PREFIX,ioread32)(const void __iomem *a)
37
{
38
return *(const volatile u32 __force *)a;
39
}
40
41
__EXTERN_INLINE void
42
IO_CONCAT(__IO_PREFIX,iowrite32)(u32 b, void __iomem *a)
43
{
44
*(volatile u32 __force *)a = b;
45
}
46
47
__EXTERN_INLINE u64
48
IO_CONCAT(__IO_PREFIX,ioread64)(const void __iomem *a)
49
{
50
return *(const volatile u64 __force *)a;
51
}
52
53
__EXTERN_INLINE void
54
IO_CONCAT(__IO_PREFIX,iowrite64)(u64 b, void __iomem *a)
55
{
56
*(volatile u64 __force *)a = b;
57
}
58
#endif
59
60
#if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
61
__EXTERN_INLINE u8
62
IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
63
{
64
return __kernel_ldbu(*(const volatile u8 __force *)a);
65
}
66
67
__EXTERN_INLINE u16
68
IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
69
{
70
return __kernel_ldwu(*(const volatile u16 __force *)a);
71
}
72
73
__EXTERN_INLINE void
74
IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
75
{
76
__kernel_stb(b, *(volatile u8 __force *)a);
77
}
78
79
__EXTERN_INLINE void
80
IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
81
{
82
__kernel_stw(b, *(volatile u16 __force *)a);
83
}
84
#elif IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 2
85
__EXTERN_INLINE u8
86
IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
87
{
88
const void __iomem *addr = (const void __iomem *)a;
89
return IO_CONCAT(__IO_PREFIX,ioread8)(addr);
90
}
91
92
__EXTERN_INLINE u16
93
IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
94
{
95
const void __iomem *addr = (const void __iomem *)a;
96
return IO_CONCAT(__IO_PREFIX,ioread16)(addr);
97
}
98
99
__EXTERN_INLINE void
100
IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
101
{
102
void __iomem *addr = (void __iomem *)a;
103
IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
104
}
105
106
__EXTERN_INLINE void
107
IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
108
{
109
void __iomem *addr = (void __iomem *)a;
110
IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
111
}
112
#endif
113
114
#if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
115
__EXTERN_INLINE u32
116
IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a)
117
{
118
return *(const volatile u32 __force *)a;
119
}
120
121
__EXTERN_INLINE u64
122
IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a)
123
{
124
return *(const volatile u64 __force *)a;
125
}
126
127
__EXTERN_INLINE void
128
IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a)
129
{
130
*(volatile u32 __force *)a = b;
131
}
132
133
__EXTERN_INLINE void
134
IO_CONCAT(__IO_PREFIX,writeq)(u64 b, volatile void __iomem *a)
135
{
136
*(volatile u64 __force *)a = b;
137
}
138
#endif
139
140
#if IO_CONCAT(__IO_PREFIX,trivial_iounmap)
141
__EXTERN_INLINE void IO_CONCAT(__IO_PREFIX,iounmap)(volatile void __iomem *a)
142
{
143
}
144
#endif
145
146