xref: /spdk/scripts/common.sh (revision eac02a4ace1a51fa675ea044cd054dc1d372e767)
1# Common shell utility functions
2
3function iter_pci_class_code() {
4	local class="$(printf %02x $((0x$1)))"
5	local subclass="$(printf %02x $((0x$2)))"
6	local progif="$(printf %02x $((0x$3)))"
7
8	if hash lspci &>/dev/null; then
9		if [ "$progif" != "00" ]; then
10			lspci -mm -n -D | \
11				grep -i -- "-p${progif}" | \
12				awk -v cc="\"${class}${subclass}\"" -F " " \
13				'{if (cc ~ $2) print $1}' | tr -d '"'
14		else
15			lspci -mm -n -D | \
16				awk -v cc="\"${class}${subclass}\"" -F " " \
17				'{if (cc ~ $2) print $1}' | tr -d '"'
18		fi
19	elif hash pciconf &>/dev/null; then
20		addr=($(pciconf -l | grep -i "class=0x${class}${subclass}${progif}" | \
21			cut -d$'\t' -f1 | sed -e 's/^[a-zA-Z0-9_]*@pci//g' | tr ':' ' '))
22		printf "%04x:%02x:%02x:%x\n" ${addr[0]} ${addr[1]} ${addr[2]} ${addr[3]}
23	else
24		echo "Missing PCI enumeration utility"
25		exit 1
26	fi
27}
28
29function iter_pci_dev_id() {
30	local ven_id="$(printf %04x $((0x$1)))"
31	local dev_id="$(printf %04x $((0x$2)))"
32
33	if hash lspci &>/dev/null; then
34		lspci -mm -n -D | awk -v ven="\"$ven_id\"" -v dev="\"${dev_id}\"" -F " " \
35			'{if (ven ~ $3 && dev ~ $4) print $1}' | tr -d '"'
36	elif hash pciconf &>/dev/null; then
37		addr=($(pciconf -l | grep -i "chip=0x${dev_id}${ven_id}" | \
38			cut -d$'\t' -f1 | sed -e 's/^[a-zA-Z0-9_]*@pci//g' | tr ':' ' '))
39		printf "%04x:%02x:%02x:%x\n" ${addr[0]} ${addr[1]} ${addr[2]} ${addr[3]}
40	else
41		echo "Missing PCI enumeration utility"
42		exit 1
43	fi
44}
45