#!/bin/sh

#
# vga_check [verbose] nvidia,radeon 00:01.0 00:03.0 ...
#
vga_check() {
	local _bound_cards="0"
	local _drivers=""
	local _verbose=""
	if [ "$1" = "verbose" ]; then
		_verbose="yes"
		shift
	fi
	local _target_drivers=$1
	shift
	local _devlist=$@ _d _cardname _path _driver _ldd _ld _bcn
	for _d in ${_devlist}; do
		_cardname=$(lspci | grep ^${_d} | sed -e 's/.*\[//' -e 's/\].*//')
		_path="/sys/bus/pci/devices/0000:${_d}"
		_driver=$(basename $(readlink "${_path}/driver"))
		[ -n "${_verbose}" ] && \
			echo "Device ${_d} card \"${_cardname}\" driver \"${_driver}\""
		echo ${_target_drivers} | grep ${_driver} > /dev/null 2>&1 && \
			_bound_cards=$((${_bound_cards}+1))
		if ! echo ${_drivers} | grep ${_driver} > /dev/null 2>&1; then
			[ -z "${_drivers}" ] && _drivers="${_driver}" || _drivers="${_drivers},${_driver}"
		fi
		_ldd="${_path}/iommu_group/devices"
		if [ -d "${_ldd}" ]; then
			[ -n "${_verbose}" ] && \
				echo "IOMMU active, devices of the \"${_cardname}\" group are: "
			for _ld in $(ls ${_ldd}); do
				_ld=$(echo ${_ld} | sed 's/[0-9]*\://')
				_bcn=$(lspci | grep ^${_ld} | sed -e 's/.*\[//' -e 's/\].*//')
				echo -e "\t${_bcn}"
			done
		fi
	done
	if [ -n "${_verbose}" ]; then
		echo "Number of cards bound to driver(s) \"${_target_drivers}\" are ${_bound_cards}"
		echo "Active driver(s) for card(s): \"${_drivers}\""
	fi
}

VGA_DEVS=$(lspci | grep VGA | awk '{print $1;}')

if [ -n "${VGA_DEVS}" ]; then
	vga_check verbose nvidia,radeon ${VGA_DEVS}
else
	echo "No GPUs found"
fi
