[U-Boot] am335x: GPMC: reading speed with prefetch mode

Yegor Yefremov yegorslists at googlemail.com
Fri Mar 20 14:37:34 CET 2015


On Fri, Mar 20, 2015 at 1:37 PM, Roger Quadros <rogerq at ti.com> wrote:
> On 20/03/15 13:24, Yegor Yefremov wrote:
>> On Thu, Mar 19, 2015 at 4:56 PM, Daniel Mack <zonque at gmail.com> wrote:
>>> On 03/19/2015 04:13 PM, Yegor Yefremov wrote:
>>>> Strange. Have tried with "nand read" command, but still the same
>>>> result with and without CONFIG_NAND_OMAP_GPMC_PREFETCH :
>>>>
>>>> [2.150655 0.001006] NAND read: device 0 offset 0x260000, size 0x1200000
>>>> [15.978943 13.828288]  18874368 bytes read: OK
>>>
>>> What about adding some debug prints to the prefetch setup function and
>>> see if it is executed at all?
>>
>> I2C:   ready
>> DRAM:  256 MiB
>> NAND: prefetch enabled
>> NAND: 256 MiB
>> MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
>> Using default environment
>>
>> I've added "NAND: prefetch enabled" output for:
>>
>> #ifdef CONFIG_NAND_OMAP_GPMC_PREFETCH
>>         else {
>>                 printf("NAND: prefetch enabled\n");
>>                 nand->read_buf = omap_nand_read_prefetch8;
>>         }
>> #else
>>
>> I've also put printf() into omap_nand_read_prefetch8() just to make
>> sure it is called - it was called.
>>
>> Further ideas?
>>
>>>> Daniel, do you have the numbers? Images size and load time? What can I expect?
>>>
>>> I don't currently have the setup at hand, sorry. But the number I recall
>>> from an email conversation back then is: The time from power-on, loading
>>> SPL, loading U-Boot, leeching a 6MB uImage, jumping into it waiting for
>>> the console to start dumping the kernel boot messages was less than 5
>>> seconds in total.
>>
>> I Linux I had ti,nand-xfer-type = "polled";. After replacing it with
>> ti,nand-xfer-type = "prefetch-polled"; I now get
>>
>> # dd if=/dev/mtdblock5 of=/dev/null bs=2M count=8
>> 8+0 records in
>> 8+0 records out
>> 16777216 bytes (17 MB) copied, 2.58744 s, 6.5 MB/s
>>
>> instead of:
>>
>> # dd if=/dev/mtdblock5 of=/dev/null bs=2M count=8
>> 8+0 records in
>> 8+0 records out
>> 16777216 bytes (17 MB) copied, 6.05157 s, 2.8 MB/s
>>
>> Do I see it right, that DMA support is not implemented in am33xx.dtsi?
>
> DMA support will have to be enabled in the board dts. e.g. am335x-bone.dts.
>
> if ti,nand-xfer-type is not specified (like in mainline kernel) then it
> defaults to prefetch-polled

I get following error:

omap-gpmc 50000000.gpmc: GPMC revision 6.0
nand: device found, Manufacturer ID: 0x2c, Chip ID: 0xda
nand: Micron MT29F2G08ABAEAWP
nand: 256MiB, SLC, page size: 2048, OOB size: 64
omap2-nand omap2-nand.0: DMA engine request failed

Kernel: 3.18.1

GPMC config:

&gpmc {
        pinctrl-names = "default";
        pinctrl-0 = <&nandflash_pins_s0>;
        ranges = <0 0 0x08000000 0x10000000>;   /* CS0: NAND */
        status = "okay";

        nand at 0,0 {
                reg = <0 0 4>; /* CS0, offset 0 */
                nand-bus-width = <8>;
                ti,nand-ecc-opt = "bch8";
                ti,nand-xfer-type = "prefetch-dma";

                gpmc,device-nand = "true";
                gpmc,device-width = <1>;
                gpmc,sync-clk-ps = <0>;
                gpmc,cs-on-ns = <0>;
                gpmc,cs-rd-off-ns = <44>;
                gpmc,cs-wr-off-ns = <44>;
                gpmc,adv-on-ns = <6>;
                gpmc,adv-rd-off-ns = <34>;
                gpmc,adv-wr-off-ns = <44>;
                gpmc,we-on-ns = <0>;
                gpmc,we-off-ns = <40>;
                gpmc,oe-on-ns = <0>;
                gpmc,oe-off-ns = <54>;
                gpmc,access-ns = <64>;
                gpmc,rd-cycle-ns = <82>;
                gpmc,wr-cycle-ns = <82>;
                gpmc,wait-on-read = "true";
                gpmc,wait-on-write = "true";
                gpmc,bus-turnaround-ns = <0>;
                gpmc,cycle2cycle-delay-ns = <0>;
                gpmc,clk-activation-ns = <0>;
                gpmc,wait-monitoring-ns = <0>;
                gpmc,wr-access-ns = <40>;
                gpmc,wr-data-mux-bus-ns = <0>;

                #address-cells = <1>;
                #size-cells = <1>;
                elm_id = <&elm>;
        };
};

Any idea?

Btw. where DMA support should be configured? GPMC config has no "dmas"
like other components like mmc, uart, USB etc.

                gpmc: gpmc at 50000000 {
                        compatible = "ti,am3352-gpmc";
                        ti,hwmods = "gpmc";
                        ti,no-idle-on-init;
                        reg = <0x50000000 0x2000>;
                        interrupts = <100>;
                        gpmc,num-cs = <7>;
                        gpmc,num-waitpins = <2>;
                        #address-cells = <2>;
                        #size-cells = <1>;
                        status = "disabled";
                };


Yegor


More information about the U-Boot mailing list