All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sunxi: add board documentation
@ 2021-12-13  1:03 Andre Przywara
  2021-12-13 17:20 ` Jernej Škrabec
  2021-12-17 16:37 ` Simon Glass
  0 siblings, 2 replies; 7+ messages in thread
From: Andre Przywara @ 2021-12-13  1:03 UTC (permalink / raw)
  To: Jagan Teki, Simon Glass, Tom Rini
  Cc: u-boot, Samuel Holland, Jernej Skrabec, Chen-Yu Tsai,
	Maxime Ripard, Icenowy Zheng, linux-sunxi

Add some long overdue instructions for building and installing U-Boot on
Allwinner SoC based boards.
This describes the building process, including TF-A and crust, plus
installation to SD card, eMMC and SPI flash, both from Linux and U-Boot
itself. Also describe FEL booting.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
Hi,

please have a look whether this makes sense. Feel free to just try something,
and point out ambiguities or missing bits. For missing topics, please
send a follow-up patch ;-)

Also this is quite long, shall this be split up in two (or more) files?

This is what rst.ninjs.org made of it, if you prefer to read it formatted:
https://paste.c-net.org/PleasantNeedy

Cheers,
Andre

 doc/board/allwinner/index.rst |   9 +
 doc/board/allwinner/sunxi.rst | 304 ++++++++++++++++++++++++++++++++++
 2 files changed, 313 insertions(+)
 create mode 100644 doc/board/allwinner/index.rst
 create mode 100644 doc/board/allwinner/sunxi.rst

diff --git a/doc/board/allwinner/index.rst b/doc/board/allwinner/index.rst
new file mode 100644
index 00000000000..7352ccd5c0a
--- /dev/null
+++ b/doc/board/allwinner/index.rst
@@ -0,0 +1,9 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+Allwinner (sunxi) boards
+========================
+
+.. toctree::
+   :maxdepth: 2
+
+   sunxi
diff --git a/doc/board/allwinner/sunxi.rst b/doc/board/allwinner/sunxi.rst
new file mode 100644
index 00000000000..693eb32e168
--- /dev/null
+++ b/doc/board/allwinner/sunxi.rst
@@ -0,0 +1,304 @@
+.. SPDX-License-Identifier: GPL-2.0+
+.. Copyright (C) 2021 Arm Ltd.
+
+Allwinner SoC based boards
+==========================
+For boards using an Allwinner ARM based SoC ("sunxi"), the U-Boot build
+system generates a single integrated image file: ``u-boot-sunxi-with-spl.bin.``
+This file can be used on SD cards, eMMC devices, SPI flash and for the
+USB-OTG based boot method (FEL). To build this file:
+
+* For 64-bit SoCs, build Trusted Firmware (TF-A, formerly known as ATF) first,
+  you will need its ``bl31.bin``. See below for more details.
+* Optionally on 64-bit SoCs, build the crust management processor firmware.
+* Build U-Boot::
+
+  $ export BL31=/path/to/bl31.bin		# required for 64-bit SoCs
+  $ export SCP=/src/crust/build/scp/scp.bin	# optional for some 64-bit SoCs
+  $ make <yourboardname>_defconfig
+  $ make -j5 -s
+* Transfer to an uSD card (see below for more details)::
+
+  $ dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=8k seek=1
+* Boot and enjoy!
+
+For more details, and alternative boot locations or installations, see below.
+
+Building Arm Trusted Firmware (TF-A)
+------------------------------------
+Boards using a 64-bit Soc (A64, H5, H6, H616, R329) require the BL31 stage of
+the `Arm Trusted Firmware-A`_ firmware. This provides the reference
+implementation of secure software for Armv8-A, offering PSCI and SMCCC
+services. Allwinner support is fully mainlined. To build bl31.bin::
+
+  $ git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
+  $ cd trusted-firmware-a
+  $ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_a64 DEBUG=1
+  $ export BL31=$(pwd)/build/sun50i_a64/debug/bl31.bin
+
+The target platform (``PLAT=``) for A64 and H5 SoCs is sun50i_a64, for the H6
+sun50i_h6, for the H616 sun50i_h616, and for the R329 sun50i_r329. Use::
+
+  $ find plat/allwinner -name platform.mk
+
+to find all supported platforms. `docs/plat/allwinner.rst`_ contains more
+information and lists some build options.
+
+Building the Crust management processor firmware
+------------------------------------------------
+For some SoCs and boards, the integrated OpenRISC management controller can
+be used to provide power management services, foremost suspend to RAM.
+There is a community supported Open Source implementation called `crust`_,
+which runs on most SoCs featuring a management controller.
+
+This firmware part is optional, setting the SCP environment variable to
+/dev/null avoids the warning message when building without one.
+
+To build crust's scp.bin, you need an OpenRISC (or1k) cross compiler, then::
+
+  $ git clone https://github.com/crust-firmware/crust.git
+  $ cd crust
+  $ make <yourboard>_defconfig
+  $ make CROSS_COMPILE=or1k-none-elf- scp
+  $ export SCP=$(pwd)/build/scp/scp.bin
+
+Find a list of supported board configurations in the `configs/`_ directory.
+
+Building the U-Boot image
+-------------------------
+Find the U-Boot defconfig file for your board first. Those files live in
+the ``configs/`` directory; you can grep for the stub name of the devicetree
+file, if you know that, or for the SoC name to find the right version::
+
+    $ git grep -l MACH_SUN8I_H3 configs
+    $ git grep -l sun50i-h6-orangepi-3 configs
+
+The `linux-sunxi`_ wiki also lists the name of the defconfig file in the
+respective board page. Then use this defconfig file to create the .config
+file, and build the image::
+
+    $ make <yourboard>_defconfig
+    $ make -j5
+
+For 64-bit boards, this requires either the BL31 environment variable to be
+set (as shown above in the TF-A build example), or it to be supplied on the
+build command line::
+
+    $ make BL31=/src/tf-a.git/build/sun50i_h616/debug/bl31.bin -j5 -s
+
+The same applies to the (optional) SCP firmware.
+
+The file containing everything you need is called ``u-boot-sunxi-with-spl.bin``,
+you will find it in the root folder of your U-Boot (build) tree. Except for
+raw NAND flash devices this very same file can be used for any boot source.
+It will contain the SPL image, fitted with the proper signature recognised by
+the BROM, and the required checksum. Also it will contain at least U-Boot
+proper, either wrapped in the legacy U-Boot image format, or in a FIT image.
+The board's devicetree is also included, either appended to the U-Boot proper
+image, or contained in the FIT image. If required by the SoC, this FIT file will
+also include the other firmware images.
+
+Installing U-Boot
+-----------------
+
+Installing on a (micro-) SD card
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+All Allwinner SoCs will try to find a boot image at sector 16 (8KB) of
+an SD card, connected to the first MMC controller. To transfer the generated
+image to an SD card, from any Linux device (including the board itself) with
+an (micro-)SD card reader, type::
+
+    # dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8
+
+``/dev/sdx`` needs to be replaced with the block device name of the SD card
+reader. On some machines this could be ``/dev/mmcblkX``.
+Newer SoCs (starting from H3), also look at sector 256 (128KB) for the
+signature (after having checked the 8KB location). Installing the firmware
+there has the advantage of not overlapping with a GPT partition table. Simply
+replace the "``seek=8``" above with "``seek=128``".
+
+You can also use an existing (mainline) U-Boot to write to the SD card. Load
+the generated U-Boot image somewhere into DRAM (via ``ext4load``, ``fatload``,
+or ``tftpboot``), then write to MMC device 0::
+
+    => fatload mmc 0:1 $kernel_addr_r u-boot-sunxi-with-spl.bin
+    => mmc dev 0
+    => mmc write $kernel_addr_r 0x10 0x7f0
+
+To use the alternative boot location on newer SoCs::
+
+    => mmc write $kernel_addr_r 0x100 0x700
+
+Installing on eMMC (on-board flash memory)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Some boards have a soldered eMMC chip, some other boards have an eMMC socket
+to receive an optional eMMC module. U-Boot can be installed to those chips,
+to boot without an SD card inserted. The Boot-ROM can boot either from the
+regular user data partition, or from one of the separate eMMC boot partitions.
+U-Boot can be installed either from a running Linux instance on the device,
+from a running (mainline) U-Boot, or via an adapter for the (removable)
+eMMC module.
+
+Installing on an eMMC user data partition from Linux
+````````````````````````````````````````````````````
+If you have a running Linux instance on the device, and have somehow copied
+over the image file to that device, you can write the image directly into the
+eMMC device from there.
+Find the name of the block device file first, it is one of the
+``/dev/mmcblk<X>`` devices. eMMC devices typically also list a
+``/dev/mmcblk<X>boot0`` partition (see below), this helps you to tell it apart
+from the SD card device.
+To install onto the user data partition::
+
+    # dd if=u-boot-sunxi-with-spl.bin of=/dev/dev/mmcblkX bs=1k seek=8
+
+Similar to SD cards, the BROM in newer SoCs (H3 and above) also checks
+sector 256 of an eMMC, so you can use "``seek=128``" as well.
+
+Installing on an eMMC boot partition from Linux
+```````````````````````````````````````````````
+In the following examples, ``/dev/mmcblkX`` needs to be replaced with the block
+device name of the eMMC device. The eMMC device can be recognised by also
+listing the boot partitions (``/dev/mmcblkXboot0``) in ``/proc/partitions``.
+
+To allow booting from one of the eMMC boot partitions, this one needs to be
+enabled first. This only needs to be done once, as this setting is
+persistent, even though the boot partition can be disabled or changed again
+any time later::
+
+    # apt-get install mmc-utils
+    # mmc bootbus set single_hs x1 x4 /dev/mmcblkX
+    # mmc bootpart enable 1 1 /dev/mmcblkX
+
+The first "1" in the last command points to the boot partition number to be
+used, typically devices offer two boot partitions.
+
+By default Linux disables write access to the boot partitions, to prevent
+accidental overwrites. You need to disable the write protection (until the
+next reboot), then can write the U-Boot image to the *first* sector of the
+selected boot partition::
+
+    # echo 0 > /sys/block/mmcblkXboot0/force_ro
+    # dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblkXboot0 bs=1k
+
+Installing on an eMMC user data partition from U-Boot
+`````````````````````````````````````````````````````
+You can also write the generated image file to an SD card, boot the device
+from there, and burn the very same image to the eMMC device from U-Boot.
+The following commands copy the image from the SD card to the eMMC device::
+
+    => mmc dev 0
+    => mmc read $kernel_addr_r 0x10 0x7f0
+    => mmc dev 1
+    => mmc write $kernel_addr_r 0x10 0x7f0
+
+You can also copy an image from the 8K offset of an SD card to the 128K
+offset of the eMMC (or any combination), just change the "``0x10 0x7f0``" above
+to "``0x100 0x700``", respectively. Of course the image file can be loaded via
+any other loading method, including ``fatload``, ``ext4load``, ``tftpboot``.
+
+Installing on an eMMC boot partition from U-Boot
+````````````````````````````````````````````````
+The selected eMMC boot partition needs to be initially enabled first (same
+as in Linux above), you can do this from U-Boot with::
+
+    => mmc dev 1
+    => mmc bootbus 1 1 0 0
+    => mmc partconf 1 1 1 1
+
+The first "1" in both commands denotes the MMC device number. The second "1"
+in the partconf command sets the required ``BOOT_ACK`` option, the last two "1"s
+selects the active boot partition and the target for the next data access,
+respectively. So for the next "``mmc write``" command to address one of the boot
+partitions, the last number must either be "1" or "2", "0" would switch (back)
+to the normal user data partition.
+
+Then load the ``u-boot-sunxi-with-spl.bin`` image file into DRAM, either by
+reading directly from an SD card or eMMC user data partition, or from a
+file system or TFTP (see above), and transfer it to the boot partition::
+
+    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
+    => mmc write $kernel_addr_r 0 0x7f0
+
+After that the device should boot from the selected boot partition, which takes
+precedence over booting from the user data partition.
+
+Installing on SPI flash
+^^^^^^^^^^^^^^^^^^^^^^^
+Some devices have a SPI NOR flash chip soldered on the board. If it is
+connected to the SPI0 pins on PortC, the BROM can also boot from there.
+Typically the SPI flash has the lowest boot priority, so SD card and eMMC
+devices will be considered first.
+
+Installing on SPI flash from Linux
+``````````````````````````````````
+If the devicetree enables and describes the SPI flash device, you can access
+the SPI flash content from Linux, using the `MTD utils`_::
+
+    # apt-get install mtd-utils
+    # mtdinfo
+    # mtd_debug erase /dev/mtdX 0 0xf0000
+    # mtd_debug write /dev/mtdX 0 0xf0000 u-boot-sunxi-with-spl.bin
+
+``/dev/mtdX`` needs to be replaced with the respective device name, as listed
+in the output of ``mtdinfo``.
+
+Installing on SPI flash from U-Boot
+```````````````````````````````````
+If SPI flash driver and command support (``CONFIG_CMD_SF``) is enabled in the
+U-Boot configuration, the image file can be installed via U-Boot as well::
+
+    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
+    => sf probe
+    => sf erase 0 +0xf0000
+    => sf write $kernel_addr_r 0 $filesize
+
+Installing on SPI flash via USB in FEL mode
+```````````````````````````````````````````
+If the device is in FEL mode (see below), the SPI flash can also be filled
+with the sunxi-fel utility, via an USB(-OTG) cable from any USB host machine::
+
+    $ sunxi-fel -v -p spiflash-write 0 u-boot-sunxi-with-spl.bin
+
+Booting via the USB(-OTG) FEL mode
+----------------------------------
+If none of the boot locations checked by the BROM contain a medium or valid
+signature, the BROM will enter the so-called FEL mode, in which it will
+listen to commands from a host on the SoC's USB-OTG interface. Those commands
+allow to read from and write to arbitrary memory locations, also to start
+execution at any address, which allows to bootstrap a board solely via an
+USB cable. Some boards feature a "FEL" or "U-Boot" button, which forces
+FEL mode despite a valid boot location being present. The same can be achieved
+via a `magic binary`_ on an SD card, which allows to enter FEL mode on any
+board.
+
+To use FEL booting, let the board enter FEL mode, via any of the mentioned
+methods (no boot media, FEL button, SD card with FEL binary), then connect
+a USB cable to the board's USB OTG port. Some boards (Pine64, TV boxes) don't
+have a separate OTG port. In this case mostly one of the USB-A ports is
+connected to USB0, and can be used via a non-standard USB-A to USB-A cable.
+
+Typically there is no on-board indication of FEL mode, other than a new USB
+device appearing on the connected host computer. The USB vendor/device ID
+is 1f3a:efe8. Mostly this will identify as "sunxi SoC OTG connector in
+FEL/flashing mode", but older distributions might still report "Onda
+(unverified) V972 tablet in flashing mode".
+
+The `sunxi_fel`_ tool implements the proprietary BROM protocol, and allows to
+bootstrap U-Boot by just providing our venerable u-boot-sunxi-with-spl.bin::
+
+    $ sudo apt-get install sunxi-tools
+    $ sunxi-fel -v -p uboot u-boot-sunxi-with-spl.bin
+
+Additional binaries like a kernel, an initial ramdisk or a boot script, can
+also be uploaded via FEL, check the Wiki's `FEL page`_ for more details.
+
+.. _`Arm Trusted Firmware-A`:  https://www.trustedfirmware.org/projects/tf-a/
+.. _`docs/plat/allwinner.rst`: https://trustedfirmware-a.readthedocs.io/en/latest/plat/allwinner.html
+.. _`crust`: https://github.com/crust-firmware/crust
+.. _`configs/`: https://github.com/crust-firmware/crust/tree/master/configs
+.. _`linux-sunxi`: https://linux-sunxi.org
+.. _`MTD utils`: http://www.linux-mtd.infradead.org/
+.. _`magic binary`: https://github.com/linux-sunxi/sunxi-tools/raw/master/bin/fel-sdboot.sunxi
+.. _`sunxi_fel`: https://github.com/linux-sunxi/sunxi-tools
+.. _`FEL page`: https://linux-sunxi.org/FEL/USBBoot
-- 
2.17.6


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] sunxi: add board documentation
  2021-12-13  1:03 [PATCH] sunxi: add board documentation Andre Przywara
