123 lines
2.2 KiB
Bash
Executable File
123 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
SYSFS=
|
|
# Kselftest framework requirement - SKIP code is 4.
|
|
ksft_skip=4
|
|
retval=0
|
|
skipmsg="skip all tests:"
|
|
|
|
PCIEPORTTYPE="PCIe_Port_Link_Speed"
|
|
|
|
prerequisite()
|
|
{
|
|
local ports
|
|
|
|
if [ $UID != 0 ]; then
|
|
echo $skipmsg must be run as root >&2
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
|
|
|
|
if [ ! -d "$SYSFS" ]; then
|
|
echo $skipmsg sysfs is not mounted >&2
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
if ! ls $SYSFS/class/thermal/cooling_device* > /dev/null 2>&1; then
|
|
echo $skipmsg thermal cooling devices missing >&2
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
ports=`grep -e "^$PCIEPORTTYPE" $SYSFS/class/thermal/cooling_device*/type | wc -l`
|
|
if [ $ports -eq 0 ]; then
|
|
echo $skipmsg pcie cooling devices missing >&2
|
|
exit $ksft_skip
|
|
fi
|
|
}
|
|
|
|
testport=
|
|
find_pcie_port()
|
|
{
|
|
local patt="$1"
|
|
local pcieports
|
|
local max
|
|
local cur
|
|
local delta
|
|
local bestdelta=-1
|
|
|
|
pcieports=`grep -l -F -e "$patt" /sys/class/thermal/cooling_device*/type`
|
|
if [ -z "$pcieports" ]; then
|
|
return
|
|
fi
|
|
pcieports=${pcieports//\/type/}
|
|
# Find the port with the highest PCIe Link Speed
|
|
for port in $pcieports; do
|
|
max=`cat $port/max_state`
|
|
cur=`cat $port/cur_state`
|
|
delta=$((max-cur))
|
|
if [ $delta -gt $bestdelta ]; then
|
|
testport="$port"
|
|
bestdelta=$delta
|
|
fi
|
|
done
|
|
}
|
|
|
|
sysfspcidev=
|
|
find_sysfs_pci_dev()
|
|
{
|
|
local typefile="$1/type"
|
|
local pcidir
|
|
|
|
pcidir="$SYSFS/bus/pci/devices/`sed -e "s|^${PCIEPORTTYPE}_||g" $typefile`"
|
|
|
|
if [ -r "$pcidir/current_link_speed" ]; then
|
|
sysfspcidev="$pcidir/current_link_speed"
|
|
fi
|
|
}
|
|
|
|
usage()
|
|
{
|
|
echo "Usage $0 [ -d dev ]"
|
|
echo -e "\t-d: PCIe port BDF string (e.g., 0000:00:04.0)"
|
|
}
|
|
|
|
pattern="$PCIEPORTTYPE"
|
|
parse_arguments()
|
|
{
|
|
while getopts d:h opt; do
|
|
case $opt in
|
|
h)
|
|
usage "$0"
|
|
exit 0
|
|
;;
|
|
d)
|
|
pattern="$PCIEPORTTYPE_$OPTARG"
|
|
;;
|
|
*)
|
|
usage "$0"
|
|
exit 0
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
parse_arguments "$@"
|
|
prerequisite
|
|
find_pcie_port "$pattern"
|
|
if [ -z "$testport" ]; then
|
|
echo $skipmsg "pcie cooling device not found from sysfs" >&2
|
|
exit $ksft_skip
|
|
fi
|
|
find_sysfs_pci_dev "$testport"
|
|
if [ -z "$sysfspcidev" ]; then
|
|
echo $skipmsg "PCIe port device not found from sysfs" >&2
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
./set_pcie_speed.sh "$testport" "$sysfspcidev"
|
|
retval=$?
|
|
|
|
exit $retval
|