#!/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
#
source "$(dirname "$0")/_lib.sh"
trace "$@"
BDF=$(bdf_from_target "$1"); VALUE="$2"
SYSFS="/sys/bus/pci/devices/${BDF}/sriov_numvfs"

if [[ ! -f "$SYSFS" ]]; then
    echo "Error: sriov_numvfs not available (SRIOV_EN not applied or device doesn't support SR-IOV)" >&2
    exit 1
fi
[[ -z "$VALUE" || ! "$VALUE" =~ ^[0-9]+$ ]] && { echo "Error: num-vfs must be a non-negative integer: '$VALUE'" >&2; exit 1; }

ERR_FILE=$(mktemp /tmp/dms-sysfs-sriov-set.XXXXXX) || exit 1
trap 'rm -f "$ERR_FILE"' EXIT

CURRENT=$(cat "$SYSFS" 2>/dev/null)
if [[ "$CURRENT" =~ ^[0-9]+$ && "$CURRENT" != "0" && "$VALUE" != "0" && "$VALUE" != "$CURRENT" ]]; then
    if ! { echo 0 > "$SYSFS"; } 2>"$ERR_FILE"; then
        ERR=$(cat "$ERR_FILE" 2>/dev/null)
        echo "Error: failed to clear sriov_numvfs before setting $VALUE: ${ERR:-unknown}" >&2
        exit 1
    fi
fi

if ! { echo "$VALUE" > "$SYSFS"; } 2>"$ERR_FILE"; then
    ERR=$(cat "$ERR_FILE" 2>/dev/null)
    echo "Error: failed to set sriov_numvfs=$VALUE: ${ERR:-unknown}" >&2
    exit 1
fi

ACTUAL=$(cat "$SYSFS" 2>/dev/null)
echo "num-vfs=${ACTUAL}"