@ 2021-12-13 17:20 ` Jernej Škrabec
  2021-12-14  1:07   ` Andre Przywara
  2021-12-17 16:37 ` Simon Glass
  1 sibling, 1 reply; 7+ messages in thread
From: Jernej Škrabec @ 2021-12-13 17:20 UTC (permalink / raw)
  To: Jagan Teki, Simon Glass, Tom Rini, Andre Przywara
  Cc: u-boot, Samuel Holland, Chen-Yu Tsai, Maxime Ripard,
	Icenowy Zheng, linux-sunxi

Hi Andre!

Dne ponedeljek, 13. december 2021 ob 02:03:22 CET je Andre Przywara 
napisal(a):
> Add some long overdue instructions for building and installing U-Boot on
> Allwinner SoC based boards.
> This describes the building process, including TF-A and crust, plus
> installation to SD card, eMMC and SPI flash, both from Linux and U-Boot
> itself. Also describe FEL booting.
> 
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> ---
> Hi,
> 
> please have a look whether this makes sense. Feel free to just try 
something,
> and point out ambiguities or missing bits. For missing topics, please
> send a follow-up patch ;-)

This documentation seems to include all of board/sunxi/README.sunxi64 and 
README.nand. I think it would make sense to remove those files. If any file gets 
out of sync for any reason, it would be very confusing for end user.

I would also remove all non-essential command parameters, so all commands are 
as simple as possible. Power users will know about them anyway and non-skilled 
users might perceive that it's harder that it really is. I have in mind "-j5 -
s" for make, "-v -p" for sunxi-fel and DEBUG=1 for TF-A (maybe I missed some 
places). Actually, DEBUG=1 could be mentioned afterwards as troubleshooting 
step. In my experience, stable version of TF-A was never source of boot issues 
nor it provided any useful information for debugging anything else.

Some comments bellow.

> 
> Also this is quite long, shall this be split up in two (or more) files?
> 
> This is what rst.ninjs.org made of it, if you prefer to read it formatted:
> https://paste.c-net.org/PleasantNeedy
> 
> Cheers,
> Andre
> 
>  doc/board/allwinner/index.rst |   9 +
>  doc/board/allwinner/sunxi.rst | 304 ++++++++++++++++++++++++++++++++++
>  2 files changed, 313 insertions(+)
>  create mode 100644 doc/board/allwinner/index.rst
>  create mode 100644 doc/board/allwinner/sunxi.rst
> 
> diff --git a/doc/board/allwinner/index.rst b/doc/board/allwinner/index.rst
> new file mode 100644
> index 00000000000..7352ccd5c0a
> --- /dev/null
> +++ b/doc/board/allwinner/index.rst
> @@ -0,0 +1,9 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +
> +Allwinner (sunxi) boards
> +========================
> +
> +.. toctree::
> +   :maxdepth: 2
> +
> +   sunxi
> diff --git a/doc/board/allwinner/sunxi.rst b/doc/board/allwinner/sunxi.rst
> new file mode 100644
> index 00000000000..693eb32e168
> --- /dev/null
> +++ b/doc/board/allwinner/sunxi.rst
> @@ -0,0 +1,304 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +.. Copyright (C) 2021 Arm Ltd.
> +
> +Allwinner SoC based boards
> +==========================
> +For boards using an Allwinner ARM based SoC ("sunxi"), the U-Boot build
> +system generates a single integrated image file: ``u-boot-sunxi-with-
spl.bin.``
> +This file can be used on SD cards, eMMC devices, SPI flash and for the
> +USB-OTG based boot method (FEL). To build this file:
> +
> +* For 64-bit SoCs, build Trusted Firmware (TF-A, formerly known as ATF) 
first,
> +  you will need its ``bl31.bin``. See below for more details.
> +* Optionally on 64-bit SoCs, build the crust management processor firmware.
> +* Build U-Boot::
> +
> +  $ export BL31=/path/to/bl31.bin		# required for 64-bit SoCs
> +  $ export SCP=/src/crust/build/scp/scp.bin	# optional for some 64-bit
 SoCs

NIT: I guess path for SCP could be in same form, at least first part?

> +  $ make <yourboardname>_defconfig
> +  $ make -j5 -s
> +* Transfer to an uSD card (see below for more details)::
> +
> +  $ dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=8k seek=1

Most, if not all, distros require root for above command, so $ -> #? I see 
that you used # below. Alternative would be to prepend command with sudo, 
which is imo more beginners friendly.

> +* Boot and enjoy!
> +
> +For more details, and alternative boot locations or installations, see 
below.
> +
> +Building Arm Trusted Firmware (TF-A)
> +------------------------------------
> +Boards using a 64-bit Soc (A64, H5, H6, H616, R329) require the BL31 stage 
of
> +the `Arm Trusted Firmware-A`_ firmware. This provides the reference
> +implementation of secure software for Armv8-A, offering PSCI and SMCCC
> +services. Allwinner support is fully mainlined. To build bl31.bin::
> +
> +  $ git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
> +  $ cd trusted-firmware-a
> +  $ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_a64 DEBUG=1
> +  $ export BL31=$(pwd)/build/sun50i_a64/debug/bl31.bin
> +
> +The target platform (``PLAT=``) for A64 and H5 SoCs is sun50i_a64, for the 
H6
> +sun50i_h6, for the H616 sun50i_h616, and for the R329 sun50i_r329. Use::
> +
> +  $ find plat/allwinner -name platform.mk
> +
> +to find all supported platforms. `docs/plat/allwinner.rst`_ contains more
> +information and lists some build options.
> +
> +Building the Crust management processor firmware
> +------------------------------------------------
> +For some SoCs and boards, the integrated OpenRISC management controller can
> +be used to provide power management services, foremost suspend to RAM.
> +There is a community supported Open Source implementation called `crust`_,
> +which runs on most SoCs featuring a management controller.
> +
> +This firmware part is optional, setting the SCP environment variable to
> +/dev/null avoids the warning message when building without one.
> +
> +To build crust's scp.bin, you need an OpenRISC (or1k) cross compiler, 
then::
> +
> +  $ git clone https://github.com/crust-firmware/crust.git
> +  $ cd crust
> +  $ make <yourboard>_defconfig
> +  $ make CROSS_COMPILE=or1k-none-elf- scp

I guess it would be good to point out that compiler prefix may not be the same 
on all distros. For example, Arch packages this compiler and proper prefix 
there is or1k-elf- which also works just fine.

Best regards,
Jernej

> +  $ export SCP=$(pwd)/build/scp/scp.bin
> +
> +Find a list of supported board configurations in the `configs/`_ directory.
> +
> +Building the U-Boot image
> +-------------------------
> +Find the U-Boot defconfig file for your board first. Those files live in
> +the ``configs/`` directory; you can grep for the stub name of the devicetree
> +file, if you know that, or for the SoC name to find the right version::
> +
> +    $ git grep -l MACH_SUN8I_H3 configs
> +    $ git grep -l sun50i-h6-orangepi-3 configs
> +
> +The `linux-sunxi`_ wiki also lists the name of the defconfig file in the
> +respective board page. Then use this defconfig file to create the .config
> +file, and build the image::
> +
> +    $ make <yourboard>_defconfig
> +    $ make -j5
> +
> +For 64-bit boards, this requires either the BL31 environment variable to be
> +set (as shown above in the TF-A build example), or it to be supplied on the
> +build command line::
> +
> +    $ make BL31=/src/tf-a.git/build/sun50i_h616/debug/bl31.bin -j5 -s
> +
> +The same applies to the (optional) SCP firmware.
> +
> +The file containing everything you need is called ``u-boot-sunxi-with-
spl.bin``,
> +you will find it in the root folder of your U-Boot (build) tree. Except for
> +raw NAND flash devices this very same file can be used for any boot source.
> +It will contain the SPL image, fitted with the proper signature recognised 
by
> +the BROM, and the required checksum. Also it will contain at least U-Boot
> +proper, either wrapped in the legacy U-Boot image format, or in a FIT 
image.
> +The board's devicetree is also included, either appended to the U-Boot 
proper
> +image, or contained in the FIT image. If required by the SoC, this FIT file 
will
> +also include the other firmware images.
> +
> +Installing U-Boot
> +-----------------
> +
> +Installing on a (micro-) SD card
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +All Allwinner SoCs will try to find a boot image at sector 16 (8KB) of
> +an SD card, connected to the first MMC controller. To transfer the generated
> +image to an SD card, from any Linux device (including the board itself) 
with
> +an (micro-)SD card reader, type::
> +
> +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8
> +
> +``/dev/sdx`` needs to be replaced with the block device name of the SD card
> +reader. On some machines this could be ``/dev/mmcblkX``.
> +Newer SoCs (starting from H3), also look at sector 256 (128KB) for the
> +signature (after having checked the 8KB location). Installing the firmware
> +there has the advantage of not overlapping with a GPT partition table. 
Simply
> +replace the "``seek=8``" above with "``seek=128``".
> +
> +You can also use an existing (mainline) U-Boot to write to the SD card. 
Load
> +the generated U-Boot image somewhere into DRAM (via ``ext4load``, 
``fatload``,
> +or ``tftpboot``), then write to MMC device 0::
> +
> +    => fatload mmc 0:1 $kernel_addr_r u-boot-sunxi-with-spl.bin
> +    => mmc dev 0
> +    => mmc write $kernel_addr_r 0x10 0x7f0
> +
> +To use the alternative boot location on newer SoCs::
> +
> +    => mmc write $kernel_addr_r 0x100 0x700
> +
> +Installing on eMMC (on-board flash memory)
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +Some boards have a soldered eMMC chip, some other boards have an eMMC 
socket
> +to receive an optional eMMC module. U-Boot can be installed to those chips,
> +to boot without an SD card inserted. The Boot-ROM can boot either from the
> +regular user data partition, or from one of the separate eMMC boot 
partitions.
> +U-Boot can be installed either from a running Linux instance on the device,
> +from a running (mainline) U-Boot, or via an adapter for the (removable)
> +eMMC module.
> +
> +Installing on an eMMC user data partition from Linux
> +````````````````````````````````````````````````````
> +If you have a running Linux instance on the device, and have somehow copied
> +over the image file to that device, you can write the image directly into 
the
> +eMMC device from there.
> +Find the name of the block device file first, it is one of the
> +``/dev/mmcblk<X>`` devices. eMMC devices typically also list a
> +``/dev/mmcblk<X>boot0`` partition (see below), this helps you to tell it 
apart
> +from the SD card device.
> +To install onto the user data partition::
> +
> +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/dev/mmcblkX bs=1k seek=8
> +
> +Similar to SD cards, the BROM in newer SoCs (H3 and above) also checks
> +sector 256 of an eMMC, so you can use "``seek=128``" as well.
> +
> +Installing on an eMMC boot partition from Linux
> +```````````````````````````````````````````````
> +In the following examples, ``/dev/mmcblkX`` needs to be replaced with the 
block
> +device name of the eMMC device. The eMMC device can be recognised by also
> +listing the boot partitions (``/dev/mmcblkXboot0``) in ``/proc/
partitions``.
> +
> +To allow booting from one of the eMMC boot partitions, this one needs to be
> +enabled first. This only needs to be done once, as this setting is
> +persistent, even though the boot partition can be disabled or changed again
> +any time later::
> +
> +    # apt-get install mmc-utils
> +    # mmc bootbus set single_hs x1 x4 /dev/mmcblkX
> +    # mmc bootpart enable 1 1 /dev/mmcblkX
> +
> +The first "1" in the last command points to the boot partition number to be
> +used, typically devices offer two boot partitions.
> +
> +By default Linux disables write access to the boot partitions, to prevent
> +accidental overwrites. You need to disable the write protection (until the
> +next reboot), then can write the U-Boot image to the *first* sector of the
> +selected boot partition::
> +
> +    # echo 0 > /sys/block/mmcblkXboot0/force_ro
> +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblkXboot0 bs=1k
> +
> +Installing on an eMMC user data partition from U-Boot
> +`````````````````````````````````````````````````````
> +You can also write the generated image file to an SD card, boot the device
> +from there, and burn the very same image to the eMMC device from U-Boot.
> +The following commands copy the image from the SD card to the eMMC device::
> +
> +    => mmc dev 0
> +    => mmc read $kernel_addr_r 0x10 0x7f0
> +    => mmc dev 1
> +    => mmc write $kernel_addr_r 0x10 0x7f0
> +
> +You can also copy an image from the 8K offset of an SD card to the 128K
> +offset of the eMMC (or any combination), just change the "``0x10 0x7f0``" 
above
> +to "``0x100 0x700``", respectively. Of course the image file can be loaded 
via
> +any other loading method, including ``fatload``, ``ext4load``, 
``tftpboot``.
> +
> +Installing on an eMMC boot partition from U-Boot
> +````````````````````````````````````````````````
> +The selected eMMC boot partition needs to be initially enabled first (same
> +as in Linux above), you can do this from U-Boot with::
> +
> +    => mmc dev 1
> +    => mmc bootbus 1 1 0 0
> +    => mmc partconf 1 1 1 1
> +
> +The first "1" in both commands denotes the MMC device number. The second "1"
> +in the partconf command sets the required ``BOOT_ACK`` option, the last two 
"1"s
> +selects the active boot partition and the target for the next data access,
> +respectively. So for the next "``mmc write``" command to address one of the 
boot
> +partitions, the last number must either be "1" or "2", "0" would switch 
(back)
> +to the normal user data partition.
> +
> +Then load the ``u-boot-sunxi-with-spl.bin`` image file into DRAM, either by
> +reading directly from an SD card or eMMC user data partition, or from a
> +file system or TFTP (see above), and transfer it to the boot partition::
> +
> +    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
> +    => mmc write $kernel_addr_r 0 0x7f0
> +
> +After that the device should boot from the selected boot partition, which 
takes
> +precedence over booting from the user data partition.
> +
> +Installing on SPI flash
> +^^^^^^^^^^^^^^^^^^^^^^^
> +Some devices have a SPI NOR flash chip soldered on the board. If it is
> +connected to the SPI0 pins on PortC, the BROM can also boot from there.
> +Typically the SPI flash has the lowest boot priority, so SD card and eMMC
> +devices will be considered first.
> +
> +Installing on SPI flash from Linux
> +``````````````````````````````````
> +If the devicetree enables and describes the SPI flash device, you can access
> +the SPI flash content from Linux, using the `MTD utils`_::
> +
> +    # apt-get install mtd-utils
> +    # mtdinfo
> +    # mtd_debug erase /dev/mtdX 0 0xf0000
> +    # mtd_debug write /dev/mtdX 0 0xf0000 u-boot-sunxi-with-spl.bin
> +
> +``/dev/mtdX`` needs to be replaced with the respective device name, as 
listed
> +in the output of ``mtdinfo``.
> +
> +Installing on SPI flash from U-Boot
> +```````````````````````````````````
> +If SPI flash driver and command support (``CONFIG_CMD_SF``) is enabled in 
the
> +U-Boot configuration, the image file can be installed via U-Boot as well::
> +
> +    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
> +    => sf probe
> +    => sf erase 0 +0xf0000
> +    => sf write $kernel_addr_r 0 $filesize
> +
> +Installing on SPI flash via USB in FEL mode
> +```````````````````````````````````````````
> +If the device is in FEL mode (see below), the SPI flash can also be filled
> +with the sunxi-fel utility, via an USB(-OTG) cable from any USB host 
machine::
> +
> +    $ sunxi-fel -v -p spiflash-write 0 u-boot-sunxi-with-spl.bin
> +
> +Booting via the USB(-OTG) FEL mode
> +----------------------------------
> +If none of the boot locations checked by the BROM contain a medium or valid
> +signature, the BROM will enter the so-called FEL mode, in which it will
> +listen to commands from a host on the SoC's USB-OTG interface. Those 
commands
> +allow to read from and write to arbitrary memory locations, also to start
> +execution at any address, which allows to bootstrap a board solely via an
> +USB cable. Some boards feature a "FEL" or "U-Boot" button, which forces
> +FEL mode despite a valid boot location being present. The same can be 
achieved
> +via a `magic binary`_ on an SD card, which allows to enter FEL mode on any
> +board.
> +
> +To use FEL booting, let the board enter FEL mode, via any of the mentioned
> +methods (no boot media, FEL button, SD card with FEL binary), then connect
> +a USB cable to the board's USB OTG port. Some boards (Pine64, TV boxes) 
don't
> +have a separate OTG port. In this case mostly one of the USB-A ports is
> +connected to USB0, and can be used via a non-standard USB-A to USB-A cable.
> +
> +Typically there is no on-board indication of FEL mode, other than a new USB
> +device appearing on the connected host computer. The USB vendor/device ID
> +is 1f3a:efe8. Mostly this will identify as "sunxi SoC OTG connector in
> +FEL/flashing mode", but older distributions might still report "Onda
> +(unverified) V972 tablet in flashing mode".
> +
> +The `sunxi_fel`_ tool implements the proprietary BROM protocol, and allows 
to
> +bootstrap U-Boot by just providing our venerable u-boot-sunxi-with-
spl.bin::
> +
> +    $ sudo apt-get install sunxi-tools
> +    $ sunxi-fel -v -p uboot u-boot-sunxi-with-spl.bin
> +
> +Additional binaries like a kernel, an initial ramdisk or a boot script, can
> +also be uploaded via FEL, check the Wiki's `FEL page`_ for more details.
> +
> +.. _`Arm Trusted Firmware-A`:  https://www.trustedfirmware.org/projects/tf-a/
> +.. _`docs/plat/allwinner.rst`: https://trustedfirmware-a.readthedocs.io/en/
latest/plat/allwinner.html
> +.. _`crust`: https://github.com/crust-firmware/crust
> +.. _`configs/`: https://github.com/crust-firmware/crust/tree/master/configs
> +.. _`linux-sunxi`: https://linux-sunxi.org
> +.. _`MTD utils`: http://www.linux-mtd.infradead.org/
> +.. _`magic binary`: https://github.com/linux-sunxi/sunxi-tools/raw/master/
bin/fel-sdboot.sunxi
> +.. _`sunxi_fel`: https://github.com/linux-sunxi/sunxi-tools
> +.. _`FEL page`: https://linux-sunxi.org/FEL/USBBoot
> -- 
> 2.17.6
> 
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] sunxi: add board documentation
  2021-12-13 17:20 ` Jernej Škrabec
@ 2021-12-14  1:07   ` Andre Przywara
  2021-12-14 17:17     ` Jernej Škrabec
  0 siblings, 1 reply; 7+ messages in thread
From: Andre Przywara @ 2021-12-14  1:07 UTC (permalink / raw)
  To: Jernej Škrabec
  Cc: Jagan Teki, Simon Glass, Tom Rini, u-boot, Samuel Holland,
	Chen-Yu Tsai, Maxime Ripard, Icenowy Zheng, linux-sunxi

On Mon, 13 Dec 2021 18:20:37 +0100
Jernej Škrabec <jernej.skrabec@gmail.com> wrote:

Hi Jernej,

thanks for having a look!

> Dne ponedeljek, 13. december 2021 ob 02:03:22 CET je Andre Przywara 
> napisal(a):
> > Add some long overdue instructions for building and installing U-Boot on
> > Allwinner SoC based boards.
> > This describes the building process, including TF-A and crust, plus
> > installation to SD card, eMMC and SPI flash, both from Linux and U-Boot
> > itself. Also describe FEL booting.
> > 
> > Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> > ---
> > Hi,
> > 
> > please have a look whether this makes sense. Feel free to just try   
> something,
> > and point out ambiguities or missing bits. For missing topics, please
> > send a follow-up patch ;-)  
> 
> This documentation seems to include all of board/sunxi/README.sunxi64 and 
> README.nand. I think it would make sense to remove those files. If any file gets 
> out of sync for any reason, it would be very confusing for end user.

Indeed, I think README.sunxi64 is redundant now.
I didn't look at README.nand too closely, but since I don't even mention
NAND, I don't think it can be removed just yet. I guess I just convert
it to RST and move it into this directory.

> I would also remove all non-essential command parameters, so all commands are 
> as simple as possible. Power users will know about them anyway and non-skilled 
> users might perceive that it's harder that it really is. I have in mind "-j5 -
> s" for make, "-v -p" for sunxi-fel

I see, makes sense.

> and DEBUG=1 for TF-A (maybe I missed some 
> places). Actually, DEBUG=1 could be mentioned afterwards as troubleshooting 
> step. In my experience, stable version of TF-A was never source of boot issues 
> nor it provided any useful information for debugging anything else.

Well, I'd tend to keep DEBUG=1 enabled, this lists the regulators
enabled, which helps debugging. Also in the past DEBUG=0 was very
silent, which wasn't helpful to verify that TF-A actually started.

Do you typically build or recommend DEBUG=0?

> Some comments bellow.
> 
> > 
> > Also this is quite long, shall this be split up in two (or more) files?
> > 
> > This is what rst.ninjs.org made of it, if you prefer to read it formatted:
> > https://paste.c-net.org/PleasantNeedy
> > 
> > Cheers,
> > Andre
> > 
> >  doc/board/allwinner/index.rst |   9 +
> >  doc/board/allwinner/sunxi.rst | 304 ++++++++++++++++++++++++++++++++++
> >  2 files changed, 313 insertions(+)
> >  create mode 100644 doc/board/allwinner/index.rst
> >  create mode 100644 doc/board/allwinner/sunxi.rst
> > 
> > diff --git a/doc/board/allwinner/index.rst b/doc/board/allwinner/index.rst
> > new file mode 100644
> > index 00000000000..7352ccd5c0a
> > --- /dev/null
> > +++ b/doc/board/allwinner/index.rst
> > @@ -0,0 +1,9 @@
> > +.. SPDX-License-Identifier: GPL-2.0+
> > +
> > +Allwinner (sunxi) boards
> > +========================
> > +
> > +.. toctree::
> > +   :maxdepth: 2
> > +
> > +   sunxi
> > diff --git a/doc/board/allwinner/sunxi.rst b/doc/board/allwinner/sunxi.rst
> > new file mode 100644
> > index 00000000000..693eb32e168
> > --- /dev/null
> > +++ b/doc/board/allwinner/sunxi.rst
> > @@ -0,0 +1,304 @@
> > +.. SPDX-License-Identifier: GPL-2.0+
> > +.. Copyright (C) 2021 Arm Ltd.
> > +
> > +Allwinner SoC based boards
> > +==========================
> > +For boards using an Allwinner ARM based SoC ("sunxi"), the U-Boot build
> > +system generates a single integrated image file: ``u-boot-sunxi-with-  
> spl.bin.``
> > +This file can be used on SD cards, eMMC devices, SPI flash and for the
> > +USB-OTG based boot method (FEL). To build this file:
> > +
> > +* For 64-bit SoCs, build Trusted Firmware (TF-A, formerly known as ATF)   
> first,
> > +  you will need its ``bl31.bin``. See below for more details.
> > +* Optionally on 64-bit SoCs, build the crust management processor firmware.
> > +* Build U-Boot::
> > +
> > +  $ export BL31=/path/to/bl31.bin		# required for 64-bit SoCs
> > +  $ export SCP=/src/crust/build/scp/scp.bin	# optional for some 64-bit  
>  SoCs
> 
> NIT: I guess path for SCP could be in same form, at least first part?

Yeah, makes sense.

> > +  $ make <yourboardname>_defconfig
> > +  $ make -j5 -s
> > +* Transfer to an uSD card (see below for more details)::
> > +
> > +  $ dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=8k seek=1  
> 
> Most, if not all, distros require root for above command, so $ -> #? I see 
> that you used # below. Alternative would be to prepend command with sudo, 
> which is imo more beginners friendly.

Ah, good catch!

> > +* Boot and enjoy!
> > +
> > +For more details, and alternative boot locations or installations, see   
> below.
> > +
> > +Building Arm Trusted Firmware (TF-A)
> > +------------------------------------
> > +Boards using a 64-bit Soc (A64, H5, H6, H616, R329) require the BL31 stage   
> of
> > +the `Arm Trusted Firmware-A`_ firmware. This provides the reference
> > +implementation of secure software for Armv8-A, offering PSCI and SMCCC
> > +services. Allwinner support is fully mainlined. To build bl31.bin::
> > +
> > +  $ git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
> > +  $ cd trusted-firmware-a
> > +  $ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_a64 DEBUG=1
> > +  $ export BL31=$(pwd)/build/sun50i_a64/debug/bl31.bin
> > +
> > +The target platform (``PLAT=``) for A64 and H5 SoCs is sun50i_a64, for the   
> H6
> > +sun50i_h6, for the H616 sun50i_h616, and for the R329 sun50i_r329. Use::
> > +
> > +  $ find plat/allwinner -name platform.mk
> > +
> > +to find all supported platforms. `docs/plat/allwinner.rst`_ contains more
> > +information and lists some build options.
> > +
> > +Building the Crust management processor firmware
> > +------------------------------------------------
> > +For some SoCs and boards, the integrated OpenRISC management controller can
> > +be used to provide power management services, foremost suspend to RAM.
> > +There is a community supported Open Source implementation called `crust`_,
> > +which runs on most SoCs featuring a management controller.
> > +
> > +This firmware part is optional, setting the SCP environment variable to
> > +/dev/null avoids the warning message when building without one.
> > +
> > +To build crust's scp.bin, you need an OpenRISC (or1k) cross compiler,   
> then::
> > +
> > +  $ git clone https://github.com/crust-firmware/crust.git
> > +  $ cd crust
> > +  $ make <yourboard>_defconfig
> > +  $ make CROSS_COMPILE=or1k-none-elf- scp  
> 
> I guess it would be good to point out that compiler prefix may not be the same 
> on all distros. For example, Arch packages this compiler and proper prefix 
> there is or1k-elf- which also works just fine.

I feel I shouldn't spend too much time on this, instead just point to
crust's README.

Thanks,
Andre

