]> ## i915-sriov ### 2023.04.01 - make tools.sh work with multiple Intel Graphic Cards; - restore libvirt.php when module download failed; - make slot of PCI address to 0 when machine type is q35 ### 2023.03.30 - Add plugin page in Settings; - Fix HW transcode not work for PF on linux-5.19 ### 2023.03.28 - Change PCI address of VF to 0000:06:10.0 ### 2023.03.21 - Initial unRAID V6.11 release. &pkgurl;/&pluginpkg; MODCFGDIR="/boot/config/modprobe.d/" if [ ! -f "${MODCFGDIR}/i915-sriov.conf" ]; then mkdir -p &packages; # install config to modprobe.d/i915-sriov.conf mkdir -p ${MODCFGDIR} echo "# disable autoload old i915 module on boot blacklist i915 options i915 enable_guc=7" > ${MODCFGDIR}/i915-sriov.conf fi mkdir -p &plugindir; #Create settings file if not found if [ ! -f "&plugindir;/&name;.cfg" ]; then echo 'vfnumber=2' > "&plugindir;/&name;.cfg" fi if [ ! -f /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php.orig ]; then cp /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php.orig else cp /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php.orig /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php fi # Fix PCI address error when iGPU VF assigned to VM cd / ; patch -p1 <<EOF --- a/usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php +++ b/usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php @@ -780,7 +780,15 @@ \$strSpecialAddress = ''; if (\$gpu_bus == '00' && \$gpu_slot == '02') { \$strXVGA = ''; - \$strSpecialAddress = "<address type='pci' domain='0x0000' bus='0x".\$gpu_bus."' slot='0x".\$gpu_slot."' function='0x".\$gpu_function."'/>"; + if (\$gpu_function == '00') { + \$strSpecialAddress = "<address type='pci' domain='0x0000' bus='0x".\$gpu_bus."' slot='0x".\$gpu_slot."' function='0x".\$gpu_function."'/>"; + } else { + if (\$machine_type == 'q35'){ + \$strSpecialAddress = "<address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>"; + } else { + \$strSpecialAddress = "<address type='pci' domain='0x0000' bus='0x06' slot='0x10' function='0x0'/>"; + } + } } \$strRomFile = ''; EOF KERNEL_V="$(uname -r)" PKGNAME="&name;-${KERNEL_V}.txz" removal() { rm -rf &plugindir; /boot/config/modprobe.d/i915-sriov.conf # Restore libvirt.php if [ -f /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php.orig ]; then mv /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php.orig /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php fi } #Download i915-sriov module Package download() { mkdir -p &packages;/${KERNEL_V%%-*} if wget -q -nc --show-progress --progress=bar:force:noscroll -O "&packages;/${KERNEL_V%%-*}/${PKGNAME}" "&pkgurl;/${PKGNAME}" ; then wget -q -nc --show-progress --progress=bar:force:noscroll -O "&packages;/${KERNEL_V%%-*}/${PKGNAME}.md5" "&pkgurl;/${PKGNAME}.md5" if [ "$(md5sum &packages;/${KERNEL_V%%-*}/${PKGNAME} | awk '{print $1}')" != "$(cat &packages;/${KERNEL_V%%-*}/${PKGNAME}.md5 | awk '{print $1}')" ]; then echo echo "-----ERROR - ERROR - ERROR - ERROR - ERROR - ERROR - ERROR - ERROR - ERROR------" echo "--------------------------------CHECKSUM ERROR!---------------------------------" removal exit 1 fi echo echo "----Successfully downloaded i915-sriov module Package for kernel v${KERNEL_V%%-*}, please wait!----" else echo echo "--------Can't download i915-sriov module Package for kernel v${KERNEL_V%%-*}-----------" removal exit 1 fi } #Check if driver is already downloaded check() { if ! ls -1 &packages;/${KERNEL_V%%-*}/ | grep -q "${PKGNAME}" ; then echo echo "+==============================================================================" echo "| WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING" echo "|" echo "| Don't close this window with the red 'X' in the top right corner " echo "| until the 'DONE' button is displayed!" echo "|" echo "| WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING" echo "+==============================================================================" echo echo "----------Downloading i915-sriov module Package for kernel v${KERNEL_V%%-*}----------" echo "---------This could take some time, please don't close this window!-----------" download else wget -q -nc --show-progress --progress=bar:force:noscroll -O "&packages;/${KERNEL_V%%-*}/${PKGNAME}.md5" "&pkgurl;/${PKGNAME}.md5" if [ "$(md5sum &packages;/${KERNEL_V%%-*}/${PKGNAME} | awk '{print $1}')" != "$(cat &packages;/${KERNEL_V%%-*}/${PKGNAME}.md5 | awk '{print $1}')" ]; then download fi echo echo "---------i915-sriov module Package for kernel v${KERNEL_V%%-*} found locally---------" fi } # Installation install() { /sbin/upgradepkg --install-new "&packages;/${KERNEL_V%%-*}/${PKGNAME}" } enable_module() { VF_NUM="$(cat &plugindir;/&name;.cfg | grep "vfnumber=" | cut -d '=' -f2 | sed "s/\"//g")" modprobe i915 sleep 2 if [ -f "/sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs" ]; then echo ${VF_NUM} > /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs /usr/local/sbin/vfio-pci fi } # Script main check install enable_module echo "" echo "+==============================================================================" echo "| Installation of i915-sriov module Package for kernel v${KERNEL_V%%-*} successful, reboot to take effect." echo "+==============================================================================" echo "" exit 0 set -e echo "" echo "+==============================================================================" echo "| Uninstalling packages, removing directories and files" echo "+==============================================================================" echo "" removepkg &pluginpkg; # Restore libvirt.php if [ -f /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php.orig ]; then mv /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php.orig /usr/local/emhttp/plugins/dynamix.vm.manager/include/libvirt.php fi # Define directories and files to remove in a multi-line string dirs_files_to_remove=" &plugindir; /boot/config/modprobe.d/i915-sriov.conf " echo "Starting directory and file removal\n" # Read through package removal lines, uninstalling each while IFS= read -r line do # If line is empty, skip to the next iteration [ -z "$line" ] && continue echo "Deleting $line" # rm -rf "/path/to/prefix*" * expansion fails due to quotes, wrap in bash exec bash -c "rm -rf $line" done < <(printf '%s\n' "$dirs_files_to_remove") printf "\nDirectory and file removal done" echo "" echo "+==============================================================================" echo "| &name; has been uninstalled, please reboot your server." echo "+==============================================================================" echo "" exit 0