mirror of https://gitee.com/openkylin/qemu.git
Add (virtual) interrupt to PAPR virtual tty device
Now that we have implemented the PAPR "xics" virtualized interrupt controller, we can add interrupts in PAPR VIO devices. This patch adds interrupt support to the PAPR virtual tty/console device. Signed-off-by: David Gibson <dwg@au1.ibm.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
00dc738d8a
commit
0201e2da65
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue