docs: Update unleashed platform guide.

Following updates to fu540 platform guide.

1. Update a section about flashing the firmware binary
to sdcard with correct partition identifier.
2. Refer the individual payload section.
3. Update uboot booting section.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
Atish Patra 2019-02-18 23:18:04 -08:00 committed by Anup Patel
parent 0db43770b3
commit d046974cf6

View file

@ -13,59 +13,47 @@ Platform Options
As hart0 in the FU540 doesn't have an MMU, only harts 1-4 boot by default.
A hart mask i.e. *FU540_ENABLED_HART_MASK* compile time option is provided to
select any other hart for booting. Please keep in mind that this is not
platform wide option. It can only be specificd for FU540 platform in following way.
platform wide option. It can only be specified for FU540 platform in following way.
```
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=Image FU540_ENABLED_HART_MASK=0x02
```
This will let the board boot only hart1 instead of default 1-4.
Booting SiFive Fu540 Platform
Building SiFive Fu540 Platform
-----------------------------
As of this writing, the required Linux kernel and U-Boot patches are not
accepted in mainline. Please follow the below instructions to cherry-pick
them into your repository.
[U-Boot patches](../firmware/payload_uboot.md)
[Linux kernel patches](../firmware/payload_linux.md)
**Linux Kernel Payload**
Build:
```
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=<linux_build_directory>/arch/riscv/boot/Image
```
Flash:
The generated firmware binary should be copied to the first partition of the sdcard.
```
dd if=build/platform/sifive/fu540/firmware/fw_payload.bin of=/dev/disk2s1 bs=1024
```
**U-Boot Payload**
Note: U-Boot doesn't have SMP support. So you can only boot single cpu with non-smp
kernel configuration using U-Boot.
Build:
The command-line example here assumes that U-Boot was compiled using sifive_fu540_defconfig configuration.
The commandline example here assumes that U-Boot was compiled using sifive_fu540_defconfig configuration.
With SMP support enabled in U-Boot:
```
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=<u-boot_build_dir>/u-boot.bin
```
Without SMP support enabled in U-Boot:
```
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=<u-boot_build_dir>/u-boot.bin FU540_ENABLED_HART_MASK=0x02
```
Flash:
The generated firmware binary should be copied to the first partition of the sdcard.
```
dd if=build/platform/sifive/fu540/firmware/fw_payload.bin of=/dev/disk2s1 bs=1024
```
U-Boot tftp boot method can be used to load kernel image in U-Boot prompt.
Note: As the U-Boot & Linux kernel patches are not in upstream it, you can cherry-pick from here.
U-Boot patchset:
https://lists.denx.de/pipermail/u-boot/2019-January/355941.html
Linux kernel patchset:
https://lkml.org/lkml/2019/1/8/192
**U-Boot & Linux Kernel as a single payload**
A single monolithic image containing both U-Boot & Linux can also be used if network boot setup is
@ -78,8 +66,9 @@ mkimage -A riscv -O linux -T kernel -C none -a 0x80200000 -e 0x80200000 -n Linux
<linux_build_directory>/arch/riscv/boot/uImage
```
2. Create a temporary image with u-boot.bin as the first payload. The commandline example here assumes
that U-Boot was compiled using sifive_fu540_defconfig configuration.
2. Create a temporary image with u-boot.bin as the first payload. The command-line
example here assumes that U-Boot was compiled using sifive_fu540_defconfig
configuration.
```
dd if=~/workspace/u-boot-riscv/u-boot.bin of=/tmp/temp.bin bs=1M
```
@ -87,20 +76,112 @@ dd if=~/workspace/u-boot-riscv/u-boot.bin of=/tmp/temp.bin bs=1M
```
dd if=<linux_build_directory>/arch/riscv/boot/uImage of=/tmp/temp.bin bs=1M seek=4
```
4. Compile OpenSBI with temp.bin (generated in step 3) as payload and single hart enabled.
4. Compile OpenSBI with temp.bin (generated in step 3) as payload.
```
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=/tmp/temp.bin FU540_ENABLED_HART_MASK=0x02
make PLATFORM=sifive/fu540 FW_PAYLOAD_PATH=/tmp/temp.bin
```
5. The generated firmware binary should be copied to the first partition of the sdcard.
Flashing the OpenSBI firmware binary to storage media:
-----------------------------------------------------
The first stage boot loader([FSBL](https://github.com/sifive/freedom-u540-c000-bootloader))
expects the storage media to have a GPT partition table. It tries to look for a
partition with following GUID to load the next stage boot loader (OpenSBI in this case).
```
2E54B353-1271-4842-806F-E436D6AF6985
```
That's why the generated firmware binary in above steps should be copied to the
partition of the sdcard with above GUID.
```
dd if=build/platform/sifive/fu540/firmware/fw_payload.bin of=/dev/disk2s1 bs=1024
```
6. At U-Boot prompt execute following boot command to boot non-SMP linux.
In my case, it is the first partition is **disk2s1** that has been formatted with the
above specified GUID.
In case of a brand new sdcard, it should be formatted with below partition
tables as described here.
```
bootm 0x80600000 - 0x82200000
sgdisk --clear \
--new=1:2048:67583 --change-name=1:bootloader --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985 \
--new=2:264192: --change-name=2:root --typecode=2:0FC63DAF-8483-4772-8E79-3D69D8477DE4 \
$(DISK)
```
Booting SiFive Fu540 Platform
-----------------------------
**Linux Kernel Payload**
As Linux kernel image is embedded in the OpenSBI firmware binary, HiFive Unleashed will directly
boot into Linux directly after powered on.
**U-Boot Payload**
As U-Boot image is used as payload, HiFive Unleashed will boot into a U-Boot prompt.
U-Boot tftp boot method can be used to load kernel image in U-Boot prompt.
Here are the steps do a tftpboot.
1. Set the mac address of the board.
```
setenv ethaddr <mac address of the board>
```
2. Set the ip address of the board.
```
setenv ipaddr <ipaddr of the board>
```
3. Set the tftpboot server IP.
```
setenv serverip <ipaddr of the tftp server>
```
4. Set the network gateway address.
```
setenv gatewayip <ipaddress of the network gateway>
```
5. Load the Linux kernel image from the tftp server.
```
tftpboot ${kernel_addr_r} /sifive/fu540/uImage
```
6. Load the ramdisk image from the tftp server. This is only required if ramdisk
is loaded from tftp server. This step is optional, if rootfs is already part
of the kernel or loaded from an external storage by kernel.
```
tftpboot ${ramdisk_addr_r} /sifive/fu540/uRamdisk
```
7. Set the boot command-line arguments.
```
setenv bootargs "root=/dev/ram rw console=ttySIF0 earlycon=sbi"
```
8. Now boot into Linux.
```
bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdtcontroladdr}
```
or (if ramdisk is not loaded from network)
```
bootm ${kernel_addr_r} - ${fdtcontroladdr}
```
**U-Boot & Linux Kernel as a single payload**
At U-Boot prompt execute the following boot command to boot Linux.
```
bootm ${kernel_addr_r} - ${fdtcontroladdr}
```
Booting SiFive Fu540 Platform with Microsemi Expansion board
------------------------------------------------------------