Received: by 2002:a25:b323:0:0:0:0:0 with SMTP id l35csp1804011ybj; Sun, 22 Sep 2019 12:17:12 -0700 (PDT) X-Google-Smtp-Source: APXvYqy5knpCaMMGujyyD5/WuzxUYldmA6c/EYT6RQuLApyN+1iSQkrIVKl3sNOebEFIqzdxihhq X-Received: by 2002:aa7:c614:: with SMTP id h20mr20486790edq.209.1569179832555; Sun, 22 Sep 2019 12:17:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569179832; cv=none; d=google.com; s=arc-20160816; b=tssu67KwLLyszBAvy7+5B2zHc1Cy4PpEM4fjI1/bVXf+zt9pT8Ns1yeoEV3lR3PPh0 PAK8GKzPvXzGw2BKljhn1eBl6kkDhyopzVB5JuW7Sg4tNTRVrvXNincmCFRRJIWeBnag ks5obG6QCeZZbQPk41+Lfqrk1kZRMn/BOGUmaLi1p5drT5TJjYZghMtc9O5CCBT6PEKz a2DP27z0ybyzUK8m0DRjCIUO4BHJ537AeELhsunDYeg/GKsk7ngOfSPU0g4mdJRNNyO2 FssMs9zudZJLPPO0kMWz8zqVFxFv+8gflq1D4Ocfufu2+1nyRNEsZePvb/ZaaqgPeuqg 6a7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :message-id:in-reply-to:subject:cc:to:from:date:dkim-signature; bh=IH+HLtM3m/3AdPUwWj10yu5azF09YSyrzk+IE7lz+/c=; b=m9Km+aVlVlfTj3Q5Gq04fhdgsiLFa8DQbki/qY8aEqLFyn+PCenad0NXN4IOuSYIC3 pcZFUAYJnNJ7DfO2AiBE2/UuJzJ1BZzYh/6wpmvganxueisieSmTkWCs0fnH0W5FHgrN y6rwAggIc/rdP3nj6FHXTVnv3Sr9tAskiMv/1ZiXu5hO+jedBNE2QRqP+UOAn2xMOKdt 2dXwSiqtD8V4Sn2oMrKdXwZ2t4dO1yDudsXoSGCn8Du41q3+VRdw+FlKp3nOYbdsIYFK RW3Syy5xIxjEOaBsZijZpW24kEhYtgmXuW+xP8+4EroJRiQdNwv2D+ypwZzHtvy2EXKD LpPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sifive.com header.s=google header.b=Fjk5VEoH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p10si3869594ejz.391.2019.09.22.12.16.48; Sun, 22 Sep 2019 12:17:12 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@sifive.com header.s=google header.b=Fjk5VEoH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2407416AbfIUKBh (ORCPT + 99 others); Sat, 21 Sep 2019 06:01:37 -0400 Received: from mail-ot1-f67.google.com ([209.85.210.67]:34145 "EHLO mail-ot1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2407333AbfIUKBg (ORCPT ); Sat, 21 Sep 2019 06:01:36 -0400 Received: by mail-ot1-f67.google.com with SMTP id m19so6437433otp.1 for ; Sat, 21 Sep 2019 03:01:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version; bh=IH+HLtM3m/3AdPUwWj10yu5azF09YSyrzk+IE7lz+/c=; b=Fjk5VEoH5TXP2GebQ8rtvVO7k9C2SXvanErm1z29Ux6o9KEmemDWy4J5YavIqS1uhz ciEkXtoyKr9e0ZEDCPCY3hR1EHJw+u2cLLz+NLb4Mue3jxoRiONck0rrPTK9sSX7DgAA 0oSzI8Gky1LOekb3pThUJsHuuLUvQ5ZW4Nd06XqXZwjZwjoc/McC+6yjy9/gujgon9Mn 4l+iuQeFGCkuofllZWdd9TewxT7mZmI0dGTmdqTOKUh7U9WyN3+YUXgIG7hxs+vHZFap ZeZMaadQmZPnKHajASa834VOs1nMVjtUJfOU4eaHrEtjrU3cqmRHqtgGhWFAcZ5SsHyw 9JiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version; bh=IH+HLtM3m/3AdPUwWj10yu5azF09YSyrzk+IE7lz+/c=; b=Gj+1dpEuy1hFZVdB95ColbuXFVjXjusBDcvc7BaENBwlLRKfaOU3GbD5TZNtZHm02D JyFJPTr6oWd8I1lZ0mOGGdZp9aCn7LAq2Am7j3CpAr/Vf6ROo7dquHE1/P+Yq1cAirXg yS7Chu4scT+tFTPhPhjmBxJwjGjAuTBUVQCdaxPxY1hnqgpcKAFq0Eb7OMfVxZIqCOV3 tUWWN8W0UX5HruCbTxt/Nse8tfsNdrbVhLvwB3Z6LSdEmbbYa0Jzk21bU3h+T2okqv5j yWJjfO+1uX8RnqfCDNykoTDFFDbwWzP9wtRo5YjkGg+ea9adJUFT5lqBMVZ8yAHVtyfP UxQg== X-Gm-Message-State: APjAAAVok9wdB+79DtiQOir4Bj+JlyCKdIem48nS79BuzsYE4tQOnNoC 4aE29sUnOB5lTPldQWa7kSfGnA== X-Received: by 2002:a05:6830:1e2b:: with SMTP id t11mr4492721otr.119.1569060094783; Sat, 21 Sep 2019 03:01:34 -0700 (PDT) Received: from localhost (184.sub-174-206-23.myvzw.com. [174.206.23.184]) by smtp.gmail.com with ESMTPSA id l17sm1309105oic.24.2019.09.21.03.01.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Sep 2019 03:01:34 -0700 (PDT) Date: Sat, 21 Sep 2019 03:01:27 -0700 (PDT) From: Paul Walmsley X-X-Sender: paulw@viisi.sifive.com To: Anup Patel cc: Palmer Dabbelt , Paolo Bonzini , Radim K , Daniel Lezcano , Thomas Gleixner , Alexander Graf , Atish Patra , Alistair Francis , Damien Le Moal , Christoph Hellwig , Anup Patel , "kvm@vger.kernel.org" , "linux-riscv@lists.infradead.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH v7 02/21] RISC-V: Add bitmap reprensenting ISA features common across CPUs In-Reply-To: <20190904161245.111924-4-anup.patel@wdc.com> Message-ID: References: <20190904161245.111924-1-anup.patel@wdc.com> <20190904161245.111924-4-anup.patel@wdc.com> User-Agent: Alpine 2.21.9999 (DEB 301 2018-08-15) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Anup, Thanks for changing this to use a bitmap. A few comments below - On Wed, 4 Sep 2019, Anup Patel wrote: > This patch adds riscv_isa bitmap which represents Host ISA features > common across all Host CPUs. The riscv_isa is not same as elf_hwcap > because elf_hwcap will only have ISA features relevant for user-space > apps whereas riscv_isa will have ISA features relevant to both kernel > and user-space apps. > > One of the use-case for riscv_isa bitmap is in KVM hypervisor where > we will use it to do following operations: > > 1. Check whether hypervisor extension is available > 2. Find ISA features that need to be virtualized (e.g. floating > point support, vector extension, etc.) > > Signed-off-by: Anup Patel > Signed-off-by: Atish Patra > Reviewed-by: Alexander Graf > --- > arch/riscv/include/asm/hwcap.h | 26 +++++++++++ > arch/riscv/kernel/cpufeature.c | 79 ++++++++++++++++++++++++++++++++-- > 2 files changed, 102 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h > index 7ecb7c6a57b1..9b657375aa51 100644 > --- a/arch/riscv/include/asm/hwcap.h > +++ b/arch/riscv/include/asm/hwcap.h > @@ -8,6 +8,7 @@ > #ifndef __ASM_HWCAP_H > #define __ASM_HWCAP_H > > +#include > #include > > #ifndef __ASSEMBLY__ > @@ -22,5 +23,30 @@ enum { > }; > > extern unsigned long elf_hwcap; > + > +#define RISCV_ISA_EXT_a ('a' - 'a') > +#define RISCV_ISA_EXT_c ('c' - 'a') > +#define RISCV_ISA_EXT_d ('d' - 'a') > +#define RISCV_ISA_EXT_f ('f' - 'a') > +#define RISCV_ISA_EXT_h ('h' - 'a') > +#define RISCV_ISA_EXT_i ('i' - 'a') > +#define RISCV_ISA_EXT_m ('m' - 'a') > +#define RISCV_ISA_EXT_s ('s' - 'a') > +#define RISCV_ISA_EXT_u ('u' - 'a') > +#define RISCV_ISA_EXT_zicsr (('z' - 'a') + 1) > +#define RISCV_ISA_EXT_zifencei (('z' - 'a') + 2) > +#define RISCV_ISA_EXT_zam (('z' - 'a') + 3) > +#define RISCV_ISA_EXT_ztso (('z' - 'a') + 4) If we add the Z extensions here, it's probably best if we drop Zam from this list. The rationale is, as maintainers, we're planning to hold off on merging any support for extensions or modules that aren't in the "frozen" or "ratified" states, and according to the RISC-V specs, Zicsr, Zifencei, and Ztso are all either frozen or ratified. However, see below - > + > +#define RISCV_ISA_EXT_MAX 256 > + > +unsigned long riscv_isa_extension_base(const unsigned long *isa_bitmap); > + > +#define riscv_isa_extension_mask(ext) BIT_MASK(RISCV_ISA_EXT_##ext) > + > +bool __riscv_isa_extension_available(const unsigned long *isa_bitmap, int bit); > +#define riscv_isa_extension_available(isa_bitmap, ext) \ > + __riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_##ext) > + > #endif > #endif > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c > index b1ade9a49347..4ce71ce5e290 100644 > --- a/arch/riscv/kernel/cpufeature.c > +++ b/arch/riscv/kernel/cpufeature.c > @@ -6,21 +6,64 @@ > * Copyright (C) 2017 SiFive > */ > > +#include > #include > #include > #include > #include > > unsigned long elf_hwcap __read_mostly; > + > +/* Host ISA bitmap */ > +static DECLARE_BITMAP(riscv_isa, RISCV_ISA_EXT_MAX) __read_mostly; > + > #ifdef CONFIG_FPU > bool has_fpu __read_mostly; > #endif > > +/** > + * riscv_isa_extension_base - Get base extension word > + * > + * @isa_bitmap ISA bitmap to use > + * @returns base extension word as unsigned long value > + * > + * NOTE: If isa_bitmap is NULL then Host ISA bitmap will be used. > + */ Am happy to see comments that can be automatically parsed, but could you reformat them into kernel-doc format? https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/doc-guide/kernel-doc.rst > +unsigned long riscv_isa_extension_base(const unsigned long *isa_bitmap) > +{ > + if (!isa_bitmap) > + return riscv_isa[0]; > + return isa_bitmap[0]; > +} > +EXPORT_SYMBOL_GPL(riscv_isa_extension_base); > + > +/** > + * __riscv_isa_extension_available - Check whether given extension > + * is available or not > + * > + * @isa_bitmap ISA bitmap to use > + * @bit bit position of the desired extension > + * @returns true or false > + * > + * NOTE: If isa_bitmap is NULL then Host ISA bitmap will be used. > + */ Same comment as above. > +bool __riscv_isa_extension_available(const unsigned long *isa_bitmap, int bit) > +{ > + const unsigned long *bmap = (isa_bitmap) ? isa_bitmap : riscv_isa; > + > + if (bit >= RISCV_ISA_EXT_MAX) > + return false; > + > + return test_bit(bit, bmap) ? true : false; > +} > +EXPORT_SYMBOL_GPL(__riscv_isa_extension_available); > + > void riscv_fill_hwcap(void) > { > struct device_node *node; > const char *isa; > - size_t i; > + char print_str[BITS_PER_LONG+1]; > + size_t i, j, isa_len; > static unsigned long isa2hwcap[256] = {0}; > > isa2hwcap['i'] = isa2hwcap['I'] = COMPAT_HWCAP_ISA_I; > @@ -32,8 +75,11 @@ void riscv_fill_hwcap(void) > > elf_hwcap = 0; > > + bitmap_zero(riscv_isa, RISCV_ISA_EXT_MAX); > + > for_each_of_cpu_node(node) { > unsigned long this_hwcap = 0; > + unsigned long this_isa = 0; > > if (riscv_of_processor_hartid(node) < 0) > continue; > @@ -43,8 +89,20 @@ void riscv_fill_hwcap(void) > continue; > } > > - for (i = 0; i < strlen(isa); ++i) > + i = 0; > + isa_len = strlen(isa); > +#if defined(CONFIG_32BIT) > + if (!strncmp(isa, "rv32", 4)) > + i += 4; > +#elif defined(CONFIG_64BIT) > + if (!strncmp(isa, "rv64", 4)) > + i += 4; > +#endif > + for (; i < isa_len; ++i) { > this_hwcap |= isa2hwcap[(unsigned char)(isa[i])]; > + if ('a' <= isa[i] && isa[i] <= 'z') > + this_isa |= (1UL << (isa[i] - 'a')); Continuing from the earlier comment, this code won't properly handle the X and Z prefix extensions. So maybe for the time being, we should just drop the lines mentioned earlier that imply that we can parse Z-prefix extensions, and change this line so it ignores X and Z letters? Then a subsequent patch can add support for more complicated extension string parsing. > + } > > /* > * All "okay" hart should have same isa. Set HWCAP based on > @@ -55,6 +113,11 @@ void riscv_fill_hwcap(void) > elf_hwcap &= this_hwcap; > else > elf_hwcap = this_hwcap; > + > + if (riscv_isa[0]) > + riscv_isa[0] &= this_isa; > + else > + riscv_isa[0] = this_isa; > } > > /* We don't support systems with F but without D, so mask those out > @@ -64,7 +127,17 @@ void riscv_fill_hwcap(void) > elf_hwcap &= ~COMPAT_HWCAP_ISA_F; > } > > - pr_info("elf_hwcap is 0x%lx\n", elf_hwcap); > + memset(print_str, 0, sizeof(print_str)); > + for (i = 0, j = 0; i < BITS_PER_LONG; i++) > + if (riscv_isa[0] & BIT_MASK(i)) > + print_str[j++] = (char)('a' + i); > + pr_info("riscv: ISA extensions %s\n", print_str); > + > + memset(print_str, 0, sizeof(print_str)); > + for (i = 0, j = 0; i < BITS_PER_LONG; i++) > + if (elf_hwcap & BIT_MASK(i)) > + print_str[j++] = (char)('a' + i); > + pr_info("riscv: ELF capabilities %s\n", print_str); > > #ifdef CONFIG_FPU > if (elf_hwcap & (COMPAT_HWCAP_ISA_F | COMPAT_HWCAP_ISA_D)) > -- > 2.17.1 > > - Paul