meta-ampere: mtmitchell: handle power sequence failure

This commit supports log the power on sequence to analyze power on
failure. This would include:
- PSU power good monitoring to indicate PSU is powered on.
- System power good monitoring to indicate CPU is powered on.

Tested:
1. Power on Host, check the Event logs identify the system
   /redfish/v1/Systems/system/LogServices/EventLog/Entries
   "Message": "Host firmware boots with 1 Processor",
2. Check the Event logs in case power on failure.

Signed-off-by: Hieu Huynh <hieuh@os.amperecomputing.com>
Signed-off-by: Thang Tran <thuutran@amperecomputing.com>
Change-Id: I15237d5f6be454b628529fce43424514bf445d53
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl.bbappend b/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl.bbappend
new file mode 100644
index 0000000..6a3bf86
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl.bbappend
@@ -0,0 +1,16 @@
+FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
+
+SRC_URI += " \
+                file://ampere_power_on_failure_check.sh \
+                file://ampere-host-on-host-check-override.conf \
+           "
+
+FILES:${PN} += "${systemd_system_unitdir}/ampere-host-on-host-check@0.service.d"
+
+do_install:append() {
+     install -m 0755 ${WORKDIR}/ampere_power_on_failure_check.sh ${D}/${sbindir}/
+
+     install -d ${D}${systemd_system_unitdir}/ampere-host-on-host-check@0.service.d
+     install -m 644 ${WORKDIR}/ampere-host-on-host-check-override.conf \
+        ${D}${systemd_system_unitdir}/ampere-host-on-host-check@0.service.d
+}
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl/ampere-host-on-host-check-override.conf b/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl/ampere-host-on-host-check-override.conf
new file mode 100644
index 0000000..ece22f2
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl/ampere-host-on-host-check-override.conf
@@ -0,0 +1,4 @@
+[Service]
+ExecStartPre=/bin/sh -c "ampere_power_on_failure_check.sh check_cpu"
+ExecStartPost=/bin/sleep 3
+ExecStopPost=/bin/sh -c "ampere_power_on_failure_check.sh check_power"
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl/ampere_power_on_failure_check.sh b/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl/ampere_power_on_failure_check.sh
new file mode 100644
index 0000000..4748706
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl/ampere_power_on_failure_check.sh
@@ -0,0 +1,110 @@
+#!/bin/bash
+
+# shellcheck disable=SC2046
+
+function check_cpu_presence()
+{
+	# Check CPU presence, identify whether it is 1P or 2P system
+	s0_presence=$(gpioget $(gpiofind presence-cpu0))
+	s1_presence=$(gpioget $(gpiofind presence-cpu1))
+	if [ "$s0_presence" == "0" ] && [ "$s1_presence" == "0" ]; then
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "Host firmware boots with 2 Processor"
+	elif [ "$s0_presence" == "0" ]; then
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "Host firmware boots with 1 Processor"
+	else
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "No Processor is present"
+	fi
+}
+
+function get_dbus_property()
+{
+	service=$1
+	object_path=$2
+	interface=$3
+	property=$4
+
+	value=$(busctl get-property "$service" "$object_path" "$interface" "$property" | cut -d" " -f2)
+
+	echo "$value"
+}
+
+function is_ATX_power_good()
+{
+	pgood_value=$(get_dbus_property org.openbmc.control.Power \
+		/org/openbmc/control/power0 org.openbmc.control.Power pgood)
+
+	if [ "$pgood_value" == "0" ]
+	then
+		echo 0
+	else
+		echo 1
+	fi
+}
+
+function is_PCP_power_good()
+{
+	pcp_value=$(get_dbus_property xyz.openbmc_project.State.HostCondition.Gpio \
+		/xyz/openbmc_project/Gpios/host0 xyz.openbmc_project.Condition.HostFirmware \
+		CurrentFirmwareCondition)
+
+	if [[ "$pcp_value" == *".Running"* ]]
+	then
+		echo 1
+	else
+		echo 0
+	fi
+}
+
+function check_power_state()
+{
+	echo "ATX power good checking"
+	state=$(is_ATX_power_good)
+	if [ "$state" == "0" ]
+	then
+		echo "Error: Failed to turn on ATX Power"
+		ampere_add_redfishevent.sh OpenBMC.0.1.PowerSupplyPowerGoodFailed.Critical "60000"
+		exit 0
+	else
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "ATX Power is ON"
+	fi
+
+	echo "Soc power good checking"
+	state=$(gpioget $(gpiofind s0-soc-pgood))
+	if [ "$state" == "0" ]
+	then
+		echo "Error: Soc domain power failure"
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereCritical.Critical "Soc domain, power failure"
+		exit 0
+	else
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "SoC power domain is ON"
+	fi
+
+	echo "PCP power good checking"
+	state=$(is_PCP_power_good)
+	if [ "$state" == "0" ]
+	then
+		echo "Error: PCP domain power failure. Power off Host"
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereCritical.Critical "PCP domain, power failure"
+		busctl set-property xyz.openbmc_project.State.Chassis \
+			/xyz/openbmc_project/state/chassis0 \
+			xyz.openbmc_project.State.Chassis RequestedPowerTransition s \
+			xyz.openbmc_project.State.Chassis.Transition.Off
+		exit 0
+	else
+		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "PCP power is ON"
+	fi
+}
+
+action=$1
+
+if [ "$action" == "check_cpu" ]
+then
+	echo "Check CPU presence"
+	check_cpu_presence
+elif [ "$action" == "check_power" ]
+then
+	echo "Check Power state"
+	check_power_state
+fi
+
+exit 0
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/mtmitchell_platform_gpios_init.sh b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/mtmitchell_platform_gpios_init.sh
index 57a951a..74a7afd 100644
--- a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/mtmitchell_platform_gpios_init.sh
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/mtmitchell_platform_gpios_init.sh
@@ -108,7 +108,8 @@
     "ps0-ac-loss-n"
     "ps1-ac-loss-n"
     "s1-ddr-save"
-    "sys-pgood"
+    "s0-fw-boot-ok"
+    "s1-pcp-pgood"
     "presence-cpu1"
     "s0-fault-alert"
     "s0-sys-auth-failure-n"