xref: /spdk/scripts/qat_setup.sh (revision 515ec7e7c71bfc03a47f1591f994f05a41758ee9)
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