> 
> Best regards,
> Jernej
> 
> > +  $ export SCP=$(pwd)/build/scp/scp.bin
> > +
> > +Find a list of supported board configurations in the `configs/`_ directory.
> > +
> > +Building the U-Boot image
> > +-------------------------
> > +Find the U-Boot defconfig file for your board first. Those files live in
> > +the ``configs/`` directory; you can grep for the stub name of the devicetree
> > +file, if you know that, or for the SoC name to find the right version::
> > +
> > +    $ git grep -l MACH_SUN8I_H3 configs
> > +    $ git grep -l sun50i-h6-orangepi-3 configs
> > +
> > +The `linux-sunxi`_ wiki also lists the name of the defconfig file in the
> > +respective board page. Then use this defconfig file to create the .config
> > +file, and build the image::
> > +
> > +    $ make <yourboard>_defconfig
> > +    $ make -j5
> > +
> > +For 64-bit boards, this requires either the BL31 environment variable to be
> > +set (as shown above in the TF-A build example), or it to be supplied on the
> > +build command line::
> > +
> > +    $ make BL31=/src/tf-a.git/build/sun50i_h616/debug/bl31.bin -j5 -s
> > +
> > +The same applies to the (optional) SCP firmware.
> > +
> > +The file containing everything you need is called ``u-boot-sunxi-with-  
> spl.bin``,
> > +you will find it in the root folder of your U-Boot (build) tree. Except for
> > +raw NAND flash devices this very same file can be used for any boot source.
> > +It will contain the SPL image, fitted with the proper signature recognised   
> by
> > +the BROM, and the required checksum. Also it will contain at least U-Boot
> > +proper, either wrapped in the legacy U-Boot image format, or in a FIT   
> image.
> > +The board's devicetree is also included, either appended to the U-Boot   
> proper
> > +image, or contained in the FIT image. If required by the SoC, this FIT file   
> will
> > +also include the other firmware images.
> > +
> > +Installing U-Boot
> > +-----------------
> > +
> > +Installing on a (micro-) SD card
> > +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > +All Allwinner SoCs will try to find a boot image at sector 16 (8KB) of
> > +an SD card, connected to the first MMC controller. To transfer the generated
> > +image to an SD card, from any Linux device (including the board itself)   
> with
> > +an (micro-)SD card reader, type::
> > +
> > +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8
> > +
> > +``/dev/sdx`` needs to be replaced with the block device name of the SD card
> > +reader. On some machines this could be ``/dev/mmcblkX``.
> > +Newer SoCs (starting from H3), also look at sector 256 (128KB) for the
> > +signature (after having checked the 8KB location). Installing the firmware
> > +there has the advantage of not overlapping with a GPT partition table.   
> Simply
> > +replace the "``seek=8``" above with "``seek=128``".
> > +
> > +You can also use an existing (mainline) U-Boot to write to the SD card.   
> Load
> > +the generated U-Boot image somewhere into DRAM (via ``ext4load``,   
> ``fatload``,
> > +or ``tftpboot``), then write to MMC device 0::
> > +
> > +    => fatload mmc 0:1 $kernel_addr_r u-boot-sunxi-with-spl.bin
> > +    => mmc dev 0
> > +    => mmc write $kernel_addr_r 0x10 0x7f0
> > +
> > +To use the alternative boot location on newer SoCs::
> > +
> > +    => mmc write $kernel_addr_r 0x100 0x700
> > +
> > +Installing on eMMC (on-board flash memory)
> > +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > +Some boards have a soldered eMMC chip, some other boards have an eMMC   
> socket
> > +to receive an optional eMMC module. U-Boot can be installed to those chips,
> > +to boot without an SD card inserted. The Boot-ROM can boot either from the
> > +regular user data partition, or from one of the separate eMMC boot   
> partitions.
> > +U-Boot can be installed either from a running Linux instance on the device,
> > +from a running (mainline) U-Boot, or via an adapter for the (removable)
> > +eMMC module.
> > +
> > +Installing on an eMMC user data partition from Linux
> > +````````````````````````````````````````````````````
> > +If you have a running Linux instance on the device, and have somehow copied
> > +over the image file to that device, you can write the image directly into   
> the
> > +eMMC device from there.
> > +Find the name of the block device file first, it is one of the
> > +``/dev/mmcblk<X>`` devices. eMMC devices typically also list a
> > +``/dev/mmcblk<X>boot0`` partition (see below), this helps you to tell it   
> apart
> > +from the SD card device.
> > +To install onto the user data partition::
> > +
> > +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/dev/mmcblkX bs=1k seek=8
> > +
> > +Similar to SD cards, the BROM in newer SoCs (H3 and above) also checks
> > +sector 256 of an eMMC, so you can use "``seek=128``" as well.
> > +
> > +Installing on an eMMC boot partition from Linux
> > +```````````````````````````````````````````````
> > +In the following examples, ``/dev/mmcblkX`` needs to be replaced with the   
> block
> > +device name of the eMMC device. The eMMC device can be recognised by also
> > +listing the boot partitions (``/dev/mmcblkXboot0``) in ``/proc/  
> partitions``.
> > +
> > +To allow booting from one of the eMMC boot partitions, this one needs to be
> > +enabled first. This only needs to be done once, as this setting is
> > +persistent, even though the boot partition can be disabled or changed again
> > +any time later::
> > +
> > +    # apt-get install mmc-utils
> > +    # mmc bootbus set single_hs x1 x4 /dev/mmcblkX
> > +    # mmc bootpart enable 1 1 /dev/mmcblkX
> > +
> > +The first "1" in the last command points to the boot partition number to be
> > +used, typically devices offer two boot partitions.
> > +
> > +By default Linux disables write access to the boot partitions, to prevent
> > +accidental overwrites. You need to disable the write protection (until the
> > +next reboot), then can write the U-Boot image to the *first* sector of the
> > +selected boot partition::
> > +
> > +    # echo 0 > /sys/block/mmcblkXboot0/force_ro
> > +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblkXboot0 bs=1k
> > +
> > +Installing on an eMMC user data partition from U-Boot
> > +`````````````````````````````````````````````````````
> > +You can also write the generated image file to an SD card, boot the device
> > +from there, and burn the very same image to the eMMC device from U-Boot.
> > +The following commands copy the image from the SD card to the eMMC device::
> > +
> > +    => mmc dev 0
> > +    => mmc read $kernel_addr_r 0x10 0x7f0
> > +    => mmc dev 1
> > +    => mmc write $kernel_addr_r 0x10 0x7f0
> > +
> > +You can also copy an image from the 8K offset of an SD card to the 128K
> > +offset of the eMMC (or any combination), just change the "``0x10 0x7f0``"   
> above
> > +to "``0x100 0x700``", respectively. Of course the image file can be loaded   
> via
> > +any other loading method, including ``fatload``, ``ext4load``,   
> ``tftpboot``.
> > +
> > +Installing on an eMMC boot partition from U-Boot
> > +````````````````````````````````````````````````
> > +The selected eMMC boot partition needs to be initially enabled first (same
> > +as in Linux above), you can do this from U-Boot with::
> > +
> > +    => mmc dev 1
> > +    => mmc bootbus 1 1 0 0
> > +    => mmc partconf 1 1 1 1
> > +
> > +The first "1" in both commands denotes the MMC device number. The second "1"
> > +in the partconf command sets the required ``BOOT_ACK`` option, the last two   
> "1"s
> > +selects the active boot partition and the target for the next data access,
> > +respectively. So for the next "``mmc write``" command to address one of the   
> boot
> > +partitions, the last number must either be "1" or "2", "0" would switch   
> (back)
> > +to the normal user data partition.
> > +
> > +Then load the ``u-boot-sunxi-with-spl.bin`` image file into DRAM, either by
> > +reading directly from an SD card or eMMC user data partition, or from a
> > +file system or TFTP (see above), and transfer it to the boot partition::
> > +
> > +    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
> > +    => mmc write $kernel_addr_r 0 0x7f0
> > +
> > +After that the device should boot from the selected boot partition, which   
> takes
> > +precedence over booting from the user data partition.
> > +
> > +Installing on SPI flash
> > +^^^^^^^^^^^^^^^^^^^^^^^
> > +Some devices have a SPI NOR flash chip soldered on the board. If it is
> > +connected to the SPI0 pins on PortC, the BROM can also boot from there.
> > +Typically the SPI flash has the lowest boot priority, so SD card and eMMC
> > +devices will be considered first.
> > +
> > +Installing on SPI flash from Linux
> > +``````````````````````````````````
> > +If the devicetree enables and describes the SPI flash device, you can access
> > +the SPI flash content from Linux, using the `MTD utils`_::
> > +
> > +    # apt-get install mtd-utils
> > +    # mtdinfo
> > +    # mtd_debug erase /dev/mtdX 0 0xf0000
> > +    # mtd_debug write /dev/mtdX 0 0xf0000 u-boot-sunxi-with-spl.bin
> > +
> > +``/dev/mtdX`` needs to be replaced with the respective device name, as   
> listed
> > +in the output of ``mtdinfo``.
> > +
> > +Installing on SPI flash from U-Boot
> > +```````````````````````````````````
> > +If SPI flash driver and command support (``CONFIG_CMD_SF``) is enabled in   
> the
> > +U-Boot configuration, the image file can be installed via U-Boot as well::
> > +
> > +    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
> > +    => sf probe
> > +    => sf erase 0 +0xf0000
> > +    => sf write $kernel_addr_r 0 $filesize
> > +
> > +Installing on SPI flash via USB in FEL mode
> > +```````````````````````````````````````````
> > +If the device is in FEL mode (see below), the SPI flash can also be filled
> > +with the sunxi-fel utility, via an USB(-OTG) cable from any USB host   
> machine::
> > +
> > +    $ sunxi-fel -v -p spiflash-write 0 u-boot-sunxi-with-spl.bin
> > +
> > +Booting via the USB(-OTG) FEL mode
> > +----------------------------------
> > +If none of the boot locations checked by the BROM contain a medium or valid
> > +signature, the BROM will enter the so-called FEL mode, in which it will
> > +listen to commands from a host on the SoC's USB-OTG interface. Those   
> commands
> > +allow to read from and write to arbitrary memory locations, also to start
> > +execution at any address, which allows to bootstrap a board solely via an
> > +USB cable. Some boards feature a "FEL" or "U-Boot" button, which forces
> > +FEL mode despite a valid boot location being present. The same can be   
> achieved
> > +via a `magic binary`_ on an SD card, which allows to enter FEL mode on any
> > +board.
> > +
> > +To use FEL booting, let the board enter FEL mode, via any of the mentioned
> > +methods (no boot media, FEL button, SD card with FEL binary), then connect
> > +a USB cable to the board's USB OTG port. Some boards (Pine64, TV boxes)   
> don't
> > +have a separate OTG port. In this case mostly one of the USB-A ports is
> > +connected to USB0, and can be used via a non-standard USB-A to USB-A cable.
> > +
> > +Typically there is no on-board indication of FEL mode, other than a new USB
> > +device appearing on the connected host computer. The USB vendor/device ID
> > +is 1f3a:efe8. Mostly this will identify as "sunxi SoC OTG connector in
> > +FEL/flashing mode", but older distributions might still report "Onda
> > +(unverified) V972 tablet in flashing mode".
> > +
> > +The `sunxi_fel`_ tool implements the proprietary BROM protocol, and allows   
> to
> > +bootstrap U-Boot by just providing our venerable u-boot-sunxi-with-  
> spl.bin::
> > +
> > +    $ sudo apt-get install sunxi-tools
> > +    $ sunxi-fel -v -p uboot u-boot-sunxi-with-spl.bin
> > +
> > +Additional binaries like a kernel, an initial ramdisk or a boot script, can
> > +also be uploaded via FEL, check the Wiki's `FEL page`_ for more details.
> > +
> > +.. _`Arm Trusted Firmware-A`:  https://www.trustedfirmware.org/projects/tf-a/
> > +.. _`docs/plat/allwinner.rst`: https://trustedfirmware-a.readthedocs.io/en/  
> latest/plat/allwinner.html
> > +.. _`crust`: https://github.com/crust-firmware/crust
> > +.. _`configs/`: https://github.com/crust-firmware/crust/tree/master/configs
> > +.. _`linux-sunxi`: https://linux-sunxi.org
> > +.. _`MTD utils`: http://www.linux-mtd.infradead.org/
> > +.. _`magic binary`: https://github.com/linux-sunxi/sunxi-tools/raw/master/  
> bin/fel-sdboot.sunxi
> > +.. _`sunxi_fel`: https://github.com/linux-sunxi/sunxi-tools
> > +.. _`FEL page`: https://linux-sunxi.org/FEL/USBBoot
> > -- 
> > 2.17.6
> > 
> >   
> 
> 
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Re: [PATCH] sunxi: add board documentation
  2021-12-14  1:07   ` Andre Przywara
@ 2021-12-14 17:17     ` Jernej Škrabec
  0 siblings, 0 replies; 7+ messages in thread
