echo Selecting boot target...;

devtype=mmc; devnum=0; prefix=/boot/; script=boot.scr; boot_syslinux_conf=extlinux/extlinux.conf;

if mmc dev 1; then
  part start mmc 1 1 partstart;
  if itest ${partstart} -ge 0x8000; then
    if test -e mmc 1:1 ${prefix}${boot_syslinux_conf}; then
      devnum=1; echo SDMMC1sys;
    elif test -e mmc 1:2 ${prefix}${boot_syslinux_conf}; then
      devnum=1; echo SDMMC2sys;
    elif test -e mmc 1:1 ${prefix}${script}; then
      devnum=1; echo SDMMC1script;
    elif test -e mmc 1:2 ${prefix}${script}; then
      devnum=1; echo SDMMC2script;
    fi;
  fi;
fi;
if itest ${devnum} -eq 0; then
  part start mmc 0 1 partstart;
  if itest ${partstart} -ge 0x8000; then
    if test -e mmc 0:1 ${prefix}${boot_syslinux_conf}; then
      echo eMMC1sys;
    elif test -e mmc 0:2 ${prefix}${boot_syslinux_conf}; then
      echo eMMC2sys;
    elif test -e mmc 0:1 ${prefix}${script}; then
      echo eMMC1script;
    elif test -e mmc 0:2 ${prefix}${script}; then
      echo eMMC2script;
    else
      bootflow scan; run distro_bootcmd; echo Boot failed. Reset in 3 seconds...; sleep 3; reset;
    fi;
  else
    bootflow scan; run distro_bootcmd; echo Boot failed. Reset in 3 seconds...; sleep 3; reset;
  fi;
fi;

echo Selected MMC device ${devnum} for A/B boot;

t_bc_ref_size=0x30; blk=0x200;

t1_bc0_ref_addr=0x08200000;
mw.b 0x08200000 0x01 0x08;
mw.b 0x08200008 0x00 0x08;
mw.b 0x08200010 0x43 0x08;
mw.b 0x08200018 0x42 0x08;
mw.b 0x08200020 0x01 0x08;
mw.b 0x08200028 0x00 0x08;

t1_bc1_ref_addr=0x08200100;
mw.b 0x08200100 0x01 0x08;
mw.b 0x08200108 0x01 0x08;
mw.b 0x08200110 0x43 0x08;
mw.b 0x08200118 0x42 0x08;
mw.b 0x08200120 0x01 0x08;
mw.b 0x08200128 0x01 0x08;

t1_bc2_ref_addr=0x08200200;
mw.b 0x08200200 0x01 0x08;
mw.b 0x08200208 0x02 0x08;
mw.b 0x08200210 0x43 0x08;
mw.b 0x08200218 0x42 0x08;
mw.b 0x08200220 0x01 0x08;
mw.b 0x08200228 0x02 0x08;

t1_bc3_ref_addr=0x08200300;
mw.b 0x08200300 0x01 0x08;
mw.b 0x08200308 0x03 0x08;
mw.b 0x08200310 0x43 0x08;
mw.b 0x08200318 0x42 0x08;
mw.b 0x08200320 0x01 0x08;
mw.b 0x08200328 0x03 0x08;

t2_bc0_ref_addr=0x08200400;
mw.b 0x08200400 0x02 0x08;
mw.b 0x08200408 0x00 0x08;
mw.b 0x08200410 0x43 0x08;
mw.b 0x08200418 0x42 0x08;
mw.b 0x08200420 0x02 0x08;
mw.b 0x08200428 0x00 0x08;

t2_bc1_ref_addr=0x08200500;
mw.b 0x08200500 0x02 0x08;
mw.b 0x08200508 0x01 0x08;
mw.b 0x08200510 0x43 0x08;
mw.b 0x08200518 0x42 0x08;
mw.b 0x08200520 0x02 0x08;
mw.b 0x08200528 0x01 0x08;

t2_bc2_ref_addr=0x08200600;
mw.b 0x08200600 0x02 0x08;
mw.b 0x08200608 0x02 0x08;
mw.b 0x08200610 0x43 0x08;
mw.b 0x08200618 0x42 0x08;
mw.b 0x08200620 0x02 0x08;
mw.b 0x08200628 0x02 0x08;

