Linux MIPS Architecture development
 help / color / mirror / Atom feed
From: Manish Lachwani <mlachwani@mvista.com>
To: "Maciej W. Rozycki" <macro@mips.com>
Cc: Ralf Baechle <ralf@linux-mips.org>,
	linux-mips@linux-mips.org,
	"Maciej W. Rozycki" <macro@linux-mips.org>
Subject: Re: [PATCH] I/O helpers rework
Date: Thu, 13 Jan 2005 14:18:40 -0800	[thread overview]
Message-ID: <41E6F3C0.6050706@mvista.com> (raw)
In-Reply-To: <Pine.LNX.4.61.0412151936460.14855@perivale.mips.com>

Hello Maciej,

Couple of things:

1. Have you tried this patch on 32-bit SMP Sibyte with 
CONFIG_SIBYTE_DMA_PAGEOPS turned on. I tried it out with 2.6.11-rc1 and 
the kernel crashes on bootup when doing a clear_page. The following code 
in arch/mips/mm/pg-sb1.c:

while (!(bus_readq((void *)(IOADDR(A_DM_REGISTER(cpu, 
R_DM_DSCR_BASE_DEBUG)) &
M_DM_DSCR_BASE_INTERRUPT))))

in clear_page seems to be causing a problem. I need to investigate more

2. Secondly, the Sibyte MAC driver drivers/net/sb1250-mac.c still uses 
__raw_readq and __raw_writeq calls. Those will also need to be converted 
to bus_* calls

Thanks
Manish Lachwani

Maciej W. Rozycki wrote:

