#!/bin/bash # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2026 Open-IOV contributors # NV2080 Control Command Tool # Sends NV2080 RM control commands to the NVIDIA kernel module via ioctl # Usage: ./nv2080_ctrl.sh [params...] set -euo pipefail # NV2080 Control Command Definitions (from ctrl2080unix.h and ctrl2080vgpumgrinternal.h) # These are the same commands used by GVM userspace via NV_CTRL_RES ioctl # NV2080_CTRL_CMD_OS_UNIX_GC6_BLOCKER_REFCNT (0x20803d01) # Params: action (INC=1, DEC=2) NV2080_CTRL_CMD_OS_UNIX_GC6_BLOCKER_REFCNT=0x20803d01 NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_INC=1 NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_DEC=2 # NV2080_CTRL_CMD_OS_UNIX_ALLOW_DISALLOW_GCOFF (0x20803d02) # Params: action (ALLOW=1, DISALLOW=2) NV2080_CTRL_CMD_OS_UNIX_ALLOW_DISALLOW_GCOFF=0x20803d02 NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_ALLOW=1 NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_DISALLOW=2 # NV2080_CTRL_CMD_OS_UNIX_AUDIO_DYNAMIC_POWER (0x20803d03) # Params: bEnter (true/false) NV2080_CTRL_CMD_OS_UNIX_AUDIO_DYNAMIC_POWER=0x20803d03 # NV2080_CTRL_CMD_OS_UNIX_INSTALL_PROFILER_HOOKS (0x20803d04) NV2080_CTRL_CMD_OS_UNIX_INSTALL_PROFILER_HOOKS=0x20803d04 # NV2080_CTRL_CMD_OS_UNIX_FLUSH_SNAPSHOT_BUFFER (0x20803d05) NV2080_CTRL_CMD_OS_UNIX_FLUSH_SNAPSHOT_BUFFER=0x20803d05 # NV2080_CTRL_CMD_OS_UNIX_STOP_PROFILER (0x20803d06) NV2080_CTRL_CMD_OS_UNIX_STOP_PROFILER=0x20803d06 # NV2080_CTRL_CMD_OS_UNIX_VIDMEM_PERSISTENCE_STATUS (0x20803d07) NV2080_CTRL_CMD_OS_UNIX_VIDMEM_PERSISTENCE_STATUS=0x20803d07 # NV2080_CTRL_CMD_OS_UNIX_UPDATE_TGP_STATUS (0x20803d08) NV2080_CTRL_CMD_OS_UNIX_UPDATE_TGP_STATUS=0x20803d08 # VGPU Manager Internal Commands NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK=0x20804001 NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK=0x20804002 NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE=0x20804003 NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU=0x20804004 NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO=0x20804005 NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE=0x20804006 NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY=0x20804007 NV2080_CTRL_CMD_INTERNAL_VGPU_PLUGIN_CLEANUP=0x20804008 # NV_IOCTL_MAGIC and NV_ESC_RM_CONTROL NV_IOCTL_MAGIC=0x46 NV_ESC_RM_CONTROL=0x54 # NV_CTRL_RES = _IOWR(NV_IOCTL_MAGIC, NV_ESC_RM_CONTROL, NVOS54_PARAMETERS) NV_CTRL_RES=$(printf "0x%x" $(( (2 << 30) | (NV_IOCTL_MAGIC << 8) | (NV_ESC_RM_CONTROL) | (128 << 16) ))) # Helper to send ioctl send_ioctl() { local fd=$1 local cmd=$2 local data=$3 local size=$4 # This would need a C program to actually send the ioctl # For now, we document the commands echo "Command: 0x$(printf "%x" $cmd)" echo "Data size: $size" } # Main command dispatcher case "${1:-help}" in gc6-inc) echo "Increment GC6 blocker refcount" echo "ioctl(fd, NV_CTRL_RES, {cmd: $NV2080_CTRL_CMD_OS_UNIX_GC6_BLOCKER_REFCNT, action: $NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_INC})" ;; gc6-dec) echo "Decrement GC6 blocker refcount" echo "ioctl(fd, NV_CTRL_RES, {cmd: $NV2080_CTRL_CMD_OS_UNIX_GC6_BLOCKER_REFCNT, action: $NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_DEC})" ;; gcoff-allow) echo "Allow GCOFF" echo "ioctl(fd, NV_CTRL_RES, {cmd: $NV2080_CTRL_CMD_OS_UNIX_ALLOW_DISALLOW_GCOFF, action: $NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_ALLOW})" ;; gcoff-disallow) echo "Disallow GCOFF" echo "ioctl(fd, NV_CTRL_RES, {cmd: $NV2080_CTRL_CMD_OS_UNIX_ALLOW_DISALLOW_GCOFF, action: $NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_DISALLOW})" ;; audio-power) echo "Audio dynamic power: $2" ;; profiler-install) echo "Install profiler hooks" ;; profiler-flush) echo "Flush snapshot buffer" ;; profiler-stop) echo "Stop profiler" ;; vidmem-persistence) echo "Query vidmem persistence status" ;; tgp-status) echo "Update TGP status: $2" ;; vgpu-bootload) echo "Bootload GSP VGPU plugin task" echo "Params: dbdf, gfid, vgpuType, vmPid, swizzId, numChannels, numPluginChannels, bDisableSmcPartitionRestore, guestFbPhysAddrList, guestFbLengthList, pluginHeapMemoryPhysAddr, pluginHeapMemoryLength, ctrlBuffOffset" ;; vgpu-shutdown) echo "Shutdown GSP VGPU plugin task" echo "Params: gfid" ;; vgpu-add-type) echo "Add vGPU type to pGPU" echo "Params: discardVgpuTypes, vgpuInfo" ;; vgpu-enumerate) echo "Enumerate vGPUs per pGPU" ;; vgpu-clear-guest) echo "Clear guest VM info" echo "Params: gfid" ;; vgpu-fb-usage) echo "Get vGPU FB usage" ;; vgpu-encoder-cap) echo "Set vGPU encoder capacity" echo "Params: gfid, encoderCapacity (0-100)" ;; vgpu-plugin-cleanup) echo "Cleanup VGPU plugin" echo "Params: gfid" ;; list) echo "Available NV2080 Control Commands:" echo " OS Unix Commands:" echo " gc6-inc - Increment GC6 blocker refcount" echo " gc6-dec - Decrement GC6 blocker refcount" echo " gcoff-allow - Allow GCOFF" echo " gcoff-disallow - Disallow GCOFF" echo " audio-power - Audio dynamic power (enter/exit)" echo " profiler-install - Install profiler hooks (HWPM)" echo " profiler-flush - Flush snapshot buffer" echo " profiler-stop - Stop profiler" echo " vidmem-persistence- Query vidmem persistence status" echo " tgp-status - Update TGP status" echo "" echo " VGPU Manager Internal Commands:" echo " vgpu-bootload - Bootload GSP VGPU plugin task" echo " vgpu-shutdown - Shutdown GSP VGPU plugin task" echo " vgpu-add-type - Add vGPU type to pGPU" echo " vgpu-enumerate - Enumerate vGPUs per pGPU" echo " vgpu-clear-guest - Clear guest VM info" echo " vgpu-fb-usage - Get vGPU FB usage" echo " vgpu-encoder-cap - Set vGPU encoder capacity" echo " vgpu-plugin-cleanup - Cleanup VGPU plugin" ;; help|*) echo "NV2080 Control Command Tool" echo "Usage: $0 [args...]" echo "" echo "Run '$0 list' to see all available commands" ;; esac