summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1999-01-11 03:18:56 +0000
committeryokota <yokota@FreeBSD.org>1999-01-11 03:18:56 +0000
commitae16d918a316eb60407be875de416efb373a652f (patch)
tree114e5de93fcbb59a8cff261d560719502d115314 /sys/i386
parentf24a0f863faf18c039916001f2cc71561fc29b38 (diff)
downloadFreeBSD-src-ae16d918a316eb60407be875de416efb373a652f.zip
FreeBSD-src-ae16d918a316eb60407be875de416efb373a652f.tar.gz
The first stage of console driver reorganization: activate new
keyboard and video card drivers. Because of the changes, you are required to update your kernel configuration file now! The files in sys/dev/syscons are still i386-specific (but less so than before), and won't compile for alpha and PC98 yet. syscons still directly accesses the video card registers here and there; this will be rectified in the later stages.
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/conf/GENERIC18
-rw-r--r--sys/i386/conf/LINT35
-rw-r--r--sys/i386/conf/NOTES35
-rw-r--r--sys/i386/conf/files.i38625
-rw-r--r--sys/i386/conf/options.i38627
-rw-r--r--sys/i386/include/console.h75
-rw-r--r--sys/i386/include/pc/vesa.h6
-rw-r--r--sys/i386/isa/pcvt/pcvt_drv.c162
-rw-r--r--sys/i386/isa/pcvt/pcvt_hdr.h32
-rw-r--r--sys/i386/isa/pcvt/pcvt_kbd.c284
-rw-r--r--sys/i386/isa/psm.c7
-rw-r--r--sys/i386/isa/vesa.c372
12 files changed, 615 insertions, 463 deletions
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
index 88943bb..76781f4 100644
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -11,7 +11,7 @@
# device lines is present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
-# $Id: GENERIC,v 1.141 1999/01/01 08:09:57 peter Exp $
+# $Id: GENERIC,v 1.142 1999/01/09 18:12:07 wpaul Exp $
machine "i386"
cpu "I386_CPU"
@@ -108,10 +108,20 @@ controller matcd0 at isa? port 0x230 bio
device scd0 at isa? port 0x230 bio
+# atkbdc0 controlls both the keyboard and the PS/2 mouse
+controller atkbdc0 at isa? port IO_KBD tty
+device atkbd0 at isa? tty irq 1
+device psm0 at isa? tty irq 12
+
+device vga0 at isa? port ? conflicts
+
+# splash screen/screen saver
+pseudo-device splash
+
# syscons is the default console driver, resembling an SCO console
-device sc0 at isa? port IO_KBD conflicts tty irq 1
+device sc0 at isa? tty
# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
-#device vt0 at isa? port IO_KBD conflicts tty irq 1
+#device vt0 at isa? tty
#options XSERVER # support for X server
#options FAT_CURSOR # start with block cursor
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
@@ -136,8 +146,6 @@ device sio3 at isa? disable port "IO_COM4" tty irq 9
device lpt0 at isa? port? tty irq 7
-device psm0 at isa? port IO_KBD conflicts tty irq 12
-
# Order is important here due to intrusive probes, do *not* alphabetize
# this list of network interfaces until the probes have been fixed.
# Right now it appears that the ie0 must be probed before ep0. See
diff --git a/sys/i386/conf/LINT b/sys/i386/conf/LINT
index 7e93763..80171ee 100644
--- a/sys/i386/conf/LINT
+++ b/sys/i386/conf/LINT
@@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
-# $Id: LINT,v 1.529 1999/01/09 18:12:07 wpaul Exp $
+# $Id: LINT,v 1.531 1999/01/10 07:45:33 phk Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@@ -842,15 +842,35 @@ options "NTIMECOUNTER=20"
# configure cards from USERCONFIG. See pnp(4) for more info.
controller pnp0
+# The keyboard controller; it controlls the keyboard and the PS/2 mouse.
+controller atkbdc0 at isa? port IO_KBD tty
+
+# The AT keyboard
+device atkbd0 at isa? tty irq 1
+
+# PS/2 mouse
+device psm0 at isa? tty irq 12
+
+# Options for psm:
+options PSM_HOOKAPM #hook the APM resume event, useful
+ #for some laptops
+options PSM_RESETAFTERSUSPEND #reset the device at the resume event
+
+# The video card driver.
+device vga0 at isa? port ? conflicts
+
+# Splash screen at start up! Screen savers require this too.
+pseudo-device splash
+
# The pcvt console driver (vt220 compatible).
-device vt0 at isa? port IO_KBD conflicts tty irq 1
+device vt0 at isa? tty
options XSERVER # support for running an X server.
options FAT_CURSOR # start with block cursor
# This PCVT option is for keyboards such as those used on IBM ThinkPad laptops
options PCVT_SCANSET=2 # IBM keyboards are non-std
# The syscons console driver (sco color console compatible).
-device sc0 at isa? port IO_KBD conflicts tty irq 1
+device sc0 at isa? tty
options MAXCONS=16 # number of virtual consoles
options SLOW_VGA # do byte-wide i/o's to TS and GDC regs
options "STD8X16FONT" # Compile font in
@@ -1050,7 +1070,7 @@ disk fd0 at fdc0 drive 0
disk fd1 at fdc0 drive 1
#
-# Other standard PC hardware: `lpt', `mse', `psm', `sio', etc.
+# Other standard PC hardware: `lpt', `mse', `sio', etc.
#
# lpt: printer port
# lpt specials:
@@ -1059,18 +1079,11 @@ disk fd1 at fdc0 drive 1
# The irq clause may be omitted. This will force the port
# into polling mode.
# mse: Logitech and ATI InPort bus mouse ports
-# psm: PS/2 mouse port [note: conflicts with sc0/vt0, thus "conflicts" keywd]
# sio: serial ports (see sio(4))
device lpt0 at isa? port? tty irq 7
device lpt1 at isa? port "IO_LPT3" tty irq 5
device mse0 at isa? port 0x23c tty irq 5
-device psm0 at isa? port IO_KBD conflicts tty irq 12
-
-# Options for psm:
-options PSM_HOOKAPM #hook the APM resume event, useful
- #for some laptops
-options PSM_RESETAFTERSUSPEND #reset the device at the resume event
device sio0 at isa? port "IO_COM1" tty flags 0x10 irq 4
diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES
index 7e93763..80171ee 100644
--- a/sys/i386/conf/NOTES
+++ b/sys/i386/conf/NOTES
@@ -2,7 +2,7 @@
# LINT -- config file for checking all the sources, tries to pull in
# as much of the source tree as it can.
#
-# $Id: LINT,v 1.529 1999/01/09 18:12:07 wpaul Exp $
+# $Id: LINT,v 1.531 1999/01/10 07:45:33 phk Exp $
#
# NB: You probably don't want to try running a kernel built from this
# file. Instead, you should start from GENERIC, and add options from
@@ -842,15 +842,35 @@ options "NTIMECOUNTER=20"
# configure cards from USERCONFIG. See pnp(4) for more info.
controller pnp0
+# The keyboard controller; it controlls the keyboard and the PS/2 mouse.
+controller atkbdc0 at isa? port IO_KBD tty
+
+# The AT keyboard
+device atkbd0 at isa? tty irq 1
+
+# PS/2 mouse
+device psm0 at isa? tty irq 12
+
+# Options for psm:
+options PSM_HOOKAPM #hook the APM resume event, useful
+ #for some laptops
+options PSM_RESETAFTERSUSPEND #reset the device at the resume event
+
+# The video card driver.
+device vga0 at isa? port ? conflicts
+
+# Splash screen at start up! Screen savers require this too.
+pseudo-device splash
+
# The pcvt console driver (vt220 compatible).
-device vt0 at isa? port IO_KBD conflicts tty irq 1
+device vt0 at isa? tty
options XSERVER # support for running an X server.
options FAT_CURSOR # start with block cursor
# This PCVT option is for keyboards such as those used on IBM ThinkPad laptops
options PCVT_SCANSET=2 # IBM keyboards are non-std
# The syscons console driver (sco color console compatible).
-device sc0 at isa? port IO_KBD conflicts tty irq 1
+device sc0 at isa? tty
options MAXCONS=16 # number of virtual consoles
options SLOW_VGA # do byte-wide i/o's to TS and GDC regs
options "STD8X16FONT" # Compile font in
@@ -1050,7 +1070,7 @@ disk fd0 at fdc0 drive 0
disk fd1 at fdc0 drive 1
#
-# Other standard PC hardware: `lpt', `mse', `psm', `sio', etc.
+# Other standard PC hardware: `lpt', `mse', `sio', etc.
#
# lpt: printer port
# lpt specials:
@@ -1059,18 +1079,11 @@ disk fd1 at fdc0 drive 1
# The irq clause may be omitted. This will force the port
# into polling mode.
# mse: Logitech and ATI InPort bus mouse ports
-# psm: PS/2 mouse port [note: conflicts with sc0/vt0, thus "conflicts" keywd]
# sio: serial ports (see sio(4))
device lpt0 at isa? port? tty irq 7
device lpt1 at isa? port "IO_LPT3" tty irq 5
device mse0 at isa? port 0x23c tty irq 5
-device psm0 at isa? port IO_KBD conflicts tty irq 12
-
-# Options for psm:
-options PSM_HOOKAPM #hook the APM resume event, useful
- #for some laptops
-options PSM_RESETAFTERSUSPEND #reset the device at the resume event
device sio0 at isa? port "IO_COM1" tty flags 0x10 irq 4
diff --git a/sys/i386/conf/files.i386 b/sys/i386/conf/files.i386
index f955863..9aa97d4 100644
--- a/sys/i386/conf/files.i386
+++ b/sys/i386/conf/files.i386
@@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
-# $Id: files.i386,v 1.216 1998/12/31 08:17:08 luigi Exp $
+# $Id: files.i386,v 1.217 1999/01/01 08:09:58 peter Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -24,6 +24,17 @@ font8x16.o optional std8x16font \
no-implicit-rule before-depend \
clean "${STD8X16FONT}-8x16 font8x16.c"
#
+dev/fb/fb.c optional fb device-driver
+dev/fb/fb.c optional vga device-driver
+dev/fb/splash.c optional splash
+dev/kbd/atkbd.c optional atkbd device-driver
+dev/kbd/atkbdc.c optional atkbdc device-driver
+dev/kbd/kbd.c optional atkbd device-driver
+dev/kbd/kbd.c optional kbd device-driver
+#dev/kbd/kbd.c optional ukbd device-driver
+dev/syscons/syscons.c optional sc device-driver
+dev/syscons/scvidctl.c optional sc device-driver
+dev/syscons/scvesactl.c optional sc device-driver
i386/apm/apm.c optional apm device-driver
i386/apm/apm_setup.s optional apm
i386/eisa/dpt_eisa.c optional eisa dpt device-driver
@@ -98,6 +109,8 @@ i386/isa/aha_isa.c optional aha device-driver
#i386/isa/aic6360.c optional aic device-driver
i386/isa/aic_isa.c optional aic device-driver
i386/isa/alog.c optional alog device-driver
+i386/isa/atkbd_isa.c optional atkbd device-driver
+i386/isa/atkbdc_isa.c optional atkbdc device-driver
i386/isa/bt_isa.c optional bt device-driver
i386/isa/clock.c standard
i386/isa/cronyx.c optional cx device-driver
@@ -133,9 +146,6 @@ i386/isa/intr_machdep.c standard
i386/isa/isa.c optional isa device-driver
i386/isa/istallion.c optional stli device-driver
i386/isa/joy.c optional joy device-driver
-i386/isa/kbdio.c optional psm device-driver
-i386/isa/kbdio.c optional sc device-driver
-i386/isa/kbdio.c optional vt device-driver
i386/isa/loran.c optional loran device-driver
i386/isa/lpt.c optional lpt device-driver
i386/isa/labpc.c optional labpc device-driver
@@ -235,11 +245,8 @@ i386/isa/sound/cs4232.c optional css device-driver
i386/isa/spigot.c optional spigot device-driver
i386/isa/spkr.c optional speaker device-driver
i386/isa/stallion.c optional stl device-driver
-i386/isa/syscons.c optional sc device-driver
-i386/isa/scvidctl.c optional sc device-driver
-i386/isa/scvesactl.c optional sc device-driver
-i386/isa/videoio.c optional sc device-driver
-i386/isa/vesa.c optional sc device-driver
+i386/isa/vesa.c optional vga device-driver
+i386/isa/vga_isa.c optional vga device-driver
i386/isa/tw.c optional tw device-driver
i386/isa/wd.c optional wdc device-driver
i386/isa/wd.c optional wd device-driver
diff --git a/sys/i386/conf/options.i386 b/sys/i386/conf/options.i386
index 1b844a6..2704d56 100644
--- a/sys/i386/conf/options.i386
+++ b/sys/i386/conf/options.i386
@@ -1,4 +1,4 @@
-# $Id: options.i386,v 1.101 1999/01/01 08:09:58 peter Exp $
+# $Id: options.i386,v 1.102 1999/01/10 17:41:33 nsouch Exp $
DISABLE_PSE
IDE_DELAY
@@ -66,16 +66,26 @@ I486_CPU opt_global.h
I586_CPU opt_global.h
I686_CPU opt_global.h
-SC_SPLASH_SCREEN opt_syscons.h
MAXCONS opt_syscons.h
-SLOW_VGA opt_syscons.h
+# obsolete, use VGA_SLOW_IOACCESS
+#SLOW_VGA opt_syscons.h
STD8X16FONT opt_syscons.h
SC_HISTORY_SIZE opt_syscons.h
SC_DISABLE_REBOOT opt_syscons.h
SC_MOUSE_CHAR opt_syscons.h
-SC_ALT_SEQACCESS opt_syscons.h
+# obsolete, use VGA_ALT_SEQACCESS
+#SC_ALT_SEQACCESS opt_syscons.h
+
+FB_INSTALL_CDEV opt_fb.h
+
+VGA_ALT_SEQACCESS opt_vga.h
+VGA_DEBUG opt_vga.h
+VGA_NO_FONT_LOADING opt_vga.h
+VGA_NO_MODE_CHANGE opt_vga.h
+VGA_SLOW_IOACCESS opt_vga.h
VESA opt_vesa.h
+VESA_DEBUG opt_vesa.h
PSM_HOOKAPM opt_psm.h
PSM_RESETAFTERSUSPEND opt_psm.h
@@ -83,10 +93,11 @@ PSM_DEBUG opt_psm.h
PCIC_RESUME_RESET opt_pcic.h
-KBD_RESETDELAY opt_kbdio.h
-KBD_MAXRETRY opt_kbdio.h
-KBD_MAXWAIT opt_kbdio.h
-KBDIO_DEBUG opt_kbdio.h
+KBD_INSTALL_CDEV opt_kbd.h
+KBD_MAXRETRY opt_kbd.h
+KBD_MAXWAIT opt_kbd.h
+KBD_RESETDELAY opt_kbd.h
+KBDIO_DEBUG opt_kbd.h
ATAPI opt_atapi.h
ATAPI_STATIC opt_atapi.h
diff --git a/sys/i386/include/console.h b/sys/i386/include/console.h
index b8d918f..c79759c 100644
--- a/sys/i386/include/console.h
+++ b/sys/i386/include/console.h
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: console.h,v 1.41 1998/10/01 11:39:09 yokota Exp $
+ * $Id: console.h,v 1.42 1999/01/01 14:38:28 des Exp $
*/
#ifndef _MACHINE_CONSOLE_H_
@@ -52,6 +52,7 @@
#define KDSETLED _IO('K', 66 /*, int */)
#define KDSETRAD _IO('K', 67 /*, int */)
#define KDRASTER _IOW('K', 100, scr_size_t)
+#define KDGKBINFO _IOR('K', 101, keyboard_info_t)
#define GETFKEY _IOWR('k', 0, fkeyarg_t)
#define SETFKEY _IOWR('k', 1, fkeyarg_t)
@@ -61,6 +62,8 @@
#define PIO_KEYMAP _IOW('k', 7, keymap_t)
#define GIO_DEADKEYMAP _IOR('k', 8, accentmap_t)
#define PIO_DEADKEYMAP _IOW('k', 9, accentmap_t)
+#define GIO_KEYMAPENT _IOWR('k', 10, keyarg_t)
+#define PIO_KEYMAPENT _IOW('k', 11, keyarg_t)
#define GIO_ATTR _IOR('a', 0, int)
#define GIO_COLOR _IOR('c', 0, int)
@@ -86,11 +89,14 @@
#define CONS_GETINFO _IOWR('c', 73, vid_info_t)
#define CONS_GETVERS _IOR('c', 74, int)
#define CONS_CURRENTADP _IOR('c', 100, int)
-#define CONS_ADPINFO _IOWR('c', 101, video_adapter_t)
+#define CONS_ADPINFO _IOWR('c', 101, video_adapter_info_t)
#define CONS_MODEINFO _IOWR('c', 102, video_info_t)
#define CONS_FINDMODE _IOWR('c', 103, video_info_t)
#define CONS_SETWINORG _IO('c', 104 /* u_int */)
+#define CONS_SETKBD _IO('c', 110 /* int */)
+#define CONS_RELKBD _IO('c', 111)
+
/* CONS_SAVERMODE */
#define CONS_LKM_SAVER 0
#define CONS_USR_SAVER 1
@@ -189,9 +195,11 @@ struct mouse_info {
#define NLKED 2 /* Num locked */
#define SLKED 4 /* Scroll locked */
#define ALKED 8 /* AltGr locked */
+#define LOCK_MASK (CLKED | NLKED | SLKED | ALKED)
#define LED_CAP 1 /* Caps lock LED */
#define LED_NUM 2 /* Num lock LED */
#define LED_SCR 4 /* Scroll lock LED */
+#define LED_MASK (LED_CAP | LED_NUM | LED_SCR)
/* possible flag values */
#define FLAG_LOCK_O 0
@@ -204,7 +212,7 @@ struct mouse_info {
#ifndef _KEYMAP_DECLARED
#define _KEYMAP_DECLARED
-struct key_t {
+struct keyent_t {
u_char map[NUM_STATES];
u_char spcl;
u_char flgs;
@@ -212,10 +220,17 @@ struct key_t {
struct keymap {
u_short n_keys;
- struct key_t key[NUM_KEYS];
+ struct keyent_t key[NUM_KEYS];
};
typedef struct keymap keymap_t;
+
+struct keyarg {
+ u_short keynum;
+ struct keyent_t key;
+};
+
+typedef struct keyarg keyarg_t;
#endif /* !_KEYMAP_DECLARED */
#define NUM_DEADKEYS 15 /* number of accent keys */
@@ -274,6 +289,9 @@ struct ssaver {
struct video_adapter {
int va_index;
int va_type;
+ char *va_name;
+ int va_unit;
+ int va_minor;
int va_flags;
#define V_ADP_COLOR (1<<0)
#define V_ADP_MODECHANGE (1<<1)
@@ -283,7 +301,14 @@ struct video_adapter {
#define V_ADP_PALETTE (1<<5)
#define V_ADP_BORDER (1<<6)
#define V_ADP_VESA (1<<7)
+#define V_ADP_PROBED (1<<16)
+#define V_ADP_INITIALIZED (1<<17)
+#define V_ADP_REGISTERED (1<<18)
+ int va_io_base;
+ int va_io_size;
int va_crtc_addr;
+ int va_mem_base;
+ int va_mem_size;
u_int va_window; /* virtual address */
size_t va_window_size;
size_t va_window_gran;
@@ -292,6 +317,30 @@ struct video_adapter {
int va_initial_mode;
int va_initial_bios_mode;
int va_mode;
+ int va_mode_flags; /* copy of vi_flags */
+ void *va_token;
+};
+
+struct video_adapter_info {
+ int va_index;
+ int va_type;
+ char va_name[16];
+ int va_unit;
+ int va_flags;
+ int va_io_base;
+ int va_io_size;
+ int va_crtc_addr;
+ int va_mem_base;
+ int va_mem_size;
+ u_int va_window; /* virtual address */
+ size_t va_window_size;
+ size_t va_window_gran;
+ u_int va_buffer; /* virtual address */
+ size_t va_buffer_size;
+ int va_initial_mode;
+ int va_initial_bios_mode;
+ int va_mode;
+ int va_mode_flags;
};
#define V_ADP_PRIMARY 0
@@ -319,6 +368,15 @@ struct video_info {
/* XXX pixel format, memory model,... */
};
+struct keyboard_info {
+ int kb_index; /* kbdio index# */
+ char kb_name[16]; /* driver name */
+ int kb_unit; /* unit# */
+ int kb_type; /* KB_84, KB_101, KB_OTHER,... */
+ int kb_config; /* device configuration flags */
+ int kb_flags; /* internal flags */
+};
+
typedef struct accentmap accentmap_t;
typedef struct fkeytab fkeytab_t;
typedef struct fkeyarg fkeyarg_t;
@@ -330,7 +388,9 @@ typedef struct {char fnt8x14[14*256];} fnt14_t;
typedef struct {char fnt8x16[16*256];} fnt16_t;
typedef struct ssaver ssaver_t;
typedef struct video_adapter video_adapter_t;
+typedef struct video_adapter_info video_adapter_info_t;
typedef struct video_info video_info_t;
+typedef struct keyboard_info keyboard_info_t;
typedef struct {int scr_size[3];} scr_size_t;
/* defines for "special" keys (spcl bit set in keymap) */
@@ -388,6 +448,13 @@ typedef struct {int scr_size[3];} scr_size_t;
#define MKEY 0x400 /* meta key marker (prepend ESC)*/
#define BKEY 0x800 /* backtab (ESC [ Z) */
+#define SPCLKEY 0x8000 /* special key */
+#define RELKEY 0x4000 /* key released */
+#define ERRKEY 0x2000 /* error */
+
+#define KEYCHAR(c) ((c) & 0x00ff)
+#define KEYFLAGS(c) ((c) & ~0x00ff)
+
/* video mode definitions */
#define M_B40x25 0 /* black & white 40 columns */
#define M_C40x25 1 /* color 40 columns */
diff --git a/sys/i386/include/pc/vesa.h b/sys/i386/include/pc/vesa.h
index edbb7e4..16b0709 100644
--- a/sys/i386/include/pc/vesa.h
+++ b/sys/i386/include/pc/vesa.h
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: vesa.h,v 1.2 1998/09/25 11:55:41 yokota Exp $
+ * $Id: vesa.h,v 1.3 1999/01/08 12:57:06 yokota Exp $
*/
#ifndef _MACHINE_PC_VESA_H
@@ -115,10 +115,6 @@ struct vesa_mode
int vesa_load_ioctl(void);
int vesa_unload_ioctl(void);
-#ifndef KLD_MODULE
-int vesa_load(void);
-#endif
-
#endif /* KERNEL */
#endif /* !_MACHINE_PC_VESA_H */
diff --git a/sys/i386/isa/pcvt/pcvt_drv.c b/sys/i386/isa/pcvt/pcvt_drv.c
index 26c02f3..c4ed5a1 100644
--- a/sys/i386/isa/pcvt/pcvt_drv.c
+++ b/sys/i386/isa/pcvt/pcvt_drv.c
@@ -114,6 +114,11 @@ static void vgapelinit(void); /* read initial VGA DAC palette */
static int pcvt_xmode_set(int on, struct proc *p); /* initialize for X mode */
#endif /* XSERVER && !PCVT_USL_VT_COMPAT */
+#ifdef _DEV_KBD_KBDREG_H_
+static void detect_kbd(void *arg);
+static kbd_callback_func_t pcevent;
+#endif
+
static cn_probe_t pccnprobe;
static cn_init_t pccninit;
static cn_getc_t pccngetc;
@@ -161,17 +166,19 @@ pcprobe(struct isa_device *dev)
#endif /* PCVT_NETBSD > 9 */
#endif /* PCVT_NETBSD > 100 */
{
-#ifdef _I386_ISA_KBDIO_H_
- kbdc = kbdc_open(IO_KBD);
+#ifdef _DEV_KBD_KBDREG_H_
+ int i;
- if(kbdc == NULL)
+ kbd = NULL;
+ kbd_configure(KB_CONF_PROBE_ONLY);
+ i = kbd_allocate("*", -1, (void *)&kbd, pcevent, (void *)dev->id_unit);
+ if ((i < 0) || ((kbd = kbd_get_keyboard(i)) == NULL))
{
reset_keyboard = 0;
- return 1;
+ return (-1);
}
-
reset_keyboard = 1; /* it's now safe to do kbd reset */
-#endif /* _I386_ISA_KBDIO_H_ */
+#endif /* _DEV_KBD_KBDREG_H_ */
kbd_code_init();
@@ -179,7 +186,9 @@ pcprobe(struct isa_device *dev)
((struct isa_attach_args *)aux)->ia_iosize = 16;
return 1;
#else
-#if PCVT_NETBSD || PCVT_FREEBSD
+#ifdef _DEV_KBD_KBDREG_H_
+ return (-1);
+#elif PCVT_NETBSD || PCVT_FREEBSD
return (16);
#else
return 1;
@@ -207,6 +216,11 @@ pcattach(struct isa_device *dev)
vt_coldmalloc(); /* allocate memory for screens */
+#ifdef _DEV_KBD_KBDREG_H_
+ if (kbd == NULL)
+ timeout(detect_kbd, (void *)dev->id_unit, hz*2);
+#endif /* _DEV_KBD_KBDREG_H_ */
+
#if PCVT_NETBSD || PCVT_FREEBSD
#if PCVT_NETBSD > 9
@@ -849,6 +863,50 @@ pcvt_timeout(void *arg)
}
#endif
+#ifdef _DEV_KBD_KBDREG_H_
+static void
+detect_kbd(void *arg)
+{
+ int unit = (int)arg;
+ int i;
+
+ if (kbd != NULL)
+ return;
+ i = kbd_allocate("*", -1, (void *)&kbd, pcevent, (void *)unit);
+ if (i >= 0)
+ kbd = kbd_get_keyboard(i);
+ if (kbd != NULL)
+ {
+ reset_keyboard = 1; /* ok to reset the keyboard */
+ kbd_code_init();
+ return;
+ }
+ reset_keyboard = 0;
+ timeout(detect_kbd, (void *)unit, hz*2);
+}
+
+int
+pcevent(keyboard_t *thiskbd, int event, void *arg)
+{
+ int unit = (int)arg;
+
+ if (thiskbd != kbd)
+ return EINVAL; /* shouldn't happen */
+
+ switch (event) {
+ case KBDIO_KEYINPUT:
+ pcrint(unit);
+ return 0;
+ case KBDIO_UNLOADING:
+ kbd = NULL;
+ kbd_release(thiskbd, (void *)&kbd);
+ timeout(detect_kbd, (void *)unit, hz*4);
+ return 0;
+ default:
+ return EINVAL;
+ }
+}
+#endif /* _DEV_KBD_KBDREG_H_ */
void
pcrint(int unit)
@@ -862,7 +920,7 @@ pcrint(int unit)
int s;
# endif
-# ifdef _I386_ISA_KBDIO_H_
+# ifdef _DEV_KBD_KBDREG_H_
int c;
# endif
@@ -870,25 +928,6 @@ pcrint(int unit)
u_char *cp;
#endif /* PCVT_KBD_FIFO */
- /*
- * in case the keyboard was not plugged in while booting, kbdc
- * was set to NULL at that time. When a keyboard IRQ occurs and
- * kbdc is NULL, the keyboard was probably reconnected to the
- * keyboard controller and we have to initialize the keyboard.
- */
-
- if(kbdc == NULL)
- {
- kbdc = kbdc_open(IO_KBD);
- if(kbdc == NULL)
- {
- reset_keyboard = 0;
- return;
- }
- reset_keyboard = 1;
- kbd_code_init();
- }
-
#if PCVT_SCREENSAVER
pcvt_scrnsv_reset();
#endif /* PCVT_SCREENSAVER */
@@ -900,7 +939,7 @@ pcrint(int unit)
return;
}
-# ifndef _I386_ISA_KBDIO_H_
+# ifndef _DEV_KBD_KBDREG_H_
while (inb(CONTROLLER_CTRL) & STATUS_OUTPBF) /* check 8042 buffer */
{
ret = 1; /* got something */
@@ -909,11 +948,11 @@ pcrint(int unit)
dt = inb(CONTROLLER_DATA); /* get it 8042 data */
# else
- while ((c = read_kbd_data_no_wait(kbdc)) != -1)
+ while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) != -1)
{
ret = 1; /* got something */
dt = c;
-# endif /* _I386_ISA_KBDIO_H_ */
+# endif /* _DEV_KBD_KBDREG_H_ */
if (pcvt_kbd_count >= PCVT_KBD_FIFO_SZ) /* fifo overflow ? */
{
@@ -1131,32 +1170,40 @@ int
pccnprobe(struct consdev *cp)
{
struct isa_device *dvp;
+ int i;
+
+ /*
+ * Take control if we are the highest priority enabled display device.
+ */
+ dvp = find_display();
+ if (dvp == NULL || dvp->id_driver != &vtdriver) {
+ cp->cn_pri = CN_DEAD;
+ return;
+ }
+
+#ifdef _DEV_KBD_KBDREG_H_
+ kbd = NULL;
+ kbd_configure(KB_CONF_PROBE_ONLY);
+ i = kbd_allocate("*", -1, (void *)&kbd, pcevent, (void *)dvp->id_unit);
+ if (i >= 0)
+ kbd = kbd_get_keyboard(i);
-#ifdef _I386_ISA_KBDIO_H_
- kbdc = kbdc_open(IO_KBD);
/*
* Don't reset the keyboard via `kbdio' just yet.
* The system clock has not been calibrated...
*/
reset_keyboard = 0;
+
#if PCVT_SCANSET == 2
/*
* Turn off scancode translation early so that UserConfig
* and DDB can read the keyboard.
*/
- empty_both_buffers(kbdc, 10);
- set_controller_command_byte(kbdc, KBD_TRANSLATION, 0);
+ empty_both_buffers(*(KBDC *)kbd->kb_data, 10);
+ set_controller_command_byte(*(KBDC *)kbd->kb_data, KBD_TRANSLATION, 0);
#endif /* PCVT_SCANSET == 2 */
-#endif /* _I386_ISA_KBDIO_H_ */
- /*
- * Take control if we are the highest priority enabled display device.
- */
- dvp = find_display();
- if (dvp == NULL || dvp->id_driver != &vtdriver) {
- cp->cn_pri = CN_DEAD;
- return;
- }
+#endif /* _DEV_KBD_KBDREG_H_ */
/* initialize required fields */
@@ -1254,7 +1301,13 @@ pccngetc(Dev_t dev)
s = spltty(); /* block pcrint while we poll */
kbd_polling = 1;
+#ifdef _DEV_KBD_KBDREG_H_
+ (*kbdsw[kbd->kb_index]->enable)(kbd);
+#endif
cp = sgetc(0);
+#ifdef _DEV_KBD_KBDREG_H_
+ (*kbdsw[kbd->kb_index]->disable)(kbd);
+#endif
kbd_polling = 0;
splx(s);
c = *cp++;
@@ -1281,7 +1334,13 @@ pccncheckc(Dev_t dev)
char *cp;
int x = spltty();
kbd_polling = 1;
+#ifdef _DEV_KBD_KBDREG_H_
+ (*kbdsw[kbd->kb_index]->enable)(kbd);
+#endif
cp = sgetc(1);
+#ifdef _DEV_KBD_KBDREG_H_
+ (*kbdsw[kbd->kb_index]->disable)(kbd);
+#endif
kbd_polling = 0;
splx(x);
return (cp == NULL ? -1 : *cp);
@@ -1520,7 +1579,7 @@ pcvt_xmode_set(int on, struct proc *p)
vsp->Crtat = vsp->Memory; /* operate in memory now */
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
#if PCVT_SCANSET == 2
/* put keyboard to return ancient PC scan codes */
@@ -1534,15 +1593,15 @@ pcvt_xmode_set(int on, struct proc *p)
#endif /* PCVT_USEKBDSEC */
#endif /* PCVT_SCANSET == 2 */
-#else /* _I386_ISA_KBDIO_H_ */
+#else /* _DEV_KBD_KBDREG_H_ */
#if PCVT_SCANSET == 2
/* put keyboard to return ancient PC scan codes */
- set_controller_command_byte(kbdc,
+ set_controller_command_byte(*(KBDC *)kbd->kb_data,
KBD_TRANSLATION, KBD_TRANSLATION);
#endif /* PCVT_SCANSET == 2 */
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
#if PCVT_NETBSD > 9
fp->tf_eflags |= PSL_IOPL;
@@ -1579,7 +1638,7 @@ pcvt_xmode_set(int on, struct proc *p)
pcvt_set_scrnsv_tmo(saved_scrnsv_tmo);
#endif /* PCVT_SCREENSAVER */
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
#if PCVT_SCANSET == 2
kbc_8042cmd(CONTR_WRITE);
@@ -1592,13 +1651,14 @@ pcvt_xmode_set(int on, struct proc *p)
#endif /* PCVT_USEKBDSEC */
#endif /* PCVT_SCANSET == 2 */
-#else /* _I386_ISA_KBDIO_H_ */
+#else /* _DEV_KBD_KBDREG_H_ */
#if PCVT_SCANSET == 2
- set_controller_command_byte(kbdc, KBD_TRANSLATION, 0);
+ set_controller_command_byte(*(KBDC *)kbd->kb_data,
+ KBD_TRANSLATION, 0);
#endif /* PCVT_SCANSET == 2 */
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
if(adaptor_type == MDA_ADAPTOR)
{
diff --git a/sys/i386/isa/pcvt/pcvt_hdr.h b/sys/i386/isa/pcvt/pcvt_hdr.h
index 11adc9c..2c9aac8 100644
--- a/sys/i386/isa/pcvt/pcvt_hdr.h
+++ b/sys/i386/isa/pcvt/pcvt_hdr.h
@@ -107,7 +107,9 @@
#endif /* PCVT_FREEBSD >= 200 */
#include <i386/isa/pcvt/pcvt_conf.h>
-#include <i386/isa/kbdio.h>
+
+#include <dev/kbd/kbdreg.h>
+#include <dev/kbd/atkbdcreg.h>
#if PCVT_NETBSD > 9
#include "device.h"
@@ -168,6 +170,14 @@
#include <machine/clock.h>
#include <machine/md_var.h>
#endif
+/*
+ * The following values are defined in machine/console.h, but the header
+ * file is not included here due to conflicts with pcvt_ioctl.h.
+ */
+#define KDGKBTYPE _IOR('K', 64, int)
+#define KB_84 1
+#define KB_101 2
+#define KB_OTHER 3
#else /* PCVT_FREEBSD >= 200 */
#include "machine/pc/display.h"
#endif /* PCVT_FREEBSD >= 200 */
@@ -260,7 +270,7 @@ in the config file"
* Keyboard and Keyboard Controller
*---------------------------------------------------------------------------*/
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
#define CONTROLLER_CTRL 0x64 /* W - command, R - status */
#define CONTROLLER_DATA 0x60 /* R/W - data */
@@ -308,7 +318,7 @@ in the config file"
#define KEYB_C_ECHO 0xee /* diagnostic, echo 0xee */
#define KEYB_C_LEDS 0xed /* set/reset numlock,capslock & scroll lock */
-#endif /* _I386_ISA_KBDIO_H_ */
+#endif /* _DEV_KBD_KBDREG_H_ */
/* responses from the KEYBOARD (via the 8042 controller on mainboard..) */
@@ -1000,10 +1010,10 @@ u_char chargen_access = 0; /* synchronize access */
u_char keyboard_type = KB_UNKNOWN; /* type of keyboard */
u_char keyboard_is_initialized = 0; /* for ddb sanity */
u_char kbd_polling = 0; /* keyboard is being polled */
-#ifdef _I386_ISA_KBDIO_H_
+#ifdef _DEV_KBD_KBDREG_H_
u_char reset_keyboard = 0; /* OK to reset keyboard */
-KBDC kbdc = NULL; /* keyboard controller */
-#endif /* _I386_ISA_KBDIO_H_ */
+keyboard_t *kbd = NULL;
+#endif /* _DEV_KBD_KBDREG_H_ */
#if PCVT_SHOWKEYS
u_char keyboard_show = 0; /* normal display */
@@ -1141,10 +1151,10 @@ extern u_char can_do_132col;
extern u_char vga_family;
extern u_char keyboard_is_initialized;
extern u_char kbd_polling;
-#ifdef _I386_ISA_KBDIO_H_
+#ifdef _DEV_KBD_KBDREG_H_
extern u_char reset_keyboard;
-extern KBDC kbdc;
-#endif /* _I386_ISA_KBDIO_H_ */
+extern keyboard_t *kbd;
+#endif /* _DEV_KBD_KBDREG_H_ */
#if PCVT_SHOWKEYS
extern u_char keyboard_show;
@@ -1268,10 +1278,10 @@ void fkl_on ( struct video_state *svsp );
struct tty *get_pccons ( Dev_t dev );
void init_sfkl ( struct video_state *svsp );
void init_ufkl ( struct video_state *svsp );
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
int kbd_cmd ( int val );
int kbd_response ( void );
-#endif /* _I386_ISA_KBDIO_H_ */
+#endif /* _DEV_KBD_KBDREG_H_ */
void kbd_code_init ( void );
void kbd_code_init1 ( void );
diff --git a/sys/i386/isa/pcvt/pcvt_kbd.c b/sys/i386/isa/pcvt/pcvt_kbd.c
index 2113ee0..c7a2cfc 100644
--- a/sys/i386/isa/pcvt/pcvt_kbd.c
+++ b/sys/i386/isa/pcvt/pcvt_kbd.c
@@ -91,11 +91,9 @@ static void doreset ( void );
static void ovlinit ( int force );
static void settpmrate ( int rate );
static void setlockkeys ( int snc );
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
static int kbc_8042cmd ( int val );
-#else
-static int set_keyboard_param( int command, int data );
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
static int getokeydef ( unsigned key, struct kbd_ovlkey *thisdef );
static int getckeydef ( unsigned key, struct kbd_ovlkey *thisdef );
static int rmkeydef ( int key );
@@ -170,7 +168,7 @@ do_vgapage(int page)
#define PCVT_UPDLED_LOSES_INTR 0 /* disabled for now */
-#if PCVT_UPDLED_LOSES_INTR || defined(_I386_ISA_KBDIO_H_)
+#if PCVT_UPDLED_LOSES_INTR || defined(_DEV_KBD_KBDREG_H_)
/*---------------------------------------------------------------------------*
* check for lost keyboard interrupts
@@ -203,7 +201,7 @@ static struct callout_handle lost_intr_ch =
static void
check_for_lost_intr (void *arg)
{
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
lost_intr_timeout_queued = 0;
if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)
{
@@ -215,19 +213,20 @@ check_for_lost_intr (void *arg)
int opri;
lost_intr_timeout_queued = 0;
- if (kbdc_lock(kbdc, TRUE)) {
+ if ((*kbdsw[kbd->kb_index]->lock)(kbd, TRUE)) {
opri = spltty ();
- kbdc_lock(kbdc, FALSE);
- if (kbdc_data_ready(kbdc))
+ (*kbdsw[kbd->kb_index]->lock)(kbd, FALSE);
+ if ((*kbdsw[kbd->kb_index]->check)(kbd))
pcrint (0);
splx (opri);
}
+
lost_intr_ch = timeout(check_for_lost_intr, (void *)NULL, hz);
lost_intr_timeout_queued = 1;
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
}
-#endif /* PCVT_UPDLED_LOSES_INTR || defined(_I386_ISA_KBDIO_H_) */
+#endif /* PCVT_UPDLED_LOSES_INTR || defined(_DEV_KBD_KBDREG_H_) */
/*---------------------------------------------------------------------------*
* update keyboard led's
@@ -242,13 +241,19 @@ update_led(void)
int opri, new_ledstate;
opri = spltty();
+#ifndef _DEV_KBD_KBDREG_H_
new_ledstate = (vsp->scroll_lock) |
(vsp->num_lock * 2) |
(vsp->caps_lock * 4);
+#else
+ new_ledstate = ((vsp->scroll_lock) ? LED_SCR : 0) |
+ ((vsp->num_lock) ? LED_NUM : 0) |
+ ((vsp->caps_lock) ? LED_CAP : 0);
+#endif /* _DEV_KBD_KBDREG_H_ */
if (new_ledstate != ledstate)
{
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
int response1, response2;
ledstate = LEDSTATE_UPDATE_PENDING;
@@ -296,19 +301,20 @@ update_led(void)
printf(
"Keyboard LED command not ACKed (responses %#x %#x)\n",
response1, response2);
-#else /* _I386_ISA_KBDIO_H_ */
+#else /* _DEV_KBD_KBDREG_H_ */
- if (kbdc == NULL) {
+ if (kbd == NULL) {
ledstate = new_ledstate;
splx(opri);
} else {
ledstate = LEDSTATE_UPDATE_PENDING;
splx(opri);
- if (set_keyboard_param(KBDC_SET_LEDS, new_ledstate) == 0)
+ if ((*kbdsw[kbd->kb_index]->ioctl)(kbd, KDSETLED,
+ (caddr_t)&new_ledstate) == 0)
ledstate = new_ledstate;
}
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
#if PCVT_UPDLED_LOSES_INTR
if (lost_intr_timeout_queued)
@@ -320,7 +326,7 @@ update_led(void)
}
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
splx(opri);
#endif
@@ -333,7 +339,7 @@ update_led(void)
static void
settpmrate(int rate)
{
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
tpmrate = rate & 0x7f;
if(kbd_cmd(KEYB_C_TYPEM) != 0)
printf("Keyboard TYPEMATIC command timeout\n");
@@ -341,12 +347,13 @@ settpmrate(int rate)
printf("Keyboard TYPEMATIC data timeout\n");
#else
tpmrate = rate & 0x7f;
- if (set_keyboard_param(KBDC_SET_TYPEMATIC, tpmrate) != 0)
+ if ((*kbdsw[kbd->kb_index]->ioctl)(kbd, KDSETRAD,
+ (caddr_t)&tpmrate) == 0)
printf("pcvt: failed to set keyboard TYPEMATIC.\n");
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
}
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
/*---------------------------------------------------------------------------*
* Pass command to keyboard controller (8042)
*---------------------------------------------------------------------------*/
@@ -408,64 +415,7 @@ kbd_response(void)
return ch;
}
-#else
-static int
-set_keyboard_param(int command, int data)
-{
- int s;
-#if 0
- int c;
-#endif
-
- if (kbdc == NULL)
- return 1;
-
- /* prevent the timeout routine from polling the keyboard */
- if (!kbdc_lock(kbdc, TRUE))
- return 1;
-
- /* disable the keyboard and mouse interrupt */
- s = spltty();
-#if 0
- c = get_controller_command_byte(kbdc);
- if ((c == -1)
- || !set_controller_command_byte(kbdc,
- kbdc_get_device_mask(kbdc),
- KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT
- | KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) {
- /* CONTROLLER ERROR */
- kbdc_lock(kbdc, FALSE);
- splx(s);
- return 1;
- }
- /*
- * Now that the keyboard controller is told not to generate
- * the keyboard and mouse interrupts, call `splx()' to allow
- * the other tty interrupts. The clock interrupt may also occur,
- * but the timeout routine (`scrn_timer()') will be blocked
- * by the lock flag set via `kbdc_lock()'
- */
- splx(s);
-#endif
-
- if (send_kbd_command_and_data(kbdc, command, data) != KBD_ACK)
- send_kbd_command(kbdc, KBDC_ENABLE_KBD);
-
-#if 0
- /* restore the interrupts */
- if (!set_controller_command_byte(kbdc,
- kbdc_get_device_mask(kbdc),
- c & (KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS))) {
- /* CONTROLLER ERROR */
- }
-#else
- splx(s);
-#endif
- kbdc_lock(kbdc, FALSE);
-
- return 0;
-}
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* _DEV_KBD_KBDREG_H_ */
#if PCVT_SCANSET > 1
/*---------------------------------------------------------------------------*
@@ -474,7 +424,7 @@ set_keyboard_param(int command, int data)
void
kbd_emulate_pc(int do_emulation)
{
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
int cmd, timeo = 10000;
cmd = COMMAND_SYSFLG|COMMAND_IRQEN; /* common base cmd */
@@ -492,9 +442,9 @@ kbd_emulate_pc(int do_emulation)
break;
outb(CONTROLLER_DATA, cmd);
#else
- set_controller_command_byte(kbdc, KBD_TRANSLATION,
+ set_controller_command_byte(*(KBDC *)kbd->kb_data, KBD_TRANSLATION,
(do_emulation) ? KBD_TRANSLATION : 0);
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
}
#endif /* PCVT_SCANSET > 1 */
@@ -510,7 +460,7 @@ kbd_emulate_pc(int do_emulation)
static
void doreset(void)
{
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
int again = 0;
int once = 0;
int response, opri;
@@ -671,10 +621,8 @@ r_entry:
#endif /* PCVT_KEYBDID */
-#else /* _I386_ISA_KBDIO_H_ */
- int c;
- int m;
- int s;
+#else /* _DEV_KBD_KBDREG_H_ */
+ int type;
if (!reset_keyboard) /* no, we are not ready to reset */
return;
@@ -684,29 +632,11 @@ r_entry:
lost_intr_timeout_queued = 0;
}
- if (kbdc == NULL)
- kbdc = kbdc_open(IO_KBD);
+ if (kbd == NULL)
+ return; /* shouldn't happen */
+ (*kbdsw[kbd->kb_index]->init)(kbd);
- if (!kbdc_lock(kbdc, TRUE)) /* strange, somebody got there first */
- return;
-
- /* remove any noise */
- empty_both_buffers(kbdc, 10);
-
- s = spltty();
-
- /* save the current controller command byte */
- m = kbdc_get_device_mask(kbdc) & ~KBD_KBD_CONTROL_BITS;
- c = get_controller_command_byte(kbdc);
- if (c == -1) {
- /* CONTROLLER ERROR */
- kbdc_set_device_mask(kbdc, m);
- kbdc_lock(kbdc, FALSE);
- kbdc = NULL;
- splx(s);
- printf("pcvt: unable to get the command byte.\n");
- return;
- }
+ ledstate = LEDSTATE_UPDATE_PENDING;
#if PCVT_USEKBDSEC /* security enabled */
@@ -726,105 +656,33 @@ r_entry:
#endif /* PCVT_USEKBDSEC */
- /* disable the keyboard interrupt and the aux port and interrupt */
- if (!set_controller_command_byte(kbdc,
- KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK,
- KBD_ENABLE_KBD_PORT | KBD_DISABLE_KBD_INT | KBDINITCMD)) {
- /* CONTROLLER ERROR: there is very little we can do... */
- kbdc_set_device_mask(kbdc, m);
- kbdc_lock(kbdc, FALSE);
- kbdc = NULL;
- splx(s);
- printf("pcvt: unable to set the command byte.\n");
- return;
- }
- splx(s);
-
- /* reset keyboard hardware */
- ledstate = LEDSTATE_UPDATE_PENDING;
- if (!reset_kbd(kbdc)) {
- /* KEYBOARD ERROR */
- empty_both_buffers(kbdc, 10);
- test_controller(kbdc);
- test_kbd_port(kbdc);
- /*
- * We could disable the keyboard port and interrupt now...
- * but, the keyboard may still exist.
- */
- printf("pcvt: failed to reset the keyboard.\n");
- /* try to restore the original command byte */
- set_controller_command_byte(kbdc, 0xff, c);
- kbdc_set_device_mask(kbdc, m);
- kbdc_lock(kbdc, FALSE);
- kbdc = NULL;
- return;
- }
-
-#if PCVT_KEYBDID
-
- keyboard_type = KB_UNKNOWN;
- if (send_kbd_command(kbdc, KBDC_SEND_DEV_ID) == KBD_ACK) {
- DELAY(10000); /* 10msec delay */
- switch (read_kbd_data(kbdc)) {
- case KEYB_R_MF2ID1:
- switch (read_kbd_data(kbdc)) {
- case KEYB_R_MF2ID2:
- case KEYB_R_MF2ID2HP:
- keyboard_type = KB_MFII;
- break;
- case -1:
- default:
- break;
- }
- break;
- case -1:
- keyboard_type = KB_AT;
- /* fall through */
- default:
- /* XXX: should we read the second byte? */
- empty_both_buffers(kbdc, 10); /* XXX */
- break;
- }
- } else {
- /*
- * The send ID command failed. This error is considered
- * benign, but may need recovery.
- */
- empty_both_buffers(kbdc, 10);
- test_controller(kbdc);
- test_kbd_port(kbdc);
- }
-
-#else /* PCVT_KEYBDID */
+ set_controller_command_byte(*(KBDC *)kbd->kb_data,
+ KBD_OVERRIDE_KBD_LOCK | KBD_TRANSLATION, KBDINITCMD);
keyboard_type = KB_MFII; /* force it .. */
-
-#endif /* PCVT_KEYBDID */
-
- /* enable the keyboard port and intr. */
- if (!set_controller_command_byte(kbdc,
- KBD_KBD_CONTROL_BITS,
- KBD_ENABLE_KBD_PORT | KBD_ENABLE_KBD_INT)) {
- /* CONTROLLER ERROR
- * This is serious; we are left with the disabled
- * keyboard intr.
- */
- printf("pcvt: failed to enable the keyboard port and intr.\n");
- kbdc_set_device_mask(kbdc, m);
- kbdc_lock(kbdc, FALSE);
- kbdc = NULL;
- return;
+#if PCVT_KEYBDID
+ type = KB_101;
+ (*kbdsw[kbd->kb_index]->ioctl)(kbd, KDGKBTYPE, (caddr_t)&type);
+ switch (type)
+ {
+ case KB_84:
+ keyboard_type = KB_AT;
+ break;
+ case KB_101:
+ keyboard_type = KB_MFII;
+ break;
+ default:
+ keyboard_type = KB_UNKNOWN;
+ break;
}
-
- kbdc_set_device_mask(kbdc, m | KBD_KBD_CONTROL_BITS);
- kbdc_lock(kbdc, FALSE);
+#endif /* PCVT_KEYBDID */
update_led();
lost_intr_ch = timeout(check_for_lost_intr, (void *)NULL, hz);
lost_intr_timeout_queued = 1;
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
}
/*---------------------------------------------------------------------------*
@@ -1246,15 +1104,15 @@ sgetc(int noblock)
static char keybuf[2] = {0}; /* the second 0 is a delimiter! */
#endif /* XSERVER */
-#ifdef _I386_ISA_KBDIO_H_
+#ifdef _DEV_KBD_KBDREG_H_
int c;
-#endif /* _I386_ISA_KBDIO_H_ */
+#endif /* _DEV_KBD_KBDREG_H_ */
loop:
#ifdef XSERVER
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
#if PCVT_KBD_FIFO
@@ -1289,7 +1147,7 @@ loop:
#endif /* !PCVT_KBD_FIFO */
-#else /* _I386_ISA_KBDIO_H_ */
+#else /* _DEV_KBD_KBDREG_H_ */
#if PCVT_KBD_FIFO
if (pcvt_kbd_count) {
@@ -1302,18 +1160,18 @@ loop:
} else
#endif /* PCVT_KBD_FIFO */
if (!noblock) {
- while ((c = read_kbd_data(kbdc)) == -1)
+ while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, TRUE)) == -1)
;
dt = c;
} else {
- if ((c = read_kbd_data_no_wait(kbdc)) == -1)
+ if ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) == -1)
return NULL;
dt = c;
}
{
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
/*
* If x mode is active, only care for locking keys, then
@@ -1591,7 +1449,7 @@ no_mouse_event:
#else /* !XSERVER */
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
# if PCVT_KBD_FIFO
@@ -1628,7 +1486,7 @@ no_mouse_event:
#endif /* !PCVT_KBD_FIFO */
-#else /* _I386_ISA_KBDIO_H_ */
+#else /* _DEV_KBD_KBDREG_H_ */
#if PCVT_KBD_FIFO
if (pcvt_kbd_count) {
@@ -1641,20 +1499,20 @@ no_mouse_event:
} else
#endif /* PCVT_KBD_FIFO */
if (!noblock) {
- while ((c = read_kbd_data(kbdc)) == -1)
+ while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, TRUE)) == -1)
;
dt = c;
} else {
- if ((c = read_kbd_data_no_wait(kbdc)) == -1)
+ if ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) == -1)
return NULL;
dt = c;
}
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
#endif /* !XSERVER */
-#ifndef _I386_ISA_KBDIO_H_
+#ifndef _DEV_KBD_KBDREG_H_
else
{
if(noblock)
@@ -1662,7 +1520,7 @@ no_mouse_event:
else
goto loop;
}
-#endif /* !_I386_ISA_KBDIO_H_ */
+#endif /* !_DEV_KBD_KBDREG_H_ */
#if PCVT_SHOWKEYS
showkey (' ', dt);
diff --git a/sys/i386/isa/psm.c b/sys/i386/isa/psm.c
index 4cee984..07290af 100644
--- a/sys/i386/isa/psm.c
+++ b/sys/i386/isa/psm.c
@@ -20,7 +20,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: psm.c,v 1.57 1998/11/20 11:46:43 yokota Exp $
+ * $Id: psm.c,v 1.58 1999/01/06 05:40:01 yokota Exp $
*/
/*
@@ -86,9 +86,10 @@
#include <machine/limits.h>
#include <machine/mouse.h>
+#include <dev/kbd/atkbdcreg.h>
+
#include <i386/isa/isa.h>
#include <i386/isa/isa_device.h>
-#include <i386/isa/kbdio.h>
/*
* Driver specific options: the following options may be set by
@@ -1003,7 +1004,7 @@ psmprobe(struct isa_device *dvp)
psm_softc[unit] = sc;
kbdc_set_device_mask(sc->kbdc, mask | KBD_AUX_CONTROL_BITS);
kbdc_lock(sc->kbdc, FALSE);
- return (IO_PSMSIZE);
+ return ((dvp->id_iobase < 0) ? -1 : IO_PSMSIZE);
}
static int
diff --git a/sys/i386/isa/vesa.c b/sys/i386/isa/vesa.c
index 2e93239..306aaa4 100644
--- a/sys/i386/isa/vesa.c
+++ b/sys/i386/isa/vesa.c
@@ -23,14 +23,20 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: vesa.c,v 1.10 1998/12/30 11:21:08 yokota Exp $
+ * $Id: $
*/
-#include "sc.h"
+#include "vga.h"
+#include "opt_vga.h"
#include "opt_vesa.h"
#include "opt_vm86.h"
+#include "opt_fb.h"
-#if (NSC > 0 && defined(VESA) && defined(VM86)) || defined(KLD_MODULE)
+#ifdef VGA_NO_MODE_CHANGE
+#undef VESA
+#endif
+
+#if (NVGA > 0 && defined(VESA) && defined(VM86)) || defined(KLD_MODULE)
#include <sys/param.h>
#include <sys/systm.h>
@@ -46,7 +52,18 @@
#include <machine/pc/bios.h>
#include <machine/pc/vesa.h>
-#include <i386/isa/videoio.h>
+#include <dev/fb/fbreg.h>
+#include <dev/fb/vgareg.h>
+
+#ifndef __i386__
+#include <isa/isareg.h>
+#else
+#include <i386/isa/isa.h>
+#endif
+
+#ifndef VESA_DEBUG
+#define VESA_DEBUG 1
+#endif
/* VESA video adapter state buffer stub */
struct adp_state {
@@ -59,11 +76,14 @@ typedef struct adp_state adp_state_t;
/* VESA video adapter */
static video_adapter_t *vesa_adp = NULL;
static int vesa_state_buf_size = 0;
+#if 0
static void *vesa_state_buf = NULL;
+#endif
/* VESA functions */
+static int vesa_nop(void);
+static vi_probe_t vesa_probe;
static vi_init_t vesa_init;
-static vi_adapter_t vesa_adapter;
static vi_get_info_t vesa_get_info;
static vi_query_mode_t vesa_query_mode;
static vi_set_mode_t vesa_set_mode;
@@ -78,17 +98,34 @@ static vi_load_state_t vesa_load_state;
static vi_set_win_org_t vesa_set_origin;
static vi_read_hw_cursor_t vesa_read_hw_cursor;
static vi_set_hw_cursor_t vesa_set_hw_cursor;
+static vi_set_hw_cursor_shape_t vesa_set_hw_cursor_shape;
+static vi_mmap_t vesa_mmap;
static vi_diag_t vesa_diag;
-static struct vidsw vesavidsw = {
- vesa_init, vesa_adapter, vesa_get_info, vesa_query_mode,
- vesa_set_mode, vesa_save_font, vesa_load_font, vesa_show_font,
- vesa_save_palette,vesa_load_palette,vesa_set_border,vesa_save_state,
- vesa_load_state,vesa_set_origin,vesa_read_hw_cursor,vesa_set_hw_cursor,
+static video_switch_t vesavidsw = {
+ vesa_probe,
+ vesa_init,
+ vesa_get_info,
+ vesa_query_mode,
+ vesa_set_mode,
+ vesa_save_font,
+ vesa_load_font,
+ vesa_show_font,
+ vesa_save_palette,
+ vesa_load_palette,
+ vesa_set_border,
+ vesa_save_state,
+ vesa_load_state,
+ vesa_set_origin,
+ vesa_read_hw_cursor,
+ vesa_set_hw_cursor,
+ vesa_set_hw_cursor_shape,
+ (vi_blank_display_t *)vesa_nop,
+ vesa_mmap,
vesa_diag,
};
-static struct vidsw prevvidsw;
+static video_switch_t *prevvidsw;
/* VESA BIOS video modes */
#define VESA_MAXMODES 64
@@ -111,6 +148,7 @@ static char *vesa_revstr = NULL;
/* local macros and functions */
#define BIOS_SADDRTOLADDR(p) ((((p) & 0xffff0000) >> 12) + ((p) & 0x0000ffff))
+static int int10_set_mode(int mode);
static int vesa_bios_get_mode(int mode, struct vesa_mode *vmode);
static int vesa_bios_set_mode(int mode);
static int vesa_bios_set_dac(int bits);
@@ -146,6 +184,18 @@ dump_buffer(u_char *buf, size_t len)
}
}
+/* INT 10 BIOS calls */
+static int
+int10_set_mode(int mode)
+{
+ struct vm86frame vmf;
+
+ bzero(&vmf, sizeof(vmf));
+ vmf.vmf_eax = 0x0000 | mode;
+ vm86_intcall(0x10, &vmf);
+ return 0;
+}
+
/* VESA BIOS calls */
static int
vesa_bios_get_mode(int mode, struct vesa_mode *vmode)
@@ -362,8 +412,10 @@ vesa_bios_init(void)
if ((err != 0) || (vmf.vmf_eax != 0x4f) || bcmp("VESA", buf, 4))
return 1;
vesa_adp_info = (struct vesa_info *)buf;
- if (bootverbose)
+ if (bootverbose) {
+ printf("VESA: information block\n");
dump_buffer(buf, 64);
+ }
if (vesa_adp_info->v_flags & V_NONVGA)
return 1;
@@ -446,42 +498,101 @@ vesa_clear_modes(video_info_t *info, int color)
}
}
-/* exported functions */
+/* entry points */
static int
-vesa_init(void)
+vesa_configure(int flags)
{
+ video_adapter_t *adp;
int adapters;
+ int error;
int i;
- adapters = (*prevvidsw.init)();
- for (i = 0; i < adapters; ++i) {
- if ((vesa_adp = (*prevvidsw.adapter)(i)) == NULL)
- continue;
- if (vesa_adp->va_type == KD_VGA) {
- vesa_adp->va_flags |= V_ADP_VESA;
- return adapters;
- }
+ if (vesa_init_done)
+ return 0;
+ if (flags & VIO_PROBE_ONLY)
+ return 0; /* XXX */
+
+ /*
+ * If the VESA module has already been loaded, abort loading
+ * the module this time.
+ */
+ for (i = 0; (adp = vid_get_adapter(i)) != NULL; ++i) {
+ if (adp->va_flags & V_ADP_VESA)
+ return ENXIO;
+ if (adp->va_type == KD_VGA)
+ break;
}
- vesa_adp = NULL;
- return adapters;
+ /*
+ * The VGA adapter is not found. This is because either
+ * 1) the VGA driver has not been initialized, or 2) the VGA card
+ * is not present. If 1) is the case, we shall defer
+ * initialization for now and try again later.
+ */
+ if (adp == NULL) {
+ vga_sub_configure = vesa_configure;
+ return ENODEV;
+ }
+
+ /* count number of registered adapters */
+ for (++i; vid_get_adapter(i) != NULL; ++i)
+ ;
+ adapters = i;
+
+ /* call VESA BIOS */
+ vesa_adp = adp;
+ if (vesa_bios_init()) {
+ vesa_adp = NULL;
+ return ENXIO;
+ }
+ vesa_adp->va_flags |= V_ADP_VESA;
+
+ /* remove conflicting modes if we have more than one adapter */
+ if (adapters > 1) {
+ vesa_clear_modes(vesa_vmode,
+ (vesa_adp->va_flags & V_ADP_COLOR) ?
+ V_INFO_COLOR : 0);
+ }
+
+ if ((error = vesa_load_ioctl()) == 0) {
+ prevvidsw = vidsw[vesa_adp->va_index];
+ vidsw[vesa_adp->va_index] = &vesavidsw;
+ vesa_init_done = TRUE;
+ } else {
+ vesa_adp = NULL;
+ return error;
+ }
+
+ return 0;
}
-static video_adapter_t
-*vesa_adapter(int ad)
+static int
+vesa_nop(void)
+{
+ return 0;
+}
+
+static int
+vesa_probe(int unit, video_adapter_t **adpp, void *arg, int flags)
{
- return (*prevvidsw.adapter)(ad);
+ return (*prevvidsw->probe)(unit, adpp, arg, flags);
}
static int
-vesa_get_info(int ad, int mode, video_info_t *info)
+vesa_init(int unit, video_adapter_t *adp, int flags)
+{
+ return (*prevvidsw->init)(unit, adp, flags);
+}
+
+static int
+vesa_get_info(video_adapter_t *adp, int mode, video_info_t *info)
{
int i;
- if ((*prevvidsw.get_info)(ad, mode, info) == 0)
+ if ((*prevvidsw->get_info)(adp, mode, info) == 0)
return 0;
- if (ad != vesa_adp->va_index)
+ if (adp != vesa_adp)
return 1;
mode = vesa_map_gen_mode_num(vesa_adp->va_type,
@@ -498,13 +609,13 @@ vesa_get_info(int ad, int mode, video_info_t *info)
}
static int
-vesa_query_mode(int ad, video_info_t *info)
+vesa_query_mode(video_adapter_t *adp, video_info_t *info)
{
int i;
- if ((i = (*prevvidsw.query_mode)(ad, info)) != -1)
+ if ((i = (*prevvidsw->query_mode)(adp, info)) != -1)
return i;
- if (ad != vesa_adp->va_index)
+ if (adp != vesa_adp)
return -1;
for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) {
@@ -536,17 +647,19 @@ vesa_query_mode(int ad, video_info_t *info)
}
static int
-vesa_set_mode(int ad, int mode)
+vesa_set_mode(video_adapter_t *adp, int mode)
{
video_info_t info;
+#if 0
size_t len;
+#endif
- if (ad != vesa_adp->va_index)
- return (*prevvidsw.set_mode)(ad, mode);
+ if (adp != vesa_adp)
+ return (*prevvidsw->set_mode)(adp, mode);
mode = vesa_map_gen_mode_num(vesa_adp->va_type,
vesa_adp->va_flags & V_ADP_COLOR, mode);
-#ifdef SC_VIDEO_DEBUG
+#if VESA_DEBUG > 0
printf("VESA: set_mode(): %d(%x) -> %d(%x)\n",
vesa_adp->va_mode, vesa_adp->va_mode, mode, mode);
#endif
@@ -554,37 +667,40 @@ vesa_set_mode(int ad, int mode)
* If the current mode is a VESA mode and the new mode is not,
* restore the state of the adapter first, so that non-standard,
* extended SVGA registers are set to the state compatible with
- * the standard VGA modes. Otherwise (*prevvidsw.set_mode)()
+ * the standard VGA modes. Otherwise (*prevvidsw->set_mode)()
* may not be able to set up the new mode correctly.
*/
if (VESA_MODE(vesa_adp->va_mode)) {
- if ((*prevvidsw.get_info)(ad, mode, &info) == 0) {
+ if ((*prevvidsw->get_info)(adp, mode, &info) == 0) {
+ int10_set_mode(vesa_adp->va_initial_bios_mode);
+#if 0
/* assert(vesa_state_buf != NULL); */
if ((vesa_state_buf == NULL)
- || vesa_load_state(ad, vesa_state_buf))
+ || vesa_load_state(adp, vesa_state_buf))
return 1;
free(vesa_state_buf, M_DEVBUF);
vesa_state_buf = NULL;
-#ifdef SC_VIDEO_DEBUG
+#if VESA_DEBUG > 0
printf("VESA: restored\n");
#endif
+#endif /* 0 */
}
/*
- * once (*prevvidsw.get_info)() succeeded,
- * (*prevvidsw.set_mode)() below won't fail...
+ * once (*prevvidsw->get_info)() succeeded,
+ * (*prevvidsw->set_mode)() below won't fail...
*/
}
/* we may not need to handle this mode after all... */
- if ((*prevvidsw.set_mode)(ad, mode) == 0)
+ if ((*prevvidsw->set_mode)(adp, mode) == 0)
return 0;
/* is the new mode supported? */
- if (vesa_get_info(ad, mode, &info))
+ if (vesa_get_info(adp, mode, &info))
return 1;
/* assert(VESA_MODE(mode)); */
-#ifdef SC_VIDEO_DEBUG
+#if VESA_DEBUG > 0
printf("VESA: about to set a VESA mode...\n");
#endif
/*
@@ -592,27 +708,29 @@ vesa_set_mode(int ad, int mode)
* so that the adapter state can be restored later when a non-VESA
* mode is to be set up. See above.
*/
+#if 0
if (!VESA_MODE(vesa_adp->va_mode) && (vesa_state_buf == NULL)) {
- len = vesa_save_state(ad, NULL, 0);
+ len = vesa_save_state(adp, NULL, 0);
vesa_state_buf = malloc(len, M_DEVBUF, M_WAITOK);
- if (vesa_save_state(ad, vesa_state_buf, len)) {
-#ifdef SC_VIDEO_DEBUG
+ if (vesa_save_state(adp, vesa_state_buf, len)) {
+#if VESA_DEBUG > 0
printf("VESA: state save failed! (len=%d)\n", len);
#endif
free(vesa_state_buf, M_DEVBUF);
vesa_state_buf = NULL;
return 1;
}
-#ifdef SC_VIDEO_DEBUG
+#if VESA_DEBUG > 0
printf("VESA: saved (len=%d)\n", len);
dump_buffer(vesa_state_buf, len);
#endif
}
+#endif /* 0 */
if (vesa_bios_set_mode(mode))
return 1;
-#ifdef SC_VIDEO_DEBUG
+#if VESA_DEBUG > 0
printf("VESA: mode set!\n");
#endif
vesa_adp->va_mode = mode;
@@ -620,7 +738,7 @@ vesa_set_mode(int ad, int mode)
vesa_adp->va_flags |=
(info.vi_flags & V_INFO_COLOR) ? V_ADP_COLOR : 0;
vesa_adp->va_crtc_addr =
- (vesa_adp->va_flags & V_ADP_COLOR) ? COLOR_BASE : MONO_BASE;
+ (vesa_adp->va_flags & V_ADP_COLOR) ? COLOR_CRTC : MONO_CRTC;
vesa_adp->va_window = BIOS_PADDRTOVADDR(info.vi_window);
vesa_adp->va_window_size = info.vi_window_size;
vesa_adp->va_window_gran = info.vi_window_gran;
@@ -632,58 +750,63 @@ vesa_set_mode(int ad, int mode)
vesa_adp->va_buffer_size = info.vi_buffer_size;
}
+ /* move hardware cursor out of the way */
+ (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1);
+
return 0;
}
static int
-vesa_save_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
+vesa_save_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
+ int ch, int count)
{
- return (*prevvidsw.save_font)(ad, page, fontsize, data, ch, count);
+ return (*prevvidsw->save_font)(adp, page, fontsize, data, ch, count);
}
static int
-vesa_load_font(int ad, int page, int fontsize, u_char *data, int ch, int count)
+vesa_load_font(video_adapter_t *adp, int page, int fontsize, u_char *data,
+ int ch, int count)
{
- return (*prevvidsw.load_font)(ad, page, fontsize, data, ch, count);
+ return (*prevvidsw->load_font)(adp, page, fontsize, data, ch, count);
}
static int
-vesa_show_font(int ad, int page)
+vesa_show_font(video_adapter_t *adp, int page)
{
- return (*prevvidsw.show_font)(ad, page);
+ return (*prevvidsw->show_font)(adp, page);
}
static int
-vesa_save_palette(int ad, u_char *palette)
+vesa_save_palette(video_adapter_t *adp, u_char *palette)
{
- if ((ad != vesa_adp->va_index) || !(vesa_adp_info->v_flags & V_DAC8)
+ if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8)
|| vesa_bios_set_dac(8))
- return (*prevvidsw.save_palette)(ad, palette);
+ return (*prevvidsw->save_palette)(adp, palette);
return vesa_bios_save_palette(0, 256, palette);
}
static int
-vesa_load_palette(int ad, u_char *palette)
+vesa_load_palette(video_adapter_t *adp, u_char *palette)
{
- if ((ad != vesa_adp->va_index) || !(vesa_adp_info->v_flags & V_DAC8)
+ if ((adp != vesa_adp) || !(vesa_adp_info->v_flags & V_DAC8)
|| vesa_bios_set_dac(8))
- return (*prevvidsw.load_palette)(ad, palette);
+ return (*prevvidsw->load_palette)(adp, palette);
return vesa_bios_load_palette(0, 256, palette);
}
static int
-vesa_set_border(int ad, int color)
+vesa_set_border(video_adapter_t *adp, int color)
{
- return (*prevvidsw.set_border)(ad, color);
+ return (*prevvidsw->set_border)(adp, color);
}
static int
-vesa_save_state(int ad, void *p, size_t size)
+vesa_save_state(video_adapter_t *adp, void *p, size_t size)
{
- if (ad != vesa_adp->va_index)
- return (*prevvidsw.save_state)(ad, p, size);
+ if (adp != vesa_adp)
+ return (*prevvidsw->save_state)(adp, p, size);
if (vesa_state_buf_size == 0)
vesa_state_buf_size = vesa_bios_state_buf_size();
@@ -699,18 +822,17 @@ vesa_save_state(int ad, void *p, size_t size)
}
static int
-vesa_load_state(int ad, void *p)
+vesa_load_state(video_adapter_t *adp, void *p)
{
- if ((ad != vesa_adp->va_index)
- || (((adp_state_t *)p)->sig != V_STATE_SIG))
- return (*prevvidsw.load_state)(ad, p);
+ if ((adp != vesa_adp) || (((adp_state_t *)p)->sig != V_STATE_SIG))
+ return (*prevvidsw->load_state)(adp, p);
return vesa_bios_save_restore(STATE_LOAD, ((adp_state_t *)p)->regs,
vesa_state_buf_size);
}
static int
-vesa_set_origin(int ad, off_t offset)
+vesa_set_origin(video_adapter_t *adp, off_t offset)
{
struct vm86frame vmf;
int err;
@@ -721,8 +843,8 @@ vesa_set_origin(int ad, off_t offset)
* error checking is kept minimal and let the VESA BIOS to
* detect error.
*/
- if (ad != vesa_adp->va_index)
- return (*prevvidsw.set_win_org)(ad, offset);
+ if (adp != vesa_adp)
+ return (*prevvidsw->set_win_org)(adp, offset);
if (vesa_adp->va_window_gran == 0)
return 1;
@@ -735,26 +857,45 @@ vesa_set_origin(int ad, off_t offset)
}
static int
-vesa_read_hw_cursor(int ad, int *col, int *row)
+vesa_read_hw_cursor(video_adapter_t *adp, int *col, int *row)
{
- return (*prevvidsw.read_hw_cursor)(ad, col, row);
+ return (*prevvidsw->read_hw_cursor)(adp, col, row);
}
static int
-vesa_set_hw_cursor(int ad, int col, int row)
+vesa_set_hw_cursor(video_adapter_t *adp, int col, int row)
{
- return (*prevvidsw.set_hw_cursor)(ad, col, row);
+ return (*prevvidsw->set_hw_cursor)(adp, col, row);
}
static int
-vesa_diag(int level)
+vesa_set_hw_cursor_shape(video_adapter_t *adp, int base, int height,
+ int celsize, int blink)
{
+ return (*prevvidsw->set_hw_cursor_shape)(adp, base, height, celsize,
+ blink);
+}
+
+static int
+vesa_mmap(video_adapter_t *adp, vm_offset_t offset)
+{
+ return (*prevvidsw->mmap)(adp, offset);
+}
+
+static int
+vesa_diag(video_adapter_t *adp, int level)
+{
+#if VESA_DEBUG > 1
struct vesa_mode vmode;
int i;
+#endif
+
+ if (adp != vesa_adp)
+ return 1;
#ifndef KLD_MODULE
/* call the previous handler first */
- (*prevvidsw.diag)(level);
+ (*prevvidsw->diag)(adp, level);
#endif
/* general adapter information */
@@ -784,6 +925,7 @@ vesa_diag(int level)
printf("VESA: %s\n", vesa_revstr);
}
+#if VESA_DEBUG > 1
/* mode information */
for (i = 0;
(i < (M_VESA_MODE_MAX - M_VESA_BASE + 1))
@@ -818,70 +960,31 @@ vesa_diag(int level)
printf("size:%dk, gran:%dk\n",
vmode.v_wsize, vmode.v_wgran);
}
+#endif
return 0;
}
/* module loading */
-#ifdef KLD_MODULE
-static
-#endif
-int
+static int
vesa_load(void)
{
- int adapters;
int error;
-#ifdef KLD_MODULE
int s;
-#endif
- int i;
if (vesa_init_done)
return 0;
- /*
- * If the VESA module is statically linked to the kernel, or
- * it has already been loaded, abort loading this module this time.
- */
- vesa_adp = NULL;
- adapters = (*biosvidsw.init)();
- for (i = 0; i < adapters; ++i) {
- if ((vesa_adp = (*biosvidsw.adapter)(i)) == NULL)
- continue;
- if (vesa_adp->va_flags & V_ADP_VESA)
- return ENXIO;
- if (vesa_adp->va_type == KD_VGA)
- break;
- }
- /* if a VGA adapter is not found, abort */
- if (i >= adapters)
- return ENXIO;
-
- if (vesa_bios_init())
- return ENXIO;
- vesa_adp->va_flags |= V_ADP_VESA;
-
- /* remove conflicting modes if we have more than one adapter */
- if (adapters > 1) {
- vesa_clear_modes(vesa_vmode,
- (vesa_adp->va_flags & V_ADP_COLOR) ?
- V_INFO_COLOR : 0);
- }
-
-#ifdef KLD_MODULE
+ /* locate a VGA adapter */
s = spltty();
-#endif
- if ((error = vesa_load_ioctl()) == 0) {
- bcopy(&biosvidsw, &prevvidsw, sizeof(prevvidsw));
- bcopy(&vesavidsw, &biosvidsw, sizeof(vesavidsw));
- vesa_init_done = TRUE;
- }
-#ifdef KLD_MODULE
+ vesa_adp = NULL;
+ error = vesa_configure(0);
splx(s);
+#ifdef KLD_MODULE
if (error == 0)
- vesa_diag(bootverbose);
+ vesa_diag(vesa_adp, bootverbose);
#endif
return error;
@@ -905,9 +1008,9 @@ vesa_unload(void)
s = spltty();
if ((error = vesa_unload_ioctl()) == 0) {
- if (vesa_adp)
+ if (vesa_adp != NULL)
vesa_adp->va_flags &= ~V_ADP_VESA;
- bcopy(&prevvidsw, &biosvidsw, sizeof(biosvidsw));
+ vidsw[vesa_adp->va_index] = prevvidsw;
}
splx(s);
@@ -934,8 +1037,13 @@ static moduledata_t vesa_mod = {
NULL,
};
-DECLARE_MODULE(vesa, vesa_mod, SI_SUB_PSEUDO, SI_ORDER_MIDDLE);
+DECLARE_MODULE(vesa, vesa_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
+
+#else /* KLD_MODULE */
+
+SYSINIT(vesa, SI_SUB_DRIVERS, SI_ORDER_MIDDLE,
+ (void (*)(void *))vesa_load, NULL);
#endif /* KLD_MODULE */
-#endif /* (NSC > 0 && VESA && VM86) || KLD_MODULE */
+#endif /* (NVGA > 0 && VESA && VM86) || KLD_MODULE */
OpenPOWER on IntegriCloud