Received: by 2002:ab2:69cc:0:b0:1f4:be93:e15a with SMTP id n12csp91419lqp; Fri, 12 Apr 2024 11:17:50 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUGYnxJFSWf0RaX6nmwGoBjof4jlEscoTS5XISXHE7+5l1GYYWiVTNV+M5p7ecpSxe/GOnN/K76YpatURlVC47anChtUjjy/k6SSxem3A== X-Google-Smtp-Source: AGHT+IGGNGx30tyWVngsO8Skjq8Sqn7dpbMH0brZa7U9d4gB1ZW71Tj6nysRVHhHkweeBkReKVDz X-Received: by 2002:a05:6870:5a6:b0:233:637a:a14f with SMTP id m38-20020a05687005a600b00233637aa14fmr3513157oap.42.1712945869790; Fri, 12 Apr 2024 11:17:49 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712945869; cv=pass; d=google.com; s=arc-20160816; b=drTxGxdx87pyNnc4kpWxeOVF587RIGZG4b0nEfNojBqkMDSW24LVVrgSEA+fDMfuXP +ektTwz91BHXLao9O5ay5bCea44bkkphQ4y2iR64tiM69DrIJJ4caMIkwqd8/cD92buF 3DacYbWhMsg+qSeTMx3kLQJmzhDhCmDvFNkowt02UcNhkj/LXIcJnePHQ9Yhgo88iDkV 3PmCbf6Nnvepv+H8cou7S+hUoJ2eDvs7D2F2Uman2Rztp++mNUZk5SJXm7jlKx+6v+SV QuVC+S3/+fvqNvyBn+iiOGV/DMNR8kwap8zZHycTXZ4ls9ZzKpQ+2tD9+Nquxp8Uhrg6 sCEA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:message-id:subject:cc:to:from:date:dkim-signature; bh=fwRQcSH3hoRqkz4lFFtuwqCwddU8BwqxVywbCJRklZ0=; fh=+6OkgSMBw1BXJdaILYtAmj7gWnlJpWYElAWqAW5h9ts=; b=tRGj2J8w4LoAKHjkjLo9lTtSk+8Dz7LNjRb+ssecq4TwddfarMLr+JKA5zSbPZaGO5 IZiiwkc1omwamO+QMzTsKlpXqhHjEUOEnbfWUMvSHGbPt8m3NXV+INWhewgEGZ0Tgv3a OoLV6gGnSmIwFMxaQVNWZnVz+1t1KmIMarx3Zi5IPzUx5X8rkXBKGBPWwoYliPsgqpJ2 n2eIo0JsBBiT7fqoLB/3j4x5AszkHGXPOasXigxU1NojRRQlG0yKsFwtY+GfOoubOrkj PqqOtSa3UB7AbNdH5dl6XBimAZbymovAE8Nq1NGf2tVZFm4c4uDJjwW7uHiPmLvoSsVh owvg==; 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=mKj82HQ5; 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-143187-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-143187-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id bs30-20020a05620a471e00b0078d69caf248si4975797qkb.748.2024.04.12.11.17.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 11:17:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-143187-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b=mKj82HQ5; 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-143187-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-143187-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 ny.mirrors.kernel.org (Postfix) with ESMTPS id 737A81C234E4 for ; Fri, 12 Apr 2024 18:17:11 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8245D148FE0; Fri, 12 Apr 2024 18:17:06 +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="mKj82HQ5" Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (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 8E10A14D44F for ; Fri, 12 Apr 2024 18:17:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712945825; cv=none; b=j2WaHfemrl6vXRwOWhVDfycfWADjA+0jtGJvxVs7GIkZSb/hFcWYF9cH9/TL/gY6xfmDgx3kpq5ngJzx6jzTktk7aa1A9abpDpi/TYwNTqraVhksukRv2MdiOMYMwoN2cgdaPLLk84Vaf7C7QmdUMpZNYD1t+9wbZJMT1A8VXaw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712945825; c=relaxed/simple; bh=/MGnUUIFV/PfbJzx4J6fZpaWxaKzHgtnIopUoSjHKuM=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=cU5LicpRG4eSO9JURpRrxkBLSAG4bzDC2m2p1M7dVZaq6lgm0NybyKH9TXcCGtn69dkawc4du8q0YZTv+WZgE3ShuGgYjaA9+H1Yf5N36IfUMsjzgSM4w+7MOQDHYtkW8aEGSj3osohGBlhg1831iLCyQgNj5t8bTNU2Ogl6qqA= 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=mKj82HQ5; arc=none smtp.client-ip=209.85.210.178 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-pf1-f178.google.com with SMTP id d2e1a72fcca58-6ed3cafd766so1093614b3a.0 for ; Fri, 12 Apr 2024 11:17:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1712945822; x=1713550622; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=fwRQcSH3hoRqkz4lFFtuwqCwddU8BwqxVywbCJRklZ0=; b=mKj82HQ5l2LxWX9PjeQnzoHJfW4ypXE+8m1/kKRG6p985cZlzvOImli4V9B/V/DLuq hvPYVZK60Ldb0okn66pCvxpEde/9aYDHhXataXpndBwg94VTrDbZBElM6jXpWSGAcaLk /W6kTmp+d31v08y90dDCoAS5F9QALEKVQtHC03Cqwfc7vSxSVDWaooNXDOno1QErCnNb vJjtkOHtYM8OZ0Xbf0hLR+pKufr5NuAQzKS+omNAdZSqBMVOy6qDwnESdWfp2YEcLuJc EA8i+VHDBRP784WxB6lR2VGh24ZRzF+wfwdPpY/kv3lTs+Sb2LJgzQS3lBiYRWlqN+Vp tJ5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712945822; x=1713550622; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=fwRQcSH3hoRqkz4lFFtuwqCwddU8BwqxVywbCJRklZ0=; b=ZfG72EHMjWdmBkprHCLCcYX564P2e2F316xNLAr4NTjZ2ZZFOQxN9fE9JFFLQk7KE2 urq3udAhiaf4AJ1IyvnrkR+0qtgsuN3AEZAtSmehZKWD8tFTb5bUJ6SnP5BpnXYdFvsK HburAbVkMG1PNtAPVsNcYN014LIYxj49vLXd0NuGrAJPzivkMtTb20hO6aYVC++o3YBQ xMhdmN7lbyaIuLauJsMf94eMBL31NKl3Uc5HikHcUqw9y/j0l/yJSxsd1zFI5nZDY/Ia A49xzNiijoTrNfnCM9nB0oQ+DN/zQFP/yeD8olmtayyUSgcPU2xZk0LqW4rkDIHnDPSi K1nw== X-Forwarded-Encrypted: i=1; AJvYcCVxLhUGZXoLl7lyDjQHtQpAHwlRQQ/xGl3VtJkfEY9gnhXKUAdxqFqVnhAQ7phyxiuKB7FfJK9Qtd3zF4OjzKMDl7+tKHxVQcBT9g6D X-Gm-Message-State: AOJu0YzjO9OEQQPVw1u/ZTwY9Tfe8WmwVrnTK6mf+1bJoEQI/UzbApYL uHa2GET4CCPQSOyRmIZJa6wh4LFRfOYaWWMubnxZLmM2hARwT8vFoQwiZ/vGPVE= X-Received: by 2002:a05:6a20:9c90:b0:1a9:c757:a22d with SMTP id mj16-20020a056a209c9000b001a9c757a22dmr336085pzb.14.1712945821769; Fri, 12 Apr 2024 11:17:01 -0700 (PDT) Received: from ghost (mobile-166-137-160-039.mycingular.net. [166.137.160.39]) by smtp.gmail.com with ESMTPSA id d3-20020a056a00198300b006e6c6a50e5esm3162896pfl.34.2024.04.12.11.16.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 11:17:01 -0700 (PDT) Date: Fri, 12 Apr 2024 11:16:54 -0700 From: Charlie Jenkins To: Evan Green 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 , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , 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 Subject: Re: [PATCH 16/19] riscv: hwprobe: Add vendor extension probing Message-ID: References: <20240411-dev-charlie-support_thead_vector_6_9-v1-0-4af9815ec746@rivosinc.com> <20240411-dev-charlie-support_thead_vector_6_9-v1-16-4af9815ec746@rivosinc.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Fri, Apr 12, 2024 at 10:05:21AM -0700, Evan Green wrote: > On Thu, Apr 11, 2024 at 9:12 PM Charlie Jenkins wrote: > > > > Add a new hwprobe key "RISCV_HWPROBE_KEY_VENDOR_EXT_0" which allows > > userspace to probe for the new RISCV_ISA_VENDOR_EXT_XTHEADVECTOR vendor > > extension. > > > > Signed-off-by: Charlie Jenkins > > --- > > arch/riscv/include/asm/hwprobe.h | 4 +-- > > arch/riscv/include/uapi/asm/hwprobe.h | 10 +++++- > > arch/riscv/kernel/sys_hwprobe.c | 59 +++++++++++++++++++++++++++++++++-- > > 3 files changed, 68 insertions(+), 5 deletions(-) > > > > diff --git a/arch/riscv/include/asm/hwprobe.h b/arch/riscv/include/asm/hwprobe.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/uapi/asm/hwprobe.h b/arch/riscv/include/uapi/asm/hwprobe.h > > index 9f2a8e3ff204..6614d3adfc75 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,14 @@ 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 > > +/* > > + * It is not possible for one CPU to have multiple vendor ids, so each vendor > > + * has its own vendor extension "namespace". The keys for each vendor starts > > + * at zero. > > + */ > > +#define RISCV_HWPROBE_KEY_VENDOR_EXT_0 7 > > + /* T-Head */ > > +#define RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR (1 << 0) > > /* Increase RISCV_HWPROBE_MAX_KEY when adding items. */ > > > > /* Flags */ > > diff --git a/arch/riscv/kernel/sys_hwprobe.c b/arch/riscv/kernel/sys_hwprobe.c > > index e0a42c851511..365ce7380443 100644 > > --- a/arch/riscv/kernel/sys_hwprobe.c > > +++ b/arch/riscv/kernel/sys_hwprobe.c > > @@ -69,7 +69,8 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair, > > if (riscv_isa_extension_available(NULL, c)) > > pair->value |= RISCV_HWPROBE_IMA_C; > > > > - if (has_vector() && !riscv_has_vendor_extension_unlikely(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) > > + if (has_vector() && > > + !__riscv_isa_vendor_extension_available(NULL, RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) > > pair->value |= RISCV_HWPROBE_IMA_V; > > > > /* > > @@ -112,7 +113,8 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair, > > EXT_KEY(ZACAS); > > EXT_KEY(ZICOND); > > > > - if (has_vector() && !riscv_has_vendor_extension_unlikely(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) { > > + if (has_vector() && > > + !riscv_has_vendor_extension_unlikely(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR)) { > > EXT_KEY(ZVBB); > > EXT_KEY(ZVBC); > > EXT_KEY(ZVKB); > > @@ -139,6 +141,55 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair, > > pair->value &= ~missing; > > } > > > > +static void hwprobe_isa_vendor_ext0(struct riscv_hwprobe *pair, > > + const struct cpumask *cpus) > > +{ > > + int cpu; > > + u64 missing = 0; > > + > > + pair->value = 0; > > + > > + struct riscv_hwprobe mvendorid = { > > + .key = RISCV_HWPROBE_KEY_MVENDORID, > > + .value = 0 > > + }; > > + > > + hwprobe_arch_id(&mvendorid, cpus); > > + > > + /* Set value to zero if CPUs in the set do not have the same vendor. */ > > + if (mvendorid.value == -1ULL) > > + return; > > + > > + /* > > + * Loop through and record vendor extensions that 1) anyone has, and > > + * 2) anyone doesn't have. > > + */ > > + for_each_cpu(cpu, cpus) { > > + struct riscv_isainfo *isavendorinfo = &hart_isa_vendor[cpu]; > > + > > +#define VENDOR_EXT_KEY(ext) \ > > + do { \ > > + if (__riscv_isa_vendor_extension_available(isavendorinfo->isa, \ > > + RISCV_ISA_VENDOR_EXT_##ext)) \ > > + pair->value |= RISCV_HWPROBE_VENDOR_EXT_##ext; \ > > + else \ > > + missing |= RISCV_HWPROBE_VENDOR_EXT_##ext; \ > > + } while (false) > > + > > + /* > > + * Only use VENDOR_EXT_KEY() for extensions which can be exposed to userspace, > > + * regardless of the kernel's configuration, as no other checks, besides > > + * presence in the hart_vendor_isa bitmap, are made. > > + */ > > + VENDOR_EXT_KEY(XTHEADVECTOR); > > + > > +#undef VENDOR_EXT_KEY > > Hey Charlie, > Thanks for writing this up! At the very least I think the > THEAD-specific stuff should probably end up in its own file, otherwise > it'll get chaotic with vendors clamoring to add stuff right here. Great idea! > What do you think about this approach: > * We leave RISCV_HWPROBE_MAX_KEY as the max key for the "generic > world", eg 6-ish > * We define that any key above 0x8000000000000000 is in the vendor > space, so the meaning of the keys depends first on the mvendorid > value. > * In the kernel code, each new vendor adds on to a global struct, > which might look something like: > struct hwprobe_vendor_space vendor_space[] = { > { > .mvendorid = VENDOR_THEAD, > .max_hwprobe_key = THEAD_MAX_HWPROBE_KEY, // currently > 1 or 0x8000000000000001 with what you've got. > .hwprobe_fn = thead_hwprobe > }, > ... > }; > > * A hwprobe_thead.c implements thead_hwprobe(), and is called > whenever the generic hwprobe encounters a key >=0x8000000000000000. > * Generic code for setting up the VDSO can then still call the > vendor-specific hwprobe_fn() repeatedly with an "all CPUs" mask from > the base to max_hwprobe_key and set up the cached tables in userspace. > * Since the VDSO data has limited space we may have to cap the number > of vendor keys we cache to be lower than max_hwprobe_key. Since the > data itself is not exposed to usermode we can raise this cap later if > needed. I know vendor extensions are kind of the "wild west" of riscv, but in spite of that I want to design a consistent API. The issue I had with having this "vendor space" for exposing vendor extensions was that this is something that is inherently the same for all vendors. I see a vendor space like this more applicable for something like "RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE" where a vendor has a specific value they would like to expose. I do agree that having a vendor space is a good design choice, but I am not convinced that vendor extensions are the proper use-case. By having RISCV_HWPROBE_KEY_VENDOR_EXT_0 we can expose the vendor extensions in the same way that standard extensions are exposed, with a bitmask representing each extension. If these are instead in the vendor space, each vendor would probably be inclined to introduce a key like RISCV_HWPROBE_KEY_THEAD_EXT_0 that returns a bitmask of all of the thead vendor extensions. This duplicated effort is what I am trying to avoid. The alternative would be that vendors have a separate key for each vendor extension they would like to expose, but that is strictly less efficient than the existing bitmask probing. Do you think that having the vendor space is appropriate for vendor extensions given my concerns? - Charlie > > > -Evan > > > + } > > + > > + /* Now turn off reporting features if any CPU is missing it. */ > > + pair->value &= ~missing; > > +} > > + > > static bool hwprobe_ext0_has(const struct cpumask *cpus, unsigned long ext) > > { > > struct riscv_hwprobe pair; > > @@ -216,6 +267,10 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair, > > pair->value = riscv_cboz_block_size; > > break; > > > > + case RISCV_HWPROBE_KEY_VENDOR_EXT_0: > > + hwprobe_isa_vendor_ext0(pair, cpus); > > + 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 > > > > -- > > 2.44.0 > >