Home | History | Annotate | Line # | Download | only in lib
gatea20.c revision 1.4.16.1
      1  1.4.16.1   gehenna /*	$NetBSD: gatea20.c,v 1.4.16.1 2002/08/31 13:44:59 gehenna Exp $	*/
      2       1.1     perry 
      3       1.1     perry /* extracted from freebsd:sys/i386/boot/biosboot/io.c */
      4       1.1     perry 
      5       1.1     perry #include <sys/types.h>
      6       1.1     perry #include <machine/pio.h>
      7       1.1     perry 
      8       1.1     perry #include <lib/libsa/stand.h>
      9       1.1     perry 
     10       1.1     perry #include "libi386.h"
     11       1.4  jdolecek #include "biosmca.h"
     12       1.1     perry 
     13       1.1     perry #define K_RDWR 		0x60		/* keyboard data & cmds (read/write) */
     14       1.1     perry #define K_STATUS 	0x64		/* keyboard status */
     15       1.1     perry #define K_CMD	 	0x64		/* keybd ctlr command (write-only) */
     16       1.1     perry 
     17       1.1     perry #define K_OBUF_FUL 	0x01		/* output buffer full */
     18       1.1     perry #define K_IBUF_FUL 	0x02		/* input buffer full */
     19       1.1     perry 
     20       1.1     perry #define KC_CMD_WIN	0xd0		/* read  output port */
     21       1.1     perry #define KC_CMD_WOUT	0xd1		/* write output port */
     22       1.1     perry #define KB_A20		0x9f		/* enable A20,
     23       1.2      fvdl 					   reset (!),
     24       1.1     perry 					   enable output buffer full interrupt
     25       1.1     perry 					   enable data line
     26       1.1     perry 					   disable clock line */
     27       1.1     perry 
     28       1.1     perry /*
     29       1.1     perry  * Gate A20 for high memory
     30       1.1     perry  */
     31       1.1     perry static unsigned char	x_20 = KB_A20;
     32       1.1     perry void gateA20()
     33       1.1     perry {
     34       1.2      fvdl 	__asm("pushfl ; cli");
     35       1.4  jdolecek 	/*
     36  1.4.16.1   gehenna 	 * Not all systems enable A20 via the keyboard controller.
     37  1.4.16.1   gehenna 	 *	* IBM PS/2 L40
     38  1.4.16.1   gehenna 	 *	* AMD Elan SC520-based systems
     39       1.4  jdolecek 	 */
     40  1.4.16.1   gehenna 	if (
     41       1.4  jdolecek #ifdef SUPPORT_PS2
     42  1.4.16.1   gehenna 	    biosmca_ps2model == 0xf82 ||
     43       1.4  jdolecek #endif
     44  1.4.16.1   gehenna 	    /* XXX How to check for AMD Elan SC520? */
     45  1.4.16.1   gehenna 	    0) {
     46  1.4.16.1   gehenna 		outb(0x92, 0x2);
     47  1.4.16.1   gehenna 	} else {
     48  1.4.16.1   gehenna 		while (inb(K_STATUS) & K_IBUF_FUL);
     49  1.4.16.1   gehenna 		while (inb(K_STATUS) & K_OBUF_FUL)
     50  1.4.16.1   gehenna 			(void)inb(K_RDWR);
     51  1.4.16.1   gehenna 
     52  1.4.16.1   gehenna 		outb(K_CMD, KC_CMD_WOUT);
     53  1.4.16.1   gehenna 		delay(100);
     54  1.4.16.1   gehenna 		while (inb(K_STATUS) & K_IBUF_FUL);
     55  1.4.16.1   gehenna 		outb(K_RDWR, x_20);
     56  1.4.16.1   gehenna 		delay(100);
     57  1.4.16.1   gehenna 		while (inb(K_STATUS) & K_IBUF_FUL);
     58  1.4.16.1   gehenna 	}
     59       1.2      fvdl 	__asm("popfl");
     60       1.1     perry }
     61