1 .. SPDX-License-Identifier: GPL-2.0+
8 The JH7110 is 4+1 64-bit RISC-V SoC from StarFive.
10 The StarFive VisionFive2 development platform is based on JH7110 and capable
16 The support for following drivers are already enabled:
18 1. ns16550 UART Driver.
19 2. StarFive JH7110 clock Driver.
20 3. StarFive JH7110 reset Driver.
21 4. Cadence QSPI controller Driver.
22 5. MMC SPI Driver for MMC/SD support.
23 6. PLDA PCIE controller driver.
24 7. On-board VL805 PCIE-USB controller driver.
26 Booting from MMC using U-Boot SPL
27 ---------------------------------
29 The current U-Boot port is supported in S-mode only and loaded from DRAM.
31 A prior stage M-mode firmware/bootloader (e.g OpenSBI) is required to
32 boot the u-boot.itb in S-mode and provide M-mode runtime services.
34 Currently, the u-boot.itb is used as a dynamic of the OpenSBI FW_DYNAMIC
35 firmware with the latest.
40 1. Add the RISC-V toolchain to your PATH.
41 2. Setup ARCH & cross compilation environment variable:
45 export CROSS_COMPILE=<riscv64 toolchain prefix>
47 Before building U-Boot SPL, OpenSBI must be built first. OpenSBI can be
48 cloned and built for JH7110 as below:
50 .. code-block:: console
52 git clone https://github.com/riscv/opensbi.git
54 make PLATFORM=generic FW_TEXT_START=0x40000000 FW_OPTIONS=0
56 The VisionFive 2 support for OpenSBI was introduced after the v1.2 release.
58 More detailed description of steps required to build FW_DYNAMIC firmware
59 is beyond the scope of this document. Please refer OpenSBI documenation.
60 (Note: OpenSBI git repo is at https://github.com/riscv/opensbi.git)
62 Now build the U-Boot SPL and U-Boot proper
64 .. code-block:: console
67 make starfive_visionfive2_defconfig
68 make OPENSBI=$(opensbi_dir)/opensbi/build/platform/generic/firmware/fw_dynamic.bin
70 This will generate the U-Boot SPL image (spl/u-boot-spl.bin.normal.out) as well
71 as the FIT image (u-boot.itb) with OpenSBI and U-Boot.
76 The device firmware loads U-Boot SPL (u-boot-spl.bin.normal.out) from the
77 partition with type GUID 2E54B353-1271-4842-806F-E436D6AF6985. You are free
78 to choose any partition number.
80 With the default configuration U-Boot SPL loads the U-Boot FIT image
81 (u-boot.itb) from partition 2 (CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=0x2).
82 When formatting it is recommended to use GUID
83 BC13C2FF-59E6-4262-A352-B275FD6F7172 for this partition.
85 The FIT image (u-boot.itb) is a combination of OpenSBI's fw_dynamic.bin,
86 u-boot-nodtb.bin and the device tree blob
87 (jh7110-starfive-visionfive-2-v1.3b.dtb or
88 jh7110-starfive-visionfive-2-v1.2a.dtb).
90 Format the SD card (make sure the disk has GPT, otherwise use gdisk to switch)
96 --new=1:4096:8191 --change-name=1:spl --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985\
97 --new=2:8192:16383 --change-name=2:uboot --typecode=2:BC13C2FF-59E6-4262-A352-B275FD6F7172 \
98 --new=3:16384:1654784 --change-name=3:system --typecode=3:EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 \
105 sudo dd if=u-boot-spl.bin.normal.out of=/dev/sdb1
106 sudo dd if=u-boot.itb of=/dev/sdb2
108 sudo mount /dev/sdb3 /mnt/
109 sudo cp u-boot-spl.bin.normal.out /mnt/
110 sudo cp u-boot.itb /mnt/
111 sudo cp Image.gz /mnt/
112 sudo cp initramfs.cpio.gz /mnt/
113 sudo cp jh7110-starfive-visionfive-2.dtb /mnt/
119 The board provides the DIP switches MSEL[1:0] to select the boot device.
120 To select booting from SD-card set the DIP switches MSEL[1:0] to 10.
122 Once you plugin the sdcard and power up, you should see the U-Boot prompt.
124 Sample boot log from StarFive VisionFive2 board
125 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130 U-Boot SPL 2023.04-rc2-00055-gfc43b9c51a-dirty (Mar 02 2023 - 10:51:39 +0800)
131 DDR version: dc2e84f0.
132 Trying to boot from MMC2
134 OpenSBI v1.2-80-g4b28afc
135 ____ _____ ____ _____
136 / __ \ / ____| _ \_ _|
137 | | | |_ __ ___ _ __ | (___ | |_) || |
138 | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
139 | |__| | |_) | __/ | | |____) | |_) || |_
140 \____/| .__/ \___|_| |_|_____/|___/_____|
144 Platform Name : StarFive VisionFive 2 v1.3B
145 Platform Features : medeleg
146 Platform HART Count : 5
147 Platform IPI Device : aclint-mswi
148 Platform Timer Device : aclint-mtimer @ 4000000Hz
149 Platform Console Device : uart8250
150 Platform HSM Device : ---
151 Platform PMU Device : ---
152 Platform Reboot Device : ---
153 Platform Shutdown Device : ---
154 Platform Suspend Device : ---
155 Firmware Base : 0x40000000
156 Firmware Size : 264 KB
157 Firmware RW Offset : 0x20000
158 Runtime SBI Version : 1.0
161 Domain0 Boot HART : 2
162 Domain0 HARTs : 0*,1*,2*,3*,4*
163 Domain0 Region00 : 0x0000000002000000-0x000000000200ffff M: (I,R,W) S/U: ()
164 Domain0 Region01 : 0x0000000040000000-0x000000004001ffff M: (R,X) S/U: ()
165 Domain0 Region02 : 0x0000000040000000-0x000000004007ffff M: (R,W) S/U: ()
166 Domain0 Region03 : 0x0000000000000000-0xffffffffffffffff M: (R,W,X) S/U: (R,W,X)
167 Domain0 Next Address : 0x0000000040200000
168 Domain0 Next Arg1 : 0x0000000040287970
169 Domain0 Next Mode : S-mode
170 Domain0 SysReset : yes
171 Domain0 SysSuspend : yes
174 Boot HART Domain : root
175 Boot HART Priv Version : v1.11
176 Boot HART Base ISA : rv64imafdcbx
177 Boot HART ISA Extensions : none
178 Boot HART PMP Count : 8
179 Boot HART PMP Granularity : 4096
180 Boot HART PMP Address Bits: 34
181 Boot HART MHPM Count : 2
182 Boot HART MIDELEG : 0x0000000000000222
183 Boot HART MEDELEG : 0x000000000000b109
186 U-Boot 2023.04-rc2-00055-gfc43b9c51a-dirty (Mar 02 2023 - 10:51:39 +0800)
188 CPU: rv64imac_zba_zbb
189 Model: StarFive VisionFive 2 v1.3B
191 Core: 107 devices, 18 uclasses, devicetree: separate
192 MMC: mmc@16010000: 0, mmc@16020000: 1
193 Loading Environment from nowhere... OK
197 Net: No ethernet found.
198 Working FDT set to ff74a340
199 Hit any key to stop autoboot: 0
202 U-Boot 2023.04-rc2-00055-gfc43b9c51a-dirty (Mar 02 2023 - 10:51:39 +0800)
204 riscv64-buildroot-linux-gnu-gcc.br_real (Buildroot VF2_515_v1.0.0_rc4) 10.3.0
205 GNU ld (GNU Binutils) 2.36.1
208 switch to partitions #0, OK
209 mmc1 is current device
216 Mode: SD High Speed (50MHz)
222 Erase Group Size: 512 Bytes
226 Partition Map for MMC device 1 -- Partition Type: EFI
228 Part Start LBA End LBA Name
232 1 0x00001000 0x00001fff "spl"
233 attrs: 0x0000000000000000
234 type: 2e54b353-1271-4842-806f-e436d6af6985
235 (2e54b353-1271-4842-806f-e436d6af6985)
236 guid: d5ee2056-3020-475b-9a33-25b4257c9f12
237 2 0x00002000 0x00003fff "uboot"
238 attrs: 0x0000000000000000
239 type: bc13c2ff-59e6-4262-a352-b275fd6f7172
240 (bc13c2ff-59e6-4262-a352-b275fd6f7172)
241 guid: 379ab7fe-fd0c-4149-b758-960c1cbfc0cc
242 3 0x00004000 0x00194000 "system"
243 attrs: 0x0000000000000000
244 type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
246 guid: 539a6df9-4655-4953-8541-733ca36eb1db
248 StarFive # fatls mmc 1:3
251 125437 u-boot-spl.bin.normal.out
252 152848495 initramfs.cpio.gz
253 11285 jh7110-starfive-visionfive-2-v1.3b.dtb
257 StarFive # fatload mmc 1:3 ${kernel_addr_r} Image.gz
258 6429424 bytes read in 394 ms (15.6 MiB/s)
259 StarFive # fatload mmc 1:3 ${fdt_addr_r} jh7110-starfive-visionfive-2.dtb
260 11285 bytes read in 5 ms (2.2 MiB/s)
261 StarFive # fatload mmc 1:3 ${ramdisk_addr_r} initramfs.cpio.gz
262 152848495 bytes read in 9271 ms (15.7 MiB/s)
263 StarFive # booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}
264 Uncompressing Kernel Image
265 ## Flattened Device Tree blob at 46000000
266 Booting using the fdt blob at 0x46000000
267 Working FDT set to 46000000
268 Loading Ramdisk to f5579000, end fe73d86f ... OK
269 Loading Device Tree to 00000000f5573000, end 00000000f5578c14 ... OK
270 Working FDT set to f5573000
275 ] Linux version 6.2.0-starfive-00026-g11934a315b67 (wyh@wyh-VirtualBox) (riscv64-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, GNU ld (GNU Binutils for Ubuntu) 2.30) #1 SMP Thu Mar 2 14:51:36 CST 2023
276 [ 0.000000] OF: fdt: Ignoring memory range 0x40000000 - 0x40200000
277 [ 0.000000] Machine model: StarFive VisionFive 2 v1.3B
278 [ 0.000000] efi: UEFI not found.
279 [ 0.000000] Zone ranges:
280 [ 0.000000] DMA32 [mem 0x0000000040200000-0x00000000ffffffff]
281 [ 0.000000] Normal [mem 0x0000000100000000-0x000000013fffffff]
282 [ 0.000000] Movable zone start for each node
283 [ 0.000000] Early memory node ranges
284 [ 0.000000] node 0: [mem 0x0000000040200000-0x000000013fffffff]
285 [ 0.000000] Initmem setup node 0 [mem 0x0000000040200000-0x000000013fffffff]
286 [ 0.000000] On node 0, zone DMA32: 512 pages in unavailable ranges
287 [ 0.000000] SBI specification v1.0 detected
288 [ 0.000000] SBI implementation ID=0x1 Version=0x10002
289 [ 0.000000] SBI TIME extension detected
290 [ 0.000000] SBI IPI extension detected
291 [ 0.000000] SBI RFENCE extension detected
292 [ 0.000000] SBI HSM extension detected
293 [ 0.000000] CPU with hartid=0 is not available
294 [ 0.000000] CPU with hartid=0 is not available
295 [ 0.000000] CPU with hartid=0 is not available
296 [ 0.000000] riscv: base ISA extensions acdfim
297 [ 0.000000] riscv: ELF capabilities acdfim
298 [ 0.000000] percpu: Embedded 18 pages/cpu s35960 r8192 d29576 u73728
299 [ 0.000000] pcpu-alloc: s35960 r8192 d29576 u73728 alloc=18*4096
300 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
301 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 1031688
302 [ 0.000000] Kernel command line: console=ttyS0,115200 debug rootwait earlycon=sbi
303 [ 0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
304 [ 0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
305 [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
306 [ 0.000000] software IO TLB: area num 4.
307 [ 0.000000] software IO TLB: mapped [mem 0x00000000f1573000-0x00000000f5573000] (64MB)
308 [ 0.000000] Virtual kernel memory layout:
309 [ 0.000000] fixmap : 0xffffffc6fee00000 - 0xffffffc6ff000000 (2048 kB)
310 [ 0.000000] pci io : 0xffffffc6ff000000 - 0xffffffc700000000 ( 16 MB)
311 [ 0.000000] vmemmap : 0xffffffc700000000 - 0xffffffc800000000 (4096 MB)
312 [ 0.000000] vmalloc : 0xffffffc800000000 - 0xffffffd800000000 ( 64 GB)
313 [ 0.000000] modules : 0xffffffff0136a000 - 0xffffffff80000000 (2028 MB)
314 [ 0.000000] lowmem : 0xffffffd800000000 - 0xffffffd8ffe00000 (4094 MB)
315 [ 0.000000] kernel : 0xffffffff80000000 - 0xffffffffffffffff (2047 MB)
316 [ 0.000000] Memory: 3867604K/4192256K available (8012K kernel code, 4919K rwdata, 4096K rodata, 2190K init, 476K bss, 324652K reserved, 0K cma-reserved)
317 [ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
318 [ 0.000000] rcu: Hierarchical RCU implementation.
319 [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=64 to nr_cpu_ids=4.
320 [ 0.000000] rcu: RCU debug extended QS entry/exit.
321 [ 0.000000] Tracing variant of Tasks RCU enabled.
322 [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
323 [ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
324 [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
325 [ 0.000000] CPU with hartid=0 is not available
326 [ 0.000000] riscv-intc: unable to find hart id for /cpus/cpu@0/interrupt-controller
327 [ 0.000000] riscv-intc: 64 local interrupts mapped
328 [ 0.000000] plic: interrupt-controller@c000000: mapped 136 interrupts with 4 handlers for 9 contexts.
329 [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
330 [ 0.000000] riscv-timer: riscv_timer_init_dt: Registering clocksource cpuid [0] hartid [4]
331 [ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 881590404240 ns
332 [ 0.000003] sched_clock: 64 bits at 4MHz, resolution 250ns, wraps every 2199023255500ns
333 [ 0.000437] Console: colour dummy device 80x25
334 [ 0.000568] Calibrating delay loop (skipped), value calculated using timer frequency.. 8.00 BogoMIPS (lpj=16000)
335 [ 0.000602] pid_max: default: 32768 minimum: 301
336 [ 0.000752] LSM: initializing lsm=capability,integrity
337 [ 0.001071] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
338 [ 0.001189] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
339 [ 0.004201] CPU node for /cpus/cpu@0 exist but the possible cpu range is :0-3
340 [ 0.007426] cblist_init_generic: Setting adjustable number of callback queues.
341 [ 0.007457] cblist_init_generic: Setting shift to 2 and lim to 1.
342 [ 0.007875] riscv: ELF compat mode unsupported
343 [ 0.007902] ASID allocator disabled (0 bits)
344 [ 0.008405] rcu: Hierarchical SRCU implementation.
345 [ 0.008426] rcu: Max phase no-delay instances is 1000.
346 [ 0.009247] EFI services will not be available.
347 [ 0.010738] smp: Bringing up secondary CPUs ...
348 [ 0.018358] smp: Brought up 1 node, 4 CPUs
349 [ 0.021776] devtmpfs: initialized
350 [ 0.027337] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
351 [ 0.027389] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
352 [ 0.027888] pinctrl core: initialized pinctrl subsystem
353 [ 0.029881] NET: Registered PF_NETLINK/PF_ROUTE protocol family
354 [ 0.030401] audit: initializing netlink subsys (disabled)
355 [ 0.031041] audit: type=2000 audit(0.028:1): state=initialized audit_enabled=0 res=1
356 [ 0.031943] cpuidle: using governor menu
357 [ 0.043011] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
358 [ 0.043033] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
359 [ 0.044943] iommu: Default domain type: Translated
360 [ 0.044965] iommu: DMA domain TLB invalidation policy: strict mode
361 [ 0.046089] SCSI subsystem initialized
362 [ 0.046733] libata version 3.00 loaded.
363 [ 0.047231] usbcore: registered new interface driver usbfs
364 [ 0.047315] usbcore: registered new interface driver hub
365 [ 0.047420] usbcore: registered new device driver usb
366 [ 0.049770] vgaarb: loaded
367 [ 0.050277] clocksource: Switched to clocksource riscv_clocksource
368 [ 0.084690] NET: Registered PF_INET protocol family
369 [ 0.085561] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
370 [ 0.093010] tcp_listen_portaddr_hash hash table entries: 2048 (order: 4, 65536 bytes, linear)
371 [ 0.093152] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
372 [ 0.093224] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
373 [ 0.093821] TCP bind hash table entries: 32768 (order: 9, 2097152 bytes, linear)
374 [ 0.117880] TCP: Hash tables configured (established 32768 bind 32768)
375 [ 0.118500] UDP hash table entries: 2048 (order: 5, 196608 bytes, linear)
376 [ 0.118881] UDP-Lite hash table entries: 2048 (order: 5, 196608 bytes, linear)
377 [ 0.119675] NET: Registered PF_UNIX/PF_LOCAL protocol family
378 [ 0.121749] RPC: Registered named UNIX socket transport module.
379 [ 0.121776] RPC: Registered udp transport module.
380 [ 0.121784] RPC: Registered tcp transport module.
381 [ 0.121791] RPC: Registered tcp NFSv4.1 backchannel transport module.
382 [ 0.121816] PCI: CLS 0 bytes, default 64
383 [ 0.124101] Unpacking initramfs...
384 [ 0.125468] workingset: timestamp_bits=46 max_order=20 bucket_order=0
385 [ 0.128372] NFS: Registering the id_resolver key type
386 [ 0.128498] Key type id_resolver registered
387 [ 0.128525] Key type id_legacy registered
388 [ 0.128625] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
389 [ 0.128649] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
390 [ 0.129358] 9p: Installing v9fs 9p2000 file system support
391 [ 0.130179] NET: Registered PF_ALG protocol family
392 [ 0.130499] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247)
393 [ 0.130544] io scheduler mq-deadline registered
394 [ 0.130556] io scheduler kyber registered
395 [ 0.416754] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
396 [ 0.420857] SuperH (H)SCI(F) driver initialized
397 [ 0.443735] loop: module loaded
398 [ 0.448605] e1000e: Intel(R) PRO/1000 Network Driver
399 [ 0.448627] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
400 [ 0.450716] usbcore: registered new interface driver uas
401 [ 0.450832] usbcore: registered new interface driver usb-storage
402 [ 0.451638] mousedev: PS/2 mouse device common for all mice
403 [ 0.453465] sdhci: Secure Digital Host Controller Interface driver
404 [ 0.453487] sdhci: Copyright(c) Pierre Ossman
405 [ 0.453584] sdhci-pltfm: SDHCI platform and OF driver helper
406 [ 0.454140] usbcore: registered new interface driver usbhid
407 [ 0.454174] usbhid: USB HID core driver
408 [ 0.454833] riscv-pmu-sbi: SBI PMU extension is available
409 [ 0.454920] riscv-pmu-sbi: 16 firmware and 4 hardware counters
410 [ 0.454942] riscv-pmu-sbi: Perf sampling/filtering is not supported as sscof extension is not available
411 [ 0.457071] NET: Registered PF_INET6 protocol family
412 [ 0.460627] Segment Routing with IPv6
413 [ 0.460821] In-situ OAM (IOAM) with IPv6
414 [ 0.461005] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
415 [ 0.462712] NET: Registered PF_PACKET protocol family
416 [ 0.462933] 9pnet: Installing 9P2000 support
417 [ 0.463141] Key type dns_resolver registered
418 [ 0.463168] start plist test
419 [ 0.469261] end plist test
420 [ 0.506774] debug_vm_pgtable: [debug_vm_pgtable ]: Validating architecture page table helpers
421 [ 0.553683] gpio gpiochip0: Static allocation of GPIO base is deprecated, use dynamic allocation.
422 [ 0.554741] starfive-jh7110-sys-pinctrl 13040000.pinctrl: StarFive GPIO chip registered 64 GPIOs
423 [ 0.555900] gpio gpiochip1: Static allocation of GPIO base is deprecated, use dynamic allocation.
424 [ 0.556772] starfive-jh7110-aon-pinctrl 17020000.pinctrl: StarFive GPIO chip registered 4 GPIOs
425 [ 0.559454] printk: console [ttyS0] disabled
426 [ 0.579948] 10000000.serial: ttyS0 at MMIO 0x10000000 (irq = 3, base_baud = 1500000) is a 16550A
427 [ 0.580082] printk: console [ttyS0] enabled
428 [ 13.642680] Freeing initrd memory: 149264K
429 [ 13.651051] Freeing unused kernel image (initmem) memory: 2188K
430 [ 13.666431] Run /init as init process
431 [ 13.670116] with arguments:
433 [ 13.675488] with environment:
435 [ 13.681038] TERM=linux
439 Populating /dev using udev: [ 14.145944] udevd[93]: starting version 3.2.10
440 [ 15.214287] random: crng init done
441 [ 15.240816] udevd[94]: starting eudev-3.2.10
443 Saving random seed: OK
444 Starting system message bus: dbus[122]: Unknown username "pulse" in message bus configuration file
447 Starting iptables: OK
448 Starting bluetoothd: OK
449 Starting network: Waiting for interface eth0 to appear............... timeout!
450 run-parts: /etc/network/if-pre-up.d/wait_iface: exit status 1
452 Starting dropbear sshd: OK
453 Starting NFS statd: OK
454 Starting NFS services: OK
455 Starting NFS daemon: rpc.nfsd: Unable to access /proc/fs/nfsd errno 2 (No such file or directory).
456 Please try, as root, 'mount -t nfsd nfsd /proc/fs/nfsd' and then restart rpc.nfsd to correct the problem
458 Starting NFS mountd: OK
459 Starting DHCP server: FAIL
467 Use Building steps from "Booting from MMC using U-Boot SPL" section.
469 Partition the SPI in Linux via mtdblock. (Require to boot the board in
470 SD boot mode by enabling MTD block in Linux)
472 Use prebuilt image from here [1], which support to partition the SPI flash.
475 Program the SPI (Require to boot the board in SD boot mode)
477 Execute below steps on U-Boot proper,
482 fatload mmc 1:3 $kernel_addr_r u-boot.itb
483 sf update $kernel_addr_r 0x100000 $filesize
485 fatload mmc 1:3 $kernel_addr_r u-boot-spl.bin.normal.out
486 sf update $kernel_addr_r 0x0 $filesize
491 Change DIP switches MSEL[1:0] are set to 00, select the boot mode to flash