Skip to contentSkip to conversation

ndfc driver

PATCH In review Kostas Nakos 2 participants 9 messages Dec 23, 2008 – Jan 8, 2009 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ndfc driver

Hello list,

with respect to Sean's updated patch ( http://lists.infradead.org/pipermail/linux-mtd/2008-December/023932.html ) of the ndfc driver:

We are using an AMCC PPC440EPx based board which requires the ndfc driver to handle the nand memory. We have encountered 2 problems with this latest patch:

1) Kernel oops after of_iomap() of ndfc_probe(). The external nand memory is bound to chip select 0. The respective dts "reg" line was 'reg = <0 d0000000 2000>;'. Using chip selects greater than zero do not crash the kernel.

2) Byte order wrong in ndfc_calculate_ecc(). ecc_code[0] and ecc_code[1] have been exchanged in this version of the patch which lead to ecc errors being reported during mounting (and of course, a failed mount operation).

These problems have been solved: (1) -hackish way- by using a dts line like this 'reg = <1 d0000000 2000>;' and calculating the chip select in ndfc_probe() like this 'ndfc->chip_select = reg[0] - 1;'. (2) has been fixed by returning to the previous byte order of ecc_code.

Cheers,
Kostas

#1 lore raw
Quoted 6 lines · On Tue, 23 Dec 2008 14:26:18 +0200 "Kostas Nakos"…

Hello list,

with respect to Sean's updated patch (
http://lists.infradead.org/pipermail/linux-mtd/2008-December/023932.html
) of the ndfc driver:

Quoted 8 lines

We are using an AMCC PPC440EPx based board which requires the ndfc driver to handle the nand memory. We have encountered 2 problems with this latest patch:

1) Kernel oops after of_iomap() of ndfc_probe(). The external nand memory is bound to chip select 0. The respective dts "reg" line was 'reg = <0 d0000000 2000>;'. Using chip selects greater than zero do not crash the kernel.

I am not a DTS expert, I just use it ;) But are you sure the second value should be d0000000?

Quoted 4 lines

2) Byte order wrong in ndfc_calculate_ecc(). ecc_code[0] and ecc_code[1] have been exchanged in this version of the patch which lead to ecc errors being reported during mounting (and of course, a failed mount operation).

Are you using u-boot and, if so, what version? The ecc_code was changed to match u-boot. We are using a heavily modified 1.3.3.

This may need to be a config option, since we cannot guarantee what version of u-boot they are running.

Cheers,
Sean

author
#2 lore raw

Hi Sean,

Thanks for your comments.

Quoted 2 lines · Sean MacLennan

I am not a DTS expert, I just use it ;) But are you sure the second value should be d0000000?

Same here :-) These values were used in the previous incarnation of the dts file
with a 2.6.26 kernel so I "migrated" them to 2.6.28-rc8. During my numerous experiments to get the driver working, I *think* I have tried out both <0 0 2000>
and <1 0 2000>, based on your provided template, and they yielded no good results.
BTW, what I think the crash was all about when iomap()-ing to chip select 0,
was that addresses, in this instance, of "0d0000000" collided with the kernel
somehow, as opposed to "1d0000000" or "2d0000000" which did not. Still, this is
an un-educated guess :-)

Quoted 5 lines

Are you using u-boot and, if so, what version? The ecc_code was changed to match u-boot. We are using a heavily modified 1.3.3.

This may need to be a config option, since we cannot guarantee what version of u-boot they are running.

Yep, we're using u-boot.
OK, this makes sense and I would also like to point out that I was trying to
mount partitions created with the previous ndfc driver & kernel.

Unfortunately, I won't have access to the board until next week and I cannot
remember accurately the u-boot version. So, if you're patient, I'll run your
suggested reg <...> tests and provide more info on this after Xmas :-)

Thanks again,
Kostas

#3 lore raw
Quoted 5 lines · On Wed, 24 Dec 2008 08:58:18 +0200 "knakos" <[email protected]> wrote:

