summaryrefslogtreecommitdiffstats
path: root/tools/debug/nv2080_ctrl.sh
blob: e4321204dcd8d9ccd0395e6d6ee2e938f0b7b5ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#!/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 <device_fd> <command> [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 <command> [args...]"
        echo ""
        echo "Run '$0 list' to see all available commands"
        ;;
esac