This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM6412: Linux u-boot device tree for QSPI boot

Part Number: AM6412

Hi,

one of our customers is using the AM6412 on a custom board with QSPI Winbond flash W25Q01JV. Currently the boot stalls when u-boot.img is being loaded from flash. Attached is the bootup log.

The following changes to the device tree were made to support QSPI instead of OSPI.

&main_pmx0 {
                qspi0_pins_default: qspi0-pins-default {
                                pinctrl-single,pins = <
                                                AM64X_IOPAD(0x0000, PIN_OUTPUT, 0) /* (N20) OSPI0_CLK */
                                                AM64X_IOPAD(0x002c, PIN_OUTPUT, 0) /* (L19) OSPI0_CSn0 */
                                                AM64X_IOPAD(0x000c, PIN_INPUT, 0) /* (M19) OSPI0_D0 */
                                                AM64X_IOPAD(0x0010, PIN_INPUT, 0) /* (M18) OSPI0_D1 */
                                                AM64X_IOPAD(0x0014, PIN_INPUT, 0) /* (M20) OSPI0_D2 */
                                                AM64X_IOPAD(0x0018, PIN_INPUT, 0) /* (M21) OSPI0_D3 */
                                >;
                };
};


&qspi0 {
                pinctrl-names = "default";
                pinctrl-0 = <&qspi0_pins_default>;

                flash@0{
                                compatible = "jedec,spi-nor";
        #address-cells = <1>;
                                #size-cells = <1>;
                                reg = <0x0>;
        spi-max-frequency = <133000000>;
                };
};

Could someone review this, to see if anything was missed to support the QSPI Flash?

Are we missing anything else?

Is there AM64xx HW that has been used to validate QSPI Flash with u-boot bootflow?

Regards,

