mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: barebox@lists.infradead.org
Subject: [PATCH 03/12] nand_imx: Speed up sequential read
Date: Mon, 29 Mar 2010 11:36:14 +0200	[thread overview]
Message-ID: <1269855383-22716-4-git-send-email-s.hauer@pengutronix.de> (raw)
In-Reply-To: <1269855383-22716-1-git-send-email-s.hauer@pengutronix.de>

When reading a page from nand prefetch the next page afterwards to
keep the controller busy. This way we can improve sequential reading
from NAND which is the common case for barebox.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/nand/nand_imx.c |   60 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 47 insertions(+), 13 deletions(-)

diff --git a/drivers/nand/nand_imx.c b/drivers/nand/nand_imx.c
index da9b2d5..5f92e2f 100644
--- a/drivers/nand/nand_imx.c
+++ b/drivers/nand/nand_imx.c
@@ -295,7 +295,7 @@ static void __nand_boot_init noinline send_addr(struct imx_nand_host *host, u16
  * @param       spare_only    set true if only the spare area is transferred
  */
 static void __nand_boot_init send_page(struct imx_nand_host *host,
-		unsigned int ops)
+		unsigned int ops, int wait)
 {
 	int bufs, i;
 
@@ -311,7 +311,8 @@ static void __nand_boot_init send_page(struct imx_nand_host *host,
 		writew(ops, host->regs + NFC_CONFIG2);
 
 		/* Wait for operation to complete */
-		wait_op_done(host);
+		if (wait)
+			wait_op_done(host);
 	}
 }
 
@@ -671,11 +672,17 @@ static void imx_nand_command(struct mtd_info *mtd, unsigned command,
 {
 	struct nand_chip *nand_chip = mtd->priv;
 	struct imx_nand_host *host = nand_chip->priv;
+	static int cached = -1;
 
 	MTD_DEBUG(MTD_DEBUG_LEVEL3,
 	      "imx_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
 	      command, column, page_addr);
 
+	if (cached != -1)
+		wait_op_done(host);
+	if (command != NAND_CMD_READ0)
+		cached = -1;
+
 	/*
 	 * Reset command state information
 	 */
@@ -702,17 +709,44 @@ static void imx_nand_command(struct mtd_info *mtd, unsigned command,
 
 		command = NAND_CMD_READ0;
 
-		send_cmd(host, command);
-		mxc_do_addr_cycle(mtd, column, page_addr);
+		if (cached == page_addr) {
+			memcpy32(host->data_buf, host->main_area0, mtd->writesize);
+			copy_spare(mtd, 1);
 
-		if (host->pagesize_2k)
-			/* send read confirm command */
-			send_cmd(host, NAND_CMD_READSTART);
+			send_cmd(host, command);
+			mxc_do_addr_cycle(mtd, column, page_addr + 1);
+
+			if (host->pagesize_2k)
+				/* send read confirm command */
+				send_cmd(host, NAND_CMD_READSTART);
+
+			send_page(host, NFC_OUTPUT, 0);
 
-		send_page(host, NFC_OUTPUT);
+			cached = page_addr + 1;
+		} else {
+			host->buf_start = column;
+			send_cmd(host, command);
+			mxc_do_addr_cycle(mtd, column, page_addr);
+
+			if (host->pagesize_2k)
+				/* send read confirm command */
+				send_cmd(host, NAND_CMD_READSTART);
+
+			send_page(host, NFC_OUTPUT, 1);
+			memcpy32(host->data_buf, host->main_area0, mtd->writesize);
+			copy_spare(mtd, 1);
+
+			send_cmd(host, command);
+			mxc_do_addr_cycle(mtd, column, page_addr + 1);
+
+			if (host->pagesize_2k)
+				/* send read confirm command */
+				send_cmd(host, NAND_CMD_READSTART);
+
+			send_page(host, NFC_OUTPUT, 0);
+			cached = page_addr + 1;
+		}
 
-		memcpy32(host->data_buf, host->main_area0, mtd->writesize);
-		copy_spare(mtd, 1);
 		break;
 
 	case NAND_CMD_SEQIN:
@@ -749,7 +783,7 @@ static void imx_nand_command(struct mtd_info *mtd, unsigned command,
 	case NAND_CMD_PAGEPROG:
 		memcpy32(host->main_area0, host->data_buf, mtd->writesize);
 		copy_spare(mtd, 0);
-		send_page(host, NFC_INPUT);
+		send_page(host, NFC_INPUT, 1);
 		send_cmd(host, command);
 		mxc_do_addr_cycle(mtd, column, page_addr);
 		break;
@@ -850,7 +884,7 @@ static int __init imxnd_probe(struct device_d *dev)
 #endif
 	/* Allocate memory for MTD device structure and private data */
 	host = kzalloc(sizeof(struct imx_nand_host) + NAND_MAX_PAGESIZE +
-			NAND_MAX_OOBSIZE, GFP_KERNEL);
+			NAND_MAX_OOBSIZE * 2, GFP_KERNEL);
 	if (!host)
 		return -ENOMEM;
 
@@ -1137,7 +1171,7 @@ void __nand_boot_init imx_nand_load_image(void *dest, int size)
 					page * pagesize);
 			if (host.pagesize_2k)
 				send_cmd(&host, NAND_CMD_READSTART);
-			send_page(&host, NFC_OUTPUT);
+			send_page(&host, NFC_OUTPUT, 1);
 			page++;
 
 			if (host.pagesize_2k) {
-- 
1.7.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  parent reply	other threads:[~2010-03-29  9:37 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-29  9:36 Patches for next merge window Sascha Hauer
2010-03-29  9:36 ` [PATCH 01/12] ARM zImage: do memmap if possible Sascha Hauer
2010-03-29 18:47   ` Peter Korsgaard
2010-03-30  9:20     ` Sascha Hauer
2010-03-30 10:01       ` Peter Korsgaard
2010-03-30 12:18         ` Sascha Hauer
2010-03-29  9:36 ` [PATCH 02/12] nand_imx: use optimized memcpy Sascha Hauer
2010-03-29  9:36 ` Sascha Hauer [this message]
2010-03-29  9:36 ` [PATCH 04/12] imx_nand: use memcpy for copying from/to buffer Sascha Hauer
2010-03-29 10:42   ` Ivo Clarysse
2010-03-29  9:36 ` [PATCH 05/12] add unaligned access support Sascha Hauer
2010-03-29  9:36 ` [PATCH 06/12] add unlzo support Sascha Hauer
2010-03-30 11:04   ` Sascha Hauer
2010-03-29  9:36 ` [PATCH 07/12] add snprintf function Sascha Hauer
2010-03-29  9:36 ` [PATCH 08/12] echo: add -e option support Sascha Hauer
2010-03-30 11:45   ` Peter Korsgaard
2010-03-30 12:17     ` Sascha Hauer
2010-03-29  9:36 ` [PATCH 09/12] add process_escape_sequence function Sascha Hauer
2010-03-29  9:36 ` [PATCH 10/12] echo command: Add -e option Sascha Hauer
2010-03-29  9:36 ` [PATCH 11/12] hush: only remove backslashes introduced from glob Sascha Hauer
2010-03-29 10:00   ` Sascha Hauer
2010-03-29  9:36 ` [PATCH 12/12] hush: allow fancy prompts Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1269855383-22716-4-git-send-email-s.hauer@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox