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