meta-ampere: mtjade: add mtjade-gpio-config package

The OCP module in Mt.Jade platform supports the GPIO pins to set the
power state. The SPI0 module also supports the GPIO pins to config SPI
mode. These gpio pins have to be set to the right states before power
off/on. The mtjade-gpio-config package will support that.

Tested:
    1. Power off/on the host.
    2. The OCP and SPI0 gpio pins should be in the corrected states.

Signed-off-by: ThuBaNguyen <thu@os.amperecomputing.com>
Change-Id: I46bca50222b0428f73aa9c05003f650f6ec0cc0b
diff --git a/meta-ampere/meta-jade/conf/machine/mtjade.conf b/meta-ampere/meta-jade/conf/machine/mtjade.conf
index 558a6f4..8c43cbd 100644
--- a/meta-ampere/meta-jade/conf/machine/mtjade.conf
+++ b/meta-ampere/meta-jade/conf/machine/mtjade.conf
@@ -33,6 +33,7 @@
                                    ampere-usbnet \
                                    ampere-flash-utils \
                                    ampere-mac-update \
+                                   mtjade-gpio-config \
                                   "
 
 PREFERRED_PROVIDER_virtual/obmc-chassis-mgmt = "packagegroup-ampere-apps"
diff --git a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config.bb b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config.bb
new file mode 100644
index 0000000..69fedd6
--- /dev/null
+++ b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config.bb
@@ -0,0 +1,44 @@
+SUMMARY = "Ampere Computing LLC Utilities"
+DESCRIPTION = "Ampere Utilities for Mt.Jade systems"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit systemd
+inherit obmc-phosphor-systemd
+
+S = "${WORKDIR}"
+
+SRC_URI = " \
+          file://ampere_gpio_utils.sh \
+          "
+
+DEPENDS = "systemd"
+RDEPENDS_${PN} = "bash"
+
+SYSTEMD_PACKAGES = "${PN}"
+
+SYSTEMD_SERVICE_${PN} = " \
+        ampere-gpio-poweroff@.service \
+        ampere-gpio-poweron@.service \
+        "
+
+# chassis power on
+CHASSIS_POWERON_SVC = "ampere-gpio-poweron@.service"
+CHASSIS_POWERON_INSTMPL = "ampere-gpio-poweron@{0}.service"
+CHASSIS_POWERON_TGTFMT = "obmc-chassis-poweron@{0}.target"
+CHASSIS_POWERON_FMT = "../${CHASSIS_POWERON_SVC}:${CHASSIS_POWERON_TGTFMT}.requires/${CHASSIS_POWERON_INSTMPL}"
+SYSTEMD_LINK_${PN} += "${@compose_list_zip(d, 'CHASSIS_POWERON_FMT', 'OBMC_CHASSIS_INSTANCES')}"
+
+# chassis power off
+CHASSIS_POWEROFF_SVC = "ampere-gpio-poweroff@.service"
+CHASSIS_POWEROFF_INSTMPL = "ampere-gpio-poweroff@{0}.service"
+CHASSIS_POWEROFF_TGTFMT = "obmc-chassis-poweroff@{0}.target"
+CHASSIS_POWEROFF_FMT = "../${CHASSIS_POWEROFF_SVC}:${CHASSIS_POWEROFF_TGTFMT}.requires/${CHASSIS_POWEROFF_INSTMPL}"
+SYSTEMD_LINK_${PN} += "${@compose_list_zip(d, 'CHASSIS_POWEROFF_FMT', 'OBMC_CHASSIS_INSTANCES')}"
+
+do_install() {
+    install -d ${D}/usr/sbin
+    install -m 0755 ${WORKDIR}/ampere_gpio_utils.sh ${D}/${sbindir}/
+}
+
diff --git a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere-gpio-poweroff@.service b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere-gpio-poweroff@.service
new file mode 100644
index 0000000..78862eb
--- /dev/null
+++ b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere-gpio-poweroff@.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ampere set GPIOs before power off
+Requires=op-wait-power-off@%i.service
+Before=op-wait-power-off@%i.service
+Conflicts=obmc-chassis-poweron@%i.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/env ampere_gpio_utils.sh power off
+SyslogIdentifier=ampere_gpio_utils
\ No newline at end of file
diff --git a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere-gpio-poweron@.service b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere-gpio-poweron@.service
new file mode 100644
index 0000000..09aa588
--- /dev/null
+++ b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere-gpio-poweron@.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ampere set GPIOs before power on
+Requires=op-wait-power-on@%i.service
+Before=op-wait-power-on@%i.service
+Conflicts=obmc-chassis-poweroff@%i.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/env ampere_gpio_utils.sh power on
+SyslogIdentifier=ampere_gpio_utils
diff --git a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere_gpio_utils.sh b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere_gpio_utils.sh
new file mode 100644
index 0000000..8e4f455
--- /dev/null
+++ b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-gpio-config/ampere_gpio_utils.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+source /usr/sbin/gpio-defs.sh
+source /usr/sbin/gpio-lib.sh
+
+function usage() {
+    echo "usage: ampere_gpio_utils.sh [power] [on|off]";
+}
+
+set_gpio_power_off() {
+    echo "Setting GPIO before Power off"
+    gpio_configure_output $OCP_AUX_PWREN 1
+    gpio_configure_output $OCP_MAIN_PWREN 0
+    gpio_configure_output $SPI0_PROGRAM_SEL 0
+}
+
+set_gpio_power_on() {
+    echo "Setting GPIO before Power on"
+    gpio_configure_output $OCP_AUX_PWREN 1
+    gpio_configure_output $OCP_MAIN_PWREN 1
+    gpio_configure_output $SPI0_PROGRAM_SEL 1
+    gpio_configure_output $SPI0_BACKUP_SEL 0
+}
+
+if [ $# -lt 2 ]; then
+    echo "Total number of parameter=$#"
+    echo "Insufficient parameter"
+    usage;
+    exit 0;
+fi
+
+if [ $1 == "power" ]; then
+    if [ $2 == "on" ]; then
+        set_gpio_power_on
+    elif [ $2 == "off" ]; then
+        set_gpio_power_off
+    fi
+    exit 0;
+else
+    echo "Invalid parameter1=$1"
+    usage;
+    exit 0;
+fi
+exit 0;
diff --git a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-defs.sh b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-defs.sh
index fce59d5..7c887d4 100644
--- a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-defs.sh
+++ b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-defs.sh
@@ -30,3 +30,11 @@
 ### Common GPIOs
 SYS_PSON_L=42
 BMC_READY=229
+
+### OCP power selection
+OCP_AUX_PWREN=139
+OCP_MAIN_PWREN=140
+
+### SPI0 Mode  selection
+SPI0_PROGRAM_SEL=226
+SPI0_BACKUP_SEL=227
diff --git a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-lib.sh b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-lib.sh
index fcc2d54..8d1aa61 100644
--- a/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-lib.sh
+++ b/meta-ampere/meta-jade/recipes-ampere/platform/mtjade-utils/gpio-lib.sh
@@ -1,7 +1,8 @@
 #!/bin/bash
+source /usr/sbin/gpio-defs.sh
 
 function gpio_number() {
-	GPIO_BASE=$(cat /sys/class/gpio/gpio*/base)
+	GPIO_BASE=$(cat /sys/class/gpio/gpiochip$GPIO_CHIP0_BASE/base)
 	echo $((${GPIO_BASE} + $1))
 }