#!/bin/bash
#
# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES.
# SPDX-License-Identifier: LicenseRef-NVIDIA-Proprietary
#
# IPG SET with link ceremony (matches RCP dms_spectrum-x.sh sequence):
# 1. Write PIPG register
# 2. Sleep 1s
# 3. PAOS admin_status=2 (link down)
# 4. PAOS admin_status=1 (link up)
# 5. Poll PAOS oper_status until UP (timeout 30s)
source "$(dirname "$0")/_lib.sh"
trace "$@"
BDF=$(bdf_from_target "$1"); VALUE="$2"

# 1. Write PIPG register
ERR_FILE=$(mktemp /tmp/dms-mlxreg-pipg-set.XXXXXX) || exit 1
trap 'rm -f "$ERR_FILE"' EXIT

if ! mlxreg -d "$BDF" -y --set "ipg=${VALUE}" --reg_name PIPG --indexes 'local_port=1,lp_msb=0,ipg_cap_index=0' 2>"$ERR_FILE"; then
    ERR=$(cat "$ERR_FILE" 2>/dev/null)
    echo "Error: mlxreg PIPG SET failed: ${ERR:-unknown}" >&2
    exit 1
fi

# 2. Sleep (RCP: sleep 1 between IPG write and link toggle)
sleep 1

# 3. Link down (PAOS admin_status=2, fd=1 force down, ase=1 admin state enable)
mlxreg -d "$BDF" -y --set 'admin_status=2,fd=1,ase=1' --reg_name PAOS \
    --indexes 'local_port=1,lp_msb=0' 2>/dev/null || true

# 4. Link up (PAOS admin_status=1)
mlxreg -d "$BDF" -y --set 'admin_status=1,fd=1,ase=1' --reg_name PAOS \
    --indexes 'local_port=1,lp_msb=0' 2>/dev/null || true

# 5. Wait for link up (poll oper_status, timeout 30s)
for i in $(seq 1 15); do
    OPER=$(mlxreg -d "$BDF" --reg_name PAOS --get \
        --indexes 'local_port=1,lp_msb=0' 2>/dev/null | \
        grep '^oper_status' | grep -o '0x[0-9a-f]*' | head -1)
    [[ "$OPER" == "0x00000001" ]] && break
    sleep 2
done

echo "admin=${VALUE}"
