#!/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