summaryrefslogtreecommitdiffstats
path: root/include/asm-ia64/sn/pio.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-ia64/sn/pio.h')
-rw-r--r--include/asm-ia64/sn/pio.h155
1 files changed, 155 insertions, 0 deletions
diff --git a/include/asm-ia64/sn/pio.h b/include/asm-ia64/sn/pio.h
new file mode 100644
index 000000000..72e2615d6
--- /dev/null
+++ b/include/asm-ia64/sn/pio.h
@@ -0,0 +1,155 @@
+/* $Id$
+ *
+ * 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) 1992 - 1997, 2000 Silicon Graphics, Inc.
+ * Copyright (C) 2000 by Colin Ngam
+ */
+#ifndef _ASM_SN_PIO_H
+#define _ASM_SN_PIO_H
+
+#include <linux/types.h>
+#include <asm/sn/sgi.h>
+#include <asm/sn/iobus.h>
+
+/*
+ * pioaddr_t - The kernel virtual address that a PIO can be done upon.
+ * Should probably be (volatile void*) but EVEREST would do PIO
+ * to long mostly, just cast for other sizes.
+ */
+
+typedef volatile ulong* pioaddr_t;
+
+/*
+ * iopaddr_t - the physical io space relative address (e.g. VME A16S 0x0800).
+ * iosapce_t - specifies the io address space to be mapped/accessed.
+ * piomap_t - the handle returned by pio_alloc() and used with all the pio
+ * access functions.
+ */
+
+
+typedef struct piomap {
+ uint pio_bus;
+ uint pio_adap;
+#ifdef IRIX
+ iospace_t pio_iospace;
+#endif
+ int pio_flag;
+ int pio_reg;
+ char pio_name[7]; /* to identify the mapped device */
+ struct piomap *pio_next; /* dlist to link active piomap's */
+ struct piomap *pio_prev; /* for debug and error reporting */
+#ifdef IRIX
+ void (*pio_errfunc)(); /* Pointer to an error function */
+ /* Used only for piomaps allocated
+ * in user level vme driver */
+#endif
+ iopaddr_t pio_iopmask; /* valid iop address bit mask */
+ iobush_t pio_bushandle; /* bus-level handle */
+} piomap_t;
+
+
+/* Macro to get/set PIO error function */
+#define pio_seterrf(p,f) (p)->pio_errfunc = (f)
+#define pio_geterrf(p) (p)->pio_errfunc
+
+
+/*
+ * pio_mapalloc() - allocates a handle that specifies a mapping from kernel
+ * virtual to io space. The returned handle piomap is used
+ * with the access functions to make sure that the mapping
+ * to the iospace exists.
+ * pio_mapfree() - frees the mapping as specified in the piomap handle.
+ * pio_mapaddr() - returns the kv address that maps to piomap'ed io address.
+ */
+#ifdef IRIX
+extern piomap_t *pio_mapalloc(uint,uint,iospace_t*,int,char*);
+extern void pio_mapfree(piomap_t*);
+extern caddr_t pio_mapaddr(piomap_t*,iopaddr_t);
+extern piomap_t *pio_ioaddr(int, iobush_t, iopaddr_t, piomap_t *);
+
+/*
+ * PIO access functions.
+ */
+extern int pio_badaddr(piomap_t*,iopaddr_t,int);
+extern int pio_badaddr_val(piomap_t*,iopaddr_t,int,void*);
+extern int pio_wbadaddr(piomap_t*,iopaddr_t,int);
+extern int pio_wbadaddr_val(piomap_t*,iopaddr_t,int,int);
+extern int pio_bcopyin(piomap_t*,iopaddr_t,void *,int, int, int);
+extern int pio_bcopyout(piomap_t*,iopaddr_t,void *,int, int, int);
+
+
+/*
+ * PIO RMW functions using piomap.
+ */
+extern void pio_orb_rmw(piomap_t*, iopaddr_t, unsigned char);
+extern void pio_orh_rmw(piomap_t*, iopaddr_t, unsigned short);
+extern void pio_orw_rmw(piomap_t*, iopaddr_t, unsigned long);
+extern void pio_andb_rmw(piomap_t*, iopaddr_t, unsigned char);
+extern void pio_andh_rmw(piomap_t*, iopaddr_t, unsigned short);
+extern void pio_andw_rmw(piomap_t*, iopaddr_t, unsigned long);
+
+
+/*
+ * Old RMW function interface
+ */
+extern void orb_rmw(volatile void*, unsigned int);
+extern void orh_rmw(volatile void*, unsigned int);
+extern void orw_rmw(volatile void*, unsigned int);
+extern void andb_rmw(volatile void*, unsigned int);
+extern void andh_rmw(volatile void*, unsigned int);
+extern void andw_rmw(volatile void*, unsigned int);
+#endif /* IRIX */
+
+
+/*
+ * piomap_t type defines
+ */
+
+#define PIOMAP_NTYPES 7
+
+#define PIOMAP_A16N VME_A16NP
+#define PIOMAP_A16S VME_A16S
+#define PIOMAP_A24N VME_A24NP
+#define PIOMAP_A24S VME_A24S
+#define PIOMAP_A32N VME_A32NP
+#define PIOMAP_A32S VME_A32S
+#define PIOMAP_A64 6
+
+#define PIOMAP_EISA_IO 0
+#define PIOMAP_EISA_MEM 1
+
+#define PIOMAP_PCI_IO 0
+#define PIOMAP_PCI_MEM 1
+#define PIOMAP_PCI_CFG 2
+#define PIOMAP_PCI_ID 3
+
+/* IBUS piomap types */
+#define PIOMAP_FCI 0
+
+/* dang gio piomap types */
+
+#define PIOMAP_GIO32 0
+#define PIOMAP_GIO64 1
+
+#define ET_MEM 0
+#define ET_IO 1
+#define LAN_RAM 2
+#define LAN_IO 3
+
+#define PIOREG_NULL -1
+
+/* standard flags values for pio_map routines,
+ * including {xtalk,pciio}_piomap calls.
+ * NOTE: try to keep these in step with DMAMAP flags.
+ */
+#define PIOMAP_UNFIXED 0x0
+#define PIOMAP_FIXED 0x1
+#define PIOMAP_NOSLEEP 0x2
+#define PIOMAP_INPLACE 0x4
+
+#define PIOMAP_FLAGS 0x7
+
+#endif /* _ASM_SN_PIO_H */