1d63d4d5aSSeth Howell#!/usr/bin/env bash 2eb53c232Spaul luse# SPDX-License-Identifier: BSD-3-Clause 3eb53c232Spaul luse# Copyright (C) 2018 Intel Corporation 4eb53c232Spaul luse# All rights reserved. 5eb53c232Spaul luse# 6fb732cb7SMichal Bergershopt -s nullglob 74f19ab4dSMichal Bergerset -e 8d63d4d5aSSeth Howell 9d63d4d5aSSeth Howellrootdir=$(readlink -f $(dirname $0))/.. 10*515ec7e7SGang Caoallowed_drivers=("igb_uio" "uio_pci_generic" "vfio_pci") 11d63d4d5aSSeth Howell 12fb732cb7SMichal Bergerreload_intel_qat() { 13be07560dSMichal Berger # We need to make sure the out-of-tree intel_qat driver, provided via autotest_setup.sh, 14be07560dSMichal Berger # is in use. Otherwise, some dependency modules loaded by qat_service may fail causing 15be07560dSMichal Berger # some disturbance later on during the tests - in particular, it's been seen that the 16be07560dSMichal Berger # adf_ctl was returning inconsistent data (wrong pci addresses), confusing the service 17be07560dSMichal Berger # into believing SR-IOV is not enabled. 18fb732cb7SMichal Berger 19fb732cb7SMichal Berger # If this file doesn't exist, then either intel_qat is a kernel built-in or is not loaded. 20fb732cb7SMichal Berger # Nothing to do in such cases, qat_service will load the module for us. 21fb732cb7SMichal Berger [[ -e /sys/module/intel_qat/taint ]] || return 0 22fb732cb7SMichal Berger 23fb732cb7SMichal Berger local t v 24fb732cb7SMichal Berger t=$(< /sys/module/intel_qat/taint) 25fb732cb7SMichal Berger v=$(< /sys/module/intel_qat/version) 26fb732cb7SMichal Berger 27fb732cb7SMichal Berger # OE - out-of-tree, unsigned. By the very default, drivers built via vm_setup.sh are not 28fb732cb7SMichal Berger # signed. 29fb732cb7SMichal Berger [[ -z $t || $t != *"OE"* ]] || return 0 30fb732cb7SMichal Berger 31fb732cb7SMichal Berger # Check the version of loaded module against the version of the same module as seen 32fb732cb7SMichal Berger # from .dep. perspective. if these are the same the most likely something is broken 33fb732cb7SMichal Berger # with the dependencies. We report a failure in such a case since reloading the module 34fb732cb7SMichal Berger # won't do any good anyway. 35fb732cb7SMichal Berger 36fb732cb7SMichal Berger if [[ $(modinfo -F version intel_qat) == "$v" ]]; then 37fb732cb7SMichal Berger cat <<- WARN 38fb732cb7SMichal Berger Upstream intel_qat driver detected. Same version of the driver is seen 39fb732cb7SMichal Berger in modules dependencies: $v. This may mean QAT build didn't update 40fb732cb7SMichal Berger dependencies properly. QAT setup may fail, please, rebuild the QAT 41fb732cb7SMichal Berger driver. 42fb732cb7SMichal Berger WARN 43fb732cb7SMichal Berger return 0 44fb732cb7SMichal Berger fi 45fb732cb7SMichal Berger 46fb732cb7SMichal Berger # Ok, intel_qat is an upstream module, replace it with the out-of-tree one. 47fb732cb7SMichal Berger echo "Reloading intel_qat module" 48fb732cb7SMichal Berger 49fb732cb7SMichal Berger local h=(/sys/module/intel_qat/holders/*) 50fb732cb7SMichal Berger h=("${h[@]##*/}") 51fb732cb7SMichal Berger 52fb732cb7SMichal Berger modprobe -r "${h[@]}" intel_qat 53fb732cb7SMichal Berger # qat_service does that too, but be vigilant 54fb732cb7SMichal Berger modprobe -a intel_qat "${h[@]}" 55fb732cb7SMichal Berger} 56fb732cb7SMichal Berger 576dcfa49fSMichal Berger# Please note that this script is not intended to be comprehensive or production quality. 58d63d4d5aSSeth Howell# It supports configuring a single card (the Intel QAT 8970) for use with the SPDK 59d63d4d5aSSeth Howell 60d63d4d5aSSeth Howellbad_driver=true 61d63d4d5aSSeth Howelldriver_to_bind=uio_pci_generic 62d63d4d5aSSeth Howell 63f6e79231SMichal Berger# try starting the qat service. If this doesn't work, just treat it as a warning for now. 64f6e79231SMichal Bergerif ! service qat_service start; then 65f6e79231SMichal Berger echo "failed to start the qat service. Something may be wrong with your 01.org driver." 66f6e79231SMichal Bergerfi 67f6e79231SMichal Berger 684f19ab4dSMichal Bergerreload_intel_qat 694f19ab4dSMichal Berger 704f19ab4dSMichal Berger_qat_pci_bdfs=( 714f19ab4dSMichal Berger /sys/bus/pci/drivers/c6xx/0000* 724f19ab4dSMichal Berger /sys/bus/pci/drivers/dh895xcc/0000* 738b13004bSYankun Li /sys/bus/pci/drivers/4xxx/0000* 744f19ab4dSMichal Berger) 754f19ab4dSMichal Berger 764f19ab4dSMichal Bergerqat_pci_bdfs=("${_qat_pci_bdfs[@]#*drivers/}") 774f19ab4dSMichal Berger 78d63d4d5aSSeth Howellif [ ${#qat_pci_bdfs[@]} -eq 0 ]; then 79d63d4d5aSSeth Howell echo "No QAT devices found. Exiting" 801aa72efaSMaciej Wawryk exit 1 81d63d4d5aSSeth Howellfi 82d63d4d5aSSeth Howell 831ccc878eSKarol Lateckiif [ -n "$1" ]; then 84d63d4d5aSSeth Howell driver_to_bind=$1 85d63d4d5aSSeth Howellfi 86d63d4d5aSSeth Howell 87fdc82d3bSMaciej Wawrykfor driver in "${allowed_drivers[@]}"; do 88d63d4d5aSSeth Howell if [ $driver == $driver_to_bind ]; then 89d63d4d5aSSeth Howell bad_driver=false 90d63d4d5aSSeth Howell fi 91d63d4d5aSSeth Howelldone 92d63d4d5aSSeth Howell 93d63d4d5aSSeth Howellif $bad_driver; then 94d63d4d5aSSeth Howell echo "Unrecognized driver. Please specify an accepted driver (listed below):" 95d63d4d5aSSeth Howell echo "${allowed_drivers[@]}" 96d63d4d5aSSeth Howell exit 1 97d63d4d5aSSeth Howellfi 98d63d4d5aSSeth Howell 994f19ab4dSMichal Bergerexpected_num_vfs=0 set_num_vfs=0 100d63d4d5aSSeth Howell# configure virtual functions for the QAT cards. 101fdc82d3bSMaciej Wawrykfor qat_bdf in "${qat_pci_bdfs[@]}"; do 1024f19ab4dSMichal Berger if [[ ! -e /sys/bus/pci/drivers/$qat_bdf/sriov_numvfs ]]; then 1034f19ab4dSMichal Berger echo "(${qat_bdf##*/}) sriov_numvfs interface missing, is SR-IOV enabled?" 1042f6afea6SMichal Berger continue 1052f6afea6SMichal Berger fi 106f6e79231SMichal Berger # Make sure autoprobe is disabled for the VFs so we don't have to race with the 107f6e79231SMichal Berger # qat_*vf drivers while binding the devices. 108f6e79231SMichal Berger echo "0" > "/sys/bus/pci/drivers/$qat_bdf/sriov_drivers_autoprobe" 1094f19ab4dSMichal Berger num_vfs=$(< "/sys/bus/pci/drivers/$qat_bdf/sriov_totalvfs") 1104f19ab4dSMichal Berger echo "$num_vfs" > /sys/bus/pci/drivers/$qat_bdf/sriov_numvfs 1114f19ab4dSMichal Berger num_vfs_set=$(< "/sys/bus/pci/drivers/$qat_bdf/sriov_numvfs") 1122f6afea6SMichal Berger if ((num_vfs != num_vfs_set)); then 1132f6afea6SMichal Berger echo "Number of VFs set to $num_vfs_set, expected $num_vfs" 1142f6afea6SMichal Berger else 1154f19ab4dSMichal Berger echo "${qat_bdf##*/} set to $num_vfs VFs" 1162f6afea6SMichal Berger fi 1174f19ab4dSMichal Berger ((expected_num_vfs += num_vfs)) 1184f19ab4dSMichal Berger ((set_num_vfs += num_vfs_set)) 119d63d4d5aSSeth Howelldone 120d63d4d5aSSeth Howell 1214f19ab4dSMichal Berger# Build VF list out of qat_pci_bdfs[@] by slapping /virtfn* to the path to know if we got'em all. 1224f19ab4dSMichal Berger# shellcheck disable=SC2206 # <- intentional 1234f19ab4dSMichal Bergerqat_vf_bdfs=(${_qat_pci_bdfs[@]/%//virtfn*}) 124d63d4d5aSSeth Howell 1254f19ab4dSMichal Bergerif ((expected_num_vfs != set_num_vfs || ${#qat_vf_bdfs[@]} != expected_num_vfs)); then 1264f19ab4dSMichal Berger echo "Failed to prepare the VFs. Aborting" >&2 127d63d4d5aSSeth Howell exit 1 128d63d4d5aSSeth Howellfi 129d63d4d5aSSeth Howell 130d63d4d5aSSeth Howell# Insert the dpdk uio kernel module. 131d63d4d5aSSeth Howellif [ $driver_to_bind == "igb_uio" ]; then 132*515ec7e7SGang Cao modprobe uio 1336dcfa49fSMichal Berger if ! modprobe igb_uio; then 134d63d4d5aSSeth Howell echo "Unable to insert the igb_uio kernel module. Aborting." 135d63d4d5aSSeth Howell exit 1 136d63d4d5aSSeth Howell fi 137d63d4d5aSSeth Howellelif [ "$driver_to_bind" == "uio_pci_generic" ]; then 138*515ec7e7SGang Cao modprobe uio 139d63d4d5aSSeth Howell modprobe uio_pci_generic 140*515ec7e7SGang Caoelif [ "$driver_to_bind" == "vfio_pci" ]; then 141*515ec7e7SGang Cao modprobe vfio 142*515ec7e7SGang Cao modprobe vfio_pci 143d63d4d5aSSeth Howellelse 144d63d4d5aSSeth Howell echo "Unsure how to work with driver $driver_to_bind. Please configure it in qat_setup.sh" 145d63d4d5aSSeth Howell exit 1 146d63d4d5aSSeth Howellfi 147d63d4d5aSSeth Howell 1484f19ab4dSMichal Berger# Unbind old driver if necessary. 149fdc82d3bSMaciej Wawrykfor vf in "${qat_vf_bdfs[@]}"; do 1504f19ab4dSMichal Berger vf=$(readlink -f "$vf") 1514f19ab4dSMichal Berger if [[ -e $vf/driver ]]; then 1524f19ab4dSMichal Berger old_driver=$(basename "$(readlink -f "$vf/driver")") 1534f19ab4dSMichal Berger if [[ $old_driver != "$driver_to_bind" ]]; then 1544f19ab4dSMichal Berger echo "unbinding driver $old_driver from qat VF at BDF ${vf##*/}" 1554f19ab4dSMichal Berger echo "${vf##*/}" > "/sys/bus/pci/drivers/$old_driver/unbind" 156d63d4d5aSSeth Howell fi 157d63d4d5aSSeth Howell fi 158*515ec7e7SGang Cao # Bind new driver 159*515ec7e7SGang Cao if [ "$driver_to_bind" == "vfio_pci" ]; then 160*515ec7e7SGang Cao "$rootdir/dpdk/usertools/dpdk-devbind.py" -b vfio-pci $vf 161*515ec7e7SGang Cao else 1624f19ab4dSMichal Berger echo "$driver_to_bind" > "$vf/driver_override" 1634f19ab4dSMichal Berger echo "${vf##*/}" > /sys/bus/pci/drivers_probe 164*515ec7e7SGang Cao fi 165d63d4d5aSSeth Howelldone 1664f19ab4dSMichal Berger 167d63d4d5aSSeth Howellecho "Properly configured the qat device with driver $driver_to_bind." 168