From patchwork Thu Jun 29 07:16:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Sahu X-Patchwork-Id: 782087 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wyry96rt7z9s0Z for ; Thu, 29 Jun 2017 17:34:09 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="DF6vJTeQ"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=infradead.org header.i=@infradead.org header.b="CMEGP9yy"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=codeaurora.org header.i=@codeaurora.org header.b="WTADwDdq"; dkim=neutral (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="CzE4xqLU"; dkim-atps=neutral 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=FBmCKejDJrmNvbljiDSHW1smuzEA/e4/dUjEdscwB3o=; b=DF6vJTeQCfozyP33Pyqm4u7dAZ hDhGZDawSTidhzqj+Q25c78CCyYs1VP3fN92eKszZDRn7FtgPJpxziLSmhBPjAP6IL0EqJ/tDTJpO DNKF0RZP8LddcXrNfB45eyjWGvscLZtOoAM562MsU9F4gLkChRRILuadEN3bnUirT4LpI0jsy5owX hxq6fpGpdGJsYi0Ke+esPVLYmx38RTwuLVPUszhHQ4HfSM3QsQFb3p5Imk1aZLskTBXbbSj9NECOe CUdMRaDMrE/vy51s9jZqkLehMC14gTOsGgNpwB9EHDJiCDm8yCZsJoaiVlWEjFManFnTg2bCOcrA4 gAuLptsw==; 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 1dQTxg-000809-8s; Thu, 29 Jun 2017 07:34:00 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dQTxd-0007pD-WE for linux-mtd@bombadil.infradead.org; Thu, 29 Jun 2017 07:33:58 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=Bo9rcDmPpnjlTXT337zu1f+Wun1YQgbFkL+k1P2lcMY=; b=CMEGP9yyRw7O4vH0ZF0kRfXeK i/lsnLGADa/z/2CZ+TcKHKpyQMblajjtLX1EMqq7wTUQy85oDD5CM0rB1UDH8J3YlRKvyAqjk5wAA OQvErSbSgggUyuZrdyfaK44o6ixKc2QB7Rt15KqBIHNWfHZ3nDYG8aaWF28wweN6BJNrDgUaNKQOL tAc0nRCf936YkKdXsCOF6miG9cacksgUiYQ4rAYi5Gas8nYWinTYCxjtPIIqBD6bQZ2xRxJH4pnp7 BUeJ/wKa3h4Go5FC6+0XivV7LOT2w/eko7XJDFpRZwXi0NURIWnrRa5TgglEhIg6S5hfbksj1fHIU GmeUDBQ3w==; Received: from smtp.codeaurora.org ([198.145.29.96]) by casper.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dQThu-0005RM-46 for linux-mtd@lists.infradead.org; Thu, 29 Jun 2017 07:17:48 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 7AB8960FEB; Thu, 29 Jun 2017 07:17:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1498720642; bh=4t1OWEL0k4segdfjhiZM4t2vGII5b0zh4lFoLZvd1d8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WTADwDdq3LDYhl71EZGt79iYSPgDvLaUbEt3CWYAe7rqZiMAZ5Kkar9Ouid9x6B+y 1rH1t9Y8jQd+OYuMqNKnaQkHmCUeCZ49hNmlMCOFj2KiSduyAbUEh0mPiCRR6CnGYp 1iLk/VId2mP2dpiP3Az8oXbCYY73xWD0b3cC2gwg= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from absahu-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: absahu@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 87E7260ACF; Thu, 29 Jun 2017 07:17:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1498720641; bh=4t1OWEL0k4segdfjhiZM4t2vGII5b0zh4lFoLZvd1d8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CzE4xqLU8UrZ9OXpblKp8ORoYJdg9iZaaUEExQRa+9Nf+BYj7oGR1SWwxB1jE/je1 wxRqh5mp0sLAtFAMXrEJwNGKPvM3PXfCxjnKLYko/Rc9jt/8enfNEjm21FnJA2NHQp +pH9sMj2pGLKkrjb9mQLud0wzCgJOXM6FaJ8hZOs= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 87E7260ACF Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=absahu@codeaurora.org From: Abhishek Sahu To: dwmw2@infradead.org, computersforpeace@gmail.com, boris.brezillon@free-electrons.com, marek.vasut@gmail.com, richard@nod.at, cyrille.pitchen@wedev4u.fr, robh+dt@kernel.org, mark.rutland@arm.com Subject: [PATCH 11/14] qcom: mtd: nand: BAM raw read and write support Date: Thu, 29 Jun 2017 12:46:03 +0530 Message-Id: <1498720566-20782-12-git-send-email-absahu@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1498720566-20782-1-git-send-email-absahu@codeaurora.org> References: <1498720566-20782-1-git-send-email-absahu@codeaurora.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170629_081742_509883_5EA19A0B X-CRM114-Status: GOOD ( 18.87 ) X-Spam-Score: -2.0 (--) X-Spam-Report: SpamAssassin version 3.4.1 on casper.infradead.org summary: Content analysis details: (-2.0 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [198.145.29.96 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -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 -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 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: devicetree@vger.kernel.org, architt@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Abhishek Sahu , linux-mtd@lists.infradead.org, andy.gross@linaro.org, sricharan@codeaurora.org MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org 1. BAM uses READ_LOCATION registers to copy data from offset into data buffer. 2. BAM requires EOT flag should be set only for the last data write in a codeword. Signed-off-by: Abhishek Sahu --- drivers/mtd/nand/qcom_nandc.c | 46 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/drivers/mtd/nand/qcom_nandc.c b/drivers/mtd/nand/qcom_nandc.c index 4c6e594..6d749b6 100644 --- a/drivers/mtd/nand/qcom_nandc.c +++ b/drivers/mtd/nand/qcom_nandc.c @@ -1033,7 +1033,7 @@ static void config_bam_page_read(struct qcom_nand_controller *nandc) */ static void config_bam_cw_read(struct qcom_nand_controller *nandc) { - write_reg_dma(nandc, NAND_READ_LOCATION_0, 2, 0); + write_reg_dma(nandc, NAND_READ_LOCATION_0, 4, 0); write_reg_dma(nandc, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL); write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL); @@ -1734,6 +1734,7 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd, u8 *data_buf, *oob_buf; struct nand_ecc_ctrl *ecc = &chip->ecc; int i, ret; + int read_location; data_buf = buf; oob_buf = chip->oob_poi; @@ -1743,6 +1744,9 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd, clear_bam_transaction(nandc); update_rw_regs(host, ecc->steps, true); + if (nandc->dma_bam_enabled) + config_bam_page_read(nandc); + for (i = 0; i < ecc->steps; i++) { int data_size1, data_size2, oob_size1, oob_size2; int reg_off = FLASH_BUF_ACC; @@ -1760,7 +1764,35 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd, oob_size2 = host->ecc_bytes_hw + host->spare_bytes; } - config_cw_read(nandc); + if (nandc->dma_bam_enabled) { + read_location = 0; + nandc_set_reg(nandc, NAND_READ_LOCATION_0, + (read_location << READ_LOCATION_OFFSET) | + (data_size1 << READ_LOCATION_SIZE) | + (0 << READ_LOCATION_LAST)); + read_location += data_size1; + + nandc_set_reg(nandc, NAND_READ_LOCATION_1, + (read_location << READ_LOCATION_OFFSET) | + (oob_size1 << READ_LOCATION_SIZE) | + (0 << READ_LOCATION_LAST)); + read_location += oob_size1; + + nandc_set_reg(nandc, NAND_READ_LOCATION_2, + (read_location << READ_LOCATION_OFFSET) | + (data_size2 << READ_LOCATION_SIZE) | + (0 << READ_LOCATION_LAST)); + read_location += data_size2; + + nandc_set_reg(nandc, NAND_READ_LOCATION_3, + (read_location << READ_LOCATION_OFFSET) | + (oob_size2 << READ_LOCATION_SIZE) | + (1 << READ_LOCATION_LAST)); + + config_bam_cw_read(nandc); + } else { + config_cw_read(nandc); + } read_data_dma(nandc, reg_off, data_buf, data_size1, 0); reg_off += data_size1; @@ -1914,15 +1946,18 @@ static int qcom_nandc_write_page_raw(struct mtd_info *mtd, config_cw_write_pre(nandc); - write_data_dma(nandc, reg_off, data_buf, data_size1, 0); + write_data_dma(nandc, reg_off, data_buf, data_size1, + NAND_BAM_NO_EOT); reg_off += data_size1; data_buf += data_size1; - write_data_dma(nandc, reg_off, oob_buf, oob_size1, 0); + write_data_dma(nandc, reg_off, oob_buf, oob_size1, + NAND_BAM_NO_EOT); reg_off += oob_size1; oob_buf += oob_size1; - write_data_dma(nandc, reg_off, data_buf, data_size2, 0); + write_data_dma(nandc, reg_off, data_buf, data_size2, + NAND_BAM_NO_EOT); reg_off += data_size2; data_buf += data_size2; @@ -1968,6 +2003,7 @@ static int qcom_nandc_write_oob(struct mtd_info *mtd, struct nand_chip *chip, return ret; clear_read_regs(nandc); + clear_bam_transaction(nandc); /* calculate the data and oob size for the last codeword/step */ data_size = ecc->size - ((ecc->steps - 1) << 2);