From patchwork Tue Feb 15 04:56:32 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: qemu@gibson.dropbear.id.au X-Patchwork-Id: 83200 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B8592B70CC for ; Tue, 15 Feb 2011 17:57:19 +1100 (EST) Received: from localhost ([127.0.0.1]:52991 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PpDGh-0008UO-SY for incoming@patchwork.ozlabs.org; Tue, 15 Feb 2011 00:16:07 -0500 Received: from [140.186.70.92] (port=53574 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PpCyP-00009S-0A for qemu-devel@nongnu.org; Mon, 14 Feb 2011 23:57:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PpCyN-0001j4-2D for qemu-devel@nongnu.org; Mon, 14 Feb 2011 23:57:12 -0500 Received: from ozlabs.org ([203.10.76.45]:34737) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PpCyM-0001aL-LF for qemu-devel@nongnu.org; Mon, 14 Feb 2011 23:57:10 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id A32B1B7136; Tue, 15 Feb 2011 15:56:53 +1100 (EST) From: qemu@gibson.dropbear.id.au To: qemu-devel@nongnu.org Date: Tue, 15 Feb 2011 15:56:32 +1100 Message-Id: <1297745799-26148-22-git-send-email-qemu@gibson.dropbear.id.au> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1297745799-26148-1-git-send-email-qemu@gibson.dropbear.id.au> References: <1297745799-26148-1-git-send-email-qemu@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 203.10.76.45 Cc: paulus@samba.org, agraf@suse.de, anton@samba.org Subject: [Qemu-devel] [PATCH 21/28] Add (virtual)_interrupt to PAPR virtual tty device X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: David Gibson 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 --- hw/spapr.c | 6 ++++-- hw/spapr_vio.h | 3 ++- hw/spapr_vty.c | 11 ++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/hw/spapr.c b/hw/spapr.c index 5b19963..e7f8864 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -255,6 +255,7 @@ static void ppc_spapr_init(ram_addr_t ram_size, int fdt_size; sPAPREnvironment *spapr; char *filename; + int irq = 16; spapr = qemu_malloc(sizeof(*spapr)); @@ -318,9 +319,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 8a000c6..2013927 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 afc9ef9..5c2412a 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]; @@ -107,14 +111,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)