From patchwork Thu Jun 27 17:32:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Serge Semin X-Patchwork-Id: 13714934 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9EBC9C3064D for ; Thu, 27 Jun 2024 17:33:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc: To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=YGUmsAPKsf36nNLG3WX1Sp+D1yRbsuEFCsAACInpqbo=; b=A6Bu85TCXSU7eYVgULe272sWfN Co+XkBxHpHoqKnhTrAbQOIl51QUrRKVr9xQm65qus3LS38oACWTBMtfrM/Uqd6mOYfyVdKweYuf4M MHCmhbbKdo4ipERqu6/TUIPhsexvGzC9FmG/iGUMtZdyJiK+OufoB1g69QcQ7rQIdtBwyVVgB0N+b ig0fDC6f70SEIkOciHcDXc6bomBjc+7uT9gF4ejAZerl3wy30VEwoQkbTlMhW64jmJEJkDhI03ltm vEenU8VsKLjFZIHnEUF6MwNt+zKfJY7f2JlCECHJhMO65FPM/HP/eqwboq17V7Yb10mueLicUV0sF JWDKnQXA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sMszv-0000000BDb4-06TX; Thu, 27 Jun 2024 17:33:27 +0000 Received: from mail-lj1-x234.google.com ([2a00:1450:4864:20::234]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sMszW-0000000BDNP-43Yk for linux-arm-kernel@lists.infradead.org; Thu, 27 Jun 2024 17:33:04 +0000 Received: by mail-lj1-x234.google.com with SMTP id 38308e7fff4ca-2ec5fad1984so71887891fa.0 for ; Thu, 27 Jun 2024 10:33:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719509581; x=1720114381; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YGUmsAPKsf36nNLG3WX1Sp+D1yRbsuEFCsAACInpqbo=; b=aSRQjmg7Wkeqz3YYlWoiczSlNjd0jWJ77B1IjVs08zmhgLyeIbXkolzXQRudFbdnwa aJ/Hx4FY2xLuKa+lGQwr3YNF7GGpAzDD1gq+HEDUsAtGU3XuSTNfv7pVsKxx2li5/PYb hSNZGczTKzlhbUM1pHnjePFhS6LAMKFeMNouJ4kiQgHWNwtEVw5Qe4muNk7q78szTepw x91/pX2CZTOTU10TTHFR7+u5cA5YI3Oobk9hl6+Ccae+Xvm64GgMpqhS125AXgQZnWxd Z7S8AD+sKnBlig8Un3kOqOL2K6WgMABF0tassUYtZSnVCkpk6+jAPf+wgutpTqXxwAUr TOEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719509581; x=1720114381; h=content-transfer-encoding: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=YGUmsAPKsf36nNLG3WX1Sp+D1yRbsuEFCsAACInpqbo=; b=cUdqIlQVJQzaS2YVom0iAd/TBOJEjmEBtHFmclsHC8W/XO7VrlwBuPPKJRTBdx0QNq oHyRU+h8r7eKl0utmRQWWBBQNjKxg9/PZZ0E5OB6+ih9qqGE2hu8OEVRjGHBeW6XpQsN N3RmOQoUFFOneF/ACu93ugniCrDN6gcdA7USqeDiIGLvNGKl7BM4eKd/6U7mxKL37t9T JSMtvogyOH0w72t6PWSXfWReulFYr3bXkaMgAzmQ2N/keJzRwJCZ3vMzxS3VkdZyNdmq P3+T8bZEtUy7SBXIEdGyyQoOmM61bzI23fkW53iDjvWl9EVHybWbxX7v0bTAKJDb6NiZ fnzQ== X-Forwarded-Encrypted: i=1; AJvYcCVUriN0fy8QWnLCKr6ADJJ7AcdCvkTvyLJgLLL4HgGvapOZ+j5fxXO+dNhKeuc0oHcxLqkyQNHUowqlUEIQFDP1jc4KS0KomAoj7B6Mwfz2aKIc2x4= X-Gm-Message-State: AOJu0Yz8FO7iRbF/Ol6WEB2/P3Yaz/7V5CJOeMEMAcz7cD2pHcNXiZbW cZ/svx3SWALS491F1BpeSpZ14ba9x3TUJPvcNoP/1AnK1H7n0Rnj X-Google-Smtp-Source: AGHT+IGmprKT3Qysp0kTAlE196IhhFvhMCZyhvJXbMat0AkcSp0/SXIjWpvLF2Ogcpd18NH19z/C2A== X-Received: by 2002:a2e:8396:0:b0:2ec:558d:4e0a with SMTP id 38308e7fff4ca-2ec5b30bd73mr107833561fa.19.1719509580936; Thu, 27 Jun 2024 10:33:00 -0700 (PDT) Received: from localhost ([213.79.110.82]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-2ee4a35babcsm3131151fa.67.2024.06.27.10.33.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Jun 2024 10:33:00 -0700 (PDT) From: Serge Semin To: Michal Simek , Alexander Stein , Borislav Petkov , Tony Luck , James Morse , Mauro Carvalho Chehab , Robert Richter , Manish Narani Cc: Serge Semin , Punnaiah Choudary Kalluri , Dinh Nguyen , Shubhrajyoti Datta , Arnd Bergmann , Greg Kroah-Hartman , linux-arm-kernel@lists.infradead.org, linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org, Shubhrajyoti Datta , Borislav Petkov Subject: [PATCH RESEND v6 01/18] EDAC/synopsys: Fix generic device type detection procedure Date: Thu, 27 Jun 2024 20:32:08 +0300 Message-ID: <20240627173251.25718-2-fancer.lancer@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240627173251.25718-1-fancer.lancer@gmail.com> References: <20240627173251.25718-1-fancer.lancer@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240627_103303_031494_C405AD2D X-CRM114-Status: GOOD ( 22.15 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org First of all the enum dev_type constants describe the memory DRAM chips used at the stick, not the entire DQ-bus width (see the enumeration kdoc for details). So what is returned from the zynqmp_get_dtype() function and then specified to the dimm_info->dtype field is definitely incorrect because the DDR controller DQ-bus width doesn't determine a strict DDR-chips configuration on the attached memory device. Secondly the DRAM chips type has nothing to do with the data bus width specified in the MSTR.data_bus_width CSR field. The CSR field just determines the _part_ of the whole DQ-bus currently used to access the data from the all DRAM memory chips. So it doesn't indicate the individual chips type. Thirdly in case of the DW uMCTL2 controllers the DRAM chips type can be firmly determined only in case of the DDR4 protocol by means of the MSTR.device_config field state (the field is supposed to be set by the system firmware though). From this and the rest of the perspective the zynqmp_get_dtype() implementation is incorrect. Finally the DW uMCTL2 DDRC ECC capability doesn't depend on the memory chips type. Moreover it doesn't depend on the utilized data bus width in runtime either. The IP-core reference manual says in [1,2] that the ECC support can't be enabled during the IP-core synthesis for the DRAM data bus widths other than 16, 32 or 64. At the same time the bus width mode (MSTR.data_bus_width) doesn't change the ECC feature availability. Thus it was wrong to determine the ECC state with respect to the DQ-bus width mode. From this perspective the zynqmp_get_ecc_state() implementation is incorrect either. It shouldn't rely on the currently utilized DQ-bus part or the attached DDR-chip types. Fix all of the mistakes described above in the zynqmp_get_dtype() and zynqmp_get_ecc_state() methods: determine the actual DRAM chips data width only for the DDR4 protocol and return that it's UNKNOWN in the rest of the cases; determine the ECC availability by the ECCCFG0.ecc_mode field state only (that field can't be modified anyway if the IP-core was synthesized with no ECC support). [1] DesignWare® Cores Enhanced Universal DDR Memory Controller (uMCTL2) Databook, Version 3.91a, October 2020, p. 421. [2] DesignWare® Cores Enhanced Universal DDR Memory Controller (uMCTL2) Databook, Version 3.91a, October 2020, p. 633. Fixes: b500b4a029d5 ("EDAC, synopsys: Add ECC support for ZynqMP DDR controller") Signed-off-by: Serge Semin Reviewed-by: Shubhrajyoti Datta --- Changelog v2: - Include "linux/bitfield.h" header file to get the FIELD_GET macro definition. (@tbot) Changelog v6: - Fix the zynqmp_get_dtype() method kdoc. - Split up the commit log into paragraphs. --- drivers/edac/synopsys_edac.c | 55 +++++++++++++++--------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c index ea7a9a342dd3..b6bdbc1289f3 100644 --- a/drivers/edac/synopsys_edac.c +++ b/drivers/edac/synopsys_edac.c @@ -664,36 +664,35 @@ static enum dev_type zynq_get_dtype(const void __iomem *base) } /** - * zynqmp_get_dtype - Return the controller memory width. + * zynqmp_get_dtype - Return the DDR memory chips type. * @base: DDR memory controller base address. * - * Get the EDAC device type width appropriate for the current controller + * Get the attached DDR chips type based on the current controller * configuration. * - * Return: a device type width enumeration. + * Return: type of the memory DRAM chips. */ static enum dev_type zynqmp_get_dtype(const void __iomem *base) { - enum dev_type dt; - u32 width; - - width = readl(base + CTRL_OFST); - width = (width & ECC_CTRL_BUSWIDTH_MASK) >> ECC_CTRL_BUSWIDTH_SHIFT; - switch (width) { - case DDRCTL_EWDTH_16: - dt = DEV_X2; - break; - case DDRCTL_EWDTH_32: - dt = DEV_X4; - break; - case DDRCTL_EWDTH_64: - dt = DEV_X8; - break; - default: - dt = DEV_UNKNOWN; + u32 regval; + + regval = readl(base + CTRL_OFST); + if (!(regval & MEM_TYPE_DDR4)) + return DEV_UNKNOWN; + + regval = (regval & DDRC_MSTR_CFG_MASK) >> DDRC_MSTR_CFG_SHIFT; + switch (regval) { + case DDRC_MSTR_CFG_X4_MASK: + return DEV_X4; + case DDRC_MSTR_CFG_X8_MASK: + return DEV_X8; + case DDRC_MSTR_CFG_X16_MASK: + return DEV_X16; + case DDRC_MSTR_CFG_X32_MASK: + return DEV_X32; } - return dt; + return DEV_UNKNOWN; } /** @@ -730,19 +729,11 @@ static bool zynq_get_ecc_state(void __iomem *base) */ static bool zynqmp_get_ecc_state(void __iomem *base) { - enum dev_type dt; - u32 ecctype; + u32 regval; - dt = zynqmp_get_dtype(base); - if (dt == DEV_UNKNOWN) - return false; + regval = readl(base + ECC_CFG0_OFST) & SCRUB_MODE_MASK; - ecctype = readl(base + ECC_CFG0_OFST) & SCRUB_MODE_MASK; - if ((ecctype == SCRUB_MODE_SECDED) && - ((dt == DEV_X2) || (dt == DEV_X4) || (dt == DEV_X8))) - return true; - - return false; + return (regval == SCRUB_MODE_SECDED); } /**