patch-1.3.2 linux/arch/alpha/lib/io.c
Next file: linux/arch/i386/Makefile
Previous file: linux/arch/alpha/lib/checksum.c
Back to the patch index
Back to the overall index
- Lines: 132
- Date:
Fri Jun 16 19:47:46 1995
- Orig file:
v1.3.1/linux/arch/alpha/lib/io.c
- Orig date:
Thu Jun 1 13:22:06 1995
diff -u --recursive --new-file v1.3.1/linux/arch/alpha/lib/io.c linux/arch/alpha/lib/io.c
@@ -2,6 +2,8 @@
* Alpha IO and memory functions.. Just expand the inlines in the header
* files..
*/
+#include <linux/kernel.h>
+
#include <asm/io.h>
/*
@@ -95,4 +97,122 @@
void writel(unsigned int b, unsigned long addr)
{
__writel(b, addr);
+}
+
+/*
+ * Read COUNT 16-bit words from port PORT into memory starting at
+ * SRC. SRC must be at least short aligned. This is used by the
+ * IDE driver to read disk sectors. Performance is important, but
+ * the interfaces seems to be slow: just using the inlined version
+ * of the inw() breaks things.
+ */
+#undef insw
+void insw (unsigned long port, void *dst, unsigned long count)
+{
+ unsigned int *ip, w;
+
+ if (((unsigned long)dst) & 0x3) {
+ if (((unsigned long)dst) & 0x1) {
+ panic("insw: memory not short aligned");
+ }
+ *(unsigned short*)dst = inw(port);
+ dst += 2;
+ --count;
+ }
+
+ ip = dst;
+ while (count >= 2) {
+ w = inw(port);
+ w |= inw(port) << 16;
+ count -= 2;
+ *ip++ = w;
+ }
+
+ if (count) {
+ w = inw(port);
+ *(unsigned short*)ip = w;
+ }
+}
+
+
+/*
+ * Read COUNT 32-bit words from port PORT into memory starting at
+ * SRC. SRC must be at least word aligned. This is used by the
+ * IDE driver to read disk sectors. Performance is important, but
+ * the interfaces seems to be slow: just using the inlined version
+ * of the inw() breaks things.
+ */
+#undef insl
+void insl (unsigned long port, void *dst, unsigned long count)
+{
+ unsigned int *ip, w;
+
+ if (((unsigned long)dst) & 0x3) {
+ panic("insl: memory not aligned");
+ }
+
+ ip = dst;
+ while (count > 0) {
+ w = inw(port);
+ --count;
+ *ip++ = w;
+ }
+}
+
+
+/*
+ * Like insw but in the opposite direction. This is used by the IDE
+ * driver to write disk sectors. Performance is important, but the
+ * interfaces seems to be slow: just using the inlined version of the
+ * outw() breaks things.
+ */
+#undef outsw
+void outsw (unsigned long port, void *src, unsigned long count)
+{
+ unsigned int *ip, w;
+
+ if (((unsigned long)src) & 0x3) {
+ if (((unsigned long)src) & 0x1) {
+ panic("outsw: memory not short aligned");
+ }
+ outw(*(unsigned short*)src, port);
+ src += 2;
+ --count;
+ }
+
+ ip = src;
+ while (count >= 2) {
+ w = *ip++;
+ count -= 2;
+ outw(w >> 0, port);
+ outw(w >> 16, port);
+ }
+
+ if (count) {
+ outw(*(unsigned short*)ip, port);
+ }
+}
+
+
+/*
+ * Like insl but in the opposite direction. This is used by the IDE
+ * driver to write disk sectors. Performance is important, but the
+ * interfaces seems to be slow: just using the inlined version of the
+ * outw() breaks things.
+ */
+#undef outsw
+void outsl (unsigned long port, void *src, unsigned long count)
+{
+ unsigned int *ip, w;
+
+ if (((unsigned long)src) & 0x3) {
+ panic("outsw: memory not aligned");
+ }
+
+ ip = src;
+ while (count > 0) {
+ w = *ip++;
+ --count;
+ outw(w, port);
+ }
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this