meta-fii/meta-kudo: support the bios update feature

1. add kudo-bios-update package to support bios update

Signed-off-by: Lancelot Kao <lancelot.kao@fii-usa.com>
Change-Id: Ic245828ed3bb0ddf6d7363e7c2c4d3b8b538aa88
Signed-off-by: XP Chen <xiao-peng.chen@fii-na.com>
Signed-off-by: Mohaimen Alsamarai <Mohaimen.alsamarai@fii-na.com>
diff --git a/meta-fii/meta-kudo/conf/machine/kudo.conf b/meta-fii/meta-kudo/conf/machine/kudo.conf
index f3a3757..a9df131 100644
--- a/meta-fii/meta-kudo/conf/machine/kudo.conf
+++ b/meta-fii/meta-kudo/conf/machine/kudo.conf
@@ -20,7 +20,7 @@
     obmc-host-ipmi \
     "
 
-VIRTUAL-RUNTIME_obmc-fan-control = "phosphor-pid-control"
 PREFERRED_PROVIDER_virtual/obmc-fan-control = "phosphor-pid-control"
 PREFERRED_PROVIDER_virtual/obmc-system-mgmt = "packagegroup-kudo-apps"
 PREFERRED_PROVIDER_virtual/obmc-host-ipmi-hw = "phosphor-ipmi-ssif"
