123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- OS="LINUX"
- TMP_ROOT="/tmp"
- TXT_READER=more
- CAT_LOG=no
- RETAIN_TL_HEADERS=no
- DEVICE="all"
- DEVICES=0
- MIN_DEVICE_ID=0
- MAX_DEVICE_ID=15
- HWPERF_FW_FILTER=""
- HWPERF_HOST_FILTER=""
- HWPERF_RESET_STREAMS="false"
- HWPERF_V1CNT="false"
- if [ x"$PVRHWPERF_TMP" != x ]; then
- if [ -d "$PVRHWPERF_TMP" ]; then
- TMP_ROOT="$PVRHWPERF_TMP"
- fi
- fi
- if [ -x "/system/bin/logcat" ]; then
- OS="ANDROID"
- BIN_DIR=/system/vendor/bin
- TMP_ROOT="/data/local/tmp"
- TXT_READER=cat
- fi
- TLD_RET=
- EXEC_LINE=""
- H2J_NAME="hwperfbin2jsont"
- JSM_NAME="hwperfjsonmerge.py"
- if [ x"$OS" = xLINUX ]; then
- PYTHON_BIN="`which \"python\"`"
- fi
- # FUNCTIONS FOR SAVING AND RESTORING STATE
- preserve_state() {
- PVR_DBG_LEVEL_OLD="$PVRDebugLevel"
- for ID in $DEVICES; do
- eval "_FW_FILTER_FILE=\$HWPERF_FW_FILTER_FILE_$ID"
- if [ x"$HWPERF_FW_FILTER" != x ] && [ -f $_FW_FILTER_FILE ]; then
- eval "HWPERF_FW_FILTER_${ID}_OLD=\"\$(cat $_FW_FILTER_FILE)\""
- fi
- eval "_HOST_FILTER_FILE=\$HWPERF_HOST_FILTER_FILE_$ID"
- if [ x"$HWPERF_HOST_FILTER" != x ] && [ -f $_HOST_FILTER_FILE ]; then
- eval "HWPERF_HOST_FILTER_${ID}_OLD=\"\$(cat $_HOST_FILTER_FILE)\""
- fi
- done
- }
- restore_state() {
- export PVRDebugLevel=$PVR_DBG_LEVEL_OLD
- for ID in $DEVICES; do
- eval "_FW_FILTER=\$HWPERF_FW_FILTER_${ID}_OLD"
- eval "_FW_FILTER_FILE=\$HWPERF_FW_FILTER_FILE_${ID}"
- if [ x"$_FW_FILTER" != x ]; then
- echo $_FW_FILTER > $_FW_FILTER_FILE
- fi
- eval "_HOST_FILTER=\$HWPERF_HOST_FILTER_${ID}_OLD"
- eval "_HOST_FILTER_FILE=\$HWPERF_HOST_FILTER_FILE_${ID}"
- if [ x"$_HOST_FILTER" != x ]; then
- echo $_HOST_FILTER > $_HOST_FILTER_FILE
- fi
- done
- }
- OUT1_JSON_FILE_PREFIX="hwperf_fw_"
- OUT2_JSON_FILE_PREFIX="hwperf_host_"
- OUT_JSON_MERGE_FILE_PREFIX="hwperf_merge_"
- # PARAMETERS PARSING
- args="$@ dummy"
- next=
- skip_next="true"
- for argument in $args
- do
- curr=$next
- next=$argument
- if [ "$skip_next" = "true" ]; then
- skip_next="false"
- continue
- fi
- case "$curr" in
- -device)
- DEVICE=$next
- skip_next="true"
- ;;
- -t) EXEC_LINE=$H2J_NAME
- OUT1_JSON_FILE_TMP=$OUT1_JSON_FILE_PREFIX"*.json"
- OUT1_JSON_FILE="./"
- OUT2_JSON_FILE_TMP=$OUT2_JSON_FILE_PREFIX"*.json"
- OUT2_JSON_FILE="./"
- OUT3_JSON_FILE_TMP="hwperf_client_*.json"
- OUT3_JSON_DIR="./"
- ;;
- -rt) EXEC_LINE="$H2J_NAME $ -raw"
- OUT1_JSON_FILE_TMP=$OUT1_JSON_FILE_PREFIX"*.raw.json"
- OUT1_JSON_FILE="./"
- OUT2_JSON_FILE_TMP=$OUT2_JSON_FILE_PREFIX"*.raw.json"
- OUT2_JSON_FILE="./"
- OUT3_JSON_FILE_TMP="hwperf_client_*.raw.json"
- OUT3_JSON_DIR="./"
- ;;
- -m) OUT_JSON_MERGE_FILE_TMP=$OUT_JSON_MERGE_FILE_PREFIX"*.json"
- OUT_JSON_MERGE_FILE="./"
- ;;
- -c) CAT_LOG=yes ;;
- -h) echo "+-----------------------------------------------------------------------------+"
- echo "| pvrhwperf : run pvrtld (Transport Layer Daemon) for gathering HWPerf data"
- echo "|"
- echo "| The HWPerf output data (firmware, host and client) is generated"
- echo "| per-device and is segregated accordingly in files named:"
- echo "| * hwperf_fw_<DeviceID>.[bin/json]"
- echo "| * hwperf_host_<DeviceID>.[bin/json]"
- echo "| * hwperf_client_<DeviceID>_<PID>.[bin/json]"
- echo "| where <DeviceID> is unique identifier for a GPU device."
- echo "+-----------------------------------------------------------------------------+"
- echo "| Usage:"
- echo "| -device ID : Device ID (0-15 or \"all\") for which data will be captured"
- echo "| (default \"all\"). If not specified or \"all\", data from all"
- echo "| devices will be captured."
- echo "| -t : Call hwperfbin2jsont (if present), to process the generated"
- echo "| *.bin output files, after pvrtld end."
- echo "| -rt : Call hwperfbin2jsont, adding the -raw parameter, to process the"
- echo "| generated *.bin output files, after pvrtld end."
- if [ x"$PYTHON_BIN" != x ]; then
- echo "| -m : Call hwperfjsonmerge.py (if present), to merge generated *.json"
- echo "| files (python interpreter required)."
- fi
- echo "| -c : Prints the log files to the std output just after pvrtld execution."
- echo "| -h : Print this message."
- echo "| -fw 0xFILTER : Specify a 64-bit hexadecimal filter value for FW events"
- echo "| (original value is restored afterwards)."
- echo "| -host 0xFILTER : Specify a 32-bit hexadecimal filter value for Server host"
- echo "| host events (original value is restored afterwards)."
- echo "| -r : Reset streams before capturing data."
- echo "| -tlbin : In addition to regular data also retain packet headers"
- echo "| in the binary file (generates *.tlbin files)."
- echo "| -wa-v1cntids : Insert counter IDs alongside the performance counter"
- echo "| values in the processed hwperfbin2jsont output."
- echo "| NOTE: For Volcanic Drivers ONLY"
- echo "+-----------------------------------------------------------------------------+"
- exit 0
- ;;
- -fw) HWPERF_FW_FILTER=$next
- skip_next="true"
- ;;
- -host) HWPERF_HOST_FILTER=$next
- skip_next="true"
- ;;
- -r) HWPERF_RESET_STREAMS="true"
- ;;
- -tlbin) RETAIN_TL_HEADERS=yes
- ;;
- -wa-v1cntids)
- HWPERF_V1CNT="true"
- ;;
- *) echo "[Error] Argument '$curr' not recognized."
- echo " Run '$0 -h' for more information."; exit 1 ;;
- esac
- done
- # ENVIRONMENT CHECK
- if [ x"$OS" = xANDROID ]; then
- TLD_BIN="$BIN_DIR/pvrtld"
- H2J_BIN="$BIN_DIR/$H2J_NAME"
- else
- TLD_BIN="`which \"pvrtld\"`"
- H2J_BIN="`which \"$H2J_NAME\"`"
- JSM_BIN="`which \"$JSM_NAME\"`"
- fi
- if [ x"$DEVICE" != xall ]; then
- if ! [ $DEVICE -ge $MIN_DEVICE_ID ] 2>/dev/null; then
- echo "[Error] invalid device id"
- exit 1
- fi
- if ! [ $DEVICE -le $MAX_DEVICE_ID ] 2>/dev/null; then
- echo "[Error] invalid device id"
- exit 1
- fi
- fi
- if [ ! -f "$TLD_BIN" ]; then
- echo "[Error] pvrtld not found"
- exit 1
- fi
- if [ x"$EXEC_LINE" != x ]; then
- if [ ! -f "$H2J_BIN" ]; then
- echo "[Error] hwperfbin2jsont not found"
- exit 1
- fi
- if [ "$HWPERF_V1CNT" = "true" ]; then
- EXEC_LINE="$EXEC_LINE -wa-v1cntids"
- fi
- fi
- # ENVIRONMENT VARIABLES
- WORK_DIR="$TMP_ROOT/hwperf/`date +%s`"
- OUT1_JSON_FILE_TMP="$WORK_DIR/$OUT1_JSON_FILE_TMP"
- OUT2_JSON_FILE_TMP="$WORK_DIR/$OUT2_JSON_FILE_TMP"
- if [ -n "$OUT3_JSON_FILE_TMP" ]; then
- OUT3_JSON_FILE_TMP="$WORK_DIR/$OUT3_JSON_FILE_TMP"
- fi
- OUT_JSON_MERGE_FILE_TMP="$WORK_DIR/$OUT_JSON_MERGE_FILE_TMP"
- CFG_FILE=$WORK_DIR/"tld.conf"
- TLD_LOG_FILE=$WORK_DIR/"tld.log"
- HWP_LOG_FILE=$WORK_DIR/"hwp.log"
- OUT1_FILE_TMP=$WORK_DIR/"hwperf_fw_*.*bin"
- OUT2_FILE_TMP=$WORK_DIR/"hwperf_host_*.*bin"
- OUT3_FILE_TMP=$WORK_DIR/"hwperf_client_*.*bin"
- OUT1_FILE="./"
- OUT2_FILE="./"
- OUT3_DIR="./"
- # check if any filter is enabled first so that we can terminate before any
- # filter is set
- if [ x"$HWPERF_FW_FILTER" != x ] || [ x"$HWPERF_HOST_FILTER" != x ]; then
- if [ x"$OS" = xANDROID ]; then
- USERID=$USER_ID
- else
- USERID=`id -u`
- fi
- # root privileges are needed to set filters - return error if executed
- # as regular user
- if [ "$USERID" != "0" ]; then
- echo "[Error] This script needs to be executed with root privileges"
- exit 1
- fi
- # if we have root privileges we can check for the debug files
- if [ -d "/sys/kernel/debug/pvr" ]; then
- DEBUG_DIR="/sys/kernel/debug/pvr"
- elif [ -d "/proc/pvr" ]; then
- DEBUG_DIR="/proc/pvr"
- else
- echo "Error: No valid debug path (Neither /sys/kernel/debug/pvr or /proc/pvr exist)"
- exit 1
- fi
- fi
- if [ x"$DEVICE" = xall ]; then
- DEVICES=$(seq $MIN_DEVICE_ID $MAX_DEVICE_ID)
- else
- DEVICES=$DEVICE
- fi
- # needs to be executed before "preserve_state"
- for ID in $DEVICES; do
- eval "HWPERF_FW_FILTER_FILE_$ID=\"$DEBUG_DIR/apphint/$ID/HWPerfFWFilter\""
- eval "HWPERF_HOST_FILTER_FILE_$ID=\"$DEBUG_DIR/apphint/$ID/HWPerfHostFilter\""
- done
- preserve_state
- export PVRDebugLevel=0x00
- for ID in $DEVICES; do
- eval "_FW_FILTER_FILE=\$HWPERF_FW_FILTER_FILE_$ID"
- eval "_HOST_FILTER_FILE=\$HWPERF_HOST_FILTER_FILE_$ID"
- if [ x"$HWPERF_FW_FILTER" != x ] || [ x"$HWPERF_HOST_FILTER" != x ]; then
- if [ x"$HWPERF_FW_FILTER" != x ]; then
- if [ ! -f $_FW_FILTER_FILE ] && [ x"$DEVICE" != xall ]; then
- echo "[Error] Could not set HW performance events filter"
- restore_state
- exit 1
- fi
- echo $HWPERF_FW_FILTER 2>/dev/null > $_FW_FILTER_FILE 2>/dev/null
- if [ $? != 0 ] && [ x"$DEVICE" != xall ]; then
- echo "[Error] Failed to set HW performance filter"
- echo " Check if the parameters passed to the script are valid"
- restore_state
- exit 1
- fi
- fi
- if [ x"$HWPERF_HOST_FILTER" != x ]; then
- if [ ! -f $_HOST_FILTER_FILE ] && [ x"$DEVICE" != xall ]; then
- echo "[Error] Could not set host events filter"
- restore_state
- exit 1
- fi
- echo $HWPERF_HOST_FILTER 2>/dev/null > $_HOST_FILTER_FILE 2>/dev/null
- if [ $? != 0 ] && [ x"$DEVICE" != xall ]; then
- echo "[Error] Failed to set host events filter"
- echo " Check if the parameters passed to the script are valid"
- restore_state
- exit 1
- fi
- fi
- fi
- done
- # ENVIRONMENT SETUP
- # - Create working directory
- mkdir -p $WORK_DIR
- # - Create configuration file
- echo "[pvrtld]
- output_folder_name=$WORK_DIR
- output_file_save_previous=yes" > $CFG_FILE
- if [ "$RETAIN_TL_HEADERS" = "yes" ]; then
- echo "omit_header=no" >> $CFG_FILE
- else
- echo "omit_header=yes" >> $CFG_FILE
- fi
- echo "
- [tlctrl]
- enabled=yes
- wait_for_stream=yes
- ctrl_stream=yes
- [hwperf_fw_]
- enabled=yes
- discover=yes
- wait_for_stream=yes
- server_block_nodata=no" >> $CFG_FILE
- # - Add the post processing command if the tool exists
- if [ x"$H2J_BIN" != x ] && [ x"$EXEC_LINE" != x ]; then
- echo "exec=\"$EXEC_LINE\"" >> $CFG_FILE
- fi
- if [ "$HWPERF_RESET_STREAMS" = "true" ]; then
- echo "reset_on_open=\"yes\"" >> $CFG_FILE
- fi
- if [ x"$DEVICE" != xall ]; then
- echo "device=$DEVICE" >> $CFG_FILE
- fi
- echo "
- [hwperf_host_]
- enabled=yes
- discover=yes
- wait_for_stream=yes" >> $CFG_FILE
- # - Add the post processing command if the tool exists
- if [ x"$H2J_BIN" != x ] && [ x"$EXEC_LINE" != x ]; then
- echo "exec=\"$EXEC_LINE\"" >> $CFG_FILE
- fi
- if [ "$HWPERF_RESET_STREAMS" = "true" ]; then
- echo "reset_on_open=\"yes\"" >> $CFG_FILE
- fi
- if [ x"$DEVICE" != xall ]; then
- echo "device=$DEVICE" >> $CFG_FILE
- fi
- echo "
- [hwperf_client_]
- enabled=yes
- discover=yes" >> $CFG_FILE
- # - Add the post processing command if the tool exists
- if [ x"$H2J_BIN" != x ] && [ x"$EXEC_LINE" != x ]; then
- echo "exec=\"$EXEC_LINE\"" >> $CFG_FILE
- fi
- if [ "$HWPERF_RESET_STREAMS" = "true" ]; then
- echo "reset_on_open=\"yes\"" >> $CFG_FILE
- fi
- if [ x"$DEVICE" != xall ]; then
- echo "device=$DEVICE" >> $CFG_FILE
- fi
- # EXECUTION
- echo "+-----------------------------------------------------------------------------+"
- echo "| Starting capture of HWPerf data..."
- echo "+-----------------------------------------------------------------------------+"
- echo "| Using these temporary files:"
- echo "| - TLDaemon configuration file: $CFG_FILE"
- echo "| - TLDaemon log file: $TLD_LOG_FILE"
- echo "| - HWPerf binary file(s): $OUT1_FILE_TMP"
- echo "| - HWPerfHost binary file(s): $OUT2_FILE_TMP"
- echo "| - HWPerfClient binary file(s): $OUT3_FILE_TMP"
- if [ x"$H2J_BIN" = x ] || [ x"$EXEC_LINE" = x ]; then
- echo "| - No JSON output selected"
- else
- echo "| - HWPerf raw json file(s): $OUT1_JSON_FILE_TMP"
- echo "| - HWPerfHost raw json file(s): $OUT2_JSON_FILE_TMP"
- echo "| - HWPerfClient raw json file: $OUT3_JSON_FILE_TMP"
- if [ x"$JSM_BIN" != x ] && [ x"$PYTHON_BIN" != x ] && [ x"$OUT_JSON_MERGE_FILE" != x ]; then
- echo "| - HWPerf merged json file(s): $OUT_JSON_MERGE_FILE_TMP"
- fi
- echo "| - JSON conversion log file: $TLD_LOG_FILE"
- fi
- echo "+-----------------------------------------------------------------------------+"
- $TLD_BIN -f=$CFG_FILE -q -s 2> $TLD_LOG_FILE
- TLD_RET=$?
- # LAST MESSAGES
- if [ "$TLD_RET" -ne "0" ]; then
- echo "+-----------------------------------------------------------------------------+"
- echo "| Capture process exited with error code $TLD_RET"
- else
- out1filecnt=$(ls $OUT1_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
- out2filecnt=$(ls $OUT2_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
- out3filecnt=$(ls $OUT3_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
- if [ $out1filecnt -ne 0 ] || [ $out2filecnt -ne 0 ] || [ $out3filecnt -ne 0 ]; then
- if [ x"$OUT1_JSON_FILE" != x ]; then
- out1jsonlist=$(ls $OUT1_JSON_FILE_TMP 2>>$HWP_LOG_FILE)
- out1jsonfilecnt=$(ls $OUT1_JSON_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
- fi
- if [ x"$OUT2_JSON_FILE" != x ]; then
- out2jsonfilecnt=$(ls $OUT2_JSON_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
- fi
- if [ x"$JSM_BIN" != x ] && [ x"$PYTHON_BIN" != x ] && [ x"$OUT_JSON_MERGE_FILE" != x ]; then
- echo "+-----------------------------------------------------------------------------+"
- echo "| Merging JSON files..."
- echo "+-----------------------------------------------------------------------------+"
- for i in $out1jsonlist; do
- DEVICE_ID_POSTFIX=$(echo $i | sed -n /.*$OUT1_JSON_FILE_PREFIX/s/.*$OUT1_JSON_FILE_PREFIX//p)
- $PYTHON_BIN $JSM_BIN -d $WORK_DIR -f $OUT1_JSON_FILE_PREFIX$DEVICE_ID_POSTFIX \
- -s $OUT2_JSON_FILE_PREFIX$DEVICE_ID_POSTFIX \
- -o $WORK_DIR/$OUT_JSON_MERGE_FILE_PREFIX$DEVICE_ID_POSTFIX
- done
- fi
- echo "+-----------------------------------------------------------------------------+"
- echo "| Data captured, files moved to CWD."
- if [ $out1filecnt -ne 0 ]; then
- mv $OUT1_FILE_TMP $OUT1_FILE
- fi
- if [ x"$OUT1_JSON_FILE" != x ] && [ $out1jsonfilecnt -ne 0 ]; then
- mv $OUT1_JSON_FILE_TMP $OUT1_JSON_FILE
- fi
- if [ $out2filecnt -ne 0 ]; then
- mv $OUT2_FILE_TMP $OUT2_FILE
- fi
- if [ x"$OUT2_JSON_FILE" != x ] && [ $out2jsonfilecnt -ne 0 ]; then
- mv $OUT2_JSON_FILE_TMP $OUT2_JSON_FILE
- fi
- if [ x"$OUT_JSON_MERGE_FILE" != x ]; then
- if [ $(ls $OUT_JSON_MERGE_FILE_TMP | wc -l 2>>$HWP_LOG_FILE) -ne 0 ]; then
- mv $OUT_JSON_MERGE_FILE_TMP $OUT_JSON_MERGE_FILE
- fi
- fi
- if ls $OUT3_FILE_TMP >>$HWP_LOG_FILE 2>&1; then
- mv $OUT3_FILE_TMP $OUT3_DIR
- if [ -n "$OUT3_JSON_FILE_TMP" ] && ls $OUT3_JSON_FILE_TMP >>$HWP_LOG_FILE 2>&1; then
- mv $OUT3_JSON_FILE_TMP $OUT3_JSON_DIR
- fi
- fi
- else
- echo "+-----------------------------------------------------------------------------+"
- echo "| No data captured, binary files do not exist."
- fi
- fi
- # Give time for the Log file to be flushed to disk
- sync
- if [ "$CAT_LOG" = "yes" ]; then
- echo "+-----------------------------------------------------------------------------+"
- echo "| TLDaemon debug log file..."
- echo "| $TXT_READER $TLD_LOG_FILE"
- echo "+-----------------------------------------------------------------------------+"
- $TXT_READER $TLD_LOG_FILE
- echo "+-----------------------------------------------------------------------------+"
- echo "| pvrhwperf debug log file..."
- echo "| $TXT_READER $HWP_LOG_FILE"
- echo "+-----------------------------------------------------------------------------+"
- $TXT_READER $HWP_LOG_FILE
- fi
- echo "+-----------------------------------------------------------------------------+"
- restore_state
|