/*
 * A target board needs to set these variables for the commands below to work:
 *
 * - adi_stage2_offset, the location of stage2-boot.ldr on the SPI flash
 * - adi_image_offset, location of the fitImage on the SPI flash
 * - adi_rfs_offset, location of the RFS on the SPI flash
 * - loadaddr, where you want to load things
 * - jffs2file, name of the jffs2 file for update, ex adsp-sc5xx-tiny-adsp-sc573.jffs2
 */

#ifdef CONFIG_SC59X_64
#define EARLY_PRINTK earlycon=adi_uart,0x31003000
#else
#define EARLY_PRINTK earlyprintk=serial,uart0,CONFIG_BAUDRATE
#endif

/* Config options */
imagefile=fitImage
ethaddr=02:80:ad:20:31:e8
eth1addr=02:80:ad:20:31:e9
uart_console=CONFIG_UART_CONSOLE
#ifdef CONFIG_SC59X_64
initrd_high=0xffffffffffffffff
#else
initrd_high=0xffffffff
#endif

/* Helper routines */
init_ethernet=mii info;
	dhcp;
	setenv serverip ${tftpserverip}

/* Args for each boot mode */
adi_bootargs=EARLY_PRINTK console=ttySC0,CONFIG_BAUDRATE vmalloc=512M
ramargs=setenv bootargs ${adi_bootargs}

addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:eth0:off

/* Boot modes are selectable and should be defined in the board env before including */
#if defined(USE_NFS)
// rootpath is set by CONFIG_ROOTPATH
nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath},tcp,nfsvers=3 ${adi_bootargs}
nfsboot=run init_ethernet;
	tftp ${loadaddr} ${tftp_dir_prefix}${imagefile};
	run nfsargs;
	run addip;
	bootm ${loadaddr}
#endif

#if defined(USE_MMC)
mmcargs=setenv bootargs root=/dev/mmcblk0p1 rw rootfstype=ext4 rootwait ${adi_bootargs}
mmcboot=mmc rescan;
	ext4load mmc 0:1 ${loadaddr} /boot/${imagefile};
	run mmcargs;
	bootm ${loadaddr}
#endif

#if defined(USE_SPI) || defined(USE_OSPI)
spiargs=setenv bootargs root=/dev/mtdblock4 rw rootfstype=jffs2 ${adi_bootargs}
spiboot=run spiargs;
	sf probe ${sfdev};
	sf read ${loadaddr} ${adi_image_offset} ${imagesize};
	bootm ${loadaddr}
#endif

#if defined(USE_OSPI)
ospiboot=run spiboot
#endif

#if defined(USE_RAM)
ramboot=run init_ethernet;
	tftp ${loadaddr} ${tfpt_dir_prefix}${imagefile};
	run ramargs;
	bootm ${loadaddr}
#endif

/* Update commands */
stage1file=stage1-boot.ldr
stage2file=stage2-boot.ldr

#if defined(USE_SPI) || defined(USE_OSPI)
update_spi_uboot_stage1=tftp ${loadaddr} ${tftp_dir_prefix}${stage1file};
	sf probe ${sfdev};
	sf update ${loadaddr} 0x0 ${filesize}
update_spi_uboot_stage2=tftp ${loadaddr} ${tftp_dir_prefix}${stage2file};
	sf probe ${sfdev};
	sf update ${loadaddr} ${adi_stage2_offset} ${filesize}
update_spi_uboot=run update_spi_uboot_stage1;
	run update_spi_uboot_stage2;
update_spi_fit=tftp ${loadaddr} ${tftp_dir_prefix}${imagefile};
	sf probe ${sfdev};
	sf update ${loadaddr} ${adi_image_offset} ${filesize};
	setenv imagesize ${filesize}
update_spi_rfs=tftp ${loadaddr} ${tftp_dir_prefix}${jffs2file};
	sf probe ${sfdev};
	sf update ${loadaddr} ${adi_rfs_offset} ${filesize}

start_update_spi=run init_ethernet;
	run update_spi_uboot;
	run update_spi_fit;
	run update_spi_rfs;
start_update_spi_uboot_only=run init_ethernet;
	run update_spi_uboot;
#endif

#if defined(USE_SPI)
update_spi=setenv sfdev CONFIG_SC_BOOT_SPI_BUS:CONFIG_SC_BOOT_SPI_SSEL;
	setenv bootcmd run spiboot;
	setenv argscmd spiargs;
	run start_update_spi;
	saveenv
#endif

#if defined(USE_OSPI)
update_ospi=setenv sfdev CONFIG_SC_BOOT_OSPI_BUS:CONFIG_SC_BOOT_OSPI_SSEL;
	setenv bootcmd run ospiboot;
	setenv argscmd spiargs;
	run start_update_spi;
	saveenv
#endif
