1 /* $Id: io.c,v 1.4 1999/08/18 23:37:46 ralf Exp $
3 * This file is subject to the terms and conditions of the GNU General Public
4 * License. See the file "COPYING" in the main directory of this archive
7 * Low level I/O functions for SNI.
9 #include <linux/string.h>
10 #include <linux/spinlock.h>
11 #include <asm/addrspace.h>
12 #include <asm/system.h>
16 * Urgs... We only can see a 16mb window of the 4gb EISA address space
17 * at PCIMT_EISA_BASE. Maladia segmentitis ...
19 * To avoid locking and all the related headacke we implement this such
20 * that accessing the bus address space nests, so we're treating this
21 * correctly even for interrupts. This is going to suck seriously for
22 * the SMP members of the RM family.
24 * Making things worse the PCIMT_CSMAPISA register resides on the X bus with
25 * it's unbeatable 1.4 mb/s transfer rate.
28 static inline void eisa_map(unsigned long address
)
32 upper
= address
>> 24;
33 *(volatile unsigned char *)PCIMT_CSMAPISA
= ~upper
;
36 #define save_eisa_map() \
37 (*(volatile unsigned char *)PCIMT_CSMAPISA)
38 #define restore_eisa_map(val) \
39 do { (*(volatile unsigned char *)PCIMT_CSMAPISA) = val; } while(0)
41 static unsigned char sni_readb(unsigned long addr
)
44 unsigned int save_map
;
46 save_map
= save_eisa_map();
49 res
= *(volatile unsigned char *) (PCIMT_EISA_BASE
+ addr
);
50 restore_eisa_map(save_map
);
55 static unsigned short sni_readw(unsigned long addr
)
58 unsigned int save_map
;
60 save_map
= save_eisa_map();
63 res
= *(volatile unsigned char *) (PCIMT_EISA_BASE
+ addr
);
64 restore_eisa_map(save_map
);
69 static unsigned int sni_readl(unsigned long addr
)
72 unsigned int save_map
;
74 save_map
= save_eisa_map();
77 res
= *(volatile unsigned char *) (PCIMT_EISA_BASE
+ addr
);
78 restore_eisa_map(save_map
);
83 static void sni_writeb(unsigned char val
, unsigned long addr
)
85 unsigned int save_map
;
87 save_map
= save_eisa_map();
90 *(volatile unsigned char *) (PCIMT_EISA_BASE
+ addr
) = val
;
91 restore_eisa_map(save_map
);
94 static void sni_writew(unsigned short val
, unsigned long addr
)
96 unsigned int save_map
;
98 save_map
= save_eisa_map();
101 *(volatile unsigned char *) (PCIMT_EISA_BASE
+ addr
) = val
;
102 restore_eisa_map(save_map
);
105 static void sni_writel(unsigned int val
, unsigned long addr
)
107 unsigned int save_map
;
109 save_map
= save_eisa_map();
112 *(volatile unsigned char *) (PCIMT_EISA_BASE
+ addr
) = val
;
113 restore_eisa_map(save_map
);
116 static void sni_memset_io(unsigned long addr
, int val
, unsigned long len
)
119 unsigned int save_map
;
121 save_map
= save_eisa_map();
122 waddr
= PCIMT_EISA_BASE
| (addr
& 0xffffff);
124 unsigned long fraglen
;
126 fraglen
= (~addr
+ 1) & 0xffffff;
127 fraglen
= (fraglen
< len
) ? fraglen
: len
;
129 memset((char *)waddr
, val
, fraglen
);
131 waddr
= waddr
+ fraglen
- 0x1000000;
134 restore_eisa_map(save_map
);
137 static void sni_memcpy_fromio(unsigned long to
, unsigned long from
, unsigned long len
)
140 unsigned int save_map
;
142 save_map
= save_eisa_map();
143 waddr
= PCIMT_EISA_BASE
| (from
& 0xffffff);
145 unsigned long fraglen
;
147 fraglen
= (~from
+ 1) & 0xffffff;
148 fraglen
= (fraglen
< len
) ? fraglen
: len
;
150 memcpy((void *)to
, (void *)waddr
, fraglen
);
153 waddr
= waddr
+ fraglen
- 0x1000000;
156 restore_eisa_map(save_map
);
159 static void sni_memcpy_toio(unsigned long to
, unsigned long from
, unsigned long len
)
162 unsigned int save_map
;
164 save_map
= save_eisa_map();
165 waddr
= PCIMT_EISA_BASE
| (to
& 0xffffff);
167 unsigned long fraglen
;
169 fraglen
= (~to
+ 1) & 0xffffff;
170 fraglen
= (fraglen
< len
) ? fraglen
: len
;
172 memcpy((char *)to
+ PCIMT_EISA_BASE
, (void *)from
, fraglen
);
175 waddr
= waddr
+ fraglen
- 0x1000000;
178 restore_eisa_map(save_map
);