From owner-svn-src-head@freebsd.org Fri Sep 9 14:50:46 2016 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 39E92BD403A; Fri, 9 Sep 2016 14:50:46 +0000 (UTC) (envelope-from br@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id F0D39EB7; Fri, 9 Sep 2016 14:50:45 +0000 (UTC) (envelope-from br@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u89Eoj9B026221; Fri, 9 Sep 2016 14:50:45 GMT (envelope-from br@FreeBSD.org) Received: (from br@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u89EoilO026215; Fri, 9 Sep 2016 14:50:44 GMT (envelope-from br@FreeBSD.org) Message-Id: <201609091450.u89EoilO026215@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: br set sender to br@FreeBSD.org using -f From: Ruslan Bukin Date: Fri, 9 Sep 2016 14:50:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r305664 - in head/sys: conf mips/malta mips/mips X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Sep 2016 14:50:46 -0000 Author: br Date: Fri Sep 9 14:50:44 2016 New Revision: 305664 URL: https://svnweb.freebsd.org/changeset/base/305664 Log: Add support for SMP on MIPS Malta platform. Tested in QEMU on Malta32, Malta64. Sponsored by: DARPA, AFRL Sponsored by: HEIF5 Added: head/sys/mips/malta/asm_malta.S (contents, props changed) head/sys/mips/malta/malta_mp.c (contents, props changed) Modified: head/sys/conf/options.mips head/sys/mips/malta/files.malta head/sys/mips/malta/std.malta head/sys/mips/mips/locore.S Modified: head/sys/conf/options.mips ============================================================================== --- head/sys/conf/options.mips Fri Sep 9 14:09:50 2016 (r305663) +++ head/sys/conf/options.mips Fri Sep 9 14:50:44 2016 (r305664) @@ -45,6 +45,7 @@ CPU_CNMIPS opt_global.h CPU_RMI opt_global.h CPU_NLM opt_global.h CPU_BERI opt_global.h +CPU_MALTA opt_global.h # which MACHINE_ARCH architecture MIPS Added: head/sys/mips/malta/asm_malta.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/mips/malta/asm_malta.S Fri Sep 9 14:50:44 2016 (r305664) @@ -0,0 +1,89 @@ +/*- + * Copyright (c) 2016 Ruslan Bukin + * All rights reserved. + * + * Portions of this software were developed by SRI International and the + * University of Cambridge Computer Laboratory under DARPA/AFRL contract + * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. + * + * Portions of this software were developed by the University of Cambridge + * Computer Laboratory as part of the CTSRD Project, with support from the + * UK Higher Education Innovation Fund (HEIF). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include + +#define VPECONF0_MVP (1 << 1) + + .set noreorder + +#ifdef SMP +/* + * This function must be implemented in assembly because it is called early + * in AP boot without a valid stack. + */ +LEAF(platform_processor_id) + .set push + .set mips32r2 + mfc0 v0, $15, 1 + jr ra + andi v0, 0x1f + .set pop +END(platform_processor_id) + +LEAF(enable_mvp) + .set push + .set mips32r2 + .set noat + li t2, (VPECONF0_MVP) + move $1, t2 + jr ra + .word 0x41810000 | (1 << 11) | 2 # mttc0 t2, $1, 2 + .set pop +END(enable_mvp) + +/* + * Called on APs to wait until they are told to launch. + */ +LEAF(malta_ap_wait) + jal platform_processor_id + nop + +1: + ll t0, malta_ap_boot + bne v0, t0, 1b + nop + + move t0, zero + sc t0, malta_ap_boot + + beqz t0, 1b + nop + + j mpentry + nop +END(malta_ap_wait) +#endif Modified: head/sys/mips/malta/files.malta ============================================================================== --- head/sys/mips/malta/files.malta Fri Sep 9 14:09:50 2016 (r305663) +++ head/sys/mips/malta/files.malta Fri Sep 9 14:50:44 2016 (r305664) @@ -10,3 +10,7 @@ mips/malta/malta_machdep.c standard mips/malta/yamon.c standard mips/mips/intr_machdep.c standard mips/mips/tick.c standard + +# SMP +mips/malta/asm_malta.S optional smp +mips/malta/malta_mp.c optional smp Added: head/sys/mips/malta/malta_mp.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/mips/malta/malta_mp.c Fri Sep 9 14:50:44 2016 (r305664) @@ -0,0 +1,226 @@ +/*- + * Copyright (c) 2016 Ruslan Bukin + * All rights reserved. + * + * Portions of this software were developed by SRI International and the + * University of Cambridge Computer Laboratory under DARPA/AFRL contract + * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. + * + * Portions of this software were developed by the University of Cambridge + * Computer Laboratory as part of the CTSRD Project, with support from the + * UK Higher Education Innovation Fund (HEIF). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define MALTA_MAXCPU 2 + +unsigned malta_ap_boot = ~0; + +#define C_SW0 (1 << 8) +#define C_SW1 (1 << 9) +#define C_IRQ0 (1 << 10) +#define C_IRQ1 (1 << 11) +#define C_IRQ2 (1 << 12) +#define C_IRQ3 (1 << 13) +#define C_IRQ4 (1 << 14) +#define C_IRQ5 (1 << 15) + +static inline void +ehb(void) +{ + __asm __volatile( + " .set mips32r2 \n" + " ehb \n" + " .set mips0 \n"); +} + +#define mttc0(rd, sel, val) \ +({ \ + __asm __volatile( \ + " .set push \n" \ + " .set mips32r2 \n" \ + " .set noat \n" \ + " move $1, %0 \n" \ + " .word 0x41810000 | (" #rd " << 11) | " #sel " \n" \ + " .set pop \n" \ + :: "r" (val)); \ +}) + +#define mftc0(rt, sel) \ +({ \ + unsigned long __res; \ + __asm __volatile( \ + " .set push \n" \ + " .set mips32r2 \n" \ + " .set noat \n" \ + " .word 0x41000800 | (" #rt " << 16) | " #sel " \n" \ + " move %0, $1 \n" \ + " .set pop \n" \ + : "=r" (__res)); \ + __res; \ +}) + +#define write_c0_register32(reg, sel, val) \ +({ \ + __asm __volatile( \ + " .set push \n" \ + " .set mips32 \n" \ + " mtc0 %0, $%1, %2 \n" \ + " .set pop \n" \ + :: "r" (val), "i" (reg), "i" (sel)); \ +}) + +#define read_c0_register32(reg, sel) \ +({ \ + uint32_t __retval; \ + __asm __volatile( \ + " .set push \n" \ + " .set mips32 \n" \ + " mfc0 %0, $%1, %2 \n" \ + " .set pop \n" \ + : "=r" (__retval) : "i" (reg), "i" (sel)); \ + __retval; \ +}) + +void +platform_ipi_send(int cpuid) +{ + uint32_t reg; + + /* + * Set thread context. + * Note this is not global, so we don't need lock. + */ + reg = read_c0_register32(1, 1); + reg &= ~(0xff); + reg |= cpuid; + write_c0_register32(1, 1, reg); + + ehb(); + + /* Set cause */ + reg = mftc0(13, 0); + mttc0(13, 0, (reg | C_SW1)); +} + +void +platform_ipi_clear(void) +{ + uint32_t reg; + + reg = mips_rd_cause(); + reg &= ~(C_SW1); + mips_wr_cause(reg); +} + +int +platform_ipi_hardintr_num(void) +{ + + return (-1); +} + +int +platform_ipi_softintr_num(void) +{ + + return (1); +} + +void +platform_init_ap(int cpuid) +{ + uint32_t clock_int_mask; + uint32_t ipi_intr_mask; + + /* + * Clear any pending IPIs. + */ + platform_ipi_clear(); + + /* + * Unmask the clock and ipi interrupts. + */ + ipi_intr_mask = soft_int_mask(platform_ipi_softintr_num()); + clock_int_mask = hard_int_mask(5); + set_intr_mask(ipi_intr_mask | clock_int_mask); + + mips_wbflush(); +} + +void +platform_cpu_mask(cpuset_t *mask) +{ + uint32_t i, m; + + CPU_ZERO(mask); + for (i = 0, m = 1 ; i < MALTA_MAXCPU; i++, m <<= 1) + CPU_SET(i, mask); +} + +struct cpu_group * +platform_smp_topo(void) +{ + + return (smp_topo_none()); +} + +int +platform_start_ap(int cpuid) +{ + int timeout; + + if (atomic_cmpset_32(&malta_ap_boot, ~0, cpuid) == 0) + return (-1); + + printf("Waiting for cpu%d to start\n", cpuid); + + timeout = 100; + do { + DELAY(1000); + if (atomic_cmpset_32(&malta_ap_boot, 0, ~0) != 0) { + printf("CPU %d started\n", cpuid); + return (0); + } + } while (timeout--); + + printf("CPU %d failed to start\n", cpuid); + + return (0); +} Modified: head/sys/mips/malta/std.malta ============================================================================== --- head/sys/mips/malta/std.malta Fri Sep 9 14:09:50 2016 (r305663) +++ head/sys/mips/malta/std.malta Fri Sep 9 14:50:44 2016 (r305664) @@ -1,7 +1,7 @@ # $FreeBSD$ files "../malta/files.malta" -cpu CPU_MIPS4KC +cpu CPU_MALTA device pci device ata Modified: head/sys/mips/mips/locore.S ============================================================================== --- head/sys/mips/mips/locore.S Fri Sep 9 14:09:50 2016 (r305663) +++ head/sys/mips/mips/locore.S Fri Sep 9 14:50:44 2016 (r305664) @@ -158,6 +158,21 @@ VECTOR(_locore, unknown) 1: #endif +#if defined(CPU_MALTA) && defined(SMP) + .set push + .set mips32r2 + jal enable_mvp + nop + jal platform_processor_id + nop + beqz v0, 1f + nop + j malta_ap_wait + nop + .set pop +1: +#endif + /* * Initialize stack and call machine startup. */