Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1473121
| From | Daniel Walter <dwalter@sigma-star.at> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 28/46] mtd: nandsim: Refine exports |
| Date | 2016-08-31 09:40 +0200 |
| Message-ID | <sc8hQ-7T2-41@gated-at.bofh.it> (permalink) |
| References | <sc889-7Pb-1@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Richard Weinberger <richard@nod.at>
Keep the file backend logic directly in nandsim such that
other users of only have to implement simple read/write
functions.
Signed-off-by: Richard Weinberger <richard@nod.at>
---
drivers/mtd/nand/nandsim.c | 101 +++++++++++++++++++++++++++++++++-----------
include/linux/mtd/nandsim.h | 33 ++++++---------
2 files changed, 88 insertions(+), 46 deletions(-)
diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c
index f5aa0c4..f2ebf8b 100644
--- a/drivers/mtd/nand/nandsim.c
+++ b/drivers/mtd/nand/nandsim.c
@@ -302,6 +302,14 @@ struct nandsim_debug_info {
struct dentry *dfs_wear_report;
};
+/*
+ * A union to represent flash memory contents and flash buffer.
+ */
+union ns_mem {
+ u_char *byte; /* for byte access */
+ uint16_t *word; /* for 16-bit word access */
+};
+
struct ns_ram_data {
/* The simulated NAND flash pages array */
union ns_mem *pages;
@@ -350,7 +358,17 @@ struct nandsim {
/* Internal buffer of page + OOB size bytes */
union ns_mem buf;
struct nandsim_geom geom;
- struct nandsim_regs regs;
+
+ /* NAND flash internal registers */
+ struct {
+ unsigned int command; /* the command register */
+ u_char status; /* the status register */
+ uint row; /* the page number */
+ uint column; /* the offset within page */
+ uint count; /* internal counter */
+ uint num; /* number of bytes which must be processed */
+ uint off; /* fixed page offset */
+ } regs;
/* NAND flash lines state */
struct {
@@ -773,12 +791,6 @@ struct nandsim_geom *nandsim_get_geom(struct nandsim *ns)
}
EXPORT_SYMBOL_GPL(nandsim_get_geom);
-struct nandsim_regs *nandsim_get_regs(struct nandsim *ns)
-{
- return &ns->regs;
-}
-EXPORT_SYMBOL_GPL(nandsim_get_regs);
-
void nandsim_set_backend_data(struct nandsim *ns, void *data)
{
ns->backend_data = data;
@@ -791,12 +803,6 @@ void *nandsim_get_backend_data(struct nandsim *ns)
}
EXPORT_SYMBOL_GPL(nandsim_get_backend_data);
-union ns_mem *nandsim_get_buf(struct nandsim *ns)
-{
- return &ns->buf;
-}
-EXPORT_SYMBOL_GPL(nandsim_get_buf);
-
static void ns_ram_destroy(struct nandsim *ns)
{
struct ns_ram_data *data = ns->backend_data;
@@ -1706,9 +1712,10 @@ static void ns_cachefile_read_page(struct nandsim *ns, int num)
}
}
-static void ns_file_read_page(struct nandsim *ns, int num)
+void __ns_file_read_page(struct nandsim *ns, int num,
+ int (*read_fn)(struct nandsim *ns, char *addr,
+ unsigned long count, loff_t offset))
{
- struct ns_file_data *data = ns->backend_data;
loff_t pos;
ssize_t tx;
@@ -1734,12 +1741,26 @@ static void ns_file_read_page(struct nandsim *ns, int num)
}
pos = (loff_t)NS_RAW_OFFSET(ns) + ns->regs.off;
- tx = kernel_read(data->file, pos, ns->buf.byte, num);
+ tx = read_fn(ns, ns->buf.byte, num, pos);
if (tx == 0)
memset(ns->buf.byte, 0xff, num);
else if (tx != num)
NS_ERR("read_page: read error for page %d ret %ld\n", ns->regs.row, (long)tx);
}
+EXPORT_SYMBOL_GPL(__ns_file_read_page);
+
+static inline int do_kernel_read(struct nandsim *ns, char *addr,
+ unsigned long count, loff_t offset)
+{
+ struct ns_file_data *data = ns->backend_data;
+
+ return kernel_read(data->file, offset, addr, count);
+}
+
+static void ns_file_read_page(struct nandsim *ns, int num)
+{
+ __ns_file_read_page(ns, num, do_kernel_read);
+}
static void ns_ram_erase_sector(struct nandsim *ns)
{
@@ -1771,24 +1792,42 @@ static void ns_cachefile_erase_sector(struct nandsim *ns)
}
}
-static void ns_file_erase_sector(struct nandsim *ns)
+static inline ssize_t do_kernel_write(struct nandsim *ns, const char *addr,
+ size_t count, loff_t offset)
+{
+ struct ns_file_data *data = ns->backend_data;
+
+ return kernel_write(data->file, addr, count, offset);
+}
+
+
+void __ns_file_erase_sector(struct nandsim *ns, char *file_buf,
+ ssize_t (*write_fn)(struct nandsim *ns, const char *buf,
+ size_t count, loff_t pos))
{
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, pagesz);
+ memset(file_buf, 0xff, pagesz);
for (i = 0; i < ns->geom.pgsec; i++) {
pos = (loff_t)(ns->regs.row + i) * pagesz;
- tx = kernel_write(data->file, data->file_buf, pagesz, pos);
+ tx = write_fn(ns, file_buf, pagesz, pos);
if (tx != pagesz) {
NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx);
}
}
}
+EXPORT_SYMBOL_GPL(__ns_file_erase_sector);
+
+static void ns_file_erase_sector(struct nandsim *ns)
+{
+ struct ns_file_data *data = ns->backend_data;
+
+ __ns_file_erase_sector(ns, data->file_buf, do_kernel_write);
+}
static int ns_ram_prog_page(struct nandsim *ns, int num)
{
@@ -1863,13 +1902,16 @@ static int ns_cachefile_prog_page(struct nandsim *ns, int num)
return 0;
}
-static int ns_file_prog_page(struct nandsim *ns, int num)
+int __ns_file_prog_page(struct nandsim *ns, int num, char *file_buf,
+ int (*read_fn)(struct nandsim *ns, char *addr,
+ unsigned long count, loff_t offset),
+ ssize_t (*write_fn)(struct nandsim *ns, const char *buf,
+ size_t count, loff_t pos))
{
int i;
loff_t off;
ssize_t tx;
u_char *pg_off;
- struct ns_file_data *data = ns->backend_data;
NS_DBG("prog_page: writing page %d\n", ns->regs.row);
@@ -1885,10 +1927,10 @@ static int ns_file_prog_page(struct nandsim *ns, int num)
num -= pg_write_end - ns->geom.pgsz;
}
- pg_off = data->file_buf + ns->regs.column + ns->regs.off;
+ pg_off = file_buf + ns->regs.column + ns->regs.off;
off = (loff_t)NS_RAW_OFFSET(ns) + ns->regs.off;
- tx = kernel_read(data->file, off, pg_off, num);
+ tx = read_fn(ns, pg_off, num, off);
if (tx == 0)
memset(pg_off, 0xff, num);
else if (tx != num) {
@@ -1899,7 +1941,7 @@ static int ns_file_prog_page(struct nandsim *ns, int num)
for (i = 0; i < num; i++)
pg_off[i] &= ns->buf.byte[i];
- tx = kernel_write(data->file, pg_off, num, off);
+ tx = write_fn(ns, pg_off, num, off);
if (tx != num) {
NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx);
return -1;
@@ -1907,6 +1949,15 @@ static int ns_file_prog_page(struct nandsim *ns, int num)
return 0;
}
+EXPORT_SYMBOL_GPL(__ns_file_prog_page);
+
+static int ns_file_prog_page(struct nandsim *ns, int num)
+{
+ struct ns_file_data *data = ns->backend_data;
+
+ return __ns_file_prog_page(ns, num, data->file_buf, do_kernel_read,
+ do_kernel_write);
+}
static struct ns_backend_ops ns_ram_bops = {
.erase_sector = ns_ram_erase_sector,
diff --git a/include/linux/mtd/nandsim.h b/include/linux/mtd/nandsim.h
index 05ac7e3..85d4d7e 100644
--- a/include/linux/mtd/nandsim.h
+++ b/include/linux/mtd/nandsim.h
@@ -47,25 +47,6 @@ struct nandsim_geom {
uint idbytes; /* the number ID bytes that this chip outputs */
};
-/* NAND flash internal registers */
-struct nandsim_regs {
- unsigned command; /* the command register */
- u_char status; /* the status register */
- uint row; /* the page number */
- uint column; /* the offset within page */
- uint count; /* internal counter */
- uint num; /* number of bytes which must be processed */
- uint off; /* fixed page offset */
-};
-
-/*
- * A union to represent flash memory contents and flash buffer.
- */
-union ns_mem {
- u_char *byte; /* for byte access */
- uint16_t *word; /* for 16-bit word access */
-};
-
struct nandsim;
struct ns_backend_ops {
void (*erase_sector)(struct nandsim *ns);
@@ -79,9 +60,19 @@ struct ns_backend_ops {
struct mtd_info *ns_new_instance(struct nandsim_params *nsparam);
int ns_destroy_instance(struct mtd_info *nsmtd);
struct nandsim_geom *nandsim_get_geom(struct nandsim *ns);
-struct nandsim_regs *nandsim_get_regs(struct nandsim *ns);
void nandsim_set_backend_data(struct nandsim *ns, void *data);
void *nandsim_get_backend_data(struct nandsim *ns);
-union ns_mem *nandsim_get_buf(struct nandsim *ns);
+void __ns_file_read_page(struct nandsim *ns, int num,
+ int (*read_fn)(struct nandsim *ns, char *addr,
+ unsigned long count, loff_t offset));
+
+int __ns_file_prog_page(struct nandsim *ns, int num, char *file_buf,
+ int (*read_fn)(struct nandsim *ns, char *addr,
+ unsigned long count, loff_t offset),
+ ssize_t (*write_fn)(struct nandsim *ns, const char *buf,
+ size_t count, loff_t pos));
+void __ns_file_erase_sector(struct nandsim *ns, char *file_buf,
+ ssize_t (*write_fn)(struct nandsim *ns, const char *buf,
+ size_t count, loff_t pos));
#endif /* __LINUX_NANDSIM_H__ */
--
2.8.3
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 00/46] Nandsim facelift (part I of II) Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:30 +0200 [PATCH 10/46] mtd: nandsim: Add helper functions for pointer magic Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:30 +0200 [PATCH 02/46] mtd: nand: TODO Propagate mtd_device_unregister() return value in tear down Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:30 +0200 [PATCH 07/46] mtd: nandsim: Begin with removal of global state Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:30 +0200 [PATCH 03/46] mtd: Don't unconditionally unregister reboot notifier Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:30 +0200 [PATCH 45/46] mtd: nandsim: Always answer all 8 bytes from NAND_CMD_READID Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 06/46] mtd: nandsim: Add basic control file support Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 43/46] mtd: nandsim: Wire up NANDSIM_IOC_NEW_INSTANCE Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 15/46] mtd: nandsim: Introduce backend operations Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 09/46] mtd: nandsim: Don't directly use module parameters Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 01/46] mtdpart: Propagate _get/put_device() Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 27/46] mtd: nandsim: Add no_oob mode Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 14/46] mtd: nandsim: Add simulator id to MTD parition name Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 44/46] mtd: nandsim: Wire up NANDSIM_IOC_DESTROY_INSTANCE Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 11/46] mtd: nandsim: Factor out nandsim parameters Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 33/46] mtd: nandsim: Relax page size restrictions Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 38/46] mtd: nandsim: Expose partition creation logic to user space Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 24/46] mtd: nandsim: Wire up NANDSIM_MODE_CACHEFILE ioctl mode Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 39/46] mtd: nandsim: Rework init error paths Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 18/46] mtd: nandsim: Add basic support for a file backend Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 08/46] mtd: nandsim: Kill global nsmtd Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 40/46] mtd: nandsim: Expose BBT, delays, etc.. to userspace Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 17/46] mtd: nandsim: Allow external backends Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 46/46] mtd/nandsim: Add ioctl for info Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 36/46] mtd: nandsim: Cleanup constants Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 42/46] mtd: nandsim: Don't printk on ENOMEM Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 19/46] mtd: nandsim: UAPI v1 Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 20/46] mtd: nandsim: Implement preliminary constructor function Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 12/46] mtd: nandsim: Make debugfs logic multi instance capable Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 04/46] mtd: Don't unconditionally execute remove notifiers Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 22/46] mtd: nandsim: Cleanup destroy handlers Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 25/46] mtd: nandsim: Print backend name Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 28/46] mtd: nandsim: Refine exports Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 31/46] mtd: nandsim: Remove NS_RAW_OFFSET_OOB Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 21/46] mtd: nandsim: Implement preliminary destructor function Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 26/46] mtd: nandsim: use the existing output macros Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 37/46] mtd: nandsim: Turn parts[] into a integer Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 41/46] mtd: nandsim: Expose support for weakpages/blocks to userspace Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 23/46] mtd: nandsim: Unify file backend init logic Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 35/46] mtd: nandsim: Make NANDSIM_MAX_DEVICES part of uapi Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 32/46] mtd: nandsim: Remove NS_IS_INITIALIZED Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 29/46] um: Add nandsim backend driver Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 34/46] mtd: nandsim: Support bitflip and read error emulation in file backend Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 05/46] mtd: Don't print a scary message when trying to remove a busy MTD Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200 [PATCH 13/46] mtd: nandsim: Add final logic for multiple instances Daniel Walter <dwalter@sigma-star.at> - 2016-08-31 09:40 +0200
csiph-web