Received: by 2002:ab2:60d1:0:b0:1f7:5705:b850 with SMTP id i17csp597272lqm; Wed, 1 May 2024 09:46:52 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCV36zL18BHxzQxsha4kkjIpPpkbh4JidpZiLBwzsu2NOjwRSjPdKreTdURZedyh0ExKnRShMf6y0K4MpeE2CYVG3gbNbFDLBfd97IFPRg== X-Google-Smtp-Source: AGHT+IHIXMcD11mWjRoiBF0LdXY3hIJNFv74GOHRsnInukua8rJl2eXAqxB6YWbeIxJRxgSIrltQ X-Received: by 2002:a05:6a00:2d07:b0:6ec:d76b:6fac with SMTP id fa7-20020a056a002d0700b006ecd76b6facmr4072382pfb.12.1714582012248; Wed, 01 May 2024 09:46:52 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1714582012; cv=pass; d=google.com; s=arc-20160816; b=KOsZGF4BqZROX2N9UPjF8iBa/IfKr/czJPD65dZYn2HQIK/4oQQEYEVl8qaKZRxtsX cTMKRusd5b5BBDXaOzYq1dHixaFN0l8is2Ha0Sj0EjflvW+GdBEPBqwr9uocNo3A214a Cp38xOstnazQAZJLXgWT75skveAQXFleyPDQHUukZqL+C4n1t20s+7VxINbr8ROA9iEQ Ia7p71LDDlGEWVSwjonQ8E9MqPdB01oqfsWCfIZStwaKxbQ26EeqjVoJ9rWFcwzhHfvo OhzUwbibHzlIOs1skGKJJS6hRQFdoP6KhgDLrQ8tkhocbVWTxNThqmLl3+X6JhhHnBmr Md9g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:list-unsubscribe:list-subscribe :list-id:precedence:dkim-signature; bh=nPkyhmFJU1JMGPaNgbyvGV60qehrcfbkIOrxyWAvpo8=; fh=pGxTiEQ+C6q4YeINo6pIQVvXX+G/I1haJ+rXW60tkkI=; b=xAYTnaRodbfSizI8XC1e77QwUBnzcADJsyEyiBfzatGUS3pEnMmaFzoRQbzhH2+eqy xGMd+3uRf2mE0o/FjU+nfpe8/qXDGdledWOJkdKg6ZbJTaXuQMeDUJx2vXSYTeWJm3Oi uID1ZElmoLXwOawa0JhltK2WyBVGqLks89yMMYxNaOE7IdsSLh3wygVEKdq27LSoKAqJ jNpIvd67icktCleYVBtR/EfK66TevejsLUUoZGWCGxwtBiLTPdU8F1famzdhCnHbyjfe ynKVjLb30tlp+Gwequo8pZCYcQYp27LD4vX21TsqEAqIZLdKYvM6kZlbiddg/JO/eiOi DJsA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b=aYiREsO0; arc=pass (i=1 spf=pass spfdomain=rivosinc.com dkim=pass dkdomain=rivosinc-com.20230601.gappssmtp.com); spf=pass (google.com: domain of linux-kernel+bounces-165601-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-165601-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id s19-20020aa78293000000b006ecf01a3292si23908924pfm.208.2024.05.01.09.46.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 May 2024 09:46:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-165601-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b=aYiREsO0; arc=pass (i=1 spf=pass spfdomain=rivosinc.com dkim=pass dkdomain=rivosinc-com.20230601.gappssmtp.com); spf=pass (google.com: domain of linux-kernel+bounces-165601-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-165601-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 8C26DB215F3 for ; Wed, 1 May 2024 16:46:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 65937E542; Wed, 1 May 2024 16:46:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="aYiREsO0" Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6DFB0EAF6 for ; Wed, 1 May 2024 16:46:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714582000; cv=none; b=JTy0vhu1liWkSmo3V5+3LDjnL6xLZzGhORpDnCpQr4BrCwuVArn/BCPsip9DtTJE0yx3dsOE9ZdV6TTc4fYYrIpHA109qf9oA0l8dVHm2jK8H7cxdr6LsFtF6au91ahWs7QsTzzZkdQj74LW84kUJMGZnpAoTNq60ECX2jrSqpo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714582000; c=relaxed/simple; bh=tR+PGLQo9BVGPoo9A8iw6jPgITstE381cUqT5HTEdhs=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=IQF+PZU0IvPnQnxpYt0ufqjzAnAsvibhDJcT9xvxZ/5nTFo0HggPHIU7vyiWKJwDZYGyrYrppiu0LFxLf6OJkwydiFNRXULaYPyIkevhVcOJvL6TIbBKRweJYquAzlDWHOkWM9QoykwbQkXBrw7p4sDJfpUgE05hf45azxzHB/A= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=aYiREsO0; arc=none smtp.client-ip=209.85.208.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Received: by mail-lj1-f179.google.com with SMTP id 38308e7fff4ca-2df848f9325so58641031fa.1 for ; Wed, 01 May 2024 09:46:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1714581996; x=1715186796; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=nPkyhmFJU1JMGPaNgbyvGV60qehrcfbkIOrxyWAvpo8=; b=aYiREsO0CAmNCkVjjtwKM+Gb+4leHTPNr37/K8oqJtrOGqG94N+WHpPf08a3FbDrpw tqb1fCj07MUDlgk1lNnK6BdmN0hX5Qk4IDAR+F5j5ZriDdk785NbYZcVfobmO7qh8W8i jWfVLATpumhKkBut0v1jroeZiRM5EZXPZjGbUa3vZjR2Md1q4G8ARXHUJUc1NmG7OvH+ 2y/U4gUOWFFaU7Q9TxFKwmYXDbWCY9zATOxx55kOiWJF/mMihwxGgzlhFggdzQaCCCpP CDS7AysfJurADdqYL5hg9UWMYdyvhPzuuDq7Eqbxb9X8Rt/jKh9pn+kulS4PbC+Fabwz WxKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714581996; x=1715186796; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nPkyhmFJU1JMGPaNgbyvGV60qehrcfbkIOrxyWAvpo8=; b=hrHPDCScQUdcydlG6hP/+ZRgFonCzBk3w0o+jhts8c6ryAMN1TzXtQ0PywZLbiLWvI 7cFT+x1KteTiOcUG8ubnm52LGWIllsYN/9XJ7fU37z2S1m3qt4vQcT878GMTfLN/gCUn 8iAYi9h/R9Vwt0TvP+Wmk8uiFnBcytDlYE4IdmmqTqKh2DIl2EwxsDeHauKT7x9q34Ns IyJu0atHRkPg9hvVLnObrW9cc7rOKuGLZ5t4W1CPVpGZRl1nQj93xK4bSKc84Fpd7huE 1zxiGyf1HYxNWnkaBqlTgOurmHIWw2uVdrGgi+RRFhIcSTQ+CtfeIgPrt7MRDiyIqZca RwDA== X-Forwarded-Encrypted: i=1; AJvYcCXsLfOFTrs6xJJEUt8HhC3jxDqJDt5+mcBhT2Y5znJnHXtRFqWK82N8QwuLSox2QXd5AZlTlL2Zt9sF5/PRm8Vcah41KNVOKsGS7mAz X-Gm-Message-State: AOJu0YyYBCLmd1+2xmZwfEz4dbZk2DP6fzzkZRZ709MuAZHN6R5FIwEI J2zAZspPTSke2VtoYWmtjiKcivMFQDhwhmRwtbE7Nirlsbl5hp4D8MM5j8cZ4fsqiAlqhWunCui m1zkf4hAyO1yxqNy+Y2+4toD7pBDAkcuVYX3arQ== X-Received: by 2002:a2e:9b48:0:b0:2e0:ca9a:a1c7 with SMTP id o8-20020a2e9b48000000b002e0ca9aa1c7mr2232711ljj.45.1714581996597; Wed, 01 May 2024 09:46:36 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240426-dev-charlie-support_thead_vector_6_9-v4-0-5cf53b5bc492@rivosinc.com> <20240426-dev-charlie-support_thead_vector_6_9-v4-13-5cf53b5bc492@rivosinc.com> In-Reply-To: <20240426-dev-charlie-support_thead_vector_6_9-v4-13-5cf53b5bc492@rivosinc.com> From: Evan Green Date: Wed, 1 May 2024 09:46:00 -0700 Message-ID: Subject: Re: [PATCH v4 13/16] riscv: hwprobe: Add thead vendor extension probing To: Charlie Jenkins Cc: Conor Dooley , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Guo Ren , Conor Dooley , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Conor Dooley , =?UTF-8?B?Q2zDqW1lbnQgTMOpZ2Vy?= , Jonathan Corbet , Shuah Khan , linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Apr 26, 2024 at 2:37=E2=80=AFPM Charlie Jenkins wrote: > > Add a new hwprobe key "RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0" which > allows userspace to probe for the new RISCV_ISA_VENDOR_EXT_XTHEADVECTOR > vendor extension. > > This new key will allow userspace code to probe for which thead vendor > extensions are supported. This API is modeled to be consistent with > RISCV_HWPROBE_KEY_IMA_EXT_0. The bitmask returned will have each bit > corresponding to a supported thead vendor extension of the cpumask set. > Just like RISCV_HWPROBE_KEY_IMA_EXT_0, this allows a userspace program > to determine all of the supported thead vendor extensions in one call. > > Signed-off-by: Charlie Jenkins > --- > arch/riscv/include/asm/hwprobe.h | 4 +-- > .../include/asm/vendor_extensions/thead_hwprobe.h | 11 ++++++ > arch/riscv/include/uapi/asm/hwprobe.h | 3 +- > arch/riscv/include/uapi/asm/vendor/thead.h | 3 ++ > arch/riscv/kernel/sys_hwprobe.c | 9 +++++ > arch/riscv/kernel/vendor_extensions/Makefile | 1 + > .../riscv/kernel/vendor_extensions/thead_hwprobe.c | 42 ++++++++++++++++= ++++++ > 7 files changed, 70 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/include/asm/hwprobe.h b/arch/riscv/include/asm/hw= probe.h > index 630507dff5ea..e68496b4f8de 100644 > --- a/arch/riscv/include/asm/hwprobe.h > +++ b/arch/riscv/include/asm/hwprobe.h > @@ -1,6 +1,6 @@ > /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > /* > - * Copyright 2023 Rivos, Inc > + * Copyright 2023-2024 Rivos, Inc > */ > > #ifndef _ASM_HWPROBE_H > @@ -8,7 +8,7 @@ > > #include > > -#define RISCV_HWPROBE_MAX_KEY 6 > +#define RISCV_HWPROBE_MAX_KEY 7 > > static inline bool riscv_hwprobe_key_is_valid(__s64 key) > { > diff --git a/arch/riscv/include/asm/vendor_extensions/thead_hwprobe.h b/a= rch/riscv/include/asm/vendor_extensions/thead_hwprobe.h > new file mode 100644 > index 000000000000..907cfc4eb4dc > --- /dev/null > +++ b/arch/riscv/include/asm/vendor_extensions/thead_hwprobe.h > @@ -0,0 +1,11 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_HWPROBE_H > +#define _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_HWPROBE_H > + > +#include > + > +#include > + > +void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair, const st= ruct cpumask *cpus); > + > +#endif > diff --git a/arch/riscv/include/uapi/asm/hwprobe.h b/arch/riscv/include/u= api/asm/hwprobe.h > index 9f2a8e3ff204..21e96a63f9ea 100644 > --- a/arch/riscv/include/uapi/asm/hwprobe.h > +++ b/arch/riscv/include/uapi/asm/hwprobe.h > @@ -1,6 +1,6 @@ > /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > /* > - * Copyright 2023 Rivos, Inc > + * Copyright 2023-2024 Rivos, Inc > */ > > #ifndef _UAPI_ASM_HWPROBE_H > @@ -67,6 +67,7 @@ struct riscv_hwprobe { > #define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0) > #define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0) > #define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6 > +#define RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0 7 > /* Increase RISCV_HWPROBE_MAX_KEY when adding items. */ > > /* Flags */ > diff --git a/arch/riscv/include/uapi/asm/vendor/thead.h b/arch/riscv/incl= ude/uapi/asm/vendor/thead.h > new file mode 100644 > index 000000000000..43790ebe5faf > --- /dev/null > +++ b/arch/riscv/include/uapi/asm/vendor/thead.h > @@ -0,0 +1,3 @@ > +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > + > +#define RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR (1 << 0) > diff --git a/arch/riscv/kernel/sys_hwprobe.c b/arch/riscv/kernel/sys_hwpr= obe.c > index 8cae41a502dd..e59cac545df5 100644 > --- a/arch/riscv/kernel/sys_hwprobe.c > +++ b/arch/riscv/kernel/sys_hwprobe.c > @@ -13,6 +13,7 @@ > #include > #include > #include > +#include > #include > > > @@ -216,6 +217,14 @@ static void hwprobe_one_pair(struct riscv_hwprobe *p= air, > pair->value =3D riscv_cboz_block_size; > break; > > + case RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0: > +#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD > + hwprobe_isa_vendor_ext_thead_0(pair, cpus); > +#else > + pair->value =3D 0; > +#endif Could we move this ifdef into the header by declaring a dummy hwprobe_isa_vendor_ext_thead_0() in the header for the !ENABLED case? > + break; > + > /* > * For forward compatibility, unknown keys don't fail the whole > * call, but get their element key set to -1 and value set to 0 > diff --git a/arch/riscv/kernel/vendor_extensions/Makefile b/arch/riscv/ke= rnel/vendor_extensions/Makefile > index 8f1c5a4dc38f..f511fd269e8a 100644 > --- a/arch/riscv/kernel/vendor_extensions/Makefile > +++ b/arch/riscv/kernel/vendor_extensions/Makefile > @@ -1,4 +1,5 @@ > # SPDX-License-Identifier: GPL-2.0-only > > obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_THEAD) +=3D thead.o > +obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_THEAD) +=3D thead_hwprobe.o > obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_ANDES) +=3D andes.o > diff --git a/arch/riscv/kernel/vendor_extensions/thead_hwprobe.c b/arch/r= iscv/kernel/vendor_extensions/thead_hwprobe.c > new file mode 100644 > index 000000000000..e8e2de292032 > --- /dev/null > +++ b/arch/riscv/kernel/vendor_extensions/thead_hwprobe.c > @@ -0,0 +1,42 @@ > +// SPDX-License-Identifier: GPL-2.0-only > + > +#include > +#include > +#include > + > +#include > +#include > + > +#include > +#include > + > +void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair, const st= ruct cpumask *cpus) > +{ > + /* > + * Loop through and record extensions that 1) anyone has, and 2) = anyone > + * doesn't have. > + */ > + > + struct riscv_isainfo *per_hart_thead_bitmap =3D riscv_isa_vendor_= ext_list_thead.per_hart_vendor_bitmap; > + int cpu; > + u64 missing; > + > + for_each_cpu(cpu, cpus) { > + struct riscv_isainfo *isainfo =3D &per_hart_thead_bitmap[= cpu]; > + > +#define EXT_KEY(ext) = \ > + do { = \ > + if (__riscv_isa_extension_available(isainfo->isa, RISCV_I= SA_VENDOR_EXT_##ext)) \ > + pair->value |=3D RISCV_HWPROBE_VENDOR_EXT_##ext; = \ > + else = \ > + missing |=3D RISCV_HWPROBE_VENDOR_EXT_##ext; = \ > + } while (false) > + > + EXT_KEY(XTHEADVECTOR); > + > +#undef EXT_KEY > + } > + > + /* Now turn off reporting features if any CPU is missing it. */> = + pair->value &=3D ~missing; > +} Something to consider, perhaps when there's a second vendor, is how we might reduce this boilerplate on the second vendor. Probably best to wait though until we know exactly what the commonalities are. This looks good for now. > > -- > 2.44.0 >