From nobody Tue Nov 18 09:21:18 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1608463721; cv=none; d=zohomail.com; s=zohoarc; b=f3jL4YOarKn0uyDhfiFFnjPa6HLDqftAdcDuqb4v7MjtIVEfXPLyaADHWol9Kc2Afe2+oyRmZ0W3nq9A5/1GFZnhZCUtnQ5flQqpu3VyL24CE2/GzXmxhatnJEWY9thNRAD8lSOeYO1TibvzB2S8Tv3HVzUDpMkmUqQfkptoC8A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1608463721; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=IaI18n+ZodCE+rhR4G1smeBbmgkwAPCdzoRRz6yCP/Q=; b=g8KsEaaGwtAbWcAwxYZX6M2JhOCX7otTBO55knjvw0ozBDqmJRCSSz62Ecd0M9em1oZ4XvT6DN96LO3G+3e7n4ddb7Maz41TQzLFd6VGCLURH8QMjsUhxW/F6sdzDAztCH3nEsi9ZhLX0OdoMB45jtLmeIJ7Y/6mdgS7k0GaAFM= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1608463721110726.1551102803479; Sun, 20 Dec 2020 03:28:41 -0800 (PST) Received: from localhost ([::1]:44132 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kqwtE-0006qS-2r for importer@patchew.org; Sun, 20 Dec 2020 06:28:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55108) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kqwr5-00059s-JS for qemu-devel@nongnu.org; Sun, 20 Dec 2020 06:26:27 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:53841) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kqwr2-0005Rm-EF for qemu-devel@nongnu.org; Sun, 20 Dec 2020 06:26:27 -0500 Received: from localhost.localdomain ([82.252.144.198]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1Mk1BG-1kOSfN1TgG-00kNt3; Sun, 20 Dec 2020 12:26:21 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PATCH v2 4/7] m68k: add an interrupt controller Date: Sun, 20 Dec 2020 12:26:12 +0100 Message-Id: <20201220112615.933036-5-laurent@vivier.eu> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201220112615.933036-1-laurent@vivier.eu> References: <20201220112615.933036-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:Q7zkfA2qGXbJa+X9GJZIyepJH3IpU+/zX7ZZ2oruBdLmFPMwm6P 1vQbFyw5TwoHy3LNxmbwLqC4UmIC6qO6wbE7SQSpQ81xEV/VvNWYF4IoOQ4Q30N+i3JTm+a s63FAKK9B5UdFUqWnh6P2GLnpL/EyUd2t46aGCiQuQ7b9zp7y01E9/OYtW1c+Cr6B1XoPF6 Nvbq6n24H/o+fThqGmBQQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:N6um2z0FUl8=:tG1sZ+4xSLeYnIhzPqU28T Xkadi7YRsnlj75ndGaiN4e6V0eUJzGqUc0Sx+cJyfsFzTNCOw3EZtt9lBcyLPkPIsFvUnB+vF f+wbiCNeHAGcUM+zC+50C29aJRQqJid6qwOgMWkZ3OBxKcyVSRlSjaBXgqcTEd0c+RVg2T1kW D+N41+ougqZAjjli9Z0P7+Q5NOAekFkADFj1aUzEsIqukoqUa+pbCGbbKRpK5fdXWR9BBUcCx VhFB8kgUWaUYP/sDDNYUxLE2RmpR2s5F9a7GaOO71PdrIvBR4EMSIkFVq30IhICrCzwVhUGOJ da5ULWRj6UFtortYQPggszXAq7vec2RrPuLzMbF9yrk5ZPg62mpSwwcJ/w5Nt0CAxOGlYy93A oxZ2zbe1FCCXBo46fRvHwg2Z/ybEeGiTOroogMJUFnjW270jh8atK479zbQsrilSil3tmh1us NsxeKySp2w== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none client-ip=217.72.192.75; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Laurent Vivier --- include/hw/intc/m68k_irqc.h | 28 +++++++++ hw/intc/m68k_irqc.c | 120 ++++++++++++++++++++++++++++++++++++ hw/intc/Kconfig | 3 + hw/intc/meson.build | 1 + 4 files changed, 152 insertions(+) create mode 100644 include/hw/intc/m68k_irqc.h create mode 100644 hw/intc/m68k_irqc.c diff --git a/include/hw/intc/m68k_irqc.h b/include/hw/intc/m68k_irqc.h new file mode 100644 index 000000000000..c40b1b4df8fa --- /dev/null +++ b/include/hw/intc/m68k_irqc.h @@ -0,0 +1,28 @@ +/* + * SPDX-License-Identifer: GPL-2.0-or-later + * + * QEMU Motorla 680x0 IRQ Controller + * + * (c) 2020 Laurent Vivier + * + */ + +#ifndef M68K_IRQC_H +#define M68K_IRQC_H + +#include "hw/sysbus.h" + +#define TYPE_M68K_IRQC "m68k-irq-controller" +#define M68K_IRQC(obj) OBJECT_CHECK(M68KIRQCState, (obj), \ + TYPE_M68K_IRQC) + +typedef struct M68KIRQCState { + SysBusDevice parent_obj; + + uint8_t ipr; + + /* statistics */ + uint64_t stats_irq_count[7]; +} M68KIRQCState; + +#endif diff --git a/hw/intc/m68k_irqc.c b/hw/intc/m68k_irqc.c new file mode 100644 index 000000000000..bc68d8fe084a --- /dev/null +++ b/hw/intc/m68k_irqc.c @@ -0,0 +1,120 @@ +/* + * SPDX-License-Identifer: GPL-2.0-or-later + * + * QEMU Motorla 680x0 IRQ Controller + * + * (c) 2020 Laurent Vivier + * + */ + +#include "qemu/osdep.h" +#include "cpu.h" +#include "migration/vmstate.h" +#include "monitor/monitor.h" +#include "hw/nmi.h" +#include "hw/intc/intc.h" +#include "hw/intc/m68k_irqc.h" + + +static bool m68k_irqc_get_statistics(InterruptStatsProvider *obj, + uint64_t **irq_counts, unsigned int *= nb_irqs) +{ + M68KIRQCState *s =3D M68K_IRQC(obj); + + *irq_counts =3D s->stats_irq_count; + *nb_irqs =3D ARRAY_SIZE(s->stats_irq_count); + return true; +} + +static void m68k_irqc_print_info(InterruptStatsProvider *obj, Monitor *mon) +{ + M68KIRQCState *s =3D M68K_IRQC(obj); + monitor_printf(mon, "m68k-irqc: ipr=3D0x%x\n", s->ipr); +} + +static void m68k_set_irq(void *opaque, int irq, int level) +{ + M68KIRQCState *s =3D opaque; + M68kCPU *cpu =3D M68K_CPU(first_cpu); + int i; + + + if (level) { + s->ipr |=3D 1 << irq; + s->stats_irq_count[irq]++; + } else { + s->ipr &=3D ~(1 << irq); + } + + for (i =3D 7; i >=3D 0; i--) { + if ((s->ipr >> i) & 1) { + m68k_set_irq_level(cpu, i + 1, i + 25); + return; + } + } + m68k_set_irq_level(cpu, 0, 0); +} + +static void m68k_irqc_reset(DeviceState *d) +{ + M68KIRQCState *s =3D M68K_IRQC(d); + int i; + + s->ipr =3D 0; + for (i =3D 0; i < ARRAY_SIZE(s->stats_irq_count); i++) { + s->stats_irq_count[i] =3D 0; + } +} + +static void m68k_irqc_instance_init(Object *obj) +{ + qdev_init_gpio_in(DEVICE(obj), m68k_set_irq, 8); +} + +static void m68k_nmi(NMIState *n, int cpu_index, Error **errp) +{ + m68k_set_irq(n, 6, 1); +} + +static const VMStateDescription vmstate_m68k_irqc =3D { + .name =3D "m68k-irqc", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT8(ipr, M68KIRQCState), + VMSTATE_END_OF_LIST() + } +}; + +static void m68k_irqc_class_init(ObjectClass *oc, void *data) + { + DeviceClass *dc =3D DEVICE_CLASS(oc); + NMIClass *nc =3D NMI_CLASS(oc); + InterruptStatsProviderClass *ic =3D INTERRUPT_STATS_PROVIDER_CLASS(oc); + + nc->nmi_monitor_handler =3D m68k_nmi; + dc->reset =3D m68k_irqc_reset; + dc->vmsd =3D &vmstate_m68k_irqc; + ic->get_statistics =3D m68k_irqc_get_statistics; + ic->print_info =3D m68k_irqc_print_info; +} + +static const TypeInfo m68k_irqc_type_info =3D { + .name =3D TYPE_M68K_IRQC, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(M68KIRQCState), + .instance_init =3D m68k_irqc_instance_init, + .class_init =3D m68k_irqc_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_NMI }, + { TYPE_INTERRUPT_STATS_PROVIDER }, + { } + }, +}; + +static void q800_irq_register_types(void) +{ + type_register_static(&m68k_irqc_type_info); +} + +type_init(q800_irq_register_types); diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig index 7ed79e7ac29f..318d76c7cb52 100644 --- a/hw/intc/Kconfig +++ b/hw/intc/Kconfig @@ -76,3 +76,6 @@ config SIFIVE_PLIC =20 config GOLDFISH_PIC bool + +config M68K_IRQC + bool diff --git a/hw/intc/meson.build b/hw/intc/meson.build index 8a5dfe4289ae..81bd0191f9cd 100644 --- a/hw/intc/meson.build +++ b/hw/intc/meson.build @@ -55,3 +55,4 @@ specific_ss.add(when: 'CONFIG_XIVE', if_true: files('xive= .c')) specific_ss.add(when: 'CONFIG_XIVE_KVM', if_true: files('spapr_xive_kvm.c'= )) specific_ss.add(when: 'CONFIG_XIVE_SPAPR', if_true: files('spapr_xive.c')) specific_ss.add(when: 'CONFIG_GOLDFISH_PIC', if_true: files('goldfish_pic.= c')) +specific_ss.add(when: 'CONFIG_M68K_IRQC', if_true: files('m68k_irqc.c')) --=20 2.29.2