Message ID | 1255932706-23824-2-git-send-email-akinobu.mita@gmail.com |
---|---|
State | Superseded |
Headers | show |
On Mon, Oct 19, 2009 at 03:11:46PM +0900, Akinobu Mita wrote: > This module tests NAND ECC functions. > > The test is simple. > > 1. Create a 256 or 512 bytes block of data filled with random bytes (data) > 2. Duplicate the data block and inject single bit error (error_data) > 3. Try to correct error_data > 4. Compare data and error_data > > This test is added into new MTD test group called MTD NAND test > which requires MTD NAND device support. > ... > + > +#if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE) > + Oops. I forgot to remove this ifdefs.
On Mon, 2009-10-19 at 15:11 +0900, Akinobu Mita wrote: > This module tests NAND ECC functions. > > The test is simple. > > 1. Create a 256 or 512 bytes block of data filled with random bytes (data) > 2. Duplicate the data block and inject single bit error (error_data) > 3. Try to correct error_data > 4. Compare data and error_data > > This test is added into new MTD test group called MTD NAND test > which requires MTD NAND device support. > > Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> > Cc: David Woodhouse <dwmw2@infradead.org> > Cc: linux-mtd@lists.infradead.org > Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> > --- > drivers/mtd/Kconfig | 6 +++ > drivers/mtd/tests/Makefile | 1 + > drivers/mtd/tests/nand_ecc-test.c | 88 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 95 insertions(+), 0 deletions(-) > create mode 100644 drivers/mtd/tests/nand_ecc-test.c > > diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig > index ecf90f5..abe5c7f 100644 > --- a/drivers/mtd/Kconfig > +++ b/drivers/mtd/Kconfig > @@ -33,6 +33,12 @@ config MTD_TESTS > should normally be compiled as kernel modules. The modules perform > various checks and verifications when loaded. > > +config MTD_NAND_TESTS > + tristate "MTD NAND tests support" > + depends on MTD_TESTS && MTD_NAND > + help > + This option enables MTD tests which require NAND Device support. > + > config MTD_CONCAT > tristate "MTD concatenating support" > help Could this please be a separate patch? Also, some of the existing tests are NAND only as well, so could do corresponding Makefile changes in the same patch and move the to the MTD_NAND_TESTS set? The tests are: mtd_oobtest.c mtd_pagetest.c mtd_subpagetest.c
On Tue, 2009-10-20 at 14:50 +0300, Artem Bityutskiy wrote: > On Mon, 2009-10-19 at 15:11 +0900, Akinobu Mita wrote: > > This module tests NAND ECC functions. > > > > The test is simple. > > > > 1. Create a 256 or 512 bytes block of data filled with random bytes (data) > > 2. Duplicate the data block and inject single bit error (error_data) > > 3. Try to correct error_data > > 4. Compare data and error_data > > > > This test is added into new MTD test group called MTD NAND test > > which requires MTD NAND device support. > > > > Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> > > Cc: David Woodhouse <dwmw2@infradead.org> > > Cc: linux-mtd@lists.infradead.org > > Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> > > --- > > drivers/mtd/Kconfig | 6 +++ > > drivers/mtd/tests/Makefile | 1 + > > drivers/mtd/tests/nand_ecc-test.c | 88 +++++++++++++++++++++++++++++++++++++ > > 3 files changed, 95 insertions(+), 0 deletions(-) > > create mode 100644 drivers/mtd/tests/nand_ecc-test.c > > > > diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig > > index ecf90f5..abe5c7f 100644 > > --- a/drivers/mtd/Kconfig > > +++ b/drivers/mtd/Kconfig > > @@ -33,6 +33,12 @@ config MTD_TESTS > > should normally be compiled as kernel modules. The modules perform > > various checks and verifications when loaded. > > > > +config MTD_NAND_TESTS > > + tristate "MTD NAND tests support" > > + depends on MTD_TESTS && MTD_NAND > > + help > > + This option enables MTD tests which require NAND Device support. > > + > > config MTD_CONCAT > > tristate "MTD concatenating support" > > help > > Could this please be a separate patch? Also, some of the existing tests > are NAND only as well, so could do corresponding Makefile changes in the > same patch and move the to the MTD_NAND_TESTS set? The tests are: > > mtd_oobtest.c > mtd_pagetest.c > mtd_subpagetest.c Err, and of course this patch has to be the _last_ in the series, to preserve bisectability.
On Tue, Oct 20, 2009 at 02:50:01PM +0300, Artem Bityutskiy wrote: > > diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig > > index ecf90f5..abe5c7f 100644 > > --- a/drivers/mtd/Kconfig > > +++ b/drivers/mtd/Kconfig > > @@ -33,6 +33,12 @@ config MTD_TESTS > > should normally be compiled as kernel modules. The modules perform > > various checks and verifications when loaded. > > > > +config MTD_NAND_TESTS > > + tristate "MTD NAND tests support" > > + depends on MTD_TESTS && MTD_NAND > > + help > > + This option enables MTD tests which require NAND Device support. > > + > > config MTD_CONCAT > > tristate "MTD concatenating support" > > help > > Could this please be a separate patch? Also, some of the existing tests > are NAND only as well, so could do corresponding Makefile changes in the > same patch and move the to the MTD_NAND_TESTS set? The tests are: > > mtd_oobtest.c > mtd_pagetest.c > mtd_subpagetest.c Should these MTD NAND tests support OneNAND device, too? If so, the config with !CONFIG_MTD_NAND && MTD_ONENAND=m cannot select this new MTD_NAND_TESTS. So Kconfig dependency should be: config MTD_NAND_TESTS tristate "MTD NAND tests support" depends on MTD_TEST depends on MTD_NAND || MTD_ONENAND But nand_ecc-test obviously needs CONFIG_MTD_NAND and cannot exist in the same group.
On Wed, 2009-10-21 at 06:46 +0200, ext Akinobu Mita wrote: > On Tue, Oct 20, 2009 at 02:50:01PM +0300, Artem Bityutskiy wrote: > > > diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig > > > index ecf90f5..abe5c7f 100644 > > > --- a/drivers/mtd/Kconfig > > > +++ b/drivers/mtd/Kconfig > > > @@ -33,6 +33,12 @@ config MTD_TESTS > > > should normally be compiled as kernel modules. The modules perform > > > various checks and verifications when loaded. > > > > > > +config MTD_NAND_TESTS > > > + tristate "MTD NAND tests support" > > > + depends on MTD_TESTS && MTD_NAND > > > + help > > > + This option enables MTD tests which require NAND Device support. > > > + > > > config MTD_CONCAT > > > tristate "MTD concatenating support" > > > help > > > > Could this please be a separate patch? Also, some of the existing tests > > are NAND only as well, so could do corresponding Makefile changes in the > > same patch and move the to the MTD_NAND_TESTS set? The tests are: > > > > mtd_oobtest.c > > mtd_pagetest.c > > mtd_subpagetest.c > > Should these MTD NAND tests support OneNAND device, too? > > If so, the config with !CONFIG_MTD_NAND && MTD_ONENAND=m cannot select > this new MTD_NAND_TESTS. So Kconfig dependency should be: > > config MTD_NAND_TESTS > tristate "MTD NAND tests support" > depends on MTD_TEST > depends on MTD_NAND || MTD_ONENAND > > But nand_ecc-test obviously needs CONFIG_MTD_NAND and cannot exist > in the same group. Oh, I see. May be your original idea with ifdefs in the code was not bad at all :-) ?
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig index ecf90f5..abe5c7f 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig @@ -33,6 +33,12 @@ config MTD_TESTS should normally be compiled as kernel modules. The modules perform various checks and verifications when loaded. +config MTD_NAND_TESTS + tristate "MTD NAND tests support" + depends on MTD_TESTS && MTD_NAND + help + This option enables MTD tests which require NAND Device support. + config MTD_CONCAT tristate "MTD concatenating support" help diff --git a/drivers/mtd/tests/Makefile b/drivers/mtd/tests/Makefile index c1d5013..3994d5a 100644 --- a/drivers/mtd/tests/Makefile +++ b/drivers/mtd/tests/Makefile @@ -5,3 +5,4 @@ obj-$(CONFIG_MTD_TESTS) += mtd_speedtest.o obj-$(CONFIG_MTD_TESTS) += mtd_stresstest.o obj-$(CONFIG_MTD_TESTS) += mtd_subpagetest.o obj-$(CONFIG_MTD_TESTS) += mtd_torturetest.o +obj-$(CONFIG_MTD_NAND_TESTS) += nand_ecc-test.o diff --git a/drivers/mtd/tests/nand_ecc-test.c b/drivers/mtd/tests/nand_ecc-test.c new file mode 100644 index 0000000..54bbb4a --- /dev/null +++ b/drivers/mtd/tests/nand_ecc-test.c @@ -0,0 +1,88 @@ +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/list.h> +#include <linux/slab.h> +#include <linux/random.h> +#include <linux/string.h> +#include <linux/bitops.h> +#include <linux/jiffies.h> + +void inject_single_bit_error(void *data, size_t size) +{ + unsigned long offset = random32() % (size * BITS_PER_BYTE); + + __change_bit(offset, data); +} + +#if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE) + +#include <linux/mtd/nand_ecc.h> + +static unsigned char data[512]; +static unsigned char error_data[512]; + +static int nand_ecc_test(const size_t size) +{ + unsigned char code[3]; + unsigned char error_code[3]; + char testname[30]; + + BUG_ON(sizeof(data) < size); + + sprintf(testname, "nand-ecc-%zu", size); + + get_random_bytes(data, size); + + memcpy(error_data, data, size); + inject_single_bit_error(error_data, size); + + __nand_calculate_ecc(data, size, code); + __nand_calculate_ecc(error_data, size, error_code); + __nand_correct_data(error_data, code, error_code, size); + + if (!memcmp(data, error_data, size)) { + printk(KERN_INFO "nand_ecc-test: ok - %s\n", testname); + return 0; + } + + printk(KERN_ERR "nand_ecc-test: not ok - %s\n", testname); + + printk(KERN_DEBUG "hexdump of data:\n"); + print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 4, + data, size, false); + printk(KERN_DEBUG "hexdump of error data:\n"); + print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 4, + error_data, size, false); + + return -1; +} + +#else + +static int nand_ecc_test(const size_t size) +{ + return 0; +} + +#endif + +static int __init ecc_test_init(void) +{ + srandom32(jiffies); + + nand_ecc_test(256); + nand_ecc_test(512); + + return 0; +} + +static void __exit ecc_test_exit(void) +{ +} + +module_init(ecc_test_init); +module_exit(ecc_test_exit); + +MODULE_DESCRIPTION("ECC test module"); +MODULE_AUTHOR("Akinobu Mita"); +MODULE_LICENSE("GPL");
This module tests NAND ECC functions. The test is simple. 1. Create a 256 or 512 bytes block of data filled with random bytes (data) 2. Duplicate the data block and inject single bit error (error_data) 3. Try to correct error_data 4. Compare data and error_data This test is added into new MTD test group called MTD NAND test which requires MTD NAND device support. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Cc: David Woodhouse <dwmw2@infradead.org> Cc: linux-mtd@lists.infradead.org Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> --- drivers/mtd/Kconfig | 6 +++ drivers/mtd/tests/Makefile | 1 + drivers/mtd/tests/nand_ecc-test.c | 88 +++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 0 deletions(-) create mode 100644 drivers/mtd/tests/nand_ecc-test.c