meta-openpower: Add hb_settings tool

This shell script is used to configure the SIO registers that are read
by Hostboot at boot time in order to configure settings before IPMI and
other forms of communication are possible.

In the past these were hardcoded in the kernel, which is not an option
now that we support non OpenPower machines in OpenBMC.

Change-Id: If0f4e62cf28849648d1b1611da42e469b786eb86
Signed-off-by: Joel Stanley <joel@jms.id.au>
diff --git a/meta-openbmc-machines/meta-openpower/common/recipes-phosphor/host/hostboot-settings/hb_settings b/meta-openbmc-machines/meta-openpower/common/recipes-phosphor/host/hostboot-settings/hb_settings
new file mode 100644
index 0000000..d75d4b7
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/common/recipes-phosphor/host/hostboot-settings/hb_settings
@@ -0,0 +1,110 @@
+#!/bin/sh
+# Copyright 2018 IBM Corp
+# SPDX-License-Identifier: Apache-2.0
+# Authored May 2018, Joel Stanley <joel@jms.id.au>
+#
+# This script sets the SIO scratch registers 0x2D in order to configure
+# hostboot. It supports boot flags v1 as defined in hostboot source:
+#  src/usr/initservice/bootconfig/bootconfig_ast2400.C
+#  src/usr/console/ast2400.C
+#
+# BOOT_FLAGS_VERSION_REG    = 0x28,
+# Serial config reg: 0x2d
+# Serial config mask: 0xc0
+#
+#  NONE            = 0x00,  // No output selected
+#  SELECT_SUART    = 0x40,  // SIO Uart
+#  SELECT_VUART    = 0x80,  // SOL virtual uart
+#  RESERVED        = 0xc0,  // Reserved
+
+
+SYSFS_SIO=/sys/devices/platform/ahb/ahb:apb/1e789000.lpc/1e789080.lpc-host/1e789080.lpc-host:regs
+SYSFS_SIO28=$SYSFS_SIO/sio_28
+SYSFS_SIO2D=$SYSFS_SIO/sio_2d
+
+FLAGS_VERSION1=$((0x42))
+
+usage()
+{
+	echo "usage: hb_settings [[-u|--uart vuart|suart|none] | [-s|--show] | [-h]]"
+}
+
+show_regs()
+{
+	SIO28=$(cat $SYSFS_SIO28)
+	SIO2D=$(cat $SYSFS_SIO2D)
+
+	case $SIO28 in
+		$FLAGS_VERSION1)
+			echo "Boot flags version 1"
+			;;
+		* )
+			echo "Unknown boot flags version"
+			;;
+	esac
+
+	case $(($SIO2D >> 6)) in
+		0)
+			echo "Hostboot serial output disabled"
+			;;
+		1)
+			echo "Hostboot serial output on SUART"
+			;;
+		2)
+			echo "Hostboot serial output on VUART"
+			;;
+		3)
+			echo "Reserved value"
+			;;
+		* )
+			echo "Invalid uart value"
+			;;
+	esac
+}
+
+set_regs()
+{
+	case $uart in
+		suart)
+			echo "Hostboot serial output on SUART"
+			VAL=0x40
+			;;
+		vuart)
+			echo "Hostboot serial output on VUART"
+			VAL=0x80
+			;;
+		none)
+			echo "Hostboot serial output disabled"
+			VAL=0x00
+			;;
+		* )
+			echo "Invalid uart value"
+			usage
+			exit 1
+	esac
+
+    echo $FLAGS_VERSION1 > $SYSFS_SIO28
+    echo $VAL > $SYSFS_SIO2D
+}
+
+while [ "$1" != "" ]; do
+    case $1 in
+	    -u | --uart)	shift
+		    		uart=$1
+				set_regs
+				exit
+		    		;;
+	    -s | --show )	show_regs
+		    		exit
+		    		;;
+	    -h | --help )	usage
+		    		exit
+		    		;;
+	    * )			usage
+                                exit 1
+    esac
+    shift
+done
+
+usage
+exit 0