From patchwork Wed Sep 20 19:10:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Serge Semin X-Patchwork-Id: 13393252 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 A98B2C04FEE for ; Wed, 20 Sep 2023 19:11:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id: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=kGRRkLA1eBXLHy/us5pYkI15ZQrlm4Jc3o7TZaOvHIQ=; b=unHrO2p6E+TrrK ufWD/6u4NqNAgaGs/iE8Q5ivnmib+iO4tFhdyK1WRsX+gtoXoZ5Iik/Pr+wn2PS+x2/9h8PyZYiye x3Q6qOCgA7NIzlztFWAoBvwOJCHPY4s7J7jHILdwt7z6oPhzE1C7Q3eAer0DeD3bAR97mDOmrvYEJ PanK0Wgpr5j2WS+fc6PzC1exGwcjGcrStz4+XG3vkO8VerR4zBE1iOn002JcN1WImPaapauf3t0Gi 1Um+9aXvVuNMApLeSf2htoYfXDO7bEigCu19+ACQuUTzKQqOxU0JPX0oJPk/rW2amifibWtwiHZEU 9Cv0UoN2O/dQSM/9nziQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qj2bm-003wvX-0o; Wed, 20 Sep 2023 19:11:34 +0000 Received: from mail-lj1-x235.google.com ([2a00:1450:4864:20::235]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qj2bg-003wqq-36 for linux-arm-kernel@lists.infradead.org; Wed, 20 Sep 2023 19:11:30 +0000 Received: by mail-lj1-x235.google.com with SMTP id 38308e7fff4ca-2c129cb7770so1099621fa.1 for ; Wed, 20 Sep 2023 12:11:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695237082; x=1695841882; 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=SOzZD92zaXAANSSJuQi8lUO8jcRVO2h2VCNQ1+CPjLg=; b=ItKAFo0fvS4kM2RMRXragoSWMTEo0g2Et98vKUFHi9persH7yaYf2n6j/mFCR2B845 9AfezhM4PswaQPylB/7gnyiQq8QiuphvoR5Z+jF4CTjrmXZN+L+dwnZDcMM1Hk2obbZZ ePdoaSJn1e8DSxyv2HMny0SDZvRcMpE+fgqAkqA2KyQqXVRVlGl0dVvvTRtxeiKhXGcL jdzlxS6dmG6ezj9zTWtsigzFC1E5mThVm3q83MKQLQK1W+73G6qboJ8INqeWRVqTzg+W exnWq5WOlWOHLLAJED/D30efgRx4rPiaXUgAvBO7UQXCg/0oXNk4CI9xOLeFTXIT15Xh G0hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695237082; x=1695841882; 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=SOzZD92zaXAANSSJuQi8lUO8jcRVO2h2VCNQ1+CPjLg=; b=iBMAGzgo3caSViiQ/E065BwmIt7iKL+5aMgBNzEf+1LUlaEPplYhCCOSL8OTFcIgga tflWLA/Tjo9SZwghDQXBcFpB81Bk8VaAJSh2YnYnyaD7qQ1FqRuRDJlx1qSEWU0gaf5G 0wqReoxbyjMdIo15KeYUdNQTOMzRAaBlouXbL1XgXp71rQoRq+wG6TR3+U9qjyjTWQtH qUanJH/AeeSwXF74xWNfxPUwHUQPKLdsCXTbnID8gOamlg9fzMSaoGjBeM74/psRLCrB 3Xy9873xcFNlduCkS3Eq7MnkGJRsnMpYX89n6oMRldmvvd9Ikzs9uagV+7YtCmcdpxFb M9Ew== X-Gm-Message-State: AOJu0YwsN4ruaWoJO67e2lZRBe/1mSCzQ4CoxyFMsrKiZTVLSTSzUL2I J4jx36/UGNrSSC7KXwv5BVo= X-Google-Smtp-Source: AGHT+IGoZ96V+G1d/YUQj+Y5RWTQKPaREb6RoceSVpNeh+joRF/L+Ofo/NpGOHNhubiVImEchz2i+w== X-Received: by 2002:a2e:90d5:0:b0:2bf:f861:f523 with SMTP id o21-20020a2e90d5000000b002bff861f523mr1361029ljg.4.1695237082187; Wed, 20 Sep 2023 12:11:22 -0700 (PDT) Received: from localhost ([83.149.21.16]) by smtp.gmail.com with ESMTPSA id a14-20020a2ebe8e000000b002bffb3f8cebsm1996479ljr.54.2023.09.20.12.11.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Sep 2023 12:11:21 -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 , Arnd Bergmann , Greg Kroah-Hartman , linux-arm-kernel@lists.infradead.org, linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org, Borislav Petkov Subject: [PATCH v4 02/20] EDAC/synopsys: Fix generic device type detection procedure Date: Wed, 20 Sep 2023 22:10:26 +0300 Message-ID: <20230920191059.28395-3-fancer.lancer@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230920191059.28395-1-fancer.lancer@gmail.com> References: <20230920191059.28395-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-20230920_121129_002599_5085E6C6 X-CRM114-Status: GOOD ( 21.14 ) 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. Secondly the DRAM chips type has nothing to do with the data bus width specified in the MSTR.data_bus_width CSR field. That 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 the DRAM chips type can be determined only in case of the DDR4 protocol by means of the MSTR.device_config field state (it is supposed to be set by the system firmware). 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 synthesizes 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. Fix all of the mistakes described above in the zynqmp_get_dtype() and zynqmp_get_ecc_state() methods: specify actual DRAM chips data width only for the DDR4 protocol and return that it's UNKNOWN in the rest of the cases; determine 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 --- Changelog v2: - Include "linux/bitfield.h" header file to get the FIELD_GET macro definition. (@tbot) --- drivers/edac/synopsys_edac.c | 49 +++++++++++++++--------------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c index 014a2176c2c1..b463bd802961 100644 --- a/drivers/edac/synopsys_edac.c +++ b/drivers/edac/synopsys_edac.c @@ -675,26 +675,25 @@ static enum dev_type zynq_get_dtype(const void __iomem *base) */ 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; } /** @@ -731,19 +730,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); } /**