Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp16001255rwd; Mon, 26 Jun 2023 04:33:44 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ44BePJOpPPwjRrk8cYssIVNrr1juXzcw/vhYHa0Cz+M1Ok1iXBFtLnBTlkhrNKb80+iLa1 X-Received: by 2002:aa7:d058:0:b0:51d:9f6b:1b96 with SMTP id n24-20020aa7d058000000b0051d9f6b1b96mr781279edo.40.1687779224641; Mon, 26 Jun 2023 04:33:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687779224; cv=none; d=google.com; s=arc-20160816; b=LJ7ZRQ70gnMWz2dnh3RgqHVXx4FNMyrJN2KMdPDD6LBSuy8TjtONRShDa7ShQt5W1H OSH7kUuMuv10PTbMwKLRVIKPPs43KVaGILxevDuG+7MWcEjrqZPuxD19B8yHltNTVNg9 qUjPAE/FUjEgKjzmrg5E2U/uoCWfP8NynECI0SwSTaLQcwWaExPOe7PhH44r67KixGBv APzH05hSB32CJIARjBhk1usVotmxCFhZUz2wDnUcflyQPU63ZTZrQ/HS2d5I3DIttopH rbe2R76mAjBgTv7CTRYLZMfKqVhAMuDwCcxEozd1qhGYT7h+b+bumGzIr2JrBnjqDi1X hwcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=R+XLmAv0IMdL1XndgOz+rJKNq/66YIU8I3/IIfTS48U=; fh=id5NoWTfrmVnmm2w/Ed5X4erHGUuViLdGWw+WL1NNbc=; b=BSIyeRcdpojSO9Fdp8gbeJiaA3xngBUchWtwZWfQlX+9XHdFLdPCK7gzDGd7diK9bG Xt0zRQcFaAW7XSoe1Lf+/2B8+IKCeSBwIfVBxZmWQrCV/CsCgbZAV4Fftivvr9Ip7wXh 10/rdUY7cSa2a/hOz27e+9C4PaqgPb0L4kbqMGQ69M+YxztAfI66Kdg5tYaeVX4H88ZB bMvMcyd+A3177Or9RFdapR//HGkqv6iI55RHPBomybjgOcZMNqX1t7OXaGMUBBQtGc4R CnUJtSgj92/vde0TacwDGvBYPOiLdH58Bt35P+BjFPFtYh7sjaHY0iKLZy8tQpoV5+R5 rqTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@microchip.com header.s=mchp header.b=YxHCoiA2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l20-20020aa7cad4000000b00518744a06a4si2471075edt.83.2023.06.26.04.33.18; Mon, 26 Jun 2023 04:33:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@microchip.com header.s=mchp header.b=YxHCoiA2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229566AbjFZLVl (ORCPT + 99 others); Mon, 26 Jun 2023 07:21:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56894 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230043AbjFZLVZ (ORCPT ); Mon, 26 Jun 2023 07:21:25 -0400 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.154.123]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 95CF81BE2; Mon, 26 Jun 2023 04:21:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1687778470; x=1719314470; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ELcThGgPV8TgNeRjLRDN3LuYnlZfadeE3nwnvrWBouo=; b=YxHCoiA2yFc8nqwVIre0LgzqHf+jRKJ7kFYVuPTbkFv1meHfjtWTTy0e +cZMYLEPEcmQm/UGxFNDSfiCJQLQsUwkG7GHKQEXiFpPEb52a2kuhKnxN 3Yh46OuIfw1nvpllQd6RYrPLBsrdUC8o4T32S/U4oLzFcU36jLM1P3uAY QS2CYMAwMfW1il1RrVy24OA+2JmDm4S63b9RoZTlBltBvdT/ezIuHXwre 2MCDFSXyyT/koyw0hyx/hPq9gmLhSeBz8EoRYjv8rXz5a3TdiC6a4CMUZ xe1r5yn35YvZMIJJcL5Vpac1Wl1gPVR1AY/w2n1YtKw1zyWt2OhFaCIRo w==; X-IronPort-AV: E=Sophos;i="6.01,159,1684825200"; d="scan'208";a="158621103" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa6.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 26 Jun 2023 04:21:09 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Mon, 26 Jun 2023 04:21:06 -0700 Received: from wendy.microchip.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.2507.21 via Frontend Transport; Mon, 26 Jun 2023 04:21:04 -0700 From: Conor Dooley To: CC: , , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Albert Ou , Andrew Jones , Heiko Stuebner , "Evan Green" , Sunil V L , , , Subject: [PATCH v1 8/9] RISC-V: enable extension detection from new properties Date: Mon, 26 Jun 2023 12:19:46 +0100 Message-ID: <20230626-unfasten-guidance-eac4d71d8876@wendy> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230626-provable-angrily-81760e8c3cc6@wendy> References: <20230626-provable-angrily-81760e8c3cc6@wendy> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4380; i=conor.dooley@microchip.com; h=from:subject:message-id; bh=ELcThGgPV8TgNeRjLRDN3LuYnlZfadeE3nwnvrWBouo=; b=owGbwMvMwCFWscWwfUFT0iXG02pJDCkzS/x7Us3kvE7JNEeYzVmnHRjy4PLc9x9agm7YP+2f9eoD Q51cRykLgxgHg6yYIkvi7b4WqfV/XHY497yFmcPKBDKEgYtTACYy7QPD/1SvndnHp8x8cWg6C1PbiW Nfsy69/CFw3uOOMVNQ/3Pxoh+MDDPXWu7s1JL1fZnX6q348WPrpk3HSoyXpag9TQi1+Vv9lREA X-Developer-Key: i=conor.dooley@microchip.com; a=openpgp; fpr=F9ECA03CF54F12CD01F1655722E2C55B37CF380C Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_PASS,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for parsing the new riscv,isa-extensions property in riscv_fill_hwcap(), by means of a new "property" member of the riscv_isa_ext_data struct. For now, this shadows the name of the extension, however this may not be the case for all extensions. For the sake of backwards compatibility, fall back to the old scheme if the new properties are not detected. For now, just inform, rather than warn, when that happens. Signed-off-by: Conor Dooley --- Naming things is hard, didn't know what to call the new function... --- arch/riscv/include/asm/hwcap.h | 1 + arch/riscv/kernel/cpufeature.c | 80 ++++++++++++++++++++++++++++++---- 2 files changed, 72 insertions(+), 9 deletions(-) diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h index 6ad896dc4342..e7f235868aa2 100644 --- a/arch/riscv/include/asm/hwcap.h +++ b/arch/riscv/include/asm/hwcap.h @@ -77,6 +77,7 @@ unsigned long riscv_get_elf_hwcap(void); struct riscv_isa_ext_data { const unsigned int id; const char *name; + const char *property; const bool multi_letter; }; diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c index 366477ba1eea..72eb757ad871 100644 --- a/arch/riscv/kernel/cpufeature.c +++ b/arch/riscv/kernel/cpufeature.c @@ -101,6 +101,7 @@ static bool riscv_isa_extension_check(int id) #define __RISCV_ISA_EXT_DATA(_name, _id, _multi) { \ .name = #_name, \ + .property = #_name, \ .id = _id, \ .multi_letter = _multi, \ } @@ -416,16 +417,66 @@ static void __init riscv_fill_hwcap_from_isa_string(unsigned long *isa2hwcap) acpi_put_table((struct acpi_table_header *)rhct); } +static int __init riscv_fill_hwcap_new(unsigned long *isa2hwcap) +{ + unsigned int cpu; + + for_each_possible_cpu(cpu) { + unsigned long this_hwcap = 0; + struct device_node *cpu_node; + DECLARE_BITMAP(this_isa, RISCV_ISA_EXT_MAX); + + cpu_node = of_cpu_device_node_get(cpu); + if (!cpu_node) { + pr_warn("Unable to find cpu node\n"); + continue; + } + + if (!of_property_present(cpu_node, "riscv,isa-extensions")) + continue; + + for (int i = 0; i < riscv_isa_ext_count; i++) { + if (of_property_match_string(cpu_node, "riscv,isa-extensions", + riscv_isa_ext[i].name) < 0) + continue; + + if (!riscv_isa_extension_check(riscv_isa_ext[i].id)) + continue; + + if (!riscv_isa_ext[i].multi_letter) + this_hwcap |= isa2hwcap[riscv_isa_ext[i].id]; + + set_bit(riscv_isa_ext[i].id, this_isa); + } + + of_node_put(cpu_node); + + /* + * All "okay" harts should have same isa. Set HWCAP based on + * common capabilities of every "okay" hart, in case they don't. + */ + if (elf_hwcap) + elf_hwcap &= this_hwcap; + else + elf_hwcap = this_hwcap; + + if (bitmap_empty(riscv_isa, RISCV_ISA_EXT_MAX)) + bitmap_copy(riscv_isa, this_isa, RISCV_ISA_EXT_MAX); + else + bitmap_and(riscv_isa, riscv_isa, this_isa, RISCV_ISA_EXT_MAX); + } + + if (bitmap_empty(riscv_isa, RISCV_ISA_EXT_MAX)) + return -ENOENT; + + return 0; +} + void __init riscv_fill_hwcap(void) { - struct device_node *node; - const char *isa; char print_str[NUM_ALPHA_EXTS + 1]; - int i, j, rc; unsigned long isa2hwcap[26] = {0}; - struct acpi_table_header *rhct; - acpi_status status; - unsigned int cpu; + int i, j; isa2hwcap['i' - 'a'] = COMPAT_HWCAP_ISA_I; isa2hwcap['m' - 'a'] = COMPAT_HWCAP_ISA_M; @@ -435,10 +486,21 @@ void __init riscv_fill_hwcap(void) isa2hwcap['c' - 'a'] = COMPAT_HWCAP_ISA_C; isa2hwcap['v' - 'a'] = COMPAT_HWCAP_ISA_V; - riscv_fill_hwcap_from_isa_string(isa2hwcap); + if (!acpi_disabled) { + riscv_fill_hwcap_from_isa_string(isa2hwcap); + } else { + int ret = riscv_fill_hwcap_new(isa2hwcap); - /* We don't support systems with F but without D, so mask those out - * here. */ + if (ret) { + pr_info("Falling back to deprecated \"riscv,isa\"\n"); + riscv_fill_hwcap_from_isa_string(isa2hwcap); + } + } + + /* + * We don't support systems with F but without D, so mask those out + * here. + */ if ((elf_hwcap & COMPAT_HWCAP_ISA_F) && !(elf_hwcap & COMPAT_HWCAP_ISA_D)) { pr_info("This kernel does not support systems with F but not D\n"); elf_hwcap &= ~COMPAT_HWCAP_ISA_F; -- 2.40.1