[PATCH v2 2/4] mtd: atmel_nand: add Nand Flash Controller (NFC) support
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Mon May 27 06:26:03 EDT 2013
On 17:56 Mon 27 May , Josh Wu wrote:
> Hi, Jean-Christophe PLAGNIOL-VILLARD
>
> Thank you for your review comments. See my comment in below.
>
> On 5/25/2013 4:09 AM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> >On 17:51 Fri 17 May , Josh Wu wrote:
> >>Nand Flash Controller (NFC) can handle automatic transfers, sending the
> >>commands and address cycles to the NAND Flash.
> >>
> >>To use NFC in this driver, the user needs to set the address and size of
> >>NFC command registers, NFC registers (embedded in HSMC) and NFC SRAM in dts.
> >>Also user need to set up the HSMC irq, which use to check whether nfc
> >>command is finish or not.
> >>
> >>This driver has been tested on SAMA5D3X-EK board with JFFS2, YAFFS,
> >>UBIFS and mtd-utils.
> >>
> >>I put the part of the mtd_speedtest result here for your information.
> >> From the mtd_speedtest, we can see the NFC will reduce the %50 of cpu load
> >>when writing nand flash. No change when reading.
> >>In the meantime, the speed will be slow about %8.
> >>
> >>- commands use to test:
> >> #insmod /mnt/mtd_speedtest.ko dev=2 &
> >> #top -n 30 -d 1 | grep speedtest
> >>
> >>- test result:
> >>
> >>Before the patch:
> >>=================================================
> >>mtd_speedtest: MTD device: 2
> >>mtd_speedtest: MTD device size 41943040, eraseblock size 131072, page size 2048, count of eraseblocks 320, pages per eraseblock 64, OOB size 64
> >> 515 495 root R 1164 0% 93% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 98% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 99% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: eraseblock write speed is 5768 KiB/s
> >>mtd_speedtest: testing eraseblock read speed
> >> 515 495 root R 1164 0% 92% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 91% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 94% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: eraseblock read speed is 5932 KiB/s
> >>mtd_speedtest: testing page write speed
> >> 515 495 root R 1164 0% 94% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 98% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 98% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: page write speed is 5770 KiB/s
> >>mtd_speedtest: testing page read speed
> >> 515 495 root R 1164 0% 91% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 89% insmod /mnt/mtd_speedtest.ko dev=2
> >> 515 495 root R 1164 0% 91% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: page read speed is 5910 KiB/s
> >>
> >>After the patch:
> >>=================================================
> >>mtd_speedtest: MTD device: 2
> >>mtd_speedtest: MTD device size 41943040, eraseblock size 131072, page size 2048, count of eraseblocks 320, pages per eraseblock 64, OOB size 64
> >>mtd_speedtest: testing eraseblock write speed
> >> 509 495 root D 1164 0% 49% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root D 1164 0% 50% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root D 1164 0% 47% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: eraseblock write speed is 5370 KiB/s
> >>mtd_speedtest: testing eraseblock read speed
> >> 509 495 root R 1164 0% 92% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root R 1164 0% 91% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root R 1164 0% 95% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: eraseblock read speed is 5715 KiB/s
> >>mtd_speedtest: testing page write speed
> >> 509 495 root D 1164 0% 48% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root D 1164 0% 47% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root D 1164 0% 50% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: page write speed is 5224 KiB/s
> >>mtd_speedtest: testing page read speed
> >> 509 495 root R 1164 0% 89% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root R 1164 0% 94% insmod /mnt/mtd_speedtest.ko dev=2
> >> 509 495 root R 1164 0% 93% insmod /mnt/mtd_speedtest.ko dev=2
> >>mtd_speedtest: page read speed is 5641 KiB/s
> >>
> >>Signed-off-by: Josh Wu <josh.wu at atmel.com>
> >>---
> >>v1 --> v2:
> >> remove the useless nand commands: NAND_CMD_STATUS_ERRORx, NAND_CMD_DEPLETE1.
> >>
> >> .../devicetree/bindings/mtd/atmel-nand.txt | 3 +
> >> drivers/mtd/nand/atmel_nand.c | 373 ++++++++++++++++++--
> >> drivers/mtd/nand/atmel_nand_nfc.h | 106 ++++++
> >> 3 files changed, 454 insertions(+), 28 deletions(-)
> >> create mode 100644 drivers/mtd/nand/atmel_nand_nfc.h
> >>
> >>diff --git a/Documentation/devicetree/bindings/mtd/atmel-nand.txt b/Documentation/devicetree/bindings/mtd/atmel-nand.txt
> >>index d555421..88e3313 100644
> >>--- a/Documentation/devicetree/bindings/mtd/atmel-nand.txt
> >>+++ b/Documentation/devicetree/bindings/mtd/atmel-nand.txt
> >>@@ -6,6 +6,8 @@ Required properties:
> >> and hardware ECC controller if available.
> >> If the hardware ECC is PMECC, it should contain address and size for
> >> PMECC, PMECC Error Location controller and ROM which has lookup tables.
> >>+ If hardware supports Nand Flash Controller, it should contain address and
> >>+ size for NFC command registers, NFC registers and NFC Sram.
> >> - atmel,nand-addr-offset : offset for the address latch.
> >> - atmel,nand-cmd-offset : offset for the command latch.
> >> - #address-cells, #size-cells : Must be present if the device has sub-nodes
> >>@@ -29,6 +31,7 @@ Optional properties:
> >> sector size 1024.
> >> - nand-bus-width : 8 or 16 bus width if not present 8
> >> - nand-on-flash-bbt: boolean to enable on flash bbt option if not present false
> >>+- atmel,has-nfc: boolean to enable Nand Flash Controller(NFC).
> >yes but you need to update the compatible or check the IP support it too
> >as has-nfc will mean I have the nfs on the hardware but not enable it
> >
> >the SoC dtsi will describe you have it but the board will decide to enable it or
> >not
>
> I can add some code to check whether is NFC supported by read SMC IP
> version. But I'm afraid
> such code may not work for AVR arch.
>
> Another way is just add a 'enable-nfc' compatible string. Which is
> for board to enable the NFC feature.
>
> I'm prefer to the later one. What do you think?
I do not like no 2
I like this
nand0: nand at 60000000 {
compatible = "atmel,at91rm9200-nand";
#address-cells = <1>;
#size-cells = <1>;
reg = < 0x60000000 0x01000000 /* EBI CS3 */
0xffffc070 0x00000490 /* SMC PMECC regs */
0xffffc500 0x00000100 /* SMC PMECC Error Location regs */
0x00100000 0x00100000 /* ROM code */
>;
interrupts = <5 IRQ_TYPE_LEVEL_HIGH 6>;
atmel,nand-addr-offset = <21>;
atmel,nand-cmd-offset = <22>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_nand0_ale_cle>;
atmel,pmecc-lookup-table-offset = <0x10000 0x18000>;
status = "disabled";
nfc at 70000000 {
compatible = "atmel,sama5d3-nfc";
reg = < 0x70000000 0x10000000 /* NFC Command Registers */
0xffffc000 0x00000070 /* NFC HSMC regs */
0x00200000 0x00100000 /* NFC SRAM banks */
>;
}
};
so you can enable/disable it easly
>
> >> Examples:
> >> nand0: nand at 40000000,0 {
> >>diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
> >>index f747791..48d7ee6 100644
> >>--- a/drivers/mtd/nand/atmel_nand.c
> >>+++ b/drivers/mtd/nand/atmel_nand.c
> >>@@ -18,6 +18,9 @@
> >> * Add Programmable Multibit ECC support for various AT91 SoC
> >> * © Copyright 2012 ATMEL, Hong Xu
> >> *
> >>+ * Add Nand Flash Controller support for SAMA5 SoC
> >>+ * © Copyright 2013 ATMEL, Josh Wu (josh.wu at atmel.com)
> >>+ *
> >> * This program is free software; you can redistribute it and/or modify
> >> * it under the terms of the GNU General Public License version 2 as
> >> * published by the Free Software Foundation.
> >>@@ -37,9 +40,11 @@
> >> #include <linux/mtd/nand.h>
> >> #include <linux/mtd/partitions.h>
> >>+#include <linux/delay.h>
> >> #include <linux/dmaengine.h>
> >> #include <linux/gpio.h>
> >> #include <linux/io.h>
> >>+#include <linux/interrupt.h>
> >> #include <linux/platform_data/atmel.h>
> >> #include <linux/pinctrl/consumer.h>
> >>@@ -58,6 +63,7 @@ module_param(on_flash_bbt, int, 0);
> >> __raw_writel((value), add + ATMEL_ECC_##reg)
> >> #include "atmel_nand_ecc.h" /* Hardware ECC registers */
> >>+#include "atmel_nand_nfc.h" /* Nand Flash Controller definition */
> >> /* oob layout for large page size
> >> * bad block info is on bytes 0 and 1
> >>@@ -85,6 +91,13 @@ static struct nand_ecclayout atmel_oobinfo_small = {
> >> },
> >> };
....
> >>+ dev_err(&pdev->dev,
> >>+ "can't request input direction rdy gpio %d\n",
> >>+ host->board.rdy_pin);
> >>+ goto err_ecc_ioremap;
> >>+ }
> >>+
> >>+ nand_chip->dev_ready = atmel_nand_device_ready;
> >> }
> >>- res = gpio_direction_output(host->board.enable_pin, 1);
> >>- if (res < 0) {
> >>- dev_err(&pdev->dev,
> >>- "can't request output direction enable gpio %d\n",
> >>- host->board.enable_pin);
> >>- goto err_ecc_ioremap;
> >>+ if (gpio_is_valid(host->board.enable_pin)) {
> >>+ res = gpio_request(host->board.enable_pin,
> >we need to use devm_ here too
> >and everywhere we can in this driver
>
> yes, but seems you already sent one patch to use devm_ for this driver.
> https://patchwork.kernel.org/patch/1589071/
> It is not merged in at91 tree yet.
>
> So what do you think if I put that patch rebased and put it as one
> of this NFC series patches?
yes do so
Best Regards,
J.
More information about the linux-mtd
mailing list