From patchwork Tue Jun 13 13:45:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 105353 Delivered-To: patch@linaro.org Received: by 10.140.91.77 with SMTP id y71csp415384qgd; Tue, 13 Jun 2017 06:50:49 -0700 (PDT) X-Received: by 10.84.217.134 with SMTP id p6mr62840695pli.192.1497361849888; Tue, 13 Jun 2017 06:50:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1497361849; cv=none; d=google.com; s=arc-20160816; b=buYEOQypf03eZo0+0vmgoM6BXK349B746g/erdJyi7KdOXw3nB7EUEl0ZXnSgXsZvX RKK5+tZQ7Avt6rWdiDoLmbYpRFj1nMLVtzSqHpGhapz1GfjEJBBV9hcB/JAtY8ahfSXE G+MhlvJCNFfAMAWta3F6xfcI3Yy/WwZ7GvIOdG6q4wa3TA6LYymqNDIOCV0l9iNu8S6N 5zNe5FNGUTft3aiwzjEYWlp3Qoxal4vcGLQ9QW6BNd3KEAAxp+iFP0GhLEG//sJo3F5t Y4icfTtGRW1MlsRKHaiDJ+uvFGDLixlgs9XPH+ifwaXFrYQaBT8Bx3WCQRtHXWMhUcHM CcCw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:sender:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:references:in-reply-to:message-id:date:subject :to:from:dkim-signature:dkim-filter:dkim-signature :arc-authentication-results; bh=rYRHzOcd62uC/kQurXW4AeHpKjjQAAx4BOtC/4myTw8=; b=oJjsRZVYD0NwLpY2Ieea0YBeKTcY3R7XYpoP0yCcw709KBkz2RKQ09WCVj+7dDvwuR bYJP6UTmzlV3vecpyWYoG506EjiCrh1VdfuIclUGzOkP3tD+cbhg4t3XzJCCu0Wzm48y GDKBBHGFsGl7bEuN6pxAj9F6EuNRiaGFvO11BHWxkvpWlXPvLTeLJGxcG3g2BDXA4XCq wgouW81iCdncsL3cLMiiiPlYDYX7LfN/sg+DOOOk3VCM5ZRG+DTI+/ObwtsIWc/l//kz bSq+q+QDTqBIwBLxTNsgDCGRfW8HBg+KpQLVYemahb6D/tYCUXaLyp6AXK0dmvfc7bDF EgLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lists.infradead.org; dkim=neutral (body hash did not verify) header.i=@nifty.com; spf=pass (google.com: best guess record for domain of linux-mtd-bounces+patch=linaro.org@lists.infradead.org designates 65.50.211.133 as permitted sender) smtp.mailfrom=linux-mtd-bounces+patch=linaro.org@lists.infradead.org Return-Path: Received: from bombadil.infradead.org (bombadil.infradead.org. [65.50.211.133]) by mx.google.com with ESMTPS id 31si1142970pgx.215.2017.06.13.06.50.49 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 Jun 2017 06:50:49 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-mtd-bounces+patch=linaro.org@lists.infradead.org designates 65.50.211.133 as permitted sender) client-ip=65.50.211.133; Authentication-Results: mx.google.com; dkim=pass header.i=@lists.infradead.org; dkim=neutral (body hash did not verify) header.i=@nifty.com; spf=pass (google.com: best guess record for domain of linux-mtd-bounces+patch=linaro.org@lists.infradead.org designates 65.50.211.133 as permitted sender) smtp.mailfrom=linux-mtd-bounces+patch=linaro.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=rYRHzOcd62uC/kQurXW4AeHpKjjQAAx4BOtC/4myTw8=; b=pKVK7zMZnFjXFWQGZpjjZmnQ/c t+LPCzD7NBVjZXJeIIaLsuh313GoCnCXu2mTUMZ3s3DDmCvFImQaGEbDzCTbmXxE0BavNq2O738Au bBcWO6efpmcQHDrvCXw0DHNEUIOw9HRU1ElfJuMhPzpU+VEahtDBvWDxyIKCO5x3RYkrBe31K5FK8 PXeR5MwMI7h73QVC/P7jU3b9Lh9S9ti6YBDRMhe/CitHGLbzVWmF12bd4EMOZDxNnVesJ6VO+DBXm ruawoJCzG5ueHObx3p35+ffTy0Nt8H0LXcBs1tEpzFskvHXuneuI3gf0MIAFSjgHg5zZ5e8QnqjcJ FTPjiOyw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1dKmDR-00037U-Jq; Tue, 13 Jun 2017 13:50:41 +0000 Received: from conuserg-09.nifty.com ([210.131.2.76]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dKmA8-0006Uq-I4 for linux-mtd@lists.infradead.org; Tue, 13 Jun 2017 13:47:22 +0000 Received: from pug.e01.socionext.com (p14092-ipngnfx01kyoto.kyoto.ocn.ne.jp [153.142.97.92]) (authenticated) by conuserg-09.nifty.com with ESMTP id v5DDjxiv031338; Tue, 13 Jun 2017 22:46:18 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-09.nifty.com v5DDjxiv031338 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1497361579; bh=OmxvyETdYk7Idp+umNJBM2kGUjhgt0QQl99yQP33CP4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AYuXMkcRd07iRyTiGhgHFCPupttXZSC4VJ4gW2wlL89jYkY1ZgIeIPIsigqcgpPlO rKJ3W47XvrKZvT/mhASf3fsLXQ585UDgJztMdwzsOY70s7mrrac7Ww0WgqT3LMe4/P ZcBlOt7eOpn6QE94a+IUGsgVH/5BAnxNc04G9JDNMUCVethWTWyMVq4IhGAknt8uDA RqgPiC6hN0aTlyYNYqO2zta0Gc8dz3+nWuKcdqYYm0t88EKCLpDUQYafMh+RKoUpo1 gB9Mq2HaZwyuoU89F/BHhzWkf4B2RUz9B+7CM6lMyx4NiETlkJaNv9hPiZyt7YgokY WY6/A9cYhchkA== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: linux-mtd@lists.infradead.org Subject: [PATCH v7 12/16] mtd: nand: denali: support hardware-assisted erased page detection Date: Tue, 13 Jun 2017 22:45:46 +0900 Message-Id: <1497361550-8115-13-git-send-email-yamada.masahiro@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1497361550-8115-1-git-send-email-yamada.masahiro@socionext.com> References: <1497361550-8115-1-git-send-email-yamada.masahiro@socionext.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170613_064717_054315_6EA05E8C X-CRM114-Status: GOOD ( 14.18 ) X-Spam-Score: -1.2 (-) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-1.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- 0.7 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Boris Brezillon , Cyrille Pitchen , Richard Weinberger , Marek Vasut , Masahiro Yamada , Artem Bityutskiy , Dinh Nguyen , linux-kernel@vger.kernel.org, Enrico Jorns , Masami Hiramatsu , Chuanxiao Dong , Jassi Brar , Brian Norris , David Woodhouse MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+patch=linaro.org@lists.infradead.org Recent versions of this IP support automatic erased page detection. If an erased page is detected on reads, the controller does not set INTR__ECC_UNCOR_ERR, but INTR__ERASED_PAGE. The detection of erased pages is based on the number of zeros in a page; if the number of zeros is less than the value in the field ERASED_THRESHOLD, the page is assumed as erased. Please note ERASED_THRESHOLD specifies the number of zeros in a _page_ instead of an ECC chunk. Moreover, the controller does not provide a way to know the actual number of bitflips. Actually, an erased page (all 0xff) is not an ECC correctable pattern on the Denali ECC engine. In other words, there may be overlap between the following two: [1] a bit pattern reachable from a valid payload + ECC pattern within ecc.strength bitflips [2] a bit pattern reachable from an erased state (all 0xff) within ecc.strength bitflips So, this feature may intercept ECC correctable patterns, then replace [1] with [2]. After all, this feature can work safely only when ECC_THRESHOLD == 1, i.e. detect erased pages without any bitflips. This should be the case most of the time. If there is a bitflip or more, the driver will fallback to the software method by using nand_check_erased_ecc_chunk(). Strangely enough, the driver still has to fill the buffer with 0xff in case of INTR__ERASED_PAGE because the ECC correction engine has already manipulated the data in the buffer before it judges erased pages. Signed-off-by: Masahiro Yamada --- Changes in v7: None Changes in v6: - memset(buf, 0xff, size) is necessary even if the page is completely erased (all 0xff), strangely. Changes in v5: - Set ECC_THRESHOLD to 1 Changes in v4: None Changes in v3: None Changes in v2: - Newly added drivers/mtd/nand/denali.c | 9 ++++++++- drivers/mtd/nand/denali.h | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) -- 2.7.4 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c index ed0044c560e5..e8d8e6c6f45e 100644 --- a/drivers/mtd/nand/denali.c +++ b/drivers/mtd/nand/denali.c @@ -560,6 +560,9 @@ static int denali_pio_read(struct denali_nand_info *denali, void *buf, if (!(irq_status & INTR__PAGE_XFER_INC)) return -EIO; + if (irq_status & INTR__ERASED_PAGE) + memset(buf, 0xff, size); + return irq_status & ecc_err_mask ? -EBADMSG : 0; } @@ -635,6 +638,9 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf, denali_enable_dma(denali, false); dma_sync_single_for_cpu(denali->dev, dma_addr, size, dir); + if (irq_status & INTR__ERASED_PAGE) + memset(buf, 0xff, size); + return ret; } @@ -1406,7 +1412,8 @@ int denali_init(struct denali_nand_info *denali) "chosen ECC settings: step=%d, strength=%d, bytes=%d\n", chip->ecc.size, chip->ecc.strength, chip->ecc.bytes); - iowrite32(chip->ecc.strength, denali->flash_reg + ECC_CORRECTION); + iowrite32(MAKE_ECC_CORRECTION(chip->ecc.strength, 1), + denali->flash_reg + ECC_CORRECTION); iowrite32(mtd->erasesize / mtd->writesize, denali->flash_reg + PAGES_PER_BLOCK); iowrite32(chip->options & NAND_BUSWIDTH_16 ? 1 : 0, diff --git a/drivers/mtd/nand/denali.h b/drivers/mtd/nand/denali.h index f5da52f09e34..657a794af695 100644 --- a/drivers/mtd/nand/denali.h +++ b/drivers/mtd/nand/denali.h @@ -110,6 +110,10 @@ #define ECC_CORRECTION 0x1b0 #define ECC_CORRECTION__VALUE GENMASK(4, 0) +#define ECC_CORRECTION__ERASE_THRESHOLD GENMASK(31, 16) +#define MAKE_ECC_CORRECTION(val, thresh) \ + (((val) & (ECC_CORRECTION__VALUE)) | \ + (((thresh) << 16) & (ECC_CORRECTION__ERASE_THRESHOLD))) #define READ_MODE 0x1c0 #define READ_MODE__VALUE GENMASK(3, 0) @@ -233,6 +237,7 @@ #define INTR__RST_COMP BIT(13) #define INTR__PIPE_CMD_ERR BIT(14) #define INTR__PAGE_XFER_INC BIT(15) +#define INTR__ERASED_PAGE BIT(16) #define PAGE_CNT(bank) (0x430 + (bank) * 0x50) #define ERR_PAGE_ADDR(bank) (0x440 + (bank) * 0x50)