summaryrefslogtreecommitdiff
path: root/i386/pc/i16/i16_a20.c
diff options
context:
space:
mode:
Diffstat (limited to 'i386/pc/i16/i16_a20.c')
-rw-r--r--i386/pc/i16/i16_a20.c144
1 files changed, 0 insertions, 144 deletions
diff --git a/i386/pc/i16/i16_a20.c b/i386/pc/i16/i16_a20.c
deleted file mode 100644
index 5e91f86..0000000
--- a/i386/pc/i16/i16_a20.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 1995-1994 The University of Utah and
- * the Computer Systems Laboratory at the University of Utah (CSL).
- * All rights reserved.
- *
- * Permission to use, copy, modify and distribute this software is hereby
- * granted provided that (1) source code retains these copyright, permission,
- * and disclaimer notices, and (2) redistributions including binaries
- * reproduce the notices in supporting documentation, and (3) all advertising
- * materials mentioning features or use of this software display the following
- * acknowledgement: ``This product includes software developed by the
- * Computer Systems Laboratory at the University of Utah.''
- *
- * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
- * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
- * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * CSL requests users of this software to return to csl-dist@cs.utah.edu any
- * improvements that they make and grant CSL redistribution rights.
- *
- * Author: Bryan Ford, University of Utah CSL
- */
-
-
-#include <mach/machine/pio.h>
-#include <mach/machine/code16.h>
-
-#include "i16_a20.h"
-
-
-/* Keyboard stuff for turning on the A20 address line (gak!). */
-#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */
-#define K_STATUS 0x64 /* keyboard status (read-only) */
-#define K_CMD 0x64 /* keybd ctlr command (write-only) */
-
-#define K_OBUF_FUL 0x01 /* output buffer full */
-#define K_IBUF_FUL 0x02 /* input buffer full */
-
-#define KC_CMD_WIN 0xd0 /* read output port */
-#define KC_CMD_WOUT 0xd1 /* write output port */
-
-#define KB_ENABLE_A20 0xdf /* Linux and my BIOS uses this,
- and I trust them more than Mach 3.0,
- but I'd like to know what the difference is
- and if it matters. */
- /*0x9f*/ /* enable A20,
- enable output buffer full interrupt
- enable data line
- disable clock line */
-#define KB_DISABLE_A20 0xdd
-
-
-CODE16
-
-
-/*
- This routine ensures that the keyboard command queue is empty
- (after emptying the output buffers)
-
- No timeout is used - if this hangs there is something wrong with
- the machine, and we probably couldn't proceed anyway.
- XXX should at least die properly
-*/
-static void i16_empty_8042(void)
-{
- int status;
-
-retry:
- i16_nanodelay(1000);
- status = i16_inb(K_STATUS);
-
- if (status & K_OBUF_FUL)
- {
- i16_nanodelay(1000);
- i16_inb(K_RDWR);
- goto retry;
- }
-
- if (status & K_IBUF_FUL)
- goto retry;
-}
-
-int i16_raw_test_a20(void);
-
-/* Enable the A20 address line. */
-void i16_raw_enable_a20(void)
-{
- int v;
-
- /* XXX try int 15h function 24h */
-
- if (i16_raw_test_a20())
- return;
-
- /* PS/2 */
- v = i16_inb(0x92);
- i16_nanodelay(1000);
- i16_outb(0x92,v | 2);
-
- if (i16_raw_test_a20())
- return;
-
- /* AT */
- i16_empty_8042();
- i16_outb(K_CMD, KC_CMD_WOUT);
- i16_empty_8042();
- i16_outb(K_RDWR, KB_ENABLE_A20);
- i16_empty_8042();
-
- /* Wait until the a20 line gets enabled. */
- while (!i16_raw_test_a20());
-}
-
-/* Disable the A20 address line. */
-void i16_raw_disable_a20(void)
-{
- int v;
-
- if (!i16_raw_test_a20())
- return;
-
- /* PS/2 */
- v = i16_inb(0x92);
- i16_nanodelay(1000);
- i16_outb(0x92, v & ~2);
-
- if (!i16_raw_test_a20())
- return;
-
- /* AT */
- i16_empty_8042();
- i16_outb(K_CMD, KC_CMD_WOUT);
- i16_empty_8042();
- i16_outb(K_RDWR, KB_DISABLE_A20);
- i16_empty_8042();
-
- /* Wait until the a20 line gets disabled. */
- while (i16_raw_test_a20());
-}
-
-
-void (*i16_enable_a20)(void) = i16_raw_enable_a20;
-void (*i16_disable_a20)(void) = i16_raw_disable_a20;
-