linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Walter <dwalter@sigma-star.at>
To: linux-mtd@lists.infradead.org
Cc: linux-kernel@vger.kernel.org, computersforpeace@gmail.com,
	dwmw2@infradead.org, boris.brezillon@free-electrons.com,
	Richard Weinberger <richard@nod.at>
Subject: [PATCH v2 27/46] mtd: nandsim: Add no_oob mode
Date: Wed, 21 Sep 2016 11:52:39 +0200	[thread overview]
Message-ID: <841fb44617cbab08601de74159c374613d4b73a4.1474450296.git.dwalter@sigma-star.at> (raw)
In-Reply-To: <cover.1474450295.git.dwalter@sigma-star.at>

From: Richard Weinberger <richard@nod.at>

This allows using a nanddump image directly as file backend.
The use case is dumping without OOB from a real device,
startup nandsim with the same NAND ID an use the file.

That way NAND dumps can loaded into nandsim much faster
since no nandwrite is needed and, of course, less RAM is
consumed.

no_oob tells nandsim to not write nor read OOB data
from the backing file. If OOB data is requested it simply
returns 0xff.
This also means that no ECC is performed.

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 drivers/mtd/nand/nandsim.c  | 66 ++++++++++++++++++++++++++++++++++++++-------
 include/linux/mtd/nandsim.h |  1 +
 2 files changed, 58 insertions(+), 9 deletions(-)

diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c
index 7a95802..c93d946 100644
--- a/drivers/mtd/nand/nandsim.c
+++ b/drivers/mtd/nand/nandsim.c
@@ -221,7 +221,7 @@ MODULE_PARM_DESC(defaults,	 "Register a MTD during module load using default val
 
 /* Calculate the page offset in flash RAM image by (row, column) address */
 #define NS_RAW_OFFSET(ns) \
-	(((ns)->regs.row * (ns)->geom.pgszoob) + (ns)->regs.column)
+	(((ns)->regs.row * ((ns)->no_oob ? (ns)->geom.pgsz : (ns)->geom.pgszoob)) + (ns)->regs.column)
 
 /* Calculate the OOB offset in flash RAM image by (row, column) address */
 #define NS_RAW_OFFSET_OOB(ns) (NS_RAW_OFFSET(ns) + ns->geom.pgsz)
@@ -360,6 +360,7 @@ struct nandsim {
                 int wp;  /* write Protect */
         } lines;
 
+	bool no_oob;
 	struct ns_backend_ops *bops;
 	void *backend_data;
 
@@ -1713,6 +1714,25 @@ static void ns_file_read_page(struct nandsim *ns, int num)
 
 	NS_DBG("read_page: page %d written, reading from %d\n",
 		ns->regs.row, ns->regs.column + ns->regs.off);
+
+	if (ns->no_oob) {
+		loff_t pg_read_end = ns->regs.column + ns->regs.off + num;
+
+		/* direct read from OOB */
+		if (ns->regs.column + ns->regs.off >= ns->geom.pgsz) {
+			memset(ns->buf.byte, 0xff, num);
+			return;
+		}
+
+		/* read overlapps into OOB, needs fixup */
+		if (pg_read_end > ns->geom.pgsz) {
+			loff_t oob_part = pg_read_end - ns->geom.pgsz;
+
+			memset(ns->buf.byte + pg_read_end - oob_part, 0xff, oob_part);
+			num -= oob_part;
+		}
+	}
+
 	pos = (loff_t)NS_RAW_OFFSET(ns) + ns->regs.off;
 	tx = kernel_read(data->file, pos, ns->buf.byte, num);
 	if (tx == 0)
@@ -1756,14 +1776,15 @@ static void ns_file_erase_sector(struct nandsim *ns)
 	int i;
 	loff_t pos;
 	ssize_t tx;
+	unsigned int pagesz = ns->no_oob ? ns->geom.pgsz : ns->geom.pgszoob;
 	struct ns_file_data *data = ns->backend_data;
 
-	memset(data->file_buf, 0xff, ns->geom.pgszoob);
+	memset(data->file_buf, 0xff, pagesz);
 
 	for (i = 0; i < ns->geom.pgsec; i++) {
-		pos = (loff_t)(ns->regs.row + i) * ns->geom.pgszoob;
-		tx = kernel_write(data->file, data->file_buf, ns->geom.pgszoob, pos);
-		if (tx != ns->geom.pgszoob) {
+		pos = (loff_t)(ns->regs.row + i) * pagesz;
+		tx = kernel_write(data->file, data->file_buf, pagesz, pos);
+		if (tx != pagesz) {
 			NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx);
 		}
 	}
@@ -1852,6 +1873,18 @@ static int ns_file_prog_page(struct nandsim *ns, int num)
 
 	NS_DBG("prog_page: writing page %d\n", ns->regs.row);
 
+	if (ns->no_oob) {
+		loff_t pg_write_end = ns->regs.column + ns->regs.off + num;
+
+		/* direct write into oob */
+		if (ns->regs.column + ns->regs.off >= ns->geom.pgsz)
+			return 0;
+
+		/* write overlapps into OOB, needs fixup */
+		if (pg_write_end > ns->geom.pgsz)
+			num -= pg_write_end - ns->geom.pgsz;
+	}
+
 	pg_off = data->file_buf + ns->regs.column + ns->regs.off;
 	off = (loff_t)NS_RAW_OFFSET(ns) + ns->regs.off;
 
@@ -2001,7 +2034,11 @@ static int do_state_action(struct nandsim *ns, uint32_t action)
 			return -1;
 		}
 
