#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-only
# Intel MIC Platform Software Stack (MPSS)
#
# Copyright(c) 2013 Intel Corporation.
#
# Intel MIC User Space Tools.
#
# micctrl - Controls MIC boot/start/stop.
#
# chkconfig: 2345 95 05
# description: start MPSS stack processing.
#
### BEGIN INIT INFO
# Provides: micctrl
### END INIT INFO

# Source function library.
. /etc/init.d/functions

sysfs="/sys/class/mic"

_status()
{
	f=$sysfs/$1
	echo -e $1 state: "`cat $f/state`" shutdown_status: "`cat $f/shutdown_status`"
}

status()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_status $1
		return $?
	fi
	for f in $sysfs/*
	do
		_status `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_reset()
{
	f=$sysfs/$1
	echo reset > $f/state
}

reset()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_reset $1
		return $?
	fi
	for f in $sysfs/*
	do
		_reset `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_boot()
{
	f=$sysfs/$1
	echo "linux" > $f/bootmode
	echo "mic/uos.img" > $f/firmware
	echo "mic/$1.image" > $f/ramdisk
	echo "boot" > $f/state
}

boot()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_boot $1
		return $?
	fi
	for f in $sysfs/*
	do
		_boot `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_shutdown()
{
	f=$sysfs/$1
	echo shutdown > $f/state
}

shutdown()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_shutdown $1
		return $?
	fi
	for f in $sysfs/*
	do
		_shutdown `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

_wait()
{
	f=$sysfs/$1
	while [ "`cat $f/state`" != "offline" -a "`cat $f/state`" != "online" ]
	do
		sleep 1
		echo -e "Waiting for $1 to go offline"
	done
}

wait()
{
	if [ "`echo $1 | head -c3`" == "mic" ]; then
		_wait $1
		return $?
	fi
	# Wait for the cards to go offline
	for f in $sysfs/*
	do
		_wait `basename $f`
		RETVAL=$?
		[ $RETVAL -ne 0 ] && return $RETVAL
	done
	return 0
}

if [ ! -d "$sysfs" ]; then
	echo -e $"Module unloaded "
	exit 3
fi

case $1 in
	-s)
		status $2
		;;
	-r)
		reset $2
		;;
	-b)
		boot $2
		;;
	-S)
		shutdown $2
		;;
	-w)
		wait $2
		;;
	*)
		echo $"Usage: $0 {-s (status) |-r (reset) |-b (boot) |-S (shutdown) |-w (wait)}"
		exit 2
esac

exit $?
