Received: by 2002:a05:7412:b995:b0:f9:9502:5bb8 with SMTP id it21csp7344405rdb; Wed, 3 Jan 2024 12:34:16 -0800 (PST) X-Google-Smtp-Source: AGHT+IGRLbY7xmVkWlEbm7or/0tQcXmXIepabgHXicAt7gZSosQTYtUzHeUi6ihzkp5pDaYUCkq0 X-Received: by 2002:a25:828e:0:b0:dbd:eb6:c1f8 with SMTP id r14-20020a25828e000000b00dbd0eb6c1f8mr9784242ybk.129.1704314056350; Wed, 03 Jan 2024 12:34:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704314056; cv=none; d=google.com; s=arc-20160816; b=Q/ZvDnX803UxEhiZ0FNTgTz7gV3Fh+elXdaasVREUHeiSCCsulJrI0dlYMrYz+oNVG fRK+Nj3mN5V2p+/jVXGT3jiRabB35N59yyGuhe1lK9M0lVbURZV6N8DixN0j0oj2B2sc VFfc6W+KiVAWTArF5J6nJo1V67kMrmJstpXnaSN4L+0Q4hb/Qpqeaq+0OynZzJ0RlNd1 lxsbS3YCyioVAJZFPLoHT8pIEG472vDofZirr4F+AgAQbN2QZbMTpzDwZuGNgdrxObQA iZAH397X3ksyW2XRnII357SLvgAYQEG0DJtLWxdxkchIltFrewGq2l0rW5NqYypH6wJP 13mw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:content-disposition:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=RiyTNg7lQj2mSX9lkM7av7VSsRqTM7vaccZZfAfdzko=; fh=KxWBAQ2j4LOBg6fIky6Ux3W6XSuczuXufC3dtbNnqn8=; b=gVNQ19k/KLg/ctz5PSTAlpX5PbQyG7JuW8aCp8dxO098+MmN/JqrIhYXgum0gtzzpe jiLA4RdYHOGl9s+UC7SCODSzzoIT/U3OAm/E9/LZhjMRgoh4KdEA8gjusAFw6dAkmmLf TZALpKaKkpzwv4/HbUWUFETr0jPIc/omxRHEj7zpBmufY7OJ4zhkGKMTuviwuy+jgOAP 4XwaKSpkuWswbCCOJ35iq+GFENjttjMamEAfbtG/EwH/KyInj0+xLilDog4gW8MRRmaY xMaJrdltkpmN9rXRAEKaWyCFdbPkp4p7la2zny6O5eoko7itzSB+CufiIIxv5m+uW6Fr Utzg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=BDJykAeI; spf=pass (google.com: domain of linux-kernel+bounces-15988-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15988-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id q3-20020a0ce203000000b0067f76abb772si30566713qvl.139.2024.01.03.12.34.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Jan 2024 12:34:16 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-15988-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=@redhat.com header.s=mimecast20190719 header.b=BDJykAeI; spf=pass (google.com: domain of linux-kernel+bounces-15988-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-15988-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com 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 117011C24587 for ; Wed, 3 Jan 2024 20:34:16 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 135A61D69A; Wed, 3 Jan 2024 20:34:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BDJykAeI" X-Original-To: linux-kernel@vger.kernel.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A48A1D687 for ; Wed, 3 Jan 2024 20:34:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1704314046; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RiyTNg7lQj2mSX9lkM7av7VSsRqTM7vaccZZfAfdzko=; b=BDJykAeIF6AI+jjdHjXM5oEjUqsK4DV9eDBhYGfDfy/+9WFD60aufT8O8tGSy8IrbLFCaz NVL9nAyuBsXO+3TduKWx8zmV7Px6sa44l8TO8bG7pYvygcYzqKCojVrt72Tb61bQthuU5n pvJTZgOqj4PGcJNonShtAcK1Sh+HLUU= Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-209-EILLpAmUOQi5MoXx47hYeA-1; Wed, 03 Jan 2024 15:33:59 -0500 X-MC-Unique: EILLpAmUOQi5MoXx47hYeA-1 Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-5cda0492c8eso10918740a12.3 for ; Wed, 03 Jan 2024 12:33:59 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704314037; x=1704918837; h=content-transfer-encoding:content-disposition:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=RiyTNg7lQj2mSX9lkM7av7VSsRqTM7vaccZZfAfdzko=; b=W1wCydx7kMtgtFgKTYqaN/TuF0Wz/KEucxETqT+RdKIheEenjiFVG/gEy/UamBEZe7 oTgytUU5j8rzrysoiFwNsRFO3l0ATJiknPlzu8uRrQM5Luux3IfLRZj+vaqednrgyMnS 8ECiAGd5xZvcjo40Wjmb9zqPEbAswbPVitFoBVQvFNVm8eRaR8CYWg5gB/TbRWxMnlu3 58BrG03WzXMXntsTVvtGjocCP9A2FtIar75SAs8qgfryyBbAixNEA0JVR2iRSk4sbGl6 EQRc4pHodmL/V78GyM+Kyyx0t18y65/aowSJgM5Nii6tLwMGTQmp8FP4rq+J+82ZEwfI deBw== X-Gm-Message-State: AOJu0YzD5Dag3pAW3vSDGDNJgHG5AOJ/Uh+msHOthONevA3yiEPXPonH Vb9ub2IlZOYOdi7J11KFMj6IxywFTUlsliEvMdpnqhwem8pW9H9mJrgy6EYYqYd4cVYLrOgaMpt +8roNbESYaS9DJGjOwoxBjD1JYAdrvXtw X-Received: by 2002:a17:90a:dac5:b0:286:a089:c3dd with SMTP id g5-20020a17090adac500b00286a089c3ddmr9275223pjx.62.1704314036296; Wed, 03 Jan 2024 12:33:56 -0800 (PST) X-Received: by 2002:a17:90a:dac5:b0:286:a089:c3dd with SMTP id g5-20020a17090adac500b00286a089c3ddmr9275209pjx.62.1704314035277; Wed, 03 Jan 2024 12:33:55 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7ec:911:6911:ca60:846:eb46]) by smtp.gmail.com with ESMTPSA id m11-20020a17090b068b00b0028658c6209dsm2186521pjz.2.2024.01.03.12.33.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Jan 2024 12:33:54 -0800 (PST) From: Leonardo Bras To: Andrew Jones Cc: Leonardo Bras , guoren@kernel.org, paul.walmsley@sifive.com, palmer@dabbelt.com, panqinglin2020@iscas.ac.cn, bjorn@rivosinc.com, conor.dooley@microchip.com, peterz@infradead.org, keescook@chromium.org, wuwei2016@iscas.ac.cn, xiaoguang.xing@sophgo.com, chao.wei@sophgo.com, unicorn_wang@outlook.com, uwu@icenowy.me, jszhang@kernel.org, wefu@redhat.com, atishp@atishpatra.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Guo Ren Subject: Re: Re: [PATCH V2 1/3] riscv: Add Zicbop instruction definitions & cpufeature Date: Wed, 3 Jan 2024 17:33:41 -0300 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240103-0c96ceea88523b7b946e4ba8@orel> References: <20231231082955.16516-1-guoren@kernel.org> <20231231082955.16516-2-guoren@kernel.org> <20240103-0c96ceea88523b7b946e4ba8@orel> 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=us-ascii Content-Disposition: inline Content-Transfer-Encoding: 8bit On Wed, Jan 03, 2024 at 08:29:39PM +0100, Andrew Jones wrote: > On Wed, Jan 03, 2024 at 03:52:00PM -0300, Leonardo Bras wrote: > > On Sun, Dec 31, 2023 at 03:29:51AM -0500, guoren@kernel.org wrote: > > > From: Guo Ren > > > > > > Cache-block prefetch instructions are HINTs to the hardware to > > > indicate that software intends to perform a particular type of > > > memory access in the near future. This patch adds prefetch.i, > > > prefetch.r and prefetch.w instruction definitions by > > > RISCV_ISA_EXT_ZICBOP cpufeature. > > > > Hi Guo Ren, > > > > Here it would be nice to point a documentation for ZICBOP extension: > > https://wiki.riscv.org/display/HOME/Recently+Ratified+Extensions > > > > or having a nice link for: > > https://drive.google.com/file/d/1jfzhNAk7viz4t2FLDZ5z4roA0LBggkfZ/view > > > > > > > > Signed-off-by: Guo Ren > > > Signed-off-by: Guo Ren > > > --- > > > arch/riscv/Kconfig | 15 ++++++++ > > > arch/riscv/include/asm/hwcap.h | 1 + > > > arch/riscv/include/asm/insn-def.h | 60 +++++++++++++++++++++++++++++++ > > > arch/riscv/kernel/cpufeature.c | 1 + > > > 4 files changed, 77 insertions(+) > > > > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > > index 24c1799e2ec4..fcbd417d65ea 100644 > > > --- a/arch/riscv/Kconfig > > > +++ b/arch/riscv/Kconfig > > > @@ -579,6 +579,21 @@ config RISCV_ISA_ZICBOZ > > > > > > If you don't know what to do here, say Y. > > > > > > +config RISCV_ISA_ZICBOP > > > + bool "Zicbop extension support for cache block prefetch" > > > + depends on MMU > > > + depends on RISCV_ALTERNATIVE > > > + default y > > > + help > > > + Adds support to dynamically detect the presence of the ZICBOP > > > + extension (Cache Block Prefetch Operations) and enable its > > > + usage. > > > + > > > + The Zicbop extension can be used to prefetch cache block for > > > + read/write fetch. > > > + > > > + If you don't know what to do here, say Y. > > > + > > > > According to doc: > > "The Zicbop extension defines a set of cache-block prefetch instructions: > > PREFETCH.R, PREFETCH.W, and PREFETCH.I" > > > > So above text seems ok > > > > > > > config TOOLCHAIN_HAS_ZIHINTPAUSE > > > bool > > > default y > > > diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h > > > index 06d30526ef3b..77d3b6ee25ab 100644 > > > --- a/arch/riscv/include/asm/hwcap.h > > > +++ b/arch/riscv/include/asm/hwcap.h > > > @@ -57,6 +57,7 @@ > > > #define RISCV_ISA_EXT_ZIHPM 42 > > > #define RISCV_ISA_EXT_SMSTATEEN 43 > > > #define RISCV_ISA_EXT_ZICOND 44 > > > +#define RISCV_ISA_EXT_ZICBOP 45 > > > > Is this number just in kernel code, or does it mean something in the RISC-V > > documentation? > > kernel Thanks! > > > > > > > > > #define RISCV_ISA_EXT_MAX 64 > > > > > > diff --git a/arch/riscv/include/asm/insn-def.h b/arch/riscv/include/asm/insn-def.h > > > index e27179b26086..bbda350a63bf 100644 > > > --- a/arch/riscv/include/asm/insn-def.h > > > +++ b/arch/riscv/include/asm/insn-def.h > > > @@ -18,6 +18,13 @@ > > > #define INSN_I_RD_SHIFT 7 > > > #define INSN_I_OPCODE_SHIFT 0 > > > > > > +#define INSN_S_SIMM7_SHIFT 25 > > > +#define INSN_S_RS2_SHIFT 20 > > > +#define INSN_S_RS1_SHIFT 15 > > > +#define INSN_S_FUNC3_SHIFT 12 > > > +#define INSN_S_SIMM5_SHIFT 7 > > > +#define INSN_S_OPCODE_SHIFT 0 > > > + > > > > The shifts seem correct for S-Type, but I would name the IMM defines in a > > way we could understand where they fit in IMM: > > > > > > INSN_S_SIMM5_SHIFT -> INSN_S_SIMM_0_4_SHIFT > > INSN_S_SIMM7_SHIFT -> INSN_S_SIMM_5_11_SHIFT > > > > What do you think? > > I'm in favor of this suggestion, but then wonder if we don't need another > patch before this which renames INSN_I_SIMM12_SHIFT to > INSN_I_SIMM_0_11_SHIFT in order to keep things consistent. Agree. If it's ok, I can provide a patch doing the rename on top of this patchset. > > > > > > > > #ifdef __ASSEMBLY__ > > > > > > #ifdef CONFIG_AS_HAS_INSN > > > @@ -30,6 +37,10 @@ > > > .insn i \opcode, \func3, \rd, \rs1, \simm12 > > > .endm > > > > > > + .macro insn_s, opcode, func3, rs2, simm12, rs1 > > > + .insn s \opcode, \func3, \rs2, \simm12(\rs1) > > > + .endm > > > + > > > #else > > > > > > #include > > > @@ -51,10 +62,20 @@ > > > (\simm12 << INSN_I_SIMM12_SHIFT)) > > > .endm > > > > > > + .macro insn_s, opcode, func3, rs2, simm12, rs1 > > > + .4byte ((\opcode << INSN_S_OPCODE_SHIFT) | \ > > > + (\func3 << INSN_S_FUNC3_SHIFT) | \ > > > + (.L__gpr_num_\rs2 << INSN_S_RS2_SHIFT) | \ > > > + (.L__gpr_num_\rs1 << INSN_S_RS1_SHIFT) | \ > > > + ((\simm12 & 0x1f) << INSN_S_SIMM5_SHIFT) | \ > > > + (((\simm12 >> 5) & 0x7f) << INSN_S_SIMM7_SHIFT)) > > > + .endm > > > + > > > #endif > > > > > > #define __INSN_R(...) insn_r __VA_ARGS__ > > > #define __INSN_I(...) insn_i __VA_ARGS__ > > > +#define __INSN_S(...) insn_s __VA_ARGS__ > > > > As a curiosity: It's quite odd to have prefetch.{i,r,w} to be an S-Type > > instruction, given this type was supposed to be for store instructions. > > > > On prefetch.{i,r,w}: > > 31 24 19 14 11 6 > > imm[11:5] | PREFETCH_OP | rs1 | ORI | imm[4:0] | OP_IMM > > > > For S-Type, we have: > > 31 24 19 14 11 6 > > imm[11:5] | rs1 | rs2 | funct3 | imm[4:0] | opcode > > > > For I-Type, we have: > > 31 19 14 11 6 > > immm[11:0] | rs1 | funct3 | rd | opcode > > > > I understand that there should be reasons for choosing S-type, but it > > would make much more sense (as per instruction type, and as per parameters) > > to go with I-Type. > > > > (I understand this was done in HW, and in kernel code we have better choice > > to encode it as S-Type, but I kind of find the S-Type choice odd) > > My speculation is that since cache block sizes will never be less than 32 > bytes, it made more sense to use the S-type encoding space with imm[4:0] > hard coded to zero, allowing the I-Type encoding space to be reserved for > instructions which need arbitrary 12-bit immediates. Yeah, this seems a good reason :) > > > > > > > > > #else /* ! __ASSEMBLY__ */ > > > > > > @@ -66,6 +87,9 @@ > > > #define __INSN_I(opcode, func3, rd, rs1, simm12) \ > > > ".insn i " opcode ", " func3 ", " rd ", " rs1 ", " simm12 "\n" > > > > > > +#define __INSN_S(opcode, func3, rs2, simm12, rs1) \ > > > + ".insn s " opcode ", " func3 ", " rs2 ", " simm12 "(" rs1 ")\n" > > > + > > > #else > > > > > > #include > > > @@ -92,12 +116,26 @@ > > > " (\\simm12 << " __stringify(INSN_I_SIMM12_SHIFT) "))\n" \ > > > " .endm\n" > > > > > > +#define DEFINE_INSN_S \ > > > + __DEFINE_ASM_GPR_NUMS \ > > > +" .macro insn_s, opcode, func3, rs2, simm12, rs1\n" \ > > > +" .4byte ((\\opcode << " __stringify(INSN_S_OPCODE_SHIFT) ") |" \ > > > +" (\\func3 << " __stringify(INSN_S_FUNC3_SHIFT) ") |" \ > > > +" (.L__gpr_num_\\rs2 << " __stringify(INSN_S_RS2_SHIFT) ") |" \ > > > +" (.L__gpr_num_\\rs1 << " __stringify(INSN_S_RS1_SHIFT) ") |" \ > > > +" ((\\simm12 & 0x1f) << " __stringify(INSN_S_SIMM5_SHIFT) ") |" \ > > > +" (((\\simm12 >> 5) & 0x7f) << " __stringify(INSN_S_SIMM7_SHIFT) "))\n" \ > > > +" .endm\n" > > > + > > > #define UNDEFINE_INSN_R \ > > > " .purgem insn_r\n" > > > > > > #define UNDEFINE_INSN_I \ > > > " .purgem insn_i\n" > > > > > > +#define UNDEFINE_INSN_S \ > > > +" .purgem insn_s\n" > > > + > > > #define __INSN_R(opcode, func3, func7, rd, rs1, rs2) \ > > > DEFINE_INSN_R \ > > > "insn_r " opcode ", " func3 ", " func7 ", " rd ", " rs1 ", " rs2 "\n" \ > > > @@ -108,6 +146,11 @@ > > > "insn_i " opcode ", " func3 ", " rd ", " rs1 ", " simm12 "\n" \ > > > UNDEFINE_INSN_I > > > > > > +#define __INSN_S(opcode, func3, rs2, simm12, rs1) \ > > > + DEFINE_INSN_S \ > > > + "insn_s " opcode ", " func3 ", " rs2 ", " simm12 ", " rs1 "\n" \ > > > + UNDEFINE_INSN_S > > > + > > > #endif > > > > > > #endif /* ! __ASSEMBLY__ */ > > > @@ -120,6 +163,10 @@ > > > __INSN_I(RV_##opcode, RV_##func3, RV_##rd, \ > > > RV_##rs1, RV_##simm12) > > > > > > +#define INSN_S(opcode, func3, rs2, simm12, rs1) \ > > > + __INSN_S(RV_##opcode, RV_##func3, RV_##rs2, \ > > > + RV_##simm12, RV_##rs1) > > > + > > > > The defines above seem correct, but TBH I am not very used to review > > .macro code. > > > > > #define RV_OPCODE(v) __ASM_STR(v) > > > #define RV_FUNC3(v) __ASM_STR(v) > > > #define RV_FUNC7(v) __ASM_STR(v) > > > @@ -133,6 +180,7 @@ > > > #define RV___RS2(v) __RV_REG(v) > > > > > > #define RV_OPCODE_MISC_MEM RV_OPCODE(15) > > > +#define RV_OPCODE_OP_IMM RV_OPCODE(19) > > > > Correct. > > > > > > > #define RV_OPCODE_SYSTEM RV_OPCODE(115) > > > > > > #define HFENCE_VVMA(vaddr, asid) \ > > > @@ -196,4 +244,16 @@ > > > INSN_I(OPCODE_MISC_MEM, FUNC3(2), __RD(0), \ > > > RS1(base), SIMM12(4)) > > > > > > +#define CBO_PREFETCH_I(base, offset) \ > > > + INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(0), \ > > > + SIMM12(offset), RS1(base)) > > > + > > > +#define CBO_PREFETCH_R(base, offset) \ > > > + INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(1), \ > > > + SIMM12(offset), RS1(base)) > > > + > > > +#define CBO_PREFETCH_W(base, offset) \ > > > + INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(3), \ > > > + SIMM12(offset), RS1(base)) > > > + > > > > For OP_IMM & FUNC3(6) we have ORI, right? > > For ORI, rd will be at bytes 11:7, which in PREFETCH.{i,r,w} is > > offset[4:0]. > > > > IIUC, when the cpu does not support ZICBOP, this should be fine as long as > > rd = 0, since changes to r0 are disregarded. > > > > In this case, we need to guarantee offset[4:0] = 0, or else we migth write > > on an unrelated register. This can be noticed in ZICBOP documentation pages > > 21, 22, 23, as offset[4:0] is always [0 0 0 0 0]. > > (Google docs in first comment) > > > > What we need here is something like: > > + enum { > > + PREFETCH_I, > > + PREFETCH_R, > > + PREFETCH_W, > > + } > > Can't use enum. This header may be included in assembly. Oh, I suggest defines then, since it's better to make it clear instead of using 0, 1, 3. > > > + > > + #define CBO_PREFETCH(type, base, offset) \ > > + INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(type), \ > > + SIMM12(offset & ~0x1f), RS1(base)) > > Yes. I suggested we mask offset as well, but ideally we'd detect a caller > using an offset with nonzero lower 5 bits at compile time. I would suggest the compiler would take care of this, but I am not sure about the assembly, since I am not sure if it gets any optimization. I don't think we can detect a caller with non-zero offset at compile time, since it will be used in locks which can be at (potentially) any place in the block size. (if you have any idea though, please let me know :) ) On the other hand, we could create a S-Type macro which deliberately ignores imm[4:0], like + INSN_S_TRUNCATE(OPCODE_OP_IMM, FUNC3(6), __RS2(3), \ + SIMM12(offset), RS1(base)) Which saves the bits 11:5 of offset into imm[11:5], and zero-fill imm[4:0], like +#define DEFINE_INSN_S \ + __DEFINE_ASM_GPR_NUMS \ +" .macro insn_s, opcode, func3, rs2, simm12, rs1\n" \ +" .4byte ((\\opcode << " __stringify(INSN_S_OPCODE_SHIFT) ") |" \ +" (\\func3 << " __stringify(INSN_S_FUNC3_SHIFT) ") |" \ +" (.L__gpr_num_\\rs2 << " __stringify(INSN_S_RS2_SHIFT) ") |" \ +" (.L__gpr_num_\\rs1 << " __stringify(INSN_S_RS1_SHIFT) ") |" \ +" (((\\simm12 >> 5) & 0x7f) << " __stringify(INSN_S_SIMM7_SHIFT) "))\n" \ +" .endm\n" + Does this make sense? Thanks! Leo > > Thanks, > drew > > > > > + #define CBO_PREFETCH_I(base, offset) \ > > + CBO_PREFETCH(PREFETCH_I, base, offset) > > + > > + #define CBO_PREFETCH_R(base, offset) \ > > + CBO_PREFETCH(PREFETCH_R, base, offset) > > + > > + #define CBO_PREFETCH_W(base, offset) \ > > + CBO_PREFETCH(PREFETCH_W, base, offset) > > + > > > > Maybe replacing 0x1f by some MASK macro, so it looks nicer. > > (not sure how it's acceptable in asm, though). > > > > The above would guarantee that we would never have CBO_PREFETCH_*() to mess > > up any other register due to a unnoticed (base & 0x1f) != 0 > > > > Does that make sense? > > > > > #endif /* __ASM_INSN_DEF_H */ > > > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c > > > index b3785ffc1570..bdb02b066041 100644 > > > --- a/arch/riscv/kernel/cpufeature.c > > > +++ b/arch/riscv/kernel/cpufeature.c > > > @@ -168,6 +168,7 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = { > > > __RISCV_ISA_EXT_DATA(h, RISCV_ISA_EXT_h), > > > __RISCV_ISA_EXT_DATA(zicbom, RISCV_ISA_EXT_ZICBOM), > > > __RISCV_ISA_EXT_DATA(zicboz, RISCV_ISA_EXT_ZICBOZ), > > > + __RISCV_ISA_EXT_DATA(zicbop, RISCV_ISA_EXT_ZICBOP), > > > __RISCV_ISA_EXT_DATA(zicntr, RISCV_ISA_EXT_ZICNTR), > > > __RISCV_ISA_EXT_DATA(zicond, RISCV_ISA_EXT_ZICOND), > > > __RISCV_ISA_EXT_DATA(zicsr, RISCV_ISA_EXT_ZICSR), > > > -- > > > 2.40.1 > > > > > > > Apart from above suggestions, seems a nice change :) > > > > I suggest splitting this patch into 2, though: > > - Introducing S-Type instructions (plz point docs for reference) > > - Introduce ZICBOP extension. > > > > Thanks! > > Leo > > > > >