3.1.1.8. RemoteProc

This section documents how to initialize, load, start and stop remote cores from U-Boot prompt. Following remotecores support is available in U-boot for K3 devices. However the actual remote cores deployed depends on the specific SoC used:

  • Cortex-R5F in Lockstep more

  • Cortex-R5F in split mode

  • Cortex-M4F

  • C66x DSP

  • C71x DSP

3.1.1.8.1. Initialization

U-Boot supports for initializing all the available remotecores in one go or initialize individual core based on the DT alias id.

The below command will initialize all the available remote cores:

=> rproc init

The below command will initialize just the given remote core

=> rproc init <id>

The below command lists all the available/initialized remotecores in a system.

=> rproc list
0 - Name:'r5f@41000000' type:'internal memory mapped' supports: load start stop reset
1 - Name:'r5f@41400000' type:'internal memory mapped' supports: load start stop reset
2 - Name:'r5f@5c00000' type:'internal memory mapped' supports: load start stop reset
3 - Name:'r5f@5d00000' type:'internal memory mapped' supports: load start stop reset
4 - Name:'r5f@5e00000' type:'internal memory mapped' supports: load start stop reset
5 - Name:'r5f@5f00000' type:'internal memory mapped' supports: load start stop reset
6 - Name:'dsp@4d80800000' type:'internal memory mapped' supports: load start stop reset
7 - Name:'dsp@4d81800000' type:'internal memory mapped' supports: load start stop reset
8 - Name:'dsp@64800000' type:'internal memory mapped' supports: load start stop reset

3.1.1.8.2. Loading

Once Initialized, remotecores can be loaded with a relevant image. Make sure image is loaded only after initializing the core.

=> load mmc 1:2 0x90000000 /lib/firmware/j7-main-r5f0_0-fw
2536540 bytes read in 112 ms (21.6 MiB/s)
=> rproc load 2 0x90000000 0x${filesize}
Load Remote Processor 2 with data@addr=0x90000000 2536540 bytes: Success!

3.1.1.8.3. Starting

Successfully loaded remotecore can be started using the following command.

=> rproc start 2

3.1.1.8.4. Stop

A running remotecore can be stopped using the following command.

=> rproc stop 2

Make sure all the commands are run in the above given sequence. Currently IPC is not supported in U-boot.

3.1.1.8.5. Lockstep and Split mode

Cortex-R5F can be used in both lockstep (both cores run same code) and split mode (each core runs independently).

To set lockstep/split mode for R5 remote cores, use ti,cluster-mode property in the u-boot SoC device tree source. ti,cluster-mode value should be set to 1 for lockstep and 0 for split mode.

Furthermore, for setting lockstep/split mode for boot cores (which is MCU R5 in Jacinto platforms), an additional property named core-opts in binman dtsi needs to be updated. This is because the lockstep/split mode for boot MCU R5 on Jacinto platforms is set by the ROM code itself, based on core-opts value in the x509 certificate. core-opts value in binman dtsi should be set to 2 for split-mode, and 0 for lockstep mode for boot MCU R5 on Jacinto platforms.

Refer to the below example on K3 J784S4 SoC.

Lockstep configuration

  • MAIN R5F:

    arch/arm/dts/k3-j784s4-main.dtsi

    main_r5fss0: r5fss@5c00000 {
        compatible = "ti,j721s2-r5fss";
        ti,cluster-mode = <1>; # set to lockstep-mode
        #address-cells = <1>;
        #size-cells = <1>;
        ranges = <0x5c00000 0x00 0x5c00000 0x20000>,
            <0x5d00000 0x00 0x5d00000 0x20000>;
        power-domains = <&k3_pds 336 TI_SCI_PD_EXCLUSIVE>;
        ...
    
  • Boot MCU R5F:

    arch/arm/dts/k3-j784s4-mcu-wakeup.dtsi

    mcu_r5fss0: r5fss@41000000 {
        compatible = "ti,j721s2-r5fss";
        ti,cluster-mode = <1>; # set to lockstep-mode
        #address-cells = <1>;
        #size-cells = <1>;
        ranges = <0x41000000 0x00 0x41000000 0x20000>,
        ...
    

    arch/arm/dts/k3-j784s4-binman.dtsi

    &binman {
        tiboot3-j784s4-gp-evm.bin { # In the case of GP boards
            filename = "tiboot3-j784s4-gp-evm.bin";
            symlink = "tiboot3.bin";
            ti-secure-rom {
                content = <&u_boot_spl_unsigned>, <&ti_fs_gp>,
                    <&combined_tifs_cfg_gp>, <&combined_dm_cfg_gp>;
                combined;
                dm-data;
                core-opts = <0>; # core-opts value should be set to 0 for lockstep-mode on boot core
                content-sbl = <&u_boot_spl_unsigned>;
                load = <0x41c00000>;
                ...
    

Split-mode configuration

  • MAIN R5F:

    arch/arm/dts/k3-j784s4-main.dtsi

    main_r5fss0: r5fss@5c00000 {
        compatible = "ti,j721s2-r5fss";
        ti,cluster-mode = <0>; # set to split-mode
        #address-cells = <1>;
        #size-cells = <1>;
        ranges = <0x5c00000 0x00 0x5c00000 0x20000>,
            <0x5d00000 0x00 0x5d00000 0x20000>;
        power-domains = <&k3_pds 336 TI_SCI_PD_EXCLUSIVE>;
        ...
    
  • Boot MCU R5:

    arch/arm/dts/k3-j784s4-mcu-wakeup.dtsi

    mcu_r5fss0: r5fss@41000000 {
        compatible = "ti,j721s2-r5fss";
        ti,cluster-mode = <0>; # set to split-mode
        #address-cells = <1>;
        #size-cells = <1>;
        ranges = <0x41000000 0x00 0x41000000 0x20000>,
        ...
    

    arch/arm/dts/k3-j784s4-binman.dtsi

    &binman {
        tiboot3-j784s4-gp-evm.bin { # In the case of GP boards
            filename = "tiboot3-j784s4-gp-evm.bin";
            symlink = "tiboot3.bin";
            ti-secure-rom {
                content = <&u_boot_spl_unsigned>, <&ti_fs_gp>,
                    <&combined_tifs_cfg_gp>, <&combined_dm_cfg_gp>;
                combined;
                dm-data;
                core-opts = <2>; # core-opts value should be set to 2 for split-mode on boot core
                content-sbl = <&u_boot_spl_unsigned>;
                load = <0x41c00000>;
                ...
    

Note

From SDK 9.1 onward, default mode is split mode for boot cores.

3.1.1.8.6. HS Devices

HS Devices by default use the secure firmware images present in the filesystem for booting the remoteproc cores. Symlinks to these secure firmware images have a suffix of -sec on them.

All the firmware images are authenticated while loading from U-boot.

Steps for signing and updating firmware images in filesystem.

  • Getting Security Dev Tool

    $ git clone https://git.ti.com/git/security-development-tools/core-secdev-k3.git -b master
    $ export TI_SECURE_DEV_PKG=`pwd`/core-secdev-k3
    
  • Export the path for secdev

    $ ${TI_SECURE_DEV_PKG}/scripts/secure-binary-image.sh $FIRMWARE $FIRMWARE.signed
    
  • Updating firmware image

    $ ln -vfs $FIRMWARE.signed /lib/firmware/j7-main-r5f0_0-fw-sec