Received: by 2002:a05:7412:518d:b0:e2:908c:2ebd with SMTP id fn13csp525812rdb; Thu, 5 Oct 2023 12:57:15 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEh1/own5DjoVcbxrgPikXWE5Ca0kYsS0bOVw5prTse8woF8Lv3Fr24D1jIa6DFiWb8NAJ1 X-Received: by 2002:a05:6a20:3d87:b0:15b:b83c:9b48 with SMTP id s7-20020a056a203d8700b0015bb83c9b48mr3108043pzi.24.1696535834707; Thu, 05 Oct 2023 12:57:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696535834; cv=none; d=google.com; s=arc-20160816; b=AU0ia6rs+TL/gLiDSaFu7brai+Wd2Lhb719wCglZzsIbg5EXHhbQRv2sP0vWAoas9f 6rubAwodDinujGDTczMWxNnFMwgSP14Y9qYRKijsnpIO7T3hpIE7m06FEZXLTt6L26h3 H8jevBmBy7Gczd9ThEwmhQItUArr9IWrY6GAm7fzpWhscg81N5rNQuXEYbkoMKGCZYkH bHzrVmnD16bk/Dyo++qLk/WEzGj8uotZdiznwm2wAutCZ8OYnLALfvGWOb8QvScWn5y5 s6krZblL63yL53YuVVcAMJbqIIwUY1NAqvJ4+TeYTUn0yF5MjhuFjsTA++ZrVSLzzDtd ONrQ== 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=kcjwXYKtheMcVNG8/FA3roMWtVNimnl488eqyPrF8YA=; fh=dyN8rlR8DIsO7hGArNuYLUXtXvDlE6dkZecyfb1jp0w=; b=D/EgL0AjJUiSeCEi4IGKjMEuLVrwEsezm1i2fTtXjerV6EmBUUzo96gtJLnFzhkBGF 91jenygKmZ8nMi5iqMeB9oefPCUY1r9iL6Itp/yK4JfLpbYuQaBv2jtqCvgkWKaWNJPR Uf6lfN3WHv89dsNrWxjUZ8N86q6xnH1wmBb7XyswGIiD6HQY2cSod0y8VtsFojiyoMs5 vQ2PuaT855sJn1xYIi334mvDD/ipEUDqv3DYMf1x51TXcizdgYOlOk5tIuI5JvPYFvrS lMu++DS5L/h+DylvsPTGYrRmse6uegiUFscPPWyUoYnOKYyPvpf6INRAm3djroNw9YDH KivQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=afpTfvej; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from pete.vger.email (pete.vger.email. [23.128.96.36]) by mx.google.com with ESMTPS id m64-20020a632643000000b00565dfb7d580si2063217pgm.534.2023.10.05.12.57.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Oct 2023 12:57:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) client-ip=23.128.96.36; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=afpTfvej; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id 3FC3782069DA; Thu, 5 Oct 2023 12:57:03 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232281AbjJET4T (ORCPT + 99 others); Thu, 5 Oct 2023 15:56:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231853AbjJETzu (ORCPT ); Thu, 5 Oct 2023 15:55:50 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DCDAADB; Thu, 5 Oct 2023 12:55:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1696535749; x=1728071749; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=U2Lr0pfVDqRHalBrvCeshsIcvSYCxtMoo95ef61DmXc=; b=afpTfvej5kbpXPNIJsyqhN/MtrxV41TeIxRqkF9cImFHsLZSgJ2maDyA SrrmSJeMQduaTDQ0rSSJ28XtdCLT8WDfGKcNyj2WS4+dxuvdmx6NW0O4W NNp8RanKwrVxBEfnHwTotYtQ+ok+Ge4xod3inwXO6UXvCUtLR8Xgg0GIt UwKWHJUeNyQpPsQyaWbBZmLj6nHY24mPUsTjmepHJEBPq5QndiHRJ51bL dgTtdYYXqdIgblNkkcfmDReWqz94JBOAwU61XbD41CrZsBz8LMHcAFZCO rzXTu5xQqnI18I7IUgQO+V6neZPiI/XXEo8zwC3UvHw0fLPbnmOqr6LGV w==; X-IronPort-AV: E=McAfee;i="6600,9927,10854"; a="386432606" X-IronPort-AV: E=Sophos;i="6.03,203,1694761200"; d="scan'208";a="386432606" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2023 12:55:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10854"; a="755600146" X-IronPort-AV: E=Sophos;i="6.03,203,1694761200"; d="scan'208";a="755600146" Received: from jithujos.sc.intel.com ([172.25.103.66]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Oct 2023 12:55:45 -0700 From: Jithu Joseph To: ilpo.jarvinen@linux.intel.com, hdegoede@redhat.com, markgross@kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, rostedt@goodmis.org, jithu.joseph@intel.com, ashok.raj@intel.com, tony.luck@intel.com, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org, patches@lists.linux.dev, ravi.v.shankar@intel.com, pengfei.xu@intel.com Subject: [PATCH v4 9/9] platform/x86/intel/ifs: ARRAY BIST for Sierra Forest Date: Thu, 5 Oct 2023 12:51:37 -0700 Message-Id: <20231005195137.3117166-10-jithu.joseph@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231005195137.3117166-1-jithu.joseph@intel.com> References: <20230929202436.2850388-1-jithu.joseph@intel.com> <20231005195137.3117166-1-jithu.joseph@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Thu, 05 Oct 2023 12:57:03 -0700 (PDT) Array BIST MSR addresses, bit definition and semantics are different for Sierra Forest. Branch into a separate Array BIST flow on Sierra Forest when user invokes Array Test. Signed-off-by: Jithu Joseph Reviewed-by: Tony Luck Tested-by: Pengfei Xu --- drivers/platform/x86/intel/ifs/ifs.h | 7 +++++ drivers/platform/x86/intel/ifs/core.c | 15 +++++----- drivers/platform/x86/intel/ifs/runtest.c | 37 +++++++++++++++++++++++- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/drivers/platform/x86/intel/ifs/ifs.h b/drivers/platform/x86/intel/ifs/ifs.h index f0dd849b3400..2dd5e3406dac 100644 --- a/drivers/platform/x86/intel/ifs/ifs.h +++ b/drivers/platform/x86/intel/ifs/ifs.h @@ -137,6 +137,8 @@ #define MSR_CHUNKS_AUTHENTICATION_STATUS 0x000002c5 #define MSR_ACTIVATE_SCAN 0x000002c6 #define MSR_SCAN_STATUS 0x000002c7 +#define MSR_ARRAY_TRIGGER 0x000002d6 +#define MSR_ARRAY_STATUS 0x000002d7 #define MSR_SAF_CTRL 0x000004f0 #define SCAN_NOT_TESTED 0 @@ -146,6 +148,9 @@ #define IFS_TYPE_SAF 0 #define IFS_TYPE_ARRAY_BIST 1 +#define ARRAY_GEN_0 0 +#define ARRAY_GEN_1 1 + /* MSR_SCAN_HASHES_STATUS bit fields */ union ifs_scan_hashes_status { u64 data; @@ -272,6 +277,7 @@ struct ifs_test_caps { * @cur_batch: number indicating the currently loaded test file * @generation: IFS test generation enumerated by hardware * @chunk_size: size of a test chunk + * @array_gen: test generation of array test */ struct ifs_data { int loaded_version; @@ -283,6 +289,7 @@ struct ifs_data { u32 cur_batch; u32 generation; u32 chunk_size; + u32 array_gen; }; struct ifs_work { diff --git a/drivers/platform/x86/intel/ifs/core.c b/drivers/platform/x86/intel/ifs/core.c index 0c8927916373..0a872b874af8 100644 --- a/drivers/platform/x86/intel/ifs/core.c +++ b/drivers/platform/x86/intel/ifs/core.c @@ -11,16 +11,16 @@ #include "ifs.h" -#define X86_MATCH(model) \ +#define X86_MATCH(model, array_gen) \ X86_MATCH_VENDOR_FAM_MODEL_FEATURE(INTEL, 6, \ - INTEL_FAM6_##model, X86_FEATURE_CORE_CAPABILITIES, NULL) + INTEL_FAM6_##model, X86_FEATURE_CORE_CAPABILITIES, array_gen) static const struct x86_cpu_id ifs_cpu_ids[] __initconst = { - X86_MATCH(SAPPHIRERAPIDS_X), - X86_MATCH(EMERALDRAPIDS_X), - X86_MATCH(GRANITERAPIDS_X), - X86_MATCH(GRANITERAPIDS_D), - X86_MATCH(ATOM_CRESTMONT_X), + X86_MATCH(SAPPHIRERAPIDS_X, ARRAY_GEN_0), + X86_MATCH(EMERALDRAPIDS_X, ARRAY_GEN_0), + X86_MATCH(GRANITERAPIDS_X, ARRAY_GEN_0), + X86_MATCH(GRANITERAPIDS_D, ARRAY_GEN_0), + X86_MATCH(ATOM_CRESTMONT_X, ARRAY_GEN_1), {} }; MODULE_DEVICE_TABLE(x86cpu, ifs_cpu_ids); @@ -100,6 +100,7 @@ static int __init ifs_init(void) continue; ifs_devices[i].rw_data.generation = FIELD_GET(MSR_INTEGRITY_CAPS_SAF_GEN_MASK, msrval); + ifs_devices[i].rw_data.array_gen = (u32)m->driver_data; ret = misc_register(&ifs_devices[i].misc); if (ret) goto err_exit; diff --git a/drivers/platform/x86/intel/ifs/runtest.c b/drivers/platform/x86/intel/ifs/runtest.c index 4fe544d79946..9ac75420c15e 100644 --- a/drivers/platform/x86/intel/ifs/runtest.c +++ b/drivers/platform/x86/intel/ifs/runtest.c @@ -329,6 +329,38 @@ static void ifs_array_test_core(int cpu, struct device *dev) ifsd->status = SCAN_TEST_PASS; } +#define ARRAY_GEN1_TEST_ALL_ARRAYS 0x0ULL +#define ARRAY_GEN1_STATUS_FAIL 0x1ULL + +static int do_array_test_gen1(void *status) +{ + int cpu = smp_processor_id(); + int first; + + first = cpumask_first(cpu_smt_mask(cpu)); + + if (cpu == first) { + wrmsrl(MSR_ARRAY_TRIGGER, ARRAY_GEN1_TEST_ALL_ARRAYS); + rdmsrl(MSR_ARRAY_STATUS, *((u64 *)status)); + } + + return 0; +} + +static void ifs_array_test_gen1(int cpu, struct device *dev) +{ + struct ifs_data *ifsd = ifs_get_data(dev); + u64 status = 0; + + stop_core_cpuslocked(cpu, do_array_test_gen1, &status); + ifsd->scan_details = status; + + if (status & ARRAY_GEN1_STATUS_FAIL) + ifsd->status = SCAN_TEST_FAIL; + else + ifsd->status = SCAN_TEST_PASS; +} + /* * Initiate per core test. It wakes up work queue threads on the target cpu and * its sibling cpu. Once all sibling threads wake up, the scan test gets executed and @@ -356,7 +388,10 @@ int do_core_test(int cpu, struct device *dev) ifs_test_core(cpu, dev); break; case IFS_TYPE_ARRAY_BIST: - ifs_array_test_core(cpu, dev); + if (ifsd->array_gen == ARRAY_GEN_0) + ifs_array_test_core(cpu, dev); + else + ifs_array_test_gen1(cpu, dev); break; default: return -EINVAL; -- 2.25.1