xref: /openbmc/qemu/include/hw/input/i8042.h (revision f4de68d1)
1 /*
2  * QEMU PS/2 Controller
3  *
4  * Copyright (c) 2003 Fabrice Bellard
5  *
6  * SPDX-License-Identifier: MIT
7  */
8 #ifndef HW_INPUT_I8042_H
9 #define HW_INPUT_I8042_H
10 
11 #include "hw/isa/isa.h"
12 #include "hw/sysbus.h"
13 #include "qom/object.h"
14 
15 typedef struct KBDState {
16     uint8_t write_cmd; /* if non zero, write data to port 60 is expected */
17     uint8_t status;
18     uint8_t mode;
19     uint8_t outport;
20     uint32_t migration_flags;
21     uint32_t obsrc;
22     bool outport_present;
23     bool extended_state;
24     bool extended_state_loaded;
25     /* Bitmask of devices with data available.  */
26     uint8_t pending;
27     uint8_t obdata;
28     uint8_t cbdata;
29     uint8_t pending_tmp;
30     void *kbd;
31     void *mouse;
32     QEMUTimer *throttle_timer;
33 
34     qemu_irq irq_kbd;
35     qemu_irq irq_mouse;
36     qemu_irq a20_out;
37     hwaddr mask;
38 } KBDState;
39 
40 #define TYPE_I8042 "i8042"
41 OBJECT_DECLARE_SIMPLE_TYPE(ISAKBDState, I8042)
42 
43 struct ISAKBDState {
44     ISADevice parent_obj;
45 
46     KBDState kbd;
47     bool kbd_throttle;
48     MemoryRegion io[2];
49     uint8_t kbd_irq;
50     uint8_t mouse_irq;
51 };
52 
53 #define TYPE_I8042_MMIO "i8042-mmio"
54 OBJECT_DECLARE_SIMPLE_TYPE(MMIOKBDState, I8042_MMIO)
55 
56 struct MMIOKBDState {
57     SysBusDevice parent_obj;
58 
59     KBDState kbd;
60     uint32_t size;
61     MemoryRegion region;
62 };
63 
64 #define I8042_A20_LINE "a20"
65 
66 
67 void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
68                    MemoryRegion *region, ram_addr_t size,
69                    hwaddr mask);
70 void i8042_isa_mouse_fake_event(ISAKBDState *isa);
71 void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out);
72 
73 static inline bool i8042_present(void)
74 {
75     bool amb = false;
76     return object_resolve_path_type("", TYPE_I8042, &amb) || amb;
77 }
78 
79 /*
80  * ACPI v2, Table 5-10 - Fixed ACPI Description Table Boot Architecture
81  * Flags, bit offset 1 - 8042.
82  */
83 static inline uint16_t iapc_boot_arch_8042(void)
84 {
85     return i8042_present() ? 0x1 << 1 : 0x0 ;
86 }
87 
88 #endif /* HW_INPUT_I8042_H */
89