--Gunter

  • qspi_133_tx1_rx1_6io.log
    =~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2021.09.14 16:30:50 =~=~=~=~=~=~=~=~=~=~=~=
    
    U-Boot SPL 2021.01-00004-gd77252021a-dirty (Sep 13 2021 - 23:32:16 -0500)
    am642_init.c: board_init_f - call do_dt_magic
    EEPROM not available at 80, trying to read at 81
    Reading on-board EEPROM at 0x51 failed 1
    am642_init.c: board_init_f - call uclass_find_device_by_seq
    am642_init.c: board_init_f - call k3_sysfw_loader
    am642_init.c: board_init_f - call k3_sysfw_print_ver
    SYSFW ABI: 3.1 (firmware rev 0x0015 '21.5.0--v2021.05 (Terrific Llam')
    am642_init.c: board_init_f - call uclass_get_device
    am642_init.c: board_init_f - exit
    SPL initial stack usage: 13392 bytes
    spl.c: board_init_r - enter
    spl.c: board_init_r - call spl_set_bd
    spl.c: board_init_r - call mem_malloc_init
    spl.c: board_init_r - call timer_init
    spl.c: board_init_r - call spl_board_init
    spl.c: board_init_r - call bootcount_inc
    spl.c: board_init_r - call board_boot_order
    spl.c: board_init_r - call boot_from_devices
    spl.c: boot_from_devices - enter
    Trying to boot from SPI
    spl.c: spl_load_image - enter
    spl.c: spl_load_image - call loader->load_image
    spl_spi.c: spl_spi_load_image - enter
    spl_spi.c: spl_spi_load_image - call spi_flash_probe
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 16
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 8
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 64
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_select_read - enter
    spl-nor-core.c: spi_nor_select_read - exit
    spl_spi.c: spl_spi_load_image - call spl_spi_get_uboot_offs
    spl_spi.c: spl_spi_load_image - call spl_get_load_buffer
    spl_spi.c: spl_spi_load_image - call fdtdec_get_config_int
    spl_spi.c: spl_spi_load_image - call spi_flash_read 1
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x00080000, len 64
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 64
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read - exit
    spl_spi.c: spl_spi_load_image - Inside IS_ENABLED(CONFIG_SPL_LOAD_FIT)
    spl_spi.c: spl_spi_load_image - call spl_load_simple_fit - Inside IS_ENABLED(CONFIG_SPL_LOAD_FIT)
    spl_fit.c: spl_load_simple_fit - enter
    spl_fit.c: spl_load_simple_fit - call spl_get_load_buffer
    spl_fit.c: spl_load_simple_fit - call get_aligned_image_size
    spl_fit.c: spl_load_simple_fit - call info->read
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x00080000, len 1628
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 1628
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read - exit
    spl_fit.c: spl_load_simple_fit - call spl_load_simple_fit_skip_processing
    spl_fit.c: spl_load_simple_fit - call fdt_path_offset
    spl_fit.c: spl_load_simple_fit - call spl_fit_get_image_node 1
    spl_fit.c: spl_load_simple_fit - call spl_load_fit_image 2
    spl_fit.c: spl_load_fit_image - enter
    spl_fit.c: spl_load_fit_image - call fit_image_get_load
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_position
    spl_fit.c: spl_load_fit_image - call after fit_image_get_data_offset
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_size
    spl_fit.c: spl_load_fit_image - call info->read 0x00000000
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x0008065c, len 35280
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 35280
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read - exit
    spl_fit.c: spl_load_fit_image - exit
    spl_fit.c: spl_load_simple_fit - call spl_fit_image_get_os 1
    spl_fit.c: spl_load_simple_fit - Image OS is ARM Trusted Firmware
    spl_fit.c: spl_load_simple_fit - call spl_fit_get_image_node 4
    spl_fit.c: spl_load_simple_fit - call spl_load_fit_image 3
    spl_fit.c: spl_load_fit_image - enter
    spl_fit.c: spl_load_fit_image - call fit_image_get_load
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_position
    spl_fit.c: spl_load_fit_image - call after fit_image_get_data_offset
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_size
    spl_fit.c: spl_load_fit_image - call info->read 0x00000000
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x0008902c, len 0
    spl-nor-core.c: spi_nor_read - exit
    spl_fit.c: spl_load_fit_image - exit
    spl_fit.c: spl_load_simple_fit - call spl_fit_image_get_os 2
    spl_fit.c: spl_load_simple_fit - call spl_fit_image_get_os - Loadable is Trusted Execution Environment
    spl_fit.c: spl_load_simple_fit - call spl_fit_get_image_node 4
    spl_fit.c: spl_load_simple_fit - call spl_load_fit_image 3
    spl_fit.c: spl_load_fit_image - enter
    spl_fit.c: spl_load_fit_image - call fit_image_get_load
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_position
    spl_fit.c: spl_load_fit_image - call after fit_image_get_data_offset
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_size
    spl_fit.c: spl_load_fit_image - call info->read 0x00000000
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x0008902c, len 0
    spl-nor-core.c: spi_nor_read - exit
    spl_fit.c: spl_load_fit_image - exit
    spl_fit.c: spl_load_simple_fit - call spl_fit_image_get_os 2
    spl_fit.c: spl_load_simple_fit - call spl_fit_image_get_os - Loadable is Unknown OS
    spl_fit.c: spl_load_simple_fit - call spl_fit_get_image_node 4
    spl_fit.c: spl_load_simple_fit - call spl_load_fit_image 3
    spl_fit.c: spl_load_fit_image - enter
    spl_fit.c: spl_load_fit_image - call fit_image_get_load
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_position
    spl_fit.c: spl_load_fit_image - call after fit_image_get_data_offset
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_size
    spl_fit.c: spl_load_fit_image - call info->read 0x00000000
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x0008902c, len 199864
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 199864
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read - exit
    spl_fit.c: spl_load_fit_image - exit
    spl_fit.c: spl_load_simple_fit - call spl_fit_image_get_os 2
    spl_fit.c: spl_load_simple_fit - call spl_fit_image_get_os - Loadable is U-Boot
    spl_fit.c: spl_load_simple_fit - call spl_fit_append_fdt 2
    spl_fit.c: spl_load_fit_image - enter
    spl_fit.c: spl_load_fit_image - call fit_image_get_load
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_position
    spl_fit.c: spl_load_fit_image - call after fit_image_get_data_offset
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_size
    spl_fit.c: spl_load_fit_image - call info->read 0x00000000
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x000b9ce4, len 5316
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 5316
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read - exit
    spl_fit.c: spl_load_fit_image - exit
    spl_fit.c: spl_load_simple_fit - call spl_fit_record_loadable
    spl_fit.c: spl_load_simple_fit - call spl_fit_get_image_node 4
    spl_fit.c: spl_load_simple_fit - call spl_fit_get_image_node 4 node < 0
    spl_fit.c: spl_load_simple_fit - exit
    spl_spi.c: spl_spi_load_image - exit
    spl.c: spl_load_image - exit
    spl.c: board_init_r - call spl_perform_fixups
    spl.c: board_init_r - call bootstage_mark_name
    spl.c: board_init_r - call spl_board_prepare_for_boot
    spl.c: board_init_r - call jump_to_image_no_args
    Starting ATF on ARM64 core...
    
    NOTICE:  BL31: v2.5(release):v2.5-432-ga4ea20502
    NOTICE:  BL31: Built : 23:32:13, Sep 13 2021
    
    U-Boot SPL 2021.01-00004-gd77252021a-dirty (Sep 13 2021 - 23:33:31 -0500)
    am642_init.c: board_init_f - call do_dt_magic
    EEPROM not available at 80, trying to read at 81
    Reading on-board EEPROM at 0x51 failed 1
    am642_init.c: board_init_f - call k3_sysfw_print_ver
    SYSFW ABI: 3.1 (firmware rev 0x0015 '21.5.0--v2021.05 (Terrific Llam')
    am642_init.c: board_init_f - exit
    spl.c: board_init_r - enter
    spl.c: board_init_r - call spl_set_bd
    spl.c: board_init_r - call mem_malloc_init
    spl.c: board_init_r - call timer_init
    spl.c: board_init_r - call bootcount_inc
    spl.c: board_init_r - call board_boot_order
    spl.c: board_init_r - call boot_from_devices
    spl.c: boot_from_devices - enter
    Trying to boot from SPI
    spl.c: spl_load_image - enter
    spl.c: spl_load_image - call loader->load_image
    spl_spi.c: spl_spi_load_image - enter
    spl_spi.c: spl_spi_load_image - call spi_flash_probe
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 16
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 8
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 64
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_select_read - enter
    spl-nor-core.c: spi_nor_select_read - exit
    spl_spi.c: spl_spi_load_image - call spl_spi_get_uboot_offs
    spl_spi.c: spl_spi_load_image - call spl_get_load_buffer
    spl_spi.c: spl_spi_load_image - call fdtdec_get_config_int
    spl_spi.c: spl_spi_load_image - call spi_flash_read 1
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x00280000, len 64
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 64
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read - exit
    spl_spi.c: spl_spi_load_image - Inside IS_ENABLED(CONFIG_SPL_LOAD_FIT)
    spl_spi.c: spl_spi_load_image - call spl_load_simple_fit - Inside IS_ENABLED(CONFIG_SPL_LOAD_FIT)
    spl_fit.c: spl_load_simple_fit - enter
    spl_fit.c: spl_load_simple_fit - call spl_get_load_buffer
    spl_fit.c: spl_load_simple_fit - call get_aligned_image_size
    spl_fit.c: spl_load_simple_fit - call info->read
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x00280000, len 1300
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 1300
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    spl-nor-core.c: spi_nor_read_data - exit
    spl-nor-core.c: spi_nor_read - exit
    spl_fit.c: spl_load_simple_fit - call spl_load_simple_fit_skip_processing
    spl_fit.c: spl_load_simple_fit - call fdt_path_offset
    spl_fit.c: spl_load_simple_fit - call spl_fit_get_image_node 1
    spl_fit.c: spl_load_simple_fit - call spl_load_fit_image 2
    spl_fit.c: spl_load_fit_image - enter
    spl_fit.c: spl_load_fit_image - call fit_image_get_load
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_position
    spl_fit.c: spl_load_fit_image - call after fit_image_get_data_offset
    spl_fit.c: spl_load_fit_image - call fit_image_get_data_size
    spl_fit.c: spl_load_fit_image - call info->read 0x00000000
    spl-nor-core.c: spi_nor_read - enter
    spl-nor-core.c: spi_nor_read - from 0x00280514, len 865952
    spl-nor-core.c: spi_nor_read - call nor->read
    spl-nor-core.c: spi_nor_read_data - enter
    spl-nor-core.c: spi_nor_read_data - while remaining 865952
    spl-nor-core.c: spi_nor_read_data - call spi_mem_adjust_op_size
    spl-nor-core.c: spi_nor_read_data - call spi_mem_exec_op
    

    Here is the boot up log file.

  • Hi Gunter,
    This is the re-cap from our offline discussions.
    It is good to know QSPI boot started working on your customer HW.

    I’m adding some general notes below:
    (a). There’s always a specific DTB file associated with the each boot binary as listed below:
    1. tiboot3.bin: R5 SPL with the DTB build under “/r5_build_folder/spl/dts/”
    2. tispl.bin: A53 SPL with the DTB build under “/a53_build_folder/spl/dts/”
    3. u-boot.img: A53 u-boot with the DTB build under “/a53_build_folder/arch/arm/dts/”

    (b). One option to parse/decode the generated binary DTB file is listed below using “k3-am642-r5-evm.dtb” as an example.
    “dtc -I dtb k3-am642-r5-evm.dtb > k3-am642-r5-evm.dtb_decode”.
    I’d recommend to decode the three DTB files associated with the three boot binary noted in the last step to check the QSPI device node are all modified correctly.

    (c). In TI Linux SDK package, in order to support TI boards, multiple DTB files are bundled together with the boot binary as a FIT image.
    During boot, the boot binary detects the board_ID via reading pre-programmed EEPROM, and then loads the matching DTB file from the FIT image.
    For example, “k3-am642-r5-evm.dtb” and “k3-am642-r5-sk.dtb” are packed into tiboot3.bin file, and “k3-am642-r5-evm.dtb” is loaded on AM64x GP EVM during boot.

    Best,
    -Hong