-		num = ns->geom.pgszoob - ns->regs.off - ns->regs.column;
+		if (ns->no_oob)
+			num = ns->geom.pgsz - ns->regs.off - ns->regs.column;
+		else
+			num = ns->geom.pgszoob - ns->regs.off - ns->regs.column;
+
 		if (num != ns->regs.count) {
 			NS_ERR("do_state_action: too few bytes were input (%d instead of %d)\n",
 					ns->regs.count, num);
@@ -2535,6 +2572,7 @@ static int ns_ctrl_new_instance(struct ns_new_instance_req *req)
 	memcpy(nsparam->id_bytes, req->id_bytes, sizeof(nsparam->id_bytes));
 	nsparam->bus_width = req->bus_width;
 	nsparam->file_fd = req->file_fd;
+	nsparam->no_oob = !!req->no_oob;
 
 	switch (req->backend) {
 		case NANDSIM_BACKEND_RAM:
@@ -2716,8 +2754,6 @@ struct mtd_info *ns_new_instance(struct nandsim_params *nsparam)
 	chip->write_buf  = ns_nand_write_buf;
 	chip->read_buf   = ns_nand_read_buf;
 	chip->read_word  = ns_nand_read_word;
-	chip->ecc.mode   = NAND_ECC_SOFT;
-	chip->ecc.algo   = NAND_ECC_HAMMING;
 	/* The NAND_SKIP_BBTSCAN option is necessary for 'overridesize' */
 	/* and 'badblocks' parameters to work */
 	chip->options   |= NAND_SKIP_BBTSCAN;
@@ -2784,7 +2820,16 @@ struct mtd_info *ns_new_instance(struct nandsim_params *nsparam)
 		goto error;
 	}
 
-	if (nsparam->bch) {
+	if (nsparam->no_oob) {
+		if (nsparam->bch) {
+			NS_ERR("Cannot use ECC without OOB\n");
+			retval = -EINVAL;
+			goto error;
+		}
+
+		chip->ecc.mode = NAND_ECC_NONE;
+		nand->no_oob = true;
+	} else if (nsparam->bch) {
 		unsigned int eccsteps, eccbytes;
 		if (!mtd_nand_has_bch()) {
 			NS_ERR("BCH ECC support is disabled\n");
@@ -2811,6 +2856,9 @@ struct mtd_info *ns_new_instance(struct nandsim_params *nsparam)
 		chip->ecc.strength = nsparam->bch;
 		chip->ecc.bytes = eccbytes;
 		NS_INFO("using %u-bit/%u bytes BCH ECC\n", nsparam->bch, chip->ecc.size);
+	} else {
+		chip->ecc.mode = NAND_ECC_SOFT;
+		chip->ecc.algo = NAND_ECC_HAMMING;
 	}
 
 	retval = nand_scan_tail(nsmtd);
diff --git a/include/linux/mtd/nandsim.h b/include/linux/mtd/nandsim.h
index d71a02f..05ac7e3 100644
--- a/include/linux/mtd/nandsim.h
+++ b/include/linux/mtd/nandsim.h
@@ -25,6 +25,7 @@ struct nandsim_params {
 	unsigned int bch;
 	unsigned char id_bytes[8];
 	unsigned int file_fd;
+	bool no_oob;
 	struct ns_backend_ops *bops;
 };
 
-- 
2.8.3

  parent reply	other threads:[~2016-09-21  9:52 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-21  9:43 [PATCH v2 00/46] Nandsim facelift (part I of II) Daniel Walter
2016-09-21  9:43 ` [PATCH v2 01/46] mtdpart: Propagate _get/put_device() Daniel Walter
2016-09-21 10:15   ` Boris Brezillon
2016-09-28 20:16     ` Brian Norris
2016-12-14 19:24       ` Karl Beldan
2016-12-14 21:09         ` Brian Norris
2016-12-14 21:12           ` Richard Weinberger
2016-12-14 23:40             ` Brian Norris
2016-12-15  7:09           ` Karl Beldan
2016-12-15  7:51             ` Richard Weinberger
2016-12-28 18:53               ` Karl Beldan
2016-09-21  9:44 ` [PATCH v2 02/46] mtd: nand: Provide nand_cleanup() function to free NAND related resources Daniel Walter
2016-09-21  9:58   ` Boris Brezillon
2016-09-21 12:43   ` kbuild test robot
2016-09-21 14:25   ` Boris Brezillon
2016-09-21 14:38     ` Daniel Walter
2016-09-21 14:42       ` Boris Brezillon
2016-09-21  9:45 ` [PATCH v2 03/46] mtd: Don't unconditionally unregister reboot notifier Daniel Walter
2016-09-21 14:31   ` Boris Brezillon
2016-09-21 14:33     ` Daniel Walter
2016-10-09  5:20   ` Brian Norris
2016-09-21  9:45 ` [PATCH v2 04/46] mtd: Don't unconditionally execute remove notifiers Daniel Walter
2016-09-21  9:46 ` [PATCH v2 05/46] mtd: Don't print a scary message when trying to remove a busy MTD Daniel Walter
2016-09-21  9:46 ` [PATCH v2 06/46] mtd: nandsim: Add basic control file support Daniel Walter
2016-09-21  9:47 ` [PATCH v2 07/46] mtd: nandsim: Begin with removal of global state Daniel Walter
2016-09-21  9:47 ` [PATCH v2 08/46] mtd: nandsim: Kill global nsmtd Daniel Walter
2016-09-21  9:47 ` [PATCH v2 09/46] mtd: nandsim: Don't directly use module parameters Daniel Walter
2016-09-21  9:48 ` [PATCH v2 10/46] mtd: nandsim: Add helper functions for pointer magic Daniel Walter
2016-09-21  9:48 ` [PATCH v2 11/46] mtd: nandsim: Factor out nandsim parameters Daniel Walter
2016-09-21  9:48 ` [PATCH v2 12/46] mtd: nandsim: Make debugfs logic multi instance capable Daniel Walter
2016-09-21  9:49 ` [PATCH v2 13/46] mtd: nandsim: Add final logic for multiple instances Daniel Walter
2016-09-21  9:49 ` [PATCH v2 14/46] mtd: nandsim: Add simulator id to MTD parition name Daniel Walter
2016-09-21  9:49 ` [PATCH v2 15/46] mtd: nandsim: Introduce backend operations Daniel Walter
2016-09-21  9:49 ` [PATCH v2 16/46] mtd: nandsim: Print error when backend init failed Daniel Walter
2016-09-21  9:50 ` [PATCH v2 17/46] mtd: nandsim: Allow external backends Daniel Walter
2016-09-21  9:50 ` [PATCH v2 18/46] mtd: nandsim: Add basic support for a file backend Daniel Walter
2016-09-21  9:50 ` [PATCH v2 19/46] mtd: nandsim: UAPI v1 Daniel Walter
2016-11-20 10:13   ` Boris Brezillon
2016-09-21  9:51 ` [PATCH v2 20/46] mtd: nandsim: Implement preliminary constructor function Daniel Walter
2016-09-21  9:51 ` [PATCH v2 21/46] mtd: nandsim: Implement preliminary destructor function Daniel Walter
2016-09-21 12:56   ` kbuild test robot
2016-09-21  9:51 ` [PATCH v2 22/46] mtd: nandsim: Cleanup destroy handlers Daniel Walter
2016-09-21  9:51 ` [PATCH v2 23/46] mtd: nandsim: Unify file backend init logic Daniel Walter
2016-09-21  9:51 ` [PATCH v2 24/46] mtd: nandsim: Wire up NANDSIM_MODE_CACHEFILE ioctl mode Daniel Walter
2016-09-21  9:52 ` [PATCH v2 25/46] mtd: nandsim: Print backend name Daniel Walter
2016-09-21  9:52 ` [PATCH v2 26/46] mtd: nandsim: use the existing output macros Daniel Walter
2016-09-21  9:52 ` Daniel Walter [this message]
2016-09-21  9:52 ` [PATCH v2 28/46] mtd: nandsim: Refine exports Daniel Walter
2016-09-21  9:54 ` [PATCH v2 29/46] um: Add nandsim backend driver Daniel Walter
2016-09-21  9:54 ` [PATCH v2 30/46] mtd: nandsim: Use pr_ style logging Daniel Walter
2016-09-21  9:54 ` [PATCH v2 31/46] mtd: nandsim: Remove NS_RAW_OFFSET_OOB Daniel Walter
2016-09-21  9:54 ` [PATCH v2 32/46] mtd: nandsim: Remove NS_IS_INITIALIZED Daniel Walter
2016-09-21  9:55 ` [PATCH v2 33/46] mtd: nandsim: Relax page size restrictions Daniel Walter
2016-09-21  9:55 ` [PATCH v2 34/46] mtd: nandsim: Support bitflip and read error emulation in file backend Daniel Walter
2016-09-21  9:55 ` [PATCH v2 35/46] mtd: nandsim: Make NANDSIM_MAX_DEVICES part of uapi Daniel Walter
2016-09-21  9:55 ` [PATCH v2 36/46] mtd: nandsim: Cleanup constants Daniel Walter
2016-09-21  9:55 ` [PATCH v2 37/46] mtd: nandsim: Turn parts[] into a integer Daniel Walter
2016-09-21  9:56 ` [PATCH v2 38/46] mtd: nandsim: Expose partition creation logic to user space Daniel Walter
2016-09-21  9:56 ` [PATCH v2 39/46] mtd: nandsim: Rework init error paths Daniel Walter
2016-09-21  9:56 ` [PATCH v2 40/46] mtd: nandsim: Expose BBT, delays, etc.. to userspace Daniel Walter
2016-09-21  9:56 ` [PATCH v2 41/46] mtd: nandsim: Expose support for weakpages/blocks " Daniel Walter
2016-09-21  9:57 ` [PATCH v2 42/46] mtd: nandsim: Don't printk on ENOMEM Daniel Walter
2016-09-21  9:57 ` [PATCH v2 43/46] mtd: nandsim: Wire up NANDSIM_IOC_NEW_INSTANCE Daniel Walter
2016-09-21  9:57 ` [PATCH v2 44/46] mtd: nandsim: Wire up NANDSIM_IOC_DESTROY_INSTANCE Daniel Walter
2016-09-21  9:57 ` [PATCH v2 45/46] mtd: nandsim: Always answer all 8 bytes from NAND_CMD_READID Daniel Walter
2016-09-21  9:57 ` [PATCH v2 46/46] mtd/nandsim: Add ioctl for info Daniel Walter
2016-10-16 16:24 ` [PATCH v2 00/46] Nandsim facelift (part I of II) Boris Brezillon
2016-11-14 16:24   ` Richard Weinberger
2016-11-20 10:26     ` Boris Brezillon

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=841fb44617cbab08601de74159c374613d4b73a4.1474450296.git.dwalter@sigma-star.at \
    --to=dwalter@sigma-star.at \
    --cc=boris.brezillon@free-electrons.com \
    --cc=computersforpeace@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=richard@nod.at \
    /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;
as well as URLs for NNTP newsgroup(s).