From nobody Tue Feb 10 23:01:41 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507906743405343.1646599995282; Fri, 13 Oct 2017 07:59:03 -0700 (PDT) Received: from localhost ([::1]:50660 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e31QL-0007Yv-Eg for importer@patchew.org; Fri, 13 Oct 2017 10:58:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48619) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e31Ov-0006hT-Ez for qemu-devel@nongnu.org; Fri, 13 Oct 2017 10:57:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e31Ou-00048Q-5L for qemu-devel@nongnu.org; Fri, 13 Oct 2017 10:57:25 -0400 Received: from mail-pf0-x244.google.com ([2607:f8b0:400e:c00::244]:45292) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1e31Ot-00046p-U3 for qemu-devel@nongnu.org; Fri, 13 Oct 2017 10:57:24 -0400 Received: by mail-pf0-x244.google.com with SMTP id d28so10597557pfe.2 for ; Fri, 13 Oct 2017 07:57:23 -0700 (PDT) Received: from localhost (g248.61-45-56.ppp.wakwak.ne.jp. [61.45.56.248]) by smtp.gmail.com with ESMTPSA id x26sm3208431pfh.95.2017.10.13.07.57.20 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 13 Oct 2017 07:57:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=tZxa5m+hHTLQrNdGoE1qNPapFEDQOZhLpBXUdtSd2Fk=; b=pOrge1AWmmEcJzbXXYTVURSsSCOftx8BNHiUXcoP5EGqgSPZskK/9fmJKMUwbM3m1u D3qsXsTJUYlPFOlPzxBMFAIkI0hJIvLVuzvSO4ogeM44I4NurOc8iphEKgODltL40Iyd b0JdN2IdHZ4HGPSXNe8TgbIosPvB8zqHqGWjQxOVW/9yZ1eh7hK9BJz4e5A9gAo1Mn93 XX5JHd2y7T1X7M6Cjxm0Hn/NFolBzHeAvWF6QEHwLquOV9pO+6O79aEphM5HsJ1HLBo2 3CLHdke4mCzSESykh2YyB2n6V7MUNs1Jb8ytTUM9gEjefcmP4bGy4wjYr/1AZ058nDit O3Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tZxa5m+hHTLQrNdGoE1qNPapFEDQOZhLpBXUdtSd2Fk=; b=MhRt3EqX8YAyWneaO4UofzhPPcR0GOQyyWMzx4hIFJAwvqMuYhSnviZ5wv4V3ja7sB P2FSz6Ya+uLGcjciAS+X0brimhcskxQ4+WZqiXw8Gk5/66wniEWByLIHOjYOqRz4sHR5 iTaKoB/1BzzSmSlO5o2mvxuG9WcyPeuslBdHsh5JMdTPQT7/93LmBauSBVeduUPZ1a3q 9GQ9wv0D0cXMZ15ZSXXLqfTHS8gjcFFNmqQj0kNzii9Klwr/dUE5dpEbAV+S2uUIb4B6 sD6jEGt+xwICt/eqLD2EWgl1/T0Wk6jpjoCl1BKrsC8KJN0kh2hMhgM4sa18YbGqThjv 5Hzw== X-Gm-Message-State: AMCzsaXgV0ukZcZTMHavPYXUZCAeMhp1Z184N9fYHcXn+VPlRKEb5OZf T6frOt8oA4MOmk+eyt4XnsBXAMhq X-Google-Smtp-Source: AOwi7QDNVi/OTX0c23a0c7EYGMepJQRt8IeXb+OxouGX8MGlBMcOtFZwEd1vplaOeR6j1aGk/rKcfw== X-Received: by 10.159.197.66 with SMTP id d2mr1646237plo.130.1507906642812; Fri, 13 Oct 2017 07:57:22 -0700 (PDT) From: Stafford Horne To: QEMU Development Date: Fri, 13 Oct 2017 23:57:10 +0900 Message-Id: <20171013145714.2740-2-shorne@gmail.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171013145714.2740-1-shorne@gmail.com> References: <20171013145714.2740-1-shorne@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::244 Subject: [Qemu-devel] [PULL 1/5] openrisc/ompic: Add OpenRISC Multicore PIC (OMPIC) X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stafford Horne Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add OpenRISC Multicore PIC which handles inter processor interrupts (IPI) between cores. In OpenRISC all device interrupts are routed to each core enabling this device to be simple. Reviewed-by: Richard Henderson Signed-off-by: Stafford Horne --- default-configs/or1k-softmmu.mak | 1 + hw/intc/Makefile.objs | 1 + hw/intc/ompic.c | 179 +++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 181 insertions(+) create mode 100644 hw/intc/ompic.c diff --git a/default-configs/or1k-softmmu.mak b/default-configs/or1k-softmm= u.mak index 10bfa7abb8..6f5824fd48 100644 --- a/default-configs/or1k-softmmu.mak +++ b/default-configs/or1k-softmmu.mak @@ -2,3 +2,4 @@ =20 CONFIG_SERIAL=3Dy CONFIG_OPENCORES_ETH=3Dy +CONFIG_OMPIC=3Dy diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs index 78426a7daf..ae358569a1 100644 --- a/hw/intc/Makefile.objs +++ b/hw/intc/Makefile.objs @@ -43,3 +43,4 @@ obj-$(CONFIG_ASPEED_SOC) +=3D aspeed_vic.o obj-$(CONFIG_ARM_GIC) +=3D arm_gicv3_cpuif.o obj-$(CONFIG_MIPS_CPS) +=3D mips_gic.o obj-$(CONFIG_NIOS2) +=3D nios2_iic.o +obj-$(CONFIG_OMPIC) +=3D ompic.o diff --git a/hw/intc/ompic.c b/hw/intc/ompic.c new file mode 100644 index 0000000000..c0e34d1268 --- /dev/null +++ b/hw/intc/ompic.c @@ -0,0 +1,179 @@ +/* + * This file is subject to the terms and conditions of the GNU General Pub= lic + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Authors: Stafford Horne + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "hw/hw.h" +#include "hw/sysbus.h" +#include "exec/memory.h" + +#define TYPE_OR1K_OMPIC "or1k-ompic" +#define OR1K_OMPIC(obj) OBJECT_CHECK(OR1KOMPICState, (obj), TYPE_OR1K_OMPI= C) + +#define OMPIC_CTRL_IRQ_ACK (1 << 31) +#define OMPIC_CTRL_IRQ_GEN (1 << 30) +#define OMPIC_CTRL_DST(cpu) (((cpu) >> 16) & 0x3fff) + +#define OMPIC_REG(addr) (((addr) >> 2) & 0x1) +#define OMPIC_SRC_CPU(addr) (((addr) >> 3) & 0x4f) +#define OMPIC_DST_CPU(addr) (((addr) >> 3) & 0x4f) + +#define OMPIC_STATUS_IRQ_PENDING (1 << 30) +#define OMPIC_STATUS_SRC(cpu) (((cpu) & 0x3fff) << 16) +#define OMPIC_STATUS_DATA(data) ((data) & 0xffff) + +#define OMPIC_CONTROL 0 +#define OMPIC_STATUS 1 + +#define OMPIC_MAX_CPUS 4 /* Real max is much higher, but dont waste memory= */ +#define OMPIC_ADDRSPACE_SZ (OMPIC_MAX_CPUS * 2 * 4) /* 2 32-bit regs per c= pu */ + +typedef struct OR1KOMPICState OR1KOMPICState; +typedef struct OR1KOMPICCPUState OR1KOMPICCPUState; + +struct OR1KOMPICCPUState { + qemu_irq irq; + uint32_t status; + uint32_t control; +}; + +struct OR1KOMPICState { + SysBusDevice parent_obj; + MemoryRegion mr; + + OR1KOMPICCPUState cpus[OMPIC_MAX_CPUS]; + + uint32_t num_cpus; +}; + +static uint64_t ompic_read(void *opaque, hwaddr addr, unsigned size) +{ + OR1KOMPICState *s =3D opaque; + int src_cpu =3D OMPIC_SRC_CPU(addr); + + /* We can only write to control control, write control + update status= */ + if (OMPIC_REG(addr) =3D=3D OMPIC_CONTROL) { + return s->cpus[src_cpu].control; + } else { + return s->cpus[src_cpu].status; + } + +} + +static void ompic_write(void *opaque, hwaddr addr, uint64_t data, unsigned= size) +{ + OR1KOMPICState *s =3D opaque; + /* We can only write to control control, write control + update status= */ + if (OMPIC_REG(addr) =3D=3D OMPIC_CONTROL) { + int src_cpu =3D OMPIC_SRC_CPU(addr); + + s->cpus[src_cpu].control =3D data; + + if (data & OMPIC_CTRL_IRQ_GEN) { + int dst_cpu =3D OMPIC_CTRL_DST(data); + + s->cpus[dst_cpu].status =3D OMPIC_STATUS_IRQ_PENDING | + OMPIC_STATUS_SRC(src_cpu) | + OMPIC_STATUS_DATA(data); + + qemu_irq_raise(s->cpus[dst_cpu].irq); + } + if (data & OMPIC_CTRL_IRQ_ACK) { + s->cpus[src_cpu].status &=3D ~OMPIC_STATUS_IRQ_PENDING; + qemu_irq_lower(s->cpus[src_cpu].irq); + } + } +} + +static const MemoryRegionOps ompic_ops =3D { + .read =3D ompic_read, + .write =3D ompic_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, + .impl =3D { + .max_access_size =3D 8, + }, +}; + +static void or1k_ompic_init(Object *obj) +{ + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + OR1KOMPICState *s =3D OR1K_OMPIC(obj); + + memory_region_init_io(&s->mr, OBJECT(s), &ompic_ops, s, + "or1k-ompic", OMPIC_ADDRSPACE_SZ); + sysbus_init_mmio(sbd, &s->mr); +} + +static void or1k_ompic_realize(DeviceState *dev, Error **errp) +{ + OR1KOMPICState *s =3D OR1K_OMPIC(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + int i; + + if (s->num_cpus > OMPIC_MAX_CPUS) { + error_setg(errp, "Exceeded maximum CPUs %d", s->num_cpus); + return; + } + /* Init IRQ sources for all CPUs */ + for (i =3D 0; i < s->num_cpus; i++) { + sysbus_init_irq(sbd, &s->cpus[i].irq); + } +} + +static Property or1k_ompic_properties[] =3D { + DEFINE_PROP_UINT32("num-cpus", OR1KOMPICState, num_cpus, 1), + DEFINE_PROP_END_OF_LIST(), +}; + +static const VMStateDescription vmstate_or1k_ompic_cpu =3D { + .name =3D "or1k_ompic_cpu", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(status, OR1KOMPICCPUState), + VMSTATE_UINT32(control, OR1KOMPICCPUState), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_or1k_ompic =3D { + .name =3D TYPE_OR1K_OMPIC, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_STRUCT_ARRAY(cpus, OR1KOMPICState, OMPIC_MAX_CPUS, 1, + vmstate_or1k_ompic_cpu, OR1KOMPICCPUState), + VMSTATE_UINT32(num_cpus, OR1KOMPICState), + VMSTATE_END_OF_LIST() + } +}; + +static void or1k_ompic_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->props =3D or1k_ompic_properties; + dc->realize =3D or1k_ompic_realize; + dc->vmsd =3D &vmstate_or1k_ompic; +} + +static const TypeInfo or1k_ompic_info =3D { + .name =3D TYPE_OR1K_OMPIC, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(OR1KOMPICState), + .instance_init =3D or1k_ompic_init, + .class_init =3D or1k_ompic_class_init, +}; + +static void or1k_ompic_register_types(void) +{ + type_register_static(&or1k_ompic_info); +} + +type_init(or1k_ompic_register_types) --=20 2.13.6