Hi,

can a maintainer of one of the involved parts take this in his
maintenance branch to have this merged?

Thanks,
Laurent

On 29/01/2018 15:21, Laurent Vivier wrote:
> 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 <lviv...@redhat.com>
>>> Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
>>> ---
>>>
>>> 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 <mark.cave-ayl...@ilande.co.uk>
>>
>>
>> ATB,
>>
>> Mark.
> 
> 


Reply via email to