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