# $Header$
# hush bootscript for PPCBOOT on L1
# note: all #s are in hex, do _NOT_ prefix it with 0x

flash_rfs=ffc00000
flash_krl=fff00000
tftp_addr=100000
tftp2_addr=1000000

if printenv booted
then
	echo already booted before
else
	echo first boot in environment, create and save settings
	setenv booted OK
	saveenv
fi

setenv autoload no
# clear out stale env stuff, so we get fresh from dhcp.
for setting in initrd fromflash kernel rootfs rootpath
do
setenv $setting
done

dhcp

# if host provides us with a different bootscript, us it.
if printenv bootscript
	then
	tftp $tftp_addr $bootcript
	if imi $tftp_addr
	then
		source $tftp_addr
	fi
fi

# default base kernel arguments.
setenv bootargs $xbootargs devfs=mount ip=$ipaddr:$serverip:$gatewayip:$netmask:L1:eth0:off wdt=120

# Have a kernel in flash?
if imi $flash_krl
then
	echo ok kernel to boot from $flash_krl
	setenv kernel $flash_krl
else
	echo no kernel to boot from $flash_krl, need tftp
fi

# Have a rootfs in flash? 
echo test for SQUASHfs at $flash_rfs

if imi $flash_rfs
then
	echo appears to be a good initrd image at base of flash OK
	setenv rootfs $flash_rfs
else
	echo no image at base of flash, need nfsroot or initrd
fi

# I boot from flash if told to and I can.
if printenv fromflash && printenv kernel && printenv rootfs
then
	echo booting entirely from flash
	setenv bootargs root=/dev/ram0 rw $bootargs
	bootm $kernel $rootfs
	echo oh no failed so I try some other stuff
fi

# TFTP down a kernel
if printenv bootfile
then 
	tftp $tftp_addr $bootfile
	setenv kernel $tftp_addr
	echo I will boot the TFTP kernel
else
	if printenv kernel
	then
		echo no bootfile specified, will use one from flash
	else
		setenv bootfile /opt/crayx1/craymcu/l1/flash/linux.image
		echo OH NO! we have no bootfile,nor flash kernel! try default: $bootfile
		tftp $tftp_addr $bootfile
		setenv kernel $tftp_addr
	fi
fi

# the rootfs.
if printenv rootpath
then
	echo rootpath is $rootpath
	if printenv initrd
	then 
		echo initrd is also specified, so use $initrd
		tftp $tftp2_addr $initrd
		setenv bootargs root=/dev/ram0 rw cwsroot=$serverip:$rootpath $bootargs
		bootm $kernel $tftp2_addr
	else
		echo initrd is not specified, so use NFSROOT $rootpat
		setenv bootargs root=/dev/nfs ro nfsroot=$serverip:$rootpath $bootargs
		bootm $kernel
	fi
else
	echo we have no rootpath check for one in flash
	if printenv rootfs
	then
		echo I will use the one in flash
		setenv bootargs root=/dev/mtdblock/0 ro rootfstype=squashfs $bootargs
		bootm $kernel
	else
		setenv rootpath /export/crayl1
		echo OH NO! we have no rootpath,nor flash kernel! try default: $rootpath
		setenv bootargs root=/dev/mtdblock/0 ro rootfstype=squashfs $bootargs
		bootm $kernel
	fi
fi
reset
