1
- #! /bin/bash
1
+ #! /usr/bin/env bash
2
+
2
3
DRY_RUN=0
3
4
function printHelp {
4
5
echo " Utility to run games and applications in separate X on discrete Nvidia graphic card"
@@ -9,7 +10,7 @@ function printHelp {
9
10
}
10
11
11
12
function execute {
12
- if [ ${DRY_RUN} -eq 1 ]
13
+ if [[ ${DRY_RUN} -eq 1 ] ]
13
14
then
14
15
echo " >>Dry run. Command: $* "
15
16
else
@@ -23,35 +24,38 @@ if [[ $EUID -eq 0 ]]; then
23
24
exit 1
24
25
fi
25
26
26
- if [ " $1 " == " -d" ]
27
+ if [[ " $1 " == " -d" ] ]
27
28
then
28
29
DRY_RUN=1
29
30
shift 1
30
31
fi
31
32
33
+ # load config file
34
+ . /etc/default/nvidia-xrun
35
+
32
36
# calculate current VT
33
37
LVT=` fgconsole`
34
38
35
39
# calculate first usable display
36
40
XNUM=" -1"
37
41
SOCK=" something"
38
- while [ ! -z " $SOCK " ]
42
+ while [[ ! -z " $SOCK " ]]
39
43
do
40
44
XNUM=$(( $XNUM + 1 ))
41
45
SOCK=$( ls -A -1 /tmp/.X11-unix | grep " X$XNUM " )
42
46
done
43
47
44
48
NEWDISP=" :$XNUM "
45
49
46
- if [ ! -z " $* " ] # generate exec line if arguments are given
47
- then
50
+ if [[ ! -z " $* " ] ] # generate exec line if arguments are given
51
+ then
48
52
# test if executable exists in path
49
- if [ -x " $( which $1 2> /dev/null) " ]
53
+ if [[ -x " $( which $1 2> /dev/null) " ] ]
50
54
then
51
55
# generate exec line
52
56
EXECL=" $( which $1 ) "
53
57
# test if executable exists on disk
54
- elif [ -e " $( realpath " $1 " ) " ]
58
+ elif [[ -e " $( realpath " $1 " ) " ] ]
55
59
then
56
60
# generate exec line
57
61
EXECL=" $( realpath " $1 " ) "
@@ -70,50 +74,38 @@ EXECL="/etc/X11/xinit/nvidia-xinitrc \"$EXECL\""
70
74
COMMAND=" xinit $EXECL -- $NEWDISP vt$LVT -nolisten tcp -br -config nvidia-xorg.conf -configdir nvidia-xorg.conf.d"
71
75
72
76
# --------- TURNING ON GPU -----------
73
- echo ' Waking up nvidia GPU'
74
- if ! [ -f /proc/acpi/bbswitch ]
75
- then
76
- execute " sudo modprobe bbswitch"
77
+ if [[ ! -d /sys/bus/pci/devices/${BUS_ID} ]]; then
78
+ echo ' Rescanning PCI devices'
79
+ execute " sudo tee /sys/bus/pci/rescan <<<1"
80
+ echo " Waiting ${BUS_RESCAN_WAIT_SEC} second for rescan"
81
+ execute " sleep ${BUS_RESCAN_WAIT_SEC} "
77
82
fi
78
- execute " sudo tee /proc/acpi/bbswitch <<<ON"
79
83
80
- # ---------- LOADING MODULES ----------
81
- echo ' Loading nvidia module'
82
- execute " sudo modprobe nvidia"
84
+ echo ' Turning the card on'
85
+ execute " sudo tee /sys/bus/pci/devices/${BUS_ID} /power/control <<<on"
83
86
84
- echo ' Loading nvidia_uvm module'
85
- execute " sudo modprobe nvidia_uvm"
86
-
87
- echo ' Loading nvidia_modeset module'
88
- execute " sudo modprobe nvidia_modeset"
89
-
90
- echo ' Loading nvidia_drm module'
91
- execute " sudo modprobe nvidia_drm modeset=1"
87
+ # ---------- LOADING MODULES ----------
88
+ for module in " ${MODULES_LOAD[@]} "
89
+ do
90
+ echo " Loading module ${module} "
91
+ execute " sudo modprobe ${module} "
92
+ done
92
93
93
94
# ---------- EXECUTING COMMAND --------
94
95
execute ${COMMAND}
95
96
96
97
# ---------- UNLOADING MODULES --------
97
- echo ' Unloading nvidia_drm module'
98
- execute " sudo rmmod nvidia_drm"
99
-
100
- echo ' Unloading nvidia_modeset module'
101
- execute " sudo rmmod nvidia_modeset"
102
-
103
- echo ' Unloading nvidia_uvm module'
104
- execute " sudo rmmod nvidia_uvm"
105
-
106
- echo ' Unloading nvidia module'
107
- execute " sudo rmmod nvidia"
98
+ for module in " ${MODULES_UNLOAD[@]} "
99
+ do
100
+ echo " Unloading module ${module} "
101
+ execute " sudo modprobe ${module} "
102
+ done
108
103
109
104
# --------- TURNING OFF GPU ----------
110
- if [ -f /proc/acpi/bbswitch ]
111
- then
112
- echo ' Turning off nvidia GPU'
113
- execute " sudo tee /proc/acpi/bbswitch <<<OFF"
114
-
115
- echo -n ' Current state of nvidia GPU: '
116
- execute " cat /proc/acpi/bbswitch"
105
+ if [[ -f /sys/bus/pci/devices/${BUS_ID} /remove ]]; then
106
+ echo ' Removing Nvidia bus from the kernel'
107
+ execute " sudo tee /sys/bus/pci/devices/${BUS_ID} /remove <<<1"
117
108
else
118
- echo " Bbswitch kernel module not loaded."
109
+ echo ' Enabling powersave for the PCIe controller'
110
+ execute " sudo tee /sys/bus/pci/devices/${BUS_ID} /power/control <<<auto"
119
111
fi
0 commit comments