xref: /qemu/include/hw/input/i8042.h (revision 01d924dce88f6d43a0be36c0e626f058e68a9ea4)
147973a2dSPhilippe Mathieu-Daudé /*
247973a2dSPhilippe Mathieu-Daudé  * QEMU PS/2 Controller
347973a2dSPhilippe Mathieu-Daudé  *
447973a2dSPhilippe Mathieu-Daudé  * Copyright (c) 2003 Fabrice Bellard
547973a2dSPhilippe Mathieu-Daudé  *
647973a2dSPhilippe Mathieu-Daudé  * SPDX-License-Identifier: MIT
747973a2dSPhilippe Mathieu-Daudé  */
847973a2dSPhilippe Mathieu-Daudé #ifndef HW_INPUT_I8042_H
947973a2dSPhilippe Mathieu-Daudé #define HW_INPUT_I8042_H
1047973a2dSPhilippe Mathieu-Daudé 
1147973a2dSPhilippe Mathieu-Daudé #include "hw/isa/isa.h"
12150ee013SMark Cave-Ayland #include "hw/sysbus.h"
13db1015e9SEduardo Habkost #include "qom/object.h"
1447973a2dSPhilippe Mathieu-Daudé 
1577adda52SMark Cave-Ayland typedef struct KBDState {
1677adda52SMark Cave-Ayland     uint8_t write_cmd; /* if non zero, write data to port 60 is expected */
1777adda52SMark Cave-Ayland     uint8_t status;
1877adda52SMark Cave-Ayland     uint8_t mode;
1977adda52SMark Cave-Ayland     uint8_t outport;
2077adda52SMark Cave-Ayland     uint32_t migration_flags;
2177adda52SMark Cave-Ayland     uint32_t obsrc;
2277adda52SMark Cave-Ayland     bool outport_present;
2377adda52SMark Cave-Ayland     bool extended_state;
2477adda52SMark Cave-Ayland     bool extended_state_loaded;
2577adda52SMark Cave-Ayland     /* Bitmask of devices with data available.  */
2677adda52SMark Cave-Ayland     uint8_t pending;
2777adda52SMark Cave-Ayland     uint8_t obdata;
2877adda52SMark Cave-Ayland     uint8_t cbdata;
2977adda52SMark Cave-Ayland     uint8_t pending_tmp;
3077adda52SMark Cave-Ayland     void *kbd;
3177adda52SMark Cave-Ayland     void *mouse;
3277adda52SMark Cave-Ayland     QEMUTimer *throttle_timer;
3377adda52SMark Cave-Ayland 
3477adda52SMark Cave-Ayland     qemu_irq irq_kbd;
3577adda52SMark Cave-Ayland     qemu_irq irq_mouse;
3677adda52SMark Cave-Ayland     qemu_irq a20_out;
3777adda52SMark Cave-Ayland     hwaddr mask;
3877adda52SMark Cave-Ayland } KBDState;
3977adda52SMark Cave-Ayland 
4047973a2dSPhilippe Mathieu-Daudé #define TYPE_I8042 "i8042"
418063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(ISAKBDState, I8042)
4247973a2dSPhilippe Mathieu-Daudé 
43c9849a71SMark Cave-Ayland struct ISAKBDState {
44c9849a71SMark Cave-Ayland     ISADevice parent_obj;
45c9849a71SMark Cave-Ayland 
46c9849a71SMark Cave-Ayland     KBDState kbd;
47c9849a71SMark Cave-Ayland     bool kbd_throttle;
48c9849a71SMark Cave-Ayland     MemoryRegion io[2];
49c9849a71SMark Cave-Ayland     uint8_t kbd_irq;
50c9849a71SMark Cave-Ayland     uint8_t mouse_irq;
51c9849a71SMark Cave-Ayland };
52c9849a71SMark Cave-Ayland 
53150ee013SMark Cave-Ayland #define TYPE_I8042_MMIO "i8042-mmio"
54150ee013SMark Cave-Ayland OBJECT_DECLARE_SIMPLE_TYPE(MMIOKBDState, I8042_MMIO)
55150ee013SMark Cave-Ayland 
56150ee013SMark Cave-Ayland struct MMIOKBDState {
57150ee013SMark Cave-Ayland     SysBusDevice parent_obj;
58150ee013SMark Cave-Ayland 
59150ee013SMark Cave-Ayland     KBDState kbd;
607b9fff29SMark Cave-Ayland     uint32_t size;
61f4de68d1SMark Cave-Ayland     MemoryRegion region;
62150ee013SMark Cave-Ayland };
63150ee013SMark Cave-Ayland 
6447973a2dSPhilippe Mathieu-Daudé #define I8042_A20_LINE "a20"
6547973a2dSPhilippe Mathieu-Daudé 
660fe4bb32SMarc-André Lureau 
67903dd0e4SMark Cave-Ayland MMIOKBDState *i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
68*01d924dcSMark Cave-Ayland                             ram_addr_t size, hwaddr mask);
690fe4bb32SMarc-André Lureau void i8042_isa_mouse_fake_event(ISAKBDState *isa);
7047973a2dSPhilippe Mathieu-Daudé void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out);
7147973a2dSPhilippe Mathieu-Daudé 
725334bf57SLiav Albani static inline bool i8042_present(void)
735334bf57SLiav Albani {
745334bf57SLiav Albani     bool amb = false;
755334bf57SLiav Albani     return object_resolve_path_type("", TYPE_I8042, &amb) || amb;
765334bf57SLiav Albani }
775334bf57SLiav Albani 
785334bf57SLiav Albani /*
795334bf57SLiav Albani  * ACPI v2, Table 5-10 - Fixed ACPI Description Table Boot Architecture
805334bf57SLiav Albani  * Flags, bit offset 1 - 8042.
815334bf57SLiav Albani  */
825334bf57SLiav Albani static inline uint16_t iapc_boot_arch_8042(void)
835334bf57SLiav Albani {
845334bf57SLiav Albani     return i8042_present() ? 0x1 << 1 : 0x0 ;
855334bf57SLiav Albani }
865334bf57SLiav Albani 
8747973a2dSPhilippe Mathieu-Daudé #endif /* HW_INPUT_I8042_H */
88