#!/bin/ash
#set -x
USE_GENERIC_OS_STR=1

GENERIC_OS_STR="Storage OS"

# $1: GPIO Port number
# $2: Pin number within the port
get_gpio_pin() {
	pin=$( expr $1 \* 16 + $2 )
	pin_value=`/usr/local/bin/gpiotool --get-data $pin | grep -c "Pin is High"`
	echo $pin_value
}

get_partner_type() {
	prt_type0=`get_gpio_pin 3 7`
	prt_type1=`get_gpio_pin 3 8`
	prt_type2=`get_gpio_pin 3 9`
	prt_type3=`get_gpio_pin 0 6`
	partner_word=$(/usr/local/bin/supportfpgatool --mem-read CPTR)
	partner_type=$((partner_word & 0x70))

	case `cat /var/run/platform` in
		Carnegie)
			case "$prt_type2$prt_type1$prt_type0" in
				000)
					partner="error"
					;;	
				001)
					partner="Controller"
					;;	
				010)
					partner="IOXM"
					;;	
				111)
					partner="empty"
					;;	
				*)
					partner="unknown"
					;;
			esac
		;;

		Absolut)
			case "$prt_type3$prt_type2$prt_type1$prt_type0" in
				0000)
					partner="error"
					;;	
				0001)
					partner="Controller"
					;;	
				0010)
					partner="IOXM"
					;;	
				0100)
					partner="MFG_IOXM"
					;;	
				1111)
					partner="empty"
					;;	
				*)
					partner="unknown"
					;;
			esac
		;;
		RazorL|RazorM|RazorS)
			case "$partner_type" in
				0000000)
					partner="error"
					;;	
				0010000)
					partner="Controller"
					;;	
				0100000)
					partner="IOXM"
					;;	
				1110000)
					partner="empty"
					;;	
				*)
					partner="unknown"
					;;
			esac
		;;
		*)
		;;
	esac

	echo $partner > /var/run/partner
}

get_board_revision () {
	revid_0=`get_gpio_pin 3 12`
	revid_1=`get_gpio_pin 3 13`
	revid_2=`get_gpio_pin 3 14`
	revid_3=`get_gpio_pin 3 15`

	case `cat /var/run/platform` in
		RazorL|RazorM|RazorS)
			rev=$( expr $revid_3 \* 8 + $revid_2 \* 4 + $revid_1 \* 2 + $revid_0)
			;;
		*)
			rev="unknown"
			;;
	esac
	echo $rev > /var/run/boardrev
}

get_slot_position () {

	slot=$(/usr/local/bin/gpiotool 0 10 --get-data | grep -c High)
	# 0: Slot A
	# 1: Slot B
	echo $slot > /var/run/slot
}

apply_board_specific () {
	case `cat /var/run/platform` in
		Carnegie)
			# Delay lower slot SP startup time by 3 seconds - see burt447575
			if /usr/local/bin/gpiotool 0 10 --get-data | grep -q High
			then
				sleep 3
			fi
			;;
		RazorL)
			# Battery library has a dependency on PDK (for psGood)
			ln -sf /usr/local/lib/RazorL-libPAR.so.1.0  /usr/local/lib/libPAR.so.1.0
			;;
		RazorS)
			# Battery library has a dependency on PDK (for psGood)
			ln -sf /usr/local/lib/RazorS-libPAR.so.1.0  /usr/local/lib/libPAR.so.1.0
			;;
		RazorM)
			# Battery library has a dependency on PDK (for psGood)
			ln -sf /usr/local/lib/RazorM-libPAR.so.1.0  /usr/local/lib/libPAR.so.1.0
			;;
		*)
			;;
	esac
}

case "$1" in

	start|"")

		# Deterime platform type
		platform=$(cat /proc/platform)
		touch /var/run/$platform
		echo $platform > /var/run/platform	
		# Create file to hold OS String parameter
		touch /var/run/os_str
		if [ $USE_GENERIC_OS_STR -eq 1 ]; then
			echo $GENERIC_OS_STR > /var/run/os_str
		else
			if [ $platform == "Mars" ]; then
				echo "Mars OS" > /var/run/os_str
			else
				echo "Data ONTAP" > /var/run/os_str
			fi
		fi

		# Determine partner type 
		get_partner_type;
		
		# Determine board revision 
		get_board_revision; 
	
		# Determine slot position
		get_slot_position; 
		
		# Do platform specific things
		apply_board_specific;
		;;

	stop)
		;;

	*)

		echo "Usage: local {start|stop}" >&2
		exit 1
		;;

esac
exit 0
