Home | History | Annotate | Download | only in include
      1 /*
      2  * -----------------------------------------------------------------------
      3  *
      4  *   Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
      5  *
      6  *   This program is free software; you can redistribute it and/or modify
      7  *   it under the terms of the GNU General Public License as published by
      8  *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
      9  *   Boston MA 02111-1307, USA; either version 2 of the License, or
     10  *   (at your option) any later version; incorporated herein by reference.
     11  *
     12  * -----------------------------------------------------------------------
     13  *
     14  *
     15  * bios.h
     16  *
     17  * Header file for the BIOS data structures etc.
     18  */
     19 
     20 #ifndef _BIOS_H
     21 #define _BIOS_H
     22 
     23 #include <sys/io.h>
     24 
     25 /*
     26  * Interrupt vectors
     27  */
     28 #define BIOS_timer_hook	(4 * 0x1C)
     29 #define fdctab		(4 * 0x1E)
     30 #define fdctab1		fdctab
     31 #define fdctab2		(fdctab + 2)
     32 
     33 #define SERIAL_BASE	0x0400	/* Base address for 4 serial ports */
     34 #define BIOS_fbm	0x0413	/* Free Base Memory (kilobytes) */
     35 #define BIOS_page	0x0462	/* Current video page */
     36 #define BIOS_timer	0x046C	/* Timer ticks */
     37 #define BIOS_magic	0x0472	/* BIOS reset magic */
     38 #define BIOS_vidrows	0x0484	/* Number of screen rows */
     39 
     40 static inline uint16_t bios_fbm(void)
     41 {
     42 	return *(volatile uint16_t *)BIOS_fbm;
     43 }
     44 
     45 static inline void set_bios_fbm(uint16_t mem)
     46 {
     47 	*(volatile uint16_t *)BIOS_fbm = mem;
     48 }
     49 
     50 #define serial_buf_size		4096
     51 #define IO_DELAY_PORT		0x80 /* Invalid port (we hope!) */
     52 
     53 static inline void io_delay(void)
     54 {
     55 	outb(0x0, IO_DELAY_PORT);
     56 	outb(0x0, IO_DELAY_PORT);
     57 }
     58 
     59 /*
     60  * Sometimes we need to access screen coordinates as separate 8-bit
     61  * entities and sometimes we need to use them as 16-bit entities. Using
     62  * this structure allows the compiler to do it for us.
     63  */
     64 union screen {
     65 	struct {
     66 		uint8_t col;	/* Cursor column for message file */
     67 		uint8_t row;	/* Cursor row for message file */
     68 	} b;
     69 	uint16_t dx;
     70 };
     71 extern union screen _cursor;
     72 extern union screen _screensize;
     73 
     74 #define CursorDX	_cursor.dx
     75 #define CursorCol	_cursor.b.col
     76 #define CursorRow	_cursor.b.row
     77 
     78 #define ScreenSize	_screensize.dx
     79 #define VidCols		_screensize.b.col
     80 #define VidRows		_screensize.b.row
     81 
     82 /* font.c */
     83 extern void use_font(void);
     84 extern void bios_adjust_screen(void);
     85 
     86 /* serirq.c */
     87 extern char *SerialHead;
     88 extern char *SerialTail;
     89 
     90 extern void bios_init(void);
     91 
     92 static inline uint16_t get_serial_port(uint16_t port)
     93 {
     94     /* Magic array in BIOS memory, contains four entries */
     95     const uint16_t * const serial_ports = (const uint16_t *)SERIAL_BASE;
     96 
     97     /*
     98      * If port > 3 then the port is simply the I/O base address
     99      */
    100     if (port > 3)
    101 	return port;
    102 
    103     /* Get the I/O port from the BIOS */
    104     return serial_ports[port];
    105 }
    106 
    107 #endif /* _BIOS_H */
    108