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