1U-Boot for UniPhier SoC family 2============================== 3 4 5Recommended toolchains 6---------------------- 7 8The UniPhier platform is well tested with Linaro toolchains. 9You can download pre-built toolchains from: 10 11 http://www.linaro.org/downloads/ 12 13 14Compile the source 15------------------ 16 17The source can be configured and built with the following commands: 18 19 $ make <defconfig> 20 $ make CROSS_COMPILE=<toolchain-prefix> DEVICE_TREE=<device-tree> 21 22The recommended <toolchain-prefix> is `arm-linux-gnueabihf-` for 32bit SoCs, 23`aarch64-linux-gnu-` for 64bit SoCs, but you may wish to change it to use your 24favorite compiler. 25 26The following tables show <defconfig> and <device-tree> for each board. 27 2832bit SoC boards: 29 30 Board | <defconfig> | <device-tree> 31---------------|-----------------------------|------------------------------ 32LD4 reference | uniphier_ld4_sld8_defconfig | uniphier-ld4-ref (default) 33sld8 reference | uniphier_ld4_sld8_defconfig | uniphier-sld8-def 34Pro4 reference | uniphier_v7_defconfig | uniphier-pro4-ref 35Pro4 Ace | uniphier_v7_defconfig | uniphier-pro4-ace 36Pro4 Sanji | uniphier_v7_defconfig | uniphier-pro4-sanji 37Pro5 4KBOX | uniphier_v7_defconfig | uniphier-pro5-4kbox 38PXs2 Gentil | uniphier_v7_defconfig | uniphier-pxs2-gentil 39PXs2 Vodka | uniphier_v7_defconfig | uniphier-pxs2-vodka (default) 40LD6b reference | uniphier_v7_defconfig | uniphier-ld6b-ref 41 4264bit SoC boards: 43 44 Board | <defconfig> | <device-tree> 45---------------|-----------------------|---------------------------- 46LD11 reference | uniphier_v8_defconfig | uniphier-ld11-ref 47LD11 Global | uniphier_v8_defconfig | uniphier-ld11-global 48LD20 reference | uniphier_v8_defconfig | uniphier-ld20-ref (default) 49LD20 Global | uniphier_v8_defconfig | uniphier-ld20-global 50PXs3 reference | uniphier_v8_defconfig | uniphier-pxs3-ref 51 52For example, to compile the source for PXs2 Vodka board, run the following: 53 54 $ make uniphier_v7_defconfig 55 $ make CROSS_COMPILE=arm-linux-gnueabihf- DEVICE_TREE=uniphier-pxs2-vodka 56 57The device tree marked as (default) can be omitted. `uniphier-pxs2-vodka` is 58the default device tree for the configuration `uniphier_v7_defconfig`, so the 59following gives the same result. 60 61 $ make uniphier_v7_defconfig 62 $ make CROSS_COMPILE=arm-linux-gnueabihf- 63 64 65Booting 32bit SoC boards 66------------------------ 67 68The build command will generate the following: 69- u-boot.bin 70- spl/u-boot.bin 71 72U-Boot can boot UniPhier 32bit SoC boards by itself. Flash the generated images 73to the storage device (NAND or eMMC) on your board. 74 75 - spl/u-boot-spl.bin at the offset address 0x00000000 76 - u-boot.bin at the offset address 0x00020000 77 78The `u-boot-with-spl.bin` is the concatenation of the two (with appropriate 79padding), so you can also do: 80 81 - u-boot-with-spl.bin at the offset address 0x00000000 82 83If a TFTP server is available, the images can be easily updated. 84Just copy the u-boot-spl.bin and u-boot.bin to the TFTP public directory, 85and run the following command at the U-Boot command line: 86 87To update the images in NAND: 88 89 => run nandupdate 90 91To update the images in eMMC: 92 93 => run emmcupdate 94 95 96Booting 64bit SoC boards 97------------------------ 98 99The build command will generate the following: 100- u-boot.bin 101 102However, U-Boot is not the first stage loader for UniPhier 64bit SoC boards. 103U-Boot serves as a non-secure boot loader loaded by [ARM Trusted Firmware], 104so you need to provide the `u-boot.bin` to the build command of ARM Trusted 105Firmware. 106 107[ARM Trusted Firmware]: https://github.com/ARM-software/arm-trusted-firmware 108 109 110Verified Boot 111------------- 112 113U-Boot supports an image verification method called "Verified Boot". 114This is a brief tutorial to utilize this feature for the UniPhier platform. 115You will find details documents in the doc/uImage.FIT directory. 116 117Here, we take LD20 reference board for example, but it should work for any 118other boards including 32 bit SoCs. 119 1201. Generate key to sign with 121 122 $ mkdir keys 123 $ openssl genpkey -algorithm RSA -out keys/dev.key \ 124 -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 125 $ openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt 126 127Two files "dev.key" and "dev.crt" will be created. The base name is arbitrary, 128but need to match to the "key-name-hint" property described below. 129 1302. Describe FIT source 131 132You need to write an FIT (Flattened Image Tree) source file to describe the 133structure of the image container. 134 135The following is an example for a simple usecase: 136 137---------------------------------------->8---------------------------------------- 138/dts-v1/; 139 140/ { 141 description = "Kernel, DTB and Ramdisk for UniPhier LD20 Reference Board"; 142 #address-cells = <1>; 143 144 images { 145 kernel { 146 description = "linux"; 147 data = /incbin/("PATH/TO/YOUR/LINUX/DIR/arch/arm64/boot/Image.gz"); 148 type = "kernel"; 149 arch = "arm64"; 150 os = "linux"; 151 compression = "gzip"; 152 load = <0x82080000>; 153 entry = <0x82080000>; 154 hash-1 { 155 algo = "sha256"; 156 }; 157 }; 158 159 fdt-1 { 160 description = "fdt"; 161 data = /incbin/("PATH/TO/YOUR/LINUX/DIR/arch/arm64/boot/dts/socionext/uniphier-ld20-ref.dtb"); 162 type = "flat_dt"; 163 arch = "arm64"; 164 compression = "none"; 165 hash-1 { 166 algo = "sha256"; 167 }; 168 }; 169 170 ramdisk { 171 description = "ramdisk"; 172 data = /incbin/("PATH/TO/YOUR/ROOTFS/DIR/rootfs.cpio"); 173 type = "ramdisk"; 174 arch = "arm64"; 175 os = "linux"; 176 compression = "none"; 177 hash-1 { 178 algo = "sha256"; 179 }; 180 }; 181 }; 182 183 configurations { 184 default = "config-1"; 185 186 config-1 { 187 description = "Configuration0"; 188 kernel = "kernel"; 189 fdt = "fdt-1"; 190 ramdisk = "ramdisk"; 191 signature-1 { 192 algo = "sha256,rsa2048"; 193 key-name-hint = "dev"; 194 sign-images = "kernel", "fdt", "ramdisk"; 195 }; 196 }; 197 }; 198}; 199---------------------------------------->8---------------------------------------- 200 201You need to change the three '/incbin/' lines, depending on the location of 202your kernel image, device tree blob, and init ramdisk. The "load" and "entry" 203properties also need to be adjusted if you want to change the physical placement 204of the kernel. 205 206The "key-name-hint" must specify the key name you have created in the step 1. 207 208The FIT file name is arbitrary. Let's say you saved it into "fit.its". 209 2103. Compile U-Boot with FIT and signature enabled 211 212To use the Verified Boot, you need to enable the following two options: 213 CONFIG_FIT 214 CONFIG_FIT_SIGNATURE 215 216They are disabled by default for UniPhier defconfig files. So, you need to 217tweak the configuration from "make menuconfig" or friends. 218 219 $ make uniphier_v8_defconfig 220 $ make menuconfig 221 [ enable CONFIG_FIT and CONFIG_FIT_SIGNATURE ] 222 $ make CROSS_COMPILE=aarch64-linux-gnu- 223 2244. Build the image tree blob 225 226After building U-Boot, you will see tools/mkimage. With this tool, you can 227create an image tree blob as follows: 228 229 $ tools/mkimage -f fit.its -k keys -K dts/dt.dtb -r -F fitImage 230 231The -k option must specify the key directory you have created in step 1. 232 233A file "fitImage" will be created. This includes kernel, DTB, Init-ramdisk, 234hash data for each of the three, and signature data. 235 236The public key needed for the run-time verification is stored in "dts/dt.dtb". 237 2385. Compile U-Boot again 239 240Since the "dt.dtb" has been updated in step 4, you need to re-compile the 241U-Boot. 242 243 $ make CROSS_COMPILE=aarch64-linux-gnu- 244 245The re-compiled "u-boot.bin" is appended with DTB that contains the public key. 246 2476. Flash the image 248 249Flash the "fitImage" to a storage device (NAND, eMMC, or whatever) on your 250board. 251 252Please note the "u-boot.bin" must be signed, and verified by someone when it is 253loaded. For ARMv8 SoCs, the "someone" is generally ARM Trusted Firmware BL2. 254ARM Trusted Firmware supports an image authentication mechanism called Trusted 255Board Boot (TBB). The verification process must be chained from the moment of 256the system reset. If the Chain of Trust has a breakage somewhere, the verified 257boot process is entirely pointless. 258 2597. Boot verified kernel 260 261Load the fitImage to memory and run the following from the U-Boot command line. 262 263 > bootm <addr> 264 265Here, <addr> is the base address of the fitImage. 266 267If it is successful, you will see messages like follows: 268 269---------------------------------------->8---------------------------------------- 270## Loading kernel from FIT Image at 84100000 ... 271 Using 'config-1' configuration 272 Verifying Hash Integrity ... sha256,rsa2048:dev+ OK 273 Trying 'kernel' kernel subimage 274 Description: linux 275 Created: 2017-10-20 14:32:29 UTC 276 Type: Kernel Image 277 Compression: gzip compressed 278 Data Start: 0x841000c8 279 Data Size: 6957818 Bytes = 6.6 MiB 280 Architecture: AArch64 281 OS: Linux 282 Load Address: 0x82080000 283 Entry Point: 0x82080000 284 Hash algo: sha256 285 Hash value: 82a37b7f11ae55f4e07aa25bf77e4067cb9dc1014d52d6cd4d588f92eee3aaad 286 Verifying Hash Integrity ... sha256+ OK 287## Loading ramdisk from FIT Image at 84100000 ... 288 Using 'config-1' configuration 289 Trying 'ramdisk' ramdisk subimage 290 Description: ramdisk 291 Created: 2017-10-20 14:32:29 UTC 292 Type: RAMDisk Image 293 Compression: uncompressed 294 Data Start: 0x847a5cc0 295 Data Size: 5264365 Bytes = 5 MiB 296 Architecture: AArch64 297 OS: Linux 298 Load Address: unavailable 299 Entry Point: unavailable 300 Hash algo: sha256 301 Hash value: 44980a2874154a2e31ed59222c9f8ea968867637f35c81e4107a984de7014deb 302 Verifying Hash Integrity ... sha256+ OK 303## Loading fdt from FIT Image at 84100000 ... 304 Using 'config-1' configuration 305 Trying 'fdt-1' fdt subimage 306 Description: fdt 307 Created: 2017-10-20 14:32:29 UTC 308 Type: Flat Device Tree 309 Compression: uncompressed 310 Data Start: 0x847a2cb0 311 Data Size: 12111 Bytes = 11.8 KiB 312 Architecture: AArch64 313 Hash algo: sha256 314 Hash value: c517099db537f6d325e6be46b25c871a41331ad5af0283883fd29d40bfc14e1d 315 Verifying Hash Integrity ... sha256+ OK 316 Booting using the fdt blob at 0x847a2cb0 317 Uncompressing Kernel Image ... OK 318 reserving fdt memory region: addr=80000000 size=2000000 319 Loading Device Tree to 000000009fffa000, end 000000009fffff4e ... OK 320 321Starting kernel ... 322---------------------------------------->8---------------------------------------- 323 324Please pay attention to the lines that start with "Verifying Hash Integrity". 325 326"Verifying Hash Integrity ... sha256,rsa2048:dev+ OK" means the signature check 327passed. 328 329"Verifying Hash Integrity ... sha256+ OK" (3 times) means the hash check passed 330for kernel, DTB, and Init ramdisk. 331 332If they are not displayed, the Verified Boot is not working. 333 334 335Deployment for Distro Boot 336-------------------------- 337 338UniPhier SoC family boot the kernel in a generic manner as described in 339doc/README.distro . 340 341To boot the kernel, you need to deploy necesssary components to a file 342system on one of your block devices (eMMC, NAND, USB drive, etc.). 343 344The components depend on the kernel image format. 345 346[1] Bare images 347 348 - kernel 349 - init ramdisk 350 - device tree blob 351 - boot configuration file (extlinux.conf) 352 353Here is an exmple of the configuration file. 354 355-------------------->8-------------------- 356menu title UniPhier Boot Options. 357 358timeout 50 359default UniPhier 360 361label UniPhier 362 kernel ../Image 363 initrd ../rootfs.cpio.gz 364 fdtdir .. 365-------------------->8-------------------- 366 367Then, write 'Image', 'rootfs.cpio.gz', 'uniphier-ld20-ref.dtb' (DTB depends on 368your board), and 'extlinux/extlinux.conf' to the file system. 369 370[2] FIT 371 372 - FIT blob 373 - boot configuration file (extlinux.conf) 374 375-------------------->8-------------------- 376menu title UniPhier Boot Options. 377 378timeout 50 379default UniPhier 380 381label UniPhier 382 kernel ../fitImage 383-------------------->8-------------------- 384 385Since the init ramdisk and DTB are contained in the FIT blob, 386you do not need to describe them in the configuration file. 387Write 'fitImage' and 'extlinux/extlinux.conf' to the file system. 388 389 390UniPhier specific commands 391-------------------------- 392 393 - pinmon (enabled by CONFIG_CMD_PINMON) 394 shows the boot mode pins that has been latched at the power-on reset 395 396 - ddrphy (enabled by CONFIG_CMD_DDRPHY_DUMP) 397 shows the DDR PHY parameters set by the PHY training 398 399 - ddrmphy (enabled by CONFIG_CMD_DDRMPHY_DUMP) 400 shows the DDR Multi PHY parameters set by the PHY training 401 402 403Supported devices 404----------------- 405 406 - UART (on-chip) 407 - NAND 408 - SD/eMMC 409 - USB 2.0 (EHCI) 410 - USB 3.0 (xHCI) 411 - GPIO 412 - LAN (on-board SMSC9118) 413 - I2C 414 - EEPROM (connected to the on-board I2C bus) 415 - Support card (SRAM, NOR flash, some peripherals) 416 417 418Micro Support Card 419------------------ 420 421The recommended bit switch settings are as follows: 422 423 SW2 OFF(1)/ON(0) Description 424 ------------------------------------------ 425 bit 1 <---- BKSZ[0] 426 bit 2 ----> BKSZ[1] 427 bit 3 <---- SoC Bus Width 16/32 428 bit 4 <---- SERIAL_SEL[0] 429 bit 5 ----> SERIAL_SEL[1] 430 bit 6 ----> BOOTSWAP_EN 431 bit 7 <---- CS1/CS5 432 bit 8 <---- SOC_SERIAL_DISABLE 433 434 SW8 OFF(1)/ON(0) Description 435 ------------------------------------------ 436 bit 1 <---- CS1_SPLIT 437 bit 2 <---- CASE9_ON 438 bit 3 <---- CASE10_ON 439 bit 4 Don't Care Reserve 440 bit 5 Don't Care Reserve 441 bit 6 Don't Care Reserve 442 bit 7 ----> BURST_EN 443 bit 8 ----> FLASHBUS32_16 444 445The BKSZ[1:0] specifies the address range of memory slot and peripherals 446as follows: 447 448 BKSZ Description RAM slot Peripherals 449 -------------------------------------------------------------------- 450 0b00 15MB RAM / 1MB Peri 00000000-00efffff 00f00000-00ffffff 451 0b01 31MB RAM / 1MB Peri 00000000-01efffff 01f00000-01ffffff 452 0b10 64MB RAM / 1MB Peri 00000000-03efffff 03f00000-03ffffff 453 0b11 127MB RAM / 1MB Peri 00000000-07efffff 07f00000-07ffffff 454 455Set BSKZ[1:0] to 0b01 for U-Boot. 456This mode is the most handy because EA[24] is always supported by the save pin 457mode of the system bus. On the other hand, EA[25] is not supported for some 458newer SoCs. Even if it is, EA[25] is not connected on most of the boards. 459 460-- 461Masahiro Yamada <yamada.masahiro@socionext.com> 462Oct. 2017 463