diff options
Diffstat (limited to 'sys/arch/i386/stand/libsa/gateA20.c')
-rw-r--r-- | sys/arch/i386/stand/libsa/gateA20.c | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/sys/arch/i386/stand/libsa/gateA20.c b/sys/arch/i386/stand/libsa/gateA20.c index 8e81e1e834b..76837a4b6db 100644 --- a/sys/arch/i386/stand/libsa/gateA20.c +++ b/sys/arch/i386/stand/libsa/gateA20.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gateA20.c,v 1.4 1997/07/17 23:00:26 mickey Exp $ */ +/* $OpenBSD: gateA20.c,v 1.5 1998/02/24 22:06:51 weingart Exp $ */ /* * Ported to boot 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 @@ -28,17 +28,33 @@ * the rights to redistribute these changes. */ +#include <sys/param.h> #include <sys/types.h> #include <machine/pio.h> -#include <lib/libsa/stand.h> #include <dev/ic/i8042reg.h> +#include "libsa.h" + #define KC_CMD_WOUT 0xd1 /* write output port */ #define KB_A20 0xdf /* enable A20, enable output buffer full interrupt enable data line enable clock line */ + +#define A20_KBD 0 +#define A20_0x92 1 + +/* + * Check for an oddball IBM_L40 machine. + */ +int +getA20type() +{ + return(A20_KBD); +} + + /* * Gate A20 for high memory */ @@ -46,24 +62,37 @@ void gateA20(on) int on; { -#ifdef IBM_L40 - outb(0x92, 0x2); -#else IBM_L40 - while (inb(KBSTATP) & KBS_IBF); - - while (inb(KBSTATP) & KBS_DIB) - (void)inb(KBDATAP); - - outb(KBCMDP, KC_CMD_WOUT); - while (inb(KBSTATP) & KBS_IBF); - - if (on) - outb(KBDATAP, KB_A20); - else - outb(KBDATAP, 0xcd); - while (inb(KBSTATP) & KBS_IBF); - - while (inb(KBSTATP) & KBS_DIB) - (void)inb(KBDATAP); -#endif IBM_L40 + + if (getA20type() == A20_0x92) { + int data; + + /* Try to use 0x92 to turn on A20 */ + if (on) { + data = inb(0x92); + outb(0x92, data | 0x2); + } else { + data = inb(0x92); + outb(0x92, data & ~0x2); + } + } else { + + /* XXX - These whiles might need to be changed to bounded for loops */ + while (inb(KBSTATP) & KBS_IBF); + + while (inb(KBSTATP) & KBS_DIB) + (void)inb(KBDATAP); + + outb(KBCMDP, KC_CMD_WOUT); + while (inb(KBSTATP) & KBS_IBF); + + if (on) + outb(KBDATAP, KB_A20); + else + outb(KBDATAP, 0xcd); + while (inb(KBSTATP) & KBS_IBF); + + while (inb(KBSTATP) & KBS_DIB) + (void)inb(KBDATAP); + } } + |