From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48055) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YlCpS-0005ew-LD for qemu-devel@nongnu.org; Thu, 23 Apr 2015 04:49:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YlCpO-0001wk-SZ for qemu-devel@nongnu.org; Thu, 23 Apr 2015 04:49:50 -0400 Received: from mail-wi0-f173.google.com ([209.85.212.173]:38367) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YlCpO-0001wX-Mz for qemu-devel@nongnu.org; Thu, 23 Apr 2015 04:49:46 -0400 Received: by wiun10 with SMTP id n10so84441776wiu.1 for ; Thu, 23 Apr 2015 01:49:45 -0700 (PDT) From: Eric Auger Date: Thu, 23 Apr 2015 09:49:36 +0100 Message-Id: <1429778977-1632-2-git-send-email-eric.auger@linaro.org> In-Reply-To: <1429778977-1632-1-git-send-email-eric.auger@linaro.org> References: <1429778977-1632-1-git-send-email-eric.auger@linaro.org> Subject: [Qemu-devel] [PATCH 1/2] irq: add get_gsi callback List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: eric.auger@st.com, eric.auger@linaro.org, qemu-devel@nongnu.org, alex.williamson@redhat.com, peter.maydell@linaro.org, agraf@suse.de, pbonzini@redhat.com Cc: kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, patches@linaro.org Add a new IRQState get_gsi_cb field, corresponding to a callback that transforms the interrupt controller pin number into a global system interrupt number. A setter is introduced for the interrupt controller to populate the callback. Also add a public function that calls this callback. Signed-off-by: Eric Auger --- hw/core/irq.c | 20 ++++++++++++++++++++ include/hw/irq.h | 8 ++++++++ 2 files changed, 28 insertions(+) diff --git a/hw/core/irq.c b/hw/core/irq.c index 8a62a36..7eeb742 100644 --- a/hw/core/irq.c +++ b/hw/core/irq.c @@ -31,6 +31,7 @@ struct IRQState { Object parent_obj; qemu_irq_handler handler; + qemu_irq_get_gsi_t get_gsi_cb; void *opaque; int n; }; @@ -144,6 +145,25 @@ void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n) } } +int qemu_irq_set_get_gsi_cb(qemu_irq irq, qemu_irq_get_gsi_t cb) +{ + if (!irq) { + return -ENXIO; + } + + irq->get_gsi_cb = cb; + return 0; +} + +int qemu_irq_get_gsi(qemu_irq irq) +{ + if (!irq) { + return -ENXIO; + } + + return irq->get_gsi_cb(irq->n); +} + static const TypeInfo irq_type_info = { .name = TYPE_IRQ, .parent = TYPE_OBJECT, diff --git a/include/hw/irq.h b/include/hw/irq.h index 4c4c2ea..658b8f2 100644 --- a/include/hw/irq.h +++ b/include/hw/irq.h @@ -8,6 +8,7 @@ typedef struct IRQState *qemu_irq; typedef void (*qemu_irq_handler)(void *opaque, int n, int level); +typedef int (*qemu_irq_get_gsi_t)(int pin); void qemu_set_irq(qemu_irq irq, int level); @@ -62,4 +63,11 @@ qemu_irq *qemu_irq_proxy(qemu_irq **target, int n); on an existing vector of qemu_irq. */ void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n); +/* sets the get_gsi callback (function that converts the interrupt + controller pin into a global system interrupt number */ +int qemu_irq_set_get_gsi_cb(qemu_irq irq, qemu_irq_get_gsi_t cb); + +/* returns the gsi associated to a qemu_irq handle */ +int qemu_irq_get_gsi(qemu_irq irq); + #endif -- 1.8.3.2