>Hello,
>
> While trying using an IDE interface driver with big-endian systems, I've 
>noticed some of our port/mm I/O accessory functions/macros get endianness 
>incorrectly.  In particular a lot of drivers expect single I/O accesses to 
>return correct numerical value of data as seen by the CPU while string I/O 
>accesses to preserve byte ordering in memory.
>
> As the whole file seemed a bit messy to me I decided to rewrite these 
>functions/macros completely.  To ease long-term maintenance I created 
>common templates for all classes of accesses which expand to appropriate 
>code for different transfer unit width.  I made all operations to be 
>expressed as inline functions to catch dangerous/incorrect uses.  The 
>result are the following function classes:
>
>1. in*()/out*()/read*()/write*() perform single operations on data using 
>   little-endian ordering.
>
>2. __raw_in*()/__raw_out*()/__raw_read*()/__raw_write*() perform single 
>   operations on data using memory ordering.
>
>3. bus_read*()/bus_write*() perform single on data using CPU bus ordering 
>   (that is as it appears at the bus, regardless of any address or lane 
>   swappers that may modify it on the way between the CPU and a device).
>
>4. __bus_readq()/__bus_writeq() are hacks for 64-bit accesses avoiding 
>   interrupt masking when used with a 32-bit kernel and are otherwise the 
>   same as bus_readq()/bus_writeq().
>
>5. ins*()/outs*()/reads*()/writes*() perform string operations on data 
>   using memory ordering yielding the same result as a corresponding DMA 
>   transfer would.
>
>The naming of 1., 2. and perhaps 5. above is a bit unfortunate, but that's 
>what much code elsewhere expects.  These variants assume a ISA/EISA/PCI 
>bus, little-endian.  They perform minimum of swapping required -- they 
>avoid swapping data back and forth to keep good performance.  For 
>buses/devices that follow CPU endianness use 3. or perhaps 4. if 
>interrupts have already been masked.
>
> The changes have been verified with a Malta board for port I/O and with a 
>SWARM one for memory-mapped I/O (with an updated driver; to be sent 
>separately).  Broadcom SiByte systems are the only ones utilizing current 
>__raw_*() and ____raw_*() calls.  I have a patch to convert them to 
>bus_*() and __bus_*() ones as appropriate ready as well.
>
> OK to apply?
>
>  Maciej
>
>patch-mips-2.6.10-rc2-20041124-mips-ide-27
>diff -up --recursive --new-file linux-mips-2.6.10-rc2-20041124.macro/include/asm-mips/io.h linux-mips-2.6.10-rc2-20041124/include/asm-mips/io.h
>--- linux-mips-2.6.10-rc2-20041124.macro/include/asm-mips/io.h	2004-11-22 14:27:59.000000000 +0000
>+++ linux-mips-2.6.10-rc2-20041124/include/asm-mips/io.h	2004-12-13 13:05:29.000000000 +0000
>@@ -6,21 +6,26 @@
>  * Copyright (C) 1994, 1995 Waldorf GmbH
>  * Copyright (C) 1994 - 2000 Ralf Baechle
>  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
>+ * Copyright (C) 2004  MIPS Technologies, Inc.  All rights reserved.
>+ *	Author:	Maciej W. Rozycki <macro@mips.com>
>  */
> #ifndef _ASM_IO_H
> #define _ASM_IO_H
> 
> #include <linux/config.h>
> #include <linux/compiler.h>
>+#include <linux/kernel.h>
> #include <linux/types.h>
> 
> #include <asm/addrspace.h>
>+#include <asm/bug.h>
>+#include <asm/byteorder.h>
> #include <asm/cpu.h>
> #include <asm/cpu-features.h>
> #include <asm/page.h>
> #include <asm/pgtable-bits.h>
> #include <asm/processor.h>
>-#include <asm/byteorder.h>
>+
> #include <mangle-port.h>
> 
> /*
>@@ -29,34 +34,52 @@
> #undef CONF_SLOWDOWN_IO
> 
> /*
>- * Sane hardware offers swapping of I/O space accesses in hardware; less
>- * sane hardware forces software to fiddle with this ...
>+ * 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) && defined(__MIPSEB__)
>+#if defined(CONFIG_SWAP_IO_SPACE)
> 
>-#define __ioswab8(x) (x)
>-
>-#ifdef CONFIG_SGI_IP22
>+# define ioswabb(x)		(x)
>+# define __raw_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 __ioswab16(x) (x)
>-#else
>-#define __ioswab16(x) swab16(x)
>-#endif
>-#define __ioswab32(x) swab32(x)
>-#define __ioswab64(x) swab64(x)
>+#  define ioswabw(x)		(x)
>+#  define __raw_ioswabw(x)	le16_to_cpu(x)
>+# else
>+#  define ioswabw(x)		le16_to_cpu(x)
>+#  define __raw_ioswabw(x)	(x)
>+# endif
>+# define ioswabl(x)		le32_to_cpu(x)
>+# define __raw_ioswabl(x)	(x)
>+# define ioswabq(x)		le64_to_cpu(x)
>+# define __raw_ioswabq(x)	(x)
> 
> #else
> 
>-#define __ioswab8(x) (x)
>-#define __ioswab16(x) (x)
>-#define __ioswab32(x) (x)
>-#define __ioswab64(x) (x)
>+# define ioswabb(x)		(x)
>+# define __raw_ioswabb(x)	(x)
>+# define ioswabw(x)		(x)
>+# define __raw_ioswabw(x)	cpu_to_le16(x)
>+# define ioswabl(x)		(x)
>+# define __raw_ioswabl(x)	cpu_to_le32(x)
>+# define ioswabq(x)		(x)
>+# define __raw_ioswabq(x)	cpu_to_le64(x)
> 
> #endif
> 
>+/*
>+ * 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_ioswabq		bus_ioswabq
>+
> #define IO_SPACE_LIMIT 0xffff
> 
> /*
>@@ -245,108 +268,202 @@ static inline void iounmap(volatile void
> 	__iounmap(addr);
> }
> 
>-#define __raw_readb(addr)						\
>-	(*(volatile unsigned char *) __swizzle_addr_b((unsigned long)(addr)))
>-#define __raw_readw(addr)						\
>-	(*(volatile unsigned short *) __swizzle_addr_w((unsigned long)(addr)))
>-#define __raw_readl(addr)						\
>-	(*(volatile unsigned int *) __swizzle_addr_l((unsigned long)(addr)))
>-#ifdef CONFIG_MIPS32
>-#define ____raw_readq(addr)						\
>-({									\
>-	u64 __res;							\
>-									\
>-	__asm__ __volatile__ (						\
>-		"	.set	mips3		# ____raw_readq	\n"	\
>-		"	ld	%L0, (%1)			\n"	\
>-		"	dsra32	%M0, %L0, 0			\n"	\
>-		"	sll	%L0, %L0, 0			\n"	\
>-		"	.set	mips0				\n"	\
>-		: "=r" (__res)						\
>-		: "r" (__swizzle_addr_q((unsigned long)(addr))));	\
>-	__res;								\
>-})
>-#define __raw_readq(addr)						\
>-({									\
>-	unsigned long __flags;						\
>-	u64 __res;							\
>-									\
>-	local_irq_save(__flags);					\
>-	__res = ____raw_readq(addr);					\
>-	local_irq_restore(__flags);					\
>-	__res;								\
>-})
>-#endif
>-#ifdef CONFIG_MIPS64
>-#define ____raw_readq(addr)						\
>-	(*(volatile unsigned long *)__swizzle_addr_q((unsigned long)(addr)))
>-#define __raw_readq(addr)	____raw_readq(addr)
>-#endif
> 
>-#define readb(addr)		__ioswab8(__raw_readb(addr))
>-#define readw(addr)		__ioswab16(__raw_readw(addr))
>-#define readl(addr)		__ioswab32(__raw_readl(addr))
>-#define readq(addr)		__ioswab64(__raw_readq(addr))
>-#define readb_relaxed(addr)	readb(addr)
>-#define readw_relaxed(addr)	readw(addr)
>-#define readl_relaxed(addr)	readl(addr)
>-#define readq_relaxed(addr)	readq(addr)
>-
>-#define __raw_writeb(b,addr)						\
>-do {									\
>-	((*(volatile unsigned char *)__swizzle_addr_b((unsigned long)(addr))) = (b));	\
>-} while (0)
>-
>-#define __raw_writew(w,addr)						\
>-do {									\
>-	((*(volatile unsigned short *)__swizzle_addr_w((unsigned long)(addr))) = (w));	\
>-} while (0)
>-
>-#define __raw_writel(l,addr)						\
>-do {									\
>-	((*(volatile unsigned int *)__swizzle_addr_l((unsigned long)(addr))) = (l));	\
>-} while (0)
>-
>-#ifdef CONFIG_MIPS32
>-#define ____raw_writeq(val,addr)					\
>-do {									\
>-	u64 __tmp;							\
>-									\
>-	__asm__ __volatile__ (						\
>-		"	.set	mips3				\n"	\
>-		"	dsll32	%L0, %L0, 0	# ____raw_writeq\n"	\
>-		"	dsrl32	%L0, %L0, 0			\n"	\
>-		"	dsll32	%M0, %M0, 0			\n"	\
>-		"	or	%L0, %L0, %M0			\n"	\
>-		"	sd	%L0, (%2)			\n"	\
>-		"	.set	mips0				\n"	\
>-		: "=r" (__tmp)						\
>-		: "0" ((unsigned long long)val),			\
>-		  "r" (__swizzle_addr_q((unsigned long)(addr))));	\
>-} while (0)
>-
>-#define __raw_writeq(val,addr)						\
>-do {									\
>-	unsigned long __flags;						\
>-									\
>-	local_irq_save(__flags);					\
>-	____raw_writeq(val, addr);					\
>-	local_irq_restore(__flags);					\
>-} while (0)
>-#endif
>-#ifdef CONFIG_MIPS64
>-#define ____raw_writeq(q,addr)						\
>-do {									\
>-	*(volatile unsigned long *)__swizzle_addr_q((unsigned long)(addr)) = (q);	\
>-} while (0)
>+#define __BUILD_MEMORY_SINGLE(pfx, bwlq, type, irq)			\
>+									\
>+static inline void pfx##write##bwlq(type val, void *mem)		\
>+{									\
>+	volatile type *__mem;						\
>+	type __val;							\
>+									\
>+	__mem = (void *)__swizzle_addr_##bwlq((unsigned long)(mem));	\
>+									\
>+	__val = pfx##ioswab##bwlq(val);					\
>+									\
>+	if (sizeof(type) != sizeof(u64) || sizeof(u64) == sizeof(long))	\
>+		*__mem = __val;						\
>+	else if (cpu_has_64bits) {					\
>+		unsigned long __flags;					\
>+		type __tmp;						\
>+									\
>+		if (irq)						\
>+			local_irq_save(__flags);			\
>+		__asm__ __volatile__(					\
>+			".set	mips3"		"\t\t# __writeq""\n\t"	\
>+			"dsll32	%L0, %L0, 0"			"\n\t"	\
>+			"dsrl32	%L0, %L0, 0"			"\n\t"	\
>+			"dsll32	%M0, %M0, 0"			"\n\t"	\
>+			"or	%L0, %L0, %M0"			"\n\t"	\
>+			"sd	%L0, %2"			"\n\t"	\
>+			".set	mips0"				"\n"	\
>+			: "=r" (__tmp)					\
>+			: "0" (__val), "m" (*__mem));			\
>+		if (irq)						\
>+			local_irq_restore(__flags);			\
>+	} else								\
>+		BUG();							\
>+}									\
>+									\
>+static inline type pfx##read##bwlq(void *mem)				\
>+{									\
>+	volatile type *__mem;						\
>+	type __val;							\
>+									\
>+	__mem = (void *)__swizzle_addr_##bwlq((unsigned long)(mem));	\
>+									\
>+	if (sizeof(type) != sizeof(u64) || sizeof(u64) == sizeof(long))	\
>+		__val = *__mem;						\
>+	else if (cpu_has_64bits) {					\
>+		unsigned long __flags;					\
>+									\
>+		local_irq_save(__flags);				\
>+		__asm__ __volatile__(					\
>+			".set	mips3"		"\t\t# __readq"	"\n\t"	\
>+			"ld	%L0, %1"			"\n\t"	\
>+			"dsra32	%M0, %L0, 0"			"\n\t"	\
>+			"sll	%L0, %L0, 0"			"\n\t"	\
>+			".set	mips0"				"\n"	\
>+			: "=r" (__val)					\
>+			: "m" (*__mem));				\
>+		local_irq_restore(__flags);				\
>+	} else {							\
>+		__val = 0;						\
>+		BUG();							\
>+	}								\
>+									\
>+	return pfx##ioswab##bwlq(__val);				\
>+}
> 
>-#define __raw_writeq(q,addr)	____raw_writeq(q, addr)
>-#endif
>+#define __BUILD_IOPORT_SINGLE(pfx, bwlq, type, p, slow)			\
>+									\
>+static inline void pfx##out##bwlq##p(type val, unsigned long port)	\
>+{									\
>+	volatile type *__addr;						\
>+	type __val;							\
>+									\
>+	port = __swizzle_addr_##bwlq(port);				\
>+	__addr = (void *)(mips_io_port_base + port);			\
>+									\
>+	__val = pfx##ioswab##bwlq(val);					\
>+									\
>+	if (sizeof(type) != sizeof(u64)) {				\
>+		*__addr = __val;					\
>+		slow;							\
>+	} else								\
>+		BUILD_BUG();						\
>+}									\
>+									\
>+static inline type pfx##in##bwlq##p(unsigned long port)			\
>+{									\
>+	volatile type *__addr;						\
>+	type __val;							\
>+									\
>+	port = __swizzle_addr_##bwlq(port);				\
>+	__addr = (void *)(mips_io_port_base + port);			\
>+									\
>+	if (sizeof(type) != sizeof(u64)) {				\
>+		__val = *__addr;					\
>+		slow;							\
>+	} else {							\
>+		__val = 0;						\
>+		BUILD_BUG();						\
>+	}								\
>+									\
>+	return pfx##ioswab##bwlq(__val);				\
>+}
>+
>+#define __BUILD_MEMORY_PFX(bus, bwlq, type)				\
>+									\
>+__BUILD_MEMORY_SINGLE(bus, bwlq, type, 1)
>+
>+#define __BUILD_IOPORT_PFX(bus, bwlq, type)				\
>+									\
>+__BUILD_IOPORT_SINGLE(bus, bwlq, type, ,)				\
>+__BUILD_IOPORT_SINGLE(bus, bwlq, type, _p, SLOW_DOWN_IO)
>+
>+#define BUILDIO(bwlq, type)						\
>+									\
>+__BUILD_MEMORY_PFX(, bwlq, type)					\
>+__BUILD_MEMORY_PFX(__raw_, bwlq, type)					\
>+__BUILD_MEMORY_PFX(bus_, bwlq, type)					\
>+__BUILD_IOPORT_PFX(, bwlq, type)					\
>+__BUILD_IOPORT_PFX(__raw_, bwlq, type)
>+
>+#define __BUILDIO(bwlq, type)						\
>+									\
>+__BUILD_MEMORY_SINGLE(__bus_, bwlq, type, 0)
>+
>+BUILDIO(b, u8)
>+BUILDIO(w, u16)
>+BUILDIO(l, u32)
>+BUILDIO(q, u64)
>+
>+__BUILDIO(q, u64)
>+
>+#define readb_relaxed			readb
>+#define readw_relaxed			readw
>+#define readl_relaxed			readl
>+#define readq_relaxed			readq
>+
>+
>+#define __BUILD_MEMORY_STRING(bwlq, type)				\
>+									\
>+static inline void writes##bwlq(void *mem, void *addr,			\
>+				unsigned int count)			\
>+{									\
>+	volatile type *__addr = addr;					\
>+									\
>+	while (count--) {						\
>+		__raw_write##bwlq(*__addr, mem);			\
>+		__addr++;						\
>+	}								\
>+}									\
>+									\
>+static inline void reads##bwlq(void *mem, void *addr,			\
>+			       unsigned int count)			\
>+{									\
>+	volatile type *__addr = addr;					\
>+									\
>+	while (count--) {						\
>+		*__addr = __raw_read##bwlq(mem);			\
>+		__addr++;						\
>+	}								\
>+}
>+
>+#define __BUILD_IOPORT_STRING(bwlq, type)				\
>+									\
>+static inline void outs##bwlq(unsigned long port, void *addr,		\
>+			      unsigned int count)			\
>+{									\
>+	volatile type *__addr = addr;					\
>+									\
>+	while (count--) {						\
>+		__raw_out##bwlq(*__addr, port);				\
>+		__addr++;						\
>+	}								\
>+}									\
>+									\
>+static inline void ins##bwlq(unsigned long port, void *addr,		\
>+			     unsigned int count)			\
>+{									\
>+	volatile type *__addr = addr;					\
>+									\
>+	while (count--) {						\
>+		*__addr = __raw_in##bwlq(port);				\
>+		__addr++;						\
>+	}								\
>+}
>+
>+#define BUILDSTRING(bwlq, type)						\
>+									\
>+__BUILD_MEMORY_STRING(bwlq, type)					\
>+__BUILD_IOPORT_STRING(bwlq, type)
>+
>+BUILDSTRING(b, u8)
>+BUILDSTRING(w, u16)
>+BUILDSTRING(l, u32)
>+BUILDSTRING(q, u64)
> 
>-#define writeb(b,addr)		__raw_writeb(__ioswab8(b),(addr))
>-#define writew(w,addr)		__raw_writew(__ioswab16(w),(addr))
>-#define writel(l,addr)		__raw_writel(__ioswab32(l),(addr))
>-#define writeq(q,addr)		__raw_writeq(__ioswab64(q),(addr))
> 
> /* Depends on MIPS II instruction set */
> #define mmiowb() asm volatile ("sync" ::: "memory")
>@@ -394,7 +511,7 @@ do {									\
>  *     address should have been obtained by ioremap.
>  *     Returns 1 on a match.
>  */
>-static inline int check_signature(unsigned long io_addr,
>+static inline int check_signature(char __iomem *io_addr,
> 	const unsigned char *signature, int length)
> {
> 	int retval = 0;
>@@ -424,177 +541,6 @@ out:
>  */
> #define isa_check_signature(io, s, l)	check_signature(i,s,l)
> 
>-static inline void __outb(unsigned char val, unsigned long port)
>-{
>-	port = __swizzle_addr_b(port);
>-
>-	*(volatile u8 *)(mips_io_port_base + port) = __ioswab8(val);
>-}
>-
>-static inline void __outw(unsigned short val, unsigned long port)
>-{
>-	port = __swizzle_addr_w(port);
>-
>-	*(volatile u16 *)(mips_io_port_base + port) = __ioswab16(val);
>-}
>-
>-static inline void __outl(unsigned int val, unsigned long port)
>-{
>-	port = __swizzle_addr_l(port);
>-
>-	*(volatile u32 *)(mips_io_port_base + port) = __ioswab32(val);
>-}
>-
>-static inline void __outb_p(unsigned char val, unsigned long port)
>-{
>-	port = __swizzle_addr_b(port);
>-
>-	*(volatile u8 *)(mips_io_port_base + port) = __ioswab8(val);
>-	SLOW_DOWN_IO;
>-}
>-
>-static inline void __outw_p(unsigned short val, unsigned long port)
>-{
>-	port = __swizzle_addr_w(port);
>-
>-	*(volatile u16 *)(mips_io_port_base + port) = __ioswab16(val);
>-	SLOW_DOWN_IO;
>-}
>-
>-static inline void __outl_p(unsigned int val, unsigned long port)
>-{
>-	port = __swizzle_addr_l(port);
>-
>-	*(volatile u32 *)(mips_io_port_base + port) = __ioswab32(val);
>-	SLOW_DOWN_IO;
>-}
>-
>-#define outb(val, port)		__outb(val, port)
>-#define outw(val, port)		__outw(val, port)
>-#define outl(val, port)		__outl(val, port)
>-#define outb_p(val, port)	__outb_p(val, port)
>-#define outw_p(val, port)	__outw_p(val, port)
>-#define outl_p(val, port)	__outl_p(val, port)
>-
>-static inline unsigned char __inb(unsigned long port)
>-{
>-	port = __swizzle_addr_b(port);
>-
>-	return __ioswab8(*(volatile u8 *)(mips_io_port_base + port));
>-}
>-
>-static inline unsigned short __inw(unsigned long port)
>-{
>-	port = __swizzle_addr_w(port);
>-
>-	return __ioswab16(*(volatile u16 *)(mips_io_port_base + port));
>-}
>-
>-static inline unsigned int __inl(unsigned long port)
>-{
>-	port = __swizzle_addr_l(port);
>-
>-	return __ioswab32(*(volatile u32 *)(mips_io_port_base + port));
>-}
>-
>-static inline unsigned char __inb_p(unsigned long port)
>-{
>-	u8 __val;
>-
>-	port = __swizzle_addr_b(port);
>-
>-	__val = *(volatile u8 *)(mips_io_port_base + port);
>-	SLOW_DOWN_IO;
>-
>-	return __ioswab8(__val);
>-}
>-
>-static inline unsigned short __inw_p(unsigned long port)
>-{
>-	u16 __val;
>-
>-	port = __swizzle_addr_w(port);
>-
>-	__val = *(volatile u16 *)(mips_io_port_base + port);
>-	SLOW_DOWN_IO;
>-
>-	return __ioswab16(__val);
>-}
>-
>-static inline unsigned int __inl_p(unsigned long port)
>-{
>-	u32 __val;
>-
>-	port = __swizzle_addr_l(port);
>-
>-	__val = *(volatile u32 *)(mips_io_port_base + port);
>-	SLOW_DOWN_IO;
>-
>-	return __ioswab32(__val);
>-}
>-
>-#define inb(port)	__inb(port)
>-#define inw(port)	__inw(port)
>-#define inl(port)	__inl(port)
>-#define inb_p(port)	__inb_p(port)
>-#define inw_p(port)	__inw_p(port)
>-#define inl_p(port)	__inl_p(port)
>-
>-static inline void __outsb(unsigned long port, void *addr, unsigned int count)
>-{
>-	while (count--) {
>-		outb(*(u8 *)addr, port);
>-		addr++;
>-	}
>-}
>-
>-static inline void __insb(unsigned long port, void *addr, unsigned int count)
>-{
>-	while (count--) {
>-		*(u8 *)addr = inb(port);
>-		addr++;
>-	}
>-}
>-
>-static inline void __outsw(unsigned long port, void *addr, unsigned int count)
>-{
>-	while (count--) {
>-		outw(*(u16 *)addr, port);
>-		addr += 2;
>-	}
>-}
>-
>-static inline void __insw(unsigned long port, void *addr, unsigned int count)
>-{
>-	while (count--) {
>-		*(u16 *)addr = inw(port);
>-		addr += 2;
>-	}
>-}
>-
>-static inline void __outsl(unsigned long port, void *addr, unsigned int count)
>-{
>-	while (count--) {
>-		outl(*(u32 *)addr, port);
>-		addr += 4;
>-	}
>-}
>-
>-static inline void __insl(unsigned long port, void *addr, unsigned int count)
>-{
>-	while (count--) {
>-		*(u32 *)addr = inl(port);
>-		addr += 4;
>-	}
>-}
>-
>-#define outsb(port, addr, count)	__outsb(port, addr, count)
>-#define insb(port, addr, count)		__insb(port, addr, count)
>-#define outsw(port, addr, count)	__outsw(port, addr, count)
>-#define insw(port, addr, count)		__insw(port, addr, count)
>-#define outsl(port, addr, count)	__outsl(port, addr, count)
>-#define insl(port, addr, count)		__insl(port, addr, count)
>-
> /*
>  * The caches on some architectures aren't dma-coherent and have need to
>  * handle this in software.  There are three types of operations that
>diff -up --recursive --new-file linux-mips-2.6.10-rc2-20041124.macro/include/asm-mips/mach-generic/ide.h linux-mips-2.6.10-rc2-20041124/include/asm-mips/mach-generic/ide.h
>--- linux-mips-2.6.10-rc2-20041124.macro/include/asm-mips/mach-generic/ide.h	2004-11-24 21:37:52.000000000 +0000
>+++ linux-mips-2.6.10-rc2-20041124/include/asm-mips/mach-generic/ide.h	2004-12-14 17:25:36.000000000 +0000
>@@ -64,7 +64,17 @@ static __inline__ unsigned long ide_defa
> #define ide_init_default_irq(base)	ide_default_irq(base)
> #endif
> 
>-#include <asm-generic/ide_iops.h>
>+/* MIPS port and memory-mapped I/O string operations.  */
>+
>+#define __ide_insw	insw
>+#define __ide_insl	insl
>+#define __ide_outsw	outsw
>+#define __ide_outsl	outsl
>+
>+#define __ide_mm_insw	readsw
>+#define __ide_mm_insl	readsl
>+#define __ide_mm_outsw	writesw
>+#define __ide_mm_outsl	writesl
> 
> #endif /* __KERNEL__ */
> 
>
>
>  
>

      parent reply	other threads:[~2005-01-13 22:18 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-15 21:13 [PATCH] I/O helpers rework Maciej W. Rozycki
2005-01-06 15:45 ` Atsushi Nemoto
2005-01-10 15:28   ` Maciej W. Rozycki
2005-01-10 17:21     ` Atsushi Nemoto
2005-01-10 18:11       ` Maciej W. Rozycki
2005-01-11  0:53         ` Atsushi Nemoto
2005-01-13 18:12         ` Richard Sandiford
2005-01-13 18:25           ` Maciej W. Rozycki
2005-01-13 21:48             ` Richard Sandiford
2005-01-14  1:52               ` Atsushi Nemoto
2005-01-14 11:05                 ` Richard Sandiford
2005-01-14 19:57               ` Maciej W. Rozycki
2005-01-21 16:50   ` Atsushi Nemoto
2005-01-22  2:51     ` Maciej W. Rozycki
2005-01-25  1:09       ` Atsushi Nemoto
2005-02-17  1:34       ` Ralf Baechle
2005-02-18 19:44         ` Maciej W. Rozycki
2005-01-06 16:33 ` Herbert Valerio Riedel
2005-01-10 13:05   ` Maciej W. Rozycki
2005-01-10 14:46     ` Herbert Valerio Riedel
2005-01-10 14:49       ` Herbert Valerio Riedel
2005-01-14 20:07         ` Maciej W. Rozycki
2005-01-13 22:18 ` Manish Lachwani [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41E6F3C0.6050706@mvista.com \
    --to=mlachwani@mvista.com \
    --cc=linux-mips@linux-mips.org \
    --cc=macro@linux-mips.org \
    --cc=macro@mips.com \
    --cc=ralf@linux-mips.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox