Received: by 2002:a05:7412:d1aa:b0:fc:a2b0:25d7 with SMTP id ba42csp937254rdb; Tue, 30 Jan 2024 03:17:00 -0800 (PST) X-Google-Smtp-Source: AGHT+IETvimXy+DllLqcu6+3uxSwnp32ljEQ3QD522ENlsp2UW0Z4EAsXYkLbCHMZ+8uBr6sNjNS X-Received: by 2002:a17:906:298d:b0:a30:69d4:3047 with SMTP id x13-20020a170906298d00b00a3069d43047mr6807353eje.8.1706613420491; Tue, 30 Jan 2024 03:17:00 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706613420; cv=pass; d=google.com; s=arc-20160816; b=N+LGnjBeX0EaPa8kR40DRFXO8Q4NiazFjfPRZAhdEN4Q8kuGMoKeZGeAjMLRo/eleq +xsGnQzH97EZKVqvbQzFEadBUMze3y2HkY5qFyOiJ0LDvWRa8dC8nrqAfJsZntfSSFcQ dKTBXeLADsfrmoc/otwpKaMJ0tqGZPM5kAdmm8mI/RuXJirq6hABYvl0Yzz2gfuPnDei NfM4dl4Z4ox7CmpxQod4Tcg9BFjSzfL9kWqg0OzHdn+9gIXe6lMcUWAXiVfAznQxqiaC nLiO8TLPjrQWV/13cOBzkrBNEfn2fK386B/0iEC6LinBCkODIbuvgmL4WXmNKDxMck0i 056g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:from:references:cc:to:subject:user-agent:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:date:message-id :dkim-signature; bh=fHi5UwowVaUQ2teYz/sOYw/pAYhGyptQrR07MW5sEZs=; fh=OsJ4fFSrUUNn3T3YZVNPqg5ofHZ/eR7YQcikkAi6YTY=; b=ebymVmxbx1Bj1bW9cGq8iBGYiqZRbdl15sx7wx1Xuanb2cx1oxFMuKzupJe+JFA6e4 eZZ7iANwP0lW5AWoCtLb2jgYWIDCfOr1YD4D9aW3srfBspa0N0hMuTlvqpuz8AwncX47 TGZ1XTTh4sD/zwNcFWqk3Gfks+o9h7vLVuc6mEn5XPxGEIQP9IjDIIZtuzSVHVQl5I5a wF7KiA9xI9fJO4vgGbZKawWT0dLZmaxXH+dGVRhm451nUhNakket+9TMysoKF/lUkd/C yuIQ4myMHrA/lEUkbkzUYOeJnYGwDaWTbZGLyyKeDMP/OkEqYFPCsS78URS5pf2/IGx4 IMIQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@broadcom.com header.s=google header.b=gslBihr3; arc=pass (i=1 dkim=pass dkdomain=broadcom.com dmarc=pass fromdomain=broadcom.com); spf=pass (google.com: domain of linux-kernel+bounces-44095-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-44095-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=broadcom.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id b10-20020a170906d10a00b00a352bbd232bsi3652977ejz.74.2024.01.30.03.17.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jan 2024 03:17:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-44095-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@broadcom.com header.s=google header.b=gslBihr3; arc=pass (i=1 dkim=pass dkdomain=broadcom.com dmarc=pass fromdomain=broadcom.com); spf=pass (google.com: domain of linux-kernel+bounces-44095-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-44095-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=broadcom.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 3D6961F265F7 for ; Tue, 30 Jan 2024 08:11:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DC0465467E; Tue, 30 Jan 2024 08:11:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="gslBihr3" Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9F9455E54 for ; Tue, 30 Jan 2024 08:11:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706602300; cv=none; b=RfEq11n6/VQADBnVCfIRcRexnjRV9tEQ81ZBAbNfsKLfRItendFPiYza/J5kgq9L84j+AtH2J4UNOEebL0re4E0tyYoCPni5MIlj33jd1vsb5DMuE11HI0opk/mqGSyi2ztBp+2AmGilA+Rd96t7gyo/XgN2A0m1MlXlLjb4WG0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706602300; c=relaxed/simple; bh=qxBO+xfdJxeLPs2m+Hk3tR314kiIpG56LGPiGNflK0k=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=bYnvvTfFtqvSr5cmJylQBY0yaC/qIA6fIyB1fq2bjhInXdBbBgopEIJyvdYrLsIghKyVuJEh+87dEObs06K4SFKU6GXjLzRQ4VcLijnMIlO3Jj4Ykn6yDCePZudQbjgs9DG+CdIGW+1kJ1h9fYNkQzx1SyM+8MYsyZP6QAAGDMk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com; spf=fail smtp.mailfrom=broadcom.com; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b=gslBihr3; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-1d8da50bffaso9316495ad.2 for ; Tue, 30 Jan 2024 00:11:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1706602297; x=1707207097; darn=vger.kernel.org; h=in-reply-to:from:references:cc:to:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to; bh=fHi5UwowVaUQ2teYz/sOYw/pAYhGyptQrR07MW5sEZs=; b=gslBihr3t0chxjX4f5nJPtwHndDWt6iP9I3NgSl74GuieXF1LyGSR07BowFraiL0sm ovxd93GRC1yM01KljlPa2Du4E4lCl0L+28WpFDbwkDn6B0798Yq20nUV+rJrPhpMwdLD 3elxvRXE98rF7pcg1s7JVzFqplG+BRsicPvTA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706602297; x=1707207097; h=in-reply-to:from:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=fHi5UwowVaUQ2teYz/sOYw/pAYhGyptQrR07MW5sEZs=; b=TmDkV+S6Y+8MK0UR/LWXpZAAETxBnp2Tork/zui17K5gSnYdjpnU7T6UnYDFzLWMY5 vGlzbgnRgTID6aNEj8hI7ee02yLQ+VeVOWB3KXzUKCv2vwlM5uNJ8HyB70nYmAe4AtGE 7NZWn9JxrzDCRMQpwWOrIcxGStLTWn1TtZ8jcTfTwEU+/5haLA0LOa6v1KUaoFa3WsYP IHOR65ezsFzPDbRGFVfRbtOgJtx9zH1ZQ+ayNowTnK96EV4CMFu3zGuSpLUUCAbaGe0K v31o75ogFuQ8KDHgtqiAJw7QeVptDr2lDWwD+N1wcBJFkgeohjtJK2Nic6AUrKY4TgH6 0jXA== X-Gm-Message-State: AOJu0Yz+0nB4ctLPZGL8JXzrGRXKZTLEnmcdsT51YCqjzAnSxJOB2Re/ EVEYv0yanrpQ7znXuvemQPtIgHHF+Nou5Ogvf5UTB6VXxLi7bD5ILKSQKtd+Xw== X-Received: by 2002:a17:903:22c8:b0:1d7:6d49:c78a with SMTP id y8-20020a17090322c800b001d76d49c78amr6850809plg.58.1706602297023; Tue, 30 Jan 2024 00:11:37 -0800 (PST) Received: from [192.168.52.129] ([192.19.222.250]) by smtp.gmail.com with ESMTPSA id a10-20020a170902ee8a00b001d8e93fe344sm2697941pld.143.2024.01.30.00.11.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 30 Jan 2024 00:11:35 -0800 (PST) Message-ID: <2a3edcf5-7afc-410c-a402-3d8cd3feb1da@broadcom.com> Date: Tue, 30 Jan 2024 00:11:32 -0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 10/10] mtd: rawnand: brcmnand: allow for on-die ecc To: Miquel Raynal , David Regan Cc: dregan@mail.com, Richard Weinberger , Vignesh Raghavendra , robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, computersforpeace@gmail.com, kdasu.kdev@gmail.com, linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, Linux Kernel Mailing List , Joel Peshkin , Tomer Yacoby , Dan Beygelman , Anand Gore , Kursad Oney , Florian Fainelli , rafal@milecki.pl, bcm-kernel-feedback-list@broadcom.com, andre.przywara@arm.com, baruch@tkos.co.il, linux-arm-kernel@lists.infradead.org, Dan Carpenter References: <20240124030458.98408-1-dregan@broadcom.com> <20240124030458.98408-11-dregan@broadcom.com> <20240124184027.712b1e47@xps-13> <20240126071913.699c3795@xps-13> <20240129115228.06dc2292@xps-13> From: William Zhang In-Reply-To: <20240129115228.06dc2292@xps-13> Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="000000000000b6f2f40610254fea" --000000000000b6f2f40610254fea Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Miquel, On 1/29/24 02:52, Miquel Raynal wrote: > Hi David, > > dregan@broadcom.com wrote on Fri, 26 Jan 2024 11:57:39 -0800: > >> Hi Miquèl, >> >> On Thu, Jan 25, 2024 at 10:19 PM Miquel Raynal >> wrote: >>> >>> Hi David, >>> >>> dregan@broadcom.com wrote on Thu, 25 Jan 2024 11:47:46 -0800: >>> >>>> Hi Miquèl, >>>> >>>> On Wed, Jan 24, 2024 at 9:40 AM Miquel Raynal wrote: >>>>> >>>>> Hi David, >>>>> >>>>> dregan@broadcom.com wrote on Tue, 23 Jan 2024 19:04:58 -0800: >>>>> >>>>>> Allow settings for on-die ecc such that if on-die ECC is selected >>>>>> don't error out but require ECC strap setting of zero >>>>>> >>>>>> Signed-off-by: David Regan >>>>>> Reviewed-by: William Zhang >>>>>> --- >>>>>> Changes in v3: None >>>>>> --- >>>>>> Changes in v2: >>>>>> - Added to patch series >>>>>> --- >>>>>> drivers/mtd/nand/raw/brcmnand/brcmnand.c | 14 ++++++++++---- >>>>>> 1 file changed, 10 insertions(+), 4 deletions(-) >>>>>> >>>>>> diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c >>>>>> index a4e311b6798c..42526f3250c9 100644 >>>>>> --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c >>>>>> +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c >>>>>> @@ -2727,9 +2727,11 @@ static int brcmnand_setup_dev(struct brcmnand_host *host) >>>>>> cfg->blk_adr_bytes = get_blk_adr_bytes(mtd->size, mtd->writesize); >>>>>> >>>>>> if (chip->ecc.engine_type != NAND_ECC_ENGINE_TYPE_ON_HOST) { >>>>>> - dev_err(ctrl->dev, "only HW ECC supported; selected: %d\n", >>>>>> - chip->ecc.engine_type); >>>>>> - return -EINVAL; >>>>>> + if (chip->ecc.strength) { >>>>>> + dev_err(ctrl->dev, "ERROR!!! HW ECC must be set to zero for non-hardware ECC; selected: %d\n", >>>>>> + chip->ecc.strength); >>>>> >>>>> Can you use a more formal string? Also clarify it because I don't >>>>> really understand what it leads to. >>>> >>>> How about: >>>> >>>> dev_err(ctrl->dev, "HW ECC set to %d, must be zero for on-die ECC\n", >>> >>> Actually I am wondering how legitimate this is. Just don't enable the >>> on host ECC engine if it's not in use. No need to check the core's >>> choice. >> >> Our chip ECC engine will either be on if it's needed or off if it's not. >> Either I can do that in one place or put checks in before each >> read/write to turn on/off the ECC engine, which seems a lot more >> work and changes and possible issues/problems. >> Turning it on/off as needed has not been explicitly tested and >> could cause unforeseen consequences. This >> is a minimal change which should have minimal impact. >> >>> >>>> >>>>> >>>>>> + return -EINVAL; >>>>>> + } >>>>>> } >>>>>> >>>>>> if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN) { >>>>>> @@ -2797,7 +2799,11 @@ static int brcmnand_setup_dev(struct brcmnand_host *host) >>>>>> if (ret) >>>>>> return ret; >>>>>> >>>>>> - brcmnand_set_ecc_enabled(host, 1); >>>>>> + if (chip->ecc.engine_type == NAND_ECC_ENGINE_TYPE_ON_DIE) { >>>>>> + dev_dbg(ctrl->dev, "Disable HW ECC for on-die ECC\n"); >>>>> >>>>> Not needed. >>>> >>>> Will remove. >>>> >>>>> >>>>>> + brcmnand_set_ecc_enabled(host, 0); >>>>>> + } else >>>>>> + brcmnand_set_ecc_enabled(host, 1); >>>>> >>>>> Style is wrong, but otherwise I think ECC should be kept disabled while >>>>> not in active use, so I am a bit surprised by this line. >>>> >>>> This is a double check to turn on/off our hardware ECC. >>> >>> I expect the engine to be always disabled. Enable it only when you >>> need (may require an additional patch before this one). >> >> We are already turning on the ECC enable at this point, >> this is just adding the option to turn it off if the NAND chip >> itself will be doing the ECC instead of our controller. > > Sorry if I have not been clear. > > This sequence: > - init > - enable hw ECC engine > Is broken. > ECC engine is not enabled for all the cases. Here we only intended to enable it for the nand chip that is set to use NAND_ECC_ENGINE_TYPE_ON_HOST. The logic here should better change to: if (chip->ecc.engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST) brcmnand_set_ecc_enabled(host, 1); else brcmnand_set_ecc_enabled(host, 0); > It *cannot* work as any operation going through exec_op now may > perform page reads which should be unmodified by the ECC engine. You > driver *must* follow the following sequence: > - init and disable (or keep disabled) the hw ECC engine > - when you perform a page operation with correction you need to > - enable the engine > - perform the operation > - disable the engine > Maybe I am missing something here but are you saying the exec_op can have different ecc type for page read/write at run time on the same nand chip? I don't see the op instr structure has the ecc type field and thought it is only bind to the nand chip and won't change at run time. So looks to me the init time setting to the engine based on ecc.engine_type should be sufficient. What you described here can work for the hw.ecc read path (ecc.read_page = brcmnand_read_page) which always assumes ecc is enabled. Although it is probably not too bad with these two extra operation, it would be better if we don't have to add anything as our current code does. For the brcmnand_read_page_raw, we currently disable the engine and then re-enable it(but we need to fix it to only enable it with hw ecc engine type). So it is just opposite of you logic but works the same with no impact on the most performance critical path. > Thanks, > Miquèl --000000000000b6f2f40610254fea Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature 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 YDZuuBJwnyCzevMoPtVYPharioL5H3BRnQi8YoTXH7/uRo33dewYFm474yFjwwnt82TFtveVZkVq 6h4WIQ4wTcwFfET8zMkELnGzS5SHCl8sPD+lNxxJ1JDZYwIDAQABo4IB2zCCAdcwDgYDVR0PAQH/ BAQDAgWgMIGjBggrBgEFBQcBAQSBljCBkzBOBggrBgEFBQcwAoZCaHR0cDovL3NlY3VyZS5nbG9i YWxzaWduLmNvbS9jYWNlcnQvZ3NnY2NyM3BlcnNvbmFsc2lnbjJjYTIwMjAuY3J0MEEGCCsGAQUF BzABhjVodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9nc2djY3IzcGVyc29uYWxzaWduMmNhMjAy MDBNBgNVHSAERjBEMEIGCisGAQQBoDIBKAowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xv YmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADBJBgNVHR8EQjBAMD6gPKA6hjhodHRw Oi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjNwZXJzb25hbHNpZ24yY2EyMDIwLmNybDAlBgNV HREEHjAcgRp3aWxsaWFtLnpoYW5nQGJyb2FkY29tLmNvbTATBgNVHSUEDDAKBggrBgEFBQcDBDAf BgNVHSMEGDAWgBSWM9HmWBdbNHWKgVZk1b5I3qGPzzAdBgNVHQ4EFgQUq65GzwZxydFHjjYEU/9h xHhPWlwwDQYJKoZIhvcNAQELBQADggEBAA2hGG3JPAdGPH0ZdohGUCIVjKz+U+EFuIDbS6A/5jqX VhYAxZlzj7tSjUIM7G7IhyfqPC46GKJ/4x+Amz1Z6YxNGy71L68kYD6hIbBcA5AM42QBUufly6Oa /ppSz3WoflVyFFQ5YXniZ+eU+2/cdnYZg4aVUnFjimOF5o3NfMLzOkhQNxbaDjFUfUYD8hKmU6v4 0vUBj8KZ9Gi1LIagLKUREn8jku0lcLsRbnJ5Ey5ScajC/FESPyYWasOW8j8/1EoJksmhbYGKNS6C urb/KlmDGfVrIRYDbL0ckhGQIP5c6L+kSQZ2sHnQK0e0WgIaZYxaPYeY5u0GLCOze+3vyRMxggJt MIICaQIBATBrMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYD VQQDEyhHbG9iYWxTaWduIEdDQyBSMyBQZXJzb25hbFNpZ24gMiBDQSAyMDIwAgwxuh2XG3FXRL1W JOEwDQYJYIZIAWUDBAIBBQCggdQwLwYJKoZIhvcNAQkEMSIEIM2Vg6cGFkHIgPn6Tul1txXAtMbm 1/W7efMiTY7s88mrMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI0 MDEzMDA4MTEzN1owaQYJKoZIhvcNAQkPMVwwWjALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsG CWCGSAFlAwQBAjAKBggqhkiG9w0DBzALBgkqhkiG9w0BAQowCwYJKoZIhvcNAQEHMAsGCWCGSAFl AwQCATANBgkqhkiG9w0BAQEFAASCAQATVOOWhCDyQ0pKBBLcrr56SEvlwt8K+m+7djY8xzT1dIcL shu5i9LGF2AR7ZRNnyofK8wDlxA8QXitLgqRlP07oKnzVUnHcv9NyNKJEFJDWj6HVNUIzVoEMFrw 9V4NblQTFtgbWCZd0xOuBnfnuEYsc5ScV1Y5rEOM9PApT/TAyGmgd605ESRFvxJ0qg0KfFEs3sBl /b0P4exJFuim3pRPovXMumAHDRXPUv65fdC9RoknRW+mGabtAuE6UUTIrxaXzBnIE1jV4xZYEJw2 NO7+ySS0jpHWESfmpmgIAGIfyPNTxshtp5eRq3gqzhbZezih06znHwSQ4eItr2O7EEMX --000000000000b6f2f40610254fea--