+ Lukáš and Josef from CZ.NIC
On Monday 03 October 2022 22:25:05 Pali Rohár wrote: > + Štěpán from CZ.NIC. Please look at the Heinrich comments below and > prepare a new version with fixes... I will let it to you right now. > > On Monday 26 September 2022 13:30:02 Heinrich Schuchardt wrote: > > On 9/23/22 13:36, Pali Rohár wrote: > > > This patch adds a new documentation for all released CZ.NIC Turris > > > routers. > > > > > > Signed-off-by: Pali Rohár <p...@kernel.org> > > > --- > > > doc/board/CZ.NIC/index.rst | 9 + > > > doc/board/CZ.NIC/turris.rst | 323 ++++++++++++++++++++++++++++++++++++ > > > doc/board/index.rst | 1 + > > > 3 files changed, 333 insertions(+) > > > create mode 100644 doc/board/CZ.NIC/index.rst > > > create mode 100644 doc/board/CZ.NIC/turris.rst > > > > > > diff --git a/doc/board/CZ.NIC/index.rst b/doc/board/CZ.NIC/index.rst > > > new file mode 100644 > > > index 000000000000..19ec6af2f389 > > > --- /dev/null > > > +++ b/doc/board/CZ.NIC/index.rst > > > @@ -0,0 +1,9 @@ > > > +.. SPDX-License-Identifier: GPL-2.0+ > > > + > > > +CZ.NIC > > > +====== > > > + > > > +.. toctree:: > > > + :maxdepth: 2 > > > + > > > + turris > > > diff --git a/doc/board/CZ.NIC/turris.rst b/doc/board/CZ.NIC/turris.rst > > > new file mode 100644 > > > index 000000000000..b82dea4e0786 > > > --- /dev/null > > > +++ b/doc/board/CZ.NIC/turris.rst > > > @@ -0,0 +1,323 @@ > > > +.. SPDX-License-Identifier: GPL-2.0+ > > > + > > > +CZ.NIC Turris routers > > > +===================== > > > + > > > +CZ.NIC develops open source Turris routers: Turris 1.0, Turris 1.1, > > > Turris Omnia, and Turris Mox. This document describes a U-Boot deployment > > > (compilation, flashing, resetting) on these routers. > > > + > > > +Turris 1.x > > > +---------- > > > + > > > +Turris 1.0 and Turris 1.1 boards contain Freescale P2020 CPUs with two > > > PowerPC e500v2 cores which BootROM (or CPU directly) can load and boot > > > U-Boot bootloader from various locations. For Turris 1.x boards, only > > > Flash NOR and SD cards are supported. P2020 CPU cannot download > > > bootloader via UART like other platforms. For loading the U-Boot > > > bootloader from Flash NOR (which is the default) it is needed to put SW1 > > > dip switches on the board to position 11001010, and for the SD card to > > > position 01101010 respectively. Note that this controls the source from > > > which P2020 loads U-Boot, not from which U-Boot loads boot script or > > > kernel. Boot procedures from SD card and Flash NOR are different, hence > > > U-Boot binaries need to be compiled differently. > > > + > > > +More information about Turris 1.x, including the complete HW > > > documentation (together with the SW1 dip switch options) and Altium > > > design files, can be found on: > > > https://docs.turris.cz/hw/turris-1x/turris-1x/ > > > + > > > +Compilation > > > +^^^^^^^^^^^ > > > + > > > +To compile the Flash NOR version, run:: > > > + > > > + $ make CROSS_COMPILE=powerpc-linux-gnuspe- turris_1x_nor_defconfig > > > + $ make CROSS_COMPILE=powerpc-linux-gnuspe- u-boot-with-dtb.bin > > > + > > > +It will produce a flashable binary file ``u-boot-with-dtb.bin``. > > > + > > > +To compile the SD card version, run:: > > > + > > > + $ make CROSS_COMPILE=powerpc-linux-gnuspe- turris_1x_sdcard_defconfig > > > + $ make CROSS_COMPILE=powerpc-linux-gnuspe- u-boot-with-spl.bin > > > + > > > +It will produce a bootable binary file ``u-boot-with-spl.bin``. > > > + > > > +Flashing > > > +^^^^^^^^ > > > + > > > +To flash the new U-Boot version into Flash NOR, load binary > > > ``u-boot-with-dtb.bin`` (which must have exact size 0xc0000 bytes) to the > > > ``$loadaddr`` address and run U-Boot commands:: > > > + > > > + => protect off 0xeff40000 +0xc0000 > > > + => erase 0xeff40000 +0xc0000 > > > + => cp.b $loadaddr 0xeff40000 0xc0000 > > > + => protect on 0xeff40000 +0xc0000 > > > + > > > +To load the new U-Boot version to the SD card, just copy the > > > ``u-boot-with-spl.bin`` binary image to sector 0 on the SD card. To > > > preserve existing MBR partitions on the SD card, do not overwrite bytes > > > 440-511 on sector 0. Do it for example via the ``dd`` command on Linux:: > > > + > > > + $ dd if=u-boot-with-spl.bin of=/dev/mmcblk0 bs=440 count=1 > > > + $ dd if=u-boot-with-spl.bin of=/dev/mmcblk0 bs=512 skip=1 > > > + > > > +Boot source > > > +^^^^^^^^^^^ > > > + > > > +By default P2020 CPU boots the U-Boot bootloader from the location > > > configured by SW1 dip switches on Turris 1.x boards. But this > > > configuration can be temporarily overridden by GPIOs (software > > > configured) until the power supply is disconnected or the HW reset button > > > is pressed. U-Boot environment provides commands ``run reboot_to_nor``, > > > ``run reboot_to_sd`` and ``run reboot_to_def`` to force boot source > > > location to Flash NOR, SD card, or default value (configured by SW1 dip > > > switches) and initiate reboot (CPU reset). Overridden configuration is > > > not lost after CPU reset. > > > + > > > +This can be useful to temporarily boot U-Boot from a different location > > > (e.g. after flashing the new version) without the need to open the device > > > and change the configuration of SW1 dip switches. > > > + > > > +Reset button > > > +^^^^^^^^^^^^ > > > + > > > +When the HW reset button is pushed, then CPLD puts the main P2020 CPU > > > into a reset state and the power led starts to blink in a one-second > > > period. After 6 seconds, the power led stays powered on. After the HW > > > reset button is released, CPLD releases the main P2020 CPU from the reset > > > state and U-Boot starts booting on the main P2020 CPU. During startup, > > > U-Boot sets the environment ``$turris_reset`` variable to the duration of > > > the reset button being held in seconds, meaning the count of how many > > > times the power led has blinked. The maximal value is therefore 6 seconds. > > > + > > > +If the HW reset button was held for 6 or more seconds then U-Boot sets > > > ``$boot_targets`` to ``rescue`` which automatically starts booting the > > > rescue system from Flash NOR, as defined in the ``$bootcmd_rescue`` > > > variable. Note that U-Boot resets default values of these variables to > > > ensure that booting into rescue mode would work correctly also when the > > > custom U-Boot environment stored in permanent Flash NOR storage is > > > damaged or overwritten. > > > + > > > +Environment variable ``$turris_reset`` can be used by boot scripts > > > during the boot process for various purposes, like different boot modes. > > > + > > > +Turris Omnia > > > +------------ > > > + > > > +Turris Omnia boards contain Marvell Armada 385 CPU with two ARM > > > Cortex-A9 cores on which BootROM can load U-Boot bootloader from various > > > locations. For Turris Omnia, only SPI NOR and UART are supported. The > > > binary image is the same for both, SPI NOR and UART. For UART downloading > > > and booting, a ``kwboot`` application is used (part of U-Boot). > > > + > > > +More information about Turris Omnia can be found on: > > > https://docs.turris.cz/hw/omnia/omnia/ > > > + > > > +Compilation > > > +^^^^^^^^^^^ > > > + > > > +To compile U-Boot for Turris Omnia, run:: > > > + > > > + $ make CROSS_COMPILE=arm-linux-gnueabi- turris_omnia_defconfig > > > + $ make CROSS_COMPILE=arm-linux-gnueabi- u-boot-spl.kwb > > > + > > > +Flashing > > > +^^^^^^^^ > > > + > > > +To flash the new U-Boot version into SPI NOR, load binary > > > ``u-boot-spl.kwb`` to the ``$loadaddr`` address of size ``$filesize`` and > > > run U-Boot commands:: > > > + > > > + => sf probe > > > + => sf update $loadaddr 0x0 $filesize > > > + > > > +UART booting > > > +^^^^^^^^^^^^ > > > + > > > +Run the ``kwboot`` command with the correct tty device:: > > > + > > > + $ ./tools/kwboot -b ./u-boot-spl.kwb -t /dev/ttyUSB0 > > > + > > > +After that, press the HW reset button on Omnia. ``kwboot`` should > > > instruct Armada 385 CPU BootROM to enter into UART download mode, and > > > transfer ``u-boot-spl.kwb`` binary over UART and boot it. > > > + > > > +Armada 385 UART supports speeds up to 5200000 bauds. With appropriate > > > USB-UART converters which support higher speeds, it is possible to speed > > > up transfer via the ``-B`` option. For example ``-B 5200000``. > > > > Please, use a maximum of 80 characters per line. > > > > > + > > > +Reset button > > > +^^^^^^^^^^^^ > > > + > > > +Like Turris 1.x boards, Turris Omnia has also a dedicated HW reset > > > button. U-Boot during startup sets environment variable ``$omnia_reset`` > > > to the reset mode selected by holding the reset button. > > > + > > > +If the HW reset button was held for about a second or more then U-Boot > > > starts booting the rescue system from SPI NOR. Value from the > > > ``$omnia_reset`` variable is put into the kernel command line, so the > > > rescue system can choose different actions based on reset mode. > > > + > > > +mSATA slot configuration > > > +^^^^^^^^^^^^^^^^^^^^^^^^ > > > + > > > +mSATA slot on Turris Omnia supports both SATA and PCIe modes. By > > > default, it is in auto mode, which means that mode is detected based on > > > the connected mSATA/mPCIe card's pin 43. mPCIe cards must have pin 43 > > > connected to the ground and mSATA cards have this pin disconnected. There > > > are some broken mPCIe cards that do not have grounded this pin and > > > therefore autodetection does not work: the slot is switched to SATA mode > > > and the mPCIe card does not work. > > > + > > > +To workaround this issue with buggy mPCIe cards in the mSATA slot, > > > U-Boot provides a way to turn off autodetection and forces mode to PCIe > > > (or also to SATA). U-Boot SPL during its init phase reads environment > > > variable ``$omnia_msata_slot`` and when it is set to ``sata`` or ``pcie`` > > > then it forces the specified slot mode. In all other cases, it configures > > > mode based on the card's pin 43. > > > + > > > +To force mSATA slot mode to PCIe run commands:: > > > + > > > + => setenv omnia_msata_slot pcie > > > + => saveenv > > > + => reset > > > + > > > +To revert mSATA slot mode back to autodetect mode:: > > > + > > > + => setenv omnia_msata_slot > > > + => saveenv > > > + => reset > > > + > > > +WWAN slot configuration > > > +^^^^^^^^^^^^^^^^^^^^^^^ > > > + > > > +WWAN mPCIe slot (that one with SIM slot) on Turris Omnia is compliant > > > with PCIe Mini CEM 2.1 specification and supports both PCIe and USB 3.0 > > > modes together with USB 2.0 mode. > > > + > > > +As defined in PCIe CEM 2.1 specification, PCIe and USB 3.0 functions > > > share the same mPCIe slot pins (23, 25, 31, 33), and therefore only one > > > of these two functions can be activated and configured at the same time. > > > USB 2.0 function is on dedicated mPCIe slot pins. By default, the WWAN > > > slot is in PCIe + USB 2.0 mode. U-Boot SPL during its init phase reads > > > environment variable ``$omnia_wwan_slot`` and when it is set to ``usb3`` > > > it changes the slot mode (slot pins 23, 25, 31, 33) to USB 3.0. > > > + > > > +To set WWAN slot mode to USB 3.0 run commands:: > > > + > > > + => setenv omnia_wwan_slot usb3 > > > + => saveenv > > > + => reset > > > + > > > +To revert WWAN slot back to PCIe + USB 2.0 mode:: > > > + > > > + => setenv omnia_wwan_slot > > > + => saveenv > > > + => reset > > > + > > > +Turris Mox > > > +---------- > > > + > > > +Turris Mox is a modular router system. Its main Mox-A module contains > > > Marvell Armada 3720 CPU with two 64-bit ARM Cortex-A53 cores and one > > > 32-bit ARM Cortex-M3 on which BootROM can load U-Boot bootloader from > > > various locations. Turris Mox supports only SPI NOR and UART. For UART > > > downloading and booting a ``mox-imager`` application is used. The > > > firmware itself consists of two parts: Secure firmware which runs on > > > 32-bit ARM Cortex-M3 core and A53 firmware which is runs on 64-bit ARM > > > Cortex-A53 cores. > > > + > > > +Application ``mox-imager`` is available at: > > > https://gitlab.nic.cz/turris/mox-imager > > > + > > > +More information about Turris Mox can be found on: > > > https://docs.turris.cz/hw/mox/intro/ > > > + > > > +Compilation > > > +^^^^^^^^^^^ > > > + > > > +To compile U-Boot for Turris Mox, run on a Linux computer:: > > > + > > > + $ make CROSS_COMPILE=aarch64-linux-gnu- turris_mox_defconfig > > > + $ make CROSS_COMPILE=aarch64-linux-gnu- u-boot.bin > > > + > > > +Note that standalone U-Boot cannot be flashed directly into SPI NOR. It > > > can be replaced only as part of the whole A53 firmware which contains a > > > concatenation of a Trusted-Firmware-A BL1 binary and a Trusted-Firmware-A > > > FIT binary. Trusted-Firmware-A FIT binary contains Trusted-Firmware-A BL2 > > > and BL3.1 binaries and also the U-Boot binary. > > > + > > > +To compile the final A53 firmware binary, compile the Trusted-Firmware-A > > > project, specifying the path to the u-boot.bin binary in the ``BL33=`` > > > option by commands:: > > > + > > > + $ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=a3700 > > > CM3_SYSTEM_RESET=1 USE_COHERENT_MEM=0 FIP_ALIGN=0x100 BL33=u-boot.bin > > > mrvl_bootimage > > > + $ cp -a build/a3700/release/boot-image.bin a53-firmware.bin > > > + $ od -v -tu8 -An -j 131184 -N 8 a53-firmware.bin | LC_ALL=C awk '{ > > > for (i = 0; i < 64; i += 8) printf "%c", and(rshift(1441792-131072-$$1, > > > i), 255) }' | dd of=a53-firmware.bin bs=1 seek=131192 count=8 > > > conv=notrunc 2>/dev/null > > > > Please, precede the code-block by > > > > .. code-block:: c > > > > to get syntax highlighting > > > > Use continuation lines to use a maximum of 80 characters. > > > > Don't use '$ ' as a line start as it make copying the commands to the > > console unnecessarily complicated. > > > > Best regards > > > > Heinrich > > Just small explanation. There are '$ ' at the start of lines which > describe commands which should be called on the host and '=> ' at the > start of lines which should be called on U-Boot console. It is there to > visually distinguish differences. And btw, it is shell code, so probably > should not use C lang highlighting. > > > > + > > > +It will produce a ``a53-firmware.bin`` binary. > > > + > > > +Trusted-Firmware-A project is available at: > > > https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/ > > > + > > > +Flashing > > > +^^^^^^^^ > > > + > > > +To flash new A53 firmware binary (which contains also U-Boot) into SPI > > > NOR, load binary ``a53-firmware.bin`` to the ``$loadaddr`` address of > > > size ``$filesize`` and run U-Boot commands:: > > > + > > > + => sf probe > > > + => sf update $loadaddr 0x20000 $filesize > > > + > > > +Secure firmware > > > +^^^^^^^^^^^^^^^ > > > + > > > +Secure firmware is running on Armada 3720 ARM CM3 core, separated from > > > main ARM A53 cores (on which U-Boot and Linux kernel are running). > > > + > > > +Due to security reasons, it is not possible to flash one's own version > > > of Secure firmware because it is signed and Armada 3720 CPU checks that > > > signature is done by CZ.NIC signing key. Armada 3720 CPU refuses to boot > > > binary which is not signed by CZ.NIC private key. > > > +Released signed binaries of Secure firmware can be downloaded from > > > CZ.NIC releases webpage: > > > https://gitlab.nic.cz/turris/mox-boot-builder/-/releases > > > +Secure firmware is open source and all sources can be downloaded from > > > CZ.NIC repository webpage: > > > https://gitlab.nic.cz/turris/mox-boot-builder/-/tree/master/wtmi > > > + > > > +To flash a new Secure firmware binary (which is signed by the CZ.NIC > > > key) into SPI NOR, load the ``secure-firmware.bin`` binary to the > > > ``$loadaddr`` address of the ``$filesize`` size and run U-Boot commands:: > > > + > > > + => sf probe > > > + => sf update $loadaddr 0x0 $filesize > > > + > > > +UART booting > > > +^^^^^^^^^^^^ > > > + > > > +Run command ``mox-imager`` with correct tty device:: > > > + > > > + $ mox-imager -D /dev/ttyUSB0 -E -t secure-firmware-uart.bin > > > a53-firmware.bin > > > + > > > +And plug the power supply. If it fails, unplug the power supply and plug > > > it in again. > > > + > > > +Armada 3720 UART supports speeds up to 6000000 bauds. With appropriate > > > USB-UART converters which support higher speeds, it is possible to speed > > > up transfer via the ``-b`` option. For example ``-b 6000000``. > > > + > > > +Rescue mode > > > +----------- > > > + > > > +On All Turris boards, it is possible to boot the rescue system from > > > U-Boot just by calling ``run bootcmd_rescue``. It is the same as pressing > > > the HW reset button for a longer time. > > > + > > > +OTP (One Time Programming) > > > +-------------------------- > > > + > > > +Every Turris board contains some OTP storage that is burned during > > > factory programming and which cannot be later modified or erased. It > > > contains information for device identification: the serial number, mac > > > addresses, etc. > > > + > > > +Every Turris 1.0, 1.1, and Omnia board has allocated 3 MAC addresses > > > from CZ.NIC OUI (D8:58:D7) and every Turris Mox board have allocated 2 > > > MAC addresses from CZ.NIC OUI (D8:58:D7). But only the first address is > > > stored in OTP, other MAC addresses can be calculated by numeric `plus > > > one` and `plus two` operations. > > > + > > > +Atsha 204/204a OTP content > > > +^^^^^^^^^^^^^^^^^^^^^^^^^^ > > > + > > > +All Turris 1.0, Turris 1.1 and Turris Omnia boards store into Atsha > > > 204/204a cryptochip OTP area at 32-bit words 0x00-0x03 following data:: > > > + > > > + word 0x00 - first half of 64-bit device serial number > > > + [07:00] - first byte of hw-rev/version (MSB) > > > + [15:08] - second byte of hw-rev/version > > > + [23:16] - third byte of hw-rev/version > > > + [31:24] - fourth byte of hw-rev/version (LSB) > > > + > > > + word 0x01 - second half of 64-bit device serial number > > > + [07:00] - first byte of serial (MSB) > > > + [15:08] - second byte of serial > > > + [23:16] - third byte of serial > > > + [31:24] - fourth byte of serial (LSB) > > > + > > > + word 0x02 - first half of 48-bit first MAC address with CZ.NIC OUI > > > (D8:58:D7) > > > + [07:00] - reserved (zero) > > > + [15:08] - first byte - 0xD8 > > > + [23:16] - second byte - 0x58 > > > + [31:24] - third byte - 0xD7 > > > + > > > + word 0x03 - second half of 48-bit first MAC address > > > + [07:00] - reserved (zero) > > > + [15:08] - fourth byte > > > + [23:16] - fifth byte > > > + [31:24] - sixth byte > > > + > > > +Words 0x00 and 0x01 contain 64-bit device serial numbers in a big-endian > > > format, and words 0x02 and 0x03 contain 48-bit first MAC addresses with > > > CZ.NIC OUI (D8:58:D7) in a big-endian format. > > > + > > > +Armada 385 LD1 eFuse content > > > +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > > + > > > +Turris Omnia boards of revision 32 or higher store into 256-bit long > > > Armada 385 LD1 eFuse OTP following data:: > > > + > > > + [047:000] - 48-bit first MAC address with CZ.NIC OUI (D8:58:D7) in > > > big endian > > > + [007:000] - first byte - 0xD8 > > > + [015:008] - second byte - 0x58 > > > + [023:016] - third byte - 0xD7 > > > + [031:024] - fourth byte > > > + [039:032] - fifth byte > > > + [047:040] - sixth byte > > > + [055:048] - board version > > > + [063:056] - reserved (zeros) > > > + [127:064] - 64-bit device serial number in big endian > > > + [071:064] - first byte of hw-rev/version (MSB) > > > + [079:072] - second byte of hw-rev/version > > > + [087:080] - third byte of hw-rev/version > > > + [095:088] - fourth byte of hw-rev/version (LSB) > > > + [103:096] - first byte of serial (MSB) > > > + [111:104] - second byte of serial > > > + [119:112] - third byte of serial > > > + [127:120] - fourth byte of serial (LSB) > > > + [255:128] - reserved (zeros) > > > + [256] - lock bit (1 - if above data are valid) > > > + > > > +Armada 385 LD1 eFuse is mapped to U-Boot fuse bank number 65. > > > + > > > +Read serial number:: > > > + > > > + => fuse read 65 2 1 > > > + > > > +Armada 3720 Secure OTP content > > > +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > > + > > > +All Turris Mox boards store into Armada 3720 Secure OTP 64-bit rows 42 > > > and 43 following data:: > > > + > > > + row 42 > > > + [47:00] - 48-bit first MAC address with CZ.NIC OUI (D8:58:D7) in > > > little endian > > > + [07:00] - sixth byte > > > + [15:08] - fifth byte > > > + [23:16] - fourth byte > > > + [31:24] - third byte - 0xD7 > > > + [39:32] - second byte - 0x58 > > > + [47:40] - first byte - 0xD8 > > > + [53:48] - board version > > > + [55:54] - board type > > > + 0b00 - CZ.NIC Turris Mox > > > + 0b01 - reserved (unassigned) > > > + 0b10 - RIPE Atlas Probe > > > + 0b11 - reserved (unassigned) > > > + [57:56] - RAM size > > > + 0b00 - 512M > > > + 0b01 - 1024M > > > + 0b10 - 2048M > > > + 0b11 - 4096M > > > + [63:58] - reserved (zeros) > > > + [64] - lock bit (1 - if above data are valid) > > > + > > > + row 43 > > > + [63:00] - 64-bit device serial number in big endian with swapped > > > 32-bit words > > > + [07:00] - first byte of serial (MSB) > > > + [15:08] - second byte of serial > > > + [23:16] - third byte of serial > > > + [31:24] - fourth byte of serial (LSB) > > > + [39:32] - first byte of hw-rev/version (MSB) > > > + [47:40] - second byte of hw-rev/version > > > + [55:48] - third byte of hw-rev/version > > > + [63:56] - fourth byte of hw-rev/version (LSB) > > > + [64] - lock bit (1 - if above data are valid) > > > + > > > +Armada 3720 Secure OTP rows are mapped 1:1 to U-Boot fuse bank numbers. > > > + > > > +Read serial number:: > > > + > > > + => fuse read 43 1 > > > + => fuse read 43 0 > > > diff --git a/doc/board/index.rst b/doc/board/index.rst > > > index 53edd5301f25..90467a6bd944 100644 > > > --- a/doc/board/index.rst > > > +++ b/doc/board/index.rst > > > @@ -18,6 +18,7 @@ Board-specific doc > > > bsh/index > > > congatec/index > > > coreboot/index > > > + CZ.NIC/index > > > emulation/index > > > google/index > > > highbank/index > >