kernel: move mv88e6xxx fix to generic backports
[openwrt/openwrt.git] / target / linux / mediatek / image / mt7623n_bpir2-uEnv.txt
1 # Boot menu for Banana Pi R2
2 # Copyright © 2020 David Woodhouse <dwmw2@infradead.org>
3
4 kernel=uImage
5 loadaddr=0x88000000
6 dtaddr=0x83f00000
7 fdt_high=0xffffffff
8
9 console=ttyS2,115200
10 bootopts=rootfstype=squashfs,ext4 rootwait
11
12 # Create the command line (with appropriate root=) and boot the Linux FIT image.
13 boot1=setenv bootargs "console=${console} root=${rootdev} ${bootopts}";printenv bootargs;\
14 fatload mmc ${partition} ${loadaddr} ${kernel}; bootm
15
16 # The preloader leaves a breadcrumb behind to say what it booted from.
17 checkbootedfrom=if itest.l *81dffff0 == 434d4d65 ; then setenv bootedfrom eMMC; else setenv bootedfrom SD; fi;
18
19 # Build the boot menu one item at a time
20 bm_count=0
21 checkkernel=test -e mmc ${bm_part} ${kernel}
22 addbm=if run checkkernel; then setenv bootmenu_${bm_count} "Boot from ${bm_dev}.=setenv partition ${bm_part};setenv rootdev ${bm_root};run boot1";if test "${bootedfrom}" = "${bm_dev}"; then setenv bootmenu_default ${bm_count};fi;setexpr bm_count ${bm_count} + 1; fi
23 # Here we assume that SD card id mmcblk1 and eMMC is mmcblk0 in linux. Swap them if your DTS define them in reverse order.
24 addeMMCbm=setenv bm_part 0:2;setenv bm_root /dev/mmcblk0p3;setenv bm_dev eMMC;run addbm
25 addSDbm=setenv bm_part 1:2;setenv bm_root /dev/mmcblk1p3;setenv bm_dev SD;run addbm
26 addinstallbm=if test "${bootedfrom}" = "SD";then run checkinstall; if run validparts; then setenv bootmenu_${bm_count} "Install OpenWrt from SD to internal eMMC.=run doinstall";setexpr bm_count ${bm_count} + 1;fi;fi
27
28 runbootmenu=if test "${bootedfrom}" = "";then run checkbootedfrom;fi;\
29 setenv bm_count 0;run addeMMCbm;run addSDbm;run addinstallbm;setenv bootmenu_${bm_count};\
30 bootmenu
31
32 bootdelay=0
33 bootcmd=run checkbootedfrom;run runbootmenu
34
35 # XX: Can we read this from the device, or must we trust they're all the same as mine?
36 # Probably not that important as we're unlikely ever to hit the limit anyway.
37 maxsect=0xe8ffff
38 validparts=false
39
40 # We could use 'part size' here but I'd like to check the types too.
41 checkinstall=mmc dev 1;\
42 mmc read 0x88000002 0 1;\
43 setenv validparts true;\
44 test -e mmc 1:2 eMMCboot.bin || setenv validparts false && echo "eMMCboot.bin not present on SD partition 2";\
45 if run validparts && itest.b *0x880001c4 != 0x41; then echo "SD partition 1 is not a PReP Boot partition"; setenv validparts false; fi;\
46 if run validparts && itest.l *0x880001c8 != 0x280; then echo "SD partition 1 does not start at 320KiB for U-Boot"; mmc part; exit; fi;\
47 if run validparts && itest.l *0x880001cc != 0x400; then echo "SD partition 1 is not 512KiB in size for U-Boot"; mmc part; exit; fi;\
48 if run validparts && itest.b *0x880001d4 != 0x0c; then echo "SD partition 2 is not a FAT32 partition"; setenv validparts false; fi;\
49 if run validparts && itest.b *0x880001e4 != 0x83; then echo "SD partition 3 is not a Linux partition"; setenv validparts false; fi;\
50 setexpr.l part2_start *0x880001d8;setexpr.l part2_len *0x880001dc;setexpr.l part3_start *0x880001e8;setexpr.l part3_len *0x880001ec;\
51 if run validparts && test 0x${part2_start} -gt ${maxsect}; then echo "SD partition 2 start too high"; setenv validparts false; fi;\
52 if run validparts && test 0x${part2_len} -gt ${maxsect}; then echo "SD partition 2 is too large"; setenv validparts false; fi;\
53 if run validparts && test 0x${part3_start} -gt ${maxsect}; then echo "SD partition 3 start too high"; setenv validparts false; fi;\
54 if run validparts && test 0x${part3_len} -gt ${maxsect}; then echo "SD partition 2 is too large"; setenv validparts false; fi;\
55 setexpr.l part2_end 0x$(part2_start} + 0x${part2_len};setexpr.l part3_end 0x${part3_start} + 0x${part3_len};\
56 if run validparts && test 0x${part2_end} -ge ${maxsect}; then echo "SD partition 2 end too high"; setenv validparts false; fi;\
57 if run validparts && test 0x${part3_end} -ge ${maxsect}; then echo "SD partition 3 end too high"; setenv validparts false; fi;
58
59 # Copy a single chunk, up to 0x8000 sectors / 16MiB, from SD to eMMC at the specified offset.
60 writechunk=setenv thislen 8000; if test 0x${partlen} -lt 0x${thislen}; then setenv thislen ${partlen};fi;\
61 mmc dev 1;mmc read ${loadaddr} 0x${partofs} 0x${thislen};\
62 mmc dev 0; mmc write ${loadaddr} 0x${partofs} 0x${thislen};\
63 setexpr partofs 0x${partofs} + 0x${thislen};setexpr partlen 0x${partlen} - 0x${thislen}
64
65 # Copy a partition defined by ${partofs} / ${partlen} from SD to eMMC
66 writepart=while test 0x${partlen} -ne 0; do run writechunk; done
67
68 # Configure the eMMC boot partition and write eMMCboot.bin to it
69 writeboot=mmc partconf 0 1 1 0;fatload mmc 1:2 ${loadaddr} eMMCboot.bin;\
70 setexpr filesize ${filesize} + 0x1ff;setexpr blocks ${filesize} / 0x200;\
71 mmc dev 0 1;mmc write ${loadaddr} 0 ${blocks}
72
73 # Install OpenWrt from the SD card to internal eMMC.
74 doinstall=run checkinstall;if run validparts;then run writeboot;\
75 echo "Copying preloader and U-Boot";setenv partofs 0;setenv partlen 680;run writepart;\
76 echo "Copying FAT boot partition";setenv partofs ${part2_start};setenv partlen ${part2_len};run writepart;\
77 echo "Copying root partition";setenv partofs ${part3_start};setenv partlen ${part3_len};run writepart;\
78 echo "Installed OpenWrt to eMMC";setenv bootedfrom eMMC;run runbootmenu;fi