From: Jernej Škrabec @ 2021-12-14 17:17 UTC (permalink / raw)
  To: Andre Przywara
  Cc: Jagan Teki, Simon Glass, Tom Rini, u-boot, Samuel Holland,
	Chen-Yu Tsai, Maxime Ripard, Icenowy Zheng, linux-sunxi

Dne torek, 14. december 2021 ob 02:07:58 CET je Andre Przywara napisal(a):
> On Mon, 13 Dec 2021 18:20:37 +0100
> Jernej Škrabec <jernej.skrabec@gmail.com> wrote:
> 
> Hi Jernej,
> 
> thanks for having a look!
> 
> > Dne ponedeljek, 13. december 2021 ob 02:03:22 CET je Andre Przywara 
> > napisal(a):
> > > Add some long overdue instructions for building and installing U-Boot on
> > > Allwinner SoC based boards.
> > > This describes the building process, including TF-A and crust, plus
> > > installation to SD card, eMMC and SPI flash, both from Linux and U-Boot
> > > itself. Also describe FEL booting.
> > > 
> > > Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> > > ---
> > > Hi,
> > > 
> > > please have a look whether this makes sense. Feel free to just try   
> > something,
> > > and point out ambiguities or missing bits. For missing topics, please
> > > send a follow-up patch ;-)  
> > 
> > This documentation seems to include all of board/sunxi/README.sunxi64 and 
> > README.nand. I think it would make sense to remove those files. If any file 
gets 
> > out of sync for any reason, it would be very confusing for end user.
> 
> Indeed, I think README.sunxi64 is redundant now.
> I didn't look at README.nand too closely, but since I don't even mention
> NAND, I don't think it can be removed just yet. I guess I just convert
> it to RST and move it into this directory.
> 
> > I would also remove all non-essential command parameters, so all commands 
are 
> > as simple as possible. Power users will know about them anyway and non-
skilled 
> > users might perceive that it's harder that it really is. I have in mind "-
j5 -
> > s" for make, "-v -p" for sunxi-fel
> 
> I see, makes sense.
> 
> > and DEBUG=1 for TF-A (maybe I missed some 
> > places). Actually, DEBUG=1 could be mentioned afterwards as 
troubleshooting 
> > step. In my experience, stable version of TF-A was never source of boot 
issues 
> > nor it provided any useful information for debugging anything else.
> 
> Well, I'd tend to keep DEBUG=1 enabled, this lists the regulators
> enabled, which helps debugging. Also in the past DEBUG=0 was very
> silent, which wasn't helpful to verify that TF-A actually started.

I patched out enabling regulators in TF-A, we already discussed this in the 
past.

> 
> Do you typically build or recommend DEBUG=0?


I set DEBUG=1 only when I actually want to debug this part of boot process, 
which is very rarely. I don't remember that I would help anyone with building 
TF-A, so I don't make recommendations in either direction. For LibreELEC, we 
build it with DEBUG=0, unless debug build of ATF package was requested. Again, 
basically never. Release images are build with DEBUG=0. Note that based on my 
experience, many LibreELEC users don't actually own serial adapter, so it 
doesn't really matter what U-Boot and TF-A print out. Fortunatelly, boot 
issues in LE are very rare these days (I don't remember last time someone 
reported it).

Best regards,
Jernej

