diff --git a/assets/state-vfio-manager/0400_configmap.yaml b/assets/state-vfio-manager/0400_configmap.yaml index bf333bb92..85df8f8ca 100644 --- a/assets/state-vfio-manager/0400_configmap.yaml +++ b/assets/state-vfio-manager/0400_configmap.yaml @@ -94,6 +94,12 @@ data: echo "unbinding device $gpu" unbind_from_driver $gpu + #for graphics mode, we need to unbind the auxiliary device as well + aux_dev=$(get_graphics_aux_dev "$gpu") + if [ "$aux_dev" != "NONE" ]; then + echo "gpu $gpu is in graphics mode aux_dev $aux_dev" + unbind_from_driver "$aux_dev" + fi } unbind_all() { @@ -106,13 +112,9 @@ data: done } - bind_device() { + bind_pci_device() { local gpu=$1 - if ! is_nvidia_gpu_device $gpu; then - return 0 - fi - if ! is_bound_to_vfio $gpu; then unbind_from_other_driver $gpu echo "binding device $gpu" @@ -123,6 +125,48 @@ data: fi } + get_graphics_aux_dev() { + local gpu=$1 + device_class_file=$(readlink -f "/sys/bus/pci/devices/$gpu/class") + device_class=$(cat "$device_class_file") + if [ "$device_class" != "0x030000" ]; then + echo "NONE" + return + fi + + if ls "/sys/bus/pci/devices/$gpu" | grep consumer >& /dev/null; then + aux_dev=$(ls "/sys/bus/pci/devices/$gpu" | grep consumer | awk -Fconsumer:pci: '{print $2}') + if [ "$aux_dev" == "" ]; then + echo "NONE" + return + fi + + if ls "/sys/bus/pci/devices/$aux_dev/" >& /dev/null; then + echo "$aux_dev" + return + fi + fi + + echo "NONE" + } + + bind_device() { + local gpu=$1 + + if ! is_nvidia_gpu_device $gpu; then + echo "device $gpu is not a gpu!" + return 0 + fi + + bind_pci_device "$gpu" + #for graphics mode, we need to bind the auxiliary device as well + aux_dev=$(get_graphics_aux_dev "$gpu") + if [ "$aux_dev" != "NONE" ]; then + echo "gpu $gpu is in graphics mode aux_dev $aux_dev" + bind_pci_device "$aux_dev" + fi + } + bind_all() { for dev in /sys/bus/pci/devices/*; do read vendor < $dev/vendor