summaryrefslogtreecommitdiffstats
path: root/include/asm-sparc64/io.h
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-02-05 06:47:02 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-02-05 06:47:02 +0000
commit99a7e12f34b3661a0d1354eef83a0eef4df5e34c (patch)
tree3560aca9ca86792f9ab7bd87861ea143a1b3c7a3 /include/asm-sparc64/io.h
parente73a04659c0b8cdee4dd40e58630e2cf63afb316 (diff)
Merge with Linux 2.3.38.
Diffstat (limited to 'include/asm-sparc64/io.h')
-rw-r--r--include/asm-sparc64/io.h208
1 files changed, 137 insertions, 71 deletions
diff --git a/include/asm-sparc64/io.h b/include/asm-sparc64/io.h
index 8295a17ce..5dc5c88c6 100644
--- a/include/asm-sparc64/io.h
+++ b/include/asm-sparc64/io.h
@@ -1,4 +1,4 @@
-/* $Id: io.h,v 1.24 1999/09/06 01:17:54 davem Exp $ */
+/* $Id: io.h,v 1.29 1999/12/20 04:58:42 davem Exp $ */
#ifndef __SPARC64_IO_H
#define __SPARC64_IO_H
@@ -13,7 +13,9 @@
#define __SLOW_DOWN_IO do { } while (0)
#define SLOW_DOWN_IO do { } while (0)
+#undef NEW_PCI_DMA_MAP
+#ifndef NEW_PCI_DMA_MAP
#define PCI_DVMA_HASHSZ 256
extern unsigned long pci_dvma_v2p_hash[PCI_DVMA_HASHSZ];
@@ -21,7 +23,7 @@ extern unsigned long pci_dvma_p2v_hash[PCI_DVMA_HASHSZ];
#define pci_dvma_ahashfn(addr) (((addr) >> 24) & 0xff)
-extern __inline__ unsigned long virt_to_phys(volatile void *addr)
+extern __inline__ unsigned long virt_to_bus(volatile void *addr)
{
unsigned long vaddr = (unsigned long)addr;
unsigned long off;
@@ -34,7 +36,7 @@ extern __inline__ unsigned long virt_to_phys(volatile void *addr)
return vaddr + off;
}
-extern __inline__ void *phys_to_virt(unsigned long addr)
+extern __inline__ void *bus_to_virt(unsigned long addr)
{
unsigned long paddr = addr & 0xffffffffUL;
unsigned long off;
@@ -42,9 +44,12 @@ extern __inline__ void *phys_to_virt(unsigned long addr)
off = pci_dvma_p2v_hash[pci_dvma_ahashfn(paddr)];
return (void *)(paddr + off);
}
-
-#define virt_to_bus virt_to_phys
-#define bus_to_virt phys_to_virt
+#else
+extern unsigned long virt_to_bus_not_defined_use_pci_map(volatile void *addr);
+#define virt_to_bus virt_to_bus_not_defined_use_pci_map
+extern unsigned long bus_to_virt_not_defined_use_pci_map(volatile void *addr);
+#define bus_to_virt bus_to_virt_not_defined_use_pci_map
+#endif
/* Different PCI controllers we support have their PCI MEM space
* mapped to an either 2GB (Psycho) or 4GB (Sabre) aligned area,
@@ -58,7 +63,7 @@ extern __inline__ unsigned int inb(unsigned long addr)
{
unsigned int ret;
- __asm__ __volatile__("lduba [%1] %2, %0"
+ __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_inb */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
@@ -69,7 +74,7 @@ extern __inline__ unsigned int inw(unsigned long addr)
{
unsigned int ret;
- __asm__ __volatile__("lduha [%1] %2, %0"
+ __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_inw */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
@@ -80,7 +85,7 @@ extern __inline__ unsigned int inl(unsigned long addr)
{
unsigned int ret;
- __asm__ __volatile__("lduwa [%1] %2, %0"
+ __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_inl */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
@@ -89,23 +94,23 @@ extern __inline__ unsigned int inl(unsigned long addr)
extern __inline__ void outb(unsigned char b, unsigned long addr)
{
- __asm__ __volatile__("stba %0, [%1] %2"
+ __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_outb */"
: /* no outputs */
- : "r" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
+ : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}
extern __inline__ void outw(unsigned short w, unsigned long addr)
{
- __asm__ __volatile__("stha %0, [%1] %2"
+ __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_outw */"
: /* no outputs */
- : "r" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
+ : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}
extern __inline__ void outl(unsigned int l, unsigned long addr)
{
- __asm__ __volatile__("stwa %0, [%1] %2"
+ __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_outl */"
: /* no outputs */
- : "r" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
+ : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}
#define inb_p inb
@@ -123,7 +128,7 @@ extern __inline__ unsigned int _readb(unsigned long addr)
{
unsigned int ret;
- __asm__ __volatile__("lduba [%1] %2, %0"
+ __asm__ __volatile__("lduba\t[%1] %2, %0\t/* pci_readb */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
@@ -134,7 +139,7 @@ extern __inline__ unsigned int _readw(unsigned long addr)
{
unsigned int ret;
- __asm__ __volatile__("lduha [%1] %2, %0"
+ __asm__ __volatile__("lduha\t[%1] %2, %0\t/* pci_readw */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
@@ -145,7 +150,7 @@ extern __inline__ unsigned int _readl(unsigned long addr)
{
unsigned int ret;
- __asm__ __volatile__("lduwa [%1] %2, %0"
+ __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* pci_readl */"
: "=r" (ret)
: "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
@@ -154,23 +159,23 @@ extern __inline__ unsigned int _readl(unsigned long addr)
extern __inline__ void _writeb(unsigned char b, unsigned long addr)
{
- __asm__ __volatile__("stba %0, [%1] %2"
+ __asm__ __volatile__("stba\t%r0, [%1] %2\t/* pci_writeb */"
: /* no outputs */
- : "r" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
+ : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}
extern __inline__ void _writew(unsigned short w, unsigned long addr)
{
- __asm__ __volatile__("stha %0, [%1] %2"
+ __asm__ __volatile__("stha\t%r0, [%1] %2\t/* pci_writew */"
: /* no outputs */
- : "r" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
+ : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}
extern __inline__ void _writel(unsigned int l, unsigned long addr)
{
- __asm__ __volatile__("stwa %0, [%1] %2"
+ __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* pci_writel */"
: /* no outputs */
- : "r" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
+ : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E_L));
}
#define readb(__addr) (_readb((unsigned long)(__addr)))
@@ -180,56 +185,126 @@ extern __inline__ void _writel(unsigned int l, unsigned long addr)
#define writew(__w, __addr) (_writew((__w), (unsigned long)(__addr)))
#define writel(__l, __addr) (_writel((__l), (unsigned long)(__addr)))
-#define IO_SPACE_LIMIT 0xffffffff
-
-/*
- * Memcpy to/from I/O space is just a regular memory operation on
- * Ultra as well.
+/* Valid I/O Space regions are anywhere, because each PCI bus supported
+ * can live in an arbitrary area of the physical address range.
*/
+#define IO_SPACE_LIMIT 0xffffffffffffffffUL
-/*
- * FIXME: Write faster routines using ASL_*L for this.
+/* Now, SBUS variants, only difference from PCI is that we do
+ * not use little-endian ASIs.
*/
-static inline void *
-memset_io(void *dst, int c, __kernel_size_t n)
+extern __inline__ unsigned int _sbus_readb(unsigned long addr)
{
- char *d = dst;
+ unsigned int ret;
- while (n--)
- *d++ = c;
+ __asm__ __volatile__("lduba\t[%1] %2, %0\t/* sbus_readb */"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
- return dst;
+ return ret;
+}
+
+extern __inline__ unsigned int _sbus_readw(unsigned long addr)
+{
+ unsigned int ret;
+
+ __asm__ __volatile__("lduha\t[%1] %2, %0\t/* sbus_readw */"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+
+ return ret;
+}
+
+extern __inline__ unsigned int _sbus_readl(unsigned long addr)
+{
+ unsigned int ret;
+
+ __asm__ __volatile__("lduwa\t[%1] %2, %0\t/* sbus_readl */"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+
+ return ret;
+}
+
+extern __inline__ void _sbus_writeb(unsigned char b, unsigned long addr)
+{
+ __asm__ __volatile__("stba\t%r0, [%1] %2\t/* sbus_writeb */"
+ : /* no outputs */
+ : "Jr" (b), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+}
+
+extern __inline__ void _sbus_writew(unsigned short w, unsigned long addr)
+{
+ __asm__ __volatile__("stha\t%r0, [%1] %2\t/* sbus_writew */"
+ : /* no outputs */
+ : "Jr" (w), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+}
+
+extern __inline__ void _sbus_writel(unsigned int l, unsigned long addr)
+{
+ __asm__ __volatile__("stwa\t%r0, [%1] %2\t/* sbus_writel */"
+ : /* no outputs */
+ : "Jr" (l), "r" (addr), "i" (ASI_PHYS_BYPASS_EC_E));
+}
+
+#define sbus_readb(__addr) (_sbus_readb((unsigned long)(__addr)))
+#define sbus_readw(__addr) (_sbus_readw((unsigned long)(__addr)))
+#define sbus_readl(__addr) (_sbus_readl((unsigned long)(__addr)))
+#define sbus_writeb(__b, __addr) (_sbus_writeb((__b), (unsigned long)(__addr)))
+#define sbus_writew(__w, __addr) (_sbus_writew((__w), (unsigned long)(__addr)))
+#define sbus_writel(__l, __addr) (_sbus_writel((__l), (unsigned long)(__addr)))
+
+static inline void *sbus_memset_io(void *__dst, int c, __kernel_size_t n)
+{
+ unsigned long dst = (unsigned long)__dst;
+
+ while(n--) {
+ sbus_writeb(c, dst);
+ dst++;
+ }
+ return (void *) dst;
}
static inline void *
-memcpy_fromio(void *dst, const void *src, __kernel_size_t n)
+memset_io(void *dst, int c, __kernel_size_t n)
{
- const char *s = src;
char *d = dst;
- while (n--)
- *d++ = *s++;
+ while (n--) {
+ writeb(c, d);
+ d++;
+ }
return dst;
}
static inline void *
-memcpy_toio(void *dst, const void *src, __kernel_size_t n)
+memcpy_fromio(void *dst, unsigned long src, __kernel_size_t n)
{
- const char *s = src;
char *d = dst;
- while (n--)
- *d++ = *s++;
+ while (n--) {
+ char tmp = readb(src);
+ *d++ = tmp;
+ src++;
+ }
return dst;
}
-#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 eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),((char *)(b)),(c),(d))
-#endif
+static inline void *
+memcpy_toio(unsigned long dst, const void *src, __kernel_size_t n)
+{
+ const char *s = src;
+ unsigned long d = dst;
+
+ while (n--) {
+ char tmp = *s++;
+ writeb(tmp, d);
+ d++;
+ }
+ return (void *)dst;
+}
static inline int check_signature(unsigned long io_addr,
const unsigned char *signature,
@@ -251,27 +326,18 @@ out:
#define ioremap(__offset, __size) ((void *)(__offset))
#define iounmap(__addr) do { } while(0)
-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);
-
-extern __inline__ void mapioaddr(unsigned long physaddr,
- unsigned long virt_addr,
- int bus, int rdonly)
-{
- sparc_ultra_mapioaddr(physaddr, virt_addr, bus, rdonly);
-}
-
-extern __inline__ void unmapioaddr(unsigned long virt_addr)
-{
- sparc_ultra_unmapioaddr(virt_addr);
-}
-
-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);
+/* Similarly for SBUS. */
+#define sbus_ioremap(__res, __offset, __size, __name) \
+({ unsigned long __ret; \
+ __ret = (__res)->start + (((__res)->flags & 0x1ffUL) << 32UL); \
+ __ret += (unsigned long) (__offset); \
+ if (! request_region((__ret), (__size), (__name))) \
+ __ret = 0UL; \
+ __ret; \
+})
+
+#define sbus_iounmap(__addr, __size) \
+ release_region((__addr), (__size))
/* Nothing to do */