t2_bc3_ref_addr=0x08200700;
mw.b 0x08200700 0x02 0x08;
mw.b 0x08200708 0x03 0x08;
mw.b 0x08200710 0x43 0x08;
mw.b 0x08200718 0x42 0x08;
mw.b 0x08200720 0x02 0x08;
mw.b 0x08200728 0x03 0x08;

tmp1_addr=0x08000000;
tmp2_addr=0x08100000;

mmc dev ${devnum};

if setexpr.l mmc_bc1_offset 0xa00000 / ${blk}; then
  echo Primary boot-count block is ${mmc_bc1_offset};
else
  echo Failed to calculate MMC BC1 offset; sleep 10; reset;
fi;
if setexpr.l mmc_bc2_offset 0xa10000 / ${blk}; then
  echo Secondary boot-count block is ${mmc_bc2_offset};
else
  echo Failed to calculate MMC BC2 offset; sleep 10; reset;
fi;

mmc read ${tmp1_addr} ${mmc_bc1_offset} 1;
mmc read ${tmp2_addr} ${mmc_bc2_offset} 1;
if cmp.b ${tmp1_addr} ${t1_bc0_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc1_ref_addr};
  echo \" !! Boot 1 attempt 1/3 p\";
elif cmp.b ${tmp1_addr} ${t1_bc1_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc2_ref_addr};
  echo \" !! Boot 1 attempt 2/3 p\";
elif cmp.b ${tmp1_addr} ${t1_bc2_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc3_ref_addr};
  echo \" !! Boot 1 attempt 3/3 p\";
elif cmp.b ${tmp1_addr} ${t1_bc3_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc1_ref_addr};
  echo \" !! Boot 2 attempt 1/3 p flip\";
elif cmp.b ${tmp1_addr} ${t2_bc0_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc1_ref_addr};
  echo \" !! Boot 2 attempt 1/3 p\";
elif cmp.b ${tmp1_addr} ${t2_bc1_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc2_ref_addr};
  echo \" !! Boot 2 attempt 2/3 p\";
elif cmp.b ${tmp1_addr} ${t2_bc2_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc3_ref_addr};
  echo \" !! Boot 2 attempt 3/3 p\";
elif cmp.b ${tmp1_addr} ${t2_bc3_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc1_ref_addr};
  echo \" !! Boot 1 attempt 1/3 p flip\";
elif cmp.b ${tmp2_addr} ${t1_bc0_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc1_ref_addr};
  echo \" !! Boot 1 attempt 1/3 s\";
elif cmp.b ${tmp2_addr} ${t1_bc1_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc2_ref_addr};
  echo \" !! Boot 1 attempt 2/3 s\";
elif cmp.b ${tmp2_addr} ${t1_bc2_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc3_ref_addr};
  echo \" !! Boot 1 attempt 3/3 s\";
elif cmp.b ${tmp2_addr} ${t1_bc3_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc1_ref_addr};
  echo \" !! Boot 2 attempt 1/3 s flip\";
elif cmp.b ${tmp2_addr} ${t2_bc0_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc1_ref_addr};
  echo \" !! Boot 2 attempt 1/3 s\";
elif cmp.b ${tmp2_addr} ${t2_bc1_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc2_ref_addr};
  echo \" !! Boot 2 attempt 2/3 s\";
elif cmp.b ${tmp2_addr} ${t2_bc2_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=2;
  next_ref=${t2_bc3_ref_addr};
  echo \" !! Boot 2 attempt 3/3 s\";
elif cmp.b ${tmp2_addr} ${t2_bc3_ref_addr} ${t_bc_ref_size}; then
  distro_bootpart=1;
  next_ref=${t1_bc1_ref_addr};
  echo \" !! Boot 1 attempt 1/3 s flip\";
else
  distro_bootpart=1;
  next_ref=${t1_bc1_ref_addr};
  echo \" !! Boot 1 attempt 1/3 i\";
fi;

mmc write ${next_ref} ${mmc_bc1_offset} 1;
mmc write ${next_ref} ${mmc_bc2_offset} 1;

echo \" !! Booting target ${devtype} ${devnum}:${distro_bootpart}\";

if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then
  echo Found ${prefix}${boot_syslinux_conf};
  sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf};
  echo EXTLINUX FAILED;
fi;
if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then
  echo Found ${prefix}${script};
  load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script};
  source ${scriptaddr};
  echo SCRIPT FAILED;
fi;
echo RESETTING IN 3...;
sleep 3; reset;
