qemu-devel
[Top][All Lists]
Advanced

[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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]