From patchwork Fri Jun 10 17:01:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Xu X-Patchwork-Id: 633852 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rR7ks37SQz9sdm for ; Sat, 11 Jun 2016 03:02:13 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b=nYjURz2J; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1bBPnZ-0007qs-87; Fri, 10 Jun 2016 17:00:45 +0000 Received: from mail-db3on0071.outbound.protection.outlook.com ([157.55.234.71] helo=emea01-db3-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1bBPnM-0007HB-4a for linux-mtd@lists.infradead.org; Fri, 10 Jun 2016 17:00:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=NbwJSP+qASl8gkENdSCVPWsVoByXTyYxTEMT002Ic4c=; b=nYjURz2JL0a6ZAwQ5ChU9kgdCYd4Yff2h0K0PJFv4Xj0G7mj0ZOo6mIxHlbMrCxTH/dm2D52khdnCaLpuoyi5zrcSvJRyYKtP8EU0qlreHK6qBIkiEia/piqK+PPh2xTKnHiKY2pvDHQsUf/ljjhz2qfRDmeKFHg/1AuaWEM8R8= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=han.xu@nxp.com; Received: from Cayman.am.freescale.net (192.88.168.49) by VI1PR0401MB1855.eurprd04.prod.outlook.com (10.165.235.21) with Microsoft SMTP Server (TLS) id 15.1.517.8; Fri, 10 Jun 2016 17:00:13 +0000 From: Han Xu To: , , , , , , , , , , Subject: [PATCH v2 4/6] mtd: nand: gpmi: correct bitflip for erased NAND page Date: Fri, 10 Jun 2016 12:01:32 -0500 Message-ID: <1465578094-8816-5-git-send-email-han.xu@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1465578094-8816-1-git-send-email-han.xu@nxp.com> References: <1465578094-8816-1-git-send-email-han.xu@nxp.com> MIME-Version: 1.0 X-Originating-IP: [192.88.168.49] X-ClientProxiedBy: SN1PR07CA0016.namprd07.prod.outlook.com (10.162.170.154) To VI1PR0401MB1855.eurprd04.prod.outlook.com (10.165.235.21) X-MS-Office365-Filtering-Correlation-Id: 1f45688e-c77b-40b6-4778-08d39150b1c8 X-Microsoft-Exchange-Diagnostics: 1; VI1PR0401MB1855; 2:LqsQo1g7LPObPCjjy9KaCJg3C3E/S4iuxbh92sLVvjSIM9dMKTn0l72L8QZvtJV3Vr69GB2zmjfahud5IYFi9amdtmel1pObxxuzDBYdPPpgcYqh98YRR/2Zz+ejwNGrtHva71uDDH9EbBnEmlPaqSn63w9m1IbV10LPPNEYvZdSfyf2IrdXMRQEOpYHpI+U; 3:G240MQLOnpAlpdoS6Fb3QtxoTxSiHP0ZaVvS8Evb9hHDJjLOpG3d5IlAENQ14GnEbdqotk3e+Ico4oymEAo86kKzB2YctcgDRZr+Un92mFz2Lapm15oZGPLuDqj8b3zf; 25:vtwJh/CbGwuhE8A12S0V5C0qnqCJlond73bNMxtPABp1tk+MgYsspLCgBcAHXpFa6NrPUi5sMu0uVYCwbJ6ClQrMK/pcJEQtSB203tiDBZPV2gcYSuPXw3rvoQmnqjwvLEMYPglZkfAr8u6BqyyFJi3GMmTdQHjgBkVbfOyVEKmjBllbF7CIAXgDY/Za5yrsk7ATafIHxv3QbaSOsFrBFqyL2kQ4rIDInn9bhzNmdpsjSCe2IR3yvri7K/ZsNwqHuMcTpL5c0vwSaEqAqdMOHmK8zLVJIqoL25NCUTT3GoMImfbaKzjR9PahNGcQOM2gy9S/Rw7xYjKzDCt7Xv9ObquLf6T7s+JrZeaDqykR5cs0Yg/GnlDi9D4BSwijFHmFHpSagbwg01b1j3FHo3yvCQLj2EvA0c4Krvx/A6tgdUM= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0401MB1855; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0401MB1855; 20:wozOMD5rWn1ryWJ/napPeM6n02yZiivTCoji3gtz3lm7dVf1Idou1coh3MJUiz3iMUaj0NO1D4lj99vd9r3ov5aJsAdDkB0LhgKghieavNqFCXHJmFeTXfYgxcQCqj5NiIH5KNVVOAaK3s+deLC9bJtgiMrrGnsX6iw1htY7X3nmiWlKz6kzt4m/EGlZTPCodY91woW9Z0pMwZXzZ+lLf8doPseF+bgjdS7CZKSudGH4wK9Us8QBAc7Hej+8pukt7cTNKRcKQRB9PkcPMfjilZn2DOr2JTEraJFdmXi4MaZdvS/wqBHz1LpwpdAPvmtLY8wLwBbZC5u31MFB+NDaIddgaE+2A/xwjp9twbAK5YgdXEckJVtN52zqOqO1YUT7Le1mqzDWEDijFazW1klXgrzeO2Pp2cWX3gw+O/VjGeJ20J1MfJ9FGyL/HdyqQJdzl+7jQtHxmq9KiPpXv9q9kXhqZ+5FsftGv0/DPMn0WcQBQeqSV5HDRkyFDwU9imaA; 4:/N9yBIrdOZukH49VeyFEQM4v5ZokIRzlABPiS/+eKucm1ifpC7Ngz35kwJ3Di+ZnVTV30aqKicLw5ebPSPUdHgYLYmHfnhfcjoaihkHHmWy1nvgsMZDhnUaYIzAv/7HYj3fyygTAdXZTgfgb64mDdjBal9NR//Ybh/tMO+Y+vuW5tJIZv+uckb05fYmmMk97bD30cPJlXSklPMfW/6nK+JHMM7HKnMRV6nFAqHSq2QHlvQiZiryaZtosADgSYtPKlbbvRnNs+IM9Xcblpe1QIEBubxUL3Y9Q8X7RejF0E5QPDlBQmSTharZFF7m1lhgFfMdB8IvuadWXifoymAprowtYi/kYtM3NmU8ECZYcnoiYRxUwUlGNLvuKm4Q8BQCUJhIAkTkTVdcY3AkWMaMwxWe8sAhQAVWQCzcUGWg1IplNXEl7BPpcvq2o1Z3hTyOK X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6055026); SRVR:VI1PR0401MB1855; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0401MB1855; X-Forefront-PRVS: 096943F07A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(7916002)(189002)(199003)(76176999)(50986999)(77096005)(101416001)(92566002)(19580405001)(2906002)(68736007)(106356001)(586003)(19580395003)(229853001)(5008740100001)(4326007)(105586002)(48376002)(97736004)(6116002)(5001770100001)(8676002)(36756003)(50466002)(81166006)(189998001)(50226002)(47776003)(5003940100001)(81156014)(3846002)(33646002)(2950100001)(2201001)(66066001)(86362001)(42186005)(575784001)(5004730100002)(921003)(1121003); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0401MB1855; H:Cayman.am.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; CAT:NONE; LANG:en; CAT:NONE; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0401MB1855; 23:yDlarVeR1PVq4x6UkuxVK7YXlMoIfQ3fZ2CqPXG?= =?us-ascii?Q?Wks++6u/yaxa69V68r1JY7LEeJOA9TmmsrudEgj+OcBjVh/IQw8FRwarM5Um?= =?us-ascii?Q?59TE74z3w3PhxElc8ClSStjZKFUjPV9PDamgCTYFRDYS25/sKg+eHb1kBMkG?= =?us-ascii?Q?sImTkzTaqNGV/M13mWcn9UZcuXNbzktfCCD1WoYT/zAyT7QvugzJjo4P17xS?= =?us-ascii?Q?+k0BBDP+iv15XbxnOD2fBpxm5MNdHkZW1JJE87JK7TLRE9JOFCHkscRSuyUG?= =?us-ascii?Q?1tuQkkyqX1aMvFl35phi2t6IH5WghNZHTi3+fz/czqHMSXfnKrrnQ1IJiUUq?= =?us-ascii?Q?rfnNeEiB30Z3ioKOzFTq9eJsCV9ctchKijpl3KgpDK4SA+r764dEeuIdraPZ?= =?us-ascii?Q?c7eJhIoR7u+tzGVkl9425rqIBXrBS4n4Qh0kdx5OU5XbGZHHuEnHQcEkoIzF?= =?us-ascii?Q?0TcQ9cmXU3c09cxUdT8x71FS6JxpEACriDVuq6z7GF1otbby2tgqerDLdwlc?= =?us-ascii?Q?QzmO9ccYraqCTCwaBoAbgrvPF6rc3YGhe1bbhl299BJ2OzqITdL5foi7igSq?= =?us-ascii?Q?2cvmfJZbX5+bHvy1xR78oX7ogvphgVXpgdg3pKaHMwLQfTL5FvJs2iC7NAeD?= =?us-ascii?Q?5zx+JEeEuc4qfVRY84pHIg9ww9Bs2qhyl1kEkkm2MJuQ865cOtkpdL6J1RDF?= =?us-ascii?Q?kAWryKZTcEqnewYCy2XKDwsAEb0THrvryzlavloHxtfvAbrTlDSOLVXoqTB7?= =?us-ascii?Q?WOlmO0QuaoxFhNifgyfnqedSv8wXIG0slj8qMQdgLVcg3aCgK1JUOJEV2L10?= =?us-ascii?Q?oa7sjHxzkF0/DjNYqtOWBVVBROlzcFigTwclLPWJqWEMilxtDPqQsUXuuxo2?= =?us-ascii?Q?e++CzRnHn2c2EaXCEjBRG1G+VIV4kMC6PTaoxVPVFEJeW/CuS/bjwxFse6AZ?= =?us-ascii?Q?hFPj6fQ1FS+jbJUFx6GV9VD+pEF/fCT2KaihPF65pPZHTP/rxIPukM1lPAYM?= =?us-ascii?Q?P3+Tebqq43GtqOjMGR8FLOFIXhkWrPEb0Jw5GOZoRWu+v8JRNnJwZQ4EyPMv?= =?us-ascii?Q?wJ4yEwfTLzGmEvQ9h7dsiCFAcPneutAEW+PkWkV2bvOnf8sWRmjIfkGlXlR0?= =?us-ascii?Q?HnZTnKwVl0bUxbKGdqO7sP3lVwGk9PXuJ?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0401MB1855; 6:IZtVRtPi3+MM3htUryC4cMioEnhBl1OHlLZKa2MbliUXdWOuaUO2dF0mNTZ3UoP1H7S+bLw/nLVQhLHn9+rW/j/IoGQH7SL+qh6jF8dHankxiYJWu+st+5nk8IWwzGtzlKTw+6Sd0ZuLvyL/P57ncB7SkluqcjMFZtnBgnLPpUELnIK3J2KwmpZ6eKJpY86lHrN/wmhhzRikmAm7Ed8UrosiguRpSYMmlkPPPZKqOGtJnaoKyJJGu7V1MCQQkBa0Hfpp+wpTeKh7VLDQ2MwpotFLx6f4tU7siFssMU2fKj81RO2+n2W9i2esXOLfjGrA; 5:qUxVDqZcukot9jNoxraKkkeSlK/q0y5hFJBZ8P1m4FvnD1qsW1Lz+5bwmTxzDw3gxkpa12kBvdik++oHZfhnXAoug8feHcpQrpQHjNYIe0eKDfughmhWVF9mXPK3c4Kn0i+u825WgYNwhbXwMb7ffw==; 24:KlvlHV0AFRlIXBMZd1IdJVd80KpwNYXA2vPdrH8r5pkljpH/AewzhVGDRWTC8i4OX3gz4jyED+/pAdTXIrb/sZIuk7LkuX8O3+pbumL8JFg=; 7:Y+MfTQiBDuRy4BVa0PrpQVfAgdM/VsfzDQFa3PWHsC93qpt4ykCDYtKBhmCrgvEYbzGLnXdZOca5Y4RhbgfOIoso74yKb3sFfuQoeIjgCTuaXnLbPZcuYuaGurfHHHIVYznJ9uCQpvUnEahKNNGjZzTXuZix8haHuP8c8mQQqk2bgaUhyuZ3ry0ZZ3eeiT0/fDQh7vfpZ5RDczrZX+iNnMa4fxXUTr/gBfHCTGPzv98= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jun 2016 17:00:13.3600 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0401MB1855 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160610_100032_417543_E205CCA0 X-CRM114-Status: GOOD ( 16.01 ) X-Spam-Score: -2.0 (--) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-2.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [157.55.234.71 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [157.55.234.71 listed in list.dnswl.org] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.0 SPF_PASS SPF: sender matches SPF record -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_VALID_AU Message has a valid DKIM or DK signature from author's domain 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.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org i.MX6QP and i.MX7D BCH module integrated a new feature to detect the bitflip number for erased NAND page. So for these two platform, set the erase threshold to ecc_strength and if bitflip detected, GPMI driver will correct the data to all 0xFF. Signed-off-by: Han Xu --- drivers/mtd/nand/gpmi-nand/bch-regs.h | 10 ++++++++++ drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 5 +++++ drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 27 ++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/mtd/nand/gpmi-nand/bch-regs.h b/drivers/mtd/nand/gpmi-nand/bch-regs.h index 228142c..2c44b88 100644 --- a/drivers/mtd/nand/gpmi-nand/bch-regs.h +++ b/drivers/mtd/nand/gpmi-nand/bch-regs.h @@ -30,7 +30,13 @@ #define BM_BCH_CTRL_COMPLETE_IRQ (1 << 0) #define HW_BCH_STATUS0 0x00000010 + #define HW_BCH_MODE 0x00000020 +#define BP_BCH_MODE_ERASE_THRESHOLD 0 +#define BM_BCH_MODE_ERASE_THRESHOLD (0xff << BP_BCH_MODE_ERASE_THRESHOLD) +#define BF_BCH_MODE_ERASE_THRESHOLD(v) \ + (((v) << BP_BCH_MODE_ERASE_THRESHOLD) & BM_BCH_MODE_ERASE_THRESHOLD) + #define HW_BCH_ENCODEPTR 0x00000030 #define HW_BCH_DATAPTR 0x00000040 #define HW_BCH_METAPTR 0x00000050 @@ -125,4 +131,8 @@ ) #define HW_BCH_VERSION 0x00000160 +#define HW_BCH_DEBUG1 0x00000170 +#define BP_BCH_DEBUG1_ERASED_ZERO_COUNT 0 +#define BM_BCH_DEBUG1_ERASED_ZERO_COUNT \ + (0x1ff << BP_BCH_DEBUG1_ERASED_ZERO_COUNT) #endif diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c index 358ff5d..0b5666a 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c @@ -298,6 +298,11 @@ int bch_set_geometry(struct gpmi_nand_data *this) | BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size, this), r->bch_regs + HW_BCH_FLASH0LAYOUT1); + /* Set erase threshold to ecc_strength for mx6qp and mx7 */ + if (GPMI_IS_MX6QP(this) || GPMI_IS_MX7(this)) + writel(BF_BCH_MODE_ERASE_THRESHOLD(ecc_strength), + r->bch_regs + HW_BCH_MODE); + /* Set *all* chip selects to use layout 0. */ writel(0, r->bch_regs + HW_BCH_LAYOUTSELECT); diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index aedaff3..03bdb4d 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c @@ -1043,6 +1043,7 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, { struct gpmi_nand_data *this = nand_get_controller_data(chip); struct bch_geometry *nfc_geo = &this->bch_geometry; + void __iomem *bch_regs = this->resources.bch_regs; void *payload_virt; dma_addr_t payload_phys; void *auxiliary_virt; @@ -1051,6 +1052,8 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, unsigned char *status; unsigned int max_bitflips = 0; int ret; + int bitflips = 0; + int bitflip_flag = 0; dev_dbg(this->dev, "page number is : %d\n", page); ret = read_page_prepare(this, buf, nfc_geo->payload_size, @@ -1088,8 +1091,20 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, payload_virt, payload_phys); for (i = 0; i < nfc_geo->ecc_chunk_count; i++, status++) { - if ((*status == STATUS_GOOD) || (*status == STATUS_ERASED)) + if (*status == STATUS_GOOD) + continue; + if (*status == STATUS_ERASED) { + if (GPMI_IS_MX6QP(this) || GPMI_IS_MX7(this)) { + bitflips = readl(bch_regs + HW_BCH_DEBUG1); + if (bitflips) { + bitflip_flag = 1; + max_bitflips = max_t(unsigned int, + max_bitflips, + bitflips); + } + } continue; + } if (*status == STATUS_UNCORRECTABLE) { int eccbits = nfc_geo->ecc_strength * nfc_geo->gf_len; @@ -1098,6 +1113,10 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, int eccbytes; int flips; + /* shortcut for i.MX7 and i.MX6QP */ + if (GPMI_IS_MX6QP(this) || GPMI_IS_MX7(this)) + continue; + /* Read ECC bytes into our internal raw_buffer */ offset = nfc_geo->metadata_size * 8; offset += ((8 * nfc_geo->ecc_chunk_size) + eccbits) * (i + 1); @@ -1182,6 +1201,12 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, chip->oob_poi[0] = ((uint8_t *) auxiliary_virt)[0]; } + /* if bitflip occurred in erased page, change data to all 0xff */ + if (bitflip_flag) { + memset(buf, ~0, nfc_geo->payload_size); + memset(chip->oob_poi, ~0, mtd->oobsize); + } + return max_bitflips; }