]>
Commit | Line | Data |
---|---|---|
b00dc837 | 1 | /* |
1da177e4 LT |
2 | * PeeCeeI.c: The emerging standard... |
3 | * | |
4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) | |
5 | */ | |
6 | ||
917c3660 SR |
7 | #include <linux/module.h> |
8 | ||
1da177e4 LT |
9 | #include <asm/io.h> |
10 | #include <asm/byteorder.h> | |
11 | ||
8a36895c | 12 | void outsb(unsigned long __addr, const void *src, unsigned long count) |
1da177e4 | 13 | { |
8a36895c | 14 | void __iomem *addr = (void __iomem *) __addr; |
1da177e4 LT |
15 | const u8 *p = src; |
16 | ||
8a36895c | 17 | while (count--) |
1da177e4 LT |
18 | outb(*p++, addr); |
19 | } | |
917c3660 | 20 | EXPORT_SYMBOL(outsb); |
1da177e4 | 21 | |
8a36895c | 22 | void outsw(unsigned long __addr, const void *src, unsigned long count) |
1da177e4 | 23 | { |
8a36895c DM |
24 | void __iomem *addr = (void __iomem *) __addr; |
25 | ||
1758ef68 HH |
26 | while (count--) { |
27 | __raw_writew(*(u16 *)src, addr); | |
28 | src += sizeof(u16); | |
1da177e4 LT |
29 | } |
30 | } | |
917c3660 | 31 | EXPORT_SYMBOL(outsw); |
1da177e4 | 32 | |
8a36895c | 33 | void outsl(unsigned long __addr, const void *src, unsigned long count) |
1da177e4 | 34 | { |
8a36895c | 35 | void __iomem *addr = (void __iomem *) __addr; |
1758ef68 | 36 | u32 l, l2; |
8a36895c | 37 | |
1758ef68 HH |
38 | if (!count) |
39 | return; | |
1da177e4 | 40 | |
1758ef68 HH |
41 | switch (((unsigned long)src) & 0x3) { |
42 | case 0x0: | |
43 | /* src is naturally aligned */ | |
44 | while (count--) { | |
45 | __raw_writel(*(u32 *)src, addr); | |
46 | src += sizeof(u32); | |
47 | } | |
48 | break; | |
49 | case 0x2: | |
50 | /* 2-byte alignment */ | |
51 | while (count--) { | |
52 | l = (*(u16 *)src) << 16; | |
53 | l |= *(u16 *)(src + sizeof(u16)); | |
54 | __raw_writel(l, addr); | |
55 | src += sizeof(u32); | |
56 | } | |
57 | break; | |
58 | case 0x1: | |
59 | /* Hold three bytes in l each time, grab a byte from l2 */ | |
60 | l = (*(u8 *)src) << 24; | |
61 | l |= (*(u16 *)(src + sizeof(u8))) << 8; | |
62 | src += sizeof(u8) + sizeof(u16); | |
63 | while (count--) { | |
64 | l2 = *(u32 *)src; | |
65 | l |= (l2 >> 24); | |
66 | __raw_writel(l, addr); | |
67 | l = l2 << 8; | |
68 | src += sizeof(u32); | |
69 | } | |
70 | break; | |
71 | case 0x3: | |
72 | /* Hold a byte in l each time, grab 3 bytes from l2 */ | |
73 | l = (*(u8 *)src) << 24; | |
74 | src += sizeof(u8); | |
75 | while (count--) { | |
76 | l2 = *(u32 *)src; | |
77 | l |= (l2 >> 8); | |
78 | __raw_writel(l, addr); | |
79 | l = l2 << 24; | |
80 | src += sizeof(u32); | |
1da177e4 | 81 | } |
1758ef68 | 82 | break; |
1da177e4 LT |
83 | } |
84 | } | |
917c3660 | 85 | EXPORT_SYMBOL(outsl); |
1da177e4 | 86 | |
8a36895c | 87 | void insb(unsigned long __addr, void *dst, unsigned long count) |
1da177e4 | 88 | { |
8a36895c DM |
89 | void __iomem *addr = (void __iomem *) __addr; |
90 | ||
91 | if (count) { | |
1da177e4 LT |
92 | u32 *pi; |
93 | u8 *pb = dst; | |
94 | ||
8a36895c | 95 | while ((((unsigned long)pb) & 0x3) && count--) |
1da177e4 LT |
96 | *pb++ = inb(addr); |
97 | pi = (u32 *)pb; | |
8a36895c | 98 | while (count >= 4) { |
1da177e4 LT |
99 | u32 w; |
100 | ||
101 | w = (inb(addr) << 24); | |
102 | w |= (inb(addr) << 16); | |
103 | w |= (inb(addr) << 8); | |
104 | w |= (inb(addr) << 0); | |
105 | *pi++ = w; | |
106 | count -= 4; | |
107 | } | |
108 | pb = (u8 *)pi; | |
8a36895c | 109 | while (count--) |
1da177e4 LT |
110 | *pb++ = inb(addr); |
111 | } | |
112 | } | |
917c3660 | 113 | EXPORT_SYMBOL(insb); |
1da177e4 | 114 | |
8a36895c | 115 | void insw(unsigned long __addr, void *dst, unsigned long count) |
1da177e4 | 116 | { |
8a36895c DM |
117 | void __iomem *addr = (void __iomem *) __addr; |
118 | ||
119 | if (count) { | |
1da177e4 LT |
120 | u16 *ps = dst; |
121 | u32 *pi; | |
122 | ||
8a36895c | 123 | if (((unsigned long)ps) & 0x2) { |
1da177e4 LT |
124 | *ps++ = le16_to_cpu(inw(addr)); |
125 | count--; | |
126 | } | |
127 | pi = (u32 *)ps; | |
8a36895c | 128 | while (count >= 2) { |
1da177e4 LT |
129 | u32 w; |
130 | ||
131 | w = (le16_to_cpu(inw(addr)) << 16); | |
132 | w |= (le16_to_cpu(inw(addr)) << 0); | |
133 | *pi++ = w; | |
134 | count -= 2; | |
135 | } | |
136 | ps = (u16 *)pi; | |
8a36895c | 137 | if (count) |
1da177e4 LT |
138 | *ps = le16_to_cpu(inw(addr)); |
139 | } | |
140 | } | |
917c3660 | 141 | EXPORT_SYMBOL(insw); |
1da177e4 | 142 | |
8a36895c | 143 | void insl(unsigned long __addr, void *dst, unsigned long count) |
1da177e4 | 144 | { |
8a36895c DM |
145 | void __iomem *addr = (void __iomem *) __addr; |
146 | ||
147 | if (count) { | |
148 | if ((((unsigned long)dst) & 0x3) == 0) { | |
1da177e4 | 149 | u32 *pi = dst; |
8a36895c | 150 | while (count--) |
1da177e4 LT |
151 | *pi++ = le32_to_cpu(inl(addr)); |
152 | } else { | |
153 | u32 l = 0, l2, *pi; | |
154 | u16 *ps; | |
155 | u8 *pb; | |
156 | ||
8a36895c | 157 | switch (((unsigned long)dst) & 3) { |
1da177e4 LT |
158 | case 0x2: |
159 | ps = dst; | |
160 | count -= 1; | |
161 | l = le32_to_cpu(inl(addr)); | |
162 | *ps++ = l; | |
163 | pi = (u32 *)ps; | |
8a36895c | 164 | while (count--) { |
1da177e4 LT |
165 | l2 = le32_to_cpu(inl(addr)); |
166 | *pi++ = (l << 16) | (l2 >> 16); | |
167 | l = l2; | |
168 | } | |
169 | ps = (u16 *)pi; | |
170 | *ps = l; | |
171 | break; | |
172 | ||
173 | case 0x1: | |
174 | pb = dst; | |
175 | count -= 1; | |
176 | l = le32_to_cpu(inl(addr)); | |
177 | *pb++ = l >> 24; | |
178 | ps = (u16 *)pb; | |
179 | *ps++ = ((l >> 8) & 0xffff); | |
180 | pi = (u32 *)ps; | |
8a36895c | 181 | while (count--) { |
1da177e4 LT |
182 | l2 = le32_to_cpu(inl(addr)); |
183 | *pi++ = (l << 24) | (l2 >> 8); | |
184 | l = l2; | |
185 | } | |
186 | pb = (u8 *)pi; | |
187 | *pb = l; | |
188 | break; | |
189 | ||
190 | case 0x3: | |
191 | pb = (u8 *)dst; | |
192 | count -= 1; | |
193 | l = le32_to_cpu(inl(addr)); | |
194 | *pb++ = l >> 24; | |
195 | pi = (u32 *)pb; | |
8a36895c | 196 | while (count--) { |
1da177e4 LT |
197 | l2 = le32_to_cpu(inl(addr)); |
198 | *pi++ = (l << 8) | (l2 >> 24); | |
199 | l = l2; | |
200 | } | |
201 | ps = (u16 *)pi; | |
202 | *ps++ = ((l >> 8) & 0xffff); | |
203 | pb = (u8 *)ps; | |
204 | *pb = l; | |
205 | break; | |
206 | } | |
207 | } | |
208 | } | |
209 | } | |
917c3660 | 210 | EXPORT_SYMBOL(insl); |
1da177e4 | 211 |