15fd67bdfSDelphine CC Chiu#!/bin/bash 25fd67bdfSDelphine CC Chiu 3*c012e0a3SEric Yang# Function to check if an EID is already set 4*c012e0a3SEric Yangcheck_eid() { 5*c012e0a3SEric Yang local eid="$1" 6*c012e0a3SEric Yang busctl get-property au.com.codeconstruct.MCTP1 /au/com/codeconstruct/mctp1/networks/1/endpoints/"$eid" xyz.openbmc_project.MCTP.Endpoint EID >/dev/null 2>&1 7*c012e0a3SEric Yang return $? 8*c012e0a3SEric Yang} 9*c012e0a3SEric Yang 10*c012e0a3SEric Yang# Function to set up EID for CXL1 or CXL2 11*c012e0a3SEric Yangsetup_eid() { 12*c012e0a3SEric Yang local slot_number="$1" 13*c012e0a3SEric Yang local cxl_type="$2" 14*c012e0a3SEric Yang busctl call au.com.codeconstruct.MCTP1 /au/com/codeconstruct/mctp1/interfaces/mctpi2c${busnum} au.com.codeconstruct.MCTP.BusOwner1 SetupEndpointByConfigPath s "/xyz/openbmc_project/inventory/system/board/Yosemite_4_Wailua_Falls_Slot_${slot_number}/${cxl_type}" >/dev/null 2>&1 15*c012e0a3SEric Yang return $? 16*c012e0a3SEric Yang} 17*c012e0a3SEric Yang 18*c012e0a3SEric Yang# Function to check readiness and setup EID 19*c012e0a3SEric Yangcheck_and_setup_eid() { 20*c012e0a3SEric Yang local eid="$1" 21*c012e0a3SEric Yang local ready_flag="$2" 22*c012e0a3SEric Yang local slot_number="$3" 23*c012e0a3SEric Yang local cxl_type="$4" 24*c012e0a3SEric Yang 25*c012e0a3SEric Yang if [ "$ready_flag" == "01" ]; then 26*c012e0a3SEric Yang echo "${cxl_type} EID ${eid} is ready; attempting setup." 27*c012e0a3SEric Yang if setup_eid "$slot_number" "$cxl_type"; then 28*c012e0a3SEric Yang echo "${cxl_type} EID $eid setup was successful." 29*c012e0a3SEric Yang else 30*c012e0a3SEric Yang echo "${cxl_type} EID $eid setup failed." 31*c012e0a3SEric Yang fi 32*c012e0a3SEric Yang else 33*c012e0a3SEric Yang echo "${cxl_type} EID $eid is not ready for setup." 34*c012e0a3SEric Yang fi 35*c012e0a3SEric Yang} 36*c012e0a3SEric Yang 37*c012e0a3SEric Yang# Output message based on the final status of CXL EIDs, called at the end 38*c012e0a3SEric Yangoutput_final_status() { 39*c012e0a3SEric Yang local cxl1_status="$1" 40*c012e0a3SEric Yang local cxl2_status="$2" 41*c012e0a3SEric Yang local slot="$3" 42*c012e0a3SEric Yang 43*c012e0a3SEric Yang if [ "$cxl1_status" == "yes" ] && [ "$cxl2_status" == "yes" ]; then 44*c012e0a3SEric Yang echo "Both CXL EIDs established successfully for slot $slot." 45*c012e0a3SEric Yang exit 0 46*c012e0a3SEric Yang elif [ "$cxl1_status" == "no" ] && [ "$cxl2_status" == "no" ]; then 47*c012e0a3SEric Yang echo "Failed to establish both CXL1 and CXL2 EIDs for slot $slot." 48*c012e0a3SEric Yang elif [ "$cxl1_status" == "no" ]; then 49*c012e0a3SEric Yang echo "Failed to establish CXL1 EID for slot $slot." 50*c012e0a3SEric Yang else 51*c012e0a3SEric Yang echo "Failed to establish CXL2 EID for slot $slot." 52*c012e0a3SEric Yang fi 53*c012e0a3SEric Yang exit 1 54*c012e0a3SEric Yang} 55*c012e0a3SEric Yang 56*c012e0a3SEric Yang# Main script execution starts here 57*c012e0a3SEric Yangwf_eid=$(($1 * 10 + 2)) 58*c012e0a3SEric Yangbusnum=$(($1 - 1)) 59*c012e0a3SEric Yangcxl1_eid=$(($1 * 10 + 4)) 60*c012e0a3SEric Yangcxl2_eid=$(($1 * 10 + 5)) 61*c012e0a3SEric Yang 627a8edbacSDelphine CC Chiusleep 30 635fd67bdfSDelphine CC Chiu 64*c012e0a3SEric Yang# Initial EID check for 1 minute 65*c012e0a3SEric Yangcxl1_status="no" 66*c012e0a3SEric Yangcxl2_status="no" 677a8edbacSDelphine CC Chiu 68*c012e0a3SEric Yangfor _ in $(seq 1 12); do 69*c012e0a3SEric Yang if [ "$cxl1_status" == "no" ] && check_eid "$cxl1_eid"; then 70*c012e0a3SEric Yang cxl1_status="yes" 71*c012e0a3SEric Yang echo "CXL1 EID $cxl1_eid found successfully." 72*c012e0a3SEric Yang fi 735fd67bdfSDelphine CC Chiu 74*c012e0a3SEric Yang if [ "$cxl2_status" == "no" ] && check_eid "$cxl2_eid"; then 75*c012e0a3SEric Yang cxl2_status="yes" 76*c012e0a3SEric Yang echo "CXL2 EID $cxl2_eid found successfully." 77*c012e0a3SEric Yang fi 78*c012e0a3SEric Yang 79*c012e0a3SEric Yang if [ "$cxl1_status" == "yes" ] && [ "$cxl2_status" == "yes" ]; then 80*c012e0a3SEric Yang # Both EIDs found, no need to retry 81*c012e0a3SEric Yang output_final_status "yes" "yes" "$1" 82*c012e0a3SEric Yang fi 83*c012e0a3SEric Yang 84*c012e0a3SEric Yang sleep 5 85*c012e0a3SEric Yangdone 86*c012e0a3SEric Yang 87*c012e0a3SEric Yang 88*c012e0a3SEric Yang# Retry to establish CXL EID connections, max 10 minutes 89*c012e0a3SEric Yangfor _ in $(seq 1 40); do 905fd67bdfSDelphine CC Chiu output=$(pldmtool raw -m "$wf_eid" -d 0x80 0x02 0x3A 0x04 0x01) 915fd67bdfSDelphine CC Chiu rx_line=$(echo "$output" | grep "Rx:") 925fd67bdfSDelphine CC Chiu rx_data=$(echo "$rx_line" | awk '{print $4,$5,$6,$7,$8,$9,$10,$11,$12,$13}') 93*c012e0a3SEric Yang echo "Slot $1 PLDM tool raw command received data: $rx_data" 945fd67bdfSDelphine CC Chiu 955fd67bdfSDelphine CC Chiu cxl1_ready=$(echo "$rx_data" | awk '{print substr($7,1,2)}') 965fd67bdfSDelphine CC Chiu cxl2_ready=$(echo "$rx_data" | awk '{print substr($10,1,2)}') 975fd67bdfSDelphine CC Chiu 98*c012e0a3SEric Yang [ "$cxl1_status" == "no" ] && check_and_setup_eid "$cxl1_eid" "$cxl1_ready" "$1" "CXL1" 99*c012e0a3SEric Yang [ "$cxl2_status" == "no" ] && check_and_setup_eid "$cxl2_eid" "$cxl2_ready" "$1" "CXL2" 100*c012e0a3SEric Yang 101*c012e0a3SEric Yang if check_eid "$cxl1_eid" && check_eid "$cxl2_eid"; then 102*c012e0a3SEric Yang output_final_status "yes" "yes" "$1" 1035fd67bdfSDelphine CC Chiu fi 1045fd67bdfSDelphine CC Chiu 105*c012e0a3SEric Yang sleep 15 1065fd67bdfSDelphine CC Chiudone 107*c012e0a3SEric Yang 108*c012e0a3SEric Yang# Final output if retries fail 109*c012e0a3SEric Yangoutput_final_status "$(check_eid "$cxl1_eid" && echo "yes" || echo "no")" "$(check_eid "$cxl2_eid" && echo "yes" || echo "no")" "$1" 110