diff --git a/source/linux/How_to_Guides/Target/How_to_boot_quickly.rst b/source/linux/How_to_Guides/Target/How_to_boot_quickly.rst index d38d38aa5..d90b059f6 100644 --- a/source/linux/How_to_Guides/Target/How_to_boot_quickly.rst +++ b/source/linux/How_to_Guides/Target/How_to_boot_quickly.rst @@ -12,7 +12,7 @@ Moreover, in the context of the rapid technological advancements and increasing .. note:: - The same workflow is applied to the entire Sitara MPU family, but for each SoC, specific steps will differ and will be highlighted + The same workflow is applied to the entire Sitara MPU family, but for each SoC, specific steps will differ and will be highlighted The objectives of this document are as follows: @@ -26,41 +26,41 @@ The objectives of this document are as follows: Software environment ^^^^^^^^^^^^^^^^^^^^ -This guide uses 10.0 Processor SDK as reference. +This guide uses Processor SDK and MCU+SDK as reference. .. ifconfig:: CONFIG_part_variant in ('AM62X') - - `PROCESSOR-SDK-LINUX-AM62X `_ + - `PROCESSOR-SDK-LINUX-AM62X `_ - - `MCU+ SDK AM62X `_ + - `MCU+ SDK AM62X `_ .. ifconfig:: CONFIG_part_variant in ('AM62AX') - - `PROCESSOR-SDK-LINUX-AM62AX `_ + - `PROCESSOR-SDK-LINUX-AM62AX `_ - - `MCU+ SDK AM62AX `_ + - `MCU+ SDK AM62AX `_ .. ifconfig:: CONFIG_part_variant in ('AM62PX') - - `PROCESSOR-SDK-LINUX-AM62PX `_ + - `PROCESSOR-SDK-LINUX-AM62PX `_ - - `MCU+ SDK AM62PX `_ + - `MCU+ SDK AM62PX `_ Hardware setup and equipment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Development kit used for testing - .. ifconfig:: CONFIG_part_variant in ('AM62X') + .. ifconfig:: CONFIG_part_variant in ('AM62X') - - `SK-AM62 `_ + - `SK-AM62 `_ - .. ifconfig:: CONFIG_part_variant in ('AM62AX') + .. ifconfig:: CONFIG_part_variant in ('AM62AX') - - `SK-AM62A `_ + - `SK-AM62A `_ - .. ifconfig:: CONFIG_part_variant in ('AM62PX') + .. ifconfig:: CONFIG_part_variant in ('AM62PX') - - `SK-AM62P-LP `_ + - `SK-AM62P-LP `_ - Micro-USB cables for UART connection @@ -71,7 +71,7 @@ Typical boot flow This section details the Out-Of-Box boot sequence: .. Image:: /images/typical_bootflow_spl_mpu.png - :align: center + :align: center **PMIC** or Power Management IC controls the power supply to the SoC. As a unit, it consists of diode controllers, DC-DC conversion and voltage regulation. TI's Fulton PMIC needs about 30ms to supply power while Burton PMIC requires 18ms. @@ -95,7 +95,7 @@ Optimized bootflow This section describes an overview of the modifications that can be done to achieve shorter boot times. The succeeding sections will detail how to achieve these sequences. .. Image:: /images/optimized_bootflow_sbl_mpu.png - :align: center + :align: center .. note:: @@ -106,144 +106,144 @@ Reducing bootloader time - Falcon Mode: - This is a feature that allows us to skip **A53 SPL** and **U-boot proper** and jump to TF-A and then the kernel directly saving ~5s in our boot time. It is implemented differently depending on the bootloader. + This is a feature that allows us to skip **A53 SPL** and **U-boot proper** and jump to TF-A and then the kernel directly saving ~5s in our boot time. It is implemented differently depending on the bootloader. - Choosing the right bootmedia: - +------------------+--------------+--------------------+----------------------------------+ - | Part | Bootmedia | Theoretical Read | Default offering | - | | | performance (MBps) | | - +------------------+--------------+--------------------+----------+-----------+-----------+ - | | | | AM62 EVM | AM62A EVM | AM62P EVM | - +==================+==============+====================+==========+===========+===========+ - | S28HS512T | OSPI-NOR | 330 | YES | NO | YES | - +------------------+--------------+--------------------+----------+-----------+-----------+ - | W35N01JWTBAG | OSPI-NAND | 50 | NO | YES | NO | - +------------------+--------------+--------------------+----------+-----------+-----------+ - | MTFC16GAPALBH-IT | eMMC (HS200) | 200 | YES | YES | NO | - +------------------+--------------+--------------------+----------+-----------+-----------+ - | MTFC32GAZAQHD-IT | eMMC (HS400) | 400 | NO | NO | YES | - +------------------+--------------+--------------------+----------+-----------+-----------+ + +------------------+--------------+--------------------+----------------------------------+ + | Part | Bootmedia | Theoretical Read | Default offering | + | | | performance (MBps) | | + +------------------+--------------+--------------------+----------+-----------+-----------+ + | | | | AM62 EVM | AM62A EVM | AM62P EVM | + +==================+==============+====================+==========+===========+===========+ + | S28HS512T | OSPI-NOR | 330 | YES | NO | YES | + +------------------+--------------+--------------------+----------+-----------+-----------+ + | W35N01JWTBAG | OSPI-NAND | 50 | NO | YES | NO | + +------------------+--------------+--------------------+----------+-----------+-----------+ + | MTFC16GAPALBH-IT | eMMC (HS200) | 200 | YES | YES | NO | + +------------------+--------------+--------------------+----------+-----------+-----------+ + | MTFC32GAZAQHD-IT | eMMC (HS400) | 400 | NO | NO | YES | + +------------------+--------------+--------------------+----------+-----------+-----------+ .. ifconfig:: CONFIG_part_variant in ('AM62X') - You can track current performance numbers here: `AM62X `_ + You can track current performance numbers here: `AM62X `_ .. ifconfig:: CONFIG_part_variant in ('AM62AX') - You can track current performance numbers here: `AM62AX `_ + You can track current performance numbers here: `AM62AX `_ .. ifconfig:: CONFIG_part_variant in ('AM62PX') - You can track current performance numbers here: `AM62PX `_ + You can track current performance numbers here: `AM62PX `_ - Flashing binaries: - .. ifconfig:: CONFIG_part_variant in ('AM62X') + .. ifconfig:: CONFIG_part_variant in ('AM62X') - - `UART flashing tool AM62X `_ + - `UART flashing tool AM62X `_ - - U-Boot eMMC flashing tool AM62X: :ref:`u-boot-build-guide-environment-k3` + - U-Boot eMMC flashing tool AM62X: :ref:`u-boot-build-guide-environment-k3` - - :ref:`U-Boot SPI flashing tool AM62X ` + - :ref:`U-Boot SPI flashing tool AM62X ` - .. ifconfig:: CONFIG_part_variant in ('AM62AX') + .. ifconfig:: CONFIG_part_variant in ('AM62AX') - - `UART flashing tool AM62AX `_ + - `UART flashing tool AM62AX `_ - - U-Boot eMMC flashing tool AM62AX: :ref:`u-boot-build-guide-environment-k3` + - U-Boot eMMC flashing tool AM62AX: :ref:`u-boot-build-guide-environment-k3` - - :ref:`U-Boot SPI flashing tool AM62AX ` + - :ref:`U-Boot SPI flashing tool AM62AX ` - .. ifconfig:: CONFIG_part_variant in ('AM62PX') + .. ifconfig:: CONFIG_part_variant in ('AM62PX') - - `UART flashing tool AM62PX `_ + - `UART flashing tool AM62PX `_ - - U-Boot eMMC flashing tool AM62PX: :ref:`u-boot-build-guide-environment-k3` + - U-Boot eMMC flashing tool AM62PX: :ref:`u-boot-build-guide-environment-k3` - - :ref:`U-Boot SPI flashing tool AM62PX ` + - :ref:`U-Boot SPI flashing tool AM62PX ` Secondary Boot Loader (SBL) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. ifconfig:: CONFIG_part_variant in ('AM62X') - The following section will reference `AM62X MCU+ SDK's SBL examples `_. + The following section will reference `AM62X MCU+ SDK's SBL examples `_. .. ifconfig:: CONFIG_part_variant in ('AM62AX') - The following section will reference `AM62AX MCU+ SDK's SBL examples `_. + The following section will reference `AM62AX MCU+ SDK's SBL examples `_. .. ifconfig:: CONFIG_part_variant in ('AM62PX') - The following section will reference `AM62PX MCU+ SDK's SBL examples `_. + The following section will reference `AM62PX MCU+ SDK's SBL examples `_. .. ifconfig:: CONFIG_part_variant in ('AM62X') - - `AM62X Falcon Mode `_ + - `AM62X Falcon Mode `_ .. ifconfig:: CONFIG_part_variant in ('AM62AX') - - `AM62AX Falcon Mode `_ + - `AM62AX Falcon Mode `_ .. ifconfig:: CONFIG_part_variant in ('AM62PX') - - `AM62PX Falcon Mode `_ + - `AM62PX Falcon Mode `_ - Removing unnecessary prints - The default examples contain a large number of prints that impact boot time and need to be removed. + The default examples contain a large number of prints that impact boot time and need to be removed. - - Navigate to the main.c of your example and remove calls to the following functions - - ``Bootloader_profileAddCore`` - - ``Bootloader_profileAddProfilePoint`` - - ``Bootloader_profileUpdateAppimageSize`` - - ``Bootloader_profileUpdateMediaAndClk`` - - ``Bootloader_profilePrintProfileLog`` + - Navigate to the main.c of your example and remove calls to the following functions + - ``Bootloader_profileAddCore`` + - ``Bootloader_profileAddProfilePoint`` + - ``Bootloader_profileUpdateAppimageSize`` + - ``Bootloader_profileUpdateMediaAndClk`` + - ``Bootloader_profilePrintProfileLog`` - - Navigate to :file:`/source/drivers/device_manager/sciclient_direct/sciclient_direct_wrapper.c` and remove the ``DebugP_log`` calls from `Sciclient_getVersionCheck` function. + - Navigate to :file:`/source/drivers/device_manager/sciclient_direct/sciclient_direct_wrapper.c` and remove the ``DebugP_log`` calls from `Sciclient_getVersionCheck` function. - .. note:: + .. note:: - If an RTOS example is being used, remove prints of the additional files in :file:`/examples/drivers/boot/common/` + If an RTOS example is being used, remove prints of the additional files in :file:`/examples/drivers/boot/common/` - Skipping OSPI PHY tuning (in case of OSPI bootmedia) - PHY calibration allows the flash to function at maximum performance but this tuning consumes a significant amount of time that is dependent on the current algorithm implementation. In the SDK, only stage 2 examples are skipped by default. + PHY calibration allows the flash to function at maximum performance but this tuning consumes a significant amount of time that is dependent on the current algorithm implementation. In the SDK, only stage 2 examples are skipped by default. - To validate this, do not remove the log prints from the previous subsection and observe the ``SBL Board_driversOpen`` parameter. Currently, the tuning algorithm takes 22ms to complete. If skipping is successful, it should drop down to ~150us. + To validate this, do not remove the log prints from the previous subsection and observe the ``SBL Board_driversOpen`` parameter. Currently, the tuning algorithm takes 22ms to complete. If skipping is successful, it should drop down to ~150us. - Open the relevant example's syscfg by navigating into :file:`/examples/drivers/boot////ti-arm-clang/` and running :code:`make syscfg-gui`. Navigate to the `OSPI` section and enable **OSPI skip Tuning option**. Ensure that **Enable PHY** is checked as well. + Open the relevant example's syscfg by navigating into :file:`/examples/drivers/boot////ti-arm-clang/` and running :code:`make syscfg-gui`. Navigate to the `OSPI` section and enable **OSPI skip Tuning option**. Ensure that **Enable PHY** is checked as well. - .. Image:: /images/SBL_enable_ospi_phy_skip.png - :align: center + .. Image:: /images/SBL_enable_ospi_phy_skip.png + :align: center .. ifconfig:: CONFIG_part_variant in ('AM62PX') - - FastXSPI + - FastXSPI - This is a special OSPI-NOR boot mode where ROM tunes OSPI PHY values when provided with the right parameters. If successful, OSPI PHY tuning need not be done by the bootloader at SBL-stage1 otherwise it will switch to the regular OSPI-NOR mode where tuning has to be done by a subsequent stage. + This is a special OSPI-NOR boot mode where ROM tunes OSPI PHY values when provided with the right parameters. If successful, OSPI PHY tuning need not be done by the bootloader at SBL-stage1 otherwise it will switch to the regular OSPI-NOR mode where tuning has to be done by a subsequent stage. - Flash the relevant binary at :code:`0x3fc0000`: + Flash the relevant binary at :code:`0x3fc0000`: - - :download:`OSPI-NOR @100MHz ` + - :download:`OSPI-NOR @100MHz ` - - :download:`OSPI-NOR @133MHz ` + - :download:`OSPI-NOR @133MHz ` - - :download:`OSPI-NOR @166MHz ` + - :download:`OSPI-NOR @166MHz ` .. ifconfig:: CONFIG_part_variant in ('AM62PX') - - Use DDR in single rank configuration + - Use DDR in single rank configuration - The number of ranks on any DIMM is the number of independent sets of DRAMs that can be accessed for the full data bit-width of the DIMM. Dual rank gives us access to a bigger memory bank but consumes twice the tuning time. By default, DDR is in dual rank configuration and takes ~35ms that is visible in ``System_init`` in the SBL logs. + The number of ranks on any DIMM is the number of independent sets of DRAMs that can be accessed for the full data bit-width of the DIMM. Dual rank gives us access to a bigger memory bank but consumes twice the tuning time. By default, DDR is in dual rank configuration and takes ~35ms that is visible in ``System_init`` in the SBL logs. - Navigate to the DDR section in SBL-stage1 syscfg and update it to the single rank file given below to reduce the time to ~20ms. + Navigate to the DDR section in SBL-stage1 syscfg and update it to the single rank file given below to reduce the time to ~20ms. - :download:`ddr_1600_singlerank_am62p.h ` + :download:`ddr_1600_singlerank_am62p.h ` - .. Image:: /images/SBL_singlerank_ddr.png + .. Image:: /images/SBL_singlerank_ddr.png :align: center .. note:: @@ -255,131 +255,267 @@ Reducing Linux kernel boot time - Adding :code:`quiet` - - To save 8+ seconds, add "quiet" argument in the Kernel "bootargs". It suppresses most messages during the Linux start-up sequence. To access the logs after login, you can run :code:`dmesg` for the logs to be printed. By default, quiet is at a loglevel of 4 and should be adequate to suppress the majority of logs but if finer control is required :code:`quiet` can be replaced with :code:`loglevel=x` where x can be 1-14. + - To save 8+ seconds, add "quiet" argument in the Kernel "bootargs". It suppresses most messages during the Linux start-up sequence. To access the logs after login, you can run :code:`dmesg` for the logs to be printed. By default, quiet is at a loglevel of 4 and should be adequate to suppress the majority of logs but if finer control is required :code:`quiet` can be replaced with :code:`loglevel=x` where x can be 1-14. - - The kernel looks for bootargs in 3 places: U-Boot environment variable, the device tree and the kernel config. You can add the following in any of the 3 locations. + - The kernel looks for bootargs in 3 places: U-Boot environment variable, the device tree and the kernel config. You can add the following in any of the 3 locations. - U-Boot console: + U-Boot console: - .. code-block:: console + .. code-block:: console U-Boot=> setenv bootargs 'console=ttyS2,115200n8 fsck.mode=skip sysrq_always_enabled quiet' - Device Tree: + Device Tree: - .. code-block:: dts + .. code-block:: dts chosen { - ... - bootargs = "console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000 quiet"; - ... + ... + bootargs = "console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000 quiet"; + ... }; - Kernel config: + Kernel config: - .. code-block:: kconfig + .. code-block:: kconfig CONFIG_CMDLINE="console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000 quiet" - Using a smaller kernel system - - By default, the kernel image contains a lot of drivers and filesystems to enable the functionality supported for the board but are not necessary for early boot. Trim kernel capabilities by using + - By default, the kernel image contains a lot of drivers and filesystems to enable the functionality supported for the board but are not necessary for early boot. Trim kernel capabilities by using - - `ti_arm64_prune.config` - removes irrelevant platform drivers - - `ti_early_display.config` - converts the majority of functionality into loadable modules + - `ti_arm64_prune.config` - removes irrelevant platform drivers + - `ti_early_display.config` - converts the majority of functionality into loadable modules - Usage: + Usage: - .. code-block:: console + .. code-block:: console - kernel$ make ARCH=arm64 CROSS_COMPILE=/aarch64-none-linux-gnu- defconfig ti_arm64_prune.config ti_early_display.config + kernel$ make ARCH=arm64 CROSS_COMPILE=/aarch64-none-linux-gnu- defconfig ti_arm64_prune.config ti_early_display.config - .. tip:: + .. tip:: - You can access :file:`/kernel/configs/ti_early_display.config` and see the breakdown of how much time is saved by disabling each module and take a call on whether the functionality is required and its effect on boot time + You can access :file:`/kernel/configs/ti_early_display.config` and see the breakdown of how much time is saved by disabling each module and take a call on whether the functionality is required and its effect on boot time - Disabling nodes in DT - Unnecessary nodes can be disabled by adding :code:`status = "disabled"` to the nodes. While this will not directly affect boot time, the minimal kernel will not throw probe errors during boot. + Unnecessary nodes can be disabled by adding :code:`status = "disabled"` to the nodes. While this will not directly affect boot time, the minimal kernel will not throw probe errors during boot. Reducing userspace boot time ---------------------------- -It is recommended to use a tiny intermediate filesystem that can be used to run applications early with minimal configuration and then mount into a filesystem with full functionality. For this purpose, the installer packages a filesystem: :file:`/filesystem//tisdk-tiny-initramfs-am62xx-evm.cpio` that can be used as an initramfs. +Use a tiny filesystem to run applications early with minimal configuration. You can build a custom minimal tisdk-tiny-initramfs using Yocto. + +Building custom tiny initramfs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. note:: + + For detailed instructions on setting up the Yocto build environment, see :ref:`building-the-sdk-with-yocto`. + +To build the sysvinit based :file:`tisdk-tiny-initramfs-am62xx-evm.cpio` using Yocto, follow these steps: + +1. Clone and setup the Yocto environment: + + .. code-block:: console + + $ git clone https://git.ti.com/git/arago-project/oe-layersetup.git tisdk + $ cd tisdk + $ ./oe-layertool-setup.sh -f configs/processor-sdk/ + +2. Configure local.conf to use sysvinit instead of systemd: + + .. code-block:: console + + $ cd build + $ echo 'DISTRO_FEATURES:append = " sysvinit"' >> conf/local.conf + $ echo 'DISTRO_FEATURES:remove = "systemd"' >> conf/local.conf + $ echo 'ARAGO_SYSVINIT = "1"' >> conf/local.conf + +3. Apply recipe changes in meta-tisdk: + + .. code-block:: console + + $ cd ../sources/meta-tisdk + + Apply the following diff to :file:`meta-ti-foundational/recipes-core/images/tisdk-tiny-initramfs.bb` + + .. code-block:: diff + + diff --git a/meta-ti-foundational/recipes-core/images/tisdk-tiny-initramfs.bb b/meta-ti-foundational/recipes-core/images/tisdk-tiny-initramfs.bb + index 232b734..a76d5f6 100644 + --- a/meta-ti-foundational/recipes-core/images/tisdk-tiny-initramfs.bb + +++ b/meta-ti-foundational/recipes-core/images/tisdk-tiny-initramfs.bb + @@ -16,17 +16,6 @@ PACKAGE_INSTALL = " \ + base-files \ + base-passwd \ + busybox \ + - netbase \ + - shadow-base \ + - update-alternatives-opkg \ + - parted \ + - util-linux \ + - e2fsprogs \ + - dosfstools \ + - mmc-utils \ + - tar \ + - gzip \ + - xz \ + - wget \ + - dropbear \ + + sysvinit \ + + initscripts \ + " + +4. Setup build environment and build the custom initramfs: + + .. code-block:: console + + $ cd ../../build + $ . conf/setenv + $ MACHINE=am62xx-evm bitbake -k tisdk-tiny-initramfs + +.. note:: + + Since this is only a ramfs image, the MACHINE value does not significantly matter here. + +The built cpio file will be available in the deploy-ti directory: :file:`deploy-ti/images//tisdk-tiny-initramfs-.cpio` and you can use it as described in the following sections. + +Optimizing the Filesystem +^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to package the filesystem as initramfs into the kernel, follow these steps: 1. Extract the cpio archive to a preferred location via GUI or - .. code-block:: console - - $ mkdir output - $ cd output - $ cpio -idv < tisdk-tiny-initramfs-am62xx-evm.cpio + .. code-block:: console + $ mkdir output + $ cd output + $ cpio -idv < tisdk-tiny-initramfs-am62xx-evm.cpio 2. Edit the kernel config: - .config: + Edit .config file directly: + + .. code-block:: kconfig - .. code-block:: kconfig + CONFIG_INITRAMFS_SOURCE="/path/to/filesystem" - CONFIG_INITRAMFS_SOURCE="/path/to/filesystem" + or using :code:`menuconfig` and generate new .config: - or using :code:`menuconfig`: + .. code-block:: kconfig - .. code-block:: kconfig + kernel$ make ARCH=arm64 CROSS_COMPILE=/aarch64-none-linux-gnu- menuconfig - kernel$ make ARCH=arm64 CROSS_COMPILE=/aarch64-none-linux-gnu- menuconfig + General setup -> + Initial RAM filesystem and RAM disk (initramfs/initrd) support -> + Initramfs source file(s) + /path/to/filesystem or cpio file - General setup -> - Initial RAM filesystem and RAM disk (initramfs/initrd) support -> - Initramfs source file(s) - /path/to/filesystem + Both cpio or filesystem path can be passed to "Initramfs source file". If providing a filesystem path directly, ensure required files and folders are executable. example :file:`/sbin/init` or :file:`/usr/bin/modetest`. 3. Rebuild the kernel - .. code-block:: console + .. code-block:: console - kernel$ make ARCH=arm64 CROSS_COMPILE=/aarch64-none-linux-gnu- Image -j64 + kernel$ make ARCH=arm64 CROSS_COMPILE=/aarch64-none-linux-gnu- Image -j64 The time taken to boot filesystem is measured from Process ID 1(PID1) to login prompt which is 1.98s with the initramfs filesystem. In order to further drop this time, you can: .. caution:: - Please ensure that you do not mistakenly affect the host computer while making the below changes + Please ensure that you do not mistakenly affect the host computer while making the below changes - Remove startup scripts from the tiny filesystem - .. code-block:: console + .. code-block:: console - host$ rm /etc/rc5.d/* - host$ cd /etc/rcS.d - host$ rm S02banner.sh S04udev S05checkroot.sh S06modutils.sh S07bootlogd S29read-only-rootfs-hook.sh S36bootmisc.sh S37populate-volatile.sh S38dmesg.sh S38urandom + host$ rm /etc/rc5.d/* + host$ cd /etc/rcS.d + host$ rm S02banner.sh S05checkroot.sh S07bootlogd S29read-only-rootfs-hook.sh S36bootmisc.sh S37populate-volatile.sh S38dmesg.sh S38urandom - This shaves off 1.536s from filesystem boot time. udev alone takes up 1.152s. + This shaves off 1.536s from filesystem boot time. - Remove package manager, console logo and add /dev/null in the filesystem - .. code-block:: console + .. code-block:: console + + host$ rm -r /usr/lib/opkg + host$ rm /etc/issue + host$ cd /dev + host$ mknod -m 0600 null c 1 3 + + This removes 52ms from the boot up time. + +- Custom Init Script for Maximum Boot Speed + + For applications requiring fastest boot time, you can replace the default init system with a custom init script. This approach bypasses sysvinit entirely and provides direct access to the shell while running essential applications in the background. Use this approach if you don't need system services and prefer maximum boot speed over functionality. + + Remove the existing :file:`/sbin/init` and create a custom :file:`/sbin/init` script with the following commands: + + .. code-block:: sh - host$ rm -r /usr/lib/opkg - host$ rm /etc/issue - host$ cd /dev - host$ mknod -m 0600 null c 1 3 + #!/bin/sh - This removes 52ms from the boot up time. + mount -t proc none /proc + mount -t sysfs none /sys + mount -t devtmpfs dev /dev + + # Uncomment to run modetest in the background + # 42 - connector ID + # 40 - CRTC ID + # 1920x1200 - resolution of panel + #(modetest -M tidss -s 42@40:1920x1200 0<&- 2>/tmp/output.log) & + + # For sysvinit based flow + # Use either sysvinit or direct shell approach + # exec /sbin/init.sysvinit $* + + # Shell - restarts automatically when exited + while true; do + /bin/sh /dev/console 2>&1 + done + + Make the script executable: + + .. code-block:: console + + host$ chmod +x /sbin/init + + **Considerations:** + + - No system services or proper init system functionality. + - Job control is limited (warning message: "can't access tty; job control turned off"). + - The shell warning message is harmless and indicates that advanced terminal features are disabled. + +- Create symlink from init to sbin/init if it does not exist: + + .. code-block:: console + + host$ cd + host$ ln -sf /sbin/init init + +- Convert file system to cpio file. + + .. code-block:: console + + host$ cd + host$ find . | sort | cpio --reproducible -o -H newc -R root:root > ../tisdk-tiny-initramfs-new.cpio + + Pass the new cpio file during kernel build. Measurements ------------ The following section displays the time taken by each stage to start and end. Four profile points were used: - - PMIC time is taken from the datasheet - - MCU_PORz (White) - - SBL_start (Brown) - - SBL_end (Red) - - Kernel_end (Gold) + - PMIC time is taken from the datasheet + - MCU_PORz (White) + - SBL_start (Brown) + - SBL_end (Red) + - Kernel_end (Gold) | Range 1 (Power ON to PMIC): | It is not convenient to measure this range since it is dependent on the hardware to provide the power to the PMIC quickly. While TI experts can give suggestions to reduce the time, it will not be TI's commitment. @@ -389,43 +525,43 @@ The following section displays the time taken by each stage to start and end. Fo .. ifconfig:: CONFIG_part_variant in ('AM62PX') - SBL_start is set to LOW as soon as the Bootloader comes up. To enable this, navigate into the main.c of your bootloader (Example: :file:`/examples/drivers/boot/sbl_ospi_linux_multistage/sbl_ospi_linux_stage1///main.c`) and add the following section to set MCU_I2C0_SCL (Pin #24 on the MCU Header J11) to LOW. It can be modified for any other pin as well. + SBL_start is set to LOW as soon as the Bootloader comes up. To enable this, navigate into the main.c of your bootloader (Example: :file:`/examples/drivers/boot/sbl_ospi_linux_multistage/sbl_ospi_linux_stage1///main.c`) and add the following section to set MCU_I2C0_SCL (Pin #24 on the MCU Header J11) to LOW. It can be modified for any other pin as well. .. ifconfig:: CONFIG_part_variant in ('AM62X') - SBL_start is set to LOW as soon as the Bootloader comes up. To enable this, navigate into the main.c of your bootloader (Example: :file:`/examples/drivers/boot/sbl_ospi_linux_multistage/sbl_ospi_linux_stage1///main.c`) and add the following section to set MCU_I2C0_SCL (Pin #24 on the MCU Header J11) to LOW. It can be modified for any other pin as well. + SBL_start is set to LOW as soon as the Bootloader comes up. To enable this, navigate into the main.c of your bootloader (Example: :file:`/examples/drivers/boot/sbl_ospi_linux_multistage/sbl_ospi_linux_stage1///main.c`) and add the following section to set MCU_I2C0_SCL (Pin #24 on the MCU Header J11) to LOW. It can be modified for any other pin as well. .. ifconfig:: CONFIG_part_variant in ('AM62AX') - SBL_start is set to LOW as soon as the Bootloader comes up. To enable this, navigate into the main.c of your bootloader (Example: :file:`/examples/drivers/boot/sbl_ospi_nand_linux_multistage/sbl_nand_ospi_linux_stage1///main.c`) and add the following section to set MCU_I2C0_SCL (Pin #24 on the MCU Header J11) to LOW. It can be modified for any other pin as well. + SBL_start is set to LOW as soon as the Bootloader comes up. To enable this, navigate into the main.c of your bootloader (Example: :file:`/examples/drivers/boot/sbl_ospi_nand_linux_multistage/sbl_nand_ospi_linux_stage1///main.c`) and add the following section to set MCU_I2C0_SCL (Pin #24 on the MCU Header J11) to LOW. It can be modified for any other pin as well. .. code-block:: C - #include + #include - /* GPIO PIN Macros */ - #define CONFIG_GPIO0_BASE_ADDR (CSL_MCU_GPIO0_BASE) - #define CONFIG_GPIO0_PIN (17) - #define CONFIG_GPIO0_DIR (GPIO_DIRECTION_OUTPUT) - #define CONFIG_GPIO0_TRIG_TYPE (GPIO_TRIG_TYPE_NONE) - #define CONFIG_GPIO_NUM_INSTANCES (1U) + /* GPIO PIN Macros */ + #define CONFIG_GPIO0_BASE_ADDR (CSL_MCU_GPIO0_BASE) + #define CONFIG_GPIO0_PIN (17) + #define CONFIG_GPIO0_DIR (GPIO_DIRECTION_OUTPUT) + #define CONFIG_GPIO0_TRIG_TYPE (GPIO_TRIG_TYPE_NONE) + #define CONFIG_GPIO_NUM_INSTANCES (1U) - static Pinmux_PerCfg_t gPinMuxMcuCfg[] = { - /* MCU_GPIO0 pin config MCU_GPIO0_17 -> MCU_I2C0_SCL (E11) */ - { - PIN_MCU_I2C0_SCL, - ( PIN_MODE(7) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) - }, - {PINMUX_END, PINMUX_END} - }; + static Pinmux_PerCfg_t gPinMuxMcuCfg[] = { + /* MCU_GPIO0 pin config MCU_GPIO0_17 -> MCU_I2C0_SCL (E11) */ + { + PIN_MCU_I2C0_SCL, + ( PIN_MODE(7) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) + }, + {PINMUX_END, PINMUX_END} + }; - int main() - { - Pinmux_config(gPinMuxMcuCfg, PINMUX_DOMAIN_ID_MCU); // Configure PinMux - GPIO_setDirMode(CONFIG_GPIO0_BASE_ADDR, CONFIG_GPIO0_PIN, CONFIG_GPIO0_DIR); //Set GPIO direction - GPIO_pinWriteLow(CONFIG_GPIO0_BASE_ADDR, CONFIG_GPIO0_PIN); // Set GPIO state to LOW + int main() + { + Pinmux_config(gPinMuxMcuCfg, PINMUX_DOMAIN_ID_MCU); // Configure PinMux + GPIO_setDirMode(CONFIG_GPIO0_BASE_ADDR, CONFIG_GPIO0_PIN, CONFIG_GPIO0_DIR); //Set GPIO direction + GPIO_pinWriteLow(CONFIG_GPIO0_BASE_ADDR, CONFIG_GPIO0_PIN); // Set GPIO state to LOW - ... + ... | Range 3 (SBL_start to SBL_end): @@ -433,15 +569,15 @@ The following section displays the time taken by each stage to start and end. Fo .. ifconfig:: CONFIG_part_variant in ('AM62PX') - For this measurement, the FreeRTOS IPC example was used for second stage bootloader (:file:`/examples/drivers/ipc/ipc_rpmsg_echo_linux/am62px-sk/wkup-r5fss0-0_freertos`). Open the :file:`examples/drivers/boot/common/soc/am62px/sbl_ospi_linux_stage2.c`. Turn the GPIO HIGH after ``App_loadLinuxImages`` function. + For this measurement, the FreeRTOS IPC example was used for second stage bootloader (:file:`/examples/drivers/ipc/ipc_rpmsg_echo_linux/am62px-sk/wkup-r5fss0-0_freertos`). Open the :file:`examples/drivers/boot/common/soc/am62px/sbl_ospi_linux_stage2.c`. Turn the GPIO HIGH after ``App_loadLinuxImages`` function. .. ifconfig:: CONFIG_part_variant in ('AM62X') - For this measurement, the OSPI NOR example was used (:file:`/examples/drivers/boot/sbl_ospi_linux_multistage/sbl_ospi_linux_stage2/am62x-sk/r5fss0-0_nortos/main.c`). Turn the GPIO HIGH after ``App_loadLinuxImages`` function. + For this measurement, the OSPI NOR example was used (:file:`/examples/drivers/boot/sbl_ospi_linux_multistage/sbl_ospi_linux_stage2/am62x-sk/r5fss0-0_nortos/main.c`). Turn the GPIO HIGH after ``App_loadLinuxImages`` function. .. ifconfig:: CONFIG_part_variant in ('AM62AX') - For this measurement, the OSPI NAND example was used (:file:`/examples/drivers/boot/sbl_ospi_nand_linux_multistage/sbl_ospi_nand_linux_stage2/am62ax-sk/r5fss0-0_nortos/main.c`). Turn the GPIO HIGH after ``App_loadLinuxImages`` function. + For this measurement, the OSPI NAND example was used (:file:`/examples/drivers/boot/sbl_ospi_nand_linux_multistage/sbl_ospi_nand_linux_stage2/am62ax-sk/r5fss0-0_nortos/main.c`). Turn the GPIO HIGH after ``App_loadLinuxImages`` function. | Range 4 (SBL_end to Kernel_end): | To toggle GPIO inside the kernel, the Device Tree(DT) and kernel has to be updated. In this example, it was decided to add GPIO functionality into a driver that is definitely being probed quite early on like serial driver (:file:`drivers/tty/serial/8250/8250_omap.c`). We will be using GPIO0_39 pin on the User Expansion Header (J4). @@ -450,253 +586,297 @@ In the relevant dts, add the following: .. code-block:: dts - &main_gpio0 { - ... - status = "okay"; - pinctrl-names = "default"; - pinctrl-0 = <&test_gpio_default>; - }; + &main_gpio0 { + ... + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&test_gpio_default>; + }; .. ifconfig:: CONFIG_part_variant in ('AM62PX') - In `&main_pmx0` node, add the relevant IOPAD: + In `&main_pmx0` node, add the relevant IOPAD: - .. code-block:: dts + .. code-block:: dts - test_gpio_default: test-gpio { - pinctrl-single,pins = < - AM62PX_IOPAD(0x00a0, PIN_INPUT, 7) /* (P24) GPMC0_WPn.GPIO0_39 */ - >; - }; + test_gpio_default: test-gpio { + pinctrl-single,pins = < + AM62PX_IOPAD(0x00a0, PIN_INPUT, 7) /* (P24) GPMC0_WPn.GPIO0_39 */ + >; + }; .. ifconfig:: CONFIG_part_variant in ('AM62AX') - In `&main_pmx0` node, add the relevant IOPAD: + In `&main_pmx0` node, add the relevant IOPAD: - .. code-block:: dts + .. code-block:: dts - test_gpio_default: test-gpio { - pinctrl-single,pins = < - AM62AX_IOPAD(0x00a0, PIN_INPUT, 7) /* (K17) GPMC0_WPn.GPIO0_39 */ - >; - }; + test_gpio_default: test-gpio { + pinctrl-single,pins = < + AM62AX_IOPAD(0x00a0, PIN_INPUT, 7) /* (K17) GPMC0_WPn.GPIO0_39 */ + >; + }; .. ifconfig:: CONFIG_part_variant in ('AM62X') - In `&main_pmx0` node, add the relevant IOPAD: + In `&main_pmx0` node, add the relevant IOPAD: - .. code-block:: dts + .. code-block:: dts - test_gpio_default: test-gpio { - pinctrl-single,pins = < - AM62X_IOPAD(0x00a0, PIN_INPUT, 7) /* (K25) GPMC0_WPn.GPIO0_39 */ - >; - }; + test_gpio_default: test-gpio { + pinctrl-single,pins = < + AM62X_IOPAD(0x00a0, PIN_INPUT, 7) /* (K25) GPMC0_WPn.GPIO0_39 */ + >; + }; In the `&main_uart0` node, connect the GPIO by adding .. code-block:: dts - test-gpios = <&main_gpio0 39 GPIO_ACTIVE_HIGH>; + test-gpios = <&main_gpio0 39 GPIO_ACTIVE_HIGH>; Update the :file:`drivers/tty/serial/8250/8250_omap.c` driver. Add the following section before the `omap8250_probe` function: .. code-block:: C - static struct gpio_desc *gpio; - - void test_gpio_on(void) - { - gpiod_direction_output(gpio, 1); - gpiod_set_value(gpio, 1); - } - EXPORT_SYMBOL_GPL(test_gpio_on); - void test_gpio_off(void) - { - gpiod_direction_output(gpio, 0); - gpiod_set_value(gpio, 0); - - } - EXPORT_SYMBOL_GPL(test_gpio_off); + static struct gpio_desc *gpio; + + void test_gpio_on(void) + { + gpiod_direction_output(gpio, 1); + gpiod_set_value(gpio, 1); + } + EXPORT_SYMBOL_GPL(test_gpio_on); + void test_gpio_off(void) + { + gpiod_direction_output(gpio, 0); + gpiod_set_value(gpio, 0); + } + EXPORT_SYMBOL_GPL(test_gpio_off); and the following in the `omap8250_probe` function: .. code-block:: C - gpio = devm_gpiod_get(&pdev->dev, "test", GPIOD_OUT_LOW); - if (IS_ERR(gpio)) { - return PTR_ERR(gpio); - } + gpio = devm_gpiod_get(&pdev->dev, "test", GPIOD_OUT_LOW); + if (IS_ERR(gpio)) { + return PTR_ERR(gpio); + } To measure the instance when the filesystem starts, navigate to :file:`init/main.c` and toggle the GPIO: .. code-block:: C - /* Declare test_gpio somewhere before the kernel_init function */ - void test_gpio_on(void); + /* Declare test_gpio somewhere before the kernel_init function */ + void test_gpio_on(void); - /* Inside the kernel_init function and before ramdisk_execute_command, place this*/ - test_gpio_on(); + /* Inside the kernel_init function and before ramdisk_execute_command, place this*/ + test_gpio_on(); .. ifconfig:: CONFIG_part_variant in ('AM62X') - .. Image:: /images/am62x_ospi_boot_analyser.png - :align: center - - .. code-block:: console - - [2024-03-29 11:52:40.318] NOTICE: BL31: v2.10.0(release):v2.10.0-367-g00f1ec6b87-dirty - [2024-03-29 11:52:40.318] NOTICE: BL31: Built : 16:09:05, Feb 9 2024 - [2024-03-29 11:52:41.098] - [2024-03-29 11:52:41.098] am62xx-evm login: - - +-------------------+-----------+ - | Stage | Time (ms) | - +===================+===========+ - | PMIC (TPS6521904) | 30 | - +-------------------+-----------+ - | ROM | 33 | - +-------------------+-----------+ - | SBL | 238 | - +-------------------+-----------+ - | Linux Kernel | 415 | - +-------------------+-----------+ - | Tiny FS | 365 | - +-------------------+-----------+ - | Total | 1081 | - +-------------------+-----------+ + .. Image:: /images/am62x_ospi_boot_analyser.png + :align: center + + .. code-block:: console + + [2024-03-29 11:52:40.318] NOTICE: BL31: v2.10.0(release):v2.10.0-367-g00f1ec6b87-dirty + [2024-03-29 11:52:40.318] NOTICE: BL31: Built : 16:09:05, Feb 9 2024 + [2024-03-29 11:52:41.098] + [2024-03-29 11:52:41.098] am62xx-evm login: + + +-------------------+-----------+ + | Stage | Time (ms) | + +===================+===========+ + | PMIC (TPS6521904) | 30 | + +-------------------+-----------+ + | ROM | 33 | + +-------------------+-----------+ + | SBL | 238 | + +-------------------+-----------+ + | Linux Kernel | 415 | + +-------------------+-----------+ + | Tiny FS | 365 | + +-------------------+-----------+ + | Total | 1081 | + +-------------------+-----------+ .. ifconfig:: CONFIG_part_variant in ('AM62AX') - .. Image:: /images/am62ax_ospi_boot_analyser.png - :align: center - - -622ms includes SBL C7x image load - - .. code-block:: console - - [2024-03-29 13:02:19.196] NOTICE: BL31: v2.10.0(release):v2.10.0-367-g00f1ec6b87-dirty - [2024-03-29 13:02:19.196] NOTICE: BL31: Built : 16:09:05, Feb 9 2024 - [2024-03-29 13:02:19.991] - [2024-03-29 13:02:19.991] am62xx-evm login: - - +--------------------+-----------+ - | Stage | Time (ms) | - +====================+===========+ - | PMIC (TPS65931211) | 30 | - +--------------------+-----------+ - | ROM | 48 | - +--------------------+-----------+ - | SBL | 622 | - +--------------------+-----------+ - | Linux Kernel | 450 | - +--------------------+-----------+ - | Tiny FS | 345 | - +--------------------+-----------+ - | Total | 1495 | - +--------------------+-----------+ + .. Image:: /images/am62ax_ospi_boot_analyser.png + :align: center + + -622ms includes SBL C7x image load + + .. code-block:: console + + [2024-03-29 13:02:19.196] NOTICE: BL31: v2.10.0(release):v2.10.0-367-g00f1ec6b87-dirty + [2024-03-29 13:02:19.196] NOTICE: BL31: Built : 16:09:05, Feb 9 2024 + [2024-03-29 13:02:19.991] + [2024-03-29 13:02:19.991] am62xx-evm login: + + +--------------------+-----------+ + | Stage | Time (ms) | + +====================+===========+ + | PMIC (TPS65931211) | 30 | + +--------------------+-----------+ + | ROM | 48 | + +--------------------+-----------+ + | SBL | 622 | + +--------------------+-----------+ + | Linux Kernel | 450 | + +--------------------+-----------+ + | Tiny FS | 345 | + +--------------------+-----------+ + | Total | 1495 | + +--------------------+-----------+ .. ifconfig:: CONFIG_part_variant in ('AM62PX') - .. Image:: /images/am62px_ospi_boot_analyser.png - :align: center - - .. code-block:: console - - [2025-12-09 14:29:28.387] NOTICE: BL31: v2.13.0(release):v2.13.0-259-ge0c4d3903 - [2025-12-09 14:29:28.387] NOTICE: BL31: Built : 06:45:06, Dec 7 2025 - [2025-12-09 14:29:29.107] - [2025-12-09 14:29:29.107] am62xx-evm login: - - +-----------------+-----------+ - | Stage | Time (ms) | - +=================+===========+ - | PMIC (TPS65224) | 15 | - +-----------------+-----------+ - | ROM | 31 | - +-----------------+-----------+ - | SBL | 200 | - +-----------------+-----------+ - | Linux Kernel | 549 | - +-----------------+-----------+ - | Tiny FS | 171 | - +-----------------+-----------+ - | Total | 966 | - +-----------------+-----------+ - -Bootloader loads HSM binary (9KB), MCU/DSP image (50KB) and Kernel+FS image (22MB) in the above measurements + Example Timing Capture + ^^^^^^^^^^^^^^^^^^^^^^ + + .. Image:: /images/am62px_ospi_boot_analyser.png + :align: center + + | + Boot logs + ^^^^^^^^^ + + .. code-block:: console + + [2026-04-28 08:17:15.247] NOTICE: BL31: v2.14.0(release):sandbox/v2.14-472-g76500ceae + [2026-04-28 08:17:15.247] NOTICE: BL31: Built : 21:08:02, Apr 15 2026 + [2026-04-28 08:17:15.807] /bin/sh: can't access tty; job control turned off + [2026-04-28 08:17:15.807] ~ # + + Boot Time Breakdown + ^^^^^^^^^^^^^^^^^^^ + + +-----------------+-----------+ + | Stage | Time (ms) | + +=================+===========+ + | PMIC (TPS65224) | 15 | + +-----------------+-----------+ + | ROM | 31 | + +-----------------+-----------+ + | SBL | 214 | + +-----------------+-----------+ + | Linux Kernel | 523 | + +-----------------+-----------+ + | Tiny FS | 37 | + +-----------------+-----------+ + | Total | 820 | + +-----------------+-----------+ + +Boot loader loads HSM binary (9KB), MCU/DSP image (56KB) and Kernel+FS image (18MB) in the above measurements .. note:: Filesytem time is measured using minicom time stamp. ( Boot Time via minicom - Kernel time by GPIO = Filesystem Time ) -Additional notes ----------------- +Additional steps to test early display +-------------------------------------- .. ifconfig:: CONFIG_part_variant in ('AM62X', 'AM62PX') - .. note:: + .. note:: + + Ensure that you are not affecting your host computer when making the changes detailed below. + + - For early display with OLDI panel, disable bridge-hdmi or sii9022 node in device tree. + + .. code-block:: diff + + diff --git a/arch/arm64/boot/dts/ti/k3-am62p5-sk.dts b/arch/arm64/boot/dts/ti/k3-am62p5-sk.dts + index e40abe7afe45..70153e592600 100644 + --- a/arch/arm64/boot/dts/ti/k3-am62p5-sk.dts + +++ b/arch/arm64/boot/dts/ti/k3-am62p5-sk.dts + @@ -589,6 +589,7 @@ sii9022: bridge-hdmi@3b { + interrupts = <16 IRQ_TYPE_EDGE_FALLING>; + #sound-dai-cells = <0>; + sil,i2s-data-lanes = < 0 >; + + status = "disabled"; + + - Use fdtoverlay command to modify dtb file (base tree) with dtbo overlay for OLDI panel. + + .. code-block:: console + + host$ fdtoverlay -v -i k3-am62p5-sk.dtb -o merged.dtb k3-am62p5-sk-microtips-mf101hie-panel.dtbo + + Later rename merged.dtb to k3-am62p5-sk.dtb when generating linux.falcon.appimage.hs_fs. + + - Add statically compiled :download:`modetest ` to filesystem to test out display at boot on an OLDI panel. + + .. code-block:: console - Ensure that you are not affecting your host computer when making the changes detailed below. - For early display with OLDI panel, disable bridge-hdmi or sii9022 node in device tree. - Also use fdtoverlay command to modify dtb file (base tree) with dtbo overlay for OLDI panel. + host$ cd + host$ cp ~/Downloads/modetest /usr/bin + host$ chmod +x modetest - - This statically compiled :download:`modetest ` can be added to the filesystem to test out display at boot on an OLDI panel. + - In the new :file:`sbin/init` created earlier, uncomment modetest. - - `init` is a symbolic link to /sbin/init. Remove the file sbin/init + .. code-block:: sh - .. code-block:: console + #!/bin/sh - rm /sbin/init + mount -t proc none /proc + mount -t sysfs none /sys + mount -t devtmpfs dev /dev - - Create a new sbin/init and add the following. + # Run modetest in the background + # 42 - connector ID + # 40 - CRTC ID + # 1920x1200 - resolution of panel + (modetest -M tidss -s 42@40:1920x1200 0<&- 2>/tmp/output.log) & - .. code-block:: sh + # For sysvinit based flow + # Use either sysvinit or direct shell approach + # exec /sbin/init.sysvinit $* - #!/bin/sh + # Shell - restarts automatically when exited + while true; do + /bin/sh /dev/console 2>&1 + done - mount -t proc none /proc - mount -t sysfs none /sys - mount -t devtmpfs dev /dev + To get the connector ID and CRTC ID of OLDI panel used, run :code:`kmsprint` or :code:`modetest -M tidss` - # Run modetest in the background - # 40 - connector ID - # 38 - CRTC ID - # 1920x1200 - resolution of panel - (modetest -M tidss -s 40@38:1920x1200 0<&- 2>/tmp/output.log) & + - Make it executable - exec /sbin/init.sysvinit $* + .. code-block:: console - You can get the connector ID and CRTC ID of your OLDI panel by running :code:`kmsprint` or :code:`modetest -M tidss` + $ chmod +x /sbin/init - - Make it executable + - Convert file system to cpio file. - .. code-block:: console + .. code-block:: console - chmod +x /sbin/init + host$ cd + host$ find . | sort | cpio --reproducible -o -H newc -R root:root > ../tisdk-tiny-initramfs-new.cpio + Pass the new cpio file during kernel build. .. ifconfig:: CONFIG_part_variant in ('AM62AX') - - While AM62A ships with OSPI-NAND, it can be replaced with the OSPI-NOR flash with ease. NAND flash support needs to be replaced with NOR flash support + - While AM62A ships with OSPI-NAND, it can be replaced with the OSPI-NOR flash with ease. NAND flash support needs to be replaced with NOR flash support - - SPL: + - SPL: - Rebuild :ref:`Build-U-Boot-label` with OSPI NOR support. + Rebuild :ref:`Build-U-Boot-label` with OSPI NOR support. - - SBL: + - SBL: - Update the Flash type in Flash section in syscfg to reflect NOR. Save and build SBL. + Update the Flash type in Flash section in syscfg to reflect NOR. Save and build SBL. Troubleshooting --------------- - If the following logs are noticed and kernel does not come up, it suggests that TF-A is not receiving data from DM which probably hasn't had enough time to run completely - .. code-block:: console + .. code-block:: console - ERROR: Timeout waiting for thread SP_RESPONSE to fill - ERROR: Thread SP_RESPONSE verification failed (-60) - ERROR: Message receive failed (-60) - ERROR: Failed to get response (-60) - ERROR: Transfer send failed (-60) + ERROR: Timeout waiting for thread SP_RESPONSE to fill + ERROR: Thread SP_RESPONSE verification failed (-60) + ERROR: Message receive failed (-60) + ERROR: Failed to get response (-60) + ERROR: Transfer send failed (-60)