Patchwork [U-Boot] MIPS: fix __raw_* IO accessors

login
register
mail settings
Submitter Gabor Juhos
Date Feb. 21, 2013, 8:03 a.m.
Message ID <1361433781-15791-1-git-send-email-juhosg@openwrt.org>
Download mbox | patch
Permalink /patch/222195/
State Accepted
Delegated to: Daniel Schwierzeck
Headers show

Comments

Gabor Juhos - Feb. 21, 2013, 8:03 a.m.
The purpose of the __raw* IO accessors is to provide
IO access in native-endian order. However in the current
MIPS implementation, the 16 and 32 bit variants of the
__raw accessors are swapping the values on big-endian
systems if the CONFIG_SWAP_IO_SPACE option is enabled.

The patch changes the IO accessor macros to fix this
broken behaviour.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
---
Note:

The change does not affect the existing MIPS targets
because none of those are using CONFIG_SWAP_IO_SPACE.
Compiling all MIPS targets results in the same binary
image with and without the patch.
---
 arch/mips/include/asm/io.h |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)
Daniel Schwierzeck - Feb. 23, 2013, 5:30 p.m.
2013/2/21 Gabor Juhos <juhosg@openwrt.org>:
> The purpose of the __raw* IO accessors is to provide
> IO access in native-endian order. However in the current
> MIPS implementation, the 16 and 32 bit variants of the
> __raw accessors are swapping the values on big-endian
> systems if the CONFIG_SWAP_IO_SPACE option is enabled.
>
> The patch changes the IO accessor macros to fix this
> broken behaviour.
>
> Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
> Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
> ---
> Note:
>
> The change does not affect the existing MIPS targets
> because none of those are using CONFIG_SWAP_IO_SPACE.
> Compiling all MIPS targets results in the same binary
> image with and without the patch.
> ---
>  arch/mips/include/asm/io.h |   26 +++++++++++++-------------
>  1 file changed, 13 insertions(+), 13 deletions(-)
>

applied to u-boot-mips/master, thanks

Patch

diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h
index 3864c80..50a882c 100644
--- a/arch/mips/include/asm/io.h
+++ b/arch/mips/include/asm/io.h
@@ -184,19 +184,19 @@  extern void iounmap(void *addr);
  * 24-31 on SNI.
  * XXX more SNI hacks.
  */
-#define readb(addr) (*(volatile unsigned char *)(addr))
-#define readw(addr) __ioswab16((*(volatile unsigned short *)(addr)))
-#define readl(addr) __ioswab32((*(volatile unsigned int *)(addr)))
-#define __raw_readb readb
-#define __raw_readw readw
-#define __raw_readl readl
-
-#define writeb(b,addr) (*(volatile unsigned char *)(addr)) = (b)
-#define writew(b,addr) (*(volatile unsigned short *)(addr)) = (__ioswab16(b))
-#define writel(b,addr) (*(volatile unsigned int *)(addr)) = (__ioswab32(b))
-#define __raw_writeb writeb
-#define __raw_writew writew
-#define __raw_writel writel
+#define __raw_readb(addr) (*(volatile unsigned char *)(addr))
+#define __raw_readw(addr) (*(volatile unsigned short *)(addr))
+#define __raw_readl(addr) (*(volatile unsigned int *)(addr))
+#define readb(addr) __raw_readb((addr))
+#define readw(addr) __ioswab16(__raw_readw((addr)))
+#define readl(addr) __ioswab32(__raw_readl((addr)))
+
+#define __raw_writeb(b, addr) (*(volatile unsigned char *)(addr)) = (b)
+#define __raw_writew(b, addr) (*(volatile unsigned short *)(addr)) = (b)
+#define __raw_writel(b, addr) (*(volatile unsigned int *)(addr)) = (b)
+#define writeb(b, addr) __raw_writeb((b), (addr))
+#define writew(b, addr) __raw_writew(__ioswab16(b), (addr))
+#define writel(b, addr) __raw_writel(__ioswab32(b), (addr))
 
 #define memset_io(a,b,c)	memset((void *)(a),(b),(c))
 #define memcpy_fromio(a,b,c)	memcpy((a),(void *)(b),(c))