From patchwork Fri Oct 13 14:57:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stafford Horne X-Patchwork-Id: 10004985 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E7523602B3 for ; Fri, 13 Oct 2017 15:00:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D85E62907E for ; Fri, 13 Oct 2017 15:00:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CC5ED2909F; Fri, 13 Oct 2017 15:00:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DFE402907E for ; Fri, 13 Oct 2017 15:00:36 +0000 (UTC) Received: from localhost ([::1]:50665 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e31S0-0008Q8-7D for patchwork-qemu-devel@patchwork.kernel.org; Fri, 13 Oct 2017 11:00:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48749) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e31PF-0006x4-BW for qemu-devel@nongnu.org; Fri, 13 Oct 2017 10:57:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e31PD-00052Y-Uv for qemu-devel@nongnu.org; Fri, 13 Oct 2017 10:57:45 -0400 Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]:55310) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1e31PD-00050p-NF for qemu-devel@nongnu.org; Fri, 13 Oct 2017 10:57:43 -0400 Received: by mail-pf0-x242.google.com with SMTP id 17so10565684pfn.12 for ; Fri, 13 Oct 2017 07:57:43 -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=kQUr+jn02nx+3PZWPpNj/Rt3hCdwvT79bQYlRXSXpjk=; b=YQCCVA5quLgfPi8ckqFHabd2kqxVBq+6pqT1ThteKQ1lTia6IkeUmFetjUMu2RBXDk 8i0dUagW2K2XeJ5D5bFiOtsrk9lsE7O0xKbsMs4PjHKlHYS66a1LTj+4q+cHoTo7XwmZ kwEPxlXhe4zlD7/r6f9bsLyUs9wkXtmD5N7vtJ+N6ZId2C1Sn67X2BkikmT8mu4aMfZ2 Eizvt5GCvn5CkiRiopUqHPcpJf1hzgn+bOY7jVHJKDm0G8cB9eDMm8KnJLtAhtl4zDIL xeYXlH/puW1DPoKJpau5GSzd8SEGZg0HsosDZ4qyI0L01sHxj66d9r7eIyx/UcQomM5C ouiw== 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=kQUr+jn02nx+3PZWPpNj/Rt3hCdwvT79bQYlRXSXpjk=; b=hNhQ8yp04gbA1zJygLfCKDp8mMbVDi0mOb56K4Kfcln/c8nVP1rpJTy0CLzVL6qfhN z6xQ9d+oxESgJgiSLZcb82T1uzCf0WkhHNGieztzBw+AexmOTHVRfrGqq/QxLLvQiwr1 0LGRjuE2zsSdurniyiZyANfthw2q+K4cGX8yQR0IUzp9d5xiTBa/f8x2fBjfrXgfqQ3K 2CFUJhfAcSiBpwI8H4TXknAv+pk9nsUg069cy24niooohj8teahL4KVOMjuePd5OkcxR wKdoEnyJtzFhmTWYZeh07K8erEL5/UKRzguDExhnHqQtCDdszAdD9Ir7YMIbfjZFAsSG jKvQ== X-Gm-Message-State: AMCzsaXy6pDfvlTpLOAHZLopVJ3pt44T6cyjpqFIP5tCy3aLBc+Rwztm hY1PD6jA/i9m5NteMUNAMmxRwHFn X-Google-Smtp-Source: AOwi7QDxeb9XK/yqdZ0ci2Po7de6aZ/TnzO7XrT/51x+BffGLkwKd4BJkvtuseJzGiw+j0KZ+ZxBbQ== X-Received: by 10.159.234.2 with SMTP id be2mr1611369plb.125.1507906662492; Fri, 13 Oct 2017 07:57:42 -0700 (PDT) Received: from localhost (g248.61-45-56.ppp.wakwak.ne.jp. [61.45.56.248]) by smtp.gmail.com with ESMTPSA id l6sm2920393pfc.112.2017.10.13.07.57.41 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 13 Oct 2017 07:57:42 -0700 (PDT) From: Stafford Horne To: QEMU Development Date: Fri, 13 Oct 2017 23:57:13 +0900 Message-Id: <20171013145714.2740-5-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::242 Subject: [Qemu-devel] [PULL 4/5] openrisc: Initial SMP support 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Wire in ompic and add basic support for SMP. The OpenRISC is special in that interrupts for devices are routed to each core's PIC. This is achieved using the qemu_irq_split utility, but this currently limits OpenRISC to 2 cores. This models the reference architecture described in the OpenRISC spec 1.2 proposal. https://github.com/stffrdhrn/doc/raw/arch-1.2-proposal/openrisc-arch-1.2-rev0.pdf The changes to the intialization of the sim include: CPU Reset o Reset each cpu to the bootstrap PC rather than only a single cpu as done before. o During Kernel loading the bootstrap PC is saved in a static global. Network Initialization o Connect the interrupt to each CPU o Use more simple sysbus_mmio_map() rather than memory_region_add_subregion() Sim Initialization o Initialize the pic and tick timer per cpu o Wire in the OMPIC if SMP is enabled o Wire the serial irq to each CPU using qemu_irq_split() Reviewed-by: Richard Henderson Signed-off-by: Stafford Horne --- hw/openrisc/openrisc_sim.c | 84 +++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c index e1eeffc490..1794c39005 100644 --- a/hw/openrisc/openrisc_sim.c +++ b/hw/openrisc/openrisc_sim.c @@ -35,36 +35,60 @@ #define KERNEL_LOAD_ADDR 0x100 +static struct openrisc_boot_info { + uint32_t bootstrap_pc; +} boot_info; + static void main_cpu_reset(void *opaque) { OpenRISCCPU *cpu = opaque; + CPUState *cs = CPU(cpu); cpu_reset(CPU(cpu)); + + cpu_set_pc(cs, boot_info.bootstrap_pc); } -static void openrisc_sim_net_init(MemoryRegion *address_space, - hwaddr base, - hwaddr descriptors, - qemu_irq irq, NICInfo *nd) +static void openrisc_sim_net_init(hwaddr base, hwaddr descriptors, + int num_cpus, qemu_irq **cpu_irqs, + int irq_pin, NICInfo *nd) { DeviceState *dev; SysBusDevice *s; + int i; dev = qdev_create(NULL, "open_eth"); qdev_set_nic_properties(dev, nd); qdev_init_nofail(dev); s = SYS_BUS_DEVICE(dev); - sysbus_connect_irq(s, 0, irq); - memory_region_add_subregion(address_space, base, - sysbus_mmio_get_region(s, 0)); - memory_region_add_subregion(address_space, descriptors, - sysbus_mmio_get_region(s, 1)); + for (i = 0; i < num_cpus; i++) { + sysbus_connect_irq(s, 0, cpu_irqs[i][irq_pin]); + } + sysbus_mmio_map(s, 0, base); + sysbus_mmio_map(s, 1, descriptors); } -static void cpu_openrisc_load_kernel(ram_addr_t ram_size, - const char *kernel_filename, - OpenRISCCPU *cpu) +static void openrisc_sim_ompic_init(hwaddr base, int num_cpus, + qemu_irq **cpu_irqs, int irq_pin) +{ + DeviceState *dev; + SysBusDevice *s; + int i; + + dev = qdev_create(NULL, "or1k-ompic"); + qdev_prop_set_uint32(dev, "num-cpus", num_cpus); + qdev_init_nofail(dev); + + s = SYS_BUS_DEVICE(dev); + for (i = 0; i < num_cpus; i++) { + sysbus_connect_irq(s, i, cpu_irqs[i][irq_pin]); + } + sysbus_mmio_map(s, 0, base); +} + +static void openrisc_load_kernel(ram_addr_t ram_size, + const char *kernel_filename) { long kernel_size; uint64_t elf_entry; @@ -83,6 +107,9 @@ static void cpu_openrisc_load_kernel(ram_addr_t ram_size, kernel_size = load_image_targphys(kernel_filename, KERNEL_LOAD_ADDR, ram_size - KERNEL_LOAD_ADDR); + } + + if (entry <= 0) { entry = KERNEL_LOAD_ADDR; } @@ -91,7 +118,7 @@ static void cpu_openrisc_load_kernel(ram_addr_t ram_size, kernel_filename); exit(1); } - cpu->env.pc = entry; + boot_info.bootstrap_pc = entry; } } @@ -102,6 +129,8 @@ static void openrisc_sim_init(MachineState *machine) const char *kernel_filename = machine->kernel_filename; OpenRISCCPU *cpu = NULL; MemoryRegion *ram; + qemu_irq *cpu_irqs[2]; + qemu_irq serial_irq; int n; if (!cpu_model) { @@ -114,33 +143,42 @@ static void openrisc_sim_init(MachineState *machine) fprintf(stderr, "Unable to find CPU definition!\n"); exit(1); } + cpu_openrisc_pic_init(cpu); + cpu_irqs[n] = (qemu_irq *) cpu->env.irq; + + cpu_openrisc_clock_init(cpu); + qemu_register_reset(main_cpu_reset, cpu); - main_cpu_reset(cpu); } ram = g_malloc(sizeof(*ram)); memory_region_init_ram(ram, NULL, "openrisc.ram", ram_size, &error_fatal); memory_region_add_subregion(get_system_memory(), 0, ram); - cpu_openrisc_pic_init(cpu); - cpu_openrisc_clock_init(cpu); + if (nd_table[0].used) { + openrisc_sim_net_init(0x92000000, 0x92000400, smp_cpus, + cpu_irqs, 4, nd_table); + } - serial_mm_init(get_system_memory(), 0x90000000, 0, cpu->env.irq[2], - 115200, serial_hds[0], DEVICE_NATIVE_ENDIAN); + if (smp_cpus > 1) { + openrisc_sim_ompic_init(0x98000000, smp_cpus, cpu_irqs, 1); - if (nd_table[0].used) { - openrisc_sim_net_init(get_system_memory(), 0x92000000, - 0x92000400, cpu->env.irq[4], nd_table); + serial_irq = qemu_irq_split(cpu_irqs[0][2], cpu_irqs[1][2]); + } else { + serial_irq = cpu_irqs[0][2]; } - cpu_openrisc_load_kernel(ram_size, kernel_filename, cpu); + serial_mm_init(get_system_memory(), 0x90000000, 0, serial_irq, + 115200, serial_hds[0], DEVICE_NATIVE_ENDIAN); + + openrisc_load_kernel(ram_size, kernel_filename); } static void openrisc_sim_machine_init(MachineClass *mc) { mc->desc = "or1k simulation"; mc->init = openrisc_sim_init; - mc->max_cpus = 1; + mc->max_cpus = 2; mc->is_default = 1; }