diff options
6 files changed, 161 insertions, 101 deletions
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/check-interrupt b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/check-interrupt new file mode 100644 index 0000000000..60f6263504 --- /dev/null +++ b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/check-interrupt @@ -0,0 +1,147 @@ +#!/bin/bash + +# Provide source directive to shellcheck. +# shellcheck source=meta-facebook/meta-yosemite4/recipes-phosphor/state/phosphor-state-manager/power-cmd +source /usr/libexec/phosphor-state-manager/power-cmd + +log_message() { + local slot_num=$(($1+1)) + local MESSAGE="SLOT$slot_num $2 Power Fault" + local COMBINED_INFO="$3" + + 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" +} + +host_power_status() { + id=$1 + service_path="xyz.openbmc_project.State.Host${id}" + object_path="/xyz/openbmc_project/state/host${id}" + interface_path="xyz.openbmc_project.State.Host" + property="CurrentHostState" + status=$(busctl get-property "$service_path" "$object_path" $interface_path $property | cut -d"." -f6) + if [ "$status" == "Running\"" ]; then + echo "on" + else + echo "off" + fi +} + +# Sleep for 10ms to ignore GPIO instability during blade hot-plug +usleep 10000 + +if [ "$1" = "slot1-slot4" ]; then + i2c_bus=8 + mux_addr=0x70 + slot_num_offset=0 +elif [ "$1" = "slot5-slot8" ]; then + i2c_bus=9 + mux_addr=0x71 + slot_num_offset=4 +else + echo "Invalid input: $1" + exit 1 +fi + +count=0 +check_count=0 +SLOT_RANGE=4 +CLEAR_BIT=20 +while [ $check_count -lt $SLOT_RANGE ] +do + count=0 + + # i2ctranster to check which slot got interrupt + read -r INT_BYTE <<< "$(i2ctransfer -f -y $i2c_bus w1@$mux_addr 0 r1)" + INT_BYTE=$((INT_BYTE >> 4)) + + if [ $INT_BYTE -eq 0 ]; then + exit 0 + fi + + while [ $count -lt $SLOT_RANGE ] + do + + fault=$(( (INT_BYTE >> count) & 1 )) + # if fault[i] == 1, means slot_x got ISR + if [ $fault -eq 1 ]; then + slot_num=$((count + slot_num_offset)) + + # i2ctranster to get CPLD IOE (0x24) addr 0x01 (port1, ac) + read -r FAULT_BYTE <<< "$(i2ctransfer -f -y $slot_num w1@0x24 0x01 r1)" + + # check which pin fault, add to fault info + if (( (FAULT_BYTE >> 0) & 1 == 1 )); then + [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_P1V8_STBY_FAULT" || COMBINED_INFO="PWRGD_P1V8_STBY_FAULT" + elif (( (FAULT_BYTE >> 1) & 1 == 1 )); then + [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_P1V2_STBY_FAULT" || COMBINED_INFO="PWRGD_P1V2_STBY_FAULT" + fi + + # call logging function + if [ -n "$COMBINED_INFO" ]; then + log_message $slot_num "AC" "$COMBINED_INFO" + fi + + # clean + COMBINED_INFO="" + # i2ctranster to get CPLD IOE (0x24) addr 0x02 (port2, dc) + read -r FAULT_BYTE <<< "$(i2ctransfer -f -y $slot_num w1@0x24 0x02 r1)" + + # check which pin fault, add to fault info + if (( (FAULT_BYTE >> 0) & 1 == 1 )); then + [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDCR_CPU0_FAULT" || COMBINED_INFO="PWRGD_PVDDCR_CPU0_FAULT" + elif (( (FAULT_BYTE >> 1) & 1 == 1 )); then + [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDCR_SOC_FAULT" || COMBINED_INFO="PWRGD_PVDDCR_SOC_FAULT" + elif (( (FAULT_BYTE >> 2) & 1 == 1 )); then + [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDCR_CPU1_FAULT" || COMBINED_INFO="PWRGD_PVDDCR_CPU1_FAULT" + elif (( (FAULT_BYTE >> 3) & 1 == 1 )); then + [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDIO_FAULT" || COMBINED_INFO="PWRGD_PVDDIO_FAULT" + elif (( (FAULT_BYTE >> 4) & 1 == 1 )); then + [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDD11_S3_R_FAULT" || COMBINED_INFO="PWRGD_PVDD11_S3_R_FAULT" + fi + + # call logging function + if [ -n "$COMBINED_INFO" ]; then + log_message $slot_num "DC" $COMBINED_INFO + fi + + + # Check CPU power status + host_id=$((slot_num + 1)) + read -r PWR_STATUS_BYTE <<< "$(i2ctransfer -f -y $slot_num w1@0x23 0x02 r1)" + if (( (PWR_STATUS_BYTE >> 2) & 1 == 1 )); then + if [ "$(host_power_status $host_id)" == "off" ]; then + echo "Host$host_id power status change to on" + busctl set-property xyz.openbmc_project.State.Host$host_id /xyz/openbmc_project/state/host$host_id xyz.openbmc_project.State.Host RequestedHostTransition s "xyz.openbmc_project.State.Host.Transition.On" + fi + else + if [ "$(host_power_status $host_id)" == "on" ]; then + echo "Host$host_id power status change to off" + busctl set-property xyz.openbmc_project.State.Host$host_id /xyz/openbmc_project/state/host$host_id xyz.openbmc_project.State.Host RequestedHostTransition s "xyz.openbmc_project.State.Host.Transition.Off" + fi + fi + + + # Clear interrupt + cpld_ioe_chip=$(basename "/sys/bus/i2c/devices/$slot_num-0021/"*gpiochip*) + + if ! gpio_set "$cpld_ioe_chip" "$CLEAR_BIT"=1 + then + echo "Set slot_num: $slot_num register to clear interrupt fail" + fi + + usleep 5000 + + if ! gpio_set "$cpld_ioe_chip" "$CLEAR_BIT"=0 + then + echo "Set slot_num: $slot_num register to default status fail" + fi + fi + + count=$((count + 1)) + done + + check_count=$((check_count + 1)) +done diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/check-interrupt@.service b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/check-interrupt@.service new file mode 100644 index 0000000000..261d1636f5 --- /dev/null +++ b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/check-interrupt@.service @@ -0,0 +1,7 @@ +[Unit] +Description=Check %i interrupt + +[Service] +Type=oneshot +ExecStart=/usr/libexec/phosphor-gpio-monitor/check-interrupt %i +SyslogIdentifier=check-interrupt%i diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/slot-power-fault b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/slot-power-fault deleted file mode 100644 index 73ab5beb32..0000000000 --- a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/slot-power-fault +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash - -log_message() { - local slot_num=$(($1+1)) - local MESSAGE="SLOT$slot_num $2 Power Fault" - local COMBINED_INFO="$3" - - 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 == 14, slot1 to slot4. Check mux0 at i2c-8 0x70. -# if $1 == 58, slot5 to slot8. Check mux1 at i2c-9 0x71. - -if [ "$1" -eq 14 ]; then - i2c_bus=8 - mux_addr=0x70 - slot_num_offset=0 -elif [ "$1" -eq 58 ]; then - i2c_bus=9 - mux_addr=0x71 - slot_num_offset=4 -else - echo "Invalid input. Please provide 14 or 58." - exit 1 -fi - - -# i2ctranster to check which slot got interrupt -read -r INT_BYTE <<< "$(i2ctransfer -f -y $i2c_bus w1@$mux_addr 0 r1)" -INT_BYTE=$((INT_BYTE >> 4)) - -# Traverse INT_BYTE -count=0 -SLOT_RANGE=4 -while [ $count -lt $SLOT_RANGE ] -do - fault=$(( (INT_BYTE >> count) & 1 )) - # if fault[i] == 1, means slot_x got ISR - if [ $fault -eq 1 ]; then - slot_num=$((count + slot_num_offset)) - - # i2ctranster to get CPLD IOE (0x24) addr 0x01 (port1, ac) - read -r FAULT_BYTE <<< "$(i2ctransfer -f -y $slot_num w1@0x24 0x01 r1)" - - # check which pin fault, add to fault info - if (( (FAULT_BYTE >> 0) & 1 == 1 )); then - [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_P1V8_STBY_FAULT" || COMBINED_INFO="PWRGD_P1V8_STBY_FAULT" - elif (( (FAULT_BYTE >> 1) & 1 == 1 )); then - [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_P1V2_STBY_FAULT" || COMBINED_INFO="PWRGD_P1V2_STBY_FAULT" - fi - - # call logging function - if [ -n "$COMBINED_INFO" ]; then - log_message $slot_num "AC" "$COMBINED_INFO" - fi - - # clean - COMBINED_INFO="" - # i2ctranster to get CPLD IOE (0x24) addr 0x02 (port2, dc) - read -r FAULT_BYTE <<< "$(i2ctransfer -f -y $slot_num w1@0x24 0x02 r1)" - - # check which pin fault, add to fault info - if (( (FAULT_BYTE >> 0) & 1 == 1 )); then - [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDCR_CPU0_FAULT" || COMBINED_INFO="PWRGD_PVDDCR_CPU0_FAULT" - elif (( (FAULT_BYTE >> 1) & 1 == 1 )); then - [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDCR_SOC_FAULT" || COMBINED_INFO="PWRGD_PVDDCR_SOC_FAULT" - elif (( (FAULT_BYTE >> 2) & 1 == 1 )); then - [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDCR_CPU1_FAULT" || COMBINED_INFO="PWRGD_PVDDCR_CPU1_FAULT" - elif (( (FAULT_BYTE >> 3) & 1 == 1 )); then - [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDDIO_FAULT" || COMBINED_INFO="PWRGD_PVDDIO_FAULT" - elif (( (FAULT_BYTE >> 4) & 1 == 1 )); then - [ -n "$COMBINED_INFO" ] && COMBINED_INFO="${COMBINED_INFO},PWRGD_PVDD11_S3_R_FAULT" || COMBINED_INFO="PWRGD_PVDD11_S3_R_FAULT" - fi - - # call logging function - if [ -n "$COMBINED_INFO" ]; then - log_message $slot_num "DC" $COMBINED_INFO - fi - fi - - count=$((count + 1)) -done diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/slot-power-fault@.service b/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/slot-power-fault@.service deleted file mode 100644 index f81ce05df2..0000000000 --- a/meta-facebook/meta-yosemite4/recipes-phosphor/gpio/phosphor-gpio-monitor/slot-power-fault@.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=slot power-fault:%i - -[Service] -Type=oneshot -ExecStart=/usr/libexec/phosphor-gpio-monitor/slot-power-fault %i -SyslogIdentifier=slot-power-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 50d0d65728..6e722d671b 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 @@ -352,7 +352,7 @@ "EventMon": "FALLING", "Targets": { "FALLING": [ - "slot-power-fault@14.service"] + "check-interrupt@slot1-slot4.service"] }, "Continue": true }, @@ -362,7 +362,7 @@ "EventMon": "FALLING", "Targets": { "FALLING": [ - "slot-power-fault@58.service"] + "check-interrupt@slot5-slot8.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 38e694380d..739aa7022a 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 @@ -18,14 +18,14 @@ SRC_URI += "file://yosemite4-phosphor-multi-gpio-monitor.json \ file://rescan-wf-bic@.service \ file://slot-hsc-fault \ 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 \ file://enable-i3c-hub \ file://enable-i3c-hub@.service \ file://disable-i3c-hub \ file://disable-i3c-hub@.service \ + file://check-interrupt \ + file://check-interrupt@.service \ " RDEPENDS:${PN}:append = " bash" @@ -41,11 +41,11 @@ SYSTEMD_SERVICE:${PN} += " \ remove-nic-endpoint-slot@.service \ rescan-wf-bic@.service \ slot-hsc-fault@.service \ - slot-power-fault@.service \ fan-board-efuse-fault@.service \ reconfig-net-interface@.service \ enable-i3c-hub@.service \ disable-i3c-hub@.service \ + check-interrupt@.service \ " SYSTEMD_AUTO_ENABLE = "enable" @@ -63,20 +63,20 @@ do_install:append:() { install -m 0644 ${WORKDIR}/remove-nic-endpoint-slot@.service ${D}${systemd_system_unitdir}/ 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 -m 0644 ${WORKDIR}/enable-i3c-hub@.service ${D}${systemd_system_unitdir}/ install -m 0644 ${WORKDIR}/disable-i3c-hub@.service ${D}${systemd_system_unitdir}/ + install -m 0644 ${WORKDIR}/check-interrupt@.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}/ install -m 0755 ${WORKDIR}/rescan-fru-ocp-setting ${D}${libexecdir}/${PN}/ 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 -m 0755 ${WORKDIR}/enable-i3c-hub ${D}${libexecdir}/${PN}/ install -m 0755 ${WORKDIR}/disable-i3c-hub ${D}${libexecdir}/${PN}/ + install -m 0755 ${WORKDIR}/check-interrupt ${D}${libexecdir}/${PN}/ install -d ${D}/${bindir} install -m 0755 ${WORKDIR}/configure-nic-mctp-endpoint ${D}/${bindir}/ } |