From patchwork Tue Mar 25 08:19:56 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 26994 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-oa0-f70.google.com (mail-oa0-f70.google.com [209.85.219.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 7CE2C20062 for ; Tue, 25 Mar 2014 08:30:45 +0000 (UTC) Received: by mail-oa0-f70.google.com with SMTP id n16sf547724oag.1 for ; Tue, 25 Mar 2014 01:30:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:subject:date:message-id :in-reply-to:references:cc:precedence:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:mime-version:sender :errors-to:x-original-sender:x-original-authentication-results :mailing-list:content-type:content-transfer-encoding; bh=3spKxvFXHVExioWJW3ZgyNFHCsyqBYyfUDXVW0OlY+U=; b=hbFmtjRYe1iuQAhowEOtnc+4Xi7Ku3L6t+wFCFgvbU6m/7n3hagiJVZOavl4bKlfVS QxtACVDMbC2qbJMoQXP1aluRLBu7y5fe34aphsO0nu5tNYZgYJqJcrHUuoBoFIXT+1f5 36UVKoVBKffKzJrEhtF53PEwSwOhaz3MvEqVin9OqPG9cdvN3WXMuEZt+MmdJTavZIxV Pg+ijGMCs7kz3wQrmWBr/hUvIFIlcuKWL1u7ROTLc2N3ulsUvq9Lt3N3KFf10SBTRQlm z+mFPtD0YPf0hb/f3Ny6QiyCbpOS4LamV/RuJ4VkGHNMoowsdo4lEvw6ovz+1qg+YQgG PLNg== X-Gm-Message-State: ALoCoQnQEleOqVxT5/c/9pAVwM6hIWVtb+9RLY8XzG2UQs7t8d53ol1t+NDOuDkIh1d4hhczAmKX X-Received: by 10.182.16.65 with SMTP id e1mr4743223obd.48.1395736245093; Tue, 25 Mar 2014 01:30:45 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.98.169 with SMTP id o38ls174382qge.37.gmail; Tue, 25 Mar 2014 01:30:44 -0700 (PDT) X-Received: by 10.220.106.84 with SMTP id w20mr54510890vco.18.1395736244956; Tue, 25 Mar 2014 01:30:44 -0700 (PDT) Received: from mail-vc0-f178.google.com (mail-vc0-f178.google.com [209.85.220.178]) by mx.google.com with ESMTPS id fn10si3672662vdc.99.2014.03.25.01.30.44 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 25 Mar 2014 01:30:44 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.178 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.178; Received: by mail-vc0-f178.google.com with SMTP id im17so137984vcb.37 for ; Tue, 25 Mar 2014 01:30:44 -0700 (PDT) X-Received: by 10.221.4.66 with SMTP id ob2mr72574vcb.28.1395736244871; Tue, 25 Mar 2014 01:30:44 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.78.9 with SMTP id i9csp285797vck; Tue, 25 Mar 2014 01:30:43 -0700 (PDT) X-Received: by 10.180.109.231 with SMTP id hv7mr21698145wib.38.1395736242845; Tue, 25 Mar 2014 01:30:42 -0700 (PDT) Received: from casper.infradead.org (casper.infradead.org. [2001:770:15f::2]) by mx.google.com with ESMTPS id de3si11661061wib.7.2014.03.25.01.30.42 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Mar 2014 01:30:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-arm-kernel-bounces+patch=linaro.org@lists.infradead.org designates 2001:770:15f::2 as permitted sender) client-ip=2001:770:15f::2; Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMfm-0001r4-En; Tue, 25 Mar 2014 08:25:28 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMeX-0002Zg-UM; Tue, 25 Mar 2014 08:24:09 +0000 Received: from mail-wg0-x22f.google.com ([2a00:1450:400c:c00::22f]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMcN-0002GH-Mi for linux-arm-kernel@lists.infradead.org; Tue, 25 Mar 2014 08:22:01 +0000 Received: by mail-wg0-f47.google.com with SMTP id x12so78920wgg.30 for ; Tue, 25 Mar 2014 01:21:32 -0700 (PDT) X-Received: by 10.180.87.162 with SMTP id az2mr20073400wib.23.1395735692562; Tue, 25 Mar 2014 01:21:32 -0700 (PDT) Received: from lee--X1.home (host109-148-113-193.range109-148.btcentralplus.com. [109.148.113.193]) by mx.google.com with ESMTPSA id k4sm5567676wib.19.2014.03.25.01.21.30 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 25 Mar 2014 01:21:31 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [RFC 39/47] mtd: nand: stm_nand_bch: read and write ops (FLEX) Date: Tue, 25 Mar 2014 08:19:56 +0000 Message-Id: <1395735604-26706-40-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1395735604-26706-1-git-send-email-lee.jones@linaro.org> References: <1395735604-26706-1-git-send-email-lee.jones@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140325_042156_098232_C9ABE2DF X-CRM114-Status: GOOD ( 14.27 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: angus.clark@st.com, kernel@stlinux.com, lee.jones@linaro.org, linux-mtd@lists.infradead.org, pekon@ti.com, computersforpeace@gmail.com, dwmw2@infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patch=linaro.org@lists.infradead.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: lee.jones@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.178 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 Helper functions for mtd_write_oob() and mtd_write_oob(). Handles multi-page transfers and mapping between BCH sectors and MTD page+OOB data. Signed-off-by: Lee Jones --- drivers/mtd/nand/stm_nand_bch.c | 136 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/drivers/mtd/nand/stm_nand_bch.c b/drivers/mtd/nand/stm_nand_bch.c index 18601e5..75c5c9b 100644 --- a/drivers/mtd/nand/stm_nand_bch.c +++ b/drivers/mtd/nand/stm_nand_bch.c @@ -1082,6 +1082,142 @@ static int bch_load_bbt(struct nandi_controller *nandi, return 0; } +/* + * Helper function for mtd_read_oob(): handles multi-page transfers + * and mapping between BCH sectors and MTD page+OOB data. + */ +static int flex_do_read_ops(struct nandi_controller *nandi, + loff_t from, + struct mtd_oob_ops *ops) +{ + struct mtd_info *mtd = &nandi->info.mtd; + uint32_t page_addr = from >> nandi->page_shift; + uint32_t oob_remainder; + uint8_t *oobbuf = ops->oobbuf; + uint8_t *datbuf = ops->datbuf; + uint8_t *page_buf; + int ecc_size; + int pages; + int s; + + ecc_size = bch_ecc_sizes[nandi->bch_ecc_mode]; + nandi->cached_page = -1; + + pages = ops->datbuf ? + (ops->len >> nandi->page_shift) : + (ops->ooblen / mtd->oobsize); + + oob_remainder = mtd->oobsize - (nandi->sectors_per_page * ecc_size); + + while (pages) { + page_buf = nandi->page_buf; + + flex_read_raw(nandi, page_addr, 0, page_buf, + mtd->writesize + mtd->oobsize); + + for (s = 0; s < nandi->sectors_per_page; s++) { + if (datbuf) { + memcpy(datbuf, page_buf, NANDI_BCH_SECTOR_SIZE); + datbuf += NANDI_BCH_SECTOR_SIZE; + ops->retlen += NANDI_BCH_SECTOR_SIZE; + } + page_buf += NANDI_BCH_SECTOR_SIZE; + + if (oobbuf) { + memcpy(oobbuf, page_buf, ecc_size); + ops->oobretlen += ecc_size; + oobbuf += ecc_size; + } + page_buf += ecc_size; + } + + if (oob_remainder && oobbuf) { + memcpy(oobbuf, page_buf, oob_remainder); + oobbuf += oob_remainder; + ops->oobretlen += oob_remainder; + } + + page_addr++; + pages--; + } + + return 0; +} + +/* + * Helper function for mtd_write_oob(): handles multi-page transfers + * and mapping between BCH sectors and MTD page+OOB data. +*/ +static int flex_do_write_ops(struct nandi_controller *nandi, + loff_t to, + struct mtd_oob_ops *ops) +{ + struct mtd_info *mtd = &nandi->info.mtd; + uint32_t page_addr = to >> nandi->page_shift; + uint32_t oob_remainder; + uint8_t *oobbuf = ops->oobbuf; + uint8_t *datbuf = ops->datbuf; + uint8_t *page_buf; + uint8_t status; + int ecc_size; + int pages; + int s; + + ecc_size = bch_ecc_sizes[nandi->bch_ecc_mode]; + nandi->cached_page = -1; + + pages = ops->datbuf ? + (ops->len >> nandi->page_shift) : + (ops->ooblen / mtd->oobsize); + + oob_remainder = mtd->oobsize - (nandi->sectors_per_page * ecc_size); + + while (pages) { + page_buf = nandi->page_buf; + + for (s = 0; s < nandi->sectors_per_page; s++) { + if (datbuf) { + memcpy(page_buf, datbuf, NANDI_BCH_SECTOR_SIZE); + datbuf += NANDI_BCH_SECTOR_SIZE; + ops->retlen += NANDI_BCH_SECTOR_SIZE; + } else { + memset(page_buf, 0xff, NANDI_BCH_SECTOR_SIZE); + } + page_buf += NANDI_BCH_SECTOR_SIZE; + + if (oobbuf) { + memcpy(page_buf, oobbuf, ecc_size); + oobbuf += ecc_size; + ops->oobretlen += ecc_size; + } else { + memset(page_buf, 0xff, ecc_size); + } + page_buf += ecc_size; + } + + if (oob_remainder) { + if (oobbuf) { + memcpy(page_buf, oobbuf, oob_remainder); + oobbuf += oob_remainder; + ops->oobretlen += oob_remainder; + } else { + memset(page_buf, 0xff, oob_remainder); + } + } + + status = flex_write_raw(nandi, page_addr, 0, nandi->page_buf, + mtd->writesize + mtd->oobsize); + + if (status & NAND_STATUS_FAIL) + return -EIO; + + page_addr++; + pages--; + } + + return 0; +} + static void nandi_dump_bad_blocks(struct nandi_controller *nandi) { int bad_count = 0;