This makes 64-bit I/O functions like sibyte uses generic, because IP32
at least needs them. I'm told it compiles.
Comments?
diff -urN -x CVS 2.5-mips/include/asm-mips/io64.h
2.5-mips-io64/include/asm-mips/io64.h
--- 2.5-mips/include/asm-mips/io64.h 1969-12-31 16:00:00.000000000 -0800
+++ 2.5-mips-io64/include/asm-mips/io64.h 2003-06-15 10:22:37.423123555
-0700
@@ -0,0 +1,99 @@
+/*
+ * 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) 2000, 2001 Broadcom Corporation
+ * Copyright (C) 2002 Ralf Baechle
+ * Copyright (C) 2003 Keith M Wesolowski
+ */
+
+#ifndef __ASM_IO64_H
+#define __ASM_IO64_H
+
+#include <linux/types.h>
+
+/* Generic 64-bit I/O register reads and writes. This does no byte-swapping
+ * as it makes little sense and no platform that needs this is insane enough
+ * to require it.
+ */
+
+#ifndef __ASSEMBLY__
+#if _MIPS_SZLONG >= 64
+static inline u64 __in64(unsigned long addr)
+{
+ return *(volatile u64 *)addr;
+}
+
+static inline void __out64(u64 val, unsigned long addr)
+{
+ *(volatile u64 *)addr = val;
+}
+
+#define in64(a) __in64(a)
+#define out64(v,a) __out64(v,a)
+
+#else /* _MIPS_SZLONG < 64 */
+
+#include <asm/system.h>
+
+static inline u64 __in64(unsigned long addr)
+{
+ u64 res;
+
+ asm volatile (
+ " .set mips3 \n"
+ " ld %L0, (%1) # __in64 \n"
+ " dsra %M0, %L0, 32 \n"
+ " sll %L0, 0 \n"
+ " .set mips0 \n"
+ : "=r" (res)
+ : "r" (addr)
+ );
+
+ return res;
+}
+
+static inline u64 in64(unsigned long addr)
+{
+ unsigned long flags;
+ u64 res;
+
+ local_irq_save(flags);
+ res = __in64(addr);
+ local_irq_restore(flags);
+
+ return res;
+}
+
+static inline void __out64(u64 val, unsigned long addr)
+{
+ u64 tmp;
+
+ asm volatile (
+ " .set mips3 \n"
+ " dsll %L0, 32 # __out64 \n"
+ " dsll %M0, 32 \n"
+ " dsrl %L0, 32 \n"
+ " or %L0, %M0 \n"
+ " sd %L0, (%2) \n"
+ " .set mips0 \n"
+ : "=&r" (tmp)
+ : "0" (val), "r" (addr)
+ : "memory"
+ );
+}
+
+static inline void out64(u64 val, unsigned long addr)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ __out64(val, addr);
+ local_irq_restore(flags);
+}
+#endif /* _MIPS_SZLONG */
+#endif /* !__ASSEMBLY__ */
+
+
+#endif /* __ASM_IO64_H */
diff -urN -x CVS 2.5-mips/include/asm-mips/sibyte/64bit.h
2.5-mips-io64/include/asm-mips/sibyte/64bit.h
--- 2.5-mips/include/asm-mips/sibyte/64bit.h 2003-06-15 10:01:41.819344267
-0700
+++ 2.5-mips-io64/include/asm-mips/sibyte/64bit.h 2003-06-15
09:50:28.740647757 -0700
@@ -20,94 +20,9 @@
#ifndef __ASM_SIBYTE_64BIT_H
#define __ASM_SIBYTE_64BIT_H
-#include <linux/config.h>
+#include <asm/io64.h>
#include <linux/types.h>
-#ifdef CONFIG_MIPS32
-
-#include <asm/system.h>
-
-/*
- * This is annoying...we can't actually write the 64-bit IO register properly
- * without having access to 64-bit registers... which doesn't work by default
- * in o32 format...grrr...
- */
-static inline void __out64(u64 val, unsigned long addr)
-{
- u64 tmp;
-
- __asm__ __volatile__ (
- " .set mips3 \n"
- " dsll32 %L0, %L0, 0 # __out64 \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" (val), "r" (addr));
-}
-
-static inline void out64(u64 val, unsigned long addr)
-{
- unsigned long flags;
-
- local_irq_save(flags);
- __out64(val, addr);
- local_irq_restore(flags);
-}
-
-static inline u64 __in64(unsigned long addr)
-{
- u64 res;
-
- __asm__ __volatile__ (
- " .set mips3 # __in64 \n"
- " ld %L0, (%1) \n"
- " dsra32 %M0, %L0, 0 \n"
- " sll %L0, %L0, 0 \n"
- " .set mips0 \n"
- : "=r" (res)
- : "r" (addr));
-
- return res;
-}
-
-static inline u64 in64(unsigned long addr)
-{
- unsigned long flags;
- u64 res;
-
- local_irq_save(flags);
- res = __in64(addr);
- local_irq_restore(flags);
-
- return res;
-}
-
-#endif /* CONFIG_MIPS32 */
-
-#ifdef CONFIG_MIPS64
-
-/*
- * These are provided so as to be able to use common
- * driver code for the 32-bit and 64-bit trees
- */
-extern inline void out64(u64 val, unsigned long addr)
-{
- *(volatile unsigned long *)addr = val;
-}
-
-extern inline u64 in64(unsigned long addr)
-{
- return *(volatile unsigned long *)addr;
-}
-
-#define __in64(a) in64(a)
-#define __out64(v,a) out64(v,a)
-
-#endif /* CONFIG_MIPS64 */
-
/*
* Avoid interrupt mucking, just adjust the address for 4-byte access.
* Assume the addresses are 8-byte aligned.
diff -urN -x CVS 2.5-mips/include/asm-mips64/io64.h
2.5-mips-io64/include/asm-mips64/io64.h
--- 2.5-mips/include/asm-mips64/io64.h 1969-12-31 16:00:00.000000000 -0800
+++ 2.5-mips-io64/include/asm-mips64/io64.h 2003-06-15 10:22:48.300649235
-0700
@@ -0,0 +1,99 @@
+/*
+ * 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) 2000, 2001 Broadcom Corporation
+ * Copyright (C) 2002 Ralf Baechle
+ * Copyright (C) 2003 Keith M Wesolowski
+ */
+
+#ifndef __ASM_IO64_H
+#define __ASM_IO64_H
+
+#include <linux/types.h>
+
+/* Generic 64-bit I/O register reads and writes. This does no byte-swapping
+ * as it makes little sense and no platform that needs this is insane enough
+ * to require it.
+ */
+
+#ifndef __ASSEMBLY__
+#if _MIPS_SZLONG >= 64
+static inline u64 __in64(unsigned long addr)
+{
+ return *(volatile u64 *)addr;
+}
+
+static inline void __out64(u64 val, unsigned long addr)
+{
+ *(volatile u64 *)addr = val;
+}
+
+#define in64(a) __in64(a)
+#define out64(v,a) __out64(v,a)
+
+#else /* _MIPS_SZLONG < 64 */
+
+#include <asm/system.h>
+
+static inline u64 __in64(unsigned long addr)
+{
+ u64 res;
+
+ asm volatile (
+ " .set mips3 \n"
+ " ld %L0, (%1) # __in64 \n"
+ " dsra %M0, %L0, 32 \n"
+ " sll %L0, 0 \n"
+ " .set mips0 \n"
+ : "=r" (res)
+ : "r" (addr)
+ );
+
+ return res;
+}
+
+static inline u64 in64(unsigned long addr)
+{
+ unsigned long flags;
+ u64 res;
+
+ local_irq_save(flags);
+ res = __in64(addr);
+ local_irq_restore(flags);
+
+ return res;
+}
+
+static inline void __out64(u64 val, unsigned long addr)
+{
+ u64 tmp;
+
+ asm volatile (
+ " .set mips3 \n"
+ " dsll %L0, 32 # __out64 \n"
+ " dsll %M0, 32 \n"
+ " dsrl %L0, 32 \n"
+ " or %L0, %M0 \n"
+ " sd %L0, (%2) \n"
+ " .set mips0 \n"
+ : "=&r" (tmp)
+ : "0" (val), "r" (addr)
+ : "memory"
+ );
+}
+
+static inline void out64(u64 val, unsigned long addr)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ __out64(val, addr);
+ local_irq_restore(flags);
+}
+#endif /* _MIPS_SZLONG */
+#endif /* !__ASSEMBLY__ */
+
+
+#endif /* __ASM_IO64_H */
diff -urN -x CVS 2.5-mips/include/asm-mips64/ip32/crime.h
2.5-mips-io64/include/asm-mips64/ip32/crime.h
--- 2.5-mips/include/asm-mips64/ip32/crime.h 2003-06-15 10:07:13.904324165
-0700
+++ 2.5-mips-io64/include/asm-mips64/ip32/crime.h 2003-06-15
10:05:50.892572980 -0700
@@ -11,6 +11,7 @@
#ifndef __ASM_CRIME_H__
#define __ASM_CRIME_H__
+#include <asm/io64.h>
#include <asm/addrspace.h>
/*
@@ -23,12 +24,8 @@
#endif
#ifndef __ASSEMBLY__
-static inline u64 crime_read_64 (unsigned long __offset) {
- return *((volatile u64 *) (CRIME_BASE + __offset));
-}
-static inline void crime_write_64 (unsigned long __offset, u64 __val) {
- *((volatile u64 *) (CRIME_BASE + __offset)) = __val;
-}
+#define crime_read_64(__offset) __in64(CRIME_BASE+(__offset))
+#define crime_write_64(__offset,__val) __out64(__val,CRIME_BASE+(__offset))
#endif
#undef BIT
diff -urN -x CVS 2.5-mips/include/asm-mips64/ip32/mace.h
2.5-mips-io64/include/asm-mips64/ip32/mace.h
--- 2.5-mips/include/asm-mips64/ip32/mace.h 2003-06-15 10:07:14.097297946
-0700
+++ 2.5-mips-io64/include/asm-mips64/ip32/mace.h 2003-06-15
10:57:56.605873141 -0700
@@ -11,6 +11,7 @@
#ifndef __ASM_MACE_H__
#define __ASM_MACE_H__
+#include <asm/io64.h>
#include <asm/addrspace.h>
/*
@@ -220,7 +221,7 @@
static inline u64 mace_read_64 (unsigned long __offset)
{
- return *((volatile u64 *) (MACE_BASE + __offset));
+ return __in64 (MACE_BASE + __offset);
}
static inline void mace_write_8 (unsigned long __offset, u8 __val)
@@ -240,7 +241,7 @@
static inline void mace_write_64 (unsigned long __offset, u64 __val)
{
- *((volatile u64 *) (MACE_BASE + __offset)) = __val;
+ __out64 (__val, MACE_BASE + __offset);
}
/* Call it whenever device needs to read data from main memory coherently */
diff -urN -x CVS 2.5-mips/include/asm-mips64/sibyte/64bit.h
2.5-mips-io64/include/asm-mips64/sibyte/64bit.h
--- 2.5-mips/include/asm-mips64/sibyte/64bit.h 2003-02-19 13:07:27.000000000
-0800
+++ 2.5-mips-io64/include/asm-mips64/sibyte/64bit.h 2003-06-15
10:00:59.031149508 -0700
@@ -20,94 +20,9 @@
#ifndef __ASM_SIBYTE_64BIT_H
#define __ASM_SIBYTE_64BIT_H
-#include <linux/config.h>
+#include <asm/io64.h>
#include <linux/types.h>
-#ifdef CONFIG_MIPS32
-
-#include <asm/system.h>
-
-/*
- * This is annoying...we can't actually write the 64-bit IO register properly
- * without having access to 64-bit registers... which doesn't work by default
- * in o32 format...grrr...
- */
-static inline void __out64(u64 val, unsigned long addr)
-{
- u64 tmp;
-
- __asm__ __volatile__ (
- " .set mips3 \n"
- " dsll32 %L0, %L0, 0 # __out64 \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" (val), "r" (addr));
-}
-
-static inline void out64(u64 val, unsigned long addr)
-{
- unsigned long flags;
-
- local_irq_save(flags);
- __out64(val, addr);
- local_irq_restore(flags);
-}
-
-static inline u64 __in64(unsigned long addr)
-{
- u64 res;
-
- __asm__ __volatile__ (
- " .set mips3 # __in64 \n"
- " ld %L0, (%1) \n"
- " dsra32 %M0, %L0, 0 \n"
- " sll %L0, %L0, 0 \n"
- " .set mips0 \n"
- : "=r" (res)
- : "r" (addr));
-
- return res;
-}
-
-static inline u64 in64(unsigned long addr)
-{
- unsigned long flags;
- u64 res;
-
- local_irq_save(flags);
- res = __in64(addr);
- local_irq_restore(flags);
-
- return res;
-}
-
-#endif /* CONFIG_MIPS32 */
-
-#ifdef CONFIG_MIPS64
-
-/*
- * These are provided so as to be able to use common
- * driver code for the 32-bit and 64-bit trees
- */
-extern inline void out64(u64 val, unsigned long addr)
-{
- *(volatile unsigned long *)addr = val;
-}
-
-extern inline u64 in64(unsigned long addr)
-{
- return *(volatile unsigned long *)addr;
-}
-
-#define __in64(a) in64(a)
-#define __out64(v,a) out64(v,a)
-
-#endif /* CONFIG_MIPS64 */
-
/*
* Avoid interrupt mucking, just adjust the address for 4-byte access.
* Assume the addresses are 8-byte aligned.
--
Keith M Wesolowski <wesolows@foobazco.org> http://foobazco.org/~wesolows
------(( Project Foobazco Coordinator and Network Administrator ))------
"May Buddha bless all stubborn people!"
-- Uliassutai Karakorum Blake
|