diff options
Diffstat (limited to 'meta-ibm/recipes-phosphor/chassis/vrm-control')
6 files changed, 362 insertions, 0 deletions
diff --git a/meta-ibm/recipes-phosphor/chassis/vrm-control/ibm-ac-server/ir35221-unbind-bind.sh b/meta-ibm/recipes-phosphor/chassis/vrm-control/ibm-ac-server/ir35221-unbind-bind.sh new file mode 100644 index 000000000..85d77412d --- /dev/null +++ b/meta-ibm/recipes-phosphor/chassis/vrm-control/ibm-ac-server/ir35221-unbind-bind.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# ######################################################### +# Script to run on witherspoon BMC to unbind/bind the ir35221 +# driver's devices + +status=0 +max_retries=3 +driver_path="/sys/bus/i2c/drivers/ir35221/" +platform_path="/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/" + +unbind_driver () { + echo $1 > $driver_path/unbind +} + +bind_driver () { + device=$1 + tries=0 + + until [ $tries -ge $max_retries ]; do + tries=$((tries+1)) + ret=0 + echo $device > $driver_path/bind || ret=$? + if [ $ret -ne 0 ]; then + echo "VRM $1 bind failed. Try $tries" + sleep 1 + else + tries=$((max_retries+1)) + fi + done + + #Script will return a nonzero value if any binds fail. + if [ $ret -ne 0 ]; then + status=$ret + fi +} + +if [ "$1" = "unbind" ] +then + if [ -e $driver_path/4-0070 ] + then + unbind_driver "4-0070" + fi + + if [ -e $driver_path/4-0071 ] + then + unbind_driver "4-0071" + fi + + if [ -e $driver_path/5-0070 ] + then + unbind_driver "5-0070" + fi + + if [ -e $driver_path/5-0071 ] + then + unbind_driver "5-0071" + fi +elif [ "$1" = "bind" ] +then + if [ -e $platform_path/1e78a140.i2c-bus/i2c-4/4-0070 ] + then + bind_driver "4-0070" + fi + + if [ -e $platform_path/1e78a140.i2c-bus/i2c-4/4-0071 ] + then + bind_driver "4-0071" + fi + + if [ -e $platform_path/1e78a180.i2c-bus/i2c-5/5-0070 ] + then + bind_driver "5-0070" + fi + + if [ -e $platform_path/1e78a180.i2c-bus/i2c-5/5-0071 ] + then + bind_driver "5-0071" + fi +fi + +exit $status diff --git a/meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-bind@.service b/meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-bind@.service new file mode 100644 index 000000000..e6adc05f3 --- /dev/null +++ b/meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-bind@.service @@ -0,0 +1,15 @@ +[Unit] +Description=Power on bind ir35221 device driver devs +After=avsbus-enable@%i.service +Wants=obmc-host-start-pre@%i.target +Before=obmc-host-start-pre@%i.target +Conflicts=obmc-chassis-poweroff@%i.target +ConditionPathExists=!/run/openbmc/chassis@%i-on + +[Service] +ExecStart=/usr/bin/ir35221-unbind-bind.sh bind +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=obmc-chassis-poweron@%i.target diff --git a/meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-unbind@.service b/meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-unbind@.service new file mode 100644 index 000000000..7638538d1 --- /dev/null +++ b/meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-unbind@.service @@ -0,0 +1,14 @@ +[Unit] +Description=power on mode unbind ir35221 device driver devs +Wants=obmc-power-start-pre@%i.target +Before=obmc-power-start-pre@%i.target +Conflicts=obmc-chassis-poweroff@%i.target +ConditionPathExists=!/run/openbmc/chassis@%i-on + +[Service] +ExecStart=/usr/bin/ir35221-unbind-bind.sh unbind +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=obmc-chassis-poweron@%i.target diff --git a/meta-ibm/recipes-phosphor/chassis/vrm-control/mihawk/ir35221-unbind-bind.sh b/meta-ibm/recipes-phosphor/chassis/vrm-control/mihawk/ir35221-unbind-bind.sh new file mode 100755 index 000000000..27ca3b9dc --- /dev/null +++ b/meta-ibm/recipes-phosphor/chassis/vrm-control/mihawk/ir35221-unbind-bind.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# ######################################################### +# Script to run on mihawk BMC to unbind/bind the ir35221 +# driver's devices + +status=0 +max_retries=3 +driver_path="/sys/bus/i2c/drivers/ir35221/" +platform_path="/sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/" + +unbind_driver () { + echo $1 > $driver_path/unbind +} + +bind_driver () { + device=$1 + tries=0 + + until [ $tries -ge $max_retries ]; do + tries=$((tries+1)) + ret=0 + echo $device > $driver_path/bind || ret=$? + if [ $ret -ne 0 ]; then + echo "VRM $1 bind failed. Try $tries" + sleep 1 + else + tries=$((max_retries+1)) + fi + done + + #Script will return a nonzero value if any binds fail. + if [ $ret -ne 0 ]; then + status=$ret + fi +} + +if [ "$1" = "unbind" ] +then + if [ -e $driver_path/4-0070 ] + then + unbind_driver "4-0070" + fi + + if [ -e $driver_path/4-0072 ] + then + unbind_driver "4-0072" + fi + + if [ -e $driver_path/5-0070 ] + then + unbind_driver "5-0070" + fi + + if [ -e $driver_path/5-0072 ] + then + unbind_driver "5-0072" + fi +elif [ "$1" = "bind" ] +then + if [ -e $platform_path/1e78a140.i2c-bus/i2c-4/4-0070 ] + then + bind_driver "4-0070" + fi + + if [ -e $platform_path/1e78a140.i2c-bus/i2c-4/4-0072 ] + then + bind_driver "4-0072" + fi + + if [ -e $platform_path/1e78a180.i2c-bus/i2c-5/5-0070 ] + then + bind_driver "5-0070" + fi + + if [ -e $platform_path/1e78a180.i2c-bus/i2c-5/5-0072 ] + then + bind_driver "5-0072" + fi +fi + +exit $status diff --git a/meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control.sh b/meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control.sh new file mode 100644 index 000000000..c67e244a7 --- /dev/null +++ b/meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control.sh @@ -0,0 +1,155 @@ +#!/bin/bash +# ######################################################### +# Script to run on witherspoon 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)}'` +} + + +# ######################################################### +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 vppa vddb vcsb vdnb viob vddrb vppb + exit +fi + +if [ $1 == "-h" ] +then + echo " Usage: vrm [<rail>=[value] [<rail>=[value]] ...]" + echo " rail: vdda vcsa vdna vioa vddra vppa vddb vcsb vdnb viob vddrb vppb vdnd viod" + 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 + 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 0x71 2 0 $val + ;; + vdnb) + rw_vc 5 0x71 2 0 $val + ;; + vioa) + rw_vc 4 0x40 2 x $val + ;; + viob) + rw_vc 5 0x40 2 x $val + ;; + vddra) + rw_vc 4 0x71 2 1 $val + ;; + vddrb) + rw_vc 5 0x71 2 1 $val + ;; + vppa) + rw_vc 12 0x41 2 x $val + ;; + vppb) + rw_vc 13 0x41 2 x $val + ;; + vdnd) + rw_vc 2 0x70 2 0 $val + ;; + viod) + rw_vc 2 0x70 2 1 $val + ;; + *) + echo " non-existant" + esac +done diff --git a/meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control@.service b/meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control@.service new file mode 100644 index 000000000..731ce55c3 --- /dev/null +++ b/meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control@.service @@ -0,0 +1,16 @@ +[Unit] +Description=Apply voltage overrides to VRMs +Wants=avsbus-disable@%i.service +After=avsbus-disable@%i.service +Before=avsbus-enable@%i.service +Conflicts=obmc-chassis-poweroff@%i.target +ConditionPathExists=!/run/openbmc/chassis@%i-on + +[Service] +ExecStart=/usr/bin/env vrm-control.sh vdna=0.9 vdnb=0.9 +SyslogIdentifier=vrm-control.sh +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=obmc-chassis-poweron@%i.target |