#!/usr/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
#
# Diagnostics data — DIAG_DATA_OWNERSHIP register (0xC016) via mlxreg.
# Exposes: is-supported (cap), multi-domain (bool GET/SET).
source "$(dirname "$0")/_lib.sh"
trace "$@"

OP="$1"; shift
TARGET="$1"; shift
BDF=$(bdf_from_target "$TARGET")

_diag_reg_get() {
    "${MLXREG_BIN:-mlxreg}" -d "$BDF" --reg_name DIAG_DATA_OWNERSHIP --get 2>/dev/null || true
}

# Raw hex value of the multi_domain field, empty if the register is unreadable.
_multi_domain_raw() {
    _diag_reg_get | awk '/^[[:space:]]*multi_domain[[:space:]]*\|/ { v=$NF; gsub(/[[:space:]]/, "", v); print v; exit }'
}

_multi_domain_get() {
    local raw
    raw=$(_multi_domain_raw)
    # register value 0x00000000 = false, any non-zero = true
    [[ "$raw" =~ ^0x0+$ || -z "$raw" ]] && echo "false" || echo "true"
}

if [[ "$OP" == "GET" ]]; then
    for PARAM in "$@"; do
        case "$PARAM" in
            is-supported)
                [[ -n "$(_multi_domain_raw)" ]] && echo "is-supported=true" || echo "is-supported=false" ;;
            multi-domain)
                echo "multi-domain=$(_multi_domain_get)" ;;
        esac
    done
elif [[ "$OP" == "SET" ]]; then
    for PAIR in "$@"; do
        PARAM="${PAIR%%=*}"
        VALUE="${PAIR#*=}"
        case "$PARAM" in
            multi-domain)
                case "$VALUE" in
                    true|True|1)   INT=1; OUT=true ;;
                    false|False|0) INT=0; OUT=false ;;
                    *) tool_fail 1 "diagnostics-data: invalid multi-domain value '${VALUE}'" ;;
                esac
                # Capture combined output: mlxreg can emit syndrome/error markers
                # with rc=0, so a clean exit is not proof of success.
                OUT_RAW=$("${MLXREG_BIN:-mlxreg}" -d "$BDF" --reg_name DIAG_DATA_OWNERSHIP \
                            --set "multi_domain=${INT}" -y 2>&1)
                RC=$?
                if [[ $RC -ne 0 ]] || echo "$OUT_RAW" | grep -qi "syndrome\|error\|failed"; then
                    tool_fail 1 "diagnostics-data: failed to set multi-domain=${VALUE} on ${BDF}: $(echo "$OUT_RAW" | tr '\n' ' ')"
                fi
                echo "multi-domain=${OUT}" ;;
        esac
    done
fi