Unfortunately, I won't have access to the board until next week and I cannot
remember accurately the u-boot version. So, if you're patient, I'll run your
suggested reg <...> tests and provide more info on this after Xmas :-)

No problem. I will probably have no email access for the next week.

Cheers,
Sean

#4 lore raw
In reply to Sean MacLennan
Quoted 2 lines · Sean MacLennan

I am not a DTS expert, I just use it ;) But are you sure the second value should be d0000000?

Alright, with:

<0 0 2000> ->

__ioremap(): phys addr 0x0 is RAM lr c0008c94
ndfc 0.ndfc: failed to get memory
ndfc: probe of 0.ndfc failed with error -5

I notice that the 0xd0000000 value is also defined in the (our) platform include for our platform in u-boot (include/configs/...):

#define CFG_NAND_ADDR 0xd0000000

Quoted 2 lines

Are you using u-boot and, if so, what version? The ecc_code was changed to match u-boot. We are using a heavily modified 1.3.3.

The uboot version string is:

U-Boot 1.3.3-svn2646 (Jul 11 2008 - 15:45:55)

Best Regards,
Kostas

#5 lore raw
Quoted 4 lines · On Mon, 29 Dec 2008 12:58:22 +0200 "Kostas Nakos"…

Alright, with:

<0 0 2000> ->

Quoted 8 lines

__ioremap(): phys addr 0x0 is RAM lr c0008c94
ndfc 0.ndfc: failed to get memory
ndfc: probe of 0.ndfc failed with error -5

I notice that the 0xd0000000 value is also defined in the (our) platform include for our platform in u-boot (include/configs/...):

#define CFG_NAND_ADDR 0xd0000000

That is where the NAND is on the warp. Could you post the complete dts?

Cheers,
Sean

#6 lore raw
Quoted 1 line · Sean MacLennan

That is where the NAND is on the warp. Could you post the complete dts?

Of course; attached. This is the one I use to boot the 2.6.28 kernel (with the hackish ndfc patches). The only changes required while migrating the entire dts from 2.6.26 to .28 concern just the ndfc block and particularly the parameter names according to the new scheme.

Thanks,
Kostas