> 
> > Some comments bellow.
> > 
> > > 
> > > Also this is quite long, shall this be split up in two (or more) files?
> > > 
> > > This is what rst.ninjs.org made of it, if you prefer to read it 
formatted:
> > > https://paste.c-net.org/PleasantNeedy
> > > 
> > > Cheers,
> > > Andre
> > > 
> > >  doc/board/allwinner/index.rst |   9 +
> > >  doc/board/allwinner/sunxi.rst | 304 ++++++++++++++++++++++++++++++++++
> > >  2 files changed, 313 insertions(+)
> > >  create mode 100644 doc/board/allwinner/index.rst
> > >  create mode 100644 doc/board/allwinner/sunxi.rst
> > > 
> > > diff --git a/doc/board/allwinner/index.rst b/doc/board/allwinner/
index.rst
> > > new file mode 100644
> > > index 00000000000..7352ccd5c0a
> > > --- /dev/null
> > > +++ b/doc/board/allwinner/index.rst
> > > @@ -0,0 +1,9 @@
> > > +.. SPDX-License-Identifier: GPL-2.0+
> > > +
> > > +Allwinner (sunxi) boards
> > > +========================
> > > +
> > > +.. toctree::
> > > +   :maxdepth: 2
> > > +
> > > +   sunxi
> > > diff --git a/doc/board/allwinner/sunxi.rst b/doc/board/allwinner/
sunxi.rst
> > > new file mode 100644
> > > index 00000000000..693eb32e168
> > > --- /dev/null
> > > +++ b/doc/board/allwinner/sunxi.rst
> > > @@ -0,0 +1,304 @@
> > > +.. SPDX-License-Identifier: GPL-2.0+
> > > +.. Copyright (C) 2021 Arm Ltd.
> > > +
> > > +Allwinner SoC based boards
> > > +==========================
> > > +For boards using an Allwinner ARM based SoC ("sunxi"), the U-Boot build
> > > +system generates a single integrated image file: ``u-boot-sunxi-with-  
> > spl.bin.``
> > > +This file can be used on SD cards, eMMC devices, SPI flash and for the
> > > +USB-OTG based boot method (FEL). To build this file:
> > > +
> > > +* For 64-bit SoCs, build Trusted Firmware (TF-A, formerly known as ATF)   
> > first,
> > > +  you will need its ``bl31.bin``. See below for more details.
> > > +* Optionally on 64-bit SoCs, build the crust management processor 
firmware.
> > > +* Build U-Boot::
> > > +
> > > +  $ export BL31=/path/to/bl31.bin		# required for 
64-bit SoCs
> > > +  $ export SCP=/src/crust/build/scp/scp.bin	# optional for some 64-
bit  
> >  SoCs
> > 
> > NIT: I guess path for SCP could be in same form, at least first part?
> 
> Yeah, makes sense.
> 
> > > +  $ make <yourboardname>_defconfig
> > > +  $ make -j5 -s
> > > +* Transfer to an uSD card (see below for more details)::
> > > +
> > > +  $ dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=8k seek=1  
> > 
> > Most, if not all, distros require root for above command, so $ -> #? I see 
> > that you used # below. Alternative would be to prepend command with sudo, 
> > which is imo more beginners friendly.
> 
> Ah, good catch!
> 
> > > +* Boot and enjoy!
> > > +
> > > +For more details, and alternative boot locations or installations, see   
> > below.
> > > +
> > > +Building Arm Trusted Firmware (TF-A)
> > > +------------------------------------
> > > +Boards using a 64-bit Soc (A64, H5, H6, H616, R329) require the BL31 
stage   
> > of
> > > +the `Arm Trusted Firmware-A`_ firmware. This provides the reference
> > > +implementation of secure software for Armv8-A, offering PSCI and SMCCC
> > > +services. Allwinner support is fully mainlined. To build bl31.bin::
> > > +
> > > +  $ git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
> > > +  $ cd trusted-firmware-a
> > > +  $ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_a64 DEBUG=1
> > > +  $ export BL31=$(pwd)/build/sun50i_a64/debug/bl31.bin
> > > +
> > > +The target platform (``PLAT=``) for A64 and H5 SoCs is sun50i_a64, for 
the   
> > H6
> > > +sun50i_h6, for the H616 sun50i_h616, and for the R329 sun50i_r329. 
Use::
> > > +
> > > +  $ find plat/allwinner -name platform.mk
> > > +
> > > +to find all supported platforms. `docs/plat/allwinner.rst`_ contains 
more
> > > +information and lists some build options.
> > > +
> > > +Building the Crust management processor firmware
> > > +------------------------------------------------
> > > +For some SoCs and boards, the integrated OpenRISC management controller 
can
> > > +be used to provide power management services, foremost suspend to RAM.
> > > +There is a community supported Open Source implementation called 
`crust`_,
> > > +which runs on most SoCs featuring a management controller.
> > > +
> > > +This firmware part is optional, setting the SCP environment variable to
> > > +/dev/null avoids the warning message when building without one.
> > > +
> > > +To build crust's scp.bin, you need an OpenRISC (or1k) cross compiler,   
> > then::
> > > +
> > > +  $ git clone https://github.com/crust-firmware/crust.git
> > > +  $ cd crust
> > > +  $ make <yourboard>_defconfig
> > > +  $ make CROSS_COMPILE=or1k-none-elf- scp  
> > 
> > I guess it would be good to point out that compiler prefix may not be the 
same 
> > on all distros. For example, Arch packages this compiler and proper prefix 
> > there is or1k-elf- which also works just fine.
> 
> I feel I shouldn't spend too much time on this, instead just point to
> crust's README.
> 
> Thanks,
> Andre
> 
> > 
> > Best regards,
> > Jernej
> > 
> > > +  $ export SCP=$(pwd)/build/scp/scp.bin
> > > +
> > > +Find a list of supported board configurations in the `configs/`_ 
directory.
> > > +
> > > +Building the U-Boot image
> > > +-------------------------
> > > +Find the U-Boot defconfig file for your board first. Those files live in
> > > +the ``configs/`` directory; you can grep for the stub name of the 
devicetree
> > > +file, if you know that, or for the SoC name to find the right version::
> > > +
> > > +    $ git grep -l MACH_SUN8I_H3 configs
> > > +    $ git grep -l sun50i-h6-orangepi-3 configs
> > > +
> > > +The `linux-sunxi`_ wiki also lists the name of the defconfig file in the
> > > +respective board page. Then use this defconfig file to create the .config
> > > +file, and build the image::
> > > +
> > > +    $ make <yourboard>_defconfig
> > > +    $ make -j5
> > > +
> > > +For 64-bit boards, this requires either the BL31 environment variable 
to be
> > > +set (as shown above in the TF-A build example), or it to be supplied on 
the
> > > +build command line::
> > > +
> > > +    $ make BL31=/src/tf-a.git/build/sun50i_h616/debug/bl31.bin -j5 -s
> > > +
> > > +The same applies to the (optional) SCP firmware.
> > > +
> > > +The file containing everything you need is called ``u-boot-sunxi-with-  
> > spl.bin``,
> > > +you will find it in the root folder of your U-Boot (build) tree. Except 
for
> > > +raw NAND flash devices this very same file can be used for any boot 
source.
> > > +It will contain the SPL image, fitted with the proper signature 
recognised   
> > by
> > > +the BROM, and the required checksum. Also it will contain at least U-
Boot
> > > +proper, either wrapped in the legacy U-Boot image format, or in a FIT   
> > image.
> > > +The board's devicetree is also included, either appended to the U-Boot   
> > proper
> > > +image, or contained in the FIT image. If required by the SoC, this FIT 
file   
> > will
> > > +also include the other firmware images.
> > > +
> > > +Installing U-Boot
> > > +-----------------
> > > +
> > > +Installing on a (micro-) SD card
> > > +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > > +All Allwinner SoCs will try to find a boot image at sector 16 (8KB) of
> > > +an SD card, connected to the first MMC controller. To transfer the 
generated
> > > +image to an SD card, from any Linux device (including the board itself)   
> > with
> > > +an (micro-)SD card reader, type::
> > > +
> > > +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8
> > > +
> > > +``/dev/sdx`` needs to be replaced with the block device name of the SD 
card
> > > +reader. On some machines this could be ``/dev/mmcblkX``.
> > > +Newer SoCs (starting from H3), also look at sector 256 (128KB) for the
> > > +signature (after having checked the 8KB location). Installing the 
firmware
> > > +there has the advantage of not overlapping with a GPT partition table.   
> > Simply
> > > +replace the "``seek=8``" above with "``seek=128``".
> > > +
> > > +You can also use an existing (mainline) U-Boot to write to the SD card.   
> > Load
> > > +the generated U-Boot image somewhere into DRAM (via ``ext4load``,   
> > ``fatload``,
> > > +or ``tftpboot``), then write to MMC device 0::
> > > +
> > > +    => fatload mmc 0:1 $kernel_addr_r u-boot-sunxi-with-spl.bin
> > > +    => mmc dev 0
> > > +    => mmc write $kernel_addr_r 0x10 0x7f0
> > > +
> > > +To use the alternative boot location on newer SoCs::
> > > +
> > > +    => mmc write $kernel_addr_r 0x100 0x700
> > > +
> > > +Installing on eMMC (on-board flash memory)
> > > +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > > +Some boards have a soldered eMMC chip, some other boards have an eMMC   
> > socket
> > > +to receive an optional eMMC module. U-Boot can be installed to those 
chips,
> > > +to boot without an SD card inserted. The Boot-ROM can boot either from 
the
> > > +regular user data partition, or from one of the separate eMMC boot   
> > partitions.
> > > +U-Boot can be installed either from a running Linux instance on the 
device,
> > > +from a running (mainline) U-Boot, or via an adapter for the (removable)
> > > +eMMC module.
> > > +
> > > +Installing on an eMMC user data partition from Linux
> > > +````````````````````````````````````````````````````
> > > +If you have a running Linux instance on the device, and have somehow 
copied
> > > +over the image file to that device, you can write the image directly 
into   
> > the
> > > +eMMC device from there.
> > > +Find the name of the block device file first, it is one of the
> > > +``/dev/mmcblk<X>`` devices. eMMC devices typically also list a
> > > +``/dev/mmcblk<X>boot0`` partition (see below), this helps you to tell 
it   
> > apart
> > > +from the SD card device.
> > > +To install onto the user data partition::
> > > +
> > > +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/dev/mmcblkX bs=1k seek=8
> > > +
> > > +Similar to SD cards, the BROM in newer SoCs (H3 and above) also checks
> > > +sector 256 of an eMMC, so you can use "``seek=128``" as well.
> > > +
> > > +Installing on an eMMC boot partition from Linux
> > > +```````````````````````````````````````````````
> > > +In the following examples, ``/dev/mmcblkX`` needs to be replaced with 
the   
> > block
> > > +device name of the eMMC device. The eMMC device can be recognised by 
also
> > > +listing the boot partitions (``/dev/mmcblkXboot0``) in ``/proc/  
> > partitions``.
> > > +
> > > +To allow booting from one of the eMMC boot partitions, this one needs 
to be
> > > +enabled first. This only needs to be done once, as this setting is
> > > +persistent, even though the boot partition can be disabled or changed 
again
> > > +any time later::
> > > +
> > > +    # apt-get install mmc-utils
> > > +    # mmc bootbus set single_hs x1 x4 /dev/mmcblkX
> > > +    # mmc bootpart enable 1 1 /dev/mmcblkX
> > > +
> > > +The first "1" in the last command points to the boot partition number to 
be
> > > +used, typically devices offer two boot partitions.
> > > +
> > > +By default Linux disables write access to the boot partitions, to 
prevent
> > > +accidental overwrites. You need to disable the write protection (until 
the
> > > +next reboot), then can write the U-Boot image to the *first* sector of 
the
> > > +selected boot partition::
> > > +
> > > +    # echo 0 > /sys/block/mmcblkXboot0/force_ro
> > > +    # dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblkXboot0 bs=1k
> > > +
> > > +Installing on an eMMC user data partition from U-Boot
> > > +`````````````````````````````````````````````````````
> > > +You can also write the generated image file to an SD card, boot the 
device
> > > +from there, and burn the very same image to the eMMC device from U-
Boot.
> > > +The following commands copy the image from the SD card to the eMMC 
device::
> > > +
> > > +    => mmc dev 0
> > > +    => mmc read $kernel_addr_r 0x10 0x7f0
> > > +    => mmc dev 1
> > > +    => mmc write $kernel_addr_r 0x10 0x7f0
> > > +
> > > +You can also copy an image from the 8K offset of an SD card to the 128K
> > > +offset of the eMMC (or any combination), just change the "``0x10 
0x7f0``"   
> > above
> > > +to "``0x100 0x700``", respectively. Of course the image file can be 
loaded   
> > via
> > > +any other loading method, including ``fatload``, ``ext4load``,   
> > ``tftpboot``.
> > > +
> > > +Installing on an eMMC boot partition from U-Boot
> > > +````````````````````````````````````````````````
> > > +The selected eMMC boot partition needs to be initially enabled first 
(same
> > > +as in Linux above), you can do this from U-Boot with::
> > > +
> > > +    => mmc dev 1
> > > +    => mmc bootbus 1 1 0 0
> > > +    => mmc partconf 1 1 1 1
> > > +
> > > +The first "1" in both commands denotes the MMC device number. The second 
"1"
> > > +in the partconf command sets the required ``BOOT_ACK`` option, the last 
two   
> > "1"s
> > > +selects the active boot partition and the target for the next data 
access,
> > > +respectively. So for the next "``mmc write``" command to address one of 
the   
> > boot
> > > +partitions, the last number must either be "1" or "2", "0" would switch   
> > (back)
> > > +to the normal user data partition.
> > > +
> > > +Then load the ``u-boot-sunxi-with-spl.bin`` image file into DRAM, either 
by
> > > +reading directly from an SD card or eMMC user data partition, or from a
> > > +file system or TFTP (see above), and transfer it to the boot partition::
> > > +
> > > +    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
> > > +    => mmc write $kernel_addr_r 0 0x7f0
> > > +
> > > +After that the device should boot from the selected boot partition, 
which   
> > takes
> > > +precedence over booting from the user data partition.
> > > +
> > > +Installing on SPI flash
> > > +^^^^^^^^^^^^^^^^^^^^^^^
> > > +Some devices have a SPI NOR flash chip soldered on the board. If it is
> > > +connected to the SPI0 pins on PortC, the BROM can also boot from there.
> > > +Typically the SPI flash has the lowest boot priority, so SD card and 
eMMC
> > > +devices will be considered first.
> > > +
> > > +Installing on SPI flash from Linux
> > > +``````````````````````````````````
> > > +If the devicetree enables and describes the SPI flash device, you can 
access
> > > +the SPI flash content from Linux, using the `MTD utils`_::
> > > +
> > > +    # apt-get install mtd-utils
> > > +    # mtdinfo
> > > +    # mtd_debug erase /dev/mtdX 0 0xf0000
> > > +    # mtd_debug write /dev/mtdX 0 0xf0000 u-boot-sunxi-with-spl.bin
> > > +
> > > +``/dev/mtdX`` needs to be replaced with the respective device name, as   
> > listed
> > > +in the output of ``mtdinfo``.
> > > +
> > > +Installing on SPI flash from U-Boot
> > > +```````````````````````````````````
> > > +If SPI flash driver and command support (``CONFIG_CMD_SF``) is enabled 
in   
> > the
> > > +U-Boot configuration, the image file can be installed via U-Boot as 
well::
> > > +
> > > +    => tftpboot $kernel_addr_r u-boot-sunxi-with-spl.bin
> > > +    => sf probe
> > > +    => sf erase 0 +0xf0000
> > > +    => sf write $kernel_addr_r 0 $filesize
> > > +
> > > +Installing on SPI flash via USB in FEL mode
> > > +```````````````````````````````````````````
> > > +If the device is in FEL mode (see below), the SPI flash can also be 
filled
> > > +with the sunxi-fel utility, via an USB(-OTG) cable from any USB host   
> > machine::
> > > +
> > > +    $ sunxi-fel -v -p spiflash-write 0 u-boot-sunxi-with-spl.bin
> > > +
> > > +Booting via the USB(-OTG) FEL mode
> > > +----------------------------------
> > > +If none of the boot locations checked by the BROM contain a medium or 
valid
> > > +signature, the BROM will enter the so-called FEL mode, in which it will
> > > +listen to commands from a host on the SoC's USB-OTG interface. Those   
> > commands
> > > +allow to read from and write to arbitrary memory locations, also to 
start
> > > +execution at any address, which allows to bootstrap a board solely via 
an
> > > +USB cable. Some boards feature a "FEL" or "U-Boot" button, which forces
> > > +FEL mode despite a valid boot location being present. The same can be   
> > achieved
> > > +via a `magic binary`_ on an SD card, which allows to enter FEL mode on 
any
> > > +board.
> > > +
> > > +To use FEL booting, let the board enter FEL mode, via any of the 
mentioned
> > > +methods (no boot media, FEL button, SD card with FEL binary), then 
connect
> > > +a USB cable to the board's USB OTG port. Some boards (Pine64, TV boxes)   
> > don't
> > > +have a separate OTG port. In this case mostly one of the USB-A ports is
> > > +connected to USB0, and can be used via a non-standard USB-A to USB-A 
cable.
> > > +
> > > +Typically there is no on-board indication of FEL mode, other than a new 
USB
> > > +device appearing on the connected host computer. The USB vendor/device 
ID
> > > +is 1f3a:efe8. Mostly this will identify as "sunxi SoC OTG connector in
> > > +FEL/flashing mode", but older distributions might still report "Onda
> > > +(unverified) V972 tablet in flashing mode".
> > > +
> > > +The `sunxi_fel`_ tool implements the proprietary BROM protocol, and 
allows   
> > to
> > > +bootstrap U-Boot by just providing our venerable u-boot-sunxi-with-  
> > spl.bin::
> > > +
> > > +    $ sudo apt-get install sunxi-tools
> > > +    $ sunxi-fel -v -p uboot u-boot-sunxi-with-spl.bin
> > > +
> > > +Additional binaries like a kernel, an initial ramdisk or a boot script, 
can
> > > +also be uploaded via FEL, check the Wiki's `FEL page`_ for more 
details.
> > > +
> > > +.. _`Arm Trusted Firmware-A`:  https://www.trustedfirmware.org/projects/
tf-a/
> > > +.. _`docs/plat/allwinner.rst`: https://trustedfirmware-a.readthedocs.io/
en/  
> > latest/plat/allwinner.html
> > > +.. _`crust`: https://github.com/crust-firmware/crust
> > > +.. _`configs/`: https://github.com/crust-firmware/crust/tree/master/
configs
> > > +.. _`linux-sunxi`: https://linux-sunxi.org
> > > +.. _`MTD utils`: http://www.linux-mtd.infradead.org/
> > > +.. _`magic binary`: https://github.com/linux-sunxi/sunxi-tools/raw/
master/  
> > bin/fel-sdboot.sunxi
> > > +.. _`sunxi_fel`: https://github.com/linux-sunxi/sunxi-tools
> > > +.. _`FEL page`: https://linux-sunxi.org/FEL/USBBoot
> > > -- 
> > > 2.17.6
> > > 
> > >   
> > 
> > 
> > 
> 
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] sunxi: add board documentation
  2021-12-13  1:03 [PATCH] sunxi: add board documentation Andre Przywara
  2021-12-13 17:20 ` Jernej Škrabec
@ 2021-12-17 16:37 ` Simon Glass
  2021-12-20 17:01   ` Andre Przywara
  1 sibling, 1 reply; 7+ messages in thread
From: Simon Glass @ 2021-12-17 16:37 UTC (permalink / raw)
  To: Andre Przywara
  Cc: Jagan Teki, Tom Rini, u-boot, Samuel Holland, Jernej Skrabec,
	Chen-Yu Tsai, Maxime Ripard, Icenowy Zheng, linux-sunxi

Hi Andre,

On Sun, 12 Dec 2021 at 18:03, Andre Przywara <andre.przywara@arm.com> wrote:
>
> Add some long overdue instructions for building and installing U-Boot on
> Allwinner SoC based boards.
> This describes the building process, including TF-A and crust, plus
> installation to SD card, eMMC and SPI flash, both from Linux and U-Boot
> itself. Also describe FEL booting.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> ---
> Hi,
>
> please have a look whether this makes sense. Feel free to just try something,
> and point out ambiguities or missing bits. For missing topics, please
> send a follow-up patch ;-)
>
> Also this is quite long, shall this be split up in two (or more) files?
>
> This is what rst.ninjs.org made of it, if you prefer to read it formatted:
> https://paste.c-net.org/PleasantNeedy
>
> Cheers,
> Andre
>
>  doc/board/allwinner/index.rst |   9 +
>  doc/board/allwinner/sunxi.rst | 304 ++++++++++++++++++++++++++++++++++
>  2 files changed, 313 insertions(+)
>  create mode 100644 doc/board/allwinner/index.rst
>  create mode 100644 doc/board/allwinner/sunxi.rst

Reviewed-by: Simon Glass <sjg@chromium.org>

I agree that a follow-on patch to remove the duplicated files would be
helpful, but this patch is a big step forward on its own.

It would be interesting to convert sunxi to use binman.

Regards,
Simon

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] sunxi: add board documentation
  2021-12-17 16:37 ` Simon Glass
