132 lines
4.5 KiB
Bash
Executable File
132 lines
4.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
|
|
|
tmp_dir=$(mktemp -d)
|
|
trap 'rm -rf "$tmp_dir"' EXIT
|
|
|
|
# Each argument is a PCI device as "vendor:device:class[:boot_vga]", in sysfs's
|
|
# own format. boot_vga is omitted to simulate firmware that lacks the flag.
|
|
write_pci_devices() {
|
|
rm -rf "$tmp_dir/devices"
|
|
mkdir -p "$tmp_dir/devices"
|
|
|
|
local index=0
|
|
local spec
|
|
for spec in "$@"; do
|
|
local slot
|
|
slot=$(printf '0000:%02x:00.0' "$index")
|
|
mkdir -p "$tmp_dir/devices/$slot"
|
|
printf '%s\n' "$(cut -d: -f1 <<<"$spec")" >"$tmp_dir/devices/$slot/vendor"
|
|
printf '%s\n' "$(cut -d: -f2 <<<"$spec")" >"$tmp_dir/devices/$slot/device"
|
|
printf '%s\n' "$(cut -d: -f3 <<<"$spec")" >"$tmp_dir/devices/$slot/class"
|
|
if [[ $spec == *:*:*:* ]]; then
|
|
printf '%s\n' "$(cut -d: -f4 <<<"$spec")" >"$tmp_dir/devices/$slot/boot_vga"
|
|
fi
|
|
index=$((index + 1))
|
|
done
|
|
}
|
|
|
|
hw_nvidia() {
|
|
OMARCHY_PCI_DEVICES_PATH="$tmp_dir/devices" "$ROOT/bin/omarchy-hw-$1"
|
|
}
|
|
|
|
assert_detects() {
|
|
local description="$1" nvidia="$2" gsp="$3" without_gsp="$4"
|
|
|
|
local command
|
|
for command in nvidia gsp without-gsp; do
|
|
local expected
|
|
case $command in
|
|
nvidia) expected=$nvidia ;;
|
|
gsp) expected=$gsp ;;
|
|
without-gsp) expected=$without_gsp ;;
|
|
esac
|
|
|
|
local detector=nvidia
|
|
[[ $command == "nvidia" ]] || detector="nvidia-$command"
|
|
|
|
local actual=no
|
|
hw_nvidia "$detector" && actual=yes
|
|
|
|
[[ $actual == "$expected" ]] ||
|
|
fail "$description" "omarchy-hw-$detector: expected $expected, got $actual"
|
|
done
|
|
|
|
pass "$description"
|
|
}
|
|
|
|
assert_display() {
|
|
local description="$1" expected="$2"
|
|
|
|
local actual=no
|
|
OMARCHY_PCI_DEVICES_PATH="$tmp_dir/devices" "$ROOT/bin/omarchy-hw-nvidia-display" && actual=yes
|
|
|
|
[[ $actual == "$expected" ]] ||
|
|
fail "$description" "omarchy-hw-nvidia-display: expected $expected, got $actual"
|
|
|
|
pass "$description"
|
|
}
|
|
|
|
# AMD Cezanne integrated graphics.
|
|
write_pci_devices 0x1002:0x15e7:0x030000
|
|
assert_detects "a machine without an NVIDIA GPU detects nothing" no no no
|
|
|
|
# NVIDIA GA106M [RTX 3060 Mobile] alongside AMD Cezanne, the pair from issue #6660.
|
|
write_pci_devices 0x1002:0x15e7:0x030000 0x10de:0x2560:0x030200
|
|
assert_detects "a hybrid Ampere laptop detects a GSP GPU" yes yes no
|
|
|
|
# NVIDIA TU117M [GTX 1650 Mobile], the first generation with GSP firmware.
|
|
write_pci_devices 0x10de:0x1f91:0x030000
|
|
assert_detects "Turing is the oldest generation with GSP firmware" yes yes no
|
|
|
|
# NVIDIA GV100 [TITAN V], the newest generation without GSP firmware.
|
|
write_pci_devices 0x10de:0x1d81:0x030000
|
|
assert_detects "Volta is the newest generation without GSP firmware" yes no yes
|
|
|
|
# NVIDIA GP104 [GTX 1080].
|
|
write_pci_devices 0x10de:0x1b80:0x030000
|
|
assert_detects "Pascal detects a GPU without GSP firmware" yes no yes
|
|
|
|
# NVIDIA GM108M [GeForce 830M], the oldest part the 580xx driver supports.
|
|
write_pci_devices 0x10de:0x1340:0x030000
|
|
assert_detects "Maxwell detects a GPU without GSP firmware" yes no yes
|
|
|
|
# NVIDIA GK110 [GTX 780]. Kepler predates GSP but also predates 580xx, so
|
|
# claiming it here would install a driver that cannot drive it.
|
|
write_pci_devices 0x10de:0x1004:0x030000
|
|
assert_detects "Kepler is too old for either driver" yes no no
|
|
|
|
# NVIDIA GF100 [GTX 470], older still.
|
|
write_pci_devices 0x10de:0x06cd:0x030000
|
|
assert_detects "Fermi is too old for either driver" yes no no
|
|
|
|
# NVIDIA GB203 [RTX 5080], newer than every other device ID here.
|
|
write_pci_devices 0x10de:0x2c02:0x030000
|
|
assert_detects "Blackwell detects a GSP GPU" yes yes no
|
|
|
|
# The GA106 audio function carries the NVIDIA vendor ID but is not a GPU.
|
|
write_pci_devices 0x10de:0x228e:0x040300
|
|
assert_detects "a non-display NVIDIA function is not a GPU" no no no
|
|
|
|
write_pci_devices
|
|
assert_detects "a machine with no PCI devices detects nothing" no no no
|
|
|
|
# AMD Phoenix iGPU drives the display, NVIDIA RTX 3050 is discrete.
|
|
write_pci_devices 0x1002:0x15bf:0x030000:1 0x10de:0x25ac:0x030000:0
|
|
assert_display "a hybrid laptop with an AMD display GPU is not NVIDIA-driven" no
|
|
|
|
# Intel Alder Lake iGPU drives the display, NVIDIA Turing is discrete.
|
|
write_pci_devices 0x8086:0x46a6:0x030000:1 0x10de:0x1f91:0x030000:0
|
|
assert_display "a hybrid Intel+NVIDIA laptop is not NVIDIA-driven" no
|
|
|
|
# NVIDIA-only desktop keeps the current behavior.
|
|
write_pci_devices 0x10de:0x2c02:0x030000:1
|
|
assert_display "an NVIDIA-only machine is NVIDIA-driven" yes
|
|
|
|
# Fixtures without boot_vga preserve the current behavior.
|
|
write_pci_devices 0x10de:0x25ac:0x030000
|
|
assert_display "missing boot_vga info assumes NVIDIA drives the display" yes
|