On Thu, 22 Feb 2007, Atsushi Nemoto wrote:
> The SYNC instruction is not available on MIPS I. Use __sync() instead.
>
> Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
> ---
> diff --git a/include/asm-mips/io.h b/include/asm-mips/io.h
> index 92ec261..855c304 100644
> --- a/include/asm-mips/io.h
> +++ b/include/asm-mips/io.h
> @@ -502,8 +502,7 @@ BUILDSTRING(q, u64)
> #endif
>
>
> -/* Depends on MIPS II instruction set */
> -#define mmiowb() asm volatile ("sync" ::: "memory")
> +#define mmiowb() __sync()
>
> static inline void memset_io(volatile void __iomem *addr, unsigned char val,
> int count)
> {
That's still not correct -- it should probably be defined like mb()
currently is as the write-back buffer may defeat strong ordering (IIRC,
the R2020 can do byte merging). Also the semantics of mmiowb() does not
seem to be well specified -- I gather a sequence of:
writeb(mmioreg, val);
mmiowb();
readb(mmioreg);
should guarantee "val" has reached the register (mmiowb() replacing
incorrect mb() used in many places like this), but with either definition
of mmiowb() and a MIPS-I-style external write-back buffer it will not
work.
Maciej
|