Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp4198738imm; Wed, 30 May 2018 00:41:01 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLxA6Cjr0VAfKEQfeG+zAuWrUoEVuOCkkomvDi/r2WTqJ7Uqa8gAxMlCR38Cd9pPNnulZ8p X-Received: by 2002:a17:902:b087:: with SMTP id p7-v6mr1757757plr.227.1527666061336; Wed, 30 May 2018 00:41:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527666061; cv=none; d=google.com; s=arc-20160816; b=lsK4FrwlXq0zfzAvGdh5USPezwelCNCOedOpkoz39+39B0Q4ETgXVKpAIWGajeRFEL LRlC+VE+IqcjnA02CkKL+7BoIFV3+kbsNvAIuE0lcQd/BITiBYvMBvGDCBczaoRXPAmW LdkKh9ieW3HOQbum/9nmkGaJ3AGxe7Oe1QH/ZkjwQGb1YcJjUT6BQ7sDSDSrLgc874lj X9e8Ag44ES4GicC8orq6wm3NXjiyb/LPRPn1wJbT+QAINZxt+c9y/Ay338xv0bXHQ8bS kS3aBfqf1kGr53kjGgU09nwyNN5KaBwsT5PYqAauxi06aldB+hDm+K6ENMdlo0izqLxB tWKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature:dkim-filter :arc-authentication-results; bh=Gj0EdzoXGlHPdYMqbRGIy97Lr/OQkNNRkaBKXqHOsaM=; b=d7gLX2BLMV/nG11q8Pv1bz8ZQMUygmpJFW6RmAlrMyM7lDeJbRxX+GHLAsmWHinKg8 w9ScG/YQYpB2ghnqE3Imt0oSXB771KaIvGKI+YNaF9TA5yCFi2j7pc7Vhfg8mxQMIrhZ 11U/C+gg0t/iGO3arCPJjnp0UNfX2BTJsYGvwK3NjPWOYII0F1btCC1jW+Ywwba2tciU rBDRTIqqUkts0I3acaVY1MF7LapN6WL2fPZVv/VXEr/WrtficRn0UBgOCuwSAjLCQh7H fBWB4dj+BedAwNkFxS+6mwziQGcfABjw9eASHNPOBBr7X/0O07BXc3mrSkJMewVfFU1X Da0A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=Oy/F/+ql; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 61-v6si33740709plz.290.2018.05.30.00.40.46; Wed, 30 May 2018 00:41:01 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=Oy/F/+ql; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S968608AbeE3HjQ (ORCPT + 99 others); Wed, 30 May 2018 03:39:16 -0400 Received: from conssluserg-01.nifty.com ([210.131.2.80]:27647 "EHLO conssluserg-01.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934727AbeE3HjN (ORCPT ); Wed, 30 May 2018 03:39:13 -0400 Received: from mail-vk0-f53.google.com (mail-vk0-f53.google.com [209.85.213.53]) (authenticated) by conssluserg-01.nifty.com with ESMTP id w4U7cn6S021994; Wed, 30 May 2018 16:38:50 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-01.nifty.com w4U7cn6S021994 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1527665930; bh=Gj0EdzoXGlHPdYMqbRGIy97Lr/OQkNNRkaBKXqHOsaM=; h=In-Reply-To:References:From:Date:Subject:To:Cc:From; b=Oy/F/+ql0VyZGim+dMi41Bm7SO7UvoB6aWbesLz512KZRko1QfN2O5rfmHeDSar+h gyZDKGGGhv8C/KQJL9RGkhUC0JtFUDCrurU9A3+sGEzYZ2xIHI4BzgDq5g6P3eCvXt knn4QAHXKqyoQif64+Ofp2UgzJBFHOeFAhtvU4aP1utJMnlt+xO/pzZ+QdR2bXuKKW jRMXtjBUeF6a3wHuWCwrAuCnYX2IZUadx1ktdrQe+IYIRz2M0fOJx6+pn21dLKMQYr psT8x30EcRmaNPgf2M3WplZjuGKOOeCxFrYEJmv6LVFrg8u24kVsN2OCU4Het72w0x XsdOvNw080kdg== X-Nifty-SrcIP: [209.85.213.53] Received: by mail-vk0-f53.google.com with SMTP id x66-v6so10493279vka.11; Wed, 30 May 2018 00:38:49 -0700 (PDT) X-Gm-Message-State: ALKqPwfEH77WobqZYXUAdJwxktyqQMAprWuCarSeJiZA/wiQngnikaBt e3fDOTD/FzdNidHifzGR+FlSEaeEiLcnKcv14sY= X-Received: by 2002:a1f:8950:: with SMTP id l77-v6mr843191vkd.160.1527665928823; Wed, 30 May 2018 00:38:48 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:ab0:55d8:0:0:0:0:0 with HTTP; Wed, 30 May 2018 00:38:08 -0700 (PDT) In-Reply-To: References: <1527250904-21988-1-git-send-email-absahu@codeaurora.org> <1527250904-21988-2-git-send-email-absahu@codeaurora.org> <20180526095807.5caf5800@xps13> <20180529213036.150ed16a@bbrezillon> From: Masahiro Yamada Date: Wed, 30 May 2018 16:38:08 +0900 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v3 01/16] mtd: rawnand: helper function for setting up ECC configuration To: Abhishek Sahu Cc: Archit Taneja , Marek Vasut , Richard Weinberger , linux-arm-msm , Miquel Raynal , Linux Kernel Mailing List , Boris Brezillon , linux-mtd , Cyrille Pitchen , Andy Gross , Brian Norris , David Woodhouse Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2018-05-30 15:21 GMT+09:00 Abhishek Sahu : > On 2018-05-30 05:58, Masahiro Yamada wrote: >> >> Hi. >> >> 2018-05-30 4:30 GMT+09:00 Boris Brezillon : >>> >>> On Sat, 26 May 2018 10:42:47 +0200 >>> Miquel Raynal wrote: >>> >>>> Hi Abhishek, >>>> >>>> On Fri, 25 May 2018 17:51:29 +0530, Abhishek Sahu >>>> wrote: >>>> >>>> > commit 2c8f8afa7f92 ("mtd: nand: add generic helpers to check, >>>> > match, maximize ECC settings") provides generic helpers which >>>> > drivers can use for setting up ECC parameters. >>>> > >>>> > Since same board can have different ECC strength nand chips so >>>> > following is the logic for setting up ECC strength and ECC step >>>> > size, which can be used by most of the drivers. >>>> > >>>> > 1. If both ECC step size and ECC strength are already set >>>> > (usually by DT) then just check whether this setting >>>> > is supported by NAND controller. >>>> > 2. If NAND_ECC_MAXIMIZE is set, then select maximum ECC strength >>>> > supported by NAND controller. >>>> > 3. Otherwise, try to match the ECC step size and ECC strength closest >>>> > to the chip's requirement. If available OOB size can't fit the chip >>>> > requirement then select maximum ECC strength which can be fit with >>>> > available OOB size. >>>> > >>>> > This patch introduces nand_ecc_choose_conf function which calls the >>>> > required helper functions for the above logic. The drivers can use >>>> > this single function instead of calling the 3 helper functions >>>> > individually. >>>> > >>>> > CC: Masahiro Yamada >>>> > Signed-off-by: Abhishek Sahu >>>> > --- >>>> > * Changes from v2: >>>> > >>>> > 1. Renamed function to nand_ecc_choose_conf. >>>> > 2. Minor code reorganization to remove warning and 2 function calls >>>> > for nand_maximize_ecc. >>>> > >>>> > * Changes from v1: >>>> > NEW PATCH >>>> > >>>> > drivers/mtd/nand/raw/nand_base.c | 42 >>>> > ++++++++++++++++++++++++++++++++++++++++ >>>> > drivers/mtd/nand/raw/nand_base.c | 31 +++++++++++++++++++++++++++++++ >>>> > include/linux/mtd/rawnand.h | 3 +++ >>>> > 2 files changed, 34 insertions(+) >>>> > >>>> > diff --git a/drivers/mtd/nand/raw/nand_base.c >>>> > b/drivers/mtd/nand/raw/nand_base.c >>>> > index 72f3a89..e52019d 100644 >>>> > --- a/drivers/mtd/nand/raw/nand_base.c >>>> > +++ b/drivers/mtd/nand/raw/nand_base.c >>>> > @@ -6249,6 +6249,37 @@ int nand_maximize_ecc(struct nand_chip *chip, >>>> > } >>>> > EXPORT_SYMBOL_GPL(nand_maximize_ecc); >>>> > >>>> > +/** >>>> > + * nand_ecc_choose_conf - Set the ECC strength and ECC step size >>>> > + * @chip: nand chip info structure >>>> > + * @caps: ECC engine caps info structure >>>> > + * @oobavail: OOB size that the ECC engine can use >>>> > + * >>>> > + * Choose the ECC configuration according to following logic >>>> > + * >>>> > + * 1. If both ECC step size and ECC strength are already set (usually >>>> > by DT) >>>> > + * then check if it is supported by this controller. >>>> > + * 2. If NAND_ECC_MAXIMIZE is set, then select maximum ECC strength. >>>> > + * 3. Otherwise, try to match the ECC step size and ECC strength >>>> > closest >>>> > + * to the chip's requirement. If available OOB size can't fit the >>>> > chip >>>> > + * requirement then fallback to the maximum ECC step size and ECC >>>> > strength. >>>> > + * >>>> > + * On success, the chosen ECC settings are set. >>>> > + */ >>>> > +int nand_ecc_choose_conf(struct nand_chip *chip, >>>> > + const struct nand_ecc_caps *caps, int oobavail) >>>> > +{ >>>> > + if (chip->ecc.size && chip->ecc.strength) >>>> > + return nand_check_ecc_caps(chip, caps, oobavail); >>>> > + >>>> > + if (!(chip->ecc.options & NAND_ECC_MAXIMIZE) && >>>> > + !nand_match_ecc_req(chip, caps, oobavail)) >>>> > + return 0; >>>> > + >>>> > + return nand_maximize_ecc(chip, caps, oobavail); >>>> >>>> I personally don't mind if nand_maximize_ecc() is called twice in >>>> the function if it clarifies the logic. Maybe the following will be >>>> more clear for the user? >>>> >>>> if (chip->ecc.size && chip->ecc.strength) >>>> return nand_check_ecc_caps(chip, caps, oobavail); >>>> >>>> if (chip->ecc.options & NAND_ECC_MAXIMIZE) >>>> return nand_maximize_ecc(chip, caps, oobavail); >>>> >>>> if (!nand_match_ecc_req(chip, caps, oobavail)) >>>> return 0; >>>> >>>> return nand_maximize_ecc(chip, caps, oobavail); >>> >>> >>> I personally don't mind, and it seems Masahiro wanted to keep the logic >>> he had used in the denali driver. >>> >>>> >>>> Also, I'm not sure we should just error out when nand_check_ecc_caps() >>>> fails. What about something more robust, like: >>>> >>>> int ret; >>>> >>>> if (chip->ecc.size && chip->ecc.strength) { >>>> ret = nand_check_ecc_caps(chip, caps, oobavail); >>>> if (ret) >>>> goto maximize_ecc; >>> >>> >>> Nope. When someone asked for a specific ECC config by passing the >>> nand-ecc-xxx props we should apply it or return an erro if it's not >>> supported. People passing those props should now what the ECC engine >>> supports and pick one valid values. >>> >>>> >>>> return 0; >>>> } >>>> >>>> if (chip->ecc.options & NAND_ECC_MAXIMIZE) >>>> goto maximize_ecc; >>>> >>>> ret = nand_match_ecc_req(chip, caps, oobavail); >>>> if (ret) >>>> goto maximize_ecc; >>>> >>>> return 0; >>>> >>>> maximize_ecc: >>>> return nand_maximize_ecc(chip, caps, oobavail); >>>> >>> >>> >>> ______________________________________________________ >>> Linux MTD discussion mailing list >>> http://lists.infradead.org/mailman/listinfo/linux-mtd/ >> >> >> >> >> >> >> >> This version looks good to me. >> >> If you want to check the error code more precisely, >> how about something like follows? >> >> >> >> int nand_ecc_choose_conf(struct nand_chip *chip, >> const struct nand_ecc_caps *caps, int oobavail) >> { >> int ret; >> >> if (chip->ecc.size && chip->ecc.strength) >> return nand_check_ecc_caps(chip, caps, oobavail); >> >> if (!(chip->ecc.options & NAND_ECC_MAXIMIZE)) { >> ret = nand_match_ecc_req(chip, caps, oobavail); >> if (ret != -ENOTSUPP) >> return ret; >> } >> >> return nand_maximize_ecc(chip, caps, oobavail); >> } >> >> >> Only the difference is the case >> where nand_match_ecc_req() returns a different error code >> than ENOTSUPP. >> (Currently, this happens only when insane 'oobavail' is passed.) >> > > We can do that but to me, it will make the helper function > more complicated. Currently, nand_match_ecc_req is returning > other than ENOTSUPP 'oobavail < 0' is passed. > and again in nand_maximize_ecc, we will check for validity > of oobavail so nothing wrong will happen in calling > nand_maximize_ecc. Right. When I added those three helpers, I supposed they were independent APIs. That is why I added the 'oobavail < 0' sanity check in each of the three. If you make them internal sub-helpers (i.e. add 'static' instead of EXPORT_SYMBOL_GPL), you can check 'oobavail < 0' only in nand_ecc_choose_conf(). > Anyway we put this under WARN_ON condition > > if (WARN_ON(oobavail < 0)) > return -EINVAL; > > so if this is being triggered, then it should be mostly > programming error. Right. Moreover, WARN_ON(oobavail < 0 || oobavail > mtd->oobsize) This is programming error, that is why WARN_ON() is used to make the log noisy. > Thanks, > Abhishek > >> >> ENOTSUPP means 'required ECC setting is not supported'. >> Other error code is more significant, so it is not a good reason >> to fall back to miximization, IMHO. > > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ -- Best Regards Masahiro Yamada