From patchwork Wed Oct 21 21:40:07 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Xu X-Patchwork-Id: 534101 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 6A67D1402B3 for ; Thu, 22 Oct 2015 08:55:17 +1100 (AEDT) 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 1Zp1IO-0002h9-Tp; Wed, 21 Oct 2015 21:51:44 +0000 Received: from mail-bn1on0135.outbound.protection.outlook.com ([157.56.110.135] helo=na01-bn1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Zp1I8-0002Zf-Gh for linux-mtd@lists.infradead.org; Wed, 21 Oct 2015 21:51:30 +0000 Received: from CO2PR03CA0027.namprd03.prod.outlook.com (10.141.194.154) by CY1PR0301MB1306.namprd03.prod.outlook.com (10.161.212.16) with Microsoft SMTP Server (TLS) id 15.1.300.14; Wed, 21 Oct 2015 21:51:05 +0000 Received: from BY2FFO11FD021.protection.gbl (2a01:111:f400:7c0c::184) by CO2PR03CA0027.outlook.office365.com (2a01:111:e400:1414::26) with Microsoft SMTP Server (TLS) id 15.1.286.15 via Frontend Transport; Wed, 21 Oct 2015 21:51:06 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=freescale.com; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD021.mail.protection.outlook.com (10.1.15.210) with Microsoft SMTP Server (TLS) id 15.1.300.4 via Frontend Transport; Wed, 21 Oct 2015 21:51:05 +0000 Received: from chopperman.am.freescale.net (chopperman.am.freescale.net [10.81.16.64]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id t9LLp2qc010327; Wed, 21 Oct 2015 14:51:04 -0700 From: Han Xu To: Subject: [PATCH v4 5/6] mtd: nand: gpmi: correct bitflip for erased NAND page Date: Wed, 21 Oct 2015 16:40:07 -0500 Message-ID: <1445463608-5836-6-git-send-email-b45815@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1445463608-5836-1-git-send-email-b45815@freescale.com> References: <1445463608-5836-1-git-send-email-b45815@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD021; 1:fSS/D9to4fmfEyUCo6+ygP5DLFnAdVxSORMcAzUSvJMVYYbXu8Wl8+ttENr9pDm6QRti0HS4ea0zx8/lWa7lDpPnE794w7a1N+gwaX/5FaWk39uByPyC7PCJa2tk/K/FtMNFPBmsbN7o9U3J3HkXoBC98S9lnYVoKzjtKcik3lOSXWT+cH58X6YlPlZKLKzjV4z4Ni0V6PqCLAjTdWhpmArOnZNr+NTGkBxK/ee+Wl64MVrWHM7RMXLNA/+QcIP6JDWnf3jNxELfOnVHYf07h2nBMWu8y5nnedrWg/vWSOvfXFIJ1ZFg3YW1fySE0Sy304CaJLvg0fIFKD/7YEagaMHFrS2UkCrlOzO/9N6S0hTpTFt/rDvjCdqyG4cuWVO7yRC9/17suKcLQ0x9Zq+NQw== X-Forefront-Antispam-Report: CIP:192.88.168.50; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(5007970100001)(2950100001)(19580395003)(50226001)(64706001)(46102003)(33646002)(110136002)(5001960100002)(19580405001)(189998001)(50986999)(47776003)(5008740100001)(2351001)(229853001)(48376002)(50466002)(77096005)(104016004)(81156007)(6806005)(575784001)(36756003)(106466001)(97736004)(85426001)(87936001)(5003940100001)(105606002)(92566002)(76176999); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR0301MB1306; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1306; 2:ofDqyKp1+sn4pRyTJkvJH4wLHa6QEZC985bGQO6888MLrxudHeewxjpqoWJ/liEuG1v0erbewCx11A12eMaFesAGFnsyUBDdvtI+PJh7UJ6RXzEPA6qLtxomJeD11ElnxqOZAfpGzLzw8pntudvCWGvzQuB0ibQk2hcKEUYQEuY=; 3:Myl5HlBaJIOsEDp2FJoQN+frR/2N/vat+HAQ3yIPAutUR2Gw4vyDXIMhMnJCwLoSRhN3S9TRT1Eg19ooSz5ZLmch6akbTahynXYroykJjRQsmLi3KEY5ZyQMXNjYWyKcmmqXGgr1Qdt6X0JoLdmVcG1lAbJIBWm1rvXSDf6LJUHeW8IaRsgy6ZWV0NEmfeXLPY19fFTfIGyBd21emZ70mIf/upRXIXJ4YCqXQTT2qEQ=; 25:pj+0zlVptCfnHFhFajV+oYoOQhDa6ut1E2EPgIMu4d/M5p+ZjCEJrDYMqRw5XmSFQQsi59jcd9sSADpHRQoyYkVeid1yTM4mF1tEDsguRJdOiWG6TAeW+2f7+/1Cn6YKlA2yWhH31wYHmdjYpaeQ9spUHzslELJ+y9Lng6OiFFLwL4J9AUuQWbU03uEvLNxoUYDokjDUgNzxpLzYjbbjEGw3sSmNtoioJt+LXTqZKVboUmRqwc7TmBIXopASNHjY X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1306; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1306; 20:B8vGWNEINaOAhEICp6v68e4MP6wsaXKTK6eO8NdQwxRsZq2Ndant2UTiFYpt91S/TpCrnxPxCDFDkjI6WeInKcF2UZdztq3Y5RYnYUAcJ1qThVQ5az7uUje4HjM+fncZShY6AIcDwNjlpAM1gljpyF1BUC82trcYUxtLNOBTkdMzQfz/9+lCs9Otps/od5bEWVAYszVwLlNPW2Roz+W8EeobTI/r3ISf/pGgs7ZFj66tF96mNROG/QeyAdT0KklJX7yQrSaAddvXMu7W8JbO0NHq/VjoyQpCiiDg5oT6T79pL8+gIYVyN6vrlMVmGJaLJrEheClMtmnSjbprHU8yXp6tOk+CwHBnHU7OrKylmB4=; 4:okBjnDsVL0QMgku4e2SKYgWs+hEir4pYsZ/tgNMMBuxuU4j/EE+6I97VNlTtE+f7Z5hO228QiMUwhDk318/TmYplLITKCrvOggZ+ifAQKXhjJkpCfVxKRNCAJkNRBGDgMWDZiRDnO+UQcFLTDg380WyeUjWdpTQm36RFDM6XUuqdBzQ6DQu9nNLTLEgEWlRUqMDddvK2evcKS+C2TfYD46fJ1T/6SW39zytSrgYAVI9ZrC8bEQbkHSEGQEjn5l7uWrbPW8rk+mvRqkVn0kwh0/+xM6Y/jttn96QeTb+jRLn0kFg8j/LcbL7B6O8RYQsvsnwG5e4aZx7nHgJydK4kJ4MNZhtxOOdz6CNP7JpuEjhF5UNmzr0OqeziPDHdOKak X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001)(102115026); SRVR:CY1PR0301MB1306; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0301MB1306; X-Forefront-PRVS: 073631BD3D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB1306; 23:k2C7WESHgFeeajt3gwajpYsGHWJkG+0HgOuQL1i?= =?us-ascii?Q?qmgiO/MsUJaoeDwogTJ4hQFvM5jsEnXAi9ncCN7ry3Uhr4BQx/sBp3/VIo0R?= =?us-ascii?Q?h4fR1aFHwHkO9lldtLsNm1lI1owX1raR4pCRNCi/7WuOppIP9bY2wbNCmKgF?= =?us-ascii?Q?LHuZLcOvYJbawAATMxhf+22YmT9VS/Rlx4TR03UPFwQfDP7WPcqygumxd5Qu?= =?us-ascii?Q?gN/Zt8qVxjyDTmKPHLwaQOKV5kOs0ex6UN6Xn2IuHkioV8kAKbqNEMQIDuW7?= =?us-ascii?Q?GA6NJkgEDAlUqBruw+cOnzkPei3A0qD2RtwEFjHkjVVSLk9ICER76tRRRo1t?= =?us-ascii?Q?8U9FP5fGDDuYNWZK2FvComExDINe4ngQ9zT/poDaTSMxhXCiEIgR2tCgn3N1?= =?us-ascii?Q?to4mx5RaUHXTCPWmkoSXCe7yk3+tae+L+J7/mEfohvHRed7P6mWHYn/0LWf2?= =?us-ascii?Q?3/cRZzc0u1w2OUW2ylckUVlM3cTOgIO4P+kHYoSteAExfpkhcXCAh/YeGMSk?= =?us-ascii?Q?/eUSGZ8axd8cUzGtebVY50RplF3rzlSSrYondYgeo4+ZEuDbdjiZ9EwllmAM?= =?us-ascii?Q?uj7eIqF8KKPQwk/cv77eAN9zKYcJ88vSPMiGnQYDFKef4lI8hWI/dBRR2oeL?= =?us-ascii?Q?125VX6cYkGCFdA51aUQ5MMBRfiYugWAF6F0ybxHeNv3EK16DFsYCEdtcRoJE?= =?us-ascii?Q?u45bmNwXbtYoXvbexYeQSMjq3HL2bhVPGk/0wgkuA5+FSBfSAjL88r+eBYfY?= =?us-ascii?Q?TKMJD3WJtOWSvahMZhJtmhB4cTLlGalhanbJlPukZZZDjqqkNL/arbO8qGkq?= =?us-ascii?Q?MUZvUx6Wt2Xl6/otl7lN2JRVhMVl/VvDO7omaG7A/IwGoKhiWWJYFHcruXZD?= =?us-ascii?Q?eetsT0r23pDkjKggbS+dKrYPS91Q5aYEJgslJ3C8Gi5c1vBbo1rsRSAWB2Te?= =?us-ascii?Q?DTkkqppJc9B7kEmLENJJzPCWYNwAO60FZ0IACJII7PZdGNmgoG5cHyR/EfIs?= =?us-ascii?Q?HTLvUPy/nxmkTnUxq1A380mfeCvRnHm9BvuIaGKUMqFUi/3DIiSkuYzyapw3?= =?us-ascii?Q?aeVFxll8=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1306; 5:YT1J5mWwqjwqmzgmBeu0P+oL8tTpGC+INqszWy16/gXxdHFvtX9Cdk+84CQd93JVO7+I4d+KegQIu4+8/HHEugxAQeEjJdESg/L4z3by8GKDloLbWlsULkvrLsnUbmgHIoz8ShnBUyfP5dBGq0Bepg==; 24:smlpMlC0yLdO0ZiaOn7uOqndaW/saH2SCCpDWR58Jcsvf4fujf1dcN+Cc3dBF+KdfMOT3gnHgEmTQEabMU96FUMUQPRfmT4ThCA8LL3l5hw=; 20:x4+utQ1SJ7oefAi7UyqwuAi6PT8mnA3cmaLa0/pdRDh0FwuDivXKNKN3fYBiMIoqhsro0Ebia/5xrS9VMfiVDg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2015 21:51:05.2031 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1306 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20151021_145129_264347_9419F388 X-CRM114-Status: GOOD ( 23.10 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [157.56.110.135 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [157.56.110.135 listed in wl.mailspike.net] -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] 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: fabio.estevam@freescale.com, boris.brezillon@free-electrons.com, vinod.koul@intel.com, linux-kernel@vger.kernel.org, b45815@freescale.com, linux-mtd@lists.infradead.org, hofrat@osadl.org, dmaengine@vger.kernel.org, dan.j.williams@intel.com, computersforpeace@gmail.com, dwmw2@infradead.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 | 24 +++++++++++++++++++++++- drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 5 ++++- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/nand/gpmi-nand/bch-regs.h b/drivers/mtd/nand/gpmi-nand/bch-regs.h index 53e58bc..a84d72b 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 1f26a79..0548d84 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 d161569..e038258 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c @@ -71,6 +71,12 @@ static const struct gpmi_devdata gpmi_devdata_imx6q = { .max_chain_delay = 12, }; +static const struct gpmi_devdata gpmi_devdata_imx6qp = { + .type = IS_MX6QP, + .bch_max_ecc_strength = 40, + .max_chain_delay = 12, +}; + static const struct gpmi_devdata gpmi_devdata_imx6sx = { .type = IS_MX6SX, .bch_max_ecc_strength = 62, @@ -1010,6 +1016,7 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, { struct gpmi_nand_data *this = chip->priv; 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; @@ -1018,6 +1025,7 @@ 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 flag = 0; dev_dbg(this->dev, "page number is : %d\n", page); ret = read_page_prepare(this, buf, nfc_geo->payload_size, @@ -1050,9 +1058,16 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, status = auxiliary_virt + nfc_geo->auxiliary_status_offset; 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)) + if (readl(bch_regs + HW_BCH_DEBUG1)) + flag = 1; + continue; + } + if (*status == STATUS_UNCORRECTABLE) { mtd->ecc_stats.failed++; continue; @@ -1081,6 +1096,10 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, nfc_geo->payload_size, payload_virt, payload_phys); + /* if bitflip occurred in erased page, change data to all 0xff */ + if (flag) + memset(buf, 0xff, nfc_geo->payload_size); + return max_bitflips; } @@ -1991,6 +2010,9 @@ static const struct of_device_id gpmi_nand_id_table[] = { .compatible = "fsl,imx6q-gpmi-nand", .data = &gpmi_devdata_imx6q, }, { + .compatible = "fsl,imx6qp-gpmi-nand", + .data = (void *)&gpmi_devdata_imx6qp, + }, { .compatible = "fsl,imx6sx-gpmi-nand", .data = &gpmi_devdata_imx6sx, }, { diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h index 58b3d69..149a442 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h @@ -123,6 +123,7 @@ enum gpmi_type { IS_MX23, IS_MX28, IS_MX6Q, + IS_MX6QP, IS_MX6SX, IS_MX7D, }; @@ -306,9 +307,11 @@ void gpmi_copy_bits(u8 *dst, size_t dst_bit_off, #define GPMI_IS_MX23(x) ((x)->devdata->type == IS_MX23) #define GPMI_IS_MX28(x) ((x)->devdata->type == IS_MX28) #define GPMI_IS_MX6Q(x) ((x)->devdata->type == IS_MX6Q) +#define GPMI_IS_MX6QP(x) ((x)->devdata->type == IS_MX6QP) #define GPMI_IS_MX6SX(x) ((x)->devdata->type == IS_MX6SX) #define GPMI_IS_MX7D(x) ((x)->devdata->type == IS_MX7D) -#define GPMI_IS_MX6(x) (GPMI_IS_MX6Q(x) || GPMI_IS_MX6SX(x)) +#define GPMI_IS_MX6(x) (GPMI_IS_MX6Q(x) || GPMI_IS_MX6QP(x)\ + || GPMI_IS_MX6SX(x)) #define GPMI_IS_MX7(x) (GPMI_IS_MX7D(x)) #endif