From patchwork Thu Apr 26 15:41:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905157 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="rwaxJ1DI"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="Qn4/2Cje"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1ZC4cxXz9ryr for ; Fri, 27 Apr 2018 01:43:47 +1000 (AEST) 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=G9BnG1rv0vo2IIL6EczjefDfucjr2s3TReHEa6YRZD8=; b=rwaxJ1DIFJCAjgBMP6YN7BMbxn VQQuq/Aun7muHLdH65SW3EgOIcHQSJlLSUzJ1hQqSDduo+JuarcuJljYWFyfWD4CERJ2QRYWuPXx4 oaG36Q4kKSP4soVmqarTiCq2Fs1tcU++pCJcOjHGgX3jMSbxzf+cZckjSbyXlqHhK7B/oGSXBgBYB ivczslWxC/ks8Qg0YmYKut45hiEse+sSAvrAahY7p7vMzgBLkruJcARnFQF5VGkoTrwUASZmvrkso NYvs5x46QS0DDy9GwZPKPiaQMEF94V9o3K0iS49WiKGukNk+djmmsizaaRxMy7Ku3T8gcJTgWhkO3 vPYVGlTg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj3U-0006H6-HJ; Thu, 26 Apr 2018 15:43:32 +0000 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj26-0005h6-CN for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:12 +0000 Received: by mail-wm0-x244.google.com with SMTP id n10so14102011wmc.1 for ; Thu, 26 Apr 2018 08:41:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Q3DkjsnwIgL+vb/BRhinZJHXjSCO0qjOVcdWv0riBsU=; b=Qn4/2Cje6enFZvGlrZzT7d04vofAgMP20bjPWkYTDk38EZniJug5N3Btz7E7L/3Tg8 rwWBAcbda3wmSxvgPYhI+GgEEnuMBRYcbMSzXLRl+J5m1sFoU+sS5K0L8vCqlg1Ic9xx uWr+kYrE+jq2NrpDRPCu8E4U0rMKC1QILBy6CfMggTGoyBtVDywYQsfS3qNhnqBddKnS atZDOWlQaUEjpgRU21YycgN92ppShWRSlMAtxdDtga6EZBxFQiJ69Bvhgkf6dkjAl4w9 hQGXbTXsN03dQrfbby92Fu092vHC3SGbsqUQJcfo2q5BIf+0+DBsMCS+qrn6WOf2tEpX jYiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Q3DkjsnwIgL+vb/BRhinZJHXjSCO0qjOVcdWv0riBsU=; b=gaSFZDglCvZOyYIpTK0Y0HKgpAFvI2TGa6UkvD+a9yUIdRR9rnwzeeD3GHc1odkNMh 0bT8X2wTdpeOYo9Hl7kmo+e9b3qnNaPuRZQfJqhDy3r7B+UKPnS+FkWiE/8MmBtBkS0y f8pVTZ9gimUH1xQ/vkoQxJyZ8BDyOgzRLgi48J+lsMDnv/N6ES+SUdcwMDkKQn7mC+5R teOdXmabRcMp9rQQdZHHduFCKD05NJLMGFhZNwyWPQt3vReVmWCDIMlxUlTBOzcnhz95 vOUVTYqgbxUTah94pjxMQmBAp8GGBZ/BWnCzJOX8892y5Q64wkGFzehPtbqLaTuQwldo yzaQ== X-Gm-Message-State: ALQs6tBsJLTEqUjslME7peAh72e5XyI6fpknDWJCQNwalrF8bueVBQo1 JZ4RgWeJdjP4Xesb3vZudjdfsjm9 X-Google-Smtp-Source: AIpwx4/0siakXyuXIJyWY8XfWB2ZsL0fgoCCzKwyw3TzWlMOIBXivUjs/559GmK5jO0PuR2stRkysQ== X-Received: by 10.28.227.132 with SMTP id a126mr18662232wmh.93.1524757314187; Thu, 26 Apr 2018 08:41:54 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.41.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:41:53 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 01/13] mtd: nand: gpmi: drop dma_ops_type Date: Thu, 26 Apr 2018 17:41:22 +0200 Message-Id: <20180426154134.8270-2-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084206_418554_D7150136 X-CRM114-Status: GOOD ( 16.31 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c09:0:0:0:244 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sascha Hauer , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sascha Hauer The GPMI nand driver puts dma_ops_type in its private data struct. Based on the ops type the DMA callback handler unmaps previously mapped buffers. Instead of unmapping the buffers in the DMA callback handler, do this in the caller directly which waits for the DMA transfer to finish. This makes the whole dma_ops_type mechanism unnecessary. Signed-off-by: Sascha Hauer Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- v2: also unmap the cmd_sgl, don't unmap in gpmi_read_page() (it's done in the bch interrupt handler). Sascha, in the future better test with CONFIG_DMA_API_DEBUG :-) --- drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 36 +++++++++++++++++------------- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 31 ++----------------------- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h | 11 --------- 3 files changed, 23 insertions(+), 55 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index e94556705dc7..d479358758a0 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -544,19 +544,13 @@ int gpmi_is_ready(struct gpmi_nand_data *this, unsigned chip) return reg & mask; } -static inline void set_dma_type(struct gpmi_nand_data *this, - enum dma_ops_type type) -{ - this->last_dma_type = this->dma_type; - this->dma_type = type; -} - int gpmi_send_command(struct gpmi_nand_data *this) { struct dma_chan *channel = get_dma_chan(this); struct dma_async_tx_descriptor *desc; struct scatterlist *sgl; int chip = this->current_chip; + int ret; u32 pio[3]; /* [1] send out the PIO words */ @@ -586,8 +580,11 @@ int gpmi_send_command(struct gpmi_nand_data *this) return -EINVAL; /* [3] submit the DMA */ - set_dma_type(this, DMA_FOR_COMMAND); - return start_dma_without_bch_irq(this, desc); + ret = start_dma_without_bch_irq(this, desc); + + dma_unmap_sg(this->dev, sgl, 1, DMA_TO_DEVICE); + + return ret; } int gpmi_send_data(struct gpmi_nand_data *this) @@ -595,6 +592,7 @@ int gpmi_send_data(struct gpmi_nand_data *this) struct dma_async_tx_descriptor *desc; struct dma_chan *channel = get_dma_chan(this); int chip = this->current_chip; + int ret; uint32_t command_mode; uint32_t address; u32 pio[2]; @@ -624,8 +622,11 @@ int gpmi_send_data(struct gpmi_nand_data *this) return -EINVAL; /* [3] submit the DMA */ - set_dma_type(this, DMA_FOR_WRITE_DATA); - return start_dma_without_bch_irq(this, desc); + ret = start_dma_without_bch_irq(this, desc); + + dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_TO_DEVICE); + + return ret; } int gpmi_read_data(struct gpmi_nand_data *this) @@ -633,6 +634,7 @@ int gpmi_read_data(struct gpmi_nand_data *this) struct dma_async_tx_descriptor *desc; struct dma_chan *channel = get_dma_chan(this); int chip = this->current_chip; + int ret; u32 pio[2]; /* [1] : send PIO */ @@ -658,8 +660,14 @@ int gpmi_read_data(struct gpmi_nand_data *this) return -EINVAL; /* [3] : submit the DMA */ - set_dma_type(this, DMA_FOR_READ_DATA); - return start_dma_without_bch_irq(this, desc); + + ret = start_dma_without_bch_irq(this, desc); + + dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_FROM_DEVICE); + if (this->direct_dma_map_ok == false) + memcpy(this->upper_buf, this->data_buffer_dma, this->upper_len); + + return ret; } int gpmi_send_page(struct gpmi_nand_data *this, @@ -703,7 +711,6 @@ int gpmi_send_page(struct gpmi_nand_data *this, if (!desc) return -EINVAL; - set_dma_type(this, DMA_FOR_WRITE_ECC_PAGE); return start_dma_with_bch_irq(this, desc); } @@ -785,7 +792,6 @@ int gpmi_read_page(struct gpmi_nand_data *this, return -EINVAL; /* [4] submit the DMA */ - set_dma_type(this, DMA_FOR_READ_ECC_PAGE); return start_dma_with_bch_irq(this, desc); } diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index c2597c8107a0..864fda1901a6 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -472,31 +472,6 @@ static void dma_irq_callback(void *param) struct gpmi_nand_data *this = param; struct completion *dma_c = &this->dma_done; - switch (this->dma_type) { - case DMA_FOR_COMMAND: - dma_unmap_sg(this->dev, &this->cmd_sgl, 1, DMA_TO_DEVICE); - break; - - case DMA_FOR_READ_DATA: - dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_FROM_DEVICE); - if (this->direct_dma_map_ok == false) - memcpy(this->upper_buf, this->data_buffer_dma, - this->upper_len); - break; - - case DMA_FOR_WRITE_DATA: - dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_TO_DEVICE); - break; - - case DMA_FOR_READ_ECC_PAGE: - case DMA_FOR_WRITE_ECC_PAGE: - /* We have to wait the BCH interrupt to finish. */ - break; - - default: - dev_err(this->dev, "in wrong DMA operation.\n"); - } - complete(dma_c); } @@ -516,8 +491,7 @@ int start_dma_without_bch_irq(struct gpmi_nand_data *this, /* Wait for the interrupt from the DMA block. */ timeout = wait_for_completion_timeout(dma_c, msecs_to_jiffies(1000)); if (!timeout) { - dev_err(this->dev, "DMA timeout, last DMA :%d\n", - this->last_dma_type); + dev_err(this->dev, "DMA timeout, last DMA\n"); gpmi_dump_info(this); return -ETIMEDOUT; } @@ -546,8 +520,7 @@ int start_dma_with_bch_irq(struct gpmi_nand_data *this, /* Wait for the interrupt from the BCH block. */ timeout = wait_for_completion_timeout(bch_c, msecs_to_jiffies(1000)); if (!timeout) { - dev_err(this->dev, "BCH timeout, last DMA :%d\n", - this->last_dma_type); + dev_err(this->dev, "BCH timeout\n"); gpmi_dump_info(this); return -ETIMEDOUT; } diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h index 62fde59b995f..2397010a8963 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h @@ -77,15 +77,6 @@ struct boot_rom_geometry { unsigned int search_area_stride_exponent; }; -/* DMA operations types */ -enum dma_ops_type { - DMA_FOR_COMMAND = 1, - DMA_FOR_READ_DATA, - DMA_FOR_WRITE_DATA, - DMA_FOR_READ_ECC_PAGE, - DMA_FOR_WRITE_ECC_PAGE -}; - enum gpmi_type { IS_MX23, IS_MX28, @@ -178,8 +169,6 @@ struct gpmi_nand_data { /* DMA channels */ #define DMA_CHANS 8 struct dma_chan *dma_chans[DMA_CHANS]; - enum dma_ops_type last_dma_type; - enum dma_ops_type dma_type; struct completion dma_done; /* private */ From patchwork Thu Apr 26 15:41:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905156 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="gRmJG5yf"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="W3H9Ssu3"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1YJ2zc4z9s08 for ; Fri, 27 Apr 2018 01:43:00 +1000 (AEST) 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=GnsBZIXZCK88y3IssRASOtXPVmE/KzTiP/q0jxcYWkQ=; b=gRmJG5yf4olMz04gFY6WQagHZF B0iw1E04dWuCFBR2D4WoYR2OX3nJUwWEFNzJGra/iEUKnfjcBuT1j3bvB0nRthZhVzYbEHua2PzsM WldvipOdPdbI2BXF699D6Dgj3a6+YmDCLcyOykJJtvKiBgtcHerXnUy8fppQN0ORghuvPV1IRWJEk Klfa4RAhnDH09DcRLgXFIoBxFo/MgB3JQrTJdrr5kjdrcbFo1zyJMkAQwaHcQntaRbwgZDERE/hdd 4PV3FDsOeBaySfCEtutsRz465dnZezplCUuI+RpMZfoZO/7oNYDZr3C3eK/Cn4s1ffQO1s80ONHKq q12bY59w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2o-0005zy-PV; Thu, 26 Apr 2018 15:42:50 +0000 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj28-0005hR-5m for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:09 +0000 Received: by mail-wr0-x243.google.com with SMTP id h3-v6so57285408wrh.5 for ; Thu, 26 Apr 2018 08:41:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=g7sPWEjpQ3DevmWDCLJfCqFlRb9cdi6dNB4Ei3ZzIYU=; b=W3H9Ssu3h4iLulOZ2c7cqzIo9nXZcqbxanAG1Fx5TQhwij10aDzESTkAU2dpb14sT9 EkTWfdWrqhPVh5cT/M3VId1k5ZrKqXlrpcCHL0TPxsXr4hvwYA2/HoDxGGWRC9qFitue JKOOEQOE+DDyh8ce+AtTYVwZKdS+btP6EoN+z/RGNssMt0n/beqa1JV/AZ1j3UOIuEfu LbftrVG9H4cNHwuExERly5icq277IN1lM1NeNDUN4kliyjfFelaeGwUUxcF/MdqulsTy 8khmSILhsYTSlAPVwUJOVJ7UQpjjyywCMHG45SQAWopmzZOp1tW/NNxzP/gFpVXYX2Ii ZBXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=g7sPWEjpQ3DevmWDCLJfCqFlRb9cdi6dNB4Ei3ZzIYU=; b=BEQWpzKOHmgscFxf18ibPEj7hbPCZ/gQDSmX4jHgRPKYGML2+bn2k4eASVEgEO2mLF WZ7aCYJlQxv0Arkh0ilMSaMPYLMmM3zJA+WK5s2gPEulV3SravRX5ogTigesDBeHszjV /B8fJ4WvAf9Fk4AAwZBZGTlqgW/MPaJqm0aRKKlZRLwmRRFtN5pyRxnM5vypj9vGwMzJ g2oahHsM14ovSlBqFCLf5B4pHzGtmZD9+/tKJttOBfVvF6ic6B0bQC1Y+QTgQSs5JB/I OyXnm3OOhXXz6cmFJYFnBCr1IaKv+OubXSfcKUmj4ricLAY03QLdrb2cRTwnQFJA/LWP rXIw== X-Gm-Message-State: ALQs6tDQY5N3I27o5p+5PdL+WlQE4phmzXSVLEtZ+W9qUL1zDgm2Sjm9 3h13zHwPBxUg5B0td3fhsAMdF7vf X-Google-Smtp-Source: AIpwx4+Y6hMfefXtsq6kUITIfC2+i024VpDegkZneDN/jgkoLvyBjb0L6nrQiH9E2I4dYW8I0b8T9g== X-Received: by 2002:adf:e0d2:: with SMTP id e18-v6mr29113708wri.2.1524757315960; Thu, 26 Apr 2018 08:41:55 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.41.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:41:55 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 02/13] mtd: nand: gpmi: pass buffer and len around Date: Thu, 26 Apr 2018 17:41:23 +0200 Message-Id: <20180426154134.8270-3-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084208_229108_D3446044 X-CRM114-Status: GOOD ( 17.48 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:243 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sascha Hauer , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sascha Hauer Instead of putting the buffer and len passed in from the mtd core into the private data struct, just pass it around in the GPMI drivers functions. This makes the lifetime of the variables more clear and the code easier to follow. Signed-off-by: Sascha Hauer Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- v2: rebased --- drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 14 +++++++------- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 20 ++++++++------------ drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h | 11 ++++------- 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index d479358758a0..447961b798b4 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -587,7 +587,7 @@ int gpmi_send_command(struct gpmi_nand_data *this) return ret; } -int gpmi_send_data(struct gpmi_nand_data *this) +int gpmi_send_data(struct gpmi_nand_data *this, const void *buf, int len) { struct dma_async_tx_descriptor *desc; struct dma_chan *channel = get_dma_chan(this); @@ -606,7 +606,7 @@ int gpmi_send_data(struct gpmi_nand_data *this) | BF_GPMI_CTRL0_CS(chip, this) | BF_GPMI_CTRL0_LOCK_CS(LOCK_CS_ENABLE, this) | BF_GPMI_CTRL0_ADDRESS(address) - | BF_GPMI_CTRL0_XFER_COUNT(this->upper_len); + | BF_GPMI_CTRL0_XFER_COUNT(len); pio[1] = 0; desc = dmaengine_prep_slave_sg(channel, (struct scatterlist *)pio, ARRAY_SIZE(pio), DMA_TRANS_NONE, 0); @@ -614,7 +614,7 @@ int gpmi_send_data(struct gpmi_nand_data *this) return -EINVAL; /* [2] send DMA request */ - prepare_data_dma(this, DMA_TO_DEVICE); + prepare_data_dma(this, buf, len, DMA_TO_DEVICE); desc = dmaengine_prep_slave_sg(channel, &this->data_sgl, 1, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); @@ -629,7 +629,7 @@ int gpmi_send_data(struct gpmi_nand_data *this) return ret; } -int gpmi_read_data(struct gpmi_nand_data *this) +int gpmi_read_data(struct gpmi_nand_data *this, void *buf, int len) { struct dma_async_tx_descriptor *desc; struct dma_chan *channel = get_dma_chan(this); @@ -643,7 +643,7 @@ int gpmi_read_data(struct gpmi_nand_data *this) | BF_GPMI_CTRL0_CS(chip, this) | BF_GPMI_CTRL0_LOCK_CS(LOCK_CS_ENABLE, this) | BF_GPMI_CTRL0_ADDRESS(BV_GPMI_CTRL0_ADDRESS__NAND_DATA) - | BF_GPMI_CTRL0_XFER_COUNT(this->upper_len); + | BF_GPMI_CTRL0_XFER_COUNT(len); pio[1] = 0; desc = dmaengine_prep_slave_sg(channel, (struct scatterlist *)pio, @@ -652,7 +652,7 @@ int gpmi_read_data(struct gpmi_nand_data *this) return -EINVAL; /* [2] : send DMA request */ - prepare_data_dma(this, DMA_FROM_DEVICE); + prepare_data_dma(this, buf, len, DMA_FROM_DEVICE); desc = dmaengine_prep_slave_sg(channel, &this->data_sgl, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); @@ -665,7 +665,7 @@ int gpmi_read_data(struct gpmi_nand_data *this) dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_FROM_DEVICE); if (this->direct_dma_map_ok == false) - memcpy(this->upper_buf, this->data_buffer_dma, this->upper_len); + memcpy(buf, this->data_buffer_dma, len); return ret; } diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 864fda1901a6..5fa9cd4fac4a 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -437,15 +437,15 @@ struct dma_chan *get_dma_chan(struct gpmi_nand_data *this) } /* Can we use the upper's buffer directly for DMA? */ -void prepare_data_dma(struct gpmi_nand_data *this, enum dma_data_direction dr) +void prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len, + enum dma_data_direction dr) { struct scatterlist *sgl = &this->data_sgl; int ret; /* first try to map the upper buffer directly */ - if (virt_addr_valid(this->upper_buf) && - !object_is_on_stack(this->upper_buf)) { - sg_init_one(sgl, this->upper_buf, this->upper_len); + if (virt_addr_valid(buf) && !object_is_on_stack(buf)) { + sg_init_one(sgl, buf, len); ret = dma_map_sg(this->dev, sgl, 1, dr); if (ret == 0) goto map_fail; @@ -456,10 +456,10 @@ void prepare_data_dma(struct gpmi_nand_data *this, enum dma_data_direction dr) map_fail: /* We have to use our own DMA buffer. */ - sg_init_one(sgl, this->data_buffer_dma, this->upper_len); + sg_init_one(sgl, this->data_buffer_dma, len); if (dr == DMA_TO_DEVICE) - memcpy(this->data_buffer_dma, this->upper_buf, this->upper_len); + memcpy(this->data_buffer_dma, buf, len); dma_map_sg(this->dev, sgl, 1, dr); @@ -919,10 +919,8 @@ static void gpmi_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) struct gpmi_nand_data *this = nand_get_controller_data(chip); dev_dbg(this->dev, "len is %d\n", len); - this->upper_buf = buf; - this->upper_len = len; - gpmi_read_data(this); + gpmi_read_data(this, buf, len); } static void gpmi_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) @@ -931,10 +929,8 @@ static void gpmi_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) struct gpmi_nand_data *this = nand_get_controller_data(chip); dev_dbg(this->dev, "len is %d\n", len); - this->upper_buf = (uint8_t *)buf; - this->upper_len = len; - gpmi_send_data(this); + gpmi_send_data(this, buf, len); } static uint8_t gpmi_read_byte(struct mtd_info *mtd) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h index 2397010a8963..fba72ad28263 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h @@ -141,10 +141,6 @@ struct gpmi_nand_data { int current_chip; unsigned int command_length; - /* passed from upper layer */ - uint8_t *upper_buf; - int upper_len; - /* for DMA operations */ bool direct_dma_map_ok; @@ -178,7 +174,7 @@ struct gpmi_nand_data { /* Common Services */ int common_nfc_set_geometry(struct gpmi_nand_data *); struct dma_chan *get_dma_chan(struct gpmi_nand_data *); -void prepare_data_dma(struct gpmi_nand_data *, +void prepare_data_dma(struct gpmi_nand_data *, const void *buf, int len, enum dma_data_direction dr); int start_dma_without_bch_irq(struct gpmi_nand_data *, struct dma_async_tx_descriptor *); @@ -197,8 +193,9 @@ int gpmi_disable_clk(struct gpmi_nand_data *this); int gpmi_setup_data_interface(struct mtd_info *mtd, int chipnr, const struct nand_data_interface *conf); void gpmi_nfc_apply_timings(struct gpmi_nand_data *this); -int gpmi_read_data(struct gpmi_nand_data *); -int gpmi_send_data(struct gpmi_nand_data *); +int gpmi_read_data(struct gpmi_nand_data *, void *buf, int len); +int gpmi_send_data(struct gpmi_nand_data *, const void *buf, int len); + int gpmi_send_page(struct gpmi_nand_data *, dma_addr_t payload, dma_addr_t auxiliary); int gpmi_read_page(struct gpmi_nand_data *, From patchwork Thu Apr 26 15:41:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905162 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="sKWSj8RZ"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="RdXAS+XN"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1dg5Ltdz9s06 for ; Fri, 27 Apr 2018 01:46:47 +1000 (AEST) 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=kt1gyrCe4BV8iJPAS0bKGmN4sJ9PWxljfwN/QhiqHrw=; b=sKWSj8RZvGNl6M+YHBwbVg/DcY pC65qlnuwy5s2mQHFwytEHsy6H/Qo1E08bou5GIjhmvqTXYoBnqPuVlQfLEz/ZBATa90WF7TuXOKT TVTAiLXiTF5UHfXQ0i0n9REIh6OWKdy5YfeFospEY4OLkS+HkhKimLWIY2gyZf/LBSOArZD3oRzCO HUPHBQrpzBVGtnqvjKZ153gU/U3Oj7NNaeN6JP9DFzA/PvZF2LoqKwglsjmiCmfh8y9Cxmnh1TPlw kUNr2AaU9G0VD/bvfhS4v4g8tKKSbX1SWjrfItQl4vLcixDptyd7hDaOpNL6a79iH5o3xw+Ri3vVh JXs7Y5Bg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj6X-0000I6-N5; Thu, 26 Apr 2018 15:46:41 +0000 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj29-0005hW-Oj for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:13 +0000 Received: by mail-wr0-x244.google.com with SMTP id o15-v6so57259212wro.11 for ; Thu, 26 Apr 2018 08:41:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Hl9SQU9QSrA1C9BYNXVvCGUF3Na6suF5hBr4PKMBXew=; b=RdXAS+XN/b1MT2yTS5rP+ahLTe+cc0214XPwNn6JK30HLpiMNbrD8Qa8HuwNx4vhl8 ccmrQN5JXElRQEu6JeAS9zADLFny/O1Wl14Yfb0ykvgeeXcu9nPSofoGYG/6ujj5JJiD uDpTNrkbWdy85xR/i+jaeLTcyBeqpVW2v5TbF3hQs382z87tKYP9641RfujwOUSGzNKA jpJC30s5lBgI6bI5SF0ZOXTyMgH9h7Jqn7rOYn3xhL0Lvksm5eJDJzRV9tfOSDvSQRTt jlpey8nIP6FIz4IEr0UinU5aseA7CnhoThLQGg8RXPY2+haeDOGz/wxByEnNxV8HICst RKIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Hl9SQU9QSrA1C9BYNXVvCGUF3Na6suF5hBr4PKMBXew=; b=jJ1UKk+hEGYUaOgFeScUufU6s4e/slOY2Vx7281tTsE/6FCtj6gtHR4qCHC3rwbKrA t8VoNae9wS4y8Jwu9S3AMXMqHY43FjuU5aqNnm5da23f9CmMWhutjdR9ob5O2FtC2Urm lmupqg/232DkbK1jK1WKic3a2VX+rXTOIXf7C2C+pUh7mTIPad7O2OBFzJu4DEj5mvwN dbrPgd4/jDSd3dHSNTWifVBB3PxQ8I47VdPWGUWvQQkPmDQc1Vdr5n/3xcGfdiG0MVbg icVnzkQNK19HIAmpi5zrzNo14wmVHxIuyHD21ZQKuAyPu6aBjh0b1aXoXKnb69nJ7xmN ffow== X-Gm-Message-State: ALQs6tBNlf93hdyDN4yLc0TOAH6QNqyWlOsk/p2cV+Cthd5tZ6CxYdUp vtBHql+vcm7w3FJM1T4NIViHl56q X-Google-Smtp-Source: AIpwx48O8QGILLNf2Azi4lDVoC6IwovW+AW4e9wVHldA0mzHdP67Xav7rbv7AQez+3jzyH8OMEF4UQ== X-Received: by 2002:adf:e181:: with SMTP id k1-v6mr26239237wri.111.1524757317715; Thu, 26 Apr 2018 08:41:57 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.41.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:41:56 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 03/13] mtd: nand: gpmi: put only once used functions inline Date: Thu, 26 Apr 2018 17:41:24 +0200 Message-Id: <20180426154134.8270-4-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084209_858703_CEEFD95E X-CRM114-Status: GOOD ( 16.14 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:244 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sascha Hauer , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sascha Hauer read_page_prepare(), read_page_end() and read_page_swap_end() are trivial functions that are used only once and take 8 arguments each. De-obfuscate the code by open coding these functions in gpmi_ecc_read_page() Signed-off-by: Sascha Hauer Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- v2: rebased --- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 89 ++++++++---------------------- 1 file changed, 23 insertions(+), 66 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 5fa9cd4fac4a..774ac98fbdb2 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -668,56 +668,6 @@ static void release_resources(struct gpmi_nand_data *this) release_dma_channels(this); } -static int read_page_prepare(struct gpmi_nand_data *this, - void *destination, unsigned length, - void *alt_virt, dma_addr_t alt_phys, unsigned alt_size, - void **use_virt, dma_addr_t *use_phys) -{ - struct device *dev = this->dev; - - if (virt_addr_valid(destination)) { - dma_addr_t dest_phys; - - dest_phys = dma_map_single(dev, destination, - length, DMA_FROM_DEVICE); - if (dma_mapping_error(dev, dest_phys)) { - if (alt_size < length) { - dev_err(dev, "Alternate buffer is too small\n"); - return -ENOMEM; - } - goto map_failed; - } - *use_virt = destination; - *use_phys = dest_phys; - this->direct_dma_map_ok = true; - return 0; - } - -map_failed: - *use_virt = alt_virt; - *use_phys = alt_phys; - this->direct_dma_map_ok = false; - return 0; -} - -static inline void read_page_end(struct gpmi_nand_data *this, - void *destination, unsigned length, - void *alt_virt, dma_addr_t alt_phys, unsigned alt_size, - void *used_virt, dma_addr_t used_phys) -{ - if (this->direct_dma_map_ok) - dma_unmap_single(this->dev, used_phys, length, DMA_FROM_DEVICE); -} - -static inline void read_page_swap_end(struct gpmi_nand_data *this, - void *destination, unsigned length, - void *alt_virt, dma_addr_t alt_phys, unsigned alt_size, - void *used_virt, dma_addr_t used_phys) -{ - if (!this->direct_dma_map_ok) - memcpy(destination, alt_virt, length); -} - static int send_page_prepare(struct gpmi_nand_data *this, const void *source, unsigned length, void *alt_virt, dma_addr_t alt_phys, unsigned alt_size, @@ -1008,24 +958,33 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, int ret; dev_dbg(this->dev, "page number is : %d\n", page); - ret = read_page_prepare(this, buf, nfc_geo->payload_size, - this->payload_virt, this->payload_phys, - nfc_geo->payload_size, - &payload_virt, &payload_phys); - if (ret) { - dev_err(this->dev, "Inadequate DMA buffer\n"); - ret = -ENOMEM; - return ret; + + payload_virt = this->payload_virt; + payload_phys = this->payload_phys; + this->direct_dma_map_ok = false; + + if (virt_addr_valid(buf)) { + dma_addr_t dest_phys; + + dest_phys = dma_map_single(this->dev, buf, nfc_geo->payload_size, + DMA_FROM_DEVICE); + if (!dma_mapping_error(this->dev, dest_phys)) { + payload_virt = buf; + payload_phys = dest_phys; + this->direct_dma_map_ok = true; + } } + auxiliary_virt = this->auxiliary_virt; auxiliary_phys = this->auxiliary_phys; /* go! */ ret = gpmi_read_page(this, payload_phys, auxiliary_phys); - read_page_end(this, buf, nfc_geo->payload_size, - this->payload_virt, this->payload_phys, - nfc_geo->payload_size, - payload_virt, payload_phys); + + if (this->direct_dma_map_ok) + dma_unmap_single(this->dev, payload_phys, nfc_geo->payload_size, + DMA_FROM_DEVICE); + if (ret) { dev_err(this->dev, "Error in ECC-based read: %d\n", ret); return ret; @@ -1034,10 +993,8 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, /* Loop over status bytes, accumulating ECC status. */ status = auxiliary_virt + nfc_geo->auxiliary_status_offset; - read_page_swap_end(this, buf, nfc_geo->payload_size, - this->payload_virt, this->payload_phys, - nfc_geo->payload_size, - payload_virt, payload_phys); + if (!this->direct_dma_map_ok) + memcpy(buf, this->payload_virt, nfc_geo->payload_size); for (i = 0; i < nfc_geo->ecc_chunk_count; i++, status++) { if ((*status == STATUS_GOOD) || (*status == STATUS_ERASED)) From patchwork Thu Apr 26 15:41:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905160 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="kKfmhAcc"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="iVxEVYCk"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1d03hktz9s08 for ; Fri, 27 Apr 2018 01:46:12 +1000 (AEST) 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=L2Yhxtc2soAXM4l71smihTcTiCRmdMuPL8LFWp6bsTg=; b=kKfmhAcc+L75l3rLWRcZ2t7B2u PxMUxpYbzuSjYdsVJwwm0wPA1uT8uM0qPK2IVylCjyg/HVb35Rm3HmGTHjScylVZTLrocLVHNYbNR 0+VnBpP0GJ1Tr0gr/5dggopl47DNR4vHgEKv9nTlbZ12AuXa+UPRfRTj5YZPtq5+31su/waUQ6fR/ XnfqK25l7IBof4dupfeXeNB3P9xNojad3uhdiB7s7SvgWaG74XXgmBHaqKVmVmJUkKH7BwU6QhzKy dpM6WVGnm3kIY0XVx9zDcOi9u1msagiqlbxLSb4dhbx9NoMvNEknWP9uXNtVda8eKC6UFFd20bzxq SUmQdK9A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj5u-0008Rw-PQ; Thu, 26 Apr 2018 15:46:02 +0000 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj29-0005hY-Oo for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:13 +0000 Received: by mail-wr0-x244.google.com with SMTP id c14-v6so17133373wrd.4 for ; Thu, 26 Apr 2018 08:42:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=T/UpHikRE23uZCDhB1gwh6RJBE/g2blBrL5dXzNO0Ro=; b=iVxEVYCk26QpfGX2fg6BUYInufHbTgX8jDhndcNjMFcmVjCAgHKBLGy5uufRhmmOUY v6UJyrbrOXMNBUnPbBgzF+kk7msmF1+P6AmKzfhRPMMAIBqFBuHzwjC/lA71wZBBnXd3 +orgD+hoi1Tga6AqZahB31stJ0Dl1+BliJ7L0G7kt7MBkPwpLgfCrViJJUiI4DfNTyM0 5T1k9O0ftVNcvoghkSjSg3GcSo/wWx5l6cxWicZiGOPM0bIJH0yz/D6JOmpDBBICdnfM MCuK1qXUBMbgRaoG3yExQfFRDUyF64c8rL3rrk9SGRE4B2tlCi1LBeiJUi+dJN3y0YOD 3EPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=T/UpHikRE23uZCDhB1gwh6RJBE/g2blBrL5dXzNO0Ro=; b=fRH0NG8bhwRNxAraRe5HyjDiOafodVBz+kuTv4nnCzFCrJPNwwwaFeP77vhx0FiB2l PS1TxkCa3x8tMV5M1GO8NWBI2Zo7cW+kkhoufXhpkubV2giBLS6sLg48ZSiZu1b9HEs8 N9ARSVCcg3fS/krgu0mdtSijSaO1dDXFsb08Ttp+2v0/WuinsbdgBOMbIYR5AJVzPQBa V5EIv/xzD0fsNYQU1HmR8rYdYmXMYPWFlHCT/NU6K9fMQNfFWAat4FfN0PGVVRpk/+E1 PKlKv9sAjxIAhLfdH1eJEL2S5Ax1R44xk/nz8DHm3cSPr+05c3F6/e+//CgUyQQV6lPx 4Z9A== X-Gm-Message-State: ALQs6tAwaRNmqVP3F4mfDOUHLFoRl1wJWLCh/tRfaeNlY2dafx4T74kL tHb311g6wxM4wq+OfrDALihq2War X-Google-Smtp-Source: AB8JxZoslF5tMjk0yiEdrsdU28XGJ6Uw/rx5RKSg8bsBeEa9wvPKI3nsnLIdqT/9K8FTZz6esxtGdQ== X-Received: by 2002:adf:85dd:: with SMTP id 29-v6mr6603220wru.120.1524757319328; Thu, 26 Apr 2018 08:41:59 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.41.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:41:58 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 04/13] mtd: nand: gpmi: remove direct_dma_map_ok from driver data struct Date: Thu, 26 Apr 2018 17:41:25 +0200 Message-Id: <20180426154134.8270-5-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084209_914107_3C32C993 X-CRM114-Status: GOOD ( 17.93 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:244 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sascha Hauer , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sascha Hauer Instead of putting direct_dma_map_ok into driver struct pass it around between functions to make the code more readable. Signed-off-by: Sascha Hauer Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- v2: rebased --- drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 5 +++-- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 15 +++++++-------- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h | 5 +---- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index 447961b798b4..39834bedf460 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -636,6 +636,7 @@ int gpmi_read_data(struct gpmi_nand_data *this, void *buf, int len) int chip = this->current_chip; int ret; u32 pio[2]; + bool direct; /* [1] : send PIO */ pio[0] = BF_GPMI_CTRL0_COMMAND_MODE(BV_GPMI_CTRL0_COMMAND_MODE__READ) @@ -652,7 +653,7 @@ int gpmi_read_data(struct gpmi_nand_data *this, void *buf, int len) return -EINVAL; /* [2] : send DMA request */ - prepare_data_dma(this, buf, len, DMA_FROM_DEVICE); + direct = prepare_data_dma(this, buf, len, DMA_FROM_DEVICE); desc = dmaengine_prep_slave_sg(channel, &this->data_sgl, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); @@ -664,7 +665,7 @@ int gpmi_read_data(struct gpmi_nand_data *this, void *buf, int len) ret = start_dma_without_bch_irq(this, desc); dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_FROM_DEVICE); - if (this->direct_dma_map_ok == false) + if (!direct) memcpy(buf, this->data_buffer_dma, len); return ret; diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 774ac98fbdb2..9ecba7ea0cd5 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -437,7 +437,7 @@ struct dma_chan *get_dma_chan(struct gpmi_nand_data *this) } /* Can we use the upper's buffer directly for DMA? */ -void prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len, +bool prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len, enum dma_data_direction dr) { struct scatterlist *sgl = &this->data_sgl; @@ -450,8 +450,7 @@ void prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len, if (ret == 0) goto map_fail; - this->direct_dma_map_ok = true; - return; + return true; } map_fail: @@ -463,7 +462,7 @@ void prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len, dma_map_sg(this->dev, sgl, 1, dr); - this->direct_dma_map_ok = false; + return false; } /* This will be called after the DMA operation is finished. */ @@ -956,12 +955,12 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, unsigned char *status; unsigned int max_bitflips = 0; int ret; + bool direct = false; dev_dbg(this->dev, "page number is : %d\n", page); payload_virt = this->payload_virt; payload_phys = this->payload_phys; - this->direct_dma_map_ok = false; if (virt_addr_valid(buf)) { dma_addr_t dest_phys; @@ -971,7 +970,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, if (!dma_mapping_error(this->dev, dest_phys)) { payload_virt = buf; payload_phys = dest_phys; - this->direct_dma_map_ok = true; + direct = true; } } @@ -981,7 +980,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, /* go! */ ret = gpmi_read_page(this, payload_phys, auxiliary_phys); - if (this->direct_dma_map_ok) + if (direct) dma_unmap_single(this->dev, payload_phys, nfc_geo->payload_size, DMA_FROM_DEVICE); @@ -993,7 +992,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, /* Loop over status bytes, accumulating ECC status. */ status = auxiliary_virt + nfc_geo->auxiliary_status_offset; - if (!this->direct_dma_map_ok) + if (!direct) memcpy(buf, this->payload_virt, nfc_geo->payload_size); for (i = 0; i < nfc_geo->ecc_chunk_count; i++, status++) { diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h index fba72ad28263..6aa10d6962d6 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h @@ -141,9 +141,6 @@ struct gpmi_nand_data { int current_chip; unsigned int command_length; - /* for DMA operations */ - bool direct_dma_map_ok; - struct scatterlist cmd_sgl; char *cmd_buffer; @@ -174,7 +171,7 @@ struct gpmi_nand_data { /* Common Services */ int common_nfc_set_geometry(struct gpmi_nand_data *); struct dma_chan *get_dma_chan(struct gpmi_nand_data *); -void prepare_data_dma(struct gpmi_nand_data *, const void *buf, int len, +bool prepare_data_dma(struct gpmi_nand_data *, const void *buf, int len, enum dma_data_direction dr); int start_dma_without_bch_irq(struct gpmi_nand_data *, struct dma_async_tx_descriptor *); From patchwork Thu Apr 26 15:41:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905163 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="o2ff9j8p"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="QIGRQOCl"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1fq4prvz9s06 for ; Fri, 27 Apr 2018 01:47:47 +1000 (AEST) 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=FlCdgahE9dKhL8KLU/9KW0twXCvqJgpNnk6PHpynzb8=; b=o2ff9j8p/fPQrSaRJOxTgYFdLM R9LqYw40COfkwS+nKMm3Ka2LJhTO63eBVgbHbrESZq+LuRXamL82PJnox07UhloyRtxa4ArHyvjcF QfV3w0cqXcjmJa0zyvft1AnJGjlPafT9w7UyrDfxvv/ZCFZ/jKSc0kce7Gov6ncatL0fOgMeGJJfQ y2hO6dPs9NpQRtC6CJ0ddYBFRJ3sqB6zOsFzYvKfanGV17PLWqHEJlpS3ws0zZ4ypQ+c6XQ680cYj cZeVH9lkQDRl1Jo5qEziFNxyZJaLaU1988KfRKN1VhIs5XRkJYOgTycSU5UcJJ8CbaaUpVsxUrXOb hRsWMETQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj7H-0000bW-ES; Thu, 26 Apr 2018 15:47:27 +0000 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2D-0005hb-Ah for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:15 +0000 Received: by mail-wr0-x242.google.com with SMTP id d1-v6so57227904wrj.13 for ; Thu, 26 Apr 2018 08:42:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=SGekFQ02Jb2f1MGEXDmz7SUTlE2cwAAgljJr2WU7fT4=; b=QIGRQOCl37GGNrMjjF5mQeiQUrASqFJ2ZAiQBgYbrZ+kwZ70os66Uq73cjxlnczItN bZdwnPY5FZ1dIogbb+hDfMC5Us+EoIHNmiUiYPODuF8bJVWyID30p96hdkdOirEtMlff 0+KvSRUaZ35Q0sSkwNuNtC51iJ949Y5r+8rSgPC7mlwsilpXSXj+VhWjwAPcqWTBHoWZ 5HXfCG42xXdUlMprZKUDwMQKnFBpaQoCUumrFSq7BSEK3XgeLAT2ndtPf+5XDzteDQDL IhRGPzxBw0vsH49ol1WITsOPC5NQ5uLZYXVIWaje4u6Metf6c7lK7FtEhZ6kwV/1LwlI dgSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=SGekFQ02Jb2f1MGEXDmz7SUTlE2cwAAgljJr2WU7fT4=; b=kwjlP4Ay3U0ePw8KBDG+Dk3DRK21OQNP/lHPT/+8AkxSzrxoPixXPiwnXK1LbE/ju2 RyrlmpkgmY+Z63JW+xW1ulymcNmj6vdP/aFaMjIsfhcbdcq8k3Jxk0Or2G1jgfAsGeYQ aTNFI2xW82CBjXyTowgUzqOhZlRwZEJsJyG1AK8EFkNyk3pTO95CkN5iaKklL0L1ZN0L xx6WDiAz/GhcrUHNjjQ4d9E+lVE1IsUnoDXiZDc/OjOeqF9zmCtqUIn/8b6rQ/sKSKvp Vz2W8wGM87BEEuwMHLtqk8p1JAfiXwYn5ZXpYdXYiH74jc/3fQyE/2uZ23xMlBo+IO7x P4Ug== X-Gm-Message-State: ALQs6tD7yo0HEi1CA4YkbT9QK64uD+Mca1Qg5lmFcYQxQi4yP2VHSyyS WJ6S0znCW6Ir7vTdwn7UtW7paBSY X-Google-Smtp-Source: AB8JxZo9v21Rlga0HvdXYZPfPJLnM/plQrM0bytnVr7k8WlcKiKfgmxaVyiwRH/GA9QXl/QenS2bsA== X-Received: by 2002:adf:d0cb:: with SMTP id z11-v6mr9888123wrh.281.1524757321203; Thu, 26 Apr 2018 08:42:01 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.41.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:00 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 05/13] mtd: nand: gpmi: return valid value from bch_set_geometry() Date: Thu, 26 Apr 2018 17:41:26 +0200 Message-Id: <20180426154134.8270-6-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084213_436239_F7205874 X-CRM114-Status: GOOD ( 14.51 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:242 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sascha Hauer , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sascha Hauer The caller of bch_set_geometry() expects the return value to be an error code, so !0 is not valid. return the error from the just called function instead. Signed-off-by: Sascha Hauer Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- v2: rebased --- drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index 39834bedf460..83697b8df871 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -258,8 +258,9 @@ int bch_set_geometry(struct gpmi_nand_data *this) unsigned int gf_len; int ret; - if (common_nfc_set_geometry(this)) - return !0; + ret = common_nfc_set_geometry(this); + if (ret) + return ret; block_count = bch_geo->ecc_chunk_count - 1; block_size = bch_geo->ecc_chunk_size; From patchwork Thu Apr 26 15:41:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905164 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="dpRuyahV"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="x8sNoJvJ"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1gs6GrFz9s06 for ; Fri, 27 Apr 2018 01:48:41 +1000 (AEST) 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=zhKkC4s2wwC13HPAVFSN71ZBBSM5+0AKP25hoIPJE8M=; b=dpRuyahVIvn4FusFhFss7Xq+Fr LDWdrkCNJ6I7eK9qLQ4RBGgoU1vxarJ4NAqLfiqGXYEW/dmbN7tcBv6h8XU5cT2Z16raeJZUa3yEP NgZ3wd5ofeKa5AmdWwRTSIsCtMWFDUSvQ3PAypquJWS1MZolJxNo4Wlh1w68cK5sOSoCLwJZ1/qeX Cm7ih5wir38dXrspTdt6KmhsVPtYt8N5cCXoVvbH2uiHjY+pZKpzZkvcjBMZP/rb64zl5oDNBbJF3 lRlPCZNq8kcT7gyL+dKGAGOC4CerWtpkg+EtBZbYbmMLtFdJFa4pPNxRPbWOCb7JdEFrdeerBoGrU SPfuDGiw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj8K-0001Bl-Ho; Thu, 26 Apr 2018 15:48:32 +0000 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2D-0005hg-9p for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:20 +0000 Received: by mail-wr0-x242.google.com with SMTP id p5-v6so29489316wre.12 for ; Thu, 26 Apr 2018 08:42:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=O4tL3lNcneIdb7NLUWzz2/NAU1oYkS00QTarZLM+R18=; b=x8sNoJvJrESFMQLC5/iKZrZfFTCEACpwPWa9KYgSRgRuRa68OjKvd4vWQ+IlpHT1iB 87jh+R4LcR5ETNCaLMJxDoMx8rCJTquWcqfTlWAUg1aBGwEH1cFmEsonVLfbag9mWR5z UqptxRZ0KfuWjKkikO8jy010XcR64Ct+4qW5fwhOOuwc+bX7QoKXoLrzpDets4OJNO+t QlbbOnYE4WPJ51peRoOcW1QTT1YZ117SGe7BfR4WEqCIDVoft9ff43emvHmEzq/BCLzY Qr8/6UIaAHjm+foUjnrBDzu31rChlcCZSA1f4ljXOLmu2pdNyLDHRwZy5IcgnEANdZ9a LESQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=O4tL3lNcneIdb7NLUWzz2/NAU1oYkS00QTarZLM+R18=; b=AkWJrMCqcTWfze+pxKUGZ6wL76bbN2eeWuwr2+oKQmaa/Po5As2BXwIOScAXw03s4k UZCPDaMbr8Gc0BegVNV6mBjXVXOBbbzHMGahngOfIXvQyaUof+hEu1R/es7Lw3QCiHyL gwSzJalcJFCJzemdzh4ivCJG2Oy12ZNF3JZi8GwQEleUHOEYf9qraMQ4PfEFT76zD3Xn 9oR1rtLkAMPa/uoiiMNmSWIn8yhqbhee73BWmLuFJlFjCJC5OihHZO2iESV9EuI8kyMg IZuFwg6b9fWbBGqtxQeW2CsM2ZZvsA2VxCkD+zTBZyF410mRqvKxxuGMcgCC9uKggwD9 X8vA== X-Gm-Message-State: ALQs6tDNvDQmR6jCl46ldpS4xUdRkkVPmsB/E0BX0/ph6iaDx44FbZtG 9RJ/x4ziKbHZ5ygWC1MVumiy/7e+ X-Google-Smtp-Source: AIpwx48S4EuT6Zebg0EVvfbMCx4L6+BstmWaqT89oudSdGfIu1q5b5TkZtMOmkVnQh3E8o7/+s7tRA== X-Received: by 2002:adf:e4cc:: with SMTP id v12-v6mr26163911wrm.243.1524757322821; Thu, 26 Apr 2018 08:42:02 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:01 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 06/13] mtd: nand: gpmi: remove unnecessary variables Date: Thu, 26 Apr 2018 17:41:27 +0200 Message-Id: <20180426154134.8270-7-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084213_429319_9AE27182 X-CRM114-Status: GOOD ( 14.37 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:242 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sascha Hauer , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Sascha Hauer Use this->auxiliary_virt and this->auxiliary_phys directly rather than creating extra local variables for them. Signed-off-by: Sascha Hauer Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- v2: rebased --- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 9ecba7ea0cd5..7ba00b8ab288 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -949,8 +949,6 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, struct mtd_info *mtd = nand_to_mtd(chip); void *payload_virt; dma_addr_t payload_phys; - void *auxiliary_virt; - dma_addr_t auxiliary_phys; unsigned int i; unsigned char *status; unsigned int max_bitflips = 0; @@ -974,11 +972,8 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, } } - auxiliary_virt = this->auxiliary_virt; - auxiliary_phys = this->auxiliary_phys; - /* go! */ - ret = gpmi_read_page(this, payload_phys, auxiliary_phys); + ret = gpmi_read_page(this, payload_phys, this->auxiliary_phys); if (direct) dma_unmap_single(this->dev, payload_phys, nfc_geo->payload_size, @@ -990,7 +985,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, } /* Loop over status bytes, accumulating ECC status. */ - status = auxiliary_virt + nfc_geo->auxiliary_status_offset; + status = this->auxiliary_virt + nfc_geo->auxiliary_status_offset; if (!direct) memcpy(buf, this->payload_virt, nfc_geo->payload_size); @@ -1048,7 +1043,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, buf + i * nfc_geo->ecc_chunk_size, nfc_geo->ecc_chunk_size, eccbuf, eccbytes, - auxiliary_virt, + this->auxiliary_virt, nfc_geo->metadata_size, nfc_geo->ecc_strength); } else { @@ -1076,7 +1071,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, } /* handle the block mark swapping */ - block_mark_swapping(this, buf, auxiliary_virt); + block_mark_swapping(this, buf, this->auxiliary_virt); if (oob_required) { /* @@ -1090,7 +1085,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, * the block mark. */ memset(chip->oob_poi, ~0, mtd->oobsize); - chip->oob_poi[0] = ((uint8_t *) auxiliary_virt)[0]; + chip->oob_poi[0] = ((uint8_t *)this->auxiliary_virt)[0]; } return max_bitflips; From patchwork Thu Apr 26 15:41:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905159 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="XAGegmKY"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="d+XISx8N"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1c30bmsz9s06 for ; Fri, 27 Apr 2018 01:45:23 +1000 (AEST) 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=Y8E183SBeIK7ziqSZv+3ATvkUhWYeNsN3cq/xLj+qL4=; b=XAGegmKYeAj8E5l1aEV5uJHQ9t 3bH9PDaV8LeNxb3TJROnQ2toQb2qHLdbBOdW79VUDXvLDiSxnLwSdFd6zoRKG+aTPxBkkq2pINqsY phlRB2Dsx8eE9U+tp1LnE/S4kE2m5cReV7ZtNoN1jfWsBE2yxAuHIclleOFvO2BWv6dwSsm8fb7DI XOpEuv1ziDKVEWsDSULfJWRS5XuVVQi48kQm//B4nBmny0LnTSPZ/TwK3txn1IfQIPsukDDAYhCDg Rfi3k5cwSFh30G0BuXAFf4WOzVNfBSCV5S6J+5dI1rWtILddpheVVxj7DnXxz58DU/NdTjVIR6HNo GFSx87tA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj54-0006z9-QS; Thu, 26 Apr 2018 15:45:10 +0000 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj29-0005hv-P0 for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:12 +0000 Received: by mail-wr0-x244.google.com with SMTP id v60-v6so57238613wrc.7 for ; Thu, 26 Apr 2018 08:42:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=4fMVsqQD/StcKry+rIB3M7ybZqR9QTwX1lFg3tLK2ws=; b=d+XISx8N3h3z3ll8dTy0EYVTwTAccdHg5z6ZbUaUrfBiizUiDwJIURi0DFtLBrnxkQ uKs41f9HguPkfKZ8B/YInYLVe4oNqmJIe9HR6ToW4C3nl8nLRxxBWGSEmxWZgzQy5QuA T8sOWc0Fqc7IoVhKahknlV0+HVSE8UOka1/3U3I6f2u0X+qq5g0AakpwAQsKTdGFX0Zk Xwny4B6H5qOyDqAGxfvZc5iXej7sxKKf4alaHIrNKDhv4kUmLzxidSRbAPtqKngbQbsd bWGR9iOa2OGMcScOlwMpR91T0gKPGwzGzDZN1c+Exdjxl7BK3/jDpsn+DNxcM1+gyjyT 5rsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=4fMVsqQD/StcKry+rIB3M7ybZqR9QTwX1lFg3tLK2ws=; b=tJMbN5eCgF4SY/S/dW3Ue5LJaRtG2sSneLvxEV+hk62Q89HVpvGEpED+qb6dFUC58h Gvx/EjNH/465hbaGtmalpmjEvxSXft9U824X2i12SBnyfFCtBfv3aaoyL6aIq1ecEToK xqIQp3XQEhmwW4++7SpIyMY+GbtTm0xPd3cB+A9vQdjqgS++dU6rXiPNED7gyQ+XBlHN coQ7MHFzz/FrY3azl9fVN71iEoNXGfrL94ILzk46RGAwCsMnz0IUX6IHvLld/J/1e8Ku lCf3al3xn/QwqmNaJ1PLMOOtqhDrbztIwAOowF+vLdhJ8UM28PlSrbvBgy5mm8+LdTPH TMww== X-Gm-Message-State: ALQs6tBTklkDzP8jaq3v7mUDshvGeVMt2U21cnxcUa9oTsbVXoPOKAxU hCcj6MUbF4l9rZC09khSv/berE6j X-Google-Smtp-Source: AIpwx4/ngEKNw8EByLSxy8KyRpcM+bRF5ZQQ8JNkn10Fr328irI6ySjYxSAIcdUZBI/ggSqZpEpD+Q== X-Received: by 2002:adf:cc8c:: with SMTP id p12-v6mr25267003wrj.280.1524757324429; Thu, 26 Apr 2018 08:42:04 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:03 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 07/13] mtd: rawnand: gpmi: set aggregate ready/busy signalling Date: Thu, 26 Apr 2018 17:41:28 +0200 Message-Id: <20180426154134.8270-8-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084209_872739_2ABE8F5C X-CRM114-Status: GOOD ( 14.74 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:244 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sam Lefebvre , Dries Staelens , Han Xu MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The GPMI block by default decouples the ready/busy signal (which is shared between all chip-selects) to separate internal signals per chip-select. However, since the gpmi-nand driver uses DMA0 for all chip-selects, DMA transfers will not be able to see the ready/busy status for any chip-select other than 0. Currently, this happens to work because nand_command() ends with an explicit nand_wait_ready() and the driver only sets up a single command in a DMA chain. nand_wait_ready() polls for the chip-select specific ready/busy status bit. Future patches, however, will set up a DMA chain with several commands, so these will have to wait correctly in the DMA chain itself. To fix this, set the GANGED_RDYBUSY bit in the control1 register. This ties all internal ready/busy signals together, so DMA0 will also see the ready/busy status of chip selects 1-2-3. It's a bit silly that this isn't implied in hardware by the DECOUPLE_CS bit. Signed-off-by: Sam Lefebvre Signed-off-by: Arnout Vandecappelle (Essensium/Mind) Cc: Han Xu --- Tested on an i.MX6Q with two identical chips on CS0 and CS1. --- drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 3 +++ drivers/mtd/nand/raw/gpmi-nand/gpmi-regs.h | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index 83697b8df871..1858afdb400d 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -193,6 +193,9 @@ int gpmi_init(struct gpmi_nand_data *this) */ writel(BM_GPMI_CTRL1_DECOUPLE_CS, r->gpmi_regs + HW_GPMI_CTRL1_SET); + /* Aggregate ready busy signalling. */ + writel(BM_GPMI_CTRL1_GANGED_RDYBUSY, r->gpmi_regs + HW_GPMI_CTRL1_SET); + gpmi_disable_clk(this); return 0; err_out: diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-regs.h b/drivers/mtd/nand/raw/gpmi-nand/gpmi-regs.h index d92bf32221ca..e341802c90ac 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-regs.h +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-regs.h @@ -120,6 +120,7 @@ #define BV_GPMI_CTRL1_WRN_DLY_SEL_7_TO_12NS 0x2 #define BV_GPMI_CTRL1_WRN_DLY_SEL_NO_DELAY 0x3 +#define BM_GPMI_CTRL1_GANGED_RDYBUSY (1 << 19) #define BM_GPMI_CTRL1_BCH_MODE (1 << 18) #define BP_GPMI_CTRL1_DLL_ENABLE 17 From patchwork Thu Apr 26 15:41:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905158 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="J/8mWV2Z"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="ObMMduU7"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1b83DKSz9s08 for ; Fri, 27 Apr 2018 01:44:36 +1000 (AEST) 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=eB/mGj/iAAh6bgveL6oy053ejxqxrpyMgDFYCCxGkUo=; b=J/8mWV2ZGKWS3nvgLrPCVwrJvN HYBLecOwQypN+8q2QP4nPL8OZ52g+N7+LydOwtAc182dCqcirKRNJAtYtWy121JKqKCtkM2wc4C9o II6Bo5kM+eioq5CGI6lLozCm0d1KIOxj7dIYZtOUKQXmCT0ketKl/Z6t6BLO0AT2/nH4/S0WdQ0RX H4bAQo2RIaGS2VAYPzC3omLNTgNaIAv0lebLBXewlbDKy16qMbwDIQTVRjSN+YU6FbMUYYu5zTLZD qjeyVtUWCsd3N9fQengyqBMsBibCb7B4tmGuqesDIYynV/eTNc3BpnLDWXJ6oMP7vDYRBRadv1moj iFBCpxYQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj4L-0006ce-RK; Thu, 26 Apr 2018 15:44:25 +0000 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj29-0005i9-Oy for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:12 +0000 Received: by mail-wr0-x244.google.com with SMTP id p5-v6so29489502wre.12 for ; Thu, 26 Apr 2018 08:42:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=egUyTf5dWRr7WjHzowLsMJlRypf02ouGtOE5D7/9M6o=; b=ObMMduU711NaqAheLEWNBKqBdQUGnUYUFUiHwJk8K7wSLGBl4l65hdV9EBQYtxJCDQ ckDRItewoSS7jZ3Nt9BlCFy8mBugIfq8jlO0cULT+ozAk8/VwtNwtSVkMraYVXcK0ios aNmyx0S+U39PMAVPfNtoPvfkqZhrpaxvKp6nSAsv+0kTdXMQBZiEZiOvbYDDgxPeDgwg ShUo5/+mJsn7EEXUqnMZQmNNxYhy13qYTWQxvgbJYDZaUyQ25CNFI1MfpdRKc05/qYcZ kvtUA7ADFawmz+Ali+aAbJ/RT0pSYUhrEttyNKNtG8w8SICtNH589CjRD7Igw3nJuirb SmzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=egUyTf5dWRr7WjHzowLsMJlRypf02ouGtOE5D7/9M6o=; b=KnHLSuV5+vlqeWPpKdbhlvBf9QxO1b30UAOCf7khGjD2sNYxlsmZJA0y4UPheqENs9 YRVhSD9Q0xzGDjO9pc/EnZAaJKtBlrIiND7yjzrXn9dewCMjHhOSeEsKF93vfwERSEpE vISs16oBZURsJyENc7S6lvysRkvB0FtAkYNrqONbl8z0fz+Vk931GzeVGLWjfrZpRW5z XCJUxTVVOpgA6adTkB3L95/f7q1ml1PI/08oSv0TIFtLbL2yHDBHcSSLbKnOShlMCRVY EbnjCKpMF/ucw3kr7qRBRuX4/rOS6h5XGxTAiPlZGUrwm9Rh9aYPQLwmmxeDxC3ZkYhm Yjcw== X-Gm-Message-State: ALQs6tBS7klAEfLRGIOGDgN5rzcTPM6CCYBfmcnogO9INndj7WlMQMsm 0/mTz69rCVyE5Cg2esBKdKPIc2Z1 X-Google-Smtp-Source: AB8JxZpRNZv3Z3eVkfaqoBYCpqi9qxu1uIA0t+Cze/qZ+kAfIwD80k3WS1AMJ8j6BxtWZC6AxOEwIA== X-Received: by 2002:adf:a3d7:: with SMTP id m23-v6mr10503350wrb.209.1524757326056; Thu, 26 Apr 2018 08:42:06 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:05 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 08/13] mtd: rawnand: gpmi: return generated errors in gpmi_ecc_read_oob() Date: Thu, 26 Apr 2018 17:41:29 +0200 Message-Id: <20180426154134.8270-9-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084209_859426_FDFBB9DB X-CRM114-Status: GOOD ( 14.51 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:244 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Errors can be generated by nand_read_page_op(). It's important to check the error flags and pass them upwards. Signed-off-by: Sam Lefebvre --- v2: also bail out before calling ->read_byte() (Boris) When handling errors we need to bail out before calling ->read_byte(). --- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 7ba00b8ab288..60bc1bac7741 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -1334,13 +1334,18 @@ static int gpmi_ecc_read_oob(struct mtd_info *mtd, struct nand_chip *chip, int page) { struct gpmi_nand_data *this = nand_get_controller_data(chip); + int ret = 0; dev_dbg(this->dev, "page number is %d\n", page); /* clear the OOB buffer */ memset(chip->oob_poi, ~0, mtd->oobsize); /* Read out the conventional OOB. */ - nand_read_page_op(chip, page, mtd->writesize, NULL, 0); + ret = nand_read_page_op(chip, page, mtd->writesize, NULL, 0); + + if (ret) + return ret; + chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); /* @@ -1350,11 +1355,15 @@ static int gpmi_ecc_read_oob(struct mtd_info *mtd, struct nand_chip *chip, */ if (GPMI_IS_MX23(this)) { /* Read the block mark into the first byte of the OOB buffer. */ - nand_read_page_op(chip, page, 0, NULL, 0); + ret = nand_read_page_op(chip, page, 0, NULL, 0); + + if (ret) + return ret; + chip->oob_poi[0] = chip->read_byte(mtd); } - return 0; + return ret; } static int From patchwork Thu Apr 26 15:41:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905165 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="KWLQvhVJ"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="oe8+R5vi"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1hh2fNLz9s06 for ; Fri, 27 Apr 2018 01:49:24 +1000 (AEST) 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=Ci5+StavQwH67SIH9QA1g96ibHL8XQGTeViV1iXOFmE=; b=KWLQvhVJCg5cI0W30aurVnWNY2 IOPbwFALbPXm0AaTaMZ9r4dsq3W0xygBY9W/e4FTdzQwbK4vSqVCIXAanCyQvNUUuggnTz82A4ioj c7k0QRYwhH9J8YqByjUneosXcT14BIIbaT9nBLTZ7N5kM43FSqDHTQ+mtST6B5sH+bxpSG1k7tp9g IvjmrHHU35bd7Q/xlKW+41eHmtzfa1Oyzw+vuMRuvDbaHJEpm8rSRZhtD9fFdOfVYs1kg4D0qwRKs Dd00TUDqzXYBtwAeh3COICSrKIdhO0ivWoG/VIDCsPKcYl5G49ID612a/YVJxrkq0kybPClssvgzn zPa61+ew==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj90-0001XW-6m; Thu, 26 Apr 2018 15:49:14 +0000 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2J-0005id-S5 for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:22 +0000 Received: by mail-wm0-x242.google.com with SMTP id b21so14198961wme.4 for ; Thu, 26 Apr 2018 08:42:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Tv3Q1N8V9H48VjWdaRLo8hkN2Sw8mSYqhRW4l7Y8pqA=; b=oe8+R5viG4OGX5vmJML95/vpRV6u/5LwO1aiw/6b3ixaS6bMG1Z/qUVaP4g3mnE8XO HENCZZ2rw38mvWaVzgtCD2WkQW4mLY3L1oWbxfuJQEG8PII138fgaRCbcYAQEGKjhiMs it3PKOIR+w+JDPQbJxzRNjKSm5x84FhEz1c+Rz4w7Q6nlNTmThbEglUqOv9gsynCqGoG z3ZWMCNNvuoWubQm2irXT71qbjtd0YHWNBSzHhgxGqap0Tb8mQ5ptDRMqYDmXXdUsgqi 5lJN7PJDtGetGAjtWEWJqyEg/87vZ8BUmk7XHLwTDaJnzqZp08xBPeoN0BxZiwNr7fXA fcwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Tv3Q1N8V9H48VjWdaRLo8hkN2Sw8mSYqhRW4l7Y8pqA=; b=Y5TJjJWaRQL0cs/QQyqgI7Nbz4hn0xCcNumhv+gU+4qOyfmcvQedNJmMV9NKuUnABP 5MBIHkTi5suEcL97BlEo9BG4c7F3dPIzz7cuHReoh3SKwMeBDo/MmnKVhIMTRKbaMEYg jmb1H5F15MIIIJ3Y3j76yZzey6eEZzixg1HaA0gw8yDV9MPitsU23Et9wS8yoSqcl6pK 2Qdjd4hFo+PdxiRtr3Bj9iLD2ur0J3Rof+ImywFmqNDbveYT+QAfl+xfM9AcAKX8GIoP UKZm7SkwDXoYiYPKMJ8t20EZWx9wY0op5LuPVkMIE+l10dmnd3wn5odQaRZ4bZ0JjrQ0 gxaw== X-Gm-Message-State: ALQs6tC107OdcUyfd7WbA6lSv+/fs8THHoJ1gnN/mCt2surw1eDakQyH pwXwSLs9RGmS0ijPyn7g0KxN9kGL X-Google-Smtp-Source: AB8JxZpMM/2d3DnzPvkf3fhH5RCaWdE5BZkXhoT2nWDDOjTt7cL6PUBWOfBY+TThqVVdT2qcWzSUrg== X-Received: by 10.28.113.28 with SMTP id m28mr6092337wmc.92.1524757327695; Thu, 26 Apr 2018 08:42:07 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:06 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 09/13] mtd: rawnand: gpmi: poll the BCH interrupt bit in start_dma_with_bch_irq() Date: Thu, 26 Apr 2018 17:41:30 +0200 Message-Id: <20180426154134.8270-10-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084219_932709_AEFCBBF4 X-CRM114-Status: GOOD ( 13.58 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c09:0:0:0:242 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org To improve nand performance, the BCH interrupt bit must be polled before waiting for occurence. This avoids an unnecessary context switch. Signed-off-by: Sam Lefebvre --- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 60bc1bac7741..28a2cf106ddc 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -503,18 +503,31 @@ int start_dma_without_bch_irq(struct gpmi_nand_data *this, * Actually, we must wait for two interrupts : * [1] firstly the DMA interrupt and * [2] secondly the BCH interrupt. + * To improve performance, we first poll for the BCH + * interrupt. */ int start_dma_with_bch_irq(struct gpmi_nand_data *this, struct dma_async_tx_descriptor *desc) { struct completion *bch_c = &this->bch_done; + struct resources *r = &this->resources; unsigned long timeout; - /* Prepare to receive an interrupt from the BCH block. */ - init_completion(bch_c); + /* Disable interrupt */ + writel(BM_BCH_CTRL_COMPLETE_IRQ_EN, r->bch_regs + HW_BCH_CTRL_CLR); /* start the DMA */ start_dma_without_bch_irq(this, desc); + if (readl(r->bch_regs + HW_BCH_CTRL) & BM_BCH_CTRL_COMPLETE_IRQ) { + writel(BM_BCH_CTRL_COMPLETE_IRQ, r->bch_regs + HW_BCH_CTRL_CLR); + return 0; + } + + /* Prepare to receive an interrupt from the BCH block. */ + init_completion(bch_c); + + /* Re-enable interrupt */ + writel(BM_BCH_CTRL_COMPLETE_IRQ_EN, r->bch_regs + HW_BCH_CTRL_SET); /* Wait for the interrupt from the BCH block. */ timeout = wait_for_completion_timeout(bch_c, msecs_to_jiffies(1000)); From patchwork Thu Apr 26 15:41:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905166 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="mbijjQGJ"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="LAS/2OD0"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1jS1Y7qz9s08 for ; Fri, 27 Apr 2018 01:50:04 +1000 (AEST) 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=2Fm8cQ+b/SvmrAFPbYGOt9gKAqZAfRwbWFCXKhfNdBE=; b=mbijjQGJc5rHWqbKwgUxoeaBlY lwCkBJd+UZV7F+kgShLlenxyU1pdSdYaQrveopFqNYRl4cmY4Dp58v1iUkX3K08XTN0MnIrPuN/+p IoWzQoR2DmaUQTefoihrh3qzQO1InGqZeU4HMlFKSWb68pfaGoeK9Nw6N1aLIsAW4RZvQfSgl/OAV Xlq7kP3djIWRRXIrKckfH2XeT+I+IIEdyU7CWXm3+YCNKbVEGYMUiTLZzjhXZikI59Xrvdte+lP0w CLbb9EYmDZlRIdP66s07ycTjKj8BVQDshTCggSP/UQSceikAWt/USHG6L1jUwlSmUZikjJMRU7Iyp P+y0/eWA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj9f-0001pL-6c; Thu, 26 Apr 2018 15:49:55 +0000 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2J-0005jt-SI for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:22 +0000 Received: by mail-wm0-x242.google.com with SMTP id n10so14103554wmc.1 for ; Thu, 26 Apr 2018 08:42:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/yAP1QUnI7a3gLNM/BLUjD5nPH0uMa4x/BSzv7Kv7gs=; b=LAS/2OD0EnQDxt9aKPTDFa7wWMGcDNW0OEcheUfPGk5hw3nRSgvf6Qj8Mlw4Vy/9z/ 5w4sxGdQnbuAlRSX7UQNi2mHu4jJN25rTmYogyyCeOHTjFM8I7ieUCxibHlFVCTFHA58 uXEtSqOOCNOdz5DVP0G18n8WgjR3hbHjQiUiunne4iUISI0yrSZeEkYe/EeKI67PB0FJ y6Ieh7FYGn7JacC3QXL/qiQ39DT/050jNhm8RjiInD/aVLMK7l2uEqtsNjru4SnrKT2L +CcC7ZaE4zlZWI3OKgVswf+FGx8EtnB3jl/d8wKi2/kinKI5W3ShnLrYqMSXNvKdxShq LWHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/yAP1QUnI7a3gLNM/BLUjD5nPH0uMa4x/BSzv7Kv7gs=; b=ZLse1Q2+bY8u3orrwdeJhcP975y4gi7qYHS1wm7DAxxhHB1BQHSvRok/087avaMgfK YurszcSHQ5Agl1/9UPsvXcTWeiCu6dX3BPJuPPVsEnPett02xMUXb/2EaFHAs2XyFAQQ R6Cz1Y4GSKe+dMLvIBxqtOn4SuLr/8fYp6ZRq96wXXESujQZVFbxkpAtcnd0b/hq9eJ8 8sHDMvX8nkwhXwFtWLIB+O6PsbNtFPeYuUOdf91YxLsxwb5YBuWSdUWbda9yZYYQA0Nt ecY1ZoxIvTObrwVv2UqZmgTcFAQnY6ctYHgXHkkpAFtu9dtrH7GlpKqPsqKJDl/iPQ39 pmcw== X-Gm-Message-State: ALQs6tBj+Zqt6TcH9AKhitr5SAT9ZL4DOMHjxEnyAZLJdHn2MYpjxbLi 68hNGSmFFQ58PKlCPAh9sZH+9AMM X-Google-Smtp-Source: AB8JxZoszr8gOKKWOEVP4Bm10dTaqVY93AMqlNPk2fLPV3cWdKicyPXm337fZyFLcGeSFe5mS1szvA== X-Received: by 10.28.66.73 with SMTP id p70mr2270412wma.17.1524757329298; Thu, 26 Apr 2018 08:42:09 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:08 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 10/13] mtd: rawnand: gpmi: instantiate cmdfunc Date: Thu, 26 Apr 2018 17:41:31 +0200 Message-Id: <20180426154134.8270-11-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084219_950267_0BF85B3C X-CRM114-Status: GOOD ( 22.06 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c09:0:0:0:242 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: "Arnout Vandecappelle (Essensium/Mind)" Later patches will optimize the command handling for gpmi. This requires a gpmmi-specific implementation of cmdfunc. As a first step, nand_command() is copied literally from nand_base.c (after merging nand_command() and nand_command_lp()). The auxiliary functions nand_ccs_delay() and nand_wait_status_ready() also need to be copied, together with the includes they need. Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 205 +++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 28a2cf106ddc..91205573f2bc 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -19,11 +19,13 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include +#include #include #include #include #include #include +#include #include #include #include "gpmi-nand.h" @@ -1104,6 +1106,208 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, return max_bitflips; } +static void gpmi_wait_status_ready(struct mtd_info *mtd, unsigned long timeo) +{ + register struct nand_chip *chip = mtd_to_nand(mtd); + int ret; + + timeo = jiffies + msecs_to_jiffies(timeo); + do { + u8 status; + + ret = nand_read_data_op(chip, &status, sizeof(status), true); + if (ret) + return; + + if (status & NAND_STATUS_READY) + break; + touch_softlockup_watchdog(); + } while (time_before(jiffies, timeo)); +}; + +static void gpmi_ccs_delay(struct nand_chip *chip) +{ + /* + * The controller already takes care of waiting for tCCS when the RNDIN + * or RNDOUT command is sent, return directly. + */ + if (!(chip->options & NAND_WAIT_TCCS)) + return; + + /* + * Wait tCCS_min if it is correctly defined, otherwise wait 500ns + * (which should be safe for all NANDs). + */ + if (chip->setup_data_interface) + ndelay(chip->data_interface.timings.sdr.tCCS_min / 1000); + else + ndelay(500); +} + +/** + * gpmi_nand_command - Send command to NAND device + * @mtd: MTD device structure + * @command: the command to be sent + * @column: the column address for this command, -1 if none + * @page_addr: the page address for this command, -1 if none + * + * Send command to NAND device. + */ +static void gpmi_nand_command(struct mtd_info *mtd, unsigned int command, + int column, int page_addr) +{ + register struct nand_chip *chip = mtd_to_nand(mtd); + int ctrl = NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE; + /* Large page devices (> 512 bytes) behave slightly differently. */ + bool is_lp = mtd->writesize > 512; + + if (is_lp) { + /* Large page devices don't have the separate regions as we + * have in the small page devices. We must emulate + * NAND_CMD_READOOB to keep the code compatible. + */ + if (command == NAND_CMD_READOOB) { + column += mtd->writesize; + command = NAND_CMD_READ0; + } + } else if (command == NAND_CMD_SEQIN) { + /* Write out the command to the device */ + int readcmd; + + if (column >= mtd->writesize) { + /* OOB area */ + column -= mtd->writesize; + readcmd = NAND_CMD_READOOB; + } else if (column < 256) { + /* First 256 bytes --> READ0 */ + readcmd = NAND_CMD_READ0; + } else { + column -= 256; + readcmd = NAND_CMD_READ1; + } + chip->cmd_ctrl(mtd, readcmd, ctrl); + ctrl &= ~NAND_CTRL_CHANGE; + } + + /* Command latch cycle */ + if (command != NAND_CMD_NONE) + chip->cmd_ctrl(mtd, command, ctrl); + + /* Address cycle, when necessary */ + ctrl = NAND_NCE | NAND_ALE | NAND_CTRL_CHANGE; + /* Serially input address */ + if (column != -1) { + /* Adjust columns for 16 bit buswidth */ + if (chip->options & NAND_BUSWIDTH_16 && + !nand_opcode_8bits(command)) + column >>= 1; + chip->cmd_ctrl(mtd, column, ctrl); + ctrl &= ~NAND_CTRL_CHANGE; + + /* Only output a single addr cycle for 8bits opcodes. */ + if (is_lp && !nand_opcode_8bits(command)) + chip->cmd_ctrl(mtd, column >> 8, ctrl); + } + if (page_addr != -1) { + chip->cmd_ctrl(mtd, page_addr, ctrl); + ctrl &= ~NAND_CTRL_CHANGE; + chip->cmd_ctrl(mtd, page_addr >> 8, ctrl); + if (chip->options & NAND_ROW_ADDR_3) + chip->cmd_ctrl(mtd, page_addr >> 16, ctrl); + } + chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); + + /* + * Program and erase have their own busy handlers status, sequential + * in and status need no delay. + */ + switch (command) { + + case NAND_CMD_NONE: + case NAND_CMD_PAGEPROG: + case NAND_CMD_ERASE1: + case NAND_CMD_ERASE2: + case NAND_CMD_SEQIN: + case NAND_CMD_STATUS: + case NAND_CMD_READID: + case NAND_CMD_SET_FEATURES: + return; + + case NAND_CMD_CACHEDPROG: + if (is_lp) + return; + break; + + case NAND_CMD_RNDIN: + if (is_lp) { + gpmi_ccs_delay(chip); + return; + } + break; + + case NAND_CMD_RESET: + if (chip->dev_ready) + break; + udelay(chip->chip_delay); + chip->cmd_ctrl(mtd, NAND_CMD_STATUS, + NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); + chip->cmd_ctrl(mtd, NAND_CMD_NONE, + NAND_NCE | NAND_CTRL_CHANGE); + /* EZ-NAND can take upto 250ms as per ONFi v4.0 */ + gpmi_wait_status_ready(mtd, 250); + return; + + case NAND_CMD_RNDOUT: + if (is_lp) { + /* No ready / busy check necessary */ + chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART, + NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); + chip->cmd_ctrl(mtd, NAND_CMD_NONE, + NAND_NCE | NAND_CTRL_CHANGE); + + gpmi_ccs_delay(chip); + return; + } + break; + + case NAND_CMD_READ0: + /* + * READ0 is sometimes used to exit GET STATUS mode. When this + * is the case no address cycles are requested, and we can use + * this information to detect that that we should not wait for + * the device to be ready and READSTART should not be issued. + */ + if (column == -1 && page_addr == -1) + return; + + if (is_lp) { + chip->cmd_ctrl(mtd, NAND_CMD_READSTART, + NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); + chip->cmd_ctrl(mtd, NAND_CMD_NONE, + NAND_NCE | NAND_CTRL_CHANGE); + } + /* Read commands must wait */ + break; + } + /* + * If we don't have access to the busy pin, we apply the given command + * delay. + */ + if (!chip->dev_ready) { + udelay(chip->chip_delay); + return; + } + + /* + * Apply this short delay always to ensure that we do wait tWB in + * any case on any machine. + */ + ndelay(100); + + nand_wait_ready(mtd); +} + + static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int oob_required, int page) { @@ -1912,6 +2116,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) chip->select_chip = gpmi_select_chip; chip->setup_data_interface = gpmi_setup_data_interface; chip->cmd_ctrl = gpmi_cmd_ctrl; + chip->cmdfunc = gpmi_nand_command; chip->dev_ready = gpmi_dev_ready; chip->read_byte = gpmi_read_byte; chip->read_buf = gpmi_read_buf; From patchwork Thu Apr 26 15:41:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905167 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="TcA6MSMT"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="04iEopaB"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1kQ1Ns3z9s06 for ; Fri, 27 Apr 2018 01:50:54 +1000 (AEST) 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=3L1m/FUtqQRQa+SnxJw2KPhXcQizPs3L2kMrK/g/Bv0=; b=TcA6MSMTj5kzcplqIfdv2AenlD 5JdaURqp/um7lDFmn0UYhYtyCwMXWrRZuS0kkpQnmhDRmGQzrvnv/pbQkuLDt7XS7/IUvZMCy8mZ7 jfvcqz3w1ofBriL4uvtHKilgafN6XqJvIkyw1rLCa4buO3xJGoyAPE/n7HOdgC9ahEbP4n0okBxGA fSq1yABZOPn0SJiDmHCKwZLbz1H2rN7rtSDt+l3KJJyEEatwa9llqzGcV18fIJM8Qb3uP2lGQkLEt Tm0HdXa8k/oq8Hdjw9JYFzTJxqwgx8eRzsPUDDzqIoP1NZY4J64t+Nu0ATC8ZzoZ4N2LpaffaJV20 BcGRgWug==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBjAR-0003OH-Gx; Thu, 26 Apr 2018 15:50:43 +0000 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2N-0005kP-8H for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:25 +0000 Received: by mail-wr0-x244.google.com with SMTP id p5-v6so29489776wre.12 for ; Thu, 26 Apr 2018 08:42:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RhvoKodQvkQcCPb/fzF7gikTNJ1YccdS4iEZKtiTSnM=; b=04iEopaB32UoqMpqAHwdQLziy4iUWweZq/TrfEXgQXK1szu1o3msPI41aQbJz9Z50K khxpcpBckPari/BZ++D+UPMEL1YAAAhr8a1CEJPf4k2IlLFT+hy816jENQmZuohOCC2a mPlPiHTJAUsYTR7E8abXxp2aPonYKP06fp4JYv4ulPLLa8ejB6FMq9/3gfmXe8/cnQ+g zQ8eT13sm+T7FQdnp2FmIKShtM46NKn0TESZd7GcDmJOkSSs5e59s3PbwV+PzOqINgL0 0IV7yG6CdRo4JqedDX1EAFAknW8GkvqigyFAb/3gu1jwQNFBjAPfeT3WIayA3O+BsA4t HkIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RhvoKodQvkQcCPb/fzF7gikTNJ1YccdS4iEZKtiTSnM=; b=GnIXfqhfqXBY+5Qt39DmprStrTNlGXZRCBdsfrXwwi2CGEooU2Pk2gxk60p8flx6R7 8k8DWm/DIMzMkmNTjJM81ti6gNdZHL2GlpWqroCRAEYIC5GyS0zRbFjAwcsLly1boOfy PTXQvLC4ARs4kJG3UPxsHTGcs4URgh39ngIzczQnFjxJC937xDaKxMyaX/OAwu5qggmv sPJNIjQSALPnzFBLsnT5omiiSL9Dux5/Mr1rO8q8zsCWuvQuK2KdGbbHQGK5UOWeAB7U b/Z7a5JOmyjM+i9zs0gyS4cPr4OCRZNw2VCSRL2XcODPMPOUHVLlYJNzKZSqh+SWxOyF /r9A== X-Gm-Message-State: ALQs6tCk+TaCaq9B1sAMYqLjdlgZ2k3mA6ebA56eS0lZ0CDqrN0vu1uy uzcO8VV5NFYg7tTWjBWs9Ygpz63l X-Google-Smtp-Source: AIpwx4+UaIcP45AhCInmktdMcvy3LDvpzTl8UE7l4KUF8Zlf6yap4DvVUolDuZCATek+V/ZKFwHIyg== X-Received: by 2002:adf:c6c7:: with SMTP id c7-v6mr27333240wrh.104.1524757331145; Thu, 26 Apr 2018 08:42:11 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:10 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 11/13] mtd: rawnand: gpmi: gpmi_nand_command(): simplification and formatting Date: Thu, 26 Apr 2018 17:41:32 +0200 Message-Id: <20180426154134.8270-12-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084223_399304_7B3DA2D4 X-CRM114-Status: GOOD ( 30.60 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:244 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: "Arnout Vandecappelle (Essensium/Mind)" The controller already takes care of waiting for tCCS when the RNDIN or RNDOUT command is sent. That is, the NAND_WAIT_TCCS option is not set for gpmi-nand. Therefore, the gpmi_ccs_delay() calls are not needed. Gpmi-nand implements the dev_ready function, so explicit delays are not needed for the RESET and READ0 commands. Therefore, the gpmi_wait_status_ready() function and the includes it brings in are not needed. The RESET command just falls through to the nand_wait_ready() call. Commands are send using DMA, and the DMA already waits for the ready/busy signal from the NAND. So no explicit delay and call to nand_wait_ready() is needed. This makes it possible to simplify the switch in gpmi_nand_command() a lot. Since gpmi-nand now implements cmdfunc, it is no longer needed to implement cmd_ctrl. Call gpmi_cmd_ctrl directly. gpmi_cmd_ctrl() has two "states": * ALE or CLE is set, in this case the command/control data is buffered. These calls are replaced with this->cmd_buffer[this->command_length++] = data; * ALE and CLE are not set, in this case the command is sent (DMA is started). These calls are replaced with ret = gpmi_send_command(this); if (ret) dev_err(this->dev, "Chip: %u, Error %d\n", this->current_chip, ret); this->command_length = 0; The 'ctrl' variable/parameter is not used. To enable chaining the two DMAs corresponding to the two commands that can be issued by gpmi_nand_command(), duplicate the cmd_sgl and command_length. For cmd_buffer, instead of duplicating it, we can use a fixed offset within the buffer. The appropriate sgl and command_length is passed to gpmi_send_command(), and the sg_init_one(), dma_map_sg() and dma_unmap_sg() calls are hoisted out of it. This is needed because the unmapping should only be done after both commands have finished. Signed-off-by: Sam Lefebvre Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 12 +- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 224 +++++++---------------------- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h | 9 +- 3 files changed, 64 insertions(+), 181 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index 1858afdb400d..46b2208df30e 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -548,11 +548,11 @@ int gpmi_is_ready(struct gpmi_nand_data *this, unsigned chip) return reg & mask; } -int gpmi_send_command(struct gpmi_nand_data *this) +int gpmi_send_command(struct gpmi_nand_data *this, struct scatterlist *sgl, + unsigned int command_length) { struct dma_chan *channel = get_dma_chan(this); struct dma_async_tx_descriptor *desc; - struct scatterlist *sgl; int chip = this->current_chip; int ret; u32 pio[3]; @@ -564,7 +564,7 @@ int gpmi_send_command(struct gpmi_nand_data *this) | BF_GPMI_CTRL0_LOCK_CS(LOCK_CS_ENABLE, this) | BF_GPMI_CTRL0_ADDRESS(BV_GPMI_CTRL0_ADDRESS__NAND_CLE) | BM_GPMI_CTRL0_ADDRESS_INCREMENT - | BF_GPMI_CTRL0_XFER_COUNT(this->command_length); + | BF_GPMI_CTRL0_XFER_COUNT(command_length); pio[1] = pio[2] = 0; desc = dmaengine_prep_slave_sg(channel, (struct scatterlist *)pio, @@ -573,10 +573,6 @@ int gpmi_send_command(struct gpmi_nand_data *this) return -EINVAL; /* [2] send out the COMMAND + ADDRESS string stored in @buffer */ - sgl = &this->cmd_sgl; - - sg_init_one(sgl, this->cmd_buffer, this->command_length); - dma_map_sg(this->dev, sgl, 1, DMA_TO_DEVICE); desc = dmaengine_prep_slave_sg(channel, sgl, 1, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); @@ -586,8 +582,6 @@ int gpmi_send_command(struct gpmi_nand_data *this) /* [3] submit the DMA */ ret = start_dma_without_bch_irq(this, desc); - dma_unmap_sg(this->dev, sgl, 1, DMA_TO_DEVICE); - return ret; } diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 91205573f2bc..81accbf175bf 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -19,13 +19,11 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include -#include #include #include #include #include #include -#include #include #include #include "gpmi-nand.h" @@ -801,40 +799,6 @@ static int gpmi_alloc_dma_buffer(struct gpmi_nand_data *this) return -ENOMEM; } -static void gpmi_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl) -{ - struct nand_chip *chip = mtd_to_nand(mtd); - struct gpmi_nand_data *this = nand_get_controller_data(chip); - int ret; - - /* - * Every operation begins with a command byte and a series of zero or - * more address bytes. These are distinguished by either the Address - * Latch Enable (ALE) or Command Latch Enable (CLE) signals being - * asserted. When MTD is ready to execute the command, it will deassert - * both latch enables. - * - * Rather than run a separate DMA operation for every single byte, we - * queue them up and run a single DMA operation for the entire series - * of command and data bytes. NAND_CMD_NONE means the END of the queue. - */ - if ((ctrl & (NAND_ALE | NAND_CLE))) { - if (data != NAND_CMD_NONE) - this->cmd_buffer[this->command_length++] = data; - return; - } - - if (!this->command_length) - return; - - ret = gpmi_send_command(this); - if (ret) - dev_err(this->dev, "Chip: %u, Error %d\n", - this->current_chip, ret); - - this->command_length = 0; -} - static int gpmi_dev_ready(struct mtd_info *mtd) { struct nand_chip *chip = mtd_to_nand(mtd); @@ -1106,44 +1070,6 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, return max_bitflips; } -static void gpmi_wait_status_ready(struct mtd_info *mtd, unsigned long timeo) -{ - register struct nand_chip *chip = mtd_to_nand(mtd); - int ret; - - timeo = jiffies + msecs_to_jiffies(timeo); - do { - u8 status; - - ret = nand_read_data_op(chip, &status, sizeof(status), true); - if (ret) - return; - - if (status & NAND_STATUS_READY) - break; - touch_softlockup_watchdog(); - } while (time_before(jiffies, timeo)); -}; - -static void gpmi_ccs_delay(struct nand_chip *chip) -{ - /* - * The controller already takes care of waiting for tCCS when the RNDIN - * or RNDOUT command is sent, return directly. - */ - if (!(chip->options & NAND_WAIT_TCCS)) - return; - - /* - * Wait tCCS_min if it is correctly defined, otherwise wait 500ns - * (which should be safe for all NANDs). - */ - if (chip->setup_data_interface) - ndelay(chip->data_interface.timings.sdr.tCCS_min / 1000); - else - ndelay(500); -} - /** * gpmi_nand_command - Send command to NAND device * @mtd: MTD device structure @@ -1157,10 +1083,14 @@ static void gpmi_nand_command(struct mtd_info *mtd, unsigned int command, int column, int page_addr) { register struct nand_chip *chip = mtd_to_nand(mtd); - int ctrl = NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE; + struct gpmi_nand_data *this = nand_get_controller_data(chip); + int ret; /* Large page devices (> 512 bytes) behave slightly differently. */ bool is_lp = mtd->writesize > 512; + BUG_ON(this->command_length != 0); + BUG_ON(this->command_length2 != 0); + if (is_lp) { /* Large page devices don't have the separate regions as we * have in the small page devices. We must emulate @@ -1185,126 +1115,81 @@ static void gpmi_nand_command(struct mtd_info *mtd, unsigned int command, column -= 256; readcmd = NAND_CMD_READ1; } - chip->cmd_ctrl(mtd, readcmd, ctrl); - ctrl &= ~NAND_CTRL_CHANGE; + this->cmd_buffer[this->command_length++] = readcmd; } /* Command latch cycle */ if (command != NAND_CMD_NONE) - chip->cmd_ctrl(mtd, command, ctrl); + this->cmd_buffer[this->command_length++] = command; - /* Address cycle, when necessary */ - ctrl = NAND_NCE | NAND_ALE | NAND_CTRL_CHANGE; /* Serially input address */ if (column != -1) { /* Adjust columns for 16 bit buswidth */ if (chip->options & NAND_BUSWIDTH_16 && !nand_opcode_8bits(command)) column >>= 1; - chip->cmd_ctrl(mtd, column, ctrl); - ctrl &= ~NAND_CTRL_CHANGE; + this->cmd_buffer[this->command_length++] = column; /* Only output a single addr cycle for 8bits opcodes. */ if (is_lp && !nand_opcode_8bits(command)) - chip->cmd_ctrl(mtd, column >> 8, ctrl); + this->cmd_buffer[this->command_length++] = column >> 8; } if (page_addr != -1) { - chip->cmd_ctrl(mtd, page_addr, ctrl); - ctrl &= ~NAND_CTRL_CHANGE; - chip->cmd_ctrl(mtd, page_addr >> 8, ctrl); + this->cmd_buffer[this->command_length++] = page_addr; + this->cmd_buffer[this->command_length++] = page_addr >> 8; if (chip->options & NAND_ROW_ADDR_3) - chip->cmd_ctrl(mtd, page_addr >> 16, ctrl); + this->cmd_buffer[this->command_length++] = page_addr >> 16; } - chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); - - /* - * Program and erase have their own busy handlers status, sequential - * in and status need no delay. - */ - switch (command) { - - case NAND_CMD_NONE: - case NAND_CMD_PAGEPROG: - case NAND_CMD_ERASE1: - case NAND_CMD_ERASE2: - case NAND_CMD_SEQIN: - case NAND_CMD_STATUS: - case NAND_CMD_READID: - case NAND_CMD_SET_FEATURES: - return; - - case NAND_CMD_CACHEDPROG: - if (is_lp) - return; - break; - case NAND_CMD_RNDIN: - if (is_lp) { - gpmi_ccs_delay(chip); - return; - } - break; - - case NAND_CMD_RESET: - if (chip->dev_ready) - break; - udelay(chip->chip_delay); - chip->cmd_ctrl(mtd, NAND_CMD_STATUS, - NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); - chip->cmd_ctrl(mtd, NAND_CMD_NONE, - NAND_NCE | NAND_CTRL_CHANGE); - /* EZ-NAND can take upto 250ms as per ONFi v4.0 */ - gpmi_wait_status_ready(mtd, 250); - return; - - case NAND_CMD_RNDOUT: - if (is_lp) { + /* Reuse the same cmd_buffer for the possible second command. The address + * must be word-aligned. For convenience, use a fixed offset of 64, much + * larger than the maximum command_length. */ + if (is_lp) + switch (command) { + case NAND_CMD_RNDOUT: /* No ready / busy check necessary */ - chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART, - NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); - chip->cmd_ctrl(mtd, NAND_CMD_NONE, - NAND_NCE | NAND_CTRL_CHANGE); + this->cmd_buffer[64 + this->command_length2++] = NAND_CMD_RNDOUTSTART; + break; - gpmi_ccs_delay(chip); - return; + case NAND_CMD_READ0: + /* + * READ0 is sometimes used to exit GET STATUS mode. When this + * is the case no address cycles are requested, and we can use + * this information to detect that that we should not wait for + * the device to be ready and READSTART should not be issued. + */ + if (column != -1 || page_addr != -1) + this->cmd_buffer[64 + this->command_length2++] = NAND_CMD_READSTART; + break; } - break; - case NAND_CMD_READ0: - /* - * READ0 is sometimes used to exit GET STATUS mode. When this - * is the case no address cycles are requested, and we can use - * this information to detect that that we should not wait for - * the device to be ready and READSTART should not be issued. - */ - if (column == -1 && page_addr == -1) - return; - - if (is_lp) { - chip->cmd_ctrl(mtd, NAND_CMD_READSTART, - NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); - chip->cmd_ctrl(mtd, NAND_CMD_NONE, - NAND_NCE | NAND_CTRL_CHANGE); - } - /* Read commands must wait */ - break; - } - /* - * If we don't have access to the busy pin, we apply the given command - * delay. - */ - if (!chip->dev_ready) { - udelay(chip->chip_delay); - return; + /* This starts the DMA for the command and waits for it to finish. */ + if (this->command_length > 0) { + sg_init_one(&this->cmd_sgl, this->cmd_buffer, this->command_length); + dma_map_sg(this->dev, &this->cmd_sgl, 1, DMA_TO_DEVICE); + ret = gpmi_send_command(this, &this->cmd_sgl, this->command_length); + if (ret) + dev_err(this->dev, "Chip: %u, Error %d\n", + this->current_chip, ret); } - /* - * Apply this short delay always to ensure that we do wait tWB in - * any case on any machine. - */ - ndelay(100); + if (this->command_length2 > 0) { + sg_init_one(&this->cmd_sgl2, this->cmd_buffer + 64, this->command_length2); + dma_map_sg(this->dev, &this->cmd_sgl2, 1, DMA_TO_DEVICE); + ret = gpmi_send_command(this, &this->cmd_sgl2, this->command_length2); + if (ret) + dev_err(this->dev, "Chip: %u, Error %d\n", + this->current_chip, ret); + } - nand_wait_ready(mtd); + if (this->command_length > 0) { + dma_unmap_sg(this->dev, &this->cmd_sgl, 1, DMA_TO_DEVICE); + this->command_length = 0; + } + if (this->command_length2 > 0) { + dma_unmap_sg(this->dev, &this->cmd_sgl2, 1, DMA_TO_DEVICE); + this->command_length2 = 0; + } } @@ -2115,7 +2000,6 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) nand_set_flash_node(chip, this->pdev->dev.of_node); chip->select_chip = gpmi_select_chip; chip->setup_data_interface = gpmi_setup_data_interface; - chip->cmd_ctrl = gpmi_cmd_ctrl; chip->cmdfunc = gpmi_nand_command; chip->dev_ready = gpmi_dev_ready; chip->read_byte = gpmi_read_byte; diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h index 6aa10d6962d6..9dc3dd16fa0b 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h @@ -139,11 +139,15 @@ struct gpmi_nand_data { /* General-use Variables */ int current_chip; - unsigned int command_length; + unsigned int command_length; struct scatterlist cmd_sgl; char *cmd_buffer; + unsigned int command_length2; + struct scatterlist cmd_sgl2; + char *cmd_buffer2; + struct scatterlist data_sgl; char *data_buffer_dma; @@ -184,7 +188,8 @@ void gpmi_clear_bch(struct gpmi_nand_data *); void gpmi_dump_info(struct gpmi_nand_data *); int bch_set_geometry(struct gpmi_nand_data *); int gpmi_is_ready(struct gpmi_nand_data *, unsigned chip); -int gpmi_send_command(struct gpmi_nand_data *); +int gpmi_send_command(struct gpmi_nand_data *, struct scatterlist *sgl, + unsigned int command_length); int gpmi_enable_clk(struct gpmi_nand_data *this); int gpmi_disable_clk(struct gpmi_nand_data *this); int gpmi_setup_data_interface(struct mtd_info *mtd, int chipnr, From patchwork Thu Apr 26 15:41:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905172 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="c4F9m1Q3"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="PSGXmS8S"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1m50mKFz9s08 for ; Fri, 27 Apr 2018 01:52:21 +1000 (AEST) 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=LpYhMizurdYSM3OGjqFeyVfn5+iJY5lI4YiiqNrVFco=; b=c4F9m1Q356EId+JUlBLrNlfKdx ohX8dS887C8v+WSRGF4eEqHiZUsziDNJbQUnf6CYP2T5kmaMK273RyYcd4RuiA5MwC92xsHaU97ST MNo+zyCoe5ZPUGMuG6kemhiniQr3iAvCOXeARomzN+ZFd1oy51H4r9UsLGPZkmMnD0g5BeN8UhoHO whU9ui2rRiGgPL9AkgbJRmEHLGW+lJEBFmlkaIBnleWb8/3Dbtc4IbltTtuiEcEjlxjLfyvZmp7rz P2lln3mwNI67Yz0Qh7+06ui9mtMlBRXP+kwMT0eUwJZfW6kUC+lSU9WEzbwqrXSyP/j0iSx52VAua FhUrGymw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBjBr-0003yo-0h; Thu, 26 Apr 2018 15:52:11 +0000 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2P-0005lM-0S for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:26 +0000 Received: by mail-wr0-x243.google.com with SMTP id v5-v6so6503064wrf.9 for ; Thu, 26 Apr 2018 08:42:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dlC1ntnZqo3xDZSc5/354Zpp8Tdp1PMgL4d8+TGsqow=; b=PSGXmS8Sj5dwfUUoEfWL9EK2j9EW4FWCPtG4X1Ne8RQMK/T8IReIdAlpmcAnZNyvuO laO8ZAvb+fwj7l3TFTBlo/e+8g0V4676/6pzF0azDiv9UoDBL/8s5Ji229Awux/YUgSb yVc1wdKXQ2KiKv5kXRYPOZVYUeCXUxxm0iyVkPGyCG/c+1Sn4k9fEe+M4EtTRu8mSOCX 5Q7tGieTJyuwj/Q30TLOUYrElWVc5aAMSiAouhizbCBHeY1U6Vnxd5RlWFSiHZnBU4Ql z+swp3F7m8M+SA+peUYbJLvnI18aFVjo7ZOeLdfdtubMese36IqFHN53B9k1i6BZ0NFg dz5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dlC1ntnZqo3xDZSc5/354Zpp8Tdp1PMgL4d8+TGsqow=; b=rXgdDdXNExcmRb6qJgiSTEBK6++WlJSQzdfF/aPO/QlckHnh8xLiVeBMIT56oZ/AO5 vctVKzJhwMbaISDVclAC3f3rUBVLWsock/xr/QXvS3XJTgTgVEICy5dWxlE61RRZMVP9 9LlIzYNEqTpJDzOwWxD4E9ZzJrMLqd2R0wEeoZJrQAMOCoAdI9UVRvxkmAr+ajTZ28Vt 7F/c4CYo9i2hDjMDtUbP56vrm4plIBigeX6rHpD/Fu2lPWz/gEiBPmze7qNee3Ig5IMt EvyqqigdgkaG5hrA3z9xzJ4gF/VhL98bRa3dAYA8EUr47d6tkTYL7z8/mg5lf/VE4R4p Erpg== X-Gm-Message-State: ALQs6tAmLLQN2SQi1+R0zVSw8fpkvxbeuNiYgPfHAQyYYutkGyVHHqAr BurM5BZXWua41pHkc2iwYMV9vQo0 X-Google-Smtp-Source: AIpwx48jASg2O2BFi7WWuGIzq0SenUsSm43M7g2PHI4NmyO7Di8sflp/4OsnDxwl4z+ZnvzweFU+lg== X-Received: by 2002:adf:992d:: with SMTP id x42-v6mr29314513wrb.145.1524757333020; Thu, 26 Apr 2018 08:42:13 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:12 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 12/13] mtd: rawnand: gpmi: issue two commands in a single DMA chain Date: Thu, 26 Apr 2018 17:41:33 +0200 Message-Id: <20180426154134.8270-13-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084225_089828_4C8C2160 X-CRM114-Status: GOOD ( 16.06 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:243 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org gpmi_nand_command() may issue two commands. Instead of issuing them as separate DMAs, chain them together and issue only a single DMA. This removes one DMA interrupt and associated overhead. For full-page reads with ECC, it reduces the number of interrupts from 4 per page to 3 per page (2 DMA interrupts + 1 BCH interrupt). Signed-off-by: Sam Lefebvre Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 12 +++++++----- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 8 +++++--- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index 46b2208df30e..8f5a2a242228 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -549,12 +549,12 @@ int gpmi_is_ready(struct gpmi_nand_data *this, unsigned chip) } int gpmi_send_command(struct gpmi_nand_data *this, struct scatterlist *sgl, - unsigned int command_length) + unsigned int command_length, bool chain, bool start_dma) { struct dma_chan *channel = get_dma_chan(this); struct dma_async_tx_descriptor *desc; int chip = this->current_chip; - int ret; + int ret = 0; u32 pio[3]; /* [1] send out the PIO words */ @@ -568,7 +568,8 @@ int gpmi_send_command(struct gpmi_nand_data *this, struct scatterlist *sgl, pio[1] = pio[2] = 0; desc = dmaengine_prep_slave_sg(channel, (struct scatterlist *)pio, - ARRAY_SIZE(pio), DMA_TRANS_NONE, 0); + ARRAY_SIZE(pio), DMA_TRANS_NONE, + chain ? DMA_PREP_INTERRUPT : 0); if (!desc) return -EINVAL; @@ -579,8 +580,9 @@ int gpmi_send_command(struct gpmi_nand_data *this, struct scatterlist *sgl, if (!desc) return -EINVAL; - /* [3] submit the DMA */ - ret = start_dma_without_bch_irq(this, desc); + if (start_dma) + /* [3] submit the DMA */ + ret = start_dma_without_bch_irq(this, desc); return ret; } diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 81accbf175bf..49599d6dd841 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -1163,11 +1163,12 @@ static void gpmi_nand_command(struct mtd_info *mtd, unsigned int command, break; } - /* This starts the DMA for the command and waits for it to finish. */ + /* Chain the two commands, start the DMA and wait for it to finish. */ if (this->command_length > 0) { sg_init_one(&this->cmd_sgl, this->cmd_buffer, this->command_length); dma_map_sg(this->dev, &this->cmd_sgl, 1, DMA_TO_DEVICE); - ret = gpmi_send_command(this, &this->cmd_sgl, this->command_length); + ret = gpmi_send_command(this, &this->cmd_sgl, this->command_length, + false, this->command_length2 == 0); if (ret) dev_err(this->dev, "Chip: %u, Error %d\n", this->current_chip, ret); @@ -1176,7 +1177,8 @@ static void gpmi_nand_command(struct mtd_info *mtd, unsigned int command, if (this->command_length2 > 0) { sg_init_one(&this->cmd_sgl2, this->cmd_buffer + 64, this->command_length2); dma_map_sg(this->dev, &this->cmd_sgl2, 1, DMA_TO_DEVICE); - ret = gpmi_send_command(this, &this->cmd_sgl2, this->command_length2); + ret = gpmi_send_command(this, &this->cmd_sgl2, this->command_length2, + this->command_length > 0, true); if (ret) dev_err(this->dev, "Chip: %u, Error %d\n", this->current_chip, ret); diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h index 9dc3dd16fa0b..a09ec300754f 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h @@ -189,7 +189,7 @@ void gpmi_dump_info(struct gpmi_nand_data *); int bch_set_geometry(struct gpmi_nand_data *); int gpmi_is_ready(struct gpmi_nand_data *, unsigned chip); int gpmi_send_command(struct gpmi_nand_data *, struct scatterlist *sgl, - unsigned int command_length); + unsigned int command_length, bool chain, bool start_dma); int gpmi_enable_clk(struct gpmi_nand_data *this); int gpmi_disable_clk(struct gpmi_nand_data *this); int gpmi_setup_data_interface(struct mtd_info *mtd, int chipnr, From patchwork Thu Apr 26 15:41:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Lefebvre X-Patchwork-Id: 905169 X-Patchwork-Delegate: boris.brezillon@free-electrons.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=essensium.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="WG1OoqOR"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=essensium-com.20150623.gappssmtp.com header.i=@essensium-com.20150623.gappssmtp.com header.b="V3Zzkslh"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 40X1lC3lnKz9s06 for ; Fri, 27 Apr 2018 01:51:35 +1000 (AEST) 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=yWXVPdGGz1YDg+cn3fKj6S9iOL5TqDkU3l7J5KNjISI=; b=WG1OoqORt24+UFXnBXnNIDkPAg ZKzXoVfVdUKaPyxZ7Ay+DV87tC8VZX0KcYcS9LH5kS6oM8b691aCEHsVcy/f4/EQeP/7kdTVTEFZP ZTlLfDNsfMG5tBotSHynYvNrYNmjKQqSeY7g52zW7yzLiJhjZ+tx22hQZp2L3b/dnVb5yYsa+7/dR /GfO157tCIanQwPI2livHqaaAE2Q/TgkGWPVtOhtl+vCN6wjOXC0y799gfbJT+jdTy0djccHsIGZ6 vTTf6MwdLNXBRx+QLS2zm6Gkzf42h8O6qiWAPfdEquaBJe6zusTEO4K1IEx4zTOuZuApHgaaI284K iQhyPlUg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBjB7-0003gZ-CK; Thu, 26 Apr 2018 15:51:25 +0000 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fBj2O-0005mD-Vu for linux-mtd@lists.infradead.org; Thu, 26 Apr 2018 15:42:28 +0000 Received: by mail-wr0-x243.google.com with SMTP id p18-v6so38068972wrm.1 for ; Thu, 26 Apr 2018 08:42:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=essensium-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AySF7Vte4ls7n3ZW1uQo9N9Xbi1g9E9MeVhFS+OaQnA=; b=V3ZzkslhInibB/MzgVcE4gsb+X3jeeteX1aiIqWKhjempH7Te470OoTMgmwZcYGGRG vwLkzaUAwWYqJf9zMd8GQB5M27F/FIEGZmynLVb+TAhqjPec7BX3N4cE9gjmm/zeE0NW 5LIvimaE0fb0c6nlysCmluKDa6sCT8/t3WTSBdfEFjNqUO1Hz10lJlq22VVVfwFjNtOJ rOwZbQZ88c81IwvHWzazzm1Nw3SBfy+6c5ADY0nwfDMCPxexBY2yK9NPMfKCLOXZ6RMQ g7FrTaLgW5lddlv/ZD2AvbUXgpwpy0srMw2cgndZmXdlwjzEuihMQ+1ElSdypSQGOfjG /Cgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AySF7Vte4ls7n3ZW1uQo9N9Xbi1g9E9MeVhFS+OaQnA=; b=lfTnFF/AewfWC0lOHU+ylQVga+TeBZI8ihjxq+9EFk3eaGLLuNYe4mRnDSFz9TcJnn +SrMUQkKUhAo+TJZdc11SeekkuHJO4LyLr0z74E6kEEWtgJ9KAibWcCzg23PVoviXNd7 acGcoT5AuhoyJ6jS35n4mYN0j7gxrqfCiADSgHwouudV9Xf6jV3hBb7akavx8yIffErz kEWMik9PusI8HfyK1FeddZvsIlGa+QxIblxNB7FsAn31uaR1kplDsIaCdFFZnTk2g5Va gciHwu5agOQ+A4a+elsZAow/VqNCQzTDax3cUUMWosj1HR1qbpgivbxzNc8z03rdoj9g 8xeA== X-Gm-Message-State: ALQs6tAUHQ7ZQM8qG/+CSdseqQF5wMNPd6XZejYn6O57lUNjYTcFv6IJ 4UhF9Hoorm1uUA06UyyLjJVH9WWA X-Google-Smtp-Source: AB8JxZqf/dCrRjUnk/WwfgufasfELbJ1IprZYhVJT3viIwaWncNxyGvREqR1MQltCbfBoT+KUKjxRA== X-Received: by 2002:adf:a3d7:: with SMTP id m23-v6mr10503775wrb.209.1524757334696; Thu, 26 Apr 2018 08:42:14 -0700 (PDT) Received: from Darth.local.ess-mail.com (178-118-196-9.access.telenet.be. [178.118.196.9]) by smtp.gmail.com with ESMTPSA id n23-v6sm19916031wra.39.2018.04.26.08.42.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Apr 2018 08:42:13 -0700 (PDT) From: Sam Lefebvre To: linux-mtd@lists.infradead.org Subject: [PATCH 13/13] mtd: rawnand: gmpi: chain gpmi_nand_command() with gpmi_ecc_read_page_data() Date: Thu, 26 Apr 2018 17:41:34 +0200 Message-Id: <20180426154134.8270-14-sam.lefebvre@essensium.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180426154134.8270-1-sam.lefebvre@essensium.com> References: <20180426154134.8270-1-sam.lefebvre@essensium.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180426_084225_071974_F880709A X-CRM114-Status: GOOD ( 16.87 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:400c:c0c:0:0:0:243 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -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 -0.0 T_DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: Arnout Vandecapelle , Sam Lefebvre , Dries Staelens MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org An additional interrupt can be avoided in the page and subpage read operations by adding a flag start_dma to indicate weather gpmi_nand_command() needs to be chained with other dma commands or not. In case of chaining, gpmi_read_page() gets a flag that adds: DMA_PREP_INTERRUPT: chain the dma with previous one DMA_PREP_PQ_DISABLE_P: wait for prefetching being ready before reading, turns on the CCW_WAIT4RDY flag. Signed-off-by: Sam Lefebvre --- drivers/dma/mxs-dma.c | 3 +++ drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c | 6 ++++-- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 12 ++++++++++-- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h | 3 ++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c index 41d167921fab..cb13fc759f97 100644 --- a/drivers/dma/mxs-dma.c +++ b/drivers/dma/mxs-dma.c @@ -82,6 +82,7 @@ #define CCW_CHAIN (1 << 2) #define CCW_IRQ (1 << 3) #define CCW_DEC_SEM (1 << 6) +#define CCW_WAIT4RDY (1 << 5) #define CCW_WAIT4END (1 << 7) #define CCW_HALT_ON_TERM (1 << 8) #define CCW_TERM_FLUSH (1 << 9) @@ -551,6 +552,8 @@ static struct dma_async_tx_descriptor *mxs_dma_prep_slave_sg( ccw->bits |= CCW_TERM_FLUSH; ccw->bits |= BF_CCW(sg_len, PIO_NUM); ccw->bits |= BF_CCW(MXS_DMA_CMD_NO_XFER, COMMAND); + if (flags & DMA_PREP_PQ_DISABLE_P) + ccw->bits |= CCW_WAIT4RDY; } else { for_each_sg(sgl, sg, sg_len, i) { if (sg_dma_len(sg) > MAX_XFER_BYTES) { diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c index 8f5a2a242228..a8d09214b44c 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c @@ -716,7 +716,8 @@ int gpmi_send_page(struct gpmi_nand_data *this, } int gpmi_read_page(struct gpmi_nand_data *this, - dma_addr_t payload, dma_addr_t auxiliary) + dma_addr_t payload, dma_addr_t auxiliary, + bool chain) { struct bch_geometry *geo = &this->bch_geometry; uint32_t command_mode; @@ -741,7 +742,8 @@ int gpmi_read_page(struct gpmi_nand_data *this, pio[1] = 0; desc = dmaengine_prep_slave_sg(channel, (struct scatterlist *)pio, 2, - DMA_TRANS_NONE, 0); + DMA_TRANS_NONE, + chain ? DMA_PREP_INTERRUPT | DMA_PREP_PQ_DISABLE_P : 0); if (!desc) return -EINVAL; diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 49599d6dd841..80cc85755582 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -952,7 +952,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip, } /* go! */ - ret = gpmi_read_page(this, payload_phys, this->auxiliary_phys); + ret = gpmi_read_page(this, payload_phys, this->auxiliary_phys, true); if (direct) dma_unmap_single(this->dev, payload_phys, nfc_geo->payload_size, @@ -1178,12 +1178,14 @@ static void gpmi_nand_command(struct mtd_info *mtd, unsigned int command, sg_init_one(&this->cmd_sgl2, this->cmd_buffer + 64, this->command_length2); dma_map_sg(this->dev, &this->cmd_sgl2, 1, DMA_TO_DEVICE); ret = gpmi_send_command(this, &this->cmd_sgl2, this->command_length2, - this->command_length > 0, true); + this->command_length > 0, this->start_dma); if (ret) dev_err(this->dev, "Chip: %u, Error %d\n", this->current_chip, ret); } + this->start_dma = 1; + if (this->command_length > 0) { dma_unmap_sg(this->dev, &this->cmd_sgl, 1, DMA_TO_DEVICE); this->command_length = 0; @@ -1198,6 +1200,8 @@ static void gpmi_nand_command(struct mtd_info *mtd, unsigned int command, static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int oob_required, int page) { + struct gpmi_nand_data *this = nand_get_controller_data(chip); + this->start_dma = 0; nand_read_page_op(chip, page, 0, NULL, 0); return gpmi_ecc_read_page_data(chip, buf, oob_required, page); @@ -1251,6 +1255,7 @@ static int gpmi_ecc_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, buf = buf + first * size; } + this->start_dma = 0; nand_read_page_op(chip, page, col, NULL, 0); /* Save the old environment */ @@ -1993,6 +1998,9 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) /* init current chip */ this->current_chip = -1; + /* init dma */ + this->start_dma = true; + /* init the MTD data structures */ mtd->name = "gpmi-nand"; mtd->dev.parent = this->dev; diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h index a09ec300754f..c4a6e100c07f 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h @@ -167,6 +167,7 @@ struct gpmi_nand_data { #define DMA_CHANS 8 struct dma_chan *dma_chans[DMA_CHANS]; struct completion dma_done; + bool start_dma; /* private */ void *private; @@ -201,7 +202,7 @@ int gpmi_send_data(struct gpmi_nand_data *, const void *buf, int len); int gpmi_send_page(struct gpmi_nand_data *, dma_addr_t payload, dma_addr_t auxiliary); int gpmi_read_page(struct gpmi_nand_data *, - dma_addr_t payload, dma_addr_t auxiliary); + dma_addr_t payload, dma_addr_t auxiliary, bool chain); void gpmi_copy_bits(u8 *dst, size_t dst_bit_off, const u8 *src, size_t src_bit_off,