meta-facebook: yosemite4: Fan board eFuse fault event

Summary:
The system shall register an event in response to fan board eFuse fault.
BMC is triggered by INT_FANBOARD0_IOEXP_N or INT_FANBOARD1_IOEXP_N to
identify which fan board has eFuse fault.
Then, BMC reads relevant fan board IOE to check affected eFuse.

Test Plan:
Pull FLT_EFUSE0_N low to make INT_FANBOARD0_IOEXP_N be low.

Testing:
Take fan board 0 and eFuse 0 for example.

1. Check fan board 0 IOE init status
root@bmc:~# i2ctransfer -f -y 30 w1@0x22 0 r1
0xff

2. Pull FLT_EFUSE0_N low and check fan board 0 IOE init status
root@bmc:~# i2ctransfer -f -y 30 w1@0x22 0 r1
0xfb

3. Check event log
root@bmc:~# mfg-tool log-display
...
    "2": {
        "additional_data": [
            "FAULT=eFuse0"
        ],
        "event_id": "",
        "message": "Fan board 0 eFuse fault",
        "resolution": "",
        "resolved": false,
        "severity": "xyz.openbmc_project.Logging.Entry.Level.Error",
        "timestamp": "2024-02-27T17:31:55.420000000Z",
        "updated_timestamp": "2024-02-27T17:31:55.420000000Z"
    }

Change-Id: Idb1a6a767b1e412931d229eb9cfaac7624fdec0a
Signed-off-by: Yikai Tsai <yikai.tsai.wiwynn@gmail.com>
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/fan-board-efuse-fault b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/fan-board-efuse-fault
new file mode 100644
index 0000000..641db4b
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/fan-board-efuse-fault
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+log_message() {
+    local MESSAGE="Fan board $1 eFuse fault"
+    local COMBINED_INFO="eFuse$2"
+
+    busctl call \
+        xyz.openbmc_project.Logging /xyz/openbmc_project/logging \
+        xyz.openbmc_project.Logging.Create Create "ssa{ss}" "$MESSAGE" \
+        "xyz.openbmc_project.Logging.Entry.Level.Error" 1 "FAULT" "$COMBINED_INFO"
+}
+
+
+
+# if $1 == 0, fan board 0 IOE is at i2c-30 0x22.
+# if $1 == 1, fan board 1 IOE is at i2c-31 0x22.
+
+if [ "$1" -eq 0 ]; then
+    i2c_bus=30
+    ioe_addr=0x22
+    fan_board=0
+elif [ "$1" -eq 1 ]; then
+    i2c_bus=31
+    ioe_addr=0x22
+    fan_board=1
+else
+    echo "Invalid input. Please provide 0 or 1."
+    exit 1
+fi
+
+
+# i2ctranster to check which slot got interrupt
+read -r INT_BYTE <<< "$(i2ctransfer -f -y $i2c_bus w1@$ioe_addr 0 r1)"
+INT_BYTE=$((INT_BYTE >> 2))
+
+# Traverse INT_BYTE
+count=0
+EFUSE_RANGE=6
+while [ $count -lt $EFUSE_RANGE ]
+do
+    fault=$(( (INT_BYTE >> count) & 1 ))
+    # if fault[i] == 0, means efuse_x got fault
+    if [ $fault -eq 0 ]; then
+        log_message $fan_board $count
+    fi
+
+    count=$((count + 1))
+done
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/fan-board-efuse-fault@.service b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/fan-board-efuse-fault@.service
new file mode 100644
index 0000000..0042d84
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/fan-board-efuse-fault@.service
@@ -0,0 +1,7 @@
+[Unit]
+Description=fan board power-fault:%i
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/phosphor-gpio-monitor/fan-board-efuse-fault %i
+SyslogIdentifier=fan-board-efuse-fault%i
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/yosemite4-phosphor-multi-gpio-monitor.json b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/yosemite4-phosphor-multi-gpio-monitor.json
index 88c72d5..a5db14f 100644
--- a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/yosemite4-phosphor-multi-gpio-monitor.json
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/yosemite4-phosphor-multi-gpio-monitor.json
@@ -325,5 +325,25 @@
                 "slot-power-fault@58.service"]
         },
         "Continue": true
+    },
+    {
+        "Name": "INT_FANBOARD1_IOEXP_N",
+        "LineName": "INT_FANBOARD1_IOEXP_N",
+        "EventMon": "FALLING",
+        "Targets": {
+            "FALLING": [
+                "fan-board-efuse-fault@1.service"]
+        },
+        "Continue": true
+    },
+    {
+        "Name": "INT_FANBOARD0_IOEXP_N",
+        "LineName": "INT_FANBOARD0_IOEXP_N",
+        "EventMon": "FALLING",
+        "Targets": {
+            "FALLING": [
+                "fan-board-efuse-fault@0.service"]
+        },
+        "Continue": true
     }
 ]
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend
index 91bfebc..26006a2 100644
--- a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend
@@ -20,6 +20,8 @@
             file://slot-hsc-fault@.service \
             file://slot-power-fault \
             file://slot-power-fault@.service \
+            file://fan-board-efuse-fault \
+            file://fan-board-efuse-fault@.service \
             "
 
 RDEPENDS:${PN}:append = " bash"
@@ -36,6 +38,7 @@
     rescan-wf-bic@.service \
     slot-hsc-fault@.service \
     slot-power-fault@.service \
+    fan-board-efuse-fault@.service \
     reconfig-net-interface@.service \
     "
 
@@ -55,6 +58,7 @@
     install -m 0644 ${WORKDIR}/rescan-wf-bic@.service ${D}${systemd_system_unitdir}/
     install -m 0644 ${WORKDIR}/slot-hsc-fault@.service ${D}${systemd_system_unitdir}/
     install -m 0644 ${WORKDIR}/slot-power-fault@.service ${D}${systemd_system_unitdir}/
+    install -m 0644 ${WORKDIR}/fan-board-efuse-fault@.service ${D}${systemd_system_unitdir}/
     install -d ${D}${libexecdir}/${PN}
     install -m 0755 ${WORKDIR}/probe-slot-device ${D}${libexecdir}/${PN}/
     install -m 0755 ${WORKDIR}/reconfig-net-interface ${D}${libexecdir}/${PN}/
@@ -62,6 +66,7 @@
     install -m 0755 ${WORKDIR}/rescan-wf-bic ${D}${libexecdir}/${PN}/
     install -m 0755 ${WORKDIR}/slot-hsc-fault ${D}${libexecdir}/${PN}/
     install -m 0755 ${WORKDIR}/slot-power-fault ${D}${libexecdir}/${PN}/
+    install -m 0755 ${WORKDIR}/fan-board-efuse-fault ${D}${libexecdir}/${PN}/
     install -d ${D}/${bindir}
     install -m 0755 ${WORKDIR}/configure-nic-mctp-endpoint.sh ${D}/${bindir}/
 }