133ccfd20SYikai Tsai#!/bin/bash
233ccfd20SYikai Tsai
3*d57f53d1SYikai TsaiMODULE_PATH="/xyz/openbmc_project/inventory/system/board/Yosemite_4_Medusa_Board/MEDUSA_DELTA"
4*d57f53d1SYikai Tsai
533ccfd20SYikai Tsaidec_to_hex() {
633ccfd20SYikai Tsai    local decimal=$1
733ccfd20SYikai Tsai    local hex=""
833ccfd20SYikai Tsai    local digits="0123456789ABCDEF"
933ccfd20SYikai Tsai
1033ccfd20SYikai Tsai    while [ "$decimal" -gt 0 ]; do
1133ccfd20SYikai Tsai        remainder=$((decimal % 16))
1233ccfd20SYikai Tsai        hex="${digits:remainder:1}$hex"
1333ccfd20SYikai Tsai        decimal=$((decimal / 16))
1433ccfd20SYikai Tsai    done
1533ccfd20SYikai Tsai
1633ccfd20SYikai Tsai    # ensure the length of $hex >= 4
1733ccfd20SYikai Tsai    while [ ${#hex} -lt 4 ]; do
1833ccfd20SYikai Tsai        hex="0$hex"
1933ccfd20SYikai Tsai    done
2033ccfd20SYikai Tsai
2133ccfd20SYikai Tsai    echo "0x${hex:-0}"
2233ccfd20SYikai Tsai}
2333ccfd20SYikai Tsai
2433ccfd20SYikai Tsairead_mfr_id() {
2533ccfd20SYikai Tsai    local bus=$1
2633ccfd20SYikai Tsai    local addr=$2
2733ccfd20SYikai Tsai    local mfr_id
28*d57f53d1SYikai Tsai    if mfr_id=$(i2ctransfer -f -y "$bus" w1@"$addr" 0x99 r5); then
2933ccfd20SYikai Tsai        local vendor="0x46 0x6c 0x65 0x78"
3033ccfd20SYikai Tsai        if [[ $mfr_id == *"$vendor"* ]]; then
3133ccfd20SYikai Tsai            echo "flex"
3233ccfd20SYikai Tsai        else
3333ccfd20SYikai Tsai            echo "delta"
3433ccfd20SYikai Tsai        fi
35*d57f53d1SYikai Tsai        return 0
36*d57f53d1SYikai Tsai    else
37*d57f53d1SYikai Tsai        echo "i2ctransfer failed for MFR_ID" >&2
38*d57f53d1SYikai Tsai        return 1 # return 1 on failure
39*d57f53d1SYikai Tsai    fi
4033ccfd20SYikai Tsai}
4133ccfd20SYikai Tsai
4233ccfd20SYikai Tsairead_power_module() {
4333ccfd20SYikai Tsai    local bus=$1
4433ccfd20SYikai Tsai    local addr=$2
4533ccfd20SYikai Tsai    local pu_num=$3
4633ccfd20SYikai Tsai    local module_vendor
4733ccfd20SYikai Tsai
48*d57f53d1SYikai Tsai    if ! module_vendor=$(read_mfr_id "$bus" "$addr"); then
49*d57f53d1SYikai Tsai        log-create xyz.openbmc_project.State.Power.PowerRailFault --json \
50*d57f53d1SYikai Tsai            "{\"POWER_RAIL\": \"${MODULE_PATH}${pu_num}_12V\", \"FAILURE_DATA\": \"Medusa Power Module ${pu_num} Fault\"}"
51*d57f53d1SYikai Tsai        return # Return if read_mfr_id failed
52*d57f53d1SYikai Tsai    fi
53*d57f53d1SYikai Tsai
54*d57f53d1SYikai Tsai    local failure_data="Medusa Power Module ${pu_num} Fault"
55*d57f53d1SYikai Tsai    local power_rail="${MODULE_PATH}${pu_num}_12V"
5633ccfd20SYikai Tsai
5733ccfd20SYikai Tsai    # Read STATUS_BYTE (0x78) and STATUS_OTHER (0x7F) if flex type
5833ccfd20SYikai Tsai    if [ "$module_vendor" == "flex" ]; then
5933ccfd20SYikai Tsai        STATUS_BYTE=$(i2ctransfer -f -y "$bus" w1@"$addr" 0x78 r1)
60*d57f53d1SYikai Tsai        local description="(0x78) STATUS_BYTE"
61*d57f53d1SYikai Tsai        if [ -n "$failure_data" ]; then
62*d57f53d1SYikai Tsai            failure_data="$failure_data, "
63*d57f53d1SYikai Tsai        fi
64*d57f53d1SYikai Tsai        failure_data+="$description: $STATUS_BYTE"
6533ccfd20SYikai Tsai
6633ccfd20SYikai Tsai        STATUS_OTHER=$(i2ctransfer -f -y "$bus" w1@"$addr" 0x7F r1)
67*d57f53d1SYikai Tsai        local description="(0x7F) STATUS_OTHER"
68*d57f53d1SYikai Tsai        if [ -n "$failure_data" ]; then
69*d57f53d1SYikai Tsai            failure_data="$failure_data, "
70*d57f53d1SYikai Tsai        fi
71*d57f53d1SYikai Tsai        failure_data+="$description: $STATUS_OTHER"
7233ccfd20SYikai Tsai    fi
7333ccfd20SYikai Tsai
7433ccfd20SYikai Tsai    # Read STATUS_WORD (0x79)
7533ccfd20SYikai Tsai    read -r LOW_BYTE HIGH_BYTE <<< "$(i2ctransfer -f -y "$bus" w1@"$addr" 0x79 r2)"
7633ccfd20SYikai Tsai    STATUS_WORD=$((LOW_BYTE | (HIGH_BYTE << 8) ))
7733ccfd20SYikai Tsai    STATUS_WORD=$(dec_to_hex $STATUS_WORD)
78*d57f53d1SYikai Tsai    local description="(0x79) STATUS_WORD"
79*d57f53d1SYikai Tsai    if [ -n "$failure_data" ]; then
80*d57f53d1SYikai Tsai        failure_data="$failure_data, "
81*d57f53d1SYikai Tsai    fi
82*d57f53d1SYikai Tsai    failure_data+="$description: $STATUS_WORD"
8333ccfd20SYikai Tsai
8433ccfd20SYikai Tsai    # Read other status registers (1 byte each)
8533ccfd20SYikai Tsai    for reg in 0x7A 0x7B 0x7C 0x7D 0x7E 0x80; do
8633ccfd20SYikai Tsai        STATUS=$(i2ctransfer -f -y "$bus" w1@"$addr" $reg r1)
8733ccfd20SYikai Tsai        case $reg in
8833ccfd20SYikai Tsai            0x7A) name="STATUS_VOUT";;
8933ccfd20SYikai Tsai            0x7B) name="STATUS_IOUT";;
9033ccfd20SYikai Tsai            0x7C) name="STATUS_INPUT";;
9133ccfd20SYikai Tsai            0x7D) name="STATUS_TEMPERATURE";;
9233ccfd20SYikai Tsai            0x7E) name="STATUS_CML";;
9333ccfd20SYikai Tsai            0x80) name="STATUS_MFR_SPECIFIC";;
9433ccfd20SYikai Tsai        esac
95*d57f53d1SYikai Tsai        description="($reg) $name"
96*d57f53d1SYikai Tsai        if [ -n "$failure_data" ]; then
97*d57f53d1SYikai Tsai            failure_data="$failure_data, "
98*d57f53d1SYikai Tsai        fi
99*d57f53d1SYikai Tsai        failure_data+="$description: $STATUS"
10033ccfd20SYikai Tsai    done
10133ccfd20SYikai Tsai
102*d57f53d1SYikai Tsai    # Send event
103*d57f53d1SYikai Tsai    log-create xyz.openbmc_project.State.Power.PowerRailFault --json \
104*d57f53d1SYikai Tsai        "{\"POWER_RAIL\": \"$power_rail\", \"FAILURE_DATA\": \"$failure_data\"}"
10533ccfd20SYikai Tsai}
10633ccfd20SYikai Tsai
10733ccfd20SYikai Tsaimedusa_power_module_fault()
10833ccfd20SYikai Tsai{
10933ccfd20SYikai Tsai    if [ "$1" = "0" ]; then
11033ccfd20SYikai Tsai        read_power_module 11 0x62 "0"
11133ccfd20SYikai Tsai    elif [ "$1" = "1" ]; then
11233ccfd20SYikai Tsai        read_power_module 11 0x64 "1"
11333ccfd20SYikai Tsai    elif [ "$1" = "2" ]; then
11433ccfd20SYikai Tsai        read_power_module 11 0x65 "2"
11533ccfd20SYikai Tsai    elif [ "$1" = "3" ]; then
11633ccfd20SYikai Tsai        read_power_module 11 0x68 "3"
11733ccfd20SYikai Tsai    else
11833ccfd20SYikai Tsai        read_power_module 11 0x62 "0"
11933ccfd20SYikai Tsai        read_power_module 11 0x64 "1"
12033ccfd20SYikai Tsai        read_power_module 11 0x65 "2"
12133ccfd20SYikai Tsai        read_power_module 11 0x68 "3"
12233ccfd20SYikai Tsai    fi
12333ccfd20SYikai Tsai}
12433ccfd20SYikai Tsai
12533ccfd20SYikai Tsaimedusa_power_module_fault "$1"
126