From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1A5F4C433FE for ; Thu, 3 Nov 2022 18:30:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=+CDxIUh0ibsTFoy/D63EanxvsIGAJzo5jd5K6/au0I0=; b=3oU4PJIq/Vnnk1 8R+J0+OD2BS7N8FzKHsIotp/57D2m4tejrK80tOyu79KL62JqQJpV494SH4jHEo6ggpqGLgD/tnWj GEAlNACUKKMX6naDAut4l/cYpZQzVibB3j1KUgHu2UeM51fbue1+ZSjqemA4qtNzwfy0K11i/+RsM CDo5mOw7TyawCMAW5Wm1EhsYl4zYySW5ZuIHPe66siJpFHjWbsQ5dtY/aMGPNaPSIwk0zYuXPiC+W 6Cky21ns9xDScjUmKOMrgIpJNEzmHJ6eqnl1ylFZmn9jFZiEuuAornRi+mQ0aT+IizOVJcczo+cBW kLuia4MKjuRYrtSKdRZQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oqexe-001HNZ-8Z; Thu, 03 Nov 2022 18:29:07 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oqexW-001HMP-Lj for linux-arm-kernel@lists.infradead.org; Thu, 03 Nov 2022 18:29:00 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id E5D5B61FB8; Thu, 3 Nov 2022 18:28:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 273FEC433C1; Thu, 3 Nov 2022 18:28:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667500136; bh=DOnycYqUapd1pzt+/r39LDJr8Gis+NKY17iBb5hiuiw=; h=From:To:Cc:Subject:Date:From; b=koBaJq9oo9IHZRF3qbu/nlVAEBF7K1JqE447FJRjxnwmspbCT30XY8GZTeDibFgSQ hv25ot/iL8ZlrDCnHPrLwiGkYsUoF271u0x4jX4yv22+YtM/K/hh5+J++096LbITW8 MzDAjc6QR84V2PsBO7edEGUuWoEJ9snucREtj/zjVETtW8c3ITNZM24LpS9qAlR3cp jdh/E0BhdJIxa7VEZCXWwceOmz07NvibOxR/NDioJ5o1cLpo2gqhECnIoopU0bNAEt h0BSBiCnJ06r3cBe18V008Qga5as6AqM4kfH8DzTXp2y1Y/Y98ylZ+RFovb0A167K9 gb7SKj02OWOAQ== From: Mark Brown To: Catalin Marinas , Will Deacon Cc: Ard Biesheuvel , linux-arm-kernel@lists.infradead.org, Mark Brown Subject: [PATCH v2] arm64/fpsimd: Add interface for kernel use of SVE and SME Date: Thu, 3 Nov 2022 18:21:05 +0000 Message-Id: <20221103182105.644166-1-broonie@kernel.org> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3774; i=broonie@kernel.org; h=from:subject; bh=DOnycYqUapd1pzt+/r39LDJr8Gis+NKY17iBb5hiuiw=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBjZAaQ+EOHUMVAdWgjdH7Oe11RLQRb/h6Ug37I0oCV XfUW+xOJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCY2QGkAAKCRAk1otyXVSH0Fl3CA CATo2454k8y/MFmJ232SEkHugPF/03Wn13tnTDTPCaNraNZYkjXPKg3Om1pbw1DELkSz9hs0jzlqjU 5nHUdWcE2tAh3fUa5RvejWQi/2LTN1RPn4sffP6fZOus39vHDxEJPuI3pkJP+F6VFTHCYditI0EQ55 cwzZlgG4WZziur2RIYaS2lkYDvwnQRNKk0ljs86bdae4E0b6pWj5X4p4zTJnZa1aZjtEmetrcKWxjO mz8LEluTocitamyKEXr0/9yH3q+ZSoGyJeasf8ZRmd9XPQwsJvrASLOGEmuYU5gt0hPr4N7tKXygE5 /jkZf4PiGWReHqHx+StUUIL60C58TP X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221103_112858_824417_DEA07DCC X-CRM114-Status: GOOD ( 20.91 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org We currently support in kernel use of FPSIMD via the kernel_neon_begin() and kernel_neon_end() interface but there is no corresponding interface for SVE or SME. Given that SVE hardware is now becoming widely available there is interest in using these more modern floating point instruction sets for in kernel applications let's add an interface which allows them to be selected in addition to FPSIMD. The sharing of registers and code means that using kernel_neon_begin() is actually doing most of the setup required, the only problem is that we are not configuring the vector length so any SVE or SME code would just use whatever vector length is configured in the hardware potentially leading to uneven performance on systems which support multiple vector lengths. Add a new kernel_fp_begin()/end() interface which allows the caller to flag if it will use SVE or SME and initialises the vector length if requested. We allow simultaneous specification of multiple extensions since it is possible that a user may wish to mix them in a single algorithm, there is no cost to allowing this. Signed-off-by: Mark Brown --- v2: Check for system_supports_sme() for setting the SME VL. arch/arm64/include/asm/fpsimd.h | 7 +++++ arch/arm64/kernel/fpsimd.c | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 6f86b7ab6c28..d4045fb73483 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -44,6 +44,13 @@ */ #define SME_VQ_MAX 16 +#define KERNEL_FP_FPSIMD 1 +#define KERNEL_FP_SVE 2 +#define KERNEL_FP_SME 4 + +void kernel_fp_begin(unsigned int flags); +void kernel_fp_end(void); + struct task_struct; extern void fpsimd_save_state(struct user_fpsimd_state *state); diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 23834d96d1e7..01a79a8fe9f6 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -1858,6 +1858,51 @@ void kernel_neon_end(void) } EXPORT_SYMBOL(kernel_neon_end); +/** + * kernel_fp_begin(): obtain the CPU floating point registers for use + * by the calling context + * + * @flags: KERNEL_FP_ flags specifying which FP features will be used. + * + * The caller is responsible for ensuring that the requested floating + * point features are available on the current system. Task context + * in the registers is saved back to memory as necessary. If SVE or + * SME support is enabled then the maximum available vector length + * will be selected. + * + * A matching call to kernel_fp_end() must be made before returning from the + * calling context. + * + * The caller may freely use the floating point registers until + * kernel_fp_end() is called. + */ +void kernel_fp_begin(unsigned int flags) +{ + kernel_neon_begin(); + + if (system_supports_sve() && (flags & KERNEL_FP_SVE)) + sve_set_vq(sve_vq_from_vl(sve_max_vl()) - 1); + + if (system_supports_sme() && (flags & KERNEL_FP_SME)) + sme_set_vq(sve_vq_from_vl(sme_max_vl()) - 1); +} +EXPORT_SYMBOL(kernel_fp_begin); + +/** + * kernel_fp_end(): end kernel usage of the floating point registers + * + * Must be called from a context in which kernel_fp_begin() was previously + * called, with no call to kernel_fp_end() in the meantime. + * + * The caller must not use the FPSIMD registers after this function is called, + * unless kernel_fp_begin() is called again in the meantime. + */ +void kernel_fp_end(void) +{ + kernel_neon_end(); +} +EXPORT_SYMBOL(kernel_fp_end); + #ifdef CONFIG_EFI static DEFINE_PER_CPU(struct user_fpsimd_state, efi_fpsimd_state); -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel