patch-2.1.53 linux/include/asm-sparc64/io.h

Next file: linux/include/asm-sparc64/keyboard.h
Previous file: linux/include/asm-sparc64/ide.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.52/linux/include/asm-sparc64/io.h linux/include/asm-sparc64/io.h
@@ -1,4 +1,4 @@
-/* $Id: io.h,v 1.10 1997/04/10 05:13:29 davem Exp $ */
+/* $Id: io.h,v 1.12 1997/08/19 03:11:52 davem Exp $ */
 #ifndef __SPARC64_IO_H
 #define __SPARC64_IO_H
 
@@ -7,83 +7,122 @@
 
 #include <asm/page.h>      /* IO address mapping routines need this */
 #include <asm/system.h>
+#include <asm/asi.h>
 
-extern __inline__ unsigned long inb_local(unsigned long addr)
-{
-	return 0;
-}
+/* PC crapola... */
+#define __SLOW_DOWN_IO	do { } while (0)
+#define SLOW_DOWN_IO	do { } while (0)
 
-extern __inline__ void outb_local(unsigned char b, unsigned long addr)
+extern __inline__ unsigned long virt_to_phys(volatile void *addr)
 {
-	return;
+	return ((((unsigned long)addr) - PAGE_OFFSET) | 0x80000000UL);
 }
 
-extern __inline__ unsigned long inb(unsigned long addr)
+extern __inline__ void *phys_to_virt(unsigned long addr)
 {
-	return 0;
+	return ((void *)((addr & ~0x80000000) + PAGE_OFFSET));
 }
 
-extern __inline__ unsigned long inw(unsigned long addr)
-{
-	return 0;
-}
+#define virt_to_bus virt_to_phys
+#define bus_to_virt phys_to_virt
 
-extern __inline__ unsigned long inl(unsigned long addr)
+extern __inline__ unsigned int inb(unsigned long addr)
 {
-	return 0;
-}
+	unsigned int ret;
 
-extern __inline__ void outb(unsigned char b, unsigned long addr)
-{
-	return;
-}
+	__asm__ __volatile__("lduba [%1] %2, %0"
+			     : "=r" (ret)
+			     : "r" (addr), "i" (ASI_PL));
 
-extern __inline__ void outw(unsigned short b, unsigned long addr)
-{
-	return;
+	return ret;
 }
 
-extern __inline__ void outl(unsigned int b, unsigned long addr)
+extern __inline__ unsigned int inw(unsigned long addr)
 {
-	return;
-}
+	unsigned int ret;
 
-/*
- * Memory functions
- */
-extern __inline__ unsigned long readb(unsigned long addr)
-{
-	return 0;
-}
+	__asm__ __volatile__("lduha [%1] %2, %0"
+			     : "=r" (ret)
+			     : "r" (addr), "i" (ASI_PL));
 
-extern __inline__ unsigned long readw(unsigned long addr)
-{
-	return 0;
+	return ret;
 }
 
-extern __inline__ unsigned long readl(unsigned long addr)
+extern __inline__ unsigned int inl(unsigned long addr)
 {
-	return 0;
+	unsigned int ret;
+
+	__asm__ __volatile__("lduwa [%1] %2, %0"
+			     : "=r" (ret)
+			     : "r" (addr), "i" (ASI_PL));
+
+	return ret;
 }
 
-extern __inline__ void writeb(unsigned short b, unsigned long addr)
+extern __inline__ void outb(unsigned char b, unsigned long addr)
 {
-	return;
+	__asm__ __volatile__("stba %0, [%1] %2"
+			     : /* no outputs */
+			     : "r" (b), "r" (addr), "i" (ASI_PL));
 }
 
-extern __inline__ void writew(unsigned short b, unsigned long addr)
+extern __inline__ void outw(unsigned short w, unsigned long addr)
 {
-	return;
+	__asm__ __volatile__("stha %0, [%1] %2"
+			     : /* no outputs */
+			     : "r" (w), "r" (addr), "i" (ASI_PL));
 }
 
-extern __inline__ void writel(unsigned int b, unsigned long addr)
+extern __inline__ void outl(unsigned int l, unsigned long addr)
 {
-	return;
+	__asm__ __volatile__("stwa %0, [%1] %2"
+			     : /* no outputs */
+			     : "r" (l), "r" (addr), "i" (ASI_PL));
 }
 
 #define inb_p inb
 #define outb_p outb
 
+extern void outsb(unsigned long addr, const void *src, unsigned long count);
+extern void outsw(unsigned long addr, const void *src, unsigned long count);
+extern void outsl(unsigned long addr, const void *src, unsigned long count);
+extern void insb(unsigned long addr, void *dst, unsigned long count);
+extern void insw(unsigned long addr, void *dst, unsigned long count);
+extern void insl(unsigned long addr, void *dst, unsigned long count);
+
+/* Memory functions, same as I/O accesses on Ultra. */
+#define readb(addr)		inb(addr)
+#define readw(addr)		inw(addr)
+#define readl(addr)		inl(addr)
+#define writeb(b, addr)		outb((b), (addr))
+#define writew(w, addr)		outw((w), (addr))
+#define writel(l, addr)		outl((l), (addr))
+
+/* Memcpy to/from I/O space is just a regular memory operation on Ultra as well. */
+
+#if 0 /* XXX Not exactly, we need to use ASI_*L from/to the I/O end,
+       * XXX so these are disabled until we code that stuff.
+       */
+#define memset_io(a,b,c)		memset(((char *)(a)),(b),(c))
+#define memcpy_fromio(a,b,c)		memcpy((a),((char *)(b)),(c))
+#define memcpy_toio(a,b,c)		memcpy(((char *)(a)),(b),(c))
+#define eth_io_copy_and_sum(a,b,c,d)	eth_copy_and_sum((a),((char *)(b)),(c),(d))
+#endif
+
+static inline int check_signature(unsigned long io_addr,
+				  const unsigned char *signature,
+				  int length)
+{
+	int retval = 0;
+	do {
+		if (readb(io_addr++) != *signature++)
+			goto out;
+	} while (--length);
+	retval = 1;
+out:
+	return retval;
+}
+
 extern void sparc_ultra_mapioaddr   (unsigned long physaddr, unsigned long virt_addr,
 				     int bus, int rdonly);
 extern void sparc_ultra_unmapioaddr (unsigned long virt_addr);
@@ -102,8 +141,5 @@
 extern void *sparc_alloc_io (u32 pa, void *va, int sz, char *name, u32 io, int rdonly);
 extern void sparc_free_io (void *va, int sz);
 extern void *sparc_dvma_malloc (int sz, char *name, __u32 *dvma_addr);
-
-#define virt_to_phys(x) __pa((unsigned long)(x))
-#define phys_to_virt(x) __va((unsigned long)(x))
 
 #endif /* !(__SPARC64_IO_H) */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov