xref: /spdk/test/setup/driver.sh (revision 4641aa53ae14ed7b2ae23551837977a7903dd986)
1#!/usr/bin/env bash
2#  SPDX-License-Identifier: BSD-3-Clause
3#  Copyright (C) 2020 Intel Corporation
4#  All rights reserved.
5#
6
7testdir=$(readlink -f "$(dirname "$0")")
8rootdir=$(readlink -f "$testdir/../../")
9source "$testdir/common.sh"
10
11dep() { modprobe --show-depends "$1"; }
12mod() { [[ $(dep "$1") == *".ko"* ]]; }
13bui() { [[ $(dep "$1") == "builtin $1" ]]; }
14is_driver() { mod "$1" || bui "$1"; }
15
16uio() {
17	is_driver uio_pci_generic
18}
19
20vfio() {
21	local iommu_grups
22	local unsafe_vfio
23
24	[[ -e /sys/module/vfio/parameters/enable_unsafe_noiommu_mode ]] \
25		&& unsafe_vfio=$(< /sys/module/vfio/parameters/enable_unsafe_noiommu_mode)
26
27	iommu_groups=(/sys/kernel/iommu_groups/*)
28
29	if ((${#iommu_groups[@]} > 0)) || [[ $unsafe_vfio == Y ]]; then
30		is_driver vfio_pci && return 0
31	fi
32	return 1
33}
34
35pick_driver() {
36	if vfio; then
37		echo "vfio-pci"
38	elif uio; then
39		echo "uio_pci_generic"
40	else
41		echo "No valid driver found"
42	fi
43}
44
45guess_driver() {
46	local driver setup_driver marker
47	local fail=0
48
49	driver=$(pick_driver)
50
51	if [[ $driver == "No valid driver found" ]]; then
52		[[ $(setup output config) == "$driver"* ]]
53		return 0
54	fi
55
56	echo "Looking for driver=$driver"
57	while read -r _ _ _ _ marker setup_driver; do
58		[[ $marker == "->" ]] || continue
59		# Allow for more open matching
60		# shellcheck disable=SC2053
61		[[ $setup_driver == $driver ]] || fail=1
62	done < <(setup output config)
63
64	((fail == 0))
65	setup reset
66}
67
68setup reset
69run_test "guess_driver" "guess_driver"
70