1 /* $Id: PeeCeeI.c,v 1.4 1999/09/06 01:17:35 davem Exp $
2 * PeeCeeI.c: The emerging standard...
4 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
7 #include <linux/config.h>
12 #include <asm/byteorder.h>
14 void outsb(unsigned long addr
, const void *src
, unsigned long count
)
22 void outsw(unsigned long addr
, const void *src
, unsigned long count
)
28 if(((u64
)src
) & 0x2) {
29 u16 val
= le16_to_cpup(ps
);
36 u32 w
= le32_to_cpup(pi
);
45 u16 val
= le16_to_cpup(ps
);
51 void outsl(unsigned long addr
, const void *src
, unsigned long count
)
54 if((((u64
)src
) & 0x3) == 0) {
57 u32 val
= cpu_to_le32p(p
);
67 switch(((u64
)src
) & 0x3) {
70 l
= cpu_to_le16p(ps
) << 16;
74 l2
= cpu_to_le32p(pi
);
76 outl(((l
>> 16) | (l2
<< 16)), addr
);
80 l2
= cpu_to_le16p(ps
);
81 outl(((l
>> 16) | (l2
<< 16)), addr
);
89 l2
= cpu_to_le16p(ps
);
94 l2
= cpu_to_le32p(pi
);
96 outl(((l
>> 8) | (l2
<< 24)), addr
);
100 outl(((l
>> 8) | (*pb
<< 24)), addr
);
109 l2
= cpu_to_le32p(pi
);
111 outl(((l
>> 24) | (l2
<< 8)), addr
);
115 l2
= cpu_to_le16p(ps
);
119 outl(((l
>> 24) | (l2
<< 8)), addr
);
126 void insb(unsigned long addr
, void *dst
, unsigned long count
)
132 while((((unsigned long)pb
) & 0x3) && count
--)
138 w
= (inb(addr
) << 24);
139 w
|= (inb(addr
) << 16);
140 w
|= (inb(addr
) << 8);
141 w
|= (inb(addr
) << 0);
151 void insw(unsigned long addr
, void *dst
, unsigned long count
)
157 if(((unsigned long)ps
) & 0x2) {
158 *ps
++ = le16_to_cpu(inw(addr
));
165 w
= (le16_to_cpu(inw(addr
)) << 16);
166 w
|= (le16_to_cpu(inw(addr
)) << 0);
172 *ps
= le16_to_cpu(inw(addr
));
176 void insl(unsigned long addr
, void *dst
, unsigned long count
)
179 if((((unsigned long)dst
) & 0x3) == 0) {
182 *pi
++ = le32_to_cpu(inl(addr
));
188 switch(((unsigned long)dst
) & 3) {
192 l
= le32_to_cpu(inl(addr
));
196 l2
= le32_to_cpu(inl(addr
));
197 *pi
++ = (l
<< 16) | (l2
>> 16);
207 l
= le32_to_cpu(inl(addr
));
210 *ps
++ = ((l
>> 8) & 0xffff);
213 l2
= le32_to_cpu(inl(addr
));
214 *pi
++ = (l
<< 24) | (l2
>> 8);
224 l
= le32_to_cpu(inl(addr
));
228 l2
= le32_to_cpu(inl(addr
));
229 *pi
++ = (l
<< 8) | (l2
>> 24);
233 *ps
++ = ((l
>> 8) & 0xffff);
242 #endif /* CONFIG_PCI */