1Device tree bindings for GPMC connected NANDs 2 3GPMC connected NAND (found on OMAP boards) are represented as child nodes of 4the GPMC controller with a name of "nand". 5 6All timing relevant properties as well as generic gpmc child properties are 7explained in a separate documents - please refer to 8Documentation/devicetree/bindings/memory-controllers/omap-gpmc.txt 9 10For NAND specific properties such as ECC modes or bus width, please refer to 11Documentation/devicetree/bindings/mtd/nand-controller.yaml 12 13 14Required properties: 15 16 - compatible: "ti,omap2-nand" 17 - reg: range id (CS number), base offset and length of the 18 NAND I/O space 19 - interrupts: Two interrupt specifiers, one for fifoevent, one for termcount. 20 21Optional properties: 22 23 - nand-bus-width: Set this numeric value to 16 if the hardware 24 is wired that way. If not specified, a bus 25 width of 8 is assumed. 26 27 - ti,nand-ecc-opt: A string setting the ECC layout to use. One of: 28 "sw" 1-bit Hamming ecc code via software 29 "hw" <deprecated> use "ham1" instead 30 "hw-romcode" <deprecated> use "ham1" instead 31 "ham1" 1-bit Hamming ecc code 32 "bch4" 4-bit BCH ecc code 33 "bch8" 8-bit BCH ecc code 34 "bch16" 16-bit BCH ECC code 35 Refer below "How to select correct ECC scheme for your device ?" 36 37 - ti,nand-xfer-type: A string setting the data transfer type. One of: 38 39 "prefetch-polled" Prefetch polled mode (default) 40 "polled" Polled mode, without prefetch 41 "prefetch-dma" Prefetch enabled DMA mode 42 "prefetch-irq" Prefetch enabled irq mode 43 44 - elm_id: <deprecated> use "ti,elm-id" instead 45 - ti,elm-id: Specifies phandle of the ELM devicetree node. 46 ELM is an on-chip hardware engine on TI SoC which is used for 47 locating ECC errors for BCHx algorithms. SoC devices which have 48 ELM hardware engines should specify this device node in .dtsi 49 Using ELM for ECC error correction frees some CPU cycles. 50 - rb-gpios: GPIO specifier for the ready/busy# pin. 51 52For inline partition table parsing (optional): 53 54 - #address-cells: should be set to 1 55 - #size-cells: should be set to 1 56 57Example for an AM33xx board: 58 59 gpmc: gpmc@50000000 { 60 compatible = "ti,am3352-gpmc"; 61 ti,hwmods = "gpmc"; 62 reg = <0x50000000 0x36c>; 63 interrupts = <100>; 64 gpmc,num-cs = <8>; 65 gpmc,num-waitpins = <2>; 66 #address-cells = <2>; 67 #size-cells = <1>; 68 ranges = <0 0 0x08000000 0x1000000>; /* CS0 space, 16MB */ 69 elm_id = <&elm>; 70 interrupt-controller; 71 #interrupt-cells = <2>; 72 73 nand@0,0 { 74 compatible = "ti,omap2-nand"; 75 reg = <0 0 4>; /* CS0, offset 0, NAND I/O window 4 */ 76 interrupt-parent = <&gpmc>; 77 interrupts = <0 IRQ_TYPE_NONE>, <1 IRQ_TYPE NONE>; 78 nand-bus-width = <16>; 79 ti,nand-ecc-opt = "bch8"; 80 ti,nand-xfer-type = "polled"; 81 rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 */ 82 83 gpmc,sync-clk-ps = <0>; 84 gpmc,cs-on-ns = <0>; 85 gpmc,cs-rd-off-ns = <44>; 86 gpmc,cs-wr-off-ns = <44>; 87 gpmc,adv-on-ns = <6>; 88 gpmc,adv-rd-off-ns = <34>; 89 gpmc,adv-wr-off-ns = <44>; 90 gpmc,we-off-ns = <40>; 91 gpmc,oe-off-ns = <54>; 92 gpmc,access-ns = <64>; 93 gpmc,rd-cycle-ns = <82>; 94 gpmc,wr-cycle-ns = <82>; 95 gpmc,wr-access-ns = <40>; 96 gpmc,wr-data-mux-bus-ns = <0>; 97 98 #address-cells = <1>; 99 #size-cells = <1>; 100 101 /* partitions go here */ 102 }; 103 }; 104 105How to select correct ECC scheme for your device ? 106-------------------------------------------------- 107Higher ECC scheme usually means better protection against bit-flips and 108increased system lifetime. However, selection of ECC scheme is dependent 109on various other factors also like; 110 111(1) support of built in hardware engines. 112 Some legacy OMAP SoC do not have ELM harware engine, so those SoC cannot 113 support ecc-schemes with hardware error-correction (BCHx_HW). However 114 such SoC can use ecc-schemes with software library for error-correction 115 (BCHx_HW_DETECTION_SW). The error correction capability with software 116 library remains equivalent to their hardware counter-part, but there is 117 slight CPU penalty when too many bit-flips are detected during reads. 118 119(2) Device parameters like OOBSIZE. 120 Other factor which governs the selection of ecc-scheme is oob-size. 121 Higher ECC schemes require more OOB/Spare area to store ECC syndrome, 122 so the device should have enough free bytes available its OOB/Spare 123 area to accommodate ECC for entire page. In general following expression 124 helps in determining if given device can accommodate ECC syndrome: 125 "2 + (PAGESIZE / 512) * ECC_BYTES" >= OOBSIZE" 126 where 127 OOBSIZE number of bytes in OOB/spare area 128 PAGESIZE number of bytes in main-area of device page 129 ECC_BYTES number of ECC bytes generated to protect 130 512 bytes of data, which is: 131 '3' for HAM1_xx ecc schemes 132 '7' for BCH4_xx ecc schemes 133 '14' for BCH8_xx ecc schemes 134 '26' for BCH16_xx ecc schemes 135 136 Example(a): For a device with PAGESIZE = 2048 and OOBSIZE = 64 and 137 trying to use BCH16 (ECC_BYTES=26) ecc-scheme. 138 Number of ECC bytes per page = (2 + (2048 / 512) * 26) = 106 B 139 which is greater than capacity of NAND device (OOBSIZE=64) 140 Hence, BCH16 cannot be supported on given device. But it can 141 probably use lower ecc-schemes like BCH8. 142 143 Example(b): For a device with PAGESIZE = 2048 and OOBSIZE = 128 and 144 trying to use BCH16 (ECC_BYTES=26) ecc-scheme. 145 Number of ECC bytes per page = (2 + (2048 / 512) * 26) = 106 B 146 which can be accommodated in the OOB/Spare area of this device 147 (OOBSIZE=128). So this device can use BCH16 ecc-scheme. 148