| #!/bin/bash |
| # DRM PMU |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| set -e |
| |
| output=$(mktemp /tmp/perf.drm_pmu.XXXXXX.txt) |
| |
| cleanup() { |
| rm -f "${output}" |
| |
| trap - EXIT TERM INT |
| } |
| |
| trap_cleanup() { |
| echo "Unexpected signal in ${FUNCNAME[1]}" |
| cleanup |
| exit 1 |
| } |
| trap trap_cleanup EXIT TERM INT |
| |
| # Array to store file descriptors and device names |
| declare -A device_fds |
| |
| # Open all devices and store file descriptors. Opening the device will create a |
| # /proc/$$/fdinfo file containing the DRM statistics. |
| fd_count=3 # Start with file descriptor 3 |
| for device in /dev/dri/* |
| do |
| if [[ ! -c "$device" ]] |
| then |
| continue |
| fi |
| major=$(stat -c "%Hr" "$device") |
| if [[ "$major" != 226 ]] |
| then |
| continue |
| fi |
| echo "Opening $device" |
| eval "exec $fd_count<\"$device\"" |
| echo "fdinfo for: $device (FD: $fd_count)" |
| cat "/proc/$$/fdinfo/$fd_count" |
| echo |
| device_fds["$device"]="$fd_count" |
| fd_count=$((fd_count + 1)) |
| done |
| |
| if [[ ${#device_fds[@]} -eq 0 ]] |
| then |
| echo "No DRM devices found [Skip]" |
| cleanup |
| exit 2 |
| fi |
| |
| # For each DRM event |
| err=0 |
| for p in $(perf list --raw-dump drm-) |
| do |
| echo -n "Testing perf stat of $p. " |
| perf stat -e "$p" --pid=$$ true > "$output" 2>&1 |
| if ! grep -q "$p" "$output" |
| then |
| echo "Missing DRM event in: [Failed]" |
| cat "$output" |
| err=1 |
| else |
| echo "[OK]" |
| fi |
| done |
| |
| # Close all file descriptors |
| for fd in "${device_fds[@]}"; do |
| eval "exec $fd<&-" |
| done |
| |
| # Finished |
| cleanup |
| exit $err |