2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Low level I/O functions for SNI.
8 #include <linux/string.h>
9 #include <linux/spinlock.h>
10 #include <asm/addrspace.h>
11 #include <asm/system.h>
15 * Urgs... We only can see a 16mb window of the 4gb EISA address space
16 * at PCIMT_EISA_BASE. Maladia segmentitis ...
18 * To avoid locking and all the related headacke we implement this such
19 * that accessing the bus address space nests, so we're treating this
20 * correctly even for interrupts. This is going to suck seriously for
21 * the SMP members of the RM family.
23 * Making things worse the PCIMT_CSMAPISA register resides on the X bus with
24 * it's unbeatable 1.4 mb/s transfer rate.
27 static inline void eisa_map(unsigned long address)
31 upper = address >> 24;
32 *(volatile unsigned char *)PCIMT_CSMAPISA = ~upper;
35 #define save_eisa_map() \
36 (*(volatile unsigned char *)PCIMT_CSMAPISA)
37 #define restore_eisa_map(val) \
38 do { (*(volatile unsigned char *)PCIMT_CSMAPISA) = val; } while(0)
40 static unsigned char sni_readb(unsigned long addr)
43 unsigned int save_map;
45 save_map = save_eisa_map();
48 res = *(volatile unsigned char *) (PCIMT_EISA_BASE + addr);
49 restore_eisa_map(save_map);
54 static unsigned short sni_readw(unsigned long addr)
57 unsigned int save_map;
59 save_map = save_eisa_map();
62 res = *(volatile unsigned char *) (PCIMT_EISA_BASE + addr);
63 restore_eisa_map(save_map);
68 static unsigned int sni_readl(unsigned long addr)
71 unsigned int save_map;
73 save_map = save_eisa_map();
76 res = *(volatile unsigned char *) (PCIMT_EISA_BASE + addr);
77 restore_eisa_map(save_map);
82 static void sni_writeb(unsigned char val, unsigned long addr)
84 unsigned int save_map;
86 save_map = save_eisa_map();
89 *(volatile unsigned char *) (PCIMT_EISA_BASE + addr) = val;
90 restore_eisa_map(save_map);
93 static void sni_writew(unsigned short val, unsigned long addr)
95 unsigned int save_map;
97 save_map = save_eisa_map();
100 *(volatile unsigned char *) (PCIMT_EISA_BASE + addr) = val;
101 restore_eisa_map(save_map);
104 static void sni_writel(unsigned int val, unsigned long addr)
106 unsigned int save_map;
108 save_map = save_eisa_map();
111 *(volatile unsigned char *) (PCIMT_EISA_BASE + addr) = val;
112 restore_eisa_map(save_map);
115 static void sni_memset_io(unsigned long addr, int val, unsigned long len)
118 unsigned int save_map;
120 save_map = save_eisa_map();
121 waddr = PCIMT_EISA_BASE | (addr & 0xffffff);
123 unsigned long fraglen;
125 fraglen = (~addr + 1) & 0xffffff;
126 fraglen = (fraglen < len) ? fraglen : len;
128 memset((char *)waddr, val, fraglen);
130 waddr = waddr + fraglen - 0x1000000;
133 restore_eisa_map(save_map);
136 static void sni_memcpy_fromio(unsigned long to, unsigned long from, unsigned long len)
139 unsigned int save_map;
141 save_map = save_eisa_map();
142 waddr = PCIMT_EISA_BASE | (from & 0xffffff);
144 unsigned long fraglen;
146 fraglen = (~from + 1) & 0xffffff;
147 fraglen = (fraglen < len) ? fraglen : len;
149 memcpy((void *)to, (void *)waddr, fraglen);
152 waddr = waddr + fraglen - 0x1000000;
155 restore_eisa_map(save_map);
158 static void sni_memcpy_toio(unsigned long to, unsigned long from, unsigned long len)
161 unsigned int save_map;
163 save_map = save_eisa_map();
164 waddr = PCIMT_EISA_BASE | (to & 0xffffff);
166 unsigned long fraglen;
168 fraglen = (~to + 1) & 0xffffff;
169 fraglen = (fraglen < len) ? fraglen : len;
171 memcpy((char *)to + PCIMT_EISA_BASE, (void *)from, fraglen);
174 waddr = waddr + fraglen - 0x1000000;
177 restore_eisa_map(save_map);