@ 2021-12-20 17:01   ` Andre Przywara
  2021-12-28  8:32     ` Simon Glass
  0 siblings, 1 reply; 7+ messages in thread
From: Andre Przywara @ 2021-12-20 17:01 UTC (permalink / raw)
  To: Simon Glass
  Cc: Jagan Teki, Tom Rini, u-boot, Samuel Holland, Jernej Skrabec,
	Chen-Yu Tsai, Maxime Ripard, Icenowy Zheng, linux-sunxi

On Fri, 17 Dec 2021 09:37:08 -0700
Simon Glass <sjg@chromium.org> wrote:

Hi Simon,

> On Sun, 12 Dec 2021 at 18:03, Andre Przywara <andre.przywara@arm.com> wrote:
> >
> > Add some long overdue instructions for building and installing U-Boot on
> > Allwinner SoC based boards.
> > This describes the building process, including TF-A and crust, plus
> > installation to SD card, eMMC and SPI flash, both from Linux and U-Boot
> > itself. Also describe FEL booting.
> >
> > Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> > ---
> > Hi,
> >
> > please have a look whether this makes sense. Feel free to just try something,
> > and point out ambiguities or missing bits. For missing topics, please
> > send a follow-up patch ;-)
> >
> > Also this is quite long, shall this be split up in two (or more) files?
> >
> > This is what rst.ninjs.org made of it, if you prefer to read it formatted:
> > https://paste.c-net.org/PleasantNeedy
> >
> > Cheers,
> > Andre
> >
> >  doc/board/allwinner/index.rst |   9 +
> >  doc/board/allwinner/sunxi.rst | 304 ++++++++++++++++++++++++++++++++++
> >  2 files changed, 313 insertions(+)
> >  create mode 100644 doc/board/allwinner/index.rst
> >  create mode 100644 doc/board/allwinner/sunxi.rst  
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>
> 
> I agree that a follow-on patch to remove the duplicated files would be
> helpful, but this patch is a big step forward on its own.

Thanks! I will address the other comments ASAP.

> It would be interesting to convert sunxi to use binman.

But Samuel fixed that already, didn't he? Or is there anything left that
binman should do? We even now use mkimage to generate the magic BROM
SPL signature, and then let binman combine this with the FIT image into the
final binary. Or am I missing something here?

Or are you asking for patches that remove sunxi as the bad example from
the existing documentation? ;-)

Cheers,
Andre

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] sunxi: add board documentation
  2021-12-20 17:01   ` Andre Przywara
@ 2021-12-28  8:32     ` Simon Glass
  0 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2021-12-28  8:32 UTC (permalink / raw)
  To: Andre Przywara
  Cc: Jagan Teki, Tom Rini, U-Boot Mailing List, Samuel Holland,
	Jernej Skrabec, Chen-Yu Tsai, Maxime Ripard, Icenowy Zheng,
	linux-sunxi

Hi Andre,

On Mon, 20 Dec 2021 at 10:01, Andre Przywara <andre.przywara@arm.com> wrote:
>
> On Fri, 17 Dec 2021 09:37:08 -0700
> Simon Glass <sjg@chromium.org> wrote:
>
> Hi Simon,
>
> > On Sun, 12 Dec 2021 at 18:03, Andre Przywara <andre.przywara@arm.com> wrote:
> > >
> > > Add some long overdue instructions for building and installing U-Boot on
> > > Allwinner SoC based boards.
> > > This describes the building process, including TF-A and crust, plus
> > > installation to SD card, eMMC and SPI flash, both from Linux and U-Boot
> > > itself. Also describe FEL booting.
> > >
> > > Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> > > ---
> > > Hi,
> > >
> > > please have a look whether this makes sense. Feel free to just try something,
> > > and point out ambiguities or missing bits. For missing topics, please
> > > send a follow-up patch ;-)
> > >
> > > Also this is quite long, shall this be split up in two (or more) files?
> > >
> > > This is what rst.ninjs.org made of it, if you prefer to read it formatted:
> > > https://paste.c-net.org/PleasantNeedy
> > >
> > > Cheers,
> > > Andre
> > >
> > >  doc/board/allwinner/index.rst |   9 +
> > >  doc/board/allwinner/sunxi.rst | 304 ++++++++++++++++++++++++++++++++++
> > >  2 files changed, 313 insertions(+)
> > >  create mode 100644 doc/board/allwinner/index.rst
> > >  create mode 100644 doc/board/allwinner/sunxi.rst
> >
> > Reviewed-by: Simon Glass <sjg@chromium.org>
> >
> > I agree that a follow-on patch to remove the duplicated files would be
> > helpful, but this patch is a big step forward on its own.
>
> Thanks! I will address the other comments ASAP.
>
> > It would be interesting to convert sunxi to use binman.
>
> But Samuel fixed that already, didn't he? Or is there anything left that
> binman should do? We even now use mkimage to generate the magic BROM
> SPL signature, and then let binman combine this with the FIT image into the
> final binary. Or am I missing something here?

Yes I think you are right. I was thinking of creating the image so
that you could just dd it straight to the device without skipping
stuff. But now I remember that we need to skip the partition table...

>
> Or are you asking for patches that remove sunxi as the bad example from
> the existing documentation? ;-)

Regards,
Simon

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-12-28  8:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-13  1:03 [PATCH] sunxi: add board documentation Andre Przywara
2021-12-13 17:20 ` Jernej Škrabec
2021-12-14  1:07   ` Andre Przywara
2021-12-14 17:17     ` Jernej Škrabec
2021-12-17 16:37 ` Simon Glass
2021-12-20 17:01   ` Andre Przywara
2021-12-28  8:32     ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.