+PREFERRED_PROVIDER_virtual/obmc-flash-mgmt = "packagegroup-kudo-apps"
diff --git a/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update.bb b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update.bb
new file mode 100644
index 0000000..b126bfc
--- /dev/null
+++ b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Phosphor OpenBMC Kudo BIOS Firmware Upgrade Command"
+DESCRIPTION = "Phosphor OpenBMC Kudo BIOS Firmware Upgrade Comman Daemon"
+
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit systemd
+inherit obmc-phosphor-systemd
+
+DEPENDS += "systemd"
+DEPENDS += "phosphor-ipmi-flash"
+RDEPENDS_${PN} += "libsystemd"
+RDEPENDS_${PN} += "bash"
+
+FILES_${PN} += "${datadir}/phosphor-ipmi-flash/config-bios.json"
+
+SRC_URI_append_kudo = " \ 
+    file://phosphor-ipmi-flash-bios-update.service \
+    file://config-bios.json \
+    "
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE_${PN}_append_kudo = " \
+    phosphor-ipmi-flash-bios-update.service \
+    "
+
+do_install () {
+    install -d ${D}${datadir}/phosphor-ipmi-flash
+    install -m 0644 ${WORKDIR}/config-bios.json ${D}${datadir}/phosphor-ipmi-flash
+    install -d ${D}${systemd_system_unitdir}
+    install -m 0644 ${WORKDIR}/phosphor-ipmi-flash-bios-update.service  ${D}${systemd_system_unitdir}
+}
diff --git a/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update/config-bios.json b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update/config-bios.json
new file mode 100644
index 0000000..de23823
--- /dev/null
+++ b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update/config-bios.json
@@ -0,0 +1,19 @@
+[{
+    "blob": "/flash/bios",
+    "handler": {
+        "type": "file",
+        "path": "/run/initramfs/bios-image"
+    },
+    "actions": {
+        "preparation": {
+            "type": "skip"
+        },
+        "verification": {
+            "type": "skip"
+        },
+        "update": {
+            "type": "systemd",
+            "unit": "phosphor-ipmi-flash-bios-update.service"
+        }
+    }
+}]
diff --git a/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update/phosphor-ipmi-flash-bios-update.service b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update/phosphor-ipmi-flash-bios-update.service
new file mode 100644
index 0000000..1702153
--- /dev/null
+++ b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-bios-update/phosphor-ipmi-flash-bios-update.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Phosphor-ipmi-flash update BIOS firmware service
+
+[Service]
+ExecStart=/usr/sbin/kudo-fw.sh bios /run/initramfs/bios-image
+Type=oneshot
\ No newline at end of file
diff --git a/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw.bb b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw.bb
new file mode 100644
index 0000000..3f5a30e
--- /dev/null
+++ b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw.bb
@@ -0,0 +1,34 @@
+SUMMARY = "Phosphor OpenBMC Kudo Firmware Upgrade Command"
+DESCRIPTION = "Phosphor OpenBMC Kudo Firmware Upgrade Comman Daemon"
+
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit systemd
+inherit obmc-phosphor-systemd
+
+DEPENDS += "systemd"
+DEPENDS += "phosphor-ipmi-flash"
+RDEPENDS_${PN} += "libsystemd"
+RDEPENDS_${PN} += "bash"
+
+
+SRC_URI_append_kudo = " \
+    file://kudo-fw.sh \
+    file://kudo-fw-ver.service \
+    file://kudo-fw-ver.sh \
+    "
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE_${PN}_append_kudo = " \
+    kudo-fw-ver.service \
+    "
+
+do_install () {
+    install -d ${D}/${sbindir}
+    install -m 0755 ${WORKDIR}/kudo-fw.sh ${D}/${sbindir}/kudo-fw.sh
+    install -m 0755 ${WORKDIR}/kudo-fw-ver.sh ${D}/${sbindir}/kudo-fw-ver.sh
+    install -d ${D}${systemd_system_unitdir}
+    install -m 0644 ${WORKDIR}/kudo-fw-ver.service ${D}${systemd_system_unitdir}
+}
diff --git a/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw-ver.service b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw-ver.service
new file mode 100644
index 0000000..24e21d2
--- /dev/null
+++ b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw-ver.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Firmware Version Daemon
+
+[Service]
+RemainAfterExit=yes
+Type=oneshot
+ExecStart=/usr/sbin/kudo-fw-ver.sh
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw-ver.sh b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw-ver.sh
new file mode 100644
index 0000000..2c50298
--- /dev/null
+++ b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw-ver.sh
@@ -0,0 +1,27 @@
+
+#!/bin/bash
+BMC_CPLD_VER_FILE="/run/cpld0.version"
+MB_CPLD_VER_FILE="/run/cpld1.version"
+ver=''
+
+function fw_rev() {
+    case $1 in
+    cpldb)
+        rsp=($(i2cget -y -f -a 13 0x76 0x00 i 5))
+        ver=$(printf '%d.%d.%d.%d' ${rsp[6]} ${rsp[5]} ${rsp[4]} ${rsp[3]})
+        ;;
+    cpldm)
+        I2C_BUS_DEV=$(readlink "/sys/bus/i2c/devices/4-0077/channel-2" | cut -c 8-)
+        rsp=($(i2cget -y -f -a $I2C_BUS_DEV 0x76 0x00 i 5))
+        ver=$(printf '%d.%d.%d.%d' ${rsp[6]} ${rsp[5]} ${rsp[4]} ${rsp[3]})
+        ;;
+    *)
+        ;;
+    esac
+}
+fw_rev cpldb
+echo "BMC CPLD version : ${ver}"
+echo "${ver}" > "${BMC_CPLD_VER_FILE}"
+fw_rev cpldm
+echo "MB CPLD version  : ${ver}"
+echo "${ver}" > "${MB_CPLD_VER_FILE}"
diff --git a/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw.sh b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw.sh
new file mode 100644
index 0000000..e42795f
--- /dev/null
+++ b/meta-fii/meta-kudo/recipes-kudo/kudo-fw-utility/kudo-fw/kudo-fw.sh
@@ -0,0 +1,120 @@
+#!/bin/bash
+
+devpath="/sys/bus/i2c/devices/13-0077/driver"
+
+# set_gpio_ctrl
+# pin #, direction, high(1)/low(0)
+function set_gpio_ctrl() {
+  echo $1 > /sys/class/gpio/export
+  echo $2 > /sys/class//gpio/gpio$1/direction
+  echo $3 > /sys/class/gpio/gpio$1/value
+  echo $1 > /sys/class/gpio/unexport
+  sleep 1
+}
+
+function fwbios() {
+  KERNEL_FIU_ID="c0000000.spi"
+  KERNEL_SYSFS_FIU="/sys/bus/platform/drivers/NPCM-FIU"
+
+  # switch the SPI mux from Host to BMC
+  i2cset -y -f -a 13 0x76 0x10 0x01
+
+  # rescan the spi bus
+  if [ -d "${KERNEL_SYSFS_FIU}/${KERNEL_FIU_ID}" ]; then
+    echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/unbind
+    sleep 1
+  fi
+  echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/bind
+
+  # write to the mtd device
+  BIOS_MTD=$(cat /proc/mtd | grep "bios" | sed -n 's/^\(.*\):.*/\1/p')
+
+  if [ ! -f $1 ]; then
+    echo " Cannot find the" $1 "image file"
+    exit 1
+  fi
+
+  echo "Flashing BIOS @/dev/$BIOS_MTD"
+  flashcp -v $1 /dev/$BIOS_MTD
+  wait
+
+  # switch the SPI mux from BMC to Host
+  if [ -d "${KERNEL_SYSFS_FIU}/${KERNEL_FIU_ID}" ]; then
+    echo "${KERNEL_FIU_ID}" > "${KERNEL_SYSFS_FIU}"/unbind
+  fi
+  i2cset -y -f -a 13 0x76 0x10 0x00
+
+  if [[ $(find ${1} -type f -size +17156k 2>/dev/null) ]]; then
+    echo "Extracting the SCP from the image"
+    dd if=$1 bs=1024 skip=17156 count=256 of=/run/initramfs/myscp.img
+    fwscp /run/initramfs/myscp.img
+  fi
+  rm -f $1
+}
+
+
+function fwbmccpld() {
+  # BMC_JTAG_MUX_1 #218 0:BMC 1:MB
+  set_gpio_ctrl 218 out 0
+  loadsvf -d /dev/jtag0 -s $1 -m 0
+  wait
+  set_gpio_ctrl 218 out 1
+  rm -f $1
+}
+
+function fwmbcpld() {
+  # BMC_JTAG_MUX_1 #218 0:BMC 1:MB
+  # BMC_JTAG_SEL #164 0:BMC 1:CPU
+  set_gpio_ctrl 218 out 1
+  set_gpio_ctrl 164 out 1
+  loadsvf -d /dev/jtag0 -s $1 -m 0
+  wait
+  rm -f $1
+}
+
+function fwscp() {
+  # BMC_I2C_BACKUP_SEL #168 0:failover, 1:main
+  # BMC_CPU_EEPROM_I2C_SEL #85 0:BMC, 1:CPU
+  set_gpio_ctrl 168 out 1
+  set_gpio_ctrl 85 out 0
+  I2C_BUS_DEV=$(ls -l $devpath/"13-0077/" | grep channel-0 | awk '{ print $11}' | cut -c 8-)
+  ampere_eeprom_prog -b $I2C_BUS_DEV -s 0x50 -p -f $1
+  wait
+  set_gpio_ctrl 85 out 1
+  set_gpio_ctrl 168 out 1
+  rm -f $1
+}
+
+function fwscpback() {
+  # BMC_I2C_BACKUP_SEL #168 0:failover, 1:main
+  # BMC_CPU_EEPROM_I2C_SEL #85 0:BMC, 1:CPU
+  set_gpio_ctrl 168 out 0
+  set_gpio_ctrl 85 out 0
+  I2C_BUS_DEV=$(ls -l $devpath/"13-0077/" | grep channel-0 | awk '{ print $11}' | cut -c 8-)
+  ampere_eeprom_prog -b $I2C_BUS_DEV -s 0x50 -p -f $1
+  wait
+  set_gpio_ctrl 85 out 1
+  set_gpio_ctrl 168 out 1
+  rm -f $1
+}
+
+
+case $1 in
+  bios)
+    fwbios $2
+    ;;
+  bmccpld)
+    fwbmccpld $2
+    ;;
+  mbcpld)
+    fwmbcpld $2
+    ;;
+  scp)
+    fwscp $2
+    ;;
+  scpback)
+    fwscpback $2
+    ;;
+  *)
+    ;;
+esac
diff --git a/meta-fii/meta-kudo/recipes-kudo/packagegroups/packagegroup-kudo-apps.bb b/meta-fii/meta-kudo/recipes-kudo/packagegroups/packagegroup-kudo-apps.bb
index be87945..8601f96 100644
--- a/meta-fii/meta-kudo/recipes-kudo/packagegroups/packagegroup-kudo-apps.bb
+++ b/meta-fii/meta-kudo/recipes-kudo/packagegroups/packagegroup-kudo-apps.bb
@@ -5,26 +5,27 @@
 
 PROVIDES = "${PACKAGES}"
 PACKAGES = " \
-     ${PN}-kudo-system \
-     ${PN}-kudo-common-utils \
-     "
+    ${PN}-kudo-system \
+    ${PN}-kudo-fw \
+    "
 
 PROVIDES += "virtual/obmc-system-mgmt"
 
 RPROVIDES_${PN}-kudo-system += "virtual-obmc-system-mgmt"
+RPROVIDES_${PN}-kudo-fw += "virtual-obmc-system-mgmt"
 
 SUMMARY_${PN}-kudo-system = "KUDO System"
 RDEPENDS_${PN}-kudo-system = " \
-    google-ipmi-sys \
-    google-ipmi-i2c \
-    "
-
-SUMMARY_${PN}-kudo-common-utils = "KUDO common utils"
-RDEPENDS_${PN}-kudo-common-utils = " \
     ipmitool \
-    phosphor-webui \
-    phosphor-host-postd \
+    ethtool \
+    memtester \
     loadsvf \
     obmc-console \
-    phosphor-sel-logger \
+    usb-network \
+    "
+
+SUMMARY_${PN}-kudo-fw = "KUDO Firmware"
+RDEPENDS_${PN}-kudo-fw = " \
+    kudo-fw \
+    kudo-bios-update \
     "
diff --git a/meta-fii/meta-kudo/recipes-phosphor/image/obmc-phosphor-image.bbappend b/meta-fii/meta-kudo/recipes-phosphor/image/obmc-phosphor-image.bbappend
index f0eb972..dd5b10f 100644
--- a/meta-fii/meta-kudo/recipes-phosphor/image/obmc-phosphor-image.bbappend
+++ b/meta-fii/meta-kudo/recipes-phosphor/image/obmc-phosphor-image.bbappend
@@ -1,6 +1,3 @@
-OBMC_IMAGE_EXTRA_INSTALL_append_kudo = " ipmitool"
-OBMC_IMAGE_EXTRA_INSTALL_append_kudo = " ethtool"
-OBMC_IMAGE_EXTRA_INSTALL_append_kudo = " loadsvf"
 OBMC_IMAGE_EXTRA_INSTALL_append_kudo = " google-ipmi-sys"
 OBMC_IMAGE_EXTRA_INSTALL_append_kudo = " google-ipmi-i2c"
 OBMC_IMAGE_EXTRA_INSTALL_append_kudo = " phosphor-ipmi-blobs"