Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0-or-later
3
4SYSFS=
5# Kselftest framework requirement - SKIP code is 4.
6ksft_skip=4
7retval=0
8skipmsg="skip all tests:"
9
10PCIEPORTTYPE="PCIe_Port_Link_Speed"
11
12prerequisite()
13{
14 local ports
15
16 if [ $UID != 0 ]; then
17 echo $skipmsg must be run as root >&2
18 exit $ksft_skip
19 fi
20
21 SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
22
23 if [ ! -d "$SYSFS" ]; then
24 echo $skipmsg sysfs is not mounted >&2
25 exit $ksft_skip
26 fi
27
28 if ! ls $SYSFS/class/thermal/cooling_device* > /dev/null 2>&1; then
29 echo $skipmsg thermal cooling devices missing >&2
30 exit $ksft_skip
31 fi
32
33 ports=`grep -e "^$PCIEPORTTYPE" $SYSFS/class/thermal/cooling_device*/type | wc -l`
34 if [ $ports -eq 0 ]; then
35 echo $skipmsg pcie cooling devices missing >&2
36 exit $ksft_skip
37 fi
38}
39
40testport=
41find_pcie_port()
42{
43 local patt="$1"
44 local pcieports
45 local max
46 local cur
47 local delta
48 local bestdelta=-1
49
50 pcieports=`grep -l -F -e "$patt" /sys/class/thermal/cooling_device*/type`
51 if [ -z "$pcieports" ]; then
52 return
53 fi
54 pcieports=${pcieports//\/type/}
55 # Find the port with the highest PCIe Link Speed
56 for port in $pcieports; do
57 max=`cat $port/max_state`
58 cur=`cat $port/cur_state`
59 delta=$((max-cur))
60 if [ $delta -gt $bestdelta ]; then
61 testport="$port"
62 bestdelta=$delta
63 fi
64 done
65}
66
67sysfspcidev=
68find_sysfs_pci_dev()
69{
70 local typefile="$1/type"
71 local pcidir
72
73 pcidir="$SYSFS/bus/pci/devices/`sed -e "s|^${PCIEPORTTYPE}_||g" $typefile`"
74
75 if [ -r "$pcidir/current_link_speed" ]; then
76 sysfspcidev="$pcidir/current_link_speed"
77 fi
78}
79
80usage()
81{
82 echo "Usage $0 [ -d dev ]"
83 echo -e "\t-d: PCIe port BDF string (e.g., 0000:00:04.0)"
84}
85
86pattern="$PCIEPORTTYPE"
87parse_arguments()
88{
89 while getopts d:h opt; do
90 case $opt in
91 h)
92 usage "$0"
93 exit 0
94 ;;
95 d)
96 pattern="$PCIEPORTTYPE_$OPTARG"
97 ;;
98 *)
99 usage "$0"
100 exit 0
101 ;;
102 esac
103 done
104}
105
106parse_arguments "$@"
107prerequisite
108find_pcie_port "$pattern"
109if [ -z "$testport" ]; then
110 echo $skipmsg "pcie cooling device not found from sysfs" >&2
111 exit $ksft_skip
112fi
113find_sysfs_pci_dev "$testport"
114if [ -z "$sysfspcidev" ]; then
115 echo $skipmsg "PCIe port device not found from sysfs" >&2
116 exit $ksft_skip
117fi
118
119./set_pcie_speed.sh "$testport" "$sysfspcidev"
120retval=$?
121
122exit $retval