* [PATCH 0 of 3] MMIO 32-bit copy routine, the final frontier
@ 2006-01-11 22:39 Bryan O'Sullivan
2006-01-11 22:39 ` [PATCH 1 of 3] Introduce __raw_memcpy_toio32 Bryan O'Sullivan
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Bryan O'Sullivan @ 2006-01-11 22:39 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel, hch, ak
[-- Attachment #1: Type: text/plain, Size: 722 bytes --]
After yet more review comments from several people, here is a reworked
set of 32-bit MMIO copy patches. This may even be the final set.
These define the generic __raw_memcpy_toio32 as a weak symbol, which
arches are free to override. We provide a specialised implementation
for x86_64.
These patches should apply cleanly against current -git, and have been
tested on i386 and x86_64.
The patch series is as follows:
raw_memcpy_io.patch
Introduce the generic MMIO 32-bit copy routine.
x86_64-memcpy32.patch
Add memcpy32 routine to x86_64.
arch-specific-raw_memcpy_io.patch
Get each arch to use generic memcpy_io code, except x86_64, which
uses memcpy32.
Signed-off-by: Bryan O'Sullivan <bos@pathscale.com>
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH 1 of 3] Introduce __raw_memcpy_toio32 2006-01-11 22:39 [PATCH 0 of 3] MMIO 32-bit copy routine, the final frontier Bryan O'Sullivan @ 2006-01-11 22:39 ` Bryan O'Sullivan 2006-01-11 23:43 ` Andrew Morton 2006-01-11 22:39 ` [PATCH 2 of 3] memcpy32 for x86_64 Bryan O'Sullivan 2006-01-11 22:39 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan 2 siblings, 1 reply; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-11 22:39 UTC (permalink / raw) To: akpm; +Cc: linux-kernel, hch, ak This arch-independent routine copies data to a memory-mapped I/O region, using 32-bit accesses. It does not guarantee access ordering, nor does it perform a memory barrier afterwards. This style of access is required by some devices. Signed-off-by: Bryan O'Sullivan <bos@pathscale.com> diff -r c90267e4a29b -r 05b3d1af27eb lib/Makefile --- a/lib/Makefile Wed Jan 11 13:31:24 2006 +0800 +++ b/lib/Makefile Wed Jan 11 14:35:45 2006 -0800 @@ -5,7 +5,7 @@ lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ idr.o div64.o int_sqrt.o bitmap.o extable.o prio_tree.o \ - sha1.o + sha1.o raw_memcpy_io.o lib-y += kobject.o kref.o kobject_uevent.o klist.o diff -r c90267e4a29b -r 05b3d1af27eb lib/raw_memcpy_io.c --- /dev/null Thu Jan 1 00:00:00 1970 +0000 +++ b/lib/raw_memcpy_io.c Wed Jan 11 14:35:45 2006 -0800 @@ -0,0 +1,41 @@ +/* + * Copyright 2006 PathScale, Inc. All Rights Reserved. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <linux/module.h> +#include <asm/io.h> + +/** + * __raw_memcpy_toio32 - copy data to MMIO space, in 32-bit units + * @to: destination, in MMIO space (must be 32-bit aligned) + * @from: source (must be 32-bit aligned) + * @count: number of 32-bit quantities to copy + * + * Copy data from kernel space to MMIO space, in units of 32 bits at a + * time. Order of access is not guaranteed, nor is a memory barrier + * performed afterwards. + */ +void __attribute__((weak)) __raw_memcpy_toio32(void __iomem *to, + const void *from, size_t count) +{ + u32 __iomem *dst = to; + const u32 *src = from; + const u32 *end = src + count; + + while (src < end) + __raw_writel(*src++, dst++); +} +EXPORT_SYMBOL_GPL(__raw_memcpy_toio32); ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1 of 3] Introduce __raw_memcpy_toio32 2006-01-11 22:39 ` [PATCH 1 of 3] Introduce __raw_memcpy_toio32 Bryan O'Sullivan @ 2006-01-11 23:43 ` Andrew Morton 0 siblings, 0 replies; 15+ messages in thread From: Andrew Morton @ 2006-01-11 23:43 UTC (permalink / raw) To: Bryan O'Sullivan; +Cc: linux-kernel, hch, ak "Bryan O'Sullivan" <bos@pathscale.com> wrote: > > lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ > bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ > idr.o div64.o int_sqrt.o bitmap.o extable.o prio_tree.o \ > - sha1.o > + sha1.o raw_memcpy_io.o You'll find that if nothing in vmlinux references __raw_memcpy_toio32 then this file won't be included in vmlinux and __raw_memcpy_toio32 won't be available to modules. I'll move this to obj-y, which does the right thing. ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2 of 3] memcpy32 for x86_64 2006-01-11 22:39 [PATCH 0 of 3] MMIO 32-bit copy routine, the final frontier Bryan O'Sullivan 2006-01-11 22:39 ` [PATCH 1 of 3] Introduce __raw_memcpy_toio32 Bryan O'Sullivan @ 2006-01-11 22:39 ` Bryan O'Sullivan 2006-01-11 23:45 ` Roland Dreier 2006-01-11 22:39 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan 2 siblings, 1 reply; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-11 22:39 UTC (permalink / raw) To: akpm; +Cc: linux-kernel, hch, ak Introduce an x86_64-specific memcpy32 routine. The routine is similar to memcpy, but is guaranteed to work in units of 32 bits at a time. Signed-off-by: Bryan O'Sullivan <bos@pathscale.com> diff -r 05b3d1af27eb -r 1052904816d7 arch/x86_64/kernel/x8664_ksyms.c --- a/arch/x86_64/kernel/x8664_ksyms.c Wed Jan 11 14:35:45 2006 -0800 +++ b/arch/x86_64/kernel/x8664_ksyms.c Wed Jan 11 14:35:45 2006 -0800 @@ -163,6 +163,8 @@ EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(__memcpy); +EXPORT_SYMBOL_GPL(memcpy32); + #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM /* prototypes are wrong, these are assembly with custom calling functions */ extern void rwsem_down_read_failed_thunk(void); diff -r 05b3d1af27eb -r 1052904816d7 arch/x86_64/lib/Makefile --- a/arch/x86_64/lib/Makefile Wed Jan 11 14:35:45 2006 -0800 +++ b/arch/x86_64/lib/Makefile Wed Jan 11 14:35:45 2006 -0800 @@ -9,4 +9,4 @@ lib-y := csum-partial.o csum-copy.o csum-wrappers.o delay.o \ usercopy.o getuser.o putuser.o \ thunk.o clear_page.o copy_page.o bitstr.o bitops.o -lib-y += memcpy.o memmove.o memset.o copy_user.o +lib-y += memcpy.o memcpy32.o memmove.o memset.o copy_user.o diff -r 05b3d1af27eb -r 1052904816d7 include/asm-x86_64/string.h --- a/include/asm-x86_64/string.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-x86_64/string.h Wed Jan 11 14:35:45 2006 -0800 @@ -45,6 +45,9 @@ #define __HAVE_ARCH_MEMMOVE void * memmove(void * dest,const void *src,size_t count); +/* copy data, 32 bits at a time */ +void memcpy32(void *dst, const void *src, size_t count); + /* Use C out of line version for memcmp */ #define memcmp __builtin_memcmp int memcmp(const void * cs,const void * ct,size_t count); diff -r 05b3d1af27eb -r 1052904816d7 arch/x86_64/lib/memcpy32.S --- /dev/null Thu Jan 1 00:00:00 1970 +0000 +++ b/arch/x86_64/lib/memcpy32.S Wed Jan 11 14:35:45 2006 -0800 @@ -0,0 +1,32 @@ +/* + * Copyright 2006 PathScale, Inc. All Rights Reserved. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** + * memcpy32 - copy data, in units of 32 bits at a time + * @dst: destination (must be 32-bit aligned) + * @src: source (must be 32-bit aligned) + * @count: number of 32-bit quantities to copy + */ + .globl memcpy32 +memcpy32: + movl %edx,%ecx + shrl $1,%ecx + andl $1,%edx + rep movsq + movl %edx,%ecx + rep movsd + ret ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] memcpy32 for x86_64 2006-01-11 22:39 ` [PATCH 2 of 3] memcpy32 for x86_64 Bryan O'Sullivan @ 2006-01-11 23:45 ` Roland Dreier 2006-01-12 0:03 ` Bryan O'Sullivan 0 siblings, 1 reply; 15+ messages in thread From: Roland Dreier @ 2006-01-11 23:45 UTC (permalink / raw) To: Bryan O'Sullivan; +Cc: akpm, linux-kernel, hch, ak > +/** > + * memcpy32 - copy data, in units of 32 bits at a time > + * @dst: destination (must be 32-bit aligned) > + * @src: source (must be 32-bit aligned) > + * @count: number of 32-bit quantities to copy > + */ > + .globl memcpy32 > +memcpy32: > + movl %edx,%ecx > + shrl $1,%ecx > + andl $1,%edx > + rep movsq > + movl %edx,%ecx > + rep movsd > + ret Sorry to keep this going still further, but I'm still confused. Why can't this assembly just define __raw_memcpy_toio32() directly? In other words, Why do we need to introduce the indirection of having a stub in C that calls the memcpy32 assembly routine? Is there some reason having to do with linker magic and weak symbols? Could it be solved by using gcc inline assembly rather than putting the assembly in a .S file? Also why does memcpy32() need to be exported? There are no users other than the x86_64 version of __raw_memcpy_toio32(), and memcpy32() doesn't seem like an API we want to add to every arch anyway. - R. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] memcpy32 for x86_64 2006-01-11 23:45 ` Roland Dreier @ 2006-01-12 0:03 ` Bryan O'Sullivan 0 siblings, 0 replies; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-12 0:03 UTC (permalink / raw) To: Roland Dreier; +Cc: akpm, linux-kernel, hch, ak On Wed, 2006-01-11 at 15:45 -0800, Roland Dreier wrote: > Sorry to keep this going still further, but I'm still confused. Why > can't this assembly just define __raw_memcpy_toio32() directly? It certainly can. I've just been buried in this bloody thing for a little too long. <b ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-11 22:39 [PATCH 0 of 3] MMIO 32-bit copy routine, the final frontier Bryan O'Sullivan 2006-01-11 22:39 ` [PATCH 1 of 3] Introduce __raw_memcpy_toio32 Bryan O'Sullivan 2006-01-11 22:39 ` [PATCH 2 of 3] memcpy32 for x86_64 Bryan O'Sullivan @ 2006-01-11 22:39 ` Bryan O'Sullivan 2006-01-11 23:46 ` Andrew Morton 2 siblings, 1 reply; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-11 22:39 UTC (permalink / raw) To: akpm; +Cc: linux-kernel, hch, ak Most arches use the generic routine. x86_64 uses memcpy32 instead; this is substantially faster, even over a bus that is much slower than the CPU. Signed-off-by: Bryan O'Sullivan <bos@pathscale.com> diff -r 1052904816d7 -r ee6ce7e55dc7 arch/x86_64/lib/io.c --- a/arch/x86_64/lib/io.c Wed Jan 11 14:35:45 2006 -0800 +++ b/arch/x86_64/lib/io.c Wed Jan 11 14:35:45 2006 -0800 @@ -21,3 +21,9 @@ memset((void *)a,b,c); } EXPORT_SYMBOL(memset_io); + +/* override generic definition in lib/raw_memcpy_io.c */ +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count) +{ + memcpy32((void __force *) to, from, count); +} diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-alpha/io.h --- a/include/asm-alpha/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-alpha/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -504,6 +504,8 @@ extern void memcpy_toio(volatile void __iomem *, const void *, long); extern void _memset_c_io(volatile void __iomem *, unsigned long, long); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + static inline void memset_io(volatile void __iomem *addr, u8 c, long len) { _memset_c_io(addr, 0x0101010101010101UL * c, len); diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-arm/io.h --- a/include/asm-arm/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-arm/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -189,6 +189,8 @@ #define memset_io(c,v,l) _memset_io(__mem_pci(c),(v),(l)) #define memcpy_fromio(a,c,l) _memcpy_fromio((a),__mem_pci(c),(l)) #define memcpy_toio(c,a,l) _memcpy_toio(__mem_pci(c),(a),(l)) + +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); #define eth_io_copy_and_sum(s,c,l,b) \ eth_copy_and_sum((s),__mem_pci(c),(l),(b)) diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-cris/io.h --- a/include/asm-cris/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-cris/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -121,6 +121,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Again, CRIS does not require mem IO specific function. */ diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-frv/io.h --- a/include/asm-frv/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-frv/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -127,6 +127,8 @@ memcpy((void __force *) dst, src, count); } +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + static inline uint8_t inb(unsigned long addr) { return __builtin_read8((void *)addr); diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-h8300/io.h --- a/include/asm-h8300/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-h8300/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -209,6 +209,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define mmiowb() #define inb(addr) ((h8300_buswidth(addr))?readw((addr) & ~1) & 0xff:readb(addr)) diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-i386/io.h --- a/include/asm-i386/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-i386/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -203,6 +203,8 @@ { __memcpy((void __force *) dst, src, count); } + +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); /* * ISA space is 'always mapped' on a typical x86 system, no need to diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-ia64/io.h --- a/include/asm-ia64/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-ia64/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -444,6 +444,8 @@ extern void memcpy_toio(volatile void __iomem *dst, const void *src, long n); extern void memset_io(volatile void __iomem *s, int c, long n); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define dma_cache_inv(_start,_size) do { } while (0) #define dma_cache_wback(_start,_size) do { } while (0) #define dma_cache_wback_inv(_start,_size) do { } while (0) diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-m32r/io.h --- a/include/asm-m32r/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-m32r/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -216,6 +216,8 @@ memcpy((void __force *) dst, src, count); } +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Convert a physical pointer to a virtual kernel pointer for /dev/mem * access diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-m68knommu/io.h --- a/include/asm-m68knommu/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-m68knommu/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -113,6 +113,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define inb(addr) readb(addr) #define inw(addr) readw(addr) #define inl(addr) readl(addr) diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-mips/io.h --- a/include/asm-mips/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-mips/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -534,6 +534,8 @@ memcpy((void __force *) dst, src, count); } +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Memory Mapped I/O */ diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-parisc/io.h --- a/include/asm-parisc/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-parisc/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -294,6 +294,8 @@ void memcpy_fromio(void *dst, const volatile void __iomem *src, int count); void memcpy_toio(volatile void __iomem *dst, const void *src, int count); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* Support old drivers which don't ioremap. * NB this interface is scheduled to disappear in 2.5 */ diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-powerpc/io.h --- a/include/asm-powerpc/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-powerpc/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -64,6 +64,8 @@ #define memcpy_fromio(a,b,c) iSeries_memcpy_fromio((a), (b), (c)) #define memcpy_toio(a,b,c) iSeries_memcpy_toio((a), (b), (c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define inb(addr) readb(((void __iomem *)(long)(addr))) #define inw(addr) readw(((void __iomem *)(long)(addr))) #define inl(addr) readl(((void __iomem *)(long)(addr))) diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-ppc/io.h --- a/include/asm-ppc/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-ppc/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -369,6 +369,8 @@ } #endif +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),(void __force *)(void __iomem *)(b),(c),(d)) /* diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-s390/io.h --- a/include/asm-s390/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-s390/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -99,6 +99,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c)) #define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define inb_p(addr) readb(addr) #define inb(addr) readb(addr) diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-sh/io.h --- a/include/asm-sh/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-sh/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -177,6 +177,8 @@ extern void memcpy_toio(unsigned long, const void *, unsigned long); extern void memset_io(unsigned long, int, unsigned long); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* SuperH on-chip I/O functions */ static __inline__ unsigned char ctrl_inb(unsigned long addr) { diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-sh64/io.h --- a/include/asm-sh64/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-sh64/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -125,6 +125,8 @@ void memcpy_toio(void __iomem *to, const void *from, long count); void memcpy_fromio(void *to, void __iomem *from, long count); + +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); #define mmiowb() diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-sparc/io.h --- a/include/asm-sparc/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-sparc/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -239,6 +239,8 @@ #define memcpy_toio(d,s,sz) _memcpy_toio(d,s,sz) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #ifdef __KERNEL__ /* diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-sparc64/io.h --- a/include/asm-sparc64/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-sparc64/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -440,6 +440,8 @@ #define memcpy_toio(d,s,sz) _memcpy_toio(d,s,sz) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + static inline int check_signature(void __iomem *io_addr, const unsigned char *signature, int length) diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-v850/io.h --- a/include/asm-v850/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-v850/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -130,6 +130,8 @@ #define memcpy_fromio(dst, src, len) memcpy (dst, (void *)src, len) #define memcpy_toio(dst, src, len) memcpy ((void *)dst, src, len) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Convert a physical pointer to a virtual kernel pointer for /dev/mem * access diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-x86_64/io.h --- a/include/asm-x86_64/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-x86_64/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -252,6 +252,8 @@ __memcpy_toio((unsigned long)to,from,len); } +void __raw_memcpy_toio32(void __iomem *dst, const void *src, size_t count); + void memset_io(volatile void __iomem *a, int b, size_t c); /* diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-xtensa/io.h --- a/include/asm-xtensa/io.h Wed Jan 11 14:35:45 2006 -0800 +++ b/include/asm-xtensa/io.h Wed Jan 11 14:35:45 2006 -0800 @@ -159,6 +159,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* At this point the Xtensa doesn't provide byte swap instructions */ #ifdef __XTENSA_EB__ ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-11 22:39 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan @ 2006-01-11 23:46 ` Andrew Morton 2006-01-12 0:05 ` Bryan O'Sullivan 0 siblings, 1 reply; 15+ messages in thread From: Andrew Morton @ 2006-01-11 23:46 UTC (permalink / raw) To: Bryan O'Sullivan; +Cc: linux-kernel, hch, ak "Bryan O'Sullivan" <bos@pathscale.com> wrote: > > Most arches use the generic routine. x86_64 uses memcpy32 instead; > this is substantially faster, even over a bus that is much slower than > the CPU. > > Signed-off-by: Bryan O'Sullivan <bos@pathscale.com> > > diff -r 1052904816d7 -r ee6ce7e55dc7 arch/x86_64/lib/io.c > --- a/arch/x86_64/lib/io.c Wed Jan 11 14:35:45 2006 -0800 > +++ b/arch/x86_64/lib/io.c Wed Jan 11 14:35:45 2006 -0800 > @@ -21,3 +21,9 @@ > memset((void *)a,b,c); > } > EXPORT_SYMBOL(memset_io); > + > +/* override generic definition in lib/raw_memcpy_io.c */ > +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count) > +{ > + memcpy32((void __force *) to, from, count); > +} > diff -r 1052904816d7 -r ee6ce7e55dc7 include/asm-alpha/io.h > --- a/include/asm-alpha/io.h Wed Jan 11 14:35:45 2006 -0800 > +++ b/include/asm-alpha/io.h Wed Jan 11 14:35:45 2006 -0800 > @@ -504,6 +504,8 @@ > extern void memcpy_toio(volatile void __iomem *, const void *, long); > extern void _memset_c_io(volatile void __iomem *, unsigned long, long); > > +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); > + <etc> How's about we add a new linux/io.h which does: #include <asm/io.h> void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); ? ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-11 23:46 ` Andrew Morton @ 2006-01-12 0:05 ` Bryan O'Sullivan 2006-01-12 0:13 ` Andrew Morton 0 siblings, 1 reply; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-12 0:05 UTC (permalink / raw) To: Andrew Morton; +Cc: rdreier, linux-kernel, hch, ak On Wed, 2006-01-11 at 15:46 -0800, Andrew Morton wrote: > How's about we add a new linux/io.h which does: > > #include <asm/io.h> > void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); I thought about this, and about moving other duplicated definitions from asm-*/io.h in here, but I couldn't find any other obvious candidates, so I wasn't anxious to introduce a new file. If you think that's OK, though, it obviously makes the patch a lot smaller, and gives a common place to put future cross-arch definitions. I'll run another spin of the patch with your and Roland's suggestions. <b ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-12 0:05 ` Bryan O'Sullivan @ 2006-01-12 0:13 ` Andrew Morton 2006-01-12 0:21 ` Bryan O'Sullivan 0 siblings, 1 reply; 15+ messages in thread From: Andrew Morton @ 2006-01-12 0:13 UTC (permalink / raw) To: Bryan O'Sullivan; +Cc: rdreier, linux-kernel, hch, ak "Bryan O'Sullivan" <bos@pathscale.com> wrote: > > On Wed, 2006-01-11 at 15:46 -0800, Andrew Morton wrote: > > > How's about we add a new linux/io.h which does: > > > > #include <asm/io.h> > > void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); > > I thought about this, and about moving other duplicated definitions from > asm-*/io.h in here, but I couldn't find any other obvious candidates, so > I wasn't anxious to introduce a new file. > Well it's obviously better than duplicating the thing. There are other common things which can be hoisted to linux/io.h, but if we do that then zillions of .c files need to be changed to include linux/io.h rather than asm/io.h. That's a good janitorial thing to do, but I doubt if you want to do it ;) ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-12 0:13 ` Andrew Morton @ 2006-01-12 0:21 ` Bryan O'Sullivan 0 siblings, 0 replies; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-12 0:21 UTC (permalink / raw) To: Andrew Morton; +Cc: rdreier, linux-kernel, hch, ak On Wed, 2006-01-11 at 16:13 -0800, Andrew Morton wrote: > There are other common things which can be hoisted to linux/io.h, but if we > do that then zillions of .c files need to be changed to include linux/io.h > rather than asm/io.h. Right. > That's a good janitorial thing to do, but I doubt if > you want to do it ;) Not as part of these patches, anyway. They've left me a dried-up husk. <b ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 0 of 3] 32-bit MMIO copy routines, reworked @ 2006-01-10 19:53 Bryan O'Sullivan 2006-01-10 19:53 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan 0 siblings, 1 reply; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-10 19:53 UTC (permalink / raw) To: akpm; +Cc: linux-kernel, hch, ak, rdreier [-- Attachment #1: Type: text/plain, Size: 752 bytes --] After some more review comments from Roland, Andrew and Chris Hellwig, here is a reworked set of 32-bit MMIO copy patches. These use CONFIG_RAW_MEMCPY_IO to determine whether an arch should use the generic __raw_memcpy_toio32 routine or its own specialised version. We provide a specialised implementation for x86_64. These patches should apply cleanly against current -git, and have been tested on i386 and x86_64. The patch series is as follows: raw_memcpy_io.patch Introduce the generic MMIO 32-bit copy routine. x86_64-memcpy32.patch Add memcpy32 routine to x86_64. arch-specific-raw_memcpy_io.patch Get each arch to use generic memcpy_io code, except x86_64, which uses memcpy32. Signed-off-by: Bryan O'Sullivan <bos@pathscale.com> ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-10 19:53 [PATCH 0 of 3] 32-bit MMIO copy routines, reworked Bryan O'Sullivan @ 2006-01-10 19:53 ` Bryan O'Sullivan 2006-01-10 20:08 ` Andi Kleen 0 siblings, 1 reply; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-10 19:53 UTC (permalink / raw) To: akpm; +Cc: linux-kernel, hch, ak, rdreier Most arches use the generic routine. x86_64 uses memcpy32 instead; this is substantially faster, even over a bus that is much slower than the CPU. Signed-off-by: Bryan O'Sullivan <bos@pathscale.com> diff -r b4863171295f -r 5673a186625f arch/alpha/Kconfig --- a/arch/alpha/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/alpha/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -42,6 +42,10 @@ default y config GENERIC_IRQ_PROBE + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/arm/Kconfig --- a/arch/arm/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/arm/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -59,6 +59,10 @@ config GENERIC_BUST_SPINLOCK bool + +config GENERIC_RAW_MEMCPY_IO + bool + default y config ARCH_MAY_HAVE_PC_FDC bool diff -r b4863171295f -r 5673a186625f arch/arm26/Kconfig --- a/arch/arm26/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/arm26/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -33,6 +33,10 @@ config FORCE_MAX_ZONEORDER int default 9 + +config GENERIC_RAW_MEMCPY_IO + bool + default y config RWSEM_GENERIC_SPINLOCK bool diff -r b4863171295f -r 5673a186625f arch/cris/Kconfig --- a/arch/cris/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/cris/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -17,6 +17,10 @@ bool config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/frv/Kconfig --- a/arch/frv/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/frv/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -24,6 +24,10 @@ config GENERIC_CALIBRATE_DELAY bool default n + +config GENERIC_RAW_MEMCPY_IO + bool + default y config GENERIC_HARDIRQS bool diff -r b4863171295f -r 5673a186625f arch/h8300/Kconfig --- a/arch/h8300/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/h8300/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -30,6 +30,10 @@ default n config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/i386/Kconfig --- a/arch/i386/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/i386/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -34,6 +34,10 @@ default y config GENERIC_IOMAP + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/ia64/Kconfig --- a/arch/ia64/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/ia64/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -47,6 +47,10 @@ default y config GENERIC_IOMAP + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/m32r/Kconfig --- a/arch/m32r/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/m32r/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -25,6 +25,10 @@ default y config GENERIC_IRQ_PROBE + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/m68k/Kconfig --- a/arch/m68k/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/m68k/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -18,6 +18,10 @@ bool config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/m68knommu/Kconfig --- a/arch/m68knommu/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/m68knommu/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -26,6 +26,10 @@ default n config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/mips/Kconfig --- a/arch/mips/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/mips/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -800,6 +800,10 @@ bool config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/parisc/Kconfig --- a/arch/parisc/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/parisc/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -37,6 +37,10 @@ config GENERIC_IRQ_PROBE def_bool y + +config GENERIC_RAW_MEMCPY_IO + bool + default y # unless you want to implement ACPI on PA-RISC ... ;-) config PM diff -r b4863171295f -r 5673a186625f arch/powerpc/Kconfig --- a/arch/powerpc/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/powerpc/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -38,6 +38,10 @@ default y config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/ppc/Kconfig --- a/arch/ppc/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/ppc/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -16,6 +16,10 @@ bool config RWSEM_XCHGADD_ALGORITHM + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/s390/Kconfig --- a/arch/s390/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/s390/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -20,6 +20,10 @@ config GENERIC_BUST_SPINLOCK bool + +config GENERIC_RAW_MEMCPY_IO + bool + default y mainmenu "Linux Kernel Configuration" diff -r b4863171295f -r 5673a186625f arch/sh/Kconfig --- a/arch/sh/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/sh/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -30,6 +30,10 @@ default y config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/sh64/Kconfig --- a/arch/sh64/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/sh64/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -34,6 +34,10 @@ config GENERIC_ISA_DMA bool + +config GENERIC_RAW_MEMCPY_IO + bool + default y source init/Kconfig diff -r b4863171295f -r 5673a186625f arch/sparc/Kconfig --- a/arch/sparc/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/sparc/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -152,6 +152,10 @@ bool config GENERIC_CALIBRATE_DELAY + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/sparc64/Kconfig --- a/arch/sparc64/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/sparc64/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -166,6 +166,10 @@ bool default y +config GENERIC_RAW_MEMCPY_IO + bool + default y + choice prompt "SPARC64 Huge TLB Page Size" depends on HUGETLB_PAGE diff -r b4863171295f -r 5673a186625f arch/v850/Kconfig --- a/arch/v850/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/v850/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -17,6 +17,9 @@ bool default n config GENERIC_CALIBRATE_DELAY + bool + default y +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f arch/xtensa/Kconfig --- a/arch/xtensa/Kconfig Tue Jan 10 11:52:48 2006 -0800 +++ b/arch/xtensa/Kconfig Tue Jan 10 11:52:51 2006 -0800 @@ -27,6 +27,10 @@ default y config GENERIC_HARDIRQS + bool + default y + +config GENERIC_RAW_MEMCPY_IO bool default y diff -r b4863171295f -r 5673a186625f include/asm-alpha/io.h --- a/include/asm-alpha/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-alpha/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -504,6 +504,8 @@ extern void memcpy_toio(volatile void __iomem *, const void *, long); extern void _memset_c_io(volatile void __iomem *, unsigned long, long); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + static inline void memset_io(volatile void __iomem *addr, u8 c, long len) { _memset_c_io(addr, 0x0101010101010101UL * c, len); diff -r b4863171295f -r 5673a186625f include/asm-arm/io.h --- a/include/asm-arm/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-arm/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -189,6 +189,8 @@ #define memset_io(c,v,l) _memset_io(__mem_pci(c),(v),(l)) #define memcpy_fromio(a,c,l) _memcpy_fromio((a),__mem_pci(c),(l)) #define memcpy_toio(c,a,l) _memcpy_toio(__mem_pci(c),(a),(l)) + +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); #define eth_io_copy_and_sum(s,c,l,b) \ eth_copy_and_sum((s),__mem_pci(c),(l),(b)) diff -r b4863171295f -r 5673a186625f include/asm-cris/io.h --- a/include/asm-cris/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-cris/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -121,6 +121,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Again, CRIS does not require mem IO specific function. */ diff -r b4863171295f -r 5673a186625f include/asm-frv/io.h --- a/include/asm-frv/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-frv/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -127,6 +127,8 @@ memcpy((void __force *) dst, src, count); } +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + static inline uint8_t inb(unsigned long addr) { return __builtin_read8((void *)addr); diff -r b4863171295f -r 5673a186625f include/asm-h8300/io.h --- a/include/asm-h8300/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-h8300/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -209,6 +209,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define mmiowb() #define inb(addr) ((h8300_buswidth(addr))?readw((addr) & ~1) & 0xff:readb(addr)) diff -r b4863171295f -r 5673a186625f include/asm-i386/io.h --- a/include/asm-i386/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-i386/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -203,6 +203,8 @@ { __memcpy((void __force *) dst, src, count); } + +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); /* * ISA space is 'always mapped' on a typical x86 system, no need to diff -r b4863171295f -r 5673a186625f include/asm-ia64/io.h --- a/include/asm-ia64/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-ia64/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -444,6 +444,8 @@ extern void memcpy_toio(volatile void __iomem *dst, const void *src, long n); extern void memset_io(volatile void __iomem *s, int c, long n); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define dma_cache_inv(_start,_size) do { } while (0) #define dma_cache_wback(_start,_size) do { } while (0) #define dma_cache_wback_inv(_start,_size) do { } while (0) diff -r b4863171295f -r 5673a186625f include/asm-m32r/io.h --- a/include/asm-m32r/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-m32r/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -216,6 +216,8 @@ memcpy((void __force *) dst, src, count); } +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Convert a physical pointer to a virtual kernel pointer for /dev/mem * access diff -r b4863171295f -r 5673a186625f include/asm-m68knommu/io.h --- a/include/asm-m68knommu/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-m68knommu/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -113,6 +113,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define inb(addr) readb(addr) #define inw(addr) readw(addr) #define inl(addr) readl(addr) diff -r b4863171295f -r 5673a186625f include/asm-mips/io.h --- a/include/asm-mips/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-mips/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -534,6 +534,8 @@ memcpy((void __force *) dst, src, count); } +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Memory Mapped I/O */ diff -r b4863171295f -r 5673a186625f include/asm-parisc/io.h --- a/include/asm-parisc/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-parisc/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -294,6 +294,8 @@ void memcpy_fromio(void *dst, const volatile void __iomem *src, int count); void memcpy_toio(volatile void __iomem *dst, const void *src, int count); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* Support old drivers which don't ioremap. * NB this interface is scheduled to disappear in 2.5 */ diff -r b4863171295f -r 5673a186625f include/asm-powerpc/io.h --- a/include/asm-powerpc/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-powerpc/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -64,6 +64,8 @@ #define memcpy_fromio(a,b,c) iSeries_memcpy_fromio((a), (b), (c)) #define memcpy_toio(a,b,c) iSeries_memcpy_toio((a), (b), (c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define inb(addr) readb(((void __iomem *)(long)(addr))) #define inw(addr) readw(((void __iomem *)(long)(addr))) #define inl(addr) readl(((void __iomem *)(long)(addr))) diff -r b4863171295f -r 5673a186625f include/asm-ppc/io.h --- a/include/asm-ppc/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-ppc/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -369,6 +369,8 @@ } #endif +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),(void __force *)(void __iomem *)(b),(c),(d)) /* diff -r b4863171295f -r 5673a186625f include/asm-s390/io.h --- a/include/asm-s390/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-s390/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -99,6 +99,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c)) #define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #define inb_p(addr) readb(addr) #define inb(addr) readb(addr) diff -r b4863171295f -r 5673a186625f include/asm-sh/io.h --- a/include/asm-sh/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-sh/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -177,6 +177,8 @@ extern void memcpy_toio(unsigned long, const void *, unsigned long); extern void memset_io(unsigned long, int, unsigned long); +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* SuperH on-chip I/O functions */ static __inline__ unsigned char ctrl_inb(unsigned long addr) { diff -r b4863171295f -r 5673a186625f include/asm-sh64/io.h --- a/include/asm-sh64/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-sh64/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -125,6 +125,8 @@ void memcpy_toio(void __iomem *to, const void *from, long count); void memcpy_fromio(void *to, void __iomem *from, long count); + +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); #define mmiowb() diff -r b4863171295f -r 5673a186625f include/asm-sparc/io.h --- a/include/asm-sparc/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-sparc/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -239,6 +239,8 @@ #define memcpy_toio(d,s,sz) _memcpy_toio(d,s,sz) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + #ifdef __KERNEL__ /* diff -r b4863171295f -r 5673a186625f include/asm-sparc64/io.h --- a/include/asm-sparc64/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-sparc64/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -440,6 +440,8 @@ #define memcpy_toio(d,s,sz) _memcpy_toio(d,s,sz) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + static inline int check_signature(void __iomem *io_addr, const unsigned char *signature, int length) diff -r b4863171295f -r 5673a186625f include/asm-v850/io.h --- a/include/asm-v850/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-v850/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -130,6 +130,8 @@ #define memcpy_fromio(dst, src, len) memcpy (dst, (void *)src, len) #define memcpy_toio(dst, src, len) memcpy ((void *)dst, src, len) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* * Convert a physical pointer to a virtual kernel pointer for /dev/mem * access diff -r b4863171295f -r 5673a186625f include/asm-x86_64/io.h --- a/include/asm-x86_64/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-x86_64/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -252,6 +252,14 @@ __memcpy_toio((unsigned long)to,from,len); } +#include <asm/string.h> + +/* See lib/raw_memcpy_io.c for kernel doc. */ +static inline void __raw_memcpy_toio32(void __iomem *dst, const void *src, size_t count) +{ + memcpy32((void __force *) dst, src, count); +} + void memset_io(volatile void __iomem *a, int b, size_t c); /* diff -r b4863171295f -r 5673a186625f include/asm-xtensa/io.h --- a/include/asm-xtensa/io.h Tue Jan 10 11:52:48 2006 -0800 +++ b/include/asm-xtensa/io.h Tue Jan 10 11:52:51 2006 -0800 @@ -159,6 +159,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +void __raw_memcpy_toio32(void __iomem *to, const void *from, size_t count); + /* At this point the Xtensa doesn't provide byte swap instructions */ #ifdef __XTENSA_EB__ ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-10 19:53 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan @ 2006-01-10 20:08 ` Andi Kleen 2006-01-10 22:52 ` Bryan O'Sullivan 0 siblings, 1 reply; 15+ messages in thread From: Andi Kleen @ 2006-01-10 20:08 UTC (permalink / raw) To: Bryan O'Sullivan; +Cc: akpm, linux-kernel, hch, rdreier On Tuesday 10 January 2006 20:53, Bryan O'Sullivan wrote: > Most arches use the generic routine. x86_64 uses memcpy32 instead; > this is substantially faster, even over a bus that is much slower than > the CPU. So did you run numbers against the C implementation with -funroll-loops ? What were the results? -Andi ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-10 20:08 ` Andi Kleen @ 2006-01-10 22:52 ` Bryan O'Sullivan 0 siblings, 0 replies; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-10 22:52 UTC (permalink / raw) To: Andi Kleen; +Cc: akpm, linux-kernel, hch, rdreier On Tue, 2006-01-10 at 21:08 +0100, Andi Kleen wrote: > On Tuesday 10 January 2006 20:53, Bryan O'Sullivan wrote: > > Most arches use the generic routine. x86_64 uses memcpy32 instead; > > this is substantially faster, even over a bus that is much slower than > > the CPU. > > So did you run numbers against the C implementation with -funroll-loops ? > What were the results? The C implementation is about 5% slower when copying over HyperTransport. <b ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 0 of 3] 32-bit MMIO copy routine @ 2006-01-06 20:26 Bryan O'Sullivan 2006-01-06 20:26 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan 0 siblings, 1 reply; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-06 20:26 UTC (permalink / raw) To: linux-kernel [-- Attachment #1: Type: text/plain, Size: 915 bytes --] Following some discussion with Roland, and patterned after the style anointed by Linus last week, here is a new version of the 32-bit MMIO copy routine needed by our InfiniPath device. The name of the routine has changed from memcpy_toio32 to __raw_memcpy_toio32. This reflects the basic nature of the routine; it dodes not guarantee the order in which writes are performed, nor does it perform a memory barrier after it is done. The reason for this is that our chip treats the first and last writes to some MMIO regions specially; our driver performs those directly using writel, and uses __raw_memcpy_toio32 for the bits in between. Regarding the specialised x86_64 implementation, Andi Kleen asked me to perform some measurements of its performance impact. It makes a difference of about 5% in performance on moderately large copies over the HyperTransport bus, compared to the generic implementation. <b ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch 2006-01-06 20:26 [PATCH 0 of 3] 32-bit MMIO copy routine Bryan O'Sullivan @ 2006-01-06 20:26 ` Bryan O'Sullivan 0 siblings, 0 replies; 15+ messages in thread From: Bryan O'Sullivan @ 2006-01-06 20:26 UTC (permalink / raw) To: linux-kernel Most arches use the <asm-generic/raw_memcpy_toio32.h> routine, while x86_64 uses memcpy32, which is substantially faster, even on a bus that is substantially slower than the CPU. Signed-off-by: Bryan O'Sullivan <bos@pathscale.com> diff -r 33790477a163 -r 9e06b832c26c include/asm-alpha/io.h --- a/include/asm-alpha/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-alpha/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -504,6 +504,8 @@ extern void memcpy_toio(volatile void __iomem *, const void *, long); extern void _memset_c_io(volatile void __iomem *, unsigned long, long); +#include <asm-generic/raw_memcpy_toio32.h> + static inline void memset_io(volatile void __iomem *addr, u8 c, long len) { _memset_c_io(addr, 0x0101010101010101UL * c, len); diff -r 33790477a163 -r 9e06b832c26c include/asm-arm/io.h --- a/include/asm-arm/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-arm/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -184,6 +184,8 @@ #define memset_io(c,v,l) _memset_io(__mem_pci(c),(v),(l)) #define memcpy_fromio(a,c,l) _memcpy_fromio((a),__mem_pci(c),(l)) #define memcpy_toio(c,a,l) _memcpy_toio(__mem_pci(c),(a),(l)) + +#include <asm-generic/raw_memcpy_toio32.h> #define eth_io_copy_and_sum(s,c,l,b) \ eth_copy_and_sum((s),__mem_pci(c),(l),(b)) diff -r 33790477a163 -r 9e06b832c26c include/asm-cris/io.h --- a/include/asm-cris/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-cris/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -121,6 +121,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +#include <asm-generic/raw_memcpy_toio32.h> + /* * Again, CRIS does not require mem IO specific function. */ diff -r 33790477a163 -r 9e06b832c26c include/asm-frv/io.h --- a/include/asm-frv/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-frv/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -124,6 +124,8 @@ memcpy((void __force *) dst, src, count); } +#include <asm-generic/raw_memcpy_toio32.h> + static inline uint8_t inb(unsigned long addr) { return __builtin_read8((void *)addr); diff -r 33790477a163 -r 9e06b832c26c include/asm-h8300/io.h --- a/include/asm-h8300/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-h8300/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -209,6 +209,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +#include <asm-generic/raw_memcpy_toio32.h> + #define mmiowb() #define inb(addr) ((h8300_buswidth(addr))?readw((addr) & ~1) & 0xff:readb(addr)) diff -r 33790477a163 -r 9e06b832c26c include/asm-i386/io.h --- a/include/asm-i386/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-i386/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -203,6 +203,8 @@ { __memcpy((void __force *) dst, src, count); } + +#include <asm-generic/raw_memcpy_toio32.h> /* * ISA space is 'always mapped' on a typical x86 system, no need to diff -r 33790477a163 -r 9e06b832c26c include/asm-ia64/io.h --- a/include/asm-ia64/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-ia64/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -443,6 +443,8 @@ extern void memcpy_toio(volatile void __iomem *dst, const void *src, long n); extern void memset_io(volatile void __iomem *s, int c, long n); +#include <asm-generic/raw_memcpy_toio32.h> + #define dma_cache_inv(_start,_size) do { } while (0) #define dma_cache_wback(_start,_size) do { } while (0) #define dma_cache_wback_inv(_start,_size) do { } while (0) diff -r 33790477a163 -r 9e06b832c26c include/asm-m32r/io.h --- a/include/asm-m32r/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-m32r/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -216,6 +216,8 @@ memcpy((void __force *) dst, src, count); } +#include <asm-generic/raw_memcpy_toio32.h> + /* * Convert a physical pointer to a virtual kernel pointer for /dev/mem * access diff -r 33790477a163 -r 9e06b832c26c include/asm-m68knommu/io.h --- a/include/asm-m68knommu/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-m68knommu/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -113,6 +113,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +#include <asm-generic/raw_memcpy_toio32.h> + #define inb(addr) readb(addr) #define inw(addr) readw(addr) #define inl(addr) readl(addr) diff -r 33790477a163 -r 9e06b832c26c include/asm-mips/io.h --- a/include/asm-mips/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-mips/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -534,6 +534,8 @@ memcpy((void __force *) dst, src, count); } +#include <asm-generic/raw_memcpy_toio32.h> + /* * Memory Mapped I/O */ diff -r 33790477a163 -r 9e06b832c26c include/asm-parisc/io.h --- a/include/asm-parisc/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-parisc/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -294,6 +294,8 @@ void memcpy_fromio(void *dst, const volatile void __iomem *src, int count); void memcpy_toio(volatile void __iomem *dst, const void *src, int count); +#include <asm-generic/raw_memcpy_toio32.h> + /* Support old drivers which don't ioremap. * NB this interface is scheduled to disappear in 2.5 */ diff -r 33790477a163 -r 9e06b832c26c include/asm-powerpc/io.h --- a/include/asm-powerpc/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-powerpc/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -63,6 +63,8 @@ #define memcpy_fromio(a,b,c) iSeries_memcpy_fromio((a), (b), (c)) #define memcpy_toio(a,b,c) iSeries_memcpy_toio((a), (b), (c)) +#include <asm-generic/raw_memcpy_toio32.h> + #define inb(addr) readb(((void __iomem *)(long)(addr))) #define inw(addr) readw(((void __iomem *)(long)(addr))) #define inl(addr) readl(((void __iomem *)(long)(addr))) diff -r 33790477a163 -r 9e06b832c26c include/asm-ppc/io.h --- a/include/asm-ppc/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-ppc/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -367,6 +367,8 @@ } #endif +#include <asm-generic/raw_memcpy_toio32.h> + #define eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),(void __force *)(void __iomem *)(b),(c),(d)) /* diff -r 33790477a163 -r 9e06b832c26c include/asm-s390/io.h --- a/include/asm-s390/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-s390/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -99,6 +99,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c)) #define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c)) +#include <asm-generic/raw_memcpy_toio32.h> + #define inb_p(addr) readb(addr) #define inb(addr) readb(addr) diff -r 33790477a163 -r 9e06b832c26c include/asm-sh/io.h --- a/include/asm-sh/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-sh/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -177,6 +177,8 @@ extern void memcpy_toio(unsigned long, const void *, unsigned long); extern void memset_io(unsigned long, int, unsigned long); +#include <asm-generic/raw_memcpy_toio32.h> + /* SuperH on-chip I/O functions */ static __inline__ unsigned char ctrl_inb(unsigned long addr) { diff -r 33790477a163 -r 9e06b832c26c include/asm-sh64/io.h --- a/include/asm-sh64/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-sh64/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -125,6 +125,8 @@ void memcpy_toio(void __iomem *to, const void *from, long count); void memcpy_fromio(void *to, void __iomem *from, long count); + +#include <asm-generic/raw_memcpy_toio32.h> #define mmiowb() diff -r 33790477a163 -r 9e06b832c26c include/asm-sparc/io.h --- a/include/asm-sparc/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-sparc/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -239,6 +239,8 @@ #define memcpy_toio(d,s,sz) _memcpy_toio(d,s,sz) +#include <asm-generic/raw_memcpy_toio32.h> + #ifdef __KERNEL__ /* diff -r 33790477a163 -r 9e06b832c26c include/asm-sparc64/io.h --- a/include/asm-sparc64/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-sparc64/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -440,6 +440,8 @@ #define memcpy_toio(d,s,sz) _memcpy_toio(d,s,sz) +#include <asm-generic/raw_memcpy_toio32.h> + static inline int check_signature(void __iomem *io_addr, const unsigned char *signature, int length) diff -r 33790477a163 -r 9e06b832c26c include/asm-v850/io.h --- a/include/asm-v850/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-v850/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -130,6 +130,8 @@ #define memcpy_fromio(dst, src, len) memcpy (dst, (void *)src, len) #define memcpy_toio(dst, src, len) memcpy ((void *)dst, src, len) +#include <asm-generic/raw_memcpy_toio32.h> + /* * Convert a physical pointer to a virtual kernel pointer for /dev/mem * access diff -r 33790477a163 -r 9e06b832c26c include/asm-x86_64/io.h --- a/include/asm-x86_64/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-x86_64/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -252,6 +252,13 @@ __memcpy_toio((unsigned long)to,from,len); } +#include <asm/string.h> + +static inline void __raw_memcpy_toio32(void __iomem *dst, const void *src, size_t count) +{ + memcpy32((void __force *) dst, src, count); +} + void memset_io(volatile void __iomem *a, int b, size_t c); /* diff -r 33790477a163 -r 9e06b832c26c include/asm-xtensa/io.h --- a/include/asm-xtensa/io.h Fri Jan 6 12:25:02 2006 -0800 +++ b/include/asm-xtensa/io.h Fri Jan 6 12:25:04 2006 -0800 @@ -159,6 +159,8 @@ #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) +#include <asm-generic/raw_memcpy_toio32.h> + /* At this point the Xtensa doesn't provide byte swap instructions */ #ifdef __XTENSA_EB__ ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2006-01-12 0:21 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2006-01-11 22:39 [PATCH 0 of 3] MMIO 32-bit copy routine, the final frontier Bryan O'Sullivan 2006-01-11 22:39 ` [PATCH 1 of 3] Introduce __raw_memcpy_toio32 Bryan O'Sullivan 2006-01-11 23:43 ` Andrew Morton 2006-01-11 22:39 ` [PATCH 2 of 3] memcpy32 for x86_64 Bryan O'Sullivan 2006-01-11 23:45 ` Roland Dreier 2006-01-12 0:03 ` Bryan O'Sullivan 2006-01-11 22:39 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan 2006-01-11 23:46 ` Andrew Morton 2006-01-12 0:05 ` Bryan O'Sullivan 2006-01-12 0:13 ` Andrew Morton 2006-01-12 0:21 ` Bryan O'Sullivan -- strict thread matches above, loose matches on Subject: below -- 2006-01-10 19:53 [PATCH 0 of 3] 32-bit MMIO copy routines, reworked Bryan O'Sullivan 2006-01-10 19:53 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan 2006-01-10 20:08 ` Andi Kleen 2006-01-10 22:52 ` Bryan O'Sullivan 2006-01-06 20:26 [PATCH 0 of 3] 32-bit MMIO copy routine Bryan O'Sullivan 2006-01-06 20:26 ` [PATCH 3 of 3] Add __raw_memcpy_toio32 to each arch Bryan O'Sullivan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome