meta-facebook: yosemite4: Support for NIC power cycle

Description:
- Add the service of NIC power cycle.
  - Trigger NIC power cycle via GPIO
  - BMC will do dc-cycle on the corresponding slots
  - Reconfig network interface

Test Plan:
- Do dc-cycle on the corresponding slots after NIC power cycle: Pass
- Reconnect to BMC console after NIC power cycle: Pass

Change-Id: I28bdb3907e98f79ba124d9f69d50e77953a2a56d
Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@wiwynn.com>
Signed-off-by: Lora Lin <lora.lin.wiwynn@gmail.com>
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/files/pldm_nic_power_cycle b/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/files/pldm_nic_power_cycle
new file mode 100644
index 0000000..da563b3
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/files/pldm_nic_power_cycle
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+# shellcheck source=meta-facebook/meta-yosemite4/recipes-yosemite4/plat-tool/files/yosemite4-common-functions
+. /usr/libexec/yosemite4-common-functions
+
+NIC0_GPIO="EN_NIC0_POWER_BMC_R"
+NIC1_GPIO="EN_NIC1_POWER_BMC_R"
+NIC2_GPIO="EN_NIC2_POWER_BMC_R"
+NIC3_GPIO="EN_NIC3_POWER_BMC_R"
+CONTROL_GPIO=0
+
+if [ "$1" -eq "0" ]; then
+    CONTROL_GPIO=$NIC0_GPIO
+elif [ "$1" -eq "1" ]; then
+    CONTROL_GPIO=$NIC1_GPIO
+elif [ "$1" -eq "2" ]; then
+    CONTROL_GPIO=$NIC2_GPIO
+elif [ "$1" -eq "3" ]; then
+    CONTROL_GPIO=$NIC3_GPIO
+else
+    echo "Invalid NIC number!"
+    exit 1
+fi
+
+corresponding_slot1=$((2*$1+1))
+corresponding_slot2=$((2*$1+2))
+
+# DC power off the corresponding slot
+mfg-tool power-control -p $corresponding_slot1 -a off -s runtime
+mfg-tool power-control -p $corresponding_slot2 -a off -s runtime
+
+# Power off NIC card
+i=1
+while [ "$i" -lt 3 ]
+do
+    set_gpio "$CONTROL_GPIO" 0
+    ret=$?
+    if [ $ret -eq 0 ]; then
+        break
+    fi
+
+    if [ "$i" -eq "3" ]; then
+        echo "Control NIC $1 power off failed!"
+        exit 1
+    fi
+    i=$((i+1))
+done
+
+sleep 1
+
+# Power on NIC card
+i=1
+while [ "$i" -lt 3 ]
+do
+    set_gpio "$CONTROL_GPIO" 1
+    ret=$?
+    if [ $ret -eq 0 ]; then
+        break
+    fi
+
+    if [ "$i" -eq "3" ]; then
+        echo "Control NIC $1 power on failed!"
+        exit 1
+    fi
+    i=$((i+1))
+done
+
+# Wait NIC power on
+sleep 5
+
+# DC power on the corresponding slot
+mfg-tool power-control -p $corresponding_slot1 -a on -s runtime
+mfg-tool power-control -p $corresponding_slot2 -a on -s runtime
+
+# Reconfig network interface
+net_index=$(($1-1))
+if [ "$1" -eq 1 ] || [ "$1" -eq 2 ]; then
+    /usr/libexec/phosphor-gpio-monitor/reconfig-net-interface eth"$net_index"
+fi
+
+exit 0
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/files/pldm_nic_power_cycle@.service b/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/files/pldm_nic_power_cycle@.service
new file mode 100644
index 0000000..0cd8bca
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/files/pldm_nic_power_cycle@.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=PLDM nic power cycle
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/pldm/pldm_nic_power_cycle %i
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/pldm_%.bbappend b/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/pldm_%.bbappend
index 1c7753f..120e9a1 100644
--- a/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/pldm_%.bbappend
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/pldm/pldm_%.bbappend
@@ -2,9 +2,23 @@
 
 SRC_URI += " \
     file://boot_config_setting_attrs.json \
+    file://pldm_nic_power_cycle \
+    file://pldm_nic_power_cycle@.service \
 "
 
+FILES:${PN}:append = " \
+    ${systemd_system_unitdir}/pldm_nic_power_cycle \
+"
+
+SYSTEMD_SERVICE:${PN} += " \
+    pldm_nic_power_cycle@.service \
+    "
+
 do_install:append() {
     install -d ${D}/usr/share/pldm/bios
     install -m 0644 ${WORKDIR}/boot_config_setting_attrs.json ${D}/usr/share/pldm/bios/boot_config_setting_attrs.json
+
+    install -d ${D}${libexecdir}/${PN}
+    install -m 0755 ${WORKDIR}/pldm_nic_power_cycle ${D}${libexecdir}/${PN}/
+    install -m 0644 ${WORKDIR}/pldm_nic_power_cycle@.service ${D}${systemd_system_unitdir}
 }