meta-romulus: Add AVSBus and VRM workarounds

Add AVSBus and VRM control scripts.
Add systemd services to do AVSBus workaround, disable AVSBus, do VRM workaround and enable
AVSBus.
Add BitBake recipe to install script and services.

Change-Id: I72ec0138d23eba57ee56d5a6b01e3cd638c819bc
Signed-off-by: Lei YU <mine260309@gmail.com>
diff --git a/meta-openbmc-machines/meta-openpower/meta-ibm/meta-romulus/recipes-phosphor/chassis/vrm-control/vrm-control.sh b/meta-openbmc-machines/meta-openpower/meta-ibm/meta-romulus/recipes-phosphor/chassis/vrm-control/vrm-control.sh
new file mode 100644
index 0000000..9e6507e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-ibm/meta-romulus/recipes-phosphor/chassis/vrm-control/vrm-control.sh
@@ -0,0 +1,144 @@
+#!/bin/bash
+# #########################################################
+# Script to run on BMC to read/set vrm voltages
+
+
+# #########################################################
+d2v () {
+# usage:   d2v <decimal volts>
+
+echo $1 | awk '{print $1 * 256 + .5}' | cut -d '.' -f 1
+}
+
+
+# #########################################################
+v2d () {
+# usage:   v2d <hex val>
+
+printf "	%0.3fV" `echo $1 | awk '{print $1 / 256}'`
+}
+
+
+# #########################################################
+i2d () {
+# usage:  i2d <hex val> <current divisor>
+
+# parse current mantisa and exponent
+# format: SEEE ESMM MMMM MMMM
+let e=$1/0x800
+let esign=e/0x10
+let m=$1\&0x07FF
+let msign=m/0x0400
+
+if [ $msign -eq 1 ]
+then
+  # calc ones compliment
+  let m=($m^0x07FF)+1
+  m="-$m"
+fi
+if [ $esign -eq 1 ]
+then
+  # calc ones compliment
+  let e=(e^0x1F)+1
+  e="-$e"
+fi
+printf "	%0.3fA\n" `echo $m $e $2 | awk '{print ($1 * 2^$2) / $3}'`
+}
+
+
+# #########################################################
+rw_vc () {
+# usage:   rw_vc <bus> <addr> <current divisor> <channel> <value>
+
+# select channel
+if [ $4 != "x" ]
+then
+  i2cset -y $1 $2 0 $4 b
+fi
+
+# write new voltage set point
+if [ ! -e $5 ]
+then
+  i2cset -y $1 $2 0x21 `d2v $5` w
+fi
+
+# print voltage set point
+v2d `i2cget -y $1 $2 0x21 w`
+
+# print voltage
+v2d `i2cget -y $1 $2 0x8B w`
+
+# print current
+i2d `i2cget -y $1 $2 0x8C w` $3
+
+# default back to channel 0
+if [ $4 != "x" ]
+then
+  i2cset -y $1 $2 0 0 b
+fi
+}
+
+
+# #########################################################
+# Main
+
+if [ -e $1 ]
+then
+  $0 vdda vcsa vdna vioa vddra vddb vcsb vdnb viob vddrb
+  exit
+fi
+
+if [ $1 == "-h" ]
+then
+  echo "  Usage: vrm [<rail>=[value] [<rail>=[value]] ...]"
+  echo "    rail: vdda vcsa vdna vioa vddra vddb vcsb vdnb viob vddrb"
+  echo "    value: volts"
+  echo
+  echo "    e.g., vrm vioa=1.0 viob=1.0"
+  echo
+  exit
+fi
+
+echo "rail	set	read	current"
+echo "-------	------- ------- -------"
+for param in ${@:1}
+do
+  rail=`echo $param | cut -d'=' -f 1`
+  val=`echo ${param}= | cut -d'=' -f 2`
+  echo -n "$rail"
+  case "$rail" in
+  # FIXME: What's the addresses for Romulus?
+    vdda)
+      rw_vc 4 0x70 2 0 $val
+      ;;
+    vddb)
+      rw_vc 5 0x70 2 0 $val
+      ;;
+    vcsa)
+      rw_vc 4 0x70 4 1 $val
+      ;;
+    vcsb)
+      rw_vc 5 0x70 4 1 $val
+      ;;
+    vdna)
+      rw_vc 4 0x73 2 0 $val
+      ;;
+    vdnb)
+      rw_vc 5 0x73 2 0 $val
+      ;;
+    vioa)
+      rw_vc 4 0x73 2 1 $val
+      ;;
+    viob)
+      rw_vc 5 0x73 2 1 $val
+      ;;
+    vddra)
+      rw_vc 4 0x72 2 1 $val  # This is wrong
+      ;;
+    vddrb)
+      rw_vc 5 0x72 2 1 $val  # This is wrong
+      ;;
+    *)
+      echo "	non-existant"
+  esac
+done