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