diff options
-rw-r--r-- | hw/spapr.c | 6 | ||||
-rw-r--r-- | hw/spapr_vio.h | 3 | ||||
-rw-r--r-- | hw/spapr_vty.c | 11 |
3 files changed, 16 insertions, 4 deletions
diff --git a/hw/spapr.c b/hw/spapr.c index 200617bc7c..859cf86011 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -262,6 +262,7 @@ static void ppc_spapr_init(ram_addr_t ram_size, long pteg_shift = 17; int fdt_size; char *filename; + int irq = 16; spapr = qemu_malloc(sizeof(*spapr)); cpu_ppc_hypercall = emulate_spapr_hypercall; @@ -325,9 +326,10 @@ static void ppc_spapr_init(ram_addr_t ram_size, /* Set up VIO bus */ spapr->vio_bus = spapr_vio_bus_init(); - for (i = 0; i < MAX_SERIAL_PORTS; i++) { + for (i = 0; i < MAX_SERIAL_PORTS; i++, irq++) { if (serial_hds[i]) { - spapr_vty_create(spapr->vio_bus, i, serial_hds[i]); + spapr_vty_create(spapr->vio_bus, i, serial_hds[i], + xics_find_qirq(spapr->icp, irq), irq); } } diff --git a/hw/spapr_vio.h b/hw/spapr_vio.h index 8a000c6fe5..20139273d3 100644 --- a/hw/spapr_vio.h +++ b/hw/spapr_vio.h @@ -51,6 +51,7 @@ extern int spapr_vio_signal(VIOsPAPRDevice *dev, target_ulong mode); void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len); void spapr_vty_create(VIOsPAPRBus *bus, - uint32_t reg, CharDriverState *chardev); + uint32_t reg, CharDriverState *chardev, + qemu_irq qirq, uint32_t vio_irq_num); #endif /* _HW_SPAPR_VIO_H */ diff --git a/hw/spapr_vty.c b/hw/spapr_vty.c index b4da6a83fb..6fc0105eac 100644 --- a/hw/spapr_vty.c +++ b/hw/spapr_vty.c @@ -24,6 +24,10 @@ static void vty_receive(void *opaque, const uint8_t *buf, int size) VIOsPAPRVTYDevice *dev = (VIOsPAPRVTYDevice *)opaque; int i; + if ((dev->in == dev->out) && size) { + /* toggle line to simulate edge interrupt */ + qemu_irq_pulse(dev->sdev.qirq); + } for (i = 0; i < size; i++) { assert((dev->in - dev->out) < VTERM_BUFSIZE); dev->buf[dev->in++ % VTERM_BUFSIZE] = buf[i]; @@ -112,14 +116,19 @@ static target_ulong h_get_term_char(CPUState *env, sPAPREnvironment *spapr, } void spapr_vty_create(VIOsPAPRBus *bus, - uint32_t reg, CharDriverState *chardev) + uint32_t reg, CharDriverState *chardev, + qemu_irq qirq, uint32_t vio_irq_num) { DeviceState *dev; + VIOsPAPRDevice *sdev; dev = qdev_create(&bus->bus, "spapr-vty"); qdev_prop_set_uint32(dev, "reg", reg); qdev_prop_set_chr(dev, "chardev", chardev); qdev_init_nofail(dev); + sdev = (VIOsPAPRDevice *)dev; + sdev->qirq = qirq; + sdev->vio_irq_num = vio_irq_num; } static void vty_hcalls(VIOsPAPRBus *bus) |