[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3] hw/char: remove legacy interface escc_init()
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH v3] hw/char: remove legacy interface escc_init() |
Date: |
Mon, 29 Jan 2018 15:21:59 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 |
Paolo,
I forgot to cc: you for the "MAINTAINERS/Character devices/Odd Fixes".
Could you take this through your branch?
Thanks,
Laurent
On 26/01/2018 16:41, Mark Cave-Ayland wrote:
> On 26/01/18 14:47, Laurent Vivier wrote:
>
>> Move necessary stuff in escc.h and update type names.
>> Remove slavio_serial_ms_kbd_init().
>> Fix code style problems reported by checkpatch.pl
>> Update mac_newworld, mac_oldworld and sun4m to use directly the
>> QDEV interface.
>>
>> Signed-off-by: Laurent Vivier <address@hidden>
>> Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
>> ---
>>
>> Notes:
>> v3: in sun4m, move comments about Slavio TTY
>> above both qdev_create().
>> v2: in sun4m, move comments about Slavio TTY close to
>> their qdev_prop_set_chr()
>>
>> hw/char/escc.c | 208
>> ++++++++++++++-----------------------------------
>> hw/ppc/mac_newworld.c | 19 ++++-
>> hw/ppc/mac_oldworld.c | 19 ++++-
>> hw/sparc/sun4m.c | 34 +++++++-
>> include/hw/char/escc.h | 54 +++++++++++--
>> 5 files changed, 170 insertions(+), 164 deletions(-)
>>
>> diff --git a/hw/char/escc.c b/hw/char/escc.c
>> index 3ab831a6a7..bb735cc0c8 100644
>> --- a/hw/char/escc.c
>> +++ b/hw/char/escc.c
>> @@ -26,10 +26,7 @@
>> #include "hw/hw.h"
>> #include "hw/sysbus.h"
>> #include "hw/char/escc.h"
>> -#include "chardev/char-fe.h"
>> -#include "chardev/char-serial.h"
>> #include "ui/console.h"
>> -#include "ui/input.h"
>> #include "trace.h"
>> /*
>> @@ -64,53 +61,7 @@
>> * 2010-May-23 Artyom Tarasenko: Reworked IUS logic
>> */
>> -typedef enum {
>> - chn_a, chn_b,
>> -} ChnID;
>> -
>> -#define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')
>> -
>> -typedef enum {
>> - ser, kbd, mouse,
>> -} ChnType;
>> -
>> -#define SERIO_QUEUE_SIZE 256
>> -
>> -typedef struct {
>> - uint8_t data[SERIO_QUEUE_SIZE];
>> - int rptr, wptr, count;
>> -} SERIOQueue;
>> -
>> -#define SERIAL_REGS 16
>> -typedef struct ChannelState {
>> - qemu_irq irq;
>> - uint32_t rxint, txint, rxint_under_svc, txint_under_svc;
>> - struct ChannelState *otherchn;
>> - uint32_t reg;
>> - uint8_t wregs[SERIAL_REGS], rregs[SERIAL_REGS];
>> - SERIOQueue queue;
>> - CharBackend chr;
>> - int e0_mode, led_mode, caps_lock_mode, num_lock_mode;
>> - int disabled;
>> - int clock;
>> - uint32_t vmstate_dummy;
>> - ChnID chn; // this channel, A (base+4) or B (base+0)
>> - ChnType type;
>> - uint8_t rx, tx;
>> - QemuInputHandlerState *hs;
>> -} ChannelState;
>> -
>> -#define ESCC(obj) OBJECT_CHECK(ESCCState, (obj), TYPE_ESCC)
>> -
>> -typedef struct ESCCState {
>> - SysBusDevice parent_obj;
>> -
>> - struct ChannelState chn[2];
>> - uint32_t it_shift;
>> - MemoryRegion mmio;
>> - uint32_t disabled;
>> - uint32_t frequency;
>> -} ESCCState;
>> +#define CHN_C(s) ((s)->chn == escc_chn_b ? 'b' : 'a')
>> #define SERIAL_CTRL 0
>> #define SERIAL_DATA 1
>> @@ -214,44 +165,47 @@ typedef struct ESCCState {
>> #define R_MISC1I 14
>> #define R_EXTINT 15
>> -static void handle_kbd_command(ChannelState *s, int val);
>> +static void handle_kbd_command(ESCCChannelState *s, int val);
>> static int serial_can_receive(void *opaque);
>> -static void serial_receive_byte(ChannelState *s, int ch);
>> +static void serial_receive_byte(ESCCChannelState *s, int ch);
>> static void clear_queue(void *opaque)
>> {
>> - ChannelState *s = opaque;
>> - SERIOQueue *q = &s->queue;
>> + ESCCChannelState *s = opaque;
>> + ESCCSERIOQueue *q = &s->queue;
>> q->rptr = q->wptr = q->count = 0;
>> }
>> static void put_queue(void *opaque, int b)
>> {
>> - ChannelState *s = opaque;
>> - SERIOQueue *q = &s->queue;
>> + ESCCChannelState *s = opaque;
>> + ESCCSERIOQueue *q = &s->queue;
>> trace_escc_put_queue(CHN_C(s), b);
>> - if (q->count >= SERIO_QUEUE_SIZE)
>> + if (q->count >= ESCC_SERIO_QUEUE_SIZE) {
>> return;
>> + }
>> q->data[q->wptr] = b;
>> - if (++q->wptr == SERIO_QUEUE_SIZE)
>> + if (++q->wptr == ESCC_SERIO_QUEUE_SIZE) {
>> q->wptr = 0;
>> + }
>> q->count++;
>> serial_receive_byte(s, 0);
>> }
>> static uint32_t get_queue(void *opaque)
>> {
>> - ChannelState *s = opaque;
>> - SERIOQueue *q = &s->queue;
>> + ESCCChannelState *s = opaque;
>> + ESCCSERIOQueue *q = &s->queue;
>> int val;
>> if (q->count == 0) {
>> return 0;
>> } else {
>> val = q->data[q->rptr];
>> - if (++q->rptr == SERIO_QUEUE_SIZE)
>> + if (++q->rptr == ESCC_SERIO_QUEUE_SIZE) {
>> q->rptr = 0;
>> + }
>> q->count--;
>> }
>> trace_escc_get_queue(CHN_C(s), val);
>> @@ -260,7 +214,7 @@ static uint32_t get_queue(void *opaque)
>> return val;
>> }
>> -static int escc_update_irq_chn(ChannelState *s)
>> +static int escc_update_irq_chn(ESCCChannelState *s)
>> {
>> if ((((s->wregs[W_INTR] & INTR_TXINT) && (s->txint == 1)) ||
>> // tx ints enabled, pending
>> @@ -274,7 +228,7 @@ static int escc_update_irq_chn(ChannelState *s)
>> return 0;
>> }
>> -static void escc_update_irq(ChannelState *s)
>> +static void escc_update_irq(ESCCChannelState *s)
>> {
>> int irq;
>> @@ -285,12 +239,12 @@ static void escc_update_irq(ChannelState *s)
>> qemu_set_irq(s->irq, irq);
>> }
>> -static void escc_reset_chn(ChannelState *s)
>> +static void escc_reset_chn(ESCCChannelState *s)
>> {
>> int i;
>> s->reg = 0;
>> - for (i = 0; i < SERIAL_REGS; i++) {
>> + for (i = 0; i < ESCC_SERIAL_REGS; i++) {
>> s->rregs[i] = 0;
>> s->wregs[i] = 0;
>> }
>> @@ -322,13 +276,13 @@ static void escc_reset(DeviceState *d)
>> escc_reset_chn(&s->chn[1]);
>> }
>> -static inline void set_rxint(ChannelState *s)
>> +static inline void set_rxint(ESCCChannelState *s)
>> {
>> s->rxint = 1;
>> - /* XXX: missing daisy chainnig: chn_b rx should have a lower
>> priority
>> + /* XXX: missing daisy chainnig: escc_chn_b rx should have a lower
>> priority
>> than chn_a rx/tx/special_condition service*/
>> s->rxint_under_svc = 1;
>> - if (s->chn == chn_a) {
>> + if (s->chn == escc_chn_a) {
>> s->rregs[R_INTR] |= INTR_RXINTA;
>> if (s->wregs[W_MINTR] & MINTR_STATUSHI)
>> s->otherchn->rregs[R_IVEC] = IVEC_HIRXINTA;
>> @@ -344,12 +298,12 @@ static inline void set_rxint(ChannelState *s)
>> escc_update_irq(s);
>> }
>> -static inline void set_txint(ChannelState *s)
>> +static inline void set_txint(ESCCChannelState *s)
>> {
>> s->txint = 1;
>> if (!s->rxint_under_svc) {
>> s->txint_under_svc = 1;
>> - if (s->chn == chn_a) {
>> + if (s->chn == escc_chn_a) {
>> if (s->wregs[W_INTR] & INTR_TXINT) {
>> s->rregs[R_INTR] |= INTR_TXINTA;
>> }
>> @@ -367,11 +321,11 @@ static inline void set_txint(ChannelState *s)
>> }
>> }
>> -static inline void clr_rxint(ChannelState *s)
>> +static inline void clr_rxint(ESCCChannelState *s)
>> {
>> s->rxint = 0;
>> s->rxint_under_svc = 0;
>> - if (s->chn == chn_a) {
>> + if (s->chn == escc_chn_a) {
>> if (s->wregs[W_MINTR] & MINTR_STATUSHI)
>> s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
>> else
>> @@ -389,11 +343,11 @@ static inline void clr_rxint(ChannelState *s)
>> escc_update_irq(s);
>> }
>> -static inline void clr_txint(ChannelState *s)
>> +static inline void clr_txint(ESCCChannelState *s)
>> {
>> s->txint = 0;
>> s->txint_under_svc = 0;
>> - if (s->chn == chn_a) {
>> + if (s->chn == escc_chn_a) {
>> if (s->wregs[W_MINTR] & MINTR_STATUSHI)
>> s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
>> else
>> @@ -412,12 +366,12 @@ static inline void clr_txint(ChannelState *s)
>> escc_update_irq(s);
>> }
>> -static void escc_update_parameters(ChannelState *s)
>> +static void escc_update_parameters(ESCCChannelState *s)
>> {
>> int speed, parity, data_bits, stop_bits;
>> QEMUSerialSetParams ssp;
>> - if (!qemu_chr_fe_backend_connected(&s->chr) || s->type != ser)
>> + if (!qemu_chr_fe_backend_connected(&s->chr) || s->type !=
>> escc_serial)
>> return;
>> if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREN) {
>> @@ -474,7 +428,7 @@ static void escc_mem_write(void *opaque, hwaddr addr,
>> uint64_t val, unsigned size)
>> {
>> ESCCState *serial = opaque;
>> - ChannelState *s;
>> + ESCCChannelState *s;
>> uint32_t saddr;
>> int newreg, channel;
>> @@ -561,7 +515,7 @@ static void escc_mem_write(void *opaque, hwaddr
>> addr,
>> /* XXX this blocks entire thread. Rewrite to use
>> * qemu_chr_fe_write and background I/O callbacks */
>> qemu_chr_fe_write_all(&s->chr, &s->tx, 1);
>> - } else if (s->type == kbd && !s->disabled) {
>> + } else if (s->type == escc_kbd && !s->disabled) {
>> handle_kbd_command(s, val);
>> }
>> }
>> @@ -578,7 +532,7 @@ static uint64_t escc_mem_read(void *opaque, hwaddr
>> addr,
>> unsigned size)
>> {
>> ESCCState *serial = opaque;
>> - ChannelState *s;
>> + ESCCChannelState *s;
>> uint32_t saddr;
>> uint32_t ret;
>> int channel;
>> @@ -595,10 +549,11 @@ static uint64_t escc_mem_read(void *opaque,
>> hwaddr addr,
>> case SERIAL_DATA:
>> s->rregs[R_STATUS] &= ~STATUS_RXAV;
>> clr_rxint(s);
>> - if (s->type == kbd || s->type == mouse)
>> + if (s->type == escc_kbd || s->type == escc_mouse) {
>> ret = get_queue(s);
>> - else
>> + } else {
>> ret = s->rx;
>> + }
>> trace_escc_mem_readb_data(CHN_C(s), ret);
>> qemu_chr_fe_accept_input(&s->chr);
>> return ret;
>> @@ -620,7 +575,7 @@ static const MemoryRegionOps escc_mem_ops = {
>> static int serial_can_receive(void *opaque)
>> {
>> - ChannelState *s = opaque;
>> + ESCCChannelState *s = opaque;
>> int ret;
>> if (((s->wregs[W_RXCTRL] & RXCTRL_RXEN) == 0) // Rx not enabled
>> @@ -632,7 +587,7 @@ static int serial_can_receive(void *opaque)
>> return ret;
>> }
>> -static void serial_receive_byte(ChannelState *s, int ch)
>> +static void serial_receive_byte(ESCCChannelState *s, int ch)
>> {
>> trace_escc_serial_receive_byte(CHN_C(s), ch);
>> s->rregs[R_STATUS] |= STATUS_RXAV;
>> @@ -640,7 +595,7 @@ static void serial_receive_byte(ChannelState *s,
>> int ch)
>> set_rxint(s);
>> }
>> -static void serial_receive_break(ChannelState *s)
>> +static void serial_receive_break(ESCCChannelState *s)
>> {
>> s->rregs[R_STATUS] |= STATUS_BRK;
>> escc_update_irq(s);
>> @@ -648,13 +603,13 @@ static void serial_receive_break(ChannelState *s)
>> static void serial_receive1(void *opaque, const uint8_t *buf, int
>> size)
>> {
>> - ChannelState *s = opaque;
>> + ESCCChannelState *s = opaque;
>> serial_receive_byte(s, buf[0]);
>> }
>> static void serial_event(void *opaque, int event)
>> {
>> - ChannelState *s = opaque;
>> + ESCCChannelState *s = opaque;
>> if (event == CHR_EVENT_BREAK)
>> serial_receive_break(s);
>> }
>> @@ -664,16 +619,16 @@ static const VMStateDescription vmstate_escc_chn
>> = {
>> .version_id = 2,
>> .minimum_version_id = 1,
>> .fields = (VMStateField[]) {
>> - VMSTATE_UINT32(vmstate_dummy, ChannelState),
>> - VMSTATE_UINT32(reg, ChannelState),
>> - VMSTATE_UINT32(rxint, ChannelState),
>> - VMSTATE_UINT32(txint, ChannelState),
>> - VMSTATE_UINT32(rxint_under_svc, ChannelState),
>> - VMSTATE_UINT32(txint_under_svc, ChannelState),
>> - VMSTATE_UINT8(rx, ChannelState),
>> - VMSTATE_UINT8(tx, ChannelState),
>> - VMSTATE_BUFFER(wregs, ChannelState),
>> - VMSTATE_BUFFER(rregs, ChannelState),
>> + VMSTATE_UINT32(vmstate_dummy, ESCCChannelState),
>> + VMSTATE_UINT32(reg, ESCCChannelState),
>> + VMSTATE_UINT32(rxint, ESCCChannelState),
>> + VMSTATE_UINT32(txint, ESCCChannelState),
>> + VMSTATE_UINT32(rxint_under_svc, ESCCChannelState),
>> + VMSTATE_UINT32(txint_under_svc, ESCCChannelState),
>> + VMSTATE_UINT8(rx, ESCCChannelState),
>> + VMSTATE_UINT8(tx, ESCCChannelState),
>> + VMSTATE_BUFFER(wregs, ESCCChannelState),
>> + VMSTATE_BUFFER(rregs, ESCCChannelState),
>> VMSTATE_END_OF_LIST()
>> }
>> };
>> @@ -684,39 +639,11 @@ static const VMStateDescription vmstate_escc = {
>> .minimum_version_id = 1,
>> .fields = (VMStateField[]) {
>> VMSTATE_STRUCT_ARRAY(chn, ESCCState, 2, 2, vmstate_escc_chn,
>> - ChannelState),
>> + ESCCChannelState),
>> VMSTATE_END_OF_LIST()
>> }
>> };
>> -MemoryRegion *escc_init(hwaddr base, qemu_irq irqA, qemu_irq irqB,
>> - Chardev *chrA, Chardev *chrB,
>> - int clock, int it_shift)
>> -{
>> - DeviceState *dev;
>> - SysBusDevice *s;
>> - ESCCState *d;
>> -
>> - dev = qdev_create(NULL, TYPE_ESCC);
>> - qdev_prop_set_uint32(dev, "disabled", 0);
>> - qdev_prop_set_uint32(dev, "frequency", clock);
>> - qdev_prop_set_uint32(dev, "it_shift", it_shift);
>> - qdev_prop_set_chr(dev, "chrB", chrB);
>> - qdev_prop_set_chr(dev, "chrA", chrA);
>> - qdev_prop_set_uint32(dev, "chnBtype", ser);
>> - qdev_prop_set_uint32(dev, "chnAtype", ser);
>> - qdev_init_nofail(dev);
>> - s = SYS_BUS_DEVICE(dev);
>> - sysbus_connect_irq(s, 0, irqB);
>> - sysbus_connect_irq(s, 1, irqA);
>> - if (base) {
>> - sysbus_mmio_map(s, 0, base);
>> - }
>> -
>> - d = ESCC(s);
>> - return &d->mmio;
>> -}
>> -
>> static const uint8_t qcode_to_keycode[Q_KEY_CODE__MAX] = {
>> [Q_KEY_CODE_SHIFT] = 99,
>> [Q_KEY_CODE_SHIFT_R] = 110,
>> @@ -841,7 +768,7 @@ static const uint8_t
>> qcode_to_keycode[Q_KEY_CODE__MAX] = {
>> static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src,
>> InputEvent *evt)
>> {
>> - ChannelState *s = (ChannelState *)dev;
>> + ESCCChannelState *s = (ESCCChannelState *)dev;
>> int qcode, keycode;
>> InputKeyEvent *key;
>> @@ -893,7 +820,7 @@ static QemuInputHandler sunkbd_handler = {
>> .event = sunkbd_handle_event,
>> };
>> -static void handle_kbd_command(ChannelState *s, int val)
>> +static void handle_kbd_command(ESCCChannelState *s, int val)
>> {
>> trace_escc_kbd_command(val);
>> if (s->led_mode) { // Ignore led byte
>> @@ -924,7 +851,7 @@ static void handle_kbd_command(ChannelState *s,
>> int val)
>> static void sunmouse_event(void *opaque,
>> int dx, int dy, int dz, int
>> buttons_state)
>> {
>> - ChannelState *s = opaque;
>> + ESCCChannelState *s = opaque;
>> int ch;
>> trace_escc_sunmouse_event(dx, dy, buttons_state);
>> @@ -963,27 +890,6 @@ static void sunmouse_event(void *opaque,
>> put_queue(s, 0);
>> }
>> -void slavio_serial_ms_kbd_init(hwaddr base, qemu_irq irq,
>> - int disabled, int clock, int it_shift)
>> -{
>> - DeviceState *dev;
>> - SysBusDevice *s;
>> -
>> - dev = qdev_create(NULL, TYPE_ESCC);
>> - qdev_prop_set_uint32(dev, "disabled", disabled);
>> - qdev_prop_set_uint32(dev, "frequency", clock);
>> - qdev_prop_set_uint32(dev, "it_shift", it_shift);
>> - qdev_prop_set_chr(dev, "chrB", NULL);
>> - qdev_prop_set_chr(dev, "chrA", NULL);
>> - qdev_prop_set_uint32(dev, "chnBtype", mouse);
>> - qdev_prop_set_uint32(dev, "chnAtype", kbd);
>> - qdev_init_nofail(dev);
>> - s = SYS_BUS_DEVICE(dev);
>> - sysbus_connect_irq(s, 0, irq);
>> - sysbus_connect_irq(s, 1, irq);
>> - sysbus_mmio_map(s, 0, base);
>> -}
>> -
>> static void escc_init1(Object *obj)
>> {
>> ESCCState *s = ESCC(obj);
>> @@ -1020,11 +926,11 @@ static void escc_realize(DeviceState *dev,
>> Error **errp)
>> }
>> }
>> - if (s->chn[0].type == mouse) {
>> + if (s->chn[0].type == escc_mouse) {
>> qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
>> "QEMU Sun Mouse");
>> }
>> - if (s->chn[1].type == kbd) {
>> + if (s->chn[1].type == escc_kbd) {
>> s->chn[1].hs = qemu_input_handler_register((DeviceState
>> *)(&s->chn[1]),
>> &sunkbd_handler);
>> }
>> diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
>> index 3fa7c429d5..de061ae76f 100644
>> --- a/hw/ppc/mac_newworld.c
>> +++ b/hw/ppc/mac_newworld.c
>> @@ -369,8 +369,23 @@ static void ppc_core99_init(MachineState *machine)
>> }
>> /* init basic PC hardware */
>> - escc_mem = escc_init(0, pic[0x25], pic[0x24],
>> - serial_hds[0], serial_hds[1], ESCC_CLOCK, 4);
>> +
>> + dev = qdev_create(NULL, TYPE_ESCC);
>> + qdev_prop_set_uint32(dev, "disabled", 0);
>> + qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
>> + qdev_prop_set_uint32(dev, "it_shift", 4);
>> + qdev_prop_set_chr(dev, "chrA", serial_hds[0]);
>> + qdev_prop_set_chr(dev, "chrB", serial_hds[1]);
>> + qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
>> + qdev_prop_set_uint32(dev, "chnBtype", escc_serial);
>> + qdev_init_nofail(dev);
>> +
>> + s = SYS_BUS_DEVICE(dev);
>> + sysbus_connect_irq(s, 0, pic[0x24]);
>> + sysbus_connect_irq(s, 1, pic[0x25]);
>> +
>> + escc_mem = &ESCC(s)->mmio;
>> +
>> memory_region_init_alias(escc_bar, NULL, "escc-bar",
>> escc_mem, 0,
>> memory_region_size(escc_mem));
>> diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
>> index 010ea36bf2..da0106b09d 100644
>> --- a/hw/ppc/mac_oldworld.c
>> +++ b/hw/ppc/mac_oldworld.c
>> @@ -104,6 +104,7 @@ static void ppc_heathrow_init(MachineState *machine)
>> DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
>> void *fw_cfg;
>> uint64_t tbfreq;
>> + SysBusDevice *s;
>> linux_boot = (kernel_filename != NULL);
>> @@ -264,8 +265,22 @@ static void ppc_heathrow_init(MachineState
>> *machine)
>> get_system_io());
>> pci_vga_init(pci_bus);
>> - escc_mem = escc_init(0, pic[0x0f], pic[0x10], serial_hds[0],
>> - serial_hds[1], ESCC_CLOCK, 4);
>> + dev = qdev_create(NULL, TYPE_ESCC);
>> + qdev_prop_set_uint32(dev, "disabled", 0);
>> + qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
>> + qdev_prop_set_uint32(dev, "it_shift", 4);
>> + qdev_prop_set_chr(dev, "chrA", serial_hds[0]);
>> + qdev_prop_set_chr(dev, "chrB", serial_hds[1]);
>> + qdev_prop_set_uint32(dev, "chnBtype", escc_serial);
>> + qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
>> + qdev_init_nofail(dev);
>> +
>> + s = SYS_BUS_DEVICE(dev);
>> + sysbus_connect_irq(s, 0, pic[0x10]);
>> + sysbus_connect_irq(s, 1, pic[0x0f]);
>> +
>> + escc_mem = &ESCC(s)->mmio;
>> +
>> memory_region_init_alias(escc_bar, NULL, "escc-bar",
>> escc_mem, 0,
>> memory_region_size(escc_mem));
>> diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
>> index dd0038095b..0b3911cd65 100644
>> --- a/hw/sparc/sun4m.c
>> +++ b/hw/sparc/sun4m.c
>> @@ -820,6 +820,8 @@ static void sun4m_hw_init(const struct sun4m_hwdef
>> *hwdef,
>> DriveInfo *fd[MAX_FD];
>> FWCfgState *fw_cfg;
>> unsigned int num_vsimms;
>> + DeviceState *dev;
>> + SysBusDevice *s;
>> /* init CPUs */
>> for(i = 0; i < smp_cpus; i++) {
>> @@ -927,12 +929,36 @@ static void sun4m_hw_init(const struct
>> sun4m_hwdef *hwdef,
>> slavio_timer_init_all(hwdef->counter_base, slavio_irq[19],
>> slavio_cpu_irq, smp_cpus);
>> - slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[14],
>> - !machine->enable_graphics, ESCC_CLOCK, 1);
>> /* Slavio TTYA (base+4, Linux ttyS0) is the first QEMU serial
>> device
>> Slavio TTYB (base+0, Linux ttyS1) is the second QEMU serial
>> device */
>> - escc_init(hwdef->serial_base, slavio_irq[15], slavio_irq[15],
>> - serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
>> + dev = qdev_create(NULL, TYPE_ESCC);
>> + qdev_prop_set_uint32(dev, "disabled", !machine->enable_graphics);
>> + qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
>> + qdev_prop_set_uint32(dev, "it_shift", 1);
>> + qdev_prop_set_chr(dev, "chrB", NULL);
>> + qdev_prop_set_chr(dev, "chrA", NULL);
>> + qdev_prop_set_uint32(dev, "chnBtype", escc_mouse);
>> + qdev_prop_set_uint32(dev, "chnAtype", escc_kbd);
>> + qdev_init_nofail(dev);
>> + s = SYS_BUS_DEVICE(dev);
>> + sysbus_connect_irq(s, 0, slavio_irq[14]);
>> + sysbus_connect_irq(s, 1, slavio_irq[14]);
>> + sysbus_mmio_map(s, 0, hwdef->ms_kb_base);
>> +
>> + dev = qdev_create(NULL, TYPE_ESCC);
>> + qdev_prop_set_uint32(dev, "disabled", 0);
>> + qdev_prop_set_uint32(dev, "frequency", ESCC_CLOCK);
>> + qdev_prop_set_uint32(dev, "it_shift", 1);
>> + qdev_prop_set_chr(dev, "chrB", serial_hds[1]);
>> + qdev_prop_set_chr(dev, "chrA", serial_hds[0]);
>> + qdev_prop_set_uint32(dev, "chnBtype", escc_serial);
>> + qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
>> + qdev_init_nofail(dev);
>> +
>> + s = SYS_BUS_DEVICE(dev);
>> + sysbus_connect_irq(s, 0, slavio_irq[15]);
>> + sysbus_connect_irq(s, 1, slavio_irq[15]);
>> + sysbus_mmio_map(s, 0, hwdef->serial_base);
>> if (hwdef->apc_base) {
>> apc_init(hwdef->apc_base, qemu_allocate_irq(cpu_halt_signal,
>> NULL, 0));
>> diff --git a/include/hw/char/escc.h b/include/hw/char/escc.h
>> index 08ae122386..42aca83611 100644
>> --- a/include/hw/char/escc.h
>> +++ b/include/hw/char/escc.h
>> @@ -1,14 +1,58 @@
>> #ifndef HW_ESCC_H
>> #define HW_ESCC_H
>> +#include "chardev/char-fe.h"
>> +#include "chardev/char-serial.h"
>> +#include "ui/input.h"
>> +
>> /* escc.c */
>> #define TYPE_ESCC "escc"
>> #define ESCC_SIZE 4
>> -MemoryRegion *escc_init(hwaddr base, qemu_irq irqA, qemu_irq irqB,
>> - Chardev *chrA, Chardev *chrB,
>> - int clock, int it_shift);
>> -void slavio_serial_ms_kbd_init(hwaddr base, qemu_irq irq,
>> - int disabled, int clock, int it_shift);
>> +#define ESCC(obj) OBJECT_CHECK(ESCCState, (obj), TYPE_ESCC)
>> +
>> +typedef enum {
>> + escc_chn_a, escc_chn_b,
>> +} ESCCChnID;
>> +
>> +typedef enum {
>> + escc_serial, escc_kbd, escc_mouse,
>> +} ESCCChnType;
>> +
>> +#define ESCC_SERIO_QUEUE_SIZE 256
>> +
>> +typedef struct {
>> + uint8_t data[ESCC_SERIO_QUEUE_SIZE];
>> + int rptr, wptr, count;
>> +} ESCCSERIOQueue;
>> +
>> +#define ESCC_SERIAL_REGS 16
>> +typedef struct ESCCChannelState {
>> + qemu_irq irq;
>> + uint32_t rxint, txint, rxint_under_svc, txint_under_svc;
>> + struct ESCCChannelState *otherchn;
>> + uint32_t reg;
>> + uint8_t wregs[ESCC_SERIAL_REGS], rregs[ESCC_SERIAL_REGS];
>> + ESCCSERIOQueue queue;
>> + CharBackend chr;
>> + int e0_mode, led_mode, caps_lock_mode, num_lock_mode;
>> + int disabled;
>> + int clock;
>> + uint32_t vmstate_dummy;
>> + ESCCChnID chn; /* this channel, A (base+4) or B (base+0) */
>> + ESCCChnType type;
>> + uint8_t rx, tx;
>> + QemuInputHandlerState *hs;
>> +} ESCCChannelState;
>> +
>> +typedef struct ESCCState {
>> + SysBusDevice parent_obj;
>> +
>> + struct ESCCChannelState chn[2];
>> + uint32_t it_shift;
>> + MemoryRegion mmio;
>> + uint32_t disabled;
>> + uint32_t frequency;
>> +} ESCCState;
>> #endif
>
> Looks good to me. Note to self: I wonder how easy it would be to split
> the sun keyboard/mouse out from here too.
>
> Reviewed-by: Mark Cave-Ayland <address@hidden>
>
>
> ATB,
>
> Mark.