#!/bin/sh

source ${CONF_DIR}/config
source ${CONF_DIR}/devices
source ${CONF_DIR}/helpers/functions

ROOTFS_MOUNTPOINT="/rootfs";
ROOT_MTDDEV=;
LOAD_MODULES=;
MOUNT_FSTYPE=;
MOUNT_OPTIONS="-o defaults,ro";
MOUNT_DEVICE=;
MOUNT_DEVICE_MAJOR=;
MOUNT_DEVICE_MINOR=;

if [ ! -d ${ROOTFS_MOUNTPOINT} ]; then
	/bin/mkdir -p ${ROOTFS_MOUNTPOINT};
	if [ "X$?" != "X0" ]; then
		echo "ERROR: failed to create rootfs mountpoint.";
	fi
fi

# Detect the configuration
if [ "X${CFGDEVICES_ROOTDEV}" == "Xram" ]; then
	MOUNT_DEVICE="/dev/ram0";
	MOUNT_DEVICE_MAJOR=1;
	MOUNT_DEVICE_MINOR=0;
	MOUNT_OPTIONS="${MOUNT_OPTIONS},size=$((CFGDEVICES_ROOTDEV_SIZE_KB*1024))";
elif [ "X${CFGDEVICES_ROOTDEV}" == "Xnand" ]; then
	LOAD_MODULES="${LOAD_MODULES} nand aumb3000_nand";
	ROOT_MTDDEV="aumb3000-nand";
	i=0;
	OLD_IFS=${IFS};
	IFS=",";
	for part in ${CFGDEVICES_ROOTDEV_MTDPARTS}; do
		name=$(echo ${part} | sed -e 's/[^\(]*[\(]\([^\)]*\)[\)].*/\1/');
		if [ "X${name}" == "Xrootfs" ]; then
			MOUNT_DEVICE="/dev/mtdblock$((i))";
			break;
		fi
		i=$((i+1));
	done
	IFS=${OLD_IFS};
	if [ -z "${MOUNT_DEVICE}" ]; then
		# This is a fatal error
		echo -ne "Could not find rootfs partition in ${CFGDEVICES_ROOTDEV_MTDPARTS}.\n";
		exit 1;
	fi
	MOUNT_DEVICE_MAJOR=31;
	MOUNT_DEVICE_MINOR=$((i));
elif [ "X${CFGDEVICES_ROOTDEV}" == "Xnor" ]; then
	LOAD_MODULES="${LOAD_MODULES} mhif mg3500_flash cfi_probe cfi_util cfi_cmdset_0001 cfi_cmdset_0002";
	ROOT_MTDDEV="physmap-flash";
	i=0;
	OLD_IFS=${IFS};
	IFS=",";
	for part in ${CFGDEVICES_ROOTDEV_MTDPARTS}; do
		name=$(echo ${part} | sed -e 's/[^\(]*[\(]\([^\)]*\)[\)].*/\1/');
		if [ "X${name}" == "Xrootfs" ]; then
			MOUNT_DEVICE="/dev/mtdblock$((i))";
			break;
		fi
		i=$((i+1));
	done
	IFS=${OLD_IFS};
	if [ -z "${MOUNT_DEVICE}" ]; then
		# This is a fatal error
		echo -ne "Could not find rootfs partition in ${CFGDEVICES_ROOTDEV_MTDPARTS}.\n";
		exit 1;
	fi
	MOUNT_DEVICE_MAJOR=31;
	MOUNT_DEVICE_MINOR=$((i));
elif [ "X${CFGDEVICES_ROOTDEV}" == "Xnfs" ]; then
	MOUNT_DEVICE="${CONFIG_ROOTFS_NFS_PATH}";
	MOUNT_OPTIONS="${MOUNT_OPTIONS},nolock";
fi

MOUNT_FSTYPE="${CFGDEVICES_ROOTDEV_FS}";
if [ "X${CFGDEVICES_ROOTDEV_FS}" != "Xtmpfs" ]; then
	# tmpfs is compiled in the kernel
	LOAD_MODULES="${LOAD_MODULES} ${CFGDEVICES_ROOTDEV_FS}";	
fi

if [ -n "${ROOT_MTDDEV}" ]; then
	LOAD_MODULES="${LOAD_MODULES} mtdblock";
	if [ "X${CFGDEVICES_ROOTDEV_MTDPARTS}" != "X" ]
	then
		load_module cmdlinepart "mtdparts=${ROOT_MTDDEV}:${CFGDEVICES_ROOTDEV_MTDPARTS}";
	else
		load_module cmdlinepart
	fi
	if [ $? -ne 0 ]; then
		echo -ne "Failed to load module cmdlinepart.\n";
	fi
fi

# Now load all the modules that were found
for module in ${LOAD_MODULES}; do
	load_module ${module}
	if [ $? -ne 0 ]; then
		echo -ne "Failed to load module ${module}.\n";
	fi
done	

# Check on mounting device
if [ -n "${MOUNT_DEVICE}" ] && [ -n "${MOUNT_DEVICE_MAJOR}" ] && [ -n "${MOUNT_DEVICE_MINOR}" ]; then
	if [ ! -e ${MOUNT_DEVICE} ]; then
		mknod ${MOUNT_DEVICE} b $((MOUNT_DEVICE_MAJOR)) $((MOUNT_DEVICE_MINOR));
		if [ $? -ne 0 ]; then
			echo -ne "Failed to create node ${MOUNT_DEVICE}.\n";
		fi
	fi
fi 

# Finally we mount the root filesystem
/bin/mount ${MOUNT_DEVICE} ${ROOTFS_MOUNTPOINT} -t ${MOUNT_FSTYPE} ${MOUNT_OPTIONS};
if [ $? -ne 0 ]; then
	echo -ne "Failed to mount the root filesystem.\n";
	exit 1;
fi