/ {
        #address-cells = <2>;
        #size-cells = <1>;
        model = "amcc";
        compatible = "amcc";
        dcr-parent = <&/cpus/cpu@0>;

        aliases {
                ethernet0 = &EMAC0;
                ethernet1 = &EMAC1;
                serial0 = &UART0;
                serial1 = &UART1;
        };

        cpus {
                #address-cells = <1>;
                #size-cells = <0>;

                cpu@0 {
                        device_type = "cpu";
                        model = "PowerPC,440EPx";
                        reg = <0>;
                        clock-frequency = <0>; /* Filled in by zImage */
                        timebase-frequency = <0>; /* Filled in by zImage */
                        i-cache-line-size = <20>;
                        d-cache-line-size = <20>;
                        i-cache-size = <8000>;
                        d-cache-size = <8000>;
                        dcr-controller;
                        dcr-access-method = "native";
                };
        };

        memory {
                device_type = "memory";
                reg = <0 0 0>; /* Filled in by zImage */
        };

        UIC0: interrupt-controller0 {
                compatible = "ibm,uic-440epx","ibm,uic";
                interrupt-controller;
                cell-index = <0>;
                dcr-reg = <0c0 009>;
                #address-cells = <0>;
                #size-cells = <0>;
                #interrupt-cells = <2>;
        };

        UIC1: interrupt-controller1 {
                compatible = "ibm,uic-440epx","ibm,uic";
                interrupt-controller;
                cell-index = <1>;
                dcr-reg = <0d0 009>;
                #address-cells = <0>;
                #size-cells = <0>;
                #interrupt-cells = <2>;
                interrupts = <1e 4 1f 4>; /* cascade */
                interrupt-parent = <&UIC0>;
        };

        UIC2: interrupt-controller2 {
                compatible = "ibm,uic-440epx","ibm,uic";
                interrupt-controller;
                cell-index = <2>;
                dcr-reg = <0e0 009>;
                #address-cells = <0>;
                #size-cells = <0>;
                #interrupt-cells = <2>;
                interrupts = <1c 4 1d 4>; /* cascade */
                interrupt-parent = <&UIC0>;
        };

        SDR0: sdr {
                compatible = "ibm,sdr-440epx", "ibm,sdr-440ep";
                dcr-reg = <00e 002>;
        };

        CPR0: cpr {
                compatible = "ibm,cpr-440epx", "ibm,cpr-440ep";
                dcr-reg = <00c 002>;
        };

        plb {
                compatible = "ibm,plb-440epx", "ibm,plb4";
                #address-cells = <2>;
                #size-cells = <1>;
                ranges;
                clock-frequency = <0>; /* Filled in by zImage */

                SDRAM0: sdram {
                        compatible = "ibm,sdram-440epx", "ibm,sdram-44x-ddr2denali";
                        dcr-reg = <010 2>;
                };

                DMA0: dma {
                        compatible = "ibm,dma-440epx", "ibm,dma-4xx";
                        dcr-reg = <100 027>;
                };

                MAL0: mcmal {
                        compatible = "ibm,mcmal-440epx", "ibm,mcmal2";
                        dcr-reg = <180 62>;
                        num-tx-chans = <2>;
                        num-rx-chans = <2>;
                        interrupt-parent = <&MAL0>;
                        interrupts = <0 1 2 3 4>;
                        #interrupt-cells = <1>;
                        #address-cells = <0>;
                        #size-cells = <0>;
                        interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
                                        /*RXEOB*/ 1 &UIC0 b 4
                                        /*SERR*/  2 &UIC1 0 4
                                        /*TXDE*/  3 &UIC1 1 4
                                        /*RXDE*/  4 &UIC1 2 4>;
                        interrupt-map-mask = <ffffffff>;
                };

                ndfc@0,d0000000 {
                        device_type = "nand";
                        compatible = "ibm,ndfc";
                        reg = <1 d0000000 2000>;
                        bank-settings = <80002222>;
                        ccr = <00001000>;
                        #address-cells = <1>;
                        #size-cells = <1>;

                        nand {
                                #address-cells = <1>;
                                #size-cells = <1>;

                                partition@0 {
                                        label = "u-boot";
                                        reg = <0 60000>;
                                };
                                partition@1 {
                                        label = "uboot-env-1";
                                        reg = <60000 4000>;
                                };
                                partition@2 {
                                        label = "uboot-env-2";
                                        reg = <64000 4000>;
                                };
                                partition@3 {
                                        label = "device-tree";
                                        reg = <68000 4000>;
                                };
                                partition@4 {
                                        label = "bootfs";
                                        reg = <6c000 340000>;
                                };
                                partition@5 {
                                        label = "rootfs";
                                        reg = <3ac000 0>;
                                };

                        };
                };

                USB0: ehci@e0000300 {
                        compatible = "ibm,usb-ehci-440epx", "usb-ehci";
                        interrupt-parent = <&UIC0>;
                        interrupts = <1a 4>;
                        reg = <0 e0000300 90 0 e0000390 70>;
                        big-endian;
                };

                POB0: opb {
                        compatible = "ibm,opb-440epx", "ibm,opb";
                        #address-cells = <1>;
                        #size-cells = <1>;
                        ranges = <00000000 1 00000000 80000000
                                          80000000 1 80000000 80000000>;
                        interrupt-parent = <&UIC1>;
                        interrupts = <7 4>;
                        clock-frequency = <0>; /* Filled in by zImage */

                        EBC0: ebc {
                                compatible = "ibm,ebc-440epx", "ibm,ebc";
                                dcr-reg = <012 2>;
                                #address-cells = <2>;
                                #size-cells = <1>;
                                clock-frequency = <0>; /* Filled in by zImage */
                                interrupts = <5 1>;
                                interrupt-parent = <&UIC1>;

                        };

                        UART0: serial@ef600300 {
                                device_type = "serial";
                                compatible = "ns16550";
                                reg = <ef600300 8>;
                                virtual-reg = <ef600300>;
                                clock-frequency = <0>; /* Filled in by zImage */
                                current-speed = <1c200>;
                                interrupt-parent = <&UIC0>;
                                interrupts = <0 4>;
                        };

                        UART1: serial@ef600400 {
                                device_type = "serial";
                                compatible = "ns16550";
                                reg = <ef600400 8>;
                                virtual-reg = <ef600400>;
                                clock-frequency = <0>;
                                current-speed = <0>;
                                interrupt-parent = <&UIC0>;
                                interrupts = <1 4>;
                        };

                        IIC0: i2c@ef600700 {
                                compatible = "ibm,iic-440gpx", "ibm,iic";
                                reg = <ef600700 14>;
                                index = <0>;
                                interrupt-parent = <&UIC0>;
                                interrupts = <2 4>;
                        };

                        IIC1: i2c@ef600800 {
                                compatible = "ibm,iic-440gpx", "ibm,iic";
                                reg = <ef600800 14>;
                                index = <1>;
                                interrupt-parent = <&UIC0>;
                                interrupts = <7 4>;
                        };

                        GPIO0: gpio@ef600b00 {
                                compatible = "ibm,gpio-440ep";
                                reg = <ef600b00 48>;
                                #gpio-cells = <2>;
                                gpio-controller;
                        };

                        GPIO1: gpio@ef600c00 {
                                compatible = "ibm,gpio-440ep";
                                reg = <ef600c00 48>;
                                #gpio-cells = <2>;
                                gpio-controller;
                        };

                        ZMII0: emac-zmii@ef600d00 {
                                compatible = "ibm,zmii-440epx", "ibm,zmii";
                                reg = <ef600d00 c>;
                        };

                        RGMII0: emac-rgmii@ef601000 {
                                compatible = "ibm,rgmii-440epx", "ibm,rgmii";
                                reg = <ef601000 8>;
                                has-mdio;
                        };

                        EMAC0: ethernet@ef600e00 {
                                device_type = "network";
                                compatible = "ibm,emac-440epx", "ibm,emac4";
                                interrupt-parent = <&EMAC0>;
                                interrupts = <0 1>;
                                #interrupt-cells = <1>;
                                #address-cells = <0>;
                                #size-cells = <0>;
                                interrupt-map = </*Status*/ 0 &UIC0 18 4
                                                /*Wake*/  1 &UIC1 1d 4>;
                                reg = <ef600e00 70>;
                                local-mac-address = [000000000000];
                                mal-device = <&MAL0>;
                                mal-tx-channel = <0>;
                                mal-rx-channel = <0>;
                                cell-index = <0>;
                                max-frame-size = <2328>;
                                rx-fifo-size = <1000>;
                                tx-fifo-size = <800>;
                                phy-mode = "rgmii";
                                phy-map = <00000000>;
                                zmii-device = <&ZMII0>;
                                zmii-channel = <0>;
                                rgmii-device = <&RGMII0>;
                                rgmii-channel = <0>;
                                has-inverted-stacr-oc;
                                has-new-stacr-staopc;
                        };

                        EMAC1: ethernet@ef600f00 {
                                device_type = "network";
                                compatible = "ibm,emac-440epx", "ibm,emac4";
                                interrupt-parent = <&EMAC1>;
                                interrupts = <0 1>;
                                #interrupt-cells = <1>;
                                #address-cells = <0>;
                                #size-cells = <0>;
                                interrupt-map = </*Status*/ 0 &UIC0 19 4
                                                /*Wake*/  1 &UIC1 1f 4>;
                                reg = <ef600f00 70>;
                                local-mac-address = [000000000000];
                                mal-device = <&MAL0>;
                                mal-tx-channel = <1>;
                                mal-rx-channel = <1>;
                                cell-index = <1>;
                                max-frame-size = <2328>;
                                rx-fifo-size = <1000>;
                                tx-fifo-size = <800>;
                                phy-mode = "rgmii";
                                phy-map = <00000000>;
                                zmii-device = <&ZMII0>;
                                zmii-channel = <1>;
                                rgmii-device = <&RGMII0>;
                                rgmii-channel = <1>;
                                has-inverted-stacr-oc;
                                has-new-stacr-staopc;
                        };
                        LEDS0: led0 {
                           compatible = "gpio-led";

                           label="led0";

                           gpios = <&GPIO1               1  0>;
                        };

                        LEDS1: led1 {
                           compatible = "gpio-led";

                           label="led1";

                           gpios = <&GPIO1               0  0>;
                        };

                        LEDS2: led2 {
                           compatible = "gpio-led";

                           label="led2";

                           gpios = <&GPIO0               1f  0>;
                        };
                        LEDS3: led3 {
                           compatible = "gpio-led";

                           label="led3";

                           gpios = <&GPIO0               1e  0>;
                        };
                        LEDS4: led4 {
                           compatible = "gpio-led";

                           label="led4";

                           gpios = <&GPIO0               1d  0>;
                        };

                        BUTTON0: button {
                           gpios = <&GPIO1               c  0
                                    >;
                           compatible = "gpio-button";
                           interrupt-parent = <&UIC0>;
                           interrupts = <1b 2>;
                        };

                };

                PCI0: pci@1ec000000 {
                        device_type = "pci";
                        #interrupt-cells = <1>;
                        #size-cells = <2>;
                        #address-cells = <3>;
                        compatible = "ibm,plb440epx-pci", "ibm,plb-pci";
                        primary;
                        reg = <1 eec00000 8     /* Config space access */
                               1 eed00000 4     /* IACK */
                               1 eed00000 4     /* Special cycle */
                               1 ef400000 40>;  /* Internal registers */

                        ranges = <02000000 0 80000000 1 80000000 0 40000000
                                01000000 0 00000000 1 e8000000 0 00010000
                                01000000 0 00000000 1 e8800000 0 03800000>;

                        dma-ranges = <42000000 0 0 0 0 0 80000000>;

                        interrupt-map-mask = <2800 0 0 0>;
                        interrupt-map = < 
                                          2000 0 0 0 &UIC2 3 8
                                          2800 0 0 0 &UIC2 4 8
                                        >;
                };
        };

        chosen {
                linux,stdout-path = "/plb/opb/serial@ef600300";
                bootargs = "console=ttyS0,115200 root=1f05 rootfstype=jffs2 getty_cons=ttyS0";
        };
};
#7 lore raw
Quoted 5 lines · On Wed, 07 Jan 2009 11:51:18 +0200 "Kostas Nakos"…

Of course; attached. This is the one I use to boot the 2.6.28 kernel (with the hackish ndfc patches). The only changes required while migrating the entire dts from 2.6.26 to .28 concern just the ndfc block and particularly the parameter names according to the new scheme.

The ndfc entry must be a child of the ebc entry. So move the ndfc into the ebc entry, and change the reg back to <0 0 2000>. It should then work.

Cheers,
Sean

#8 lore raw
Quoted 3 lines · Sean MacLennan

The ndfc entry must be a child of the ebc entry. So move the ndfc into the ebc entry, and change the reg back to <0 0 2000>. It should then work.

OK, I tried that. I had the same crashes, unless I reverted to my hacks and also set the address to 0xd0000000. So, exactly the same behavior. Note also that the dts in use has been derived from a sequoia-based dev board setup, back in 2.6.26. Let me know if there's anything else you want me to try out.

Thanks for your efforts,
Kostas