212a300303
Now we can implement port-based IRQs by wiring the PS2 device IRQs to the LASI2Port named input gpios rather than directly to the LASIPS2 device, and generate the LASIPS2 output IRQ from the int_status bitmap representing the individual port IRQs instead of the birq boolean. This enables us to remove the separate PS2 keyboard and PS2 mouse named input gpios from the LASIPS2 device and simplify the register implementation to drive the port IRQ using qemu_set_irq() rather than accessing the LASIPS2 device IRQs directly. As a consequence the IRQ level logic in lasips2_set_irq() can also be simplified accordingly. For now this patch ignores adding the int_status bitmap and simply drops the birq boolean from the vmstate_lasips2 VMStateDescription. This is because the migration stream is already missing some required LASIPS2 fields, and as this series already introduces a migration break for the lasips2 device it is easiest to fix this in a follow-up patch. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Tested-by: Helge Deller <deller@gmx.de> Acked-by: Helge Deller <deller@gmx.de> Message-Id: <20220712215251.7944-29-mark.cave-ayland@ilande.co.uk> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
77 lines
1.6 KiB
C
77 lines
1.6 KiB
C
/*
|
|
* QEMU LASI PS/2 emulation
|
|
*
|
|
* Copyright (c) 2019 Sven Schnelle
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* QEMU interface:
|
|
* + sysbus MMIO region 0: MemoryRegion defining the LASI PS2 keyboard
|
|
* registers
|
|
* + sysbus MMIO region 1: MemoryRegion defining the LASI PS2 mouse
|
|
* registers
|
|
* + sysbus IRQ 0: LASI PS2 output irq
|
|
* + Named GPIO input "lasips2-port-input-irq[0..1]": set to 1 if the downstream
|
|
* LASIPS2Port has asserted its irq
|
|
*/
|
|
|
|
#ifndef HW_INPUT_LASIPS2_H
|
|
#define HW_INPUT_LASIPS2_H
|
|
|
|
#include "exec/hwaddr.h"
|
|
#include "hw/sysbus.h"
|
|
#include "hw/input/ps2.h"
|
|
|
|
#define TYPE_LASIPS2_PORT "lasips2-port"
|
|
OBJECT_DECLARE_TYPE(LASIPS2Port, LASIPS2PortDeviceClass, LASIPS2_PORT)
|
|
|
|
struct LASIPS2PortDeviceClass {
|
|
DeviceClass parent;
|
|
|
|
DeviceRealize parent_realize;
|
|
};
|
|
|
|
typedef struct LASIPS2State LASIPS2State;
|
|
|
|
struct LASIPS2Port {
|
|
DeviceState parent_obj;
|
|
|
|
LASIPS2State *parent;
|
|
MemoryRegion reg;
|
|
PS2State *ps2dev;
|
|
uint8_t id;
|
|
uint8_t control;
|
|
uint8_t buf;
|
|
bool loopback_rbne;
|
|
qemu_irq irq;
|
|
};
|
|
|
|
#define TYPE_LASIPS2_KBD_PORT "lasips2-kbd-port"
|
|
OBJECT_DECLARE_SIMPLE_TYPE(LASIPS2KbdPort, LASIPS2_KBD_PORT)
|
|
|
|
struct LASIPS2KbdPort {
|
|
LASIPS2Port parent_obj;
|
|
};
|
|
|
|
#define TYPE_LASIPS2_MOUSE_PORT "lasips2-mouse-port"
|
|
OBJECT_DECLARE_SIMPLE_TYPE(LASIPS2MousePort, LASIPS2_MOUSE_PORT)
|
|
|
|
struct LASIPS2MousePort {
|
|
LASIPS2Port parent_obj;
|
|
};
|
|
|
|
struct LASIPS2State {
|
|
SysBusDevice parent_obj;
|
|
|
|
LASIPS2KbdPort kbd_port;
|
|
LASIPS2MousePort mouse_port;
|
|
uint8_t int_status;
|
|
qemu_irq irq;
|
|
};
|
|
|
|
#define TYPE_LASIPS2 "lasips2"
|
|
OBJECT_DECLARE_SIMPLE_TYPE(LASIPS2State, LASIPS2)
|
|
|
|
#endif /* HW_INPUT_LASIPS2_H */
|