diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-27 12:47:13 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-02 06:29:31 -0400 |
commit | c1f64a58003fd2efaa725a857e269a15f765791a (patch) | |
tree | 68a09bddb1c16fbcc748df41ddca4edb4442cb56 /include/asm-x86/io_32.h | |
parent | 1beee8dc8cf58e3f605bd7b34d7a39939be7d8d2 (diff) |
x86: MMIO and gcc re-ordering issue
On Tue, 27 May 2008, Linus Torvalds wrote:
>
> Expecting people to fix up all drivers is simply not going to happen. And
> serializing things shouldn't be *that* expensive. People who cannot take
> the expense can continue to use the magic __raw_writel() etc stuff.
Of course, for non-x86, you kind of have to expect drivers to be
well-behaved, so non-x86 can probably avoid this simply because there are
less relevant drivers involved.
Here's a UNTESTED patch for x86 that may or may not compile and work, and
which serializes (on a compiler level) the IO accesses against regular
memory accesses.
__read[bwlq]()/__write[bwlq]() are not serialized with a :"memory"
barrier, although since they still use "asm volatile" I suspect that i
practice they are probably serial too. Did not look very closely at any
generated code (only did a trivial test to see that the code looks
*roughly* correct).
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-x86/io_32.h')
-rw-r--r-- | include/asm-x86/io_32.h | 49 |
1 files changed, 0 insertions, 49 deletions
diff --git a/include/asm-x86/io_32.h b/include/asm-x86/io_32.h index 049e81e797a0..d71be8df9797 100644 --- a/include/asm-x86/io_32.h +++ b/include/asm-x86/io_32.h | |||
@@ -149,55 +149,6 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | |||
149 | #define virt_to_bus virt_to_phys | 149 | #define virt_to_bus virt_to_phys |
150 | #define bus_to_virt phys_to_virt | 150 | #define bus_to_virt phys_to_virt |
151 | 151 | ||
152 | /* | ||
153 | * readX/writeX() are used to access memory mapped devices. On some | ||
154 | * architectures the memory mapped IO stuff needs to be accessed | ||
155 | * differently. On the x86 architecture, we just read/write the | ||
156 | * memory location directly. | ||
157 | */ | ||
158 | |||
159 | static inline unsigned char readb(const volatile void __iomem *addr) | ||
160 | { | ||
161 | return *(volatile unsigned char __force *)addr; | ||
162 | } | ||
163 | |||
164 | static inline unsigned short readw(const volatile void __iomem *addr) | ||
165 | { | ||
166 | return *(volatile unsigned short __force *)addr; | ||
167 | } | ||
168 | |||
169 | static inline unsigned int readl(const volatile void __iomem *addr) | ||
170 | { | ||
171 | return *(volatile unsigned int __force *) addr; | ||
172 | } | ||
173 | |||
174 | #define readb_relaxed(addr) readb(addr) | ||
175 | #define readw_relaxed(addr) readw(addr) | ||
176 | #define readl_relaxed(addr) readl(addr) | ||
177 | #define __raw_readb readb | ||
178 | #define __raw_readw readw | ||
179 | #define __raw_readl readl | ||
180 | |||
181 | static inline void writeb(unsigned char b, volatile void __iomem *addr) | ||
182 | { | ||
183 | *(volatile unsigned char __force *)addr = b; | ||
184 | } | ||
185 | |||
186 | static inline void writew(unsigned short b, volatile void __iomem *addr) | ||
187 | { | ||
188 | *(volatile unsigned short __force *)addr = b; | ||
189 | } | ||
190 | |||
191 | static inline void writel(unsigned int b, volatile void __iomem *addr) | ||
192 | { | ||
193 | *(volatile unsigned int __force *)addr = b; | ||
194 | } | ||
195 | #define __raw_writeb writeb | ||
196 | #define __raw_writew writew | ||
197 | #define __raw_writel writel | ||
198 | |||
199 | #define mmiowb() | ||
200 | |||
201 | static inline void | 152 | static inline void |
202 | memset_io(volatile void __iomem *addr, unsigned char val, int count) | 153 | memset_io(volatile void __iomem *addr, unsigned char val, int count) |
203 | { | 154 | { |