Allow atkbd to obtain keyboard repeat rate from BIOS on amd64.
Submitted by: swell.k at gmail.com
This commit is contained in:
parent
205d67b00d
commit
8b1620e069
@ -2828,8 +2828,8 @@ dev/xen/netfront/netfront.c optional xen | xenhvm
|
||||
dev/xen/xenpci/xenpci.c optional xenpci
|
||||
dev/xen/xenpci/evtchn.c optional xenpci
|
||||
dev/xen/xenpci/machine_reboot.c optional xenpci
|
||||
dev/x86bios/x86bios.c optional x86bios | dpms | vesa
|
||||
dev/x86bios/x86bios_alloc.c optional x86bios | dpms | vesa
|
||||
contrib/x86emu/x86emu.c optional x86bios | dpms | vesa
|
||||
contrib/x86emu/x86emu_util.c optional x86bios | dpms | vesa
|
||||
dev/x86bios/x86bios.c optional x86bios | atkbd | dpms | vesa
|
||||
dev/x86bios/x86bios_alloc.c optional x86bios | atkbd | dpms | vesa
|
||||
contrib/x86emu/x86emu.c optional x86bios | atkbd | dpms | vesa
|
||||
contrib/x86emu/x86emu_util.c optional x86bios | atkbd | dpms | vesa
|
||||
|
||||
|
@ -44,10 +44,10 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
|
||||
#ifdef __i386__
|
||||
#if defined(__i386__) || defined(__amd64__)
|
||||
#include <machine/md_var.h>
|
||||
#include <machine/psl.h>
|
||||
#include <machine/vm86.h>
|
||||
#include <dev/x86bios/x86bios.h>
|
||||
#include <machine/pc/bios.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <vm/vm_param.h>
|
||||
|
||||
#include <isa/isareg.h>
|
||||
#endif /* __i386__ */
|
||||
#endif /* __i386__ || __amd64__ */
|
||||
|
||||
#include <sys/kbio.h>
|
||||
#include <dev/kbd/kbdreg.h>
|
||||
@ -1089,34 +1089,33 @@ atkbd_shutdown_final(void *v)
|
||||
static int
|
||||
get_typematic(keyboard_t *kbd)
|
||||
{
|
||||
#ifdef __i386__
|
||||
#if defined(__i386__) || defined(__amd64__)
|
||||
/*
|
||||
* Only some systems allow us to retrieve the keyboard repeat
|
||||
* rate previously set via the BIOS...
|
||||
*/
|
||||
struct vm86frame vmf;
|
||||
u_int32_t p;
|
||||
x86regs_t regs;
|
||||
vm_offset_t p;
|
||||
|
||||
bzero(&vmf, sizeof(vmf));
|
||||
vmf.vmf_ax = 0xc000;
|
||||
vm86_intcall(0x15, &vmf);
|
||||
if ((vmf.vmf_eflags & PSL_C) || vmf.vmf_ah)
|
||||
regs.R_AX = 0xc000;
|
||||
x86biosCall(®s, 0x15);
|
||||
if ((regs.R_EFLG & PSL_C) || regs.R_AH)
|
||||
return ENODEV;
|
||||
p = BIOS_PADDRTOVADDR(((u_int32_t)vmf.vmf_es << 4) + vmf.vmf_bx);
|
||||
p = BIOS_PADDRTOVADDR((regs.R_ES << 4) + regs.R_BX);
|
||||
if ((readb(p + 6) & 0x40) == 0) /* int 16, function 0x09 supported? */
|
||||
return ENODEV;
|
||||
vmf.vmf_ax = 0x0900;
|
||||
vm86_intcall(0x16, &vmf);
|
||||
if ((vmf.vmf_al & 0x08) == 0) /* int 16, function 0x0306 supported? */
|
||||
regs.R_AX = 0x0900;
|
||||
x86biosCall(®s, 0x16);
|
||||
if ((regs.R_AL & 0x08) == 0) /* int 16, function 0x0306 supported? */
|
||||
return ENODEV;
|
||||
vmf.vmf_ax = 0x0306;
|
||||
vm86_intcall(0x16, &vmf);
|
||||
kbd->kb_delay1 = typematic_delay(vmf.vmf_bh << 5);
|
||||
kbd->kb_delay2 = typematic_rate(vmf.vmf_bl);
|
||||
regs.R_AX = 0x0306;
|
||||
x86biosCall(®s, 0x16);
|
||||
kbd->kb_delay1 = typematic_delay(regs.R_BH << 5);
|
||||
kbd->kb_delay2 = typematic_rate(regs.R_BL);
|
||||
return 0;
|
||||
#else
|
||||
return ENODEV;
|
||||
#endif /* __i386__ */
|
||||
#endif /* __i386__ || __amd64__ */
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
x
Reference in New Issue
Block a user