summaryrefslogtreecommitdiff
path: root/meta-ibm/recipes-phosphor/chassis
diff options
context:
space:
mode:
authorBrad Bishop <bradleyb@fuzziesquirrel.com>2020-04-22 21:06:02 +0300
committerAndrew Geissler <geissonator@yahoo.com>2020-04-27 19:52:12 +0300
commite161514219e0dc8a957dabbb8529fb9fcac4e115 (patch)
tree5de46006517d690f5793eec41281d60611228ecd /meta-ibm/recipes-phosphor/chassis
parenta3f54c8b8cbd50bc86efdc52cfb7d348d8c19d21 (diff)
downloadopenbmc-e161514219e0dc8a957dabbb8529fb9fcac4e115.tar.xz
meta-ibm: move all meta-witherspoon metadata
The metadata common to all IBM systems is confusingly split between meta-ibm and meta-witherspoon. Move everything to meta-ibm. The meta-ibm README is re-written to more accurately reflect the scope of the layer. Allow the configuration samples (bblayers.conf.sample, local.conf.sample) to be sourced from either meta-ibm or meta-witherspoon until such a time that any workflows and tooling have had the opportunity to move to meta-ibm. (From meta-ibm rev: 6e05ef2e90b214eaf4e43ee7027bbbb1d8d09442) Change-Id: I3ec890d5300f9649c974ea6b9dca93a2e8a889ab Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com> Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Diffstat (limited to 'meta-ibm/recipes-phosphor/chassis')
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control.bb36
-rwxr-xr-xmeta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable.sh16
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable@.service16
-rwxr-xr-xmeta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable.sh16
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable@.service15
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable.sh20
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable@.service15
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable.sh16
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable@.service16
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable.sh22
-rw-r--r--meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable@.service15
-rw-r--r--meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%.bbappend1
-rw-r--r--meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%/ibm-ac-server/obmc/power_control2
-rw-r--r--meta-ibm/recipes-phosphor/chassis/power-workarounds.bb26
-rw-r--r--meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds.sh23
-rw-r--r--meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds@.service16
-rw-r--r--meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds.sh134
-rw-r--r--meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds@.service17
-rw-r--r--meta-ibm/recipes-phosphor/chassis/vrm-control.bb42
-rw-r--r--meta-ibm/recipes-phosphor/chassis/vrm-control/ibm-ac-server/ir35221-unbind-bind.sh81
-rw-r--r--meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-bind@.service15
-rw-r--r--meta-ibm/recipes-phosphor/chassis/vrm-control/ir35221-on-unbind@.service14
-rwxr-xr-xmeta-ibm/recipes-phosphor/chassis/vrm-control/mihawk/ir35221-unbind-bind.sh81
-rw-r--r--meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control.sh155
-rw-r--r--meta-ibm/recipes-phosphor/chassis/vrm-control/vrm-control@.service16
25 files changed, 826 insertions, 0 deletions
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control.bb b/meta-ibm/recipes-phosphor/chassis/avsbus-control.bb
new file mode 100644
index 0000000000..2e98aaf90e
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control.bb
@@ -0,0 +1,36 @@
+SUMMARY = "AVSBus control"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch
+inherit obmc-phosphor-systemd
+
+RDEPENDS_${PN} += "i2c-tools"
+
+S = "${WORKDIR}"
+
+SRC_URI += "file://avsbus-enable.sh"
+SRC_URI_append_witherspoon = " file://avsbus-disable.sh"
+
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 ${S}/avsbus-enable.sh ${D}${bindir}/avsbus-enable.sh
+}
+
+do_install_append_witherspoon() {
+ install -m 0755 ${S}/avsbus-disable.sh ${D}${bindir}/avsbus-disable.sh
+}
+
+TMPL_EN= "avsbus-enable@.service"
+TMPL_DIS= "avsbus-disable@.service"
+INSTFMT_EN= "avsbus-enable@{0}.service"
+INSTFMT_DIS= "avsbus-disable@{0}.service"
+TGTFMT = "obmc-chassis-poweron@{0}.target"
+FMT_EN = "../${TMPL_EN}:${TGTFMT}.requires/${INSTFMT_EN}"
+FMT_DIS = "../${TMPL_DIS}:${TGTFMT}.requires/${INSTFMT_DIS}"
+
+SYSTEMD_SERVICE_${PN} += "${TMPL_EN}"
+SYSTEMD_LINK_${PN} += "${@compose_list(d, 'FMT_EN', 'OBMC_CHASSIS_INSTANCES')}"
+SYSTEMD_SERVICE_${PN}_append_witherspoon = " ${TMPL_DIS}"
+SYSTEMD_LINK_${PN}_append_witherspoon = " ${@compose_list(d, 'FMT_DIS', 'OBMC_CHASSIS_INSTANCES')}"
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable.sh b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable.sh
new file mode 100755
index 0000000000..96f6cf8845
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+i2cset -y 4 0x70 0x00 0x00 b # VDD 0 - PAGE set
+i2cset -y 4 0x70 0x01 0x80 b # VDD 0
+i2cset -y 4 0x70 0x00 0x01 b # VCS 0 - PAGE set
+i2cset -y 4 0x70 0x01 0x80 b # VCS 0
+i2cset -y 4 0x70 0x00 0x00 b # VCS 0 - PAGE reset
+i2cset -y 4 0x72 0x00 0x00 b # VDN 0 - PAGE set
+i2cset -y 4 0x72 0x01 0x80 b # VDN 0
+i2cset -y 5 0x70 0x00 0x00 b # VDD 1 - PAGE set
+i2cset -y 5 0x70 0x01 0x80 b # VDD 1
+i2cset -y 5 0x70 0x00 0x01 b # VCS 1 - PAGE set
+i2cset -y 5 0x70 0x01 0x80 b # VCS 1
+i2cset -y 5 0x70 0x00 0x00 b # VCS 1 - PAGE reset
+i2cset -y 5 0x72 0x00 0x00 b # VDN 1 - PAGE set
+i2cset -y 5 0x72 0x01 0x80 b # VDN 1
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable@.service b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable@.service
new file mode 100644
index 0000000000..5396948bc9
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-disable@.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Disable the AVS bus on the VRMs
+Wants=ir35221-on-unbind@%i.service
+After=ir35221-on-unbind@%i.service
+Before=avsbus-enable@%i.service
+Conflicts=obmc-chassis-poweroff@%i.target
+ConditionPathExists=!/run/openbmc/chassis@%i-on
+
+[Service]
+ExecStart=/usr/bin/env avsbus-disable.sh
+SyslogIdentifier=avsbus-disable.sh
+Type=oneshot
+RemainAfterExit=yes
+
+[Install]
+WantedBy=obmc-chassis-poweron@%i.target
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable.sh b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable.sh
new file mode 100755
index 0000000000..67acc730bc
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+i2cset -y 4 0x70 0x00 0x00 b # VDD 0 - PAGE set
+i2cset -y 4 0x70 0x01 0xB0 b # VDD 0
+i2cset -y 4 0x70 0x00 0x01 b # VCS 0 - PAGE set
+i2cset -y 4 0x70 0x01 0xB0 b # VCS 0
+i2cset -y 4 0x70 0x00 0x00 b # VCS 0 - PAGE reset
+i2cset -y 4 0x72 0x00 0x00 b # VDN 0 - PAGE set
+i2cset -y 4 0x72 0x01 0xB0 b # VDN 0
+i2cset -y 5 0x70 0x00 0x00 b # VDD 1 - PAGE set
+i2cset -y 5 0x70 0x01 0xB0 b # VDD 1
+i2cset -y 5 0x70 0x00 0x01 b # VCS 1 - PAGE set
+i2cset -y 5 0x70 0x01 0xB0 b # VCS 1
+i2cset -y 5 0x70 0x00 0x00 b # VCS 1 - PAGE reset
+i2cset -y 5 0x72 0x00 0x00 b # VDN 1 - PAGE set
+i2cset -y 5 0x72 0x01 0xB0 b # VDN 1
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable@.service b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable@.service
new file mode 100644
index 0000000000..34d9e4b0f9
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/mihawk/avsbus-enable@.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Enable the AVS bus on VRMs
+Wants=op-power-start@%i.service
+After=op-power-start@%i.service
+Conflicts=obmc-chassis-poweroff@%i.target
+ConditionPathExists=!/run/openbmc/chassis@%i-on
+
+[Service]
+ExecStart=/usr/bin/env avsbus-enable.sh
+SyslogIdentifier=avsbus-enable.sh
+Type=oneshot
+RemainAfterExit=yes
+
+[Install]
+WantedBy=obmc-chassis-poweron@%i.target
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable.sh b/meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable.sh
new file mode 100644
index 0000000000..7ff607a4ba
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+# For each AVSBus attached power rail set the default boot voltage and then
+# program the OPERATION register to switch to AVSBus mode and update default
+# start voltage to what was last programmed in VOUT_COMMAND. This should be run
+# before power-on. This is platform specific settings that must be
+# updated/removed if not Swift.
+
+i2cset -y 9 0x70 0x00 0x00 b # VDD 0 - PAGE set
+i2cset -y 9 0x70 0x01 0xB0 b # VDD 0
+i2cset -y 9 0x71 0x00 0x01 b # VCS 0 - PAGE set
+i2cset -y 9 0x71 0x01 0xB0 b # VCS 0
+i2cset -y 9 0x71 0x00 0x00 b # VDN 0 - PAGE set
+i2cset -y 9 0x71 0x01 0xB0 b # VDN 0
+
+i2cset -y 10 0x70 0x00 0x00 b # VDD 1 - PAGE set
+i2cset -y 10 0x70 0x01 0xB0 b # VDD 1
+i2cset -y 10 0x71 0x00 0x01 b # VCS 1 - PAGE set
+i2cset -y 10 0x71 0x01 0xB0 b # VCS 1
+i2cset -y 10 0x71 0x00 0x00 b # VDN 1 - PAGE set
+i2cset -y 10 0x71 0x01 0xB0 b # VDN 1
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable@.service b/meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable@.service
new file mode 100644
index 0000000000..45776aa712
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/swift/avsbus-enable@.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Enable the AVS bus on VRMs
+Wants=op-power-start@%i.service
+Before=op-power-start@%i.service
+Conflicts=obmc-chassis-poweroff@%i.target
+ConditionPathExists=!/run/openbmc/chassis@%i-on
+
+[Service]
+ExecStart={bindir}/avsbus-enable.sh
+SyslogIdentifier=avsbus-enable.sh
+Type=oneshot
+RemainAfterExit=yes
+
+[Install]
+WantedBy=obmc-chassis-poweron@%i.target
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable.sh b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable.sh
new file mode 100644
index 0000000000..a158f159ef
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+i2cset -y 4 0x70 0x00 0x00 b # VDD 0 - PAGE set
+i2cset -y 4 0x70 0x01 0x80 b # VDD 0
+i2cset -y 4 0x70 0x00 0x01 b # VCS 0 - PAGE set
+i2cset -y 4 0x70 0x01 0x80 b # VCS 0
+i2cset -y 4 0x70 0x00 0x00 b # VCS 0 - PAGE reset
+i2cset -y 4 0x71 0x00 0x00 b # VDN 0 - PAGE set
+i2cset -y 4 0x71 0x01 0x80 b # VDN 0
+i2cset -y 5 0x70 0x00 0x00 b # VDD 1 - PAGE set
+i2cset -y 5 0x70 0x01 0x80 b # VDD 1
+i2cset -y 5 0x70 0x00 0x01 b # VCS 1 - PAGE set
+i2cset -y 5 0x70 0x01 0x80 b # VCS 1
+i2cset -y 5 0x70 0x00 0x00 b # VCS 1 - PAGE reset
+i2cset -y 5 0x71 0x00 0x00 b # VDN 1 - PAGE set
+i2cset -y 5 0x71 0x01 0x80 b # VDN 1
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable@.service b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable@.service
new file mode 100644
index 0000000000..859f428836
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-disable@.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Disable the AVS bus on the VRMs
+Wants=power-workarounds@%i.service
+After=power-workarounds@%i.service
+Before=vrm-control@%i.service
+Conflicts=obmc-chassis-poweroff@%i.target
+ConditionPathExists=!/run/openbmc/chassis@%i-on
+
+[Service]
+ExecStart=/usr/bin/env avsbus-disable.sh
+SyslogIdentifier=avsbus-disable.sh
+Type=oneshot
+RemainAfterExit=yes
+
+[Install]
+WantedBy=obmc-chassis-poweron@%i.target
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable.sh b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable.sh
new file mode 100644
index 0000000000..6306c58b07
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+i2cset -y 4 0x70 0x00 0x00 b # VDD 0 - PAGE set
+i2cset -y 4 0x70 0x21 0x00 0x01 i # VDD 0 - Set default HW boot voltage
+i2cset -y 4 0x70 0x01 0xB0 b # VDD 0
+i2cset -y 4 0x70 0x00 0x01 b # VCS 0 - PAGE set
+i2cset -y 4 0x70 0x21 0x08 0x01 i # VCS 0 - Set default HW boot voltage
+i2cset -y 4 0x70 0x01 0xB0 b # VCS 0
+i2cset -y 4 0x70 0x00 0x00 b # VCS 0 - PAGE reset
+i2cset -y 4 0x71 0x00 0x00 b # VDN 0 - PAGE set
+i2cset -y 4 0x71 0x21 0x00 0x01 i # VDN 0 - Set default HW boot voltage
+i2cset -y 4 0x71 0x01 0xB0 b # VDN 0
+i2cset -y 5 0x70 0x00 0x00 b # VDD 1 - PAGE set
+i2cset -y 5 0x70 0x21 0x00 0x01 i # VDD 1 - Set default HW boot voltage
+i2cset -y 5 0x70 0x01 0xB0 b # VDD 1
+i2cset -y 5 0x70 0x00 0x01 b # VCS 1 - PAGE set
+i2cset -y 5 0x70 0x21 0x08 0x01 i # VCS 1 - Set default HW boot voltage
+i2cset -y 5 0x70 0x01 0xB0 b # VCS 1
+i2cset -y 5 0x70 0x00 0x00 b # VCS 1 - PAGE reset
+i2cset -y 5 0x71 0x00 0x00 b # VDN 1 - PAGE set
+i2cset -y 5 0x71 0x21 0x00 0x01 i # VDN 1 - Set default HW boot voltage
+i2cset -y 5 0x71 0x01 0xB0 b # VDN 1
diff --git a/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable@.service b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable@.service
new file mode 100644
index 0000000000..b7fb41e245
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/avsbus-control/witherspoon/avsbus-enable@.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Enable the AVS bus on VRMs
+Wants=vrm-control@%i.service
+After=vrm-control@%i.service
+Conflicts=obmc-chassis-poweroff@%i.target
+ConditionPathExists=!/run/openbmc/chassis@%i-on
+
+[Service]
+ExecStart=/usr/bin/env avsbus-enable.sh
+SyslogIdentifier=avsbus-enable.sh
+Type=oneshot
+RemainAfterExit=yes
+
+[Install]
+WantedBy=obmc-chassis-poweron@%i.target
diff --git a/meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%.bbappend b/meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%.bbappend
new file mode 100644
index 0000000000..72d991c7e5
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%/ibm-ac-server/obmc/power_control b/meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%/ibm-ac-server/obmc/power_control
new file mode 100644
index 0000000000..a93bdd758d
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/obmc-op-control-power_%/ibm-ac-server/obmc/power_control
@@ -0,0 +1,2 @@
+POLL_INTERVAL="500"
+PGOOD_TIMEOUT="10"
diff --git a/meta-ibm/recipes-phosphor/chassis/power-workarounds.bb b/meta-ibm/recipes-phosphor/chassis/power-workarounds.bb
new file mode 100644
index 0000000000..af8babb533
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/power-workarounds.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Power device Workarounds"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch
+inherit obmc-phosphor-systemd
+
+RDEPENDS_${PN} += "i2c-tools"
+
+S = "${WORKDIR}"
+
+SRC_URI += "file://power-workarounds.sh"
+
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 ${S}/power-workarounds.sh ${D}${bindir}/power-workarounds.sh
+}
+
+TMPL_WA = "power-workarounds@.service"
+INSTFMT_WA = "power-workarounds@{0}.service"
+TGTFMT = "obmc-chassis-poweron@{0}.target"
+FMT_WA = "../${TMPL_WA}:${TGTFMT}.requires/${INSTFMT_WA}"
+
+SYSTEMD_SERVICE_${PN} += "${TMPL_WA}"
+SYSTEMD_LINK_${PN} += "${@compose_list(d, 'FMT_WA', 'OBMC_CHASSIS_INSTANCES')}"
diff --git a/meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds.sh b/meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds.sh
new file mode 100644
index 0000000000..dc1f4803b6
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+# This should be run before power-on and used to patch/update power specific
+# hardware settings. This is platform specific settings that must be
+# updated/removed if not Swift.
+
+########## Program TPS53915 FSW to desired frequency #########
+# FREQUENCY_CONFIG D3h, bits 2:0
+
+# AVDD, bus 3 addr 1D, set to 600khz
+# 600khz = 1,0,0
+i2cset -y 3 0x1D 0xD3 0x04 b
+
+# 3.3VA, bus 3 addr 1C, set to 600khz
+i2cset -y 3 0x1C 0xD3 0x04 b
+
+# 3.3VB, bus 3 addr 1B, set to 600khz
+i2cset -y 3 0x1B 0xD3 0x04 b
+
+# 5.0V, bus 3 addr 1A, set to 850khz
+# 850khz = 1,1,0
+i2cset -y 3 0x1A 0xD3 0x06 b
+########## END Program TPS53915 FSW to desired frequency #########
+
diff --git a/meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds@.service b/meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds@.service
new file mode 100644
index 0000000000..0926e033bd
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/power-workarounds/swift/power-workarounds@.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Perform power workarounds on VRMs after PGOOD is up
+Wants=obmc-power-on@%i.target
+After=obmc-power-on@%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/power-workarounds.sh
+SyslogIdentifier=power-workarounds.sh
+Type=oneshot
+RemainAfterExit=yes
+
+[Install]
+WantedBy=obmc-chassis-poweron@%i.target
diff --git a/meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds.sh b/meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds.sh
new file mode 100644
index 0000000000..d405797311
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds.sh
@@ -0,0 +1,134 @@
+#!/bin/sh
+
+# ensure VCS ON_OFF_CONFIG set correctly from prior FW drivers
+# A side
+i2cset -y 4 0x70 0x00 0x01 b
+i2cset -y 4 0x70 0x02 0x16 b #respond to ENABLE pin
+i2cset -y 4 0x70 0x00 0x00 b
+# B side
+i2cset -y 5 0x70 0x00 0x01 b
+i2cset -y 5 0x70 0x02 0x16 b #respond to ENABLE pin
+i2cset -y 5 0x70 0x00 0x00 b
+
+# vddio = 1.0V, mdat/sdat PU enabled
+i2cset -y 4 0x12 0xFF 0x00 b # VDD/VCS 0
+i2cset -y 4 0x12 0x2E 0x03 b # VDD/VCS 0
+i2cset -y 4 0x13 0xFF 0x00 b # VDN 0
+i2cset -y 4 0x13 0x2E 0x03 b # VDN 0
+i2cset -y 5 0x12 0xFF 0x00 b # VDD/VCS 1
+i2cset -y 5 0x12 0x2E 0x03 b # VDD/VCS 1
+i2cset -y 5 0x13 0xFF 0x00 b # VDN 1
+i2cset -y 5 0x13 0x2E 0x03 b # VDN 1
+
+# A side VDDR - set to 1.23V
+i2cset -y 4 0x71 0x00 0x01
+i2cset -y 4 0x71 0x21 0x3B 0x01 i
+i2cset -y 4 0x71 0x00 0x00
+
+# B side VDDR - set to 1.23V
+i2cset -y 5 0x71 0x00 0x01
+i2cset -y 5 0x71 0x21 0x3B 0x01 i
+i2cset -y 5 0x71 0x00 0x00
+
+# VDN A - PGOOD_ON threshold
+i2cset -y 4 0x71 0x00 0x00 b # PAGE
+i2cset -y 4 0x71 0x5E 0xCD 0x00 i # set to 0.8V
+
+# VDN B - PGOOD_ON threshold
+i2cset -y 5 0x71 0x00 0x00 b # PAGE
+i2cset -y 5 0x71 0x5E 0xCD 0x00 i # set to 0.8V
+
+# unbind ucd driver to permit i2cset
+ucd_retries=5
+ucd=
+
+ucdpath="/sys/bus/i2c/drivers/ucd9000"
+if [ -e $ucdpath ]
+then
+ ucd=`ls -1 $ucdpath | grep 64`
+ if [ -n "$ucd" ]
+ then
+ echo $ucd > $ucdpath/unbind
+ fi
+fi
+
+# make sure VCS ON_OFF_CONFIG set correctly from old FW releases
+i2cset -y 11 0x64 0x00 0x0E i
+i2cset -y 11 0x64 0x02 0x16 i
+i2cset -y 11 0x64 0x00 0x0F i
+i2cset -y 11 0x64 0x02 0x16 i
+
+## move memory enables to align with VDN (VDN to VDDR leakage issue)
+#GPO_CONFIG_1 (GPIO15) : mem 0 reg enables
+i2cset -y 11 0x64 0xF7 0x00 i
+i2cset -y 11 0x64 0xF8 0x15 0x6E 0x80 0x08 0x00 0x00 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 i
+#GPO_CONFIG_2 (GPIO7) : mem 1 reg enables
+i2cset -y 11 0x64 0xF7 0x01 i
+i2cset -y 11 0x64 0xF8 0x15 0x16 0x80 0x08 0x00 0x00 0x20 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 i
+
+# change VDN delays based on UCD MFR_REVISION setting
+REV=`i2cget -y 11 0x64 0x9B i 2|cut -f2 -d' '`
+if [ "$REV" == "0x01" -o "$REV" == "0x02" ] ; then
+ # use 20ms delay for VDN
+ #TON_DELAY rail 8
+ i2cset -y 11 0x64 0x00 0x07 i
+ i2cset -y 11 0x64 0x60 0x80 0xDA i
+ #TON_DELAY rail 9
+ i2cset -y 11 0x64 0x00 0x08 i
+ i2cset -y 11 0x64 0x60 0x80 0xDA i
+else
+ # use 70ms delay for VDN
+ #TON_DELAY rail 8
+ i2cset -y 11 0x64 0x00 0x07 i
+ i2cset -y 11 0x64 0x60 0x30 0xEA i
+ #TON_DELAY rail 9
+ i2cset -y 11 0x64 0x00 0x08 i
+ i2cset -y 11 0x64 0x60 0x30 0xEA i
+fi
+
+# Raise AVDD +100mV
+i2cset -y 11 0x64 0x00 0x09 i # set PAGE
+i2cset -y 11 0x64 0xF5 0x81 i # set margin_config
+i2cset -y 11 0x64 0x21 0x85 0x33 i # set VOUT_COMMAND
+
+# Increase over-current settings
+#VDD A phase current
+i2cset -y 4 0x12 0xFF 0x04 b # set window register high byte to 4
+i2cset -y 4 0x12 0x3C 0x80 b # Set to 64A
+#VDD B phase current
+i2cset -y 5 0x12 0xFF 0x04 b # set window register high byte to 4
+i2cset -y 5 0x12 0x3C 0x80 b # Set to 64A
+#VDD A master OC fault to 445A
+i2cset -y 4 0x70 0x00 0x00 b # PAGE
+i2cset -y 4 0x70 0x46 0x08DE w
+# VDD A master OC warn to 326A
+i2cset -y 4 0x70 0x4A 0x08A3 w # A308
+#VDD B master OC fault to 445A
+i2cset -y 5 0x70 0x00 0x00 b # PAGE
+i2cset -y 5 0x70 0x46 0x08DE w
+# VDD B master OC warn to 326A
+i2cset -y 5 0x70 0x4A 0x08A3 w
+#VCS phase current to 30A C/C
+i2cset -y 4 0x12 0xFF 0x08 b # set window register to 8
+i2cset -y 4 0x12 0x3C 0x3C b # 30A
+i2cset -y 5 0x12 0xFF 0x08 b # set window register to 8
+i2cset -y 5 0x12 0x3C 0x3C b # 30A
+#VCS master OC to 43A
+i2cset -y 4 0x70 0x00 0x01 # PAGE 1
+i2cset -y 4 0x70 0x46 0x0816 w # OC to 43A
+i2cset -y 5 0x70 0x00 0x01 # PAGE 1
+i2cset -y 5 0x70 0x46 0x0816 w # OC to 43A
+
+# re-bind ucd driver only if we unbound it (i.e. ucd has been set with a value)
+if [ -e $ucdpath -a -n "$ucd" ]; then
+ j=0
+ until [ $j -ge $ucd_retries ] || [ -e $ucdpath/$ucd ]; do
+ j=$((j+1))
+ echo $ucd > $ucdpath/bind || ret=$?
+ if [ $j -gt 1 ]; then
+ echo "rebinding UCD driver. Retry number $j"
+ sleep 1
+ fi
+ done
+ if [ ! -e $ucdpath/$ucd ]; then exit $ret; fi
+fi
diff --git a/meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds@.service b/meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds@.service
new file mode 100644
index 0000000000..3bd1287ee7
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/power-workarounds/witherspoon/power-workarounds@.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Perform power workarounds on VRMs
+Wants=ir35221-on-unbind@%i.service
+After=ir35221-on-unbind@%i.service
+Before=avsbus-disable@%i.service
+Before=obmc-power-on@%i.target
+Conflicts=obmc-chassis-poweroff@%i.target
+ConditionPathExists=!/run/openbmc/chassis@%i-on
+
+[Service]
+ExecStart=/usr/bin/env power-workarounds.sh
+SyslogIdentifier=power-workarounds.sh
+Type=oneshot
+RemainAfterExit=yes
+
+[Install]
+WantedBy=obmc-chassis-poweron@%i.target
diff --git a/meta-ibm/recipes-phosphor/chassis/vrm-control.bb b/meta-ibm/recipes-phosphor/chassis/vrm-control.bb
new file mode 100644
index 0000000000..8a0d7a6eb9
--- /dev/null
+++ b/meta-ibm/recipes-phosphor/chassis/vrm-control.bb
@@ -0,0 +1,42 @@
+SUMMARY = "VRM Overrides"
+DESCRIPTION = "Sets VRMs to custom voltages"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch
+inherit obmc-phosphor-systemd
+
+RDEPENDS_${PN} += "i2c-tools bash"
+
+S = "${WORKDIR}"
+SRC_URI = "file://ir35221-unbind-bind.sh"
+SRC_URI_append_ibm-ac-server = " file://vrm-control.sh"
+
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 ${WORKDIR}/ir35221-unbind-bind.sh ${D}${bindir}/ir35221-unbind-bind.sh
+}
+
+do_install_append_ibm-ac-server() {
+ install -m 0755 ${WORKDIR}/vrm-control.sh ${D}${bindir}/vrm-control.sh
+}
+
+TMPL = "vrm-control@.service"
+INSTFMT = "vrm-control@{0}.service"
+TGTFMT_ON = "obmc-chassis-poweron@{0}.target"
+FMT_ON = "../${TMPL}:${TGTFMT_ON}.requires/${INSTFMT}"
+
+TMPL_ON_IRBIND = "ir35221-on-bind@.service"
+INSTFMT_ON_IRBIND = "ir35221-on-bind@{0}.service"
+FMT_ON_IRBIND = "../${TMPL_ON_IRBIND}:${TGTFMT_ON}.wants/${INSTFMT_ON_IRBIND}"
+
+TMPL_ON_IRUNBIND = "ir35221-on-unbind@.service"
+INSTFMT_ON_IRUNBIND = "ir35221-on-unbind@{0}.service"
+FMT_ON_IRUNBIND = "../${TMPL_ON_IRUNBIND}:${TGTFMT_ON}.requires/${INSTFMT_ON_IRUNBIND}"
+
+SYSTEMD_SERVICE_${PN} += "${TMPL_ON_IRUNBIND} ${TMPL_ON_IRBIND}"
+SYSTEMD_SERVICE_${PN}_append_ibm-ac-server = " ${TMPL}"
+SYSTEMD_LINK_${PN}_append_ibm-ac-server = " ${@compose_list(d, 'FMT_ON', 'OBMC_CHASSIS_INSTANCES')}"
+SYSTEMD_LINK_${PN} += "${@compose_list(d, 'FMT_ON_IRBIND', 'OBMC_CHASSIS_INSTANCES')}"
+SYSTEMD_LINK_${PN} += "${@compose_list(d, 'FMT_ON_IRUNBIND', 'OBMC_CHASSIS_INSTANCES')}"
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 0000000000..85d77412d5
--- /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 0000000000..e6adc05f3a
--- /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 0000000000..7638538d14
--- /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 0000000000..27ca3b9dcd
--- /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 0000000000..c67e244a73
--- /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 0000000000..731ce55c34
--- /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