>>>>> On Fri, 07 Jan 2005 00:45:21 +0900 (JST), Atsushi Nemoto <anemo@xxxxxxxxxxxxx> said: anemo> Thanks for your good job. I have a few comments/requests. Revised. 1. How about using 'const void *' for outs*()/reads*() ? This will remove some compiler warnings too. Also, it seems 'volatile' for memory buffer are unneeded. 2. In *in*()/*out*(), it would be better to call __swizzle_addr*() AFTER adding mips_io_port_base. This unifies the meaning of the argument of __swizzle_addr*() (always virtual address). Then, mach-specific __swizzle_addr*() can to every evil thing based on the argument. 3. How about Moving generic ioswab*() to mangle-port.h ? Also how about passing virtual address to *ioswab*() ? Then we can provide mach-specific ioswab*() and can do every evil thing based on its argument. It is usefull on machines which have regions with different endian conversion scheme. Here is a patch for CVS HEAD. diff -urP linux-mips/include/asm-mips/io.h linux/include/asm-mips/io.h --- linux-mips/include/asm-mips/io.h 2005-01-21 00:58:52.000000000 +0900 +++ linux/include/asm-mips/io.h 2005-01-22 01:34:49.000000000 +0900 @@ -39,46 +39,18 @@ * hardware. An example use would be for flash memory that's used for * execute in place. */ -# define __raw_ioswabb(x) (x) -# define __raw_ioswabw(x) (x) -# define __raw_ioswabl(x) (x) -# define __raw_ioswabq(x) (x) - -/* - * Sane hardware offers swapping of PCI/ISA I/O space accesses in hardware; - * less sane hardware forces software to fiddle with this... - */ -#if defined(CONFIG_SWAP_IO_SPACE) - -# define ioswabb(x) (x) -# ifdef CONFIG_SGI_IP22 -/* - * IP22 seems braindead enough to swap 16bits values in hardware, but - * not 32bits. Go figure... Can't tell without documentation. - */ -# define ioswabw(x) (x) -# else -# define ioswabw(x) le16_to_cpu(x) -# endif -# define ioswabl(x) le32_to_cpu(x) -# define ioswabq(x) le64_to_cpu(x) - -#else - -# define ioswabb(x) (x) -# define ioswabw(x) (x) -# define ioswabl(x) (x) -# define ioswabq(x) (x) - -#endif +# define __raw_ioswabb(a,x) (x) +# define __raw_ioswabw(a,x) (x) +# define __raw_ioswabl(a,x) (x) +# define __raw_ioswabq(a,x) (x) /* * Native bus accesses never swapped. */ -#define bus_ioswabb(x) (x) -#define bus_ioswabw(x) (x) -#define bus_ioswabl(x) (x) -#define bus_ioswabq(x) (x) +#define bus_ioswabb(a,x) (x) +#define bus_ioswabw(a,x) (x) +#define bus_ioswabl(a,x) (x) +#define bus_ioswabq(a,x) (x) #define __bus_ioswabq bus_ioswabq @@ -281,7 +253,7 @@ \ __mem = (void *)__swizzle_addr_##bwlq((unsigned long)(mem)); \ \ - __val = pfx##ioswab##bwlq(val); \ + __val = pfx##ioswab##bwlq(__mem, val); \ \ if (sizeof(type) != sizeof(u64) || sizeof(u64) == sizeof(long)) \ *__mem = __val; \ @@ -334,7 +306,7 @@ BUG(); \ } \ \ - return pfx##ioswab##bwlq(__val); \ + return pfx##ioswab##bwlq(__mem, __val); \ } #define __BUILD_IOPORT_SINGLE(pfx, bwlq, type, p, slow) \ @@ -344,10 +316,10 @@ volatile type *__addr; \ type __val; \ \ - port = __swizzle_addr_##bwlq(port); \ __addr = (void *)(mips_io_port_base + port); \ + __addr = (void *)__swizzle_addr_##bwlq((unsigned long)__addr); \ \ - __val = pfx##ioswab##bwlq(val); \ + __val = pfx##ioswab##bwlq(__addr, val); \ \ if (sizeof(type) != sizeof(u64)) { \ *__addr = __val; \ @@ -361,8 +333,8 @@ volatile type *__addr; \ type __val; \ \ - port = __swizzle_addr_##bwlq(port); \ __addr = (void *)(mips_io_port_base + port); \ + __addr = (void *)__swizzle_addr_##bwlq((unsigned long)__addr); \ \ if (sizeof(type) != sizeof(u64)) { \ __val = *__addr; \ @@ -372,7 +344,7 @@ BUILD_BUG(); \ } \ \ - return pfx##ioswab##bwlq(__val); \ + return pfx##ioswab##bwlq(__addr, __val); \ } #define __BUILD_MEMORY_PFX(bus, bwlq, type) \ @@ -416,10 +388,10 @@ #define __BUILD_MEMORY_STRING(bwlq, type) \ \ -static inline void writes##bwlq(volatile void __iomem *mem, void *addr, \ +static inline void writes##bwlq(volatile void __iomem *mem, const void *addr, \ unsigned int count) \ { \ - volatile type *__addr = addr; \ + const type *__addr = addr; \ \ while (count--) { \ __raw_write##bwlq(*__addr, mem); \ @@ -430,7 +402,7 @@ static inline void reads##bwlq(volatile void __iomem *mem, void *addr, \ unsigned int count) \ { \ - volatile type *__addr = addr; \ + type *__addr = addr; \ \ while (count--) { \ *__addr = __raw_read##bwlq(mem); \ @@ -440,10 +412,10 @@ #define __BUILD_IOPORT_STRING(bwlq, type) \ \ -static inline void outs##bwlq(unsigned long port, void *addr, \ +static inline void outs##bwlq(unsigned long port, const void *addr, \ unsigned int count) \ { \ - volatile type *__addr = addr; \ + const type *__addr = addr; \ \ while (count--) { \ __raw_out##bwlq(*__addr, port); \ @@ -454,7 +426,7 @@ static inline void ins##bwlq(unsigned long port, void *addr, \ unsigned int count) \ { \ - volatile type *__addr = addr; \ + type *__addr = addr; \ \ while (count--) { \ *__addr = __raw_in##bwlq(port); \ diff -urP linux-mips/include/asm-mips/mach-generic/mangle-port.h linux/include/asm-mips/mach-generic/mangle-port.h --- linux-mips/include/asm-mips/mach-generic/mangle-port.h 2004-08-21 00:34:13.000000000 +0900 +++ linux/include/asm-mips/mach-generic/mangle-port.h 2005-01-22 01:35:03.000000000 +0900 @@ -13,4 +13,24 @@ #define __swizzle_addr_l(port) (port) #define __swizzle_addr_q(port) (port) +/* + * Sane hardware offers swapping of PCI/ISA I/O space accesses in hardware; + * less sane hardware forces software to fiddle with this... + */ +#if defined(CONFIG_SWAP_IO_SPACE) + +# define ioswabb(a,x) (x) +# define ioswabw(a,x) le16_to_cpu(x) +# define ioswabl(a,x) le32_to_cpu(x) +# define ioswabq(a,x) le64_to_cpu(x) + +#else + +# define ioswabb(a,x) (x) +# define ioswabw(a,x) (x) +# define ioswabl(a,x) (x) +# define ioswabq(a,x) (x) + +#endif + #endif /* __ASM_MACH_GENERIC_MANGLE_PORT_H */ diff -urP linux-mips/include/asm-mips/mach-ip22/mangle-port.h linux/include/asm-mips/mach-ip22/mangle-port.h --- linux-mips/include/asm-mips/mach-ip22/mangle-port.h 1970-01-01 09:00:00.000000000 +0900 +++ linux/include/asm-mips/mach-ip22/mangle-port.h 2005-01-22 01:40:59.000000000 +0900 @@ -0,0 +1,25 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2003, 2004 Ralf Baechle + */ +#ifndef __ASM_MACH_IP22_MANGLE_PORT_H +#define __ASM_MACH_IP22_MANGLE_PORT_H + +#define __swizzle_addr_b(port) (port) +#define __swizzle_addr_w(port) (port) +#define __swizzle_addr_l(port) (port) +#define __swizzle_addr_q(port) (port) + +/* + * IP22 seems braindead enough to swap 16bits values in hardware, but + * not 32bits. Go figure... Can't tell without documentation. + */ +#define ioswabb(a,x) (x) +#define ioswabw(a,x) (x) +#define ioswabl(a,x) le32_to_cpu(x) +#define ioswabq(a,x) le64_to_cpu(x) + +#endif /* __ASM_MACH_IP22_MANGLE_PORT_H */ diff -urP linux-mips/include/asm-mips/mach-ip27/mangle-port.h linux/include/asm-mips/mach-ip27/mangle-port.h --- linux-mips/include/asm-mips/mach-ip27/mangle-port.h 2004-08-21 00:34:13.000000000 +0900 +++ linux/include/asm-mips/mach-ip27/mangle-port.h 2005-01-22 01:35:17.000000000 +0900 @@ -13,4 +13,9 @@ #define __swizzle_addr_l(port) (port) #define __swizzle_addr_q(port) (port) +#define ioswabb(a,x) (x) +#define ioswabw(a,x) (x) +#define ioswabl(a,x) (x) +#define ioswabq(a,x) (x) + #endif /* __ASM_MACH_IP27_MANGLE_PORT_H */ diff -urP linux-mips/include/asm-mips/mach-ip32/mangle-port.h linux/include/asm-mips/mach-ip32/mangle-port.h --- linux-mips/include/asm-mips/mach-ip32/mangle-port.h 2004-10-27 23:30:28.000000000 +0900 +++ linux/include/asm-mips/mach-ip32/mangle-port.h 2005-01-22 01:35:23.000000000 +0900 @@ -14,4 +14,9 @@ #define __swizzle_addr_l(port) (port) #define __swizzle_addr_q(port) (port) +#define ioswabb(a,x) (x) +#define ioswabw(a,x) (x) +#define ioswabl(a,x) (x) +#define ioswabq(a,x) (x) + #endif /* __ASM_MACH_IP32_MANGLE_PORT_H */ --- Atsushi Nemoto