-
-
Save joevt/32e5efffe3459958759fb702579b9529 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
#!/bin/zsh | |
# by joevt May 24/2023 | |
#========================================================================================= | |
edid_decode=edid-decode | |
#========================================================================================= | |
# Modify EDID | |
getarrstart () { | |
# bash arrays start at 0 | |
# zsh arrays start at 1 (applies only to [] syntax) but this can be changed with "setopt ksh_arrays" | |
# zsh arrays start at 0 when using ${arr:x:x} syntax | |
local arr=(1 0) | |
arrstart=${arr[1]} | |
} | |
getarrstart | |
if ((0)); then | |
# to clear errors in ShellCheck | |
debug=1 | |
dodump=1 | |
afterdetailedblockoffset=0 | |
doclearserialnumber=0 | |
docleardate=0 | |
do8bpc=0 | |
doRGB=0 | |
do422=0 | |
dosetpreferredisnative=0 | |
doclearchromaticity=0 | |
doclearestablishedtimings=0 | |
doclearmanufacturerstimings=0 | |
doclearstandardtimings=0 | |
patches=() | |
fi | |
replacebytes () { | |
local bytepos=$(($1*2)) | |
local thebytes=$2 | |
local thelen=${#thebytes} | |
[[ -n $3 ]] && thelen=$(($3*2)) | |
theedid=${theedid:0:$bytepos}${thebytes}${theedid:$bytepos+thelen} | |
} | |
repairchecksums () { | |
local blockoffset=0 | |
while (( blockoffset*2 < ${#theedid} )); do | |
local blocktag=${theedid:$blockoffset*2:2} | |
if [[ $blocktag = 70 ]]; then | |
local sectionsize=$((0x${theedid:$blockoffset*2+4:2})) | |
replacebytes $((blockoffset+sectionsize+5)) "$(printf "%02x" $(( -($(echo -n "${theedid:$blockoffset*2+2:$sectionsize*2+8}" | sed "s/../+0x&/g")) & 0xff )))" | |
fi | |
replacebytes $((blockoffset+127)) "$(printf "%02x" $(( -($(echo -n "${theedid:$blockoffset*2:254}" | sed "s/../+0x&/g")) & 0xff )))" | |
((blockoffset+=128)) | |
done | |
} | |
deleteextensionblock () { | |
local blockoffset=$(($1*128)) | |
if (( blockoffset*2 < ${#theedid} )); then | |
(( debug )) && echo ": deleteextensionblock $blockoffset" 1>&2 | |
replacebytes $blockoffset "" 128 | |
replacebytes 126 "$(printf "%02x" $((0x${theedid:252:2}-1)))" | |
processedid | |
repairchecksums | |
else | |
echo "Block at $blockoffset doesn't exist" | |
fi | |
} | |
deleteextensionblocktype () { | |
local blocktype="$1" | |
local blockoffset=128 | |
local blocknum=1 | |
while (( blockoffset*2 < ${#theedid} )); do | |
local blocktag=${theedid:$blockoffset*2:2} | |
(( debug )) && echo ": deleteextensionblocktype $blocknum) $blockoffset $blocktag" 1>&2 | |
if (( 0x$blocktag == blocktype )); then | |
deleteextensionblock $blocknum | |
else | |
((blockoffset+=128)) | |
((blocknum++)) | |
fi | |
done | |
} | |
adddisplayidextensionblock () { | |
local version="$1" | |
local producttype="$2" | |
(( debug )) && echo ": adddisplayidextensionblock $version $producttype" 1>&2 | |
#echo adddisplayidextensionblock $version $producttype | |
replacebytes 126 "$(printf "%02x" $((0x${theedid:252:2}+1)))" | |
theedid+=$(printf "70%02x79%02x%0248x" $((0x${version//./})) "$producttype" 0) | |
repairchecksums | |
} | |
addctaextensionblock () { | |
local version="$1" | |
local YCbCrSupportbyte="$2" | |
local offset="$3" | |
if [[ -z $YCbCrSupportbyte ]]; then | |
YCbCrSupportbyte=4 | |
fi | |
if [[ -z $offset ]]; then | |
offset=$((${#theedid} / 2)) | |
fi | |
(( debug )) && echo ": addctaextensionblock $version" 1>&2 | |
#echo addctaextensionblock $version $producttype | |
replacebytes 126 "$(printf "%02x" $((0x${theedid:252:2}+1)))" | |
# theedid=${theedid:0:$offset*2}$(printf "02%02x0400%0248x" $((version)) 0)${theedid:$offset*2} | |
# 00 edid tag 02 | |
# | |
# 01 1 CTA version | |
# 02 2 detailed descriptors offset | |
# 03 3 YCbCrSupportbyte | |
theedid=${theedid:0:$offset*2}$(printf "02%02x04%02x%0248x" $((version)) $((YCbCrSupportbyte)) 0)${theedid:$offset*2} | |
repairchecksums | |
} | |
detailed_block () { | |
local detailedblock=$1 | |
# other parameters are optional | |
local detailedblockoffset=$2 | |
local willbereplaced=$3 | |
local willbedeleted=$4 | |
[[ -z $willbereplaced ]] && willbereplaced=1 # just output it | |
[[ -z $willbedeleted ]] && willbedeleted=1 # just output it | |
local dodump=$dodump | |
if (( $# == 1 )); then | |
dodump=1 | |
fi | |
if [[ ${detailedblock:0:4} = 0000 ]]; then | |
case ${detailedblock} in | |
000000000000000000000000000000000000) (( dodump )) && printf "Empty" ;; | |
000000100000000000000000000000000000) (( dodump )) && printf "Dummy block" ;; | |
*) | |
case ${detailedblock:6:2} in | |
0*) (( dodump )) && printf "Manufacturer-specified data" ;; | |
10) (( dodump )) && printf "Dummy block" ;; | |
f7) (( dodump )) && printf "Established timings III" ;; | |
f8) (( dodump )) && printf "CVT 3-byte timing codes" ;; | |
f9) (( dodump )) && printf "Color management data" ;; | |
fa) (( dodump )) && printf "More standard timings" ;; | |
fb) (( dodump )) && printf "Color point" ;; | |
fc) (( dodump )) && printf "Monitor name" ;; | |
fd) (( dodump )) && printf "Display range limits" ;; | |
fe) (( dodump )) && printf "ASCII string" ;; | |
ff) (( dodump )) && printf "Serial number" ;; | |
*) (( dodump )) && printf "Reserved(%s)" "${detailedblock:6:2}" ;; | |
esac | |
(( dodump )) && printf ": %s" "$detailedblock" | |
esac | |
case ${detailedblock:6:2} in | |
fd) | |
local minV=$((((0x${detailedblock:8:2} >> 0) & 1) * 255 + 0x${detailedblock:10:2})) | |
local maxV=$((((0x${detailedblock:8:2} >> 1) & 1) * 255 + 0x${detailedblock:12:2})) | |
local minH=$((((0x${detailedblock:8:2} >> 2) & 1) * 255 + 0x${detailedblock:14:2})) | |
local maxH=$((((0x${detailedblock:8:2} >> 3) & 1) * 255 + 0x${detailedblock:16:2})) | |
local maxP=$((0x${detailedblock:18:2} * 10)) | |
local timingtype="?" | |
case $((0x${detailedblock:20:2})) in | |
0) timingtype="default GTF" ;; | |
1) timingtype="limits only" ;; | |
2) timingtype="Secondary GTF" ;; | |
4) timingtype="CVT" ;; | |
*) timingtype="Reserved($((0x${detailedblock:20:2})))" ;; | |
esac | |
(( dodump )) && printf " = %d-%dHz %d-%dkHz %dMHz (%s:%s)\n" $minV $maxV $minH $maxH $maxP "$timingtype" "${detailedblock:22}" | |
;; | |
*) (( dodump )) && echo | |
;; | |
esac | |
else | |
local MHz=00$((0x${detailedblock:2:2}${detailedblock:0:2})) | |
local hmm=$((0x${detailedblock:28:1}${detailedblock:24:2})) | |
local vmm=$((0x${detailedblock:29:1}${detailedblock:26:2})) | |
local hactive=$((0x${detailedblock:8:1}${detailedblock:4:2})) | |
local hfront=$((((0x${detailedblock:22:1} >> 2) << 8) + 0x${detailedblock:16:2})) | |
local hpulse=$((((0x${detailedblock:22:1} & 3) << 8) + 0x${detailedblock:18:2})) | |
local hblank=$((0x${detailedblock:9:1}${detailedblock:6:2})) | |
local vactive=$((0x${detailedblock:14:1}${detailedblock:10:2})) | |
local vfront=$((((0x${detailedblock:23:1} >> 2) << 4) + 0x${detailedblock:20:1})) | |
local vpulse=$((((0x${detailedblock:23:1} & 3) << 4) + 0x${detailedblock:21:1})) | |
local vblank=$((0x${detailedblock:15:1}${detailedblock:12:2})) | |
local hborder=$((0x${detailedblock:30:2})) | |
local vborder=$((0x${detailedblock:32:2})) | |
local hsync='-' | |
local vsync='-' | |
local interlaced='' | |
local hback=$((hblank - hfront - hpulse)) | |
local vback=$((vblank - vfront - vpulse)) | |
(( 0x${detailedblock:34:2} >> 7 )) && interlaced='i' | |
(( 0x${detailedblock:34:2} & 2 )) && hsync='+' | |
(( 0x${detailedblock:34:2} & 4 )) && vsync='+' | |
local kHz='000' | |
local Hz='000' | |
if (( hactive + hblank )); then | |
kHz=000$(((10#$MHz * 100000 / (hactive+hblank) + 5)/10)) | |
fi | |
if (( (vactive+vblank)*(hactive+hblank) )); then | |
Hz=000$(((10#$MHz * 100000000 / ((vactive+vblank)*(hactive+hblank)) + 5)/10)) | |
fi | |
local timingstring="" | |
timingstring=$( | |
printf "%dx%d%s@%d.%sHz %d.%skHz %d.%sMHz h(%d %d %d %s) v(%d %d %d %s)" \ | |
$hactive $vactive "$interlaced" \ | |
$((10#$Hz/1000)) ${Hz: -3} $((10#$kHz/1000)) ${kHz: -3} $((10#$MHz/100)) ${MHz: -2} \ | |
$hfront $hpulse $hback "$hsync" \ | |
$vfront $vpulse $vback "$vsync" | |
) | |
(( debug )) && echo ":(( $willbereplaced == 0 ))" 1>&2 | |
if (( willbereplaced == 0 && willbedeleted == 0 )); then | |
thetimings+=("$timingstring") | |
thetimingsoffsets+=("$detailedblockoffset") | |
thetimingshex+=("$detailedblock") | |
fi | |
(( dodump )) && printf "Detailed timing: %s = %s\n" "$detailedblock" "$timingstring" | |
fi | |
} | |
one_detailed_block () { | |
(( debug )) && echo ": one_detailed_block $*" 1>&2 | |
local detailedblockoffset=$1 | |
local willbereplaced=$2 | |
local willbedeleted=$3 | |
(( dodump )) && echo -n " ${detailedblockoffset}) " | |
detailed_block "${theedid:$detailedblockoffset*2:36}" "$detailedblockoffset" "$willbereplaced" "$willbedeleted" | |
} | |
detailed_blocks () { | |
(( debug )) && echo ": detailed_blocks $*" 1>&2 | |
local param="" | |
for param in detailedblockoffset afterdetailedblockoffset dodump doreplacedescriptoroffset deletedescriptoroffset replacementdescriptor; do | |
(( debug )) && echo ": param $param=$1" 1>&2 | |
eval "local $param=\"$1\""; shift | |
done | |
(( afterdetailedblockoffset = detailedblockoffset + (afterdetailedblockoffset - detailedblockoffset) / 18 * 18 )) | |
if (( detailedblockoffset + 18 <= afterdetailedblockoffset )); then | |
(( dodump )) && echo " Descriptors:" | |
while (( detailedblockoffset + 18 <= afterdetailedblockoffset )); do | |
local willbereplaced=$(( detailedblockoffset == doreplacedescriptoroffset )) | |
local willbedeleted=$(( detailedblockoffset == deletedescriptoroffset )) | |
one_detailed_block "$detailedblockoffset" "$willbereplaced" "$willbedeleted" | |
if (( willbereplaced )); then | |
replacebytes "$detailedblockoffset" "$replacementdescriptor" | |
(( dodump )) && echo " changed:" | |
one_detailed_block "$detailedblockoffset" 0 0 | |
fi | |
if (( willbedeleted )); then | |
deletedescriptoroffset=0 | |
replacebytes "$detailedblockoffset" "${theedid:(detailedblockoffset+18)*2:(afterdetailedblockoffset-detailedblockoffset-18)*2}""$(printf "000000%c00000000000000000000000000000" $((detailedblockoffset < 128)) )" | |
(( dodump )) && echo " changed: deleted" | |
else | |
((detailedblockoffset+=18)) | |
fi | |
done | |
fi | |
} | |
colorc () { | |
local ccc=$1 | |
# [0..1023] | |
# [0..9990] | |
# [10005..19995] add leading zeros (ignore the 1) and rounding | |
local rx=$(( | |
( | |
( | |
(0x${theedid:54+ccc*2:2} << 2) | ((0x${theedid:50:4} >> (14-ccc*2)) & 3) | |
) * 10000 / 1024 | |
) + 10005 | |
)); | |
echo -n 0.${rx:1:3} # output 3 digits (ignoring the leading 1) | |
} | |
dumptype1timingdescriptor () { | |
local type1timing=$1 | |
local MHz=00$((0x${type1timing:4:2}${type1timing:2:2}${type1timing:0:2} + 1)) | |
local preferred='' | |
(( 0x${type1timing:6:2} >> 7 )) && preferred=' preferred' | |
local support3D=' 3D:undefined' | |
case $(( (0x${type1timing:6:2} >> 5) & 3 )) in | |
0) support3D='' ;; | |
1) support3D=' stereo' ;; | |
2) support3D=' stereo/mono' ;; | |
3) support3D=' 3D:reserved' ;; | |
esac | |
local interlaced='' | |
(( (0x${type1timing:6:2} >> 4) & 1 )) && interlaced='i' | |
local aspect=' aspect:reserved' | |
case $(( 0x${type1timing:6:2} & 15 )) in | |
0) aspect=' 1:1' ;; | |
1) aspect=' 5:4' ;; | |
2) aspect=' 4:3' ;; | |
3) aspect=' 15:9' ;; | |
4) aspect=' 16:9' ;; | |
5) aspect=' 16:10' ;; | |
6) aspect=' 64:27' ;; | |
7) aspect=' 256:135' ;; | |
8) aspect=' aspect:undefined' ;; | |
esac | |
local hactive=$((0x${type1timing:10:2}${type1timing:8:2} + 1)) | |
local hblank=$((0x${type1timing:14:2}${type1timing:12:2} + 1)) | |
local hfront=$(((0x${type1timing:18:2}${type1timing:16:2} & 32767) + 1)) | |
local hsync='-' | |
(( 0x${type1timing:18:2} >> 7 )) && hsync='+' | |
local hpulse=$((0x${type1timing:22:2}${type1timing:20:2} + 1)) | |
local hback=$((hblank - hfront - hpulse)) | |
local vactive=$((0x${type1timing:26:2}${type1timing:24:2} + 1)) | |
local vblank=$((0x${type1timing:30:2}${type1timing:28:2} + 1)) | |
local vfront=$(((0x${type1timing:34:2}${type1timing:32:2} & 32767) + 1)) | |
local vsync='-' | |
(( 0x${type1timing:34:2} >> 7 )) && vsync='+' | |
local vpulse=$((0x${type1timing:38:2}${type1timing:36:2} + 1)) | |
local vback=$((vblank - vfront - vpulse)) | |
local kHz=000$(((10#$MHz * 100000 / (hactive+hblank) + 5)/10)) | |
local Hz=000$(((10#$MHz * 100000000 / ((vactive+vblank)*(hactive+hblank)) + 5)/10)) | |
printf "%dx%d%s@%d.%sHz %d.%skHz %d.%sMHz h(%d %d %d %s) v(%d %d %d %s)%s%s%s" \ | |
$hactive $vactive "$interlaced" \ | |
$((10#$Hz/1000)) ${Hz: -3} $((10#$kHz/1000)) ${kHz: -3} $((10#$MHz/100)) ${MHz: -2} \ | |
$hfront $hpulse $hback "$hsync" \ | |
$vfront $vpulse $vback "$vsync" \ | |
"$support3D" "$aspect" "$preferred" | |
} | |
dumptileddisplaytopologyblock () { | |
local tiledblock=$1 | |
local revision=$((0x${tiledblock:2:2} & 7)) # high 5 bits should be 0 | |
local length=$((0x${tiledblock:4:2})) # should be 22 | |
local capabilities=$((0x${tiledblock:6:2})) | |
local enclosuretype=$(( (capabilities >> 7) & 1 )) | |
local tilebezelinformationdescriptoravailable=$(( (capabilities >> 6) & 1 )) | |
# bit 5 reserved | |
local behaviorsome=$(( (capabilities >> 3) & 3 )) | |
local behavioronly=$(( (capabilities >> 0) & 7 )) | |
tileCountH=$(( 0x${tiledblock:8:1} + ((0x${tiledblock:12:2} >> 2) & 0x30) + 1 )) | |
tileCountV=$(( 0x${tiledblock:9:1} + ((0x${tiledblock:12:2} >> 0) & 0x30) + 1 )) | |
local tileLocationH=$(( 0x${tiledblock:10:1} + ((0x${tiledblock:12:2} << 2) & 0x30) )) | |
local tileLocationV=$(( 0x${tiledblock:11:1} + ((0x${tiledblock:12:2} << 4) & 0x30) )) | |
tileSizeH=$(( 0x${tiledblock:16:2}${tiledblock:14:2} + 1 )) | |
tileSizeV=$(( 0x${tiledblock:20:2}${tiledblock:18:2} + 1 )) | |
# depends on tilebezelinformationdescriptoravailable | |
local pixelmultiplier=$(( 0x${tiledblock:22:2} )) | |
local bezelsizetop=$(( 0x${tiledblock:24:2} )) | |
local bezelsizebottom=$(( 0x${tiledblock:26:2} )) | |
local bezelsizeleft=$(( 0x${tiledblock:28:2} )) | |
local bezelsizeright=$(( 0x${tiledblock:30:2} )) | |
local vendorid="" | |
vendorid=$(echo -n "${tiledblock:32:6}" | xxd -p -r) | |
local productid=$((0x${tiledblock:40:2}${tiledblock:38:2})) | |
local serialnumber=$((0x${tiledblock:48:2}${tiledblock:46:2}${tiledblock:44:2}${tiledblock:42:2})) | |
if (( dodump )); then | |
printf "%dx%d @ (%d,%d) of (%dx%d) vendor:%s product:0x%04x serial:%d" \ | |
$tileSizeH $tileSizeV \ | |
$tileLocationH $tileLocationV \ | |
$tileCountH $tileCountV \ | |
"$vendorid" $productid $serialnumber | |
printf ' enclosure:' | |
case $enclosuretype in | |
0) printf 'multiple' ;; | |
1) printf 'single' ;; | |
esac | |
printf ' some:' | |
case $behaviorsome in | |
0) printf 'undescribed' ;; | |
1) printf 'location' ;; | |
*) printf 'reserved%s' $behaviorsome ;; | |
esac | |
printf ' one:' | |
case $behavioronly in | |
0) printf 'undescribed' ;; | |
1) printf 'location' ;; | |
2) printf 'scaled' ;; | |
3) printf 'cloned' ;; | |
*) printf 'reserved%s' $behavioronly ;; | |
esac | |
if (( tilebezelinformationdescriptoravailable )); then | |
printf " bezel(t,l,b,r):(%d,%d,%d,%d)x%d" \ | |
$bezelsizetop \ | |
$bezelsizeleft \ | |
$bezelsizebottom \ | |
$bezelsizeright \ | |
$pixelmultiplier | |
fi | |
fi | |
} | |
flagsstring () { | |
local label=$1 | |
local bitfirst=$2 | |
local bitlast=$3 | |
local bitdirection=1 | |
local theflags="$4" | |
local result="" | |
if [[ -z $theflags ]]; then | |
result="missing" | |
else | |
shift 4 | |
theflags=$((0x$theflags)) | |
(( bitlast < bitfirst )) && bitdirection=-1 | |
result="" | |
local thebit=$bitfirst | |
while (( 1 )); do | |
if (( theflags & (2 ** thebit) )); then | |
[[ -n $result ]] && result+="," | |
[[ -z $1 ]] && result+="reserved$thebit" || result+="$1" | |
fi | |
(( $# )) && shift | |
(( thebit == bitlast )) && break | |
(( thebit = thebit + bitdirection )) | |
done | |
fi | |
[[ -n $result ]] && echo -n " $label:$result" | |
} | |
dumpdisplayinterfacefeaturesdata () { | |
local theblock=$1 | |
local revision=$((0x${theblock:2:2} & 7)) # high 5 bits should be 0 | |
local length=$((0x${theblock:4:2})) # should be 9+N | |
local colorDepthsRGB="" | |
local colorDepthsYCbCr444="" | |
local colorDepthsYCbCr422="" | |
local colorDepthsYCbCr420="" | |
local audio="" | |
local colorspace_eotf_combinations1="" | |
local colorspace_eotf_combinations2="" | |
colorDepthsRGB=$(flagsstring "RGB" 0 7 "${theblock:6:2}" 6 8 10 12 14 16) | |
colorDepthsYCbCr444=$(flagsstring "444" 0 7 "${theblock:8:2}" 6 8 10 12 14 16) | |
colorDepthsYCbCr422=$(flagsstring "422" 0 7 "${theblock:10:2}" 8 10 12 14 16) | |
colorDepthsYCbCr420=$(flagsstring "420" 0 7 "${theblock:12:2}" 8 10 12 14 16) | |
local minRateYCbCr420string=" 420(MHz):missing" | |
if [[ -n ${theblock:14:2} ]]; then | |
local minRateYCbCr420=$((0x${theblock:14:2} * 7425)) # / 100 | |
(( minRateYCbCr420 > 0 )) && minRateYCbCr420string=" 420:≥$(( minRateYCbCr420/100 )).${minRateYCbCr420: -2}MHz" || minRateYCbCr420string="" | |
fi | |
audio=$(flagsstring "audio(kHz)" 7 0 "${theblock:16:2}" "32" "44.1" "48") | |
colorspace_eotf_combinations1=$(flagsstring "colorspace/eotf#1" 0 7 "${theblock:18:2}" \ | |
"sRGB" \ | |
"BT.601" \ | |
"BT.709/BT.1886" \ | |
"Adobe RGB" \ | |
"DCI-P3" \ | |
"BT.2020" \ | |
"BT.2020/SMPTE ST 2084") | |
colorspace_eotf_combinations2=$(flagsstring "colorspace/eotf#2" 0 7 "${theblock:20:2}") | |
local additional_colorspace_eotf="missing" | |
if [[ -n ${theblock:22:2} ]]; then | |
local num_additional_colorspace_eotf=$((0x${theblock:22:2} & 7)) | |
additional_colorspace_eotf="" | |
local cendx="" | |
for (( cendx = 0; cendx < num_additional_colorspace_eotf; cendx++ )); do | |
(( cendx > 0 )) && additional_colorspace_eotf+="," | |
local colorspace="" | |
local eotf="" | |
if [[ -z ${theblock:24+$cendx*2:2} ]]; then | |
additional_colorspace_eotf+="missing" | |
else | |
case $((0x${theblock:24+$cendx*2:2} >> 4)) in | |
0) colorspace="Undefined" ;; | |
1) colorspace="sRGB" ;; | |
2) colorspace="BT.601" ;; | |
3) colorspace="BT.709" ;; | |
4) colorspace="Adobe RGB" ;; | |
5) colorspace="DCI-P3" ;; | |
6) colorspace="BT.2020" ;; | |
7) colorspace="Custom" ;; | |
*) colorspace="Reserved$((0x${theblock:24+$cendx*2:2} >> 4))" ;; | |
esac | |
case $((0x${theblock:24+$cendx*2:2} & 15)) in | |
0) eotf="Undefined" ;; | |
1) eotf="sRGB" ;; | |
2) eotf="BT.601" ;; | |
3) eotf="BT.1886" ;; | |
4) eotf="Adobe RGB" ;; | |
5) eotf="DCI-P3" ;; | |
6) eotf="BT.2020" ;; | |
7) eotf="Gamma function" ;; | |
8) eotf="SMPTE ST 2084" ;; | |
9) eotf="Hybrid Log" ;; | |
10) eotf="Custom" ;; | |
*) eotf="Reserved$((0x${theblock:24+$cendx*2:2} & 15))" ;; | |
esac | |
[[ $colorspace = "$eotf" ]] && additional_colorspace_eotf+="$colorspace" || additional_colorspace_eotf+="$colorspace/$eotf" | |
fi | |
done | |
fi | |
local lengtherror="" | |
(( length != 9 + num_additional_colorspace_eotf )) && lengtherror+=" ($length != $((9 + num_additional_colorspace_eotf)))" | |
[[ -n $additional_colorspace_eotf ]] && additional_colorspace_eotf=" colorspace/eotf#n:$additional_colorspace_eotf" | |
if (( dodump )); then | |
printf "revision:%d%s%s%s%s%s%s%s%s%s%s" \ | |
$revision \ | |
"$colorDepthsRGB" \ | |
"$colorDepthsYCbCr444" \ | |
"$colorDepthsYCbCr422" \ | |
"$colorDepthsYCbCr420" \ | |
"$minRateYCbCr420string" \ | |
"$audio" \ | |
"$colorspace_eotf_combinations1" \ | |
"$colorspace_eotf_combinations2" \ | |
"$additional_colorspace_eotf" \ | |
"$lengtherror" | |
fi | |
} | |
processedid () { | |
(( debug )) && echo ": processedid $*" 1>&2 | |
local ctablocktypetodelete=":" | |
local newctablocks=() | |
local currentnewctablock=0 | |
local newctadescriptors=() | |
local currentnewctadescriptor=0 | |
local displayidblocktypetodelete=9999 | |
local newdisplayidblocks=() | |
local currentnewdisplayidblock=0 | |
while (( $# )); do | |
local param="$1"; shift | |
eval "local $param=1" | |
case "$param" in | |
doreplacedescriptor) | |
local doreplacedescriptoroffset="$1"; shift | |
local replacementdescriptor="$1"; shift ;; | |
doaddctablock) | |
local doaddctablockoffset="$1"; shift | |
if (( doaddctablockoffset == 0 )); then | |
doaddctablockoffset=$EndOfLastctablock | |
fi | |
(( debug )) && echo ": doaddctablock $doaddctablockoffset" 1>&2 | |
while (( $# )); do | |
(( debug )) && echo ": doaddctablock param: $1" 1>&2 | |
newctablocks+=("$1"); shift | |
done | |
;; | |
dodeletectablock) | |
local deletectablockoffset="$1"; shift ;; | |
dodeletectablocktype) | |
while [[ "$1" =~ [0-9a-f]+ ]]; do | |
ctablocktypetodelete="${ctablocktypetodelete}$1:"; shift | |
done | |
;; | |
doaddctadescriptor) | |
local doaddctadescriptoroffset="$1"; shift | |
if (( doaddctadescriptoroffset == 0 )); then | |
doaddctadescriptoroffset=$EndOfLastctadescriptor | |
fi | |
(( debug )) && echo ": doaddctadescriptor $doaddctadescriptoroffset" 1>&2 | |
while (( $# )); do | |
(( debug )) && echo ": doaddctadescriptor param: $1" 1>&2 | |
newctadescriptors+=("$1"); shift | |
done | |
;; | |
dodeletedescriptor) | |
local deletedescriptoroffset="$1"; shift ;; | |
doadddisplayidblock) | |
local doadddisplayidblockoffset="$1"; shift | |
if (( doadddisplayidblockoffset == 0 )); then | |
doadddisplayidblockoffset=$EndOfLastDisplayIDblock | |
fi | |
(( debug )) && echo ": doadddisplayidblock $doadddisplayidblockoffset" 1>&2 | |
while (( $# )); do | |
(( debug )) && echo ": doadddisplayidblock param: $1" 1>&2 | |
newdisplayidblocks+=("$1"); shift | |
done | |
;; | |
dodeletedisplayidblock) | |
local deletedisplayidblockoffset="$1"; shift ;; | |
dodeletedisplayidblockblocktype) | |
local displayidblocktypetodelete="$1"; shift ;; | |
dosetpreferredisnative) | |
preferredvalue="$1"; shift ;; | |
esac | |
done | |
# Remember the end of the last CTA block (-1 means no CTA blocks exist. | |
# It is also used by addctablock for inserting new CTA blocks at the first available location. | |
EndOfLastctablock=-1 | |
# Keep a list of found CTA blocks. | |
ctablocks=() | |
# Remember the end of the last CTA descriptor block (-1 means no CTA blocks exist. | |
# It is also used by addctadescriptor for inserting new CTA blocks at the first available location. | |
EndOfLastctadescriptor=-1 | |
# Keep a list of found CTA blocks. | |
ctadescriptors=() | |
# Remember the end of the last DisplayID block (-1 means no DisplayID blocks exist. | |
# It is also used by adddisplayidblock for inserting new DisplayID blocks at the first available location. | |
EndOfLastDisplayIDblock=-1 | |
# Keep a list of found DisplayID blocks. | |
DisplayIDblocks=() | |
# Keep a list of found timings and their offsets. | |
thetimings=() | |
thetimingsoffsets=() | |
thetimingshex=() | |
HasAudio=0 | |
HasTile=0 | |
(( debug )) && echo ": parse 1" 1>&2 | |
theproductid=$((0x${theedid:22:2}${theedid:20:2})) | |
thevendorid=$((0x${theedid:16:4})) | |
(( debug )) && echo ": parse 2" 1>&2 | |
thevendorcode="$(printf "%06x" $((((thevendorid&0x7c00)<<6)+((thevendorid&0x3e0)<<3)+(thevendorid&0x1f)+0x404040)) | xxd -p -r)" | |
(( debug )) && echo ": parse 2.1" 1>&2 | |
theweekofmanufacture=$((0x${theedid:32:2})) | |
(( debug )) && echo ": parse 2.2" 1>&2 | |
theyearofmanufacture=$((0x${theedid:34:2}+1990)) | |
(( debug )) && echo ": parse 3" 1>&2 | |
thevendordir="DisplayVendorID-$(printf "%x" $thevendorid)" | |
theproductfile="${thevendordir}/DisplayProductID-$(printf "%x" $theproductid)" | |
themanufacturefile="${thevendordir}/DisplayYearManufacture-$theyearofmanufacture-DisplayWeekManufacture-$theweekofmanufacture" | |
thefilenamebase="$(printf "EDID_%s_%x_%x" "$thevendorcode" $thevendorid $theproductid)" | |
(( debug )) && echo ": parse 4" 1>&2 | |
theEDIDversion=$((0x${theedid:0x12*2:2})).$((0x${theedid:0x13*2:2})) # 1.3 or 1.4 | |
isdigital=$(( 0x${theedid:0x14*2:1} > 7 )) # 0 or 1 | |
colordepth=$(( 0x${theedid:0x14*2:1} & 7 )) | |
featuresupportbyte=$((0x${theedid:0x18*2:2})) | |
featuresupport=$(( (featuresupportbyte >> 3) & 3 )) | |
preferredisnative=$(( (featuresupportbyte >> 1) & 1 )) | |
iscontinuous=$(( (featuresupportbyte >> 0) & 1 )) | |
(( dodump )) && echo "0) EDID $theEDIDversion" | |
(( dodump )) && printf " Vendor ID: %s %d = 0x%x\n" "$thevendorcode" $thevendorid $thevendorid | |
(( dodump )) && printf " Product ID: %d = 0x%x\n" $theproductid $theproductid | |
if [[ ${theedid:24:8} != 00000000 ]]; then | |
(( dodump )) && printf " Serial Number: %d" $((0x${theedid:30:2}${theedid:28:2}${theedid:26:2}${theedid:24:2})) | |
if (( doclearserialnumber )); then | |
replacebytes 12 00000000 | |
(( dodump )) && printf " changed: unspecified" | |
fi | |
(( dodump )) && echo | |
fi | |
if [[ ${theedid:32:4} != 0000 ]]; then | |
if (( dodump )); then | |
case ${theedid:32:4} in | |
00*) printf " Made in year %s" "$theyearofmanufacture" ;; | |
ff*) printf " Model year: %s" "$theyearofmanufacture" ;; | |
*) printf " Made in week %s of %s" "$theweekofmanufacture" "$theyearofmanufacture" | |
esac | |
fi | |
if (( docleardate )); then | |
replacebytes 16 0000 | |
(( dodump )) && printf " changed: unspecified" | |
fi | |
(( dodump )) && echo | |
fi | |
(( dodump )) && printf " " | |
if [[ " $theEDIDversion" < " 1.4" ]]; then | |
(( dodump )) && | |
case $featuresupport in | |
0) echo "Monochrome or Grayscale" ;; | |
1) echo "RGB color" ;; | |
2) echo "Non-RGB color" ;; | |
3) echo "Undefined" ;; | |
esac | |
else | |
(( dodump )) && | |
case $isdigital$featuresupport in | |
00) echo "Monochrome or Grayscale" ;; | |
01) echo "RGB color" ;; | |
02) echo "Non-RGB color" ;; | |
03) echo "Undefined" ;; | |
10) printf "RGB 4:4:4" ;; | |
11) printf "RGB 4:4:4, YCrCb 4:4:4" ;; | |
12) printf "RGB 4:4:4, YCrCb 4:2:2" ;; | |
13) printf "RGB 4:4:4, YCrCb 4:4:4, YCrCb 4:2:2" ;; | |
esac | |
if (( isdigital )); then | |
(( dodump )) && | |
case $colordepth in | |
0) echo "; undefined bpc" ;; | |
1) echo "; 6 bpc" ;; | |
2) echo "; 8 bpc" ;; | |
3) echo "; 10 bpc" ;; | |
4) echo "; 12 bpc" ;; | |
5) echo "; 14 bpc" ;; | |
6) echo "; 16 bpc" ;; | |
7) echo "; 18 bpc error" ;; | |
esac | |
if (( do8bpc )); then | |
replacebytes 20 "$(printf "%02x" $(((0x${theedid:0x14*2:2} & ~0x70) | 0x20)))" | |
(( dodump )) && echo ' changed: 8 bpc' | |
fi | |
fi | |
if (( doRGB )); then | |
local newfeaturesupportbyte=$(((featuresupportbyte & ~0x18) | (0 << 3) )) | |
replacebytes 24 "$(printf "%02x" $newfeaturesupportbyte)" | |
(( dodump )) && | |
case $isdigital in | |
0) echo ' changed: Monochrome or Grayscale' ;; | |
1) echo ' changed: RGB 4:4:4' ;; | |
esac | |
fi | |
if (( do422 )); then | |
local newfeaturesupportbyte=$(((featuresupportbyte & ~0x18) | (3 << 3) )) | |
replacebytes 24 "$(printf "%02x" $newfeaturesupportbyte)" | |
(( dodump )) && | |
case $isdigital in | |
0) echo ' changed: Undefined' ;; | |
1) echo ' changed: RGB 4:4:4, YCrCb 4:4:4, YCrCb 4:2:2' ;; | |
esac | |
fi | |
fi | |
(( dodump )) && | |
case $preferredisnative in | |
1) echo " Preferred Timing Mode is native pixel format and preferred refresh rate" ;; | |
esac | |
if (( dosetpreferredisnative && (preferredvalue != preferredisnative) )); then | |
local newfeaturesupportbyte=$(((featuresupportbyte & ~2) | (preferredvalue << 1) )) | |
replacebytes 24 "$(printf "%02x" $newfeaturesupportbyte)" | |
(( dodump )) && echo ' changed' | |
fi | |
(( dodump )) && | |
case $iscontinuous in | |
0) echo " Display is non-continuous frequency" ;; | |
1) echo " Display is continuous frequency" ;; | |
esac | |
if [[ ${theedid:50:20} != 00000000000000000000 ]]; then | |
(( dodump )) && printf " Color characteristics: R(%s,%s) G(%s,%s) B(%s,%s) W(%s,%s)" "$(colorc 0)" "$(colorc 1)" "$(colorc 2)" "$(colorc 3)" "$(colorc 4)" "$(colorc 5)" "$(colorc 6)" "$(colorc 7)" | |
if (( doclearchromaticity )); then | |
replacebytes 25 00000000000000000000 | |
(( dodump )) && printf " changed: unspecified" | |
fi | |
(( dodump )) && echo | |
fi | |
if [[ ${theedid:70:4} != 0000 ]]; then | |
(( dodump )) && printf " Established timings: %s" "${theedid:70:4}" | |
if (( doclearestablishedtimings )); then | |
replacebytes 35 0000 | |
(( dodump )) && printf " changed: unspecified" | |
fi | |
(( dodump )) && echo | |
fi | |
if [[ ${theedid:74:2} != 00 ]]; then | |
(( dodump )) && printf " Manufacturer's timings: %s" "${theedid:74:2}" | |
if (( doclearmanufacturerstimings )); then | |
replacebytes 37 00 | |
(( dodump )) && printf " changed: unspecified" | |
fi | |
(( dodump )) && echo | |
fi | |
if [[ ${theedid:76:32} != 01010101010101010101010101010101 ]]; then | |
(( dodump )) && printf " Standard timings: %s" "${theedid:76:32}" | |
if (( doclearstandardtimings )); then | |
replacebytes 38 01010101010101010101010101010101 | |
(( dodump )) && printf " changed: unspecified" | |
fi | |
(( dodump )) && echo | |
fi | |
detailed_blocks 54 126 "$dodump" "$doreplacedescriptoroffset" "$deletedescriptoroffset" "$replacementdescriptor" | |
local blockoffset=128 | |
while (( blockoffset*2 < ${#theedid} )); do | |
(( debug )) && echo ": extension block $blockoffset" 1>&2 | |
local theblock=${theedid:$blockoffset*2:254} | |
(( debug )) && echo ": extension theblock = $theblock" 1>&2 | |
local blocktag=${theblock:0:2} | |
(( debug )) && echo ": blocktag = $blocktag" 1>&2 | |
if [[ $blocktag = 02 ]]; then | |
(( debug )) && echo ": parsing CTA extension block" 1>&2 | |
# 00 edid tag 02 | |
# | |
# 01 1 CTA version | |
# 02 2 detailed descriptors offset | |
# 03 3 YCbCrSupportbyte | |
# | |
# 04 00 CTA data block #1 3 bit type (0-7), 5 bit length - 1 (1-32) | |
# 05 01 CTA data block #1 extended tag code if type is 7 | |
# | |
# detailedTimingDescriptorsOffset 18 byte descriptors | |
# | |
# 7F EDID checksum | |
CTAversion=$((0x${theblock:2:2})) | |
(( debug )) && echo ": CTAversion = $CTAversion" 1>&2 | |
local detailedTimingDescriptorsOffset=$((0x${theblock:4:2})) | |
local afterctadescriptorblockoffset=127 | |
YCbCrSupportbyte=$((0x${theblock:6:2})) | |
if (( CTAversion > 1 )); then | |
(( dodump )) && echo "$blockoffset) CTA-861 extension block with new version $CTAversion" | |
YCbCrSupport=$((( YCbCrSupportbyte >> 4) & 3)) | |
(( dodump )) && | |
case $YCbCrSupport in | |
0) echo " No YCbCr support" ;; | |
1) echo " YCbCr 4:2:2" ;; | |
2) echo " YCbCr 4:4:4" ;; | |
3) echo " YCbCr 4:4:4, YCbCr 4:2:2" ;; | |
esac | |
if (( doRGB )); then | |
newYCbCrSupportbyte=$(((YCbCrSupportbyte & ~0x30) | (0 << 4) )) | |
replacebytes $((blockoffset+3)) "$(printf "%02x" $newYCbCrSupportbyte)" | |
(( dodump )) && echo ' changed: No YCbCr support' | |
fi | |
if (( do422 )); then | |
newYCbCrSupportbyte=$(((YCbCrSupportbyte & ~0x30) | (3 << 4) )) | |
replacebytes $((blockoffset+3)) "$(printf "%02x" $newYCbCrSupportbyte)" | |
(( dodump )) && echo ' changed: YCbCr 4:4:4, YCbCr 4:2:2' | |
fi | |
BasicAudioSupport=$((( YCbCrSupportbyte >> 6) & 1)) | |
(( dodump )) && | |
case $BasicAudioSupport in | |
1) echo " Basic audio support" ;; | |
esac | |
else | |
(( dodump )) && echo "$blockoffset) CTA-861 extension block with old version $CTAversion" | |
fi | |
local newctablock="" | |
local lastctablockoffset=0 | |
local ctablocksAdded=0 | |
local newctadescriptor="" | |
local lastctadescriptoroffset=0 | |
local ctadescriptorsAdded=0 | |
if (( CTAversion > 2 )); then | |
# Loop CTA blocks | |
local CTAdatablockoffset=4 | |
if (( doaddctablockoffset == -1 )); then | |
doaddctablockoffset=$((blockoffset + CTAdatablockoffset)) | |
fi | |
local overflow=0 | |
while (( CTAdatablockoffset <= detailedTimingDescriptorsOffset )); do | |
if (( blockoffset + CTAdatablockoffset == doaddctablockoffset )); then | |
(( debug )) && echo ": found CTA block $doaddctablockoffset" 1>&2 | |
# concatenate all the new blocks that will fit | |
while (( currentnewctablock < ${#newctablocks[@]} )); do | |
local CTAdatablock=${newctablocks[currentnewctablock+arrstart]} | |
(( debug )) && echo ": testing $CTAdatablock" 1>&2 | |
if (( ${#CTAdatablock}/2 > 0x7b )); then | |
echo "Error: CTA block is too large: ${CTAdatablock}" 1>&2 | |
else | |
if (( 4 + (${#newctablock} + ${#CTAdatablock})/2 > 0x7f )); then | |
(( debug )) && echo ": overflow" 1>&2 | |
overflow=1 | |
break | |
fi | |
newctablock+="${CTAdatablock}" | |
((ctablocksAdded++)) | |
(( debug )) && echo ": $ctablocksAdded: concetenate result: $newctablock" 1>&2 | |
fi | |
((currentnewctablock++)) | |
done | |
newctablocks=("${newctablocks[@]:$currentnewctablock}") | |
currentnewctablock=0 | |
if (( ctablocksAdded == 0 )); then | |
# none fit here, try in the next block | |
doaddctablockoffset=-1 | |
fi | |
fi | |
if (( CTAdatablockoffset >= detailedTimingDescriptorsOffset)); then | |
break | |
fi | |
local CTAdatablocklength=$(((0x${theblock:$CTAdatablockoffset*2:2} & 0x1f) + 1)) | |
local CTAdatablock=${theblock:$CTAdatablockoffset*2:$CTAdatablocklength * 2} | |
# blocks that won't fit are inserted into a list that will be added later | |
if (( overflow || (4 + ${#newctablock}/2 + CTAdatablocklength > 0x7f) )); then | |
overflow=1 | |
newctablocks+=("$CTAdatablock") | |
if ((lastctablockoffset == 0)); then | |
lastctablockoffset=$CTAdatablockoffset | |
fi | |
else | |
newctablock+="${CTAdatablock}" | |
fi | |
((CTAdatablockoffset+=CTAdatablocklength)) | |
done | |
if ((lastctablockoffset == 0)); then | |
lastctablockoffset=$CTAdatablockoffset | |
fi | |
fi # CTAversion > 2 | |
if ((1)); then | |
# Loop CTA descriptors | |
local ctadescriptorblockoffset=$((detailedTimingDescriptorsOffset)) | |
if (( doaddctadescriptoroffset == -1 )); then | |
doaddctadescriptoroffset=$((blockoffset + ctadescriptorblockoffset)) | |
fi | |
local overflow=0 | |
while (( ctadescriptorblockoffset <= afterctadescriptorblockoffset )); do | |
if (( blockoffset + ctadescriptorblockoffset == doaddctadescriptoroffset )); then | |
(( debug )) && echo ": found CTA descriptor offset $doaddctadescriptoroffset" 1>&2 | |
# concatenate all the new blocks that will fit | |
while (( currentnewctadescriptor < ${#newctadescriptors[@]} )); do | |
local ctadescriptor=${newctadescriptors[currentnewctadescriptor+arrstart]} | |
(( debug )) && echo ": testing $ctadescriptor" 1>&2 | |
if (( ${#ctadescriptor}/2 != 18 )); then | |
echo "Error: CTA descriptor is wrong size (18 bytes expected): ${ctadescriptor}" 1>&2 | |
else | |
if (( 4 + (${#newctablock} + ${#newctadescriptor} + ${#ctadescriptor})/2 > 0x7f )); then | |
(( debug )) && echo ": overflow" 1>&2 | |
overflow=1 | |
break | |
fi | |
newctadescriptor+="${ctadescriptor}" | |
((ctadescriptorsAdded++)) | |
(( debug )) && echo ": $ctadescriptorsAdded: concetenate result: $newctadescriptor" 1>&2 | |
fi | |
((currentnewctadescriptor++)) | |
done | |
newctadescriptors=("${newctadescriptors[@]:$currentnewctadescriptor}") | |
currentnewctadescriptor=0 | |
if (( ctadescriptorsAdded == 0 )); then | |
# none fit here, try in the next block | |
doaddctadescriptoroffset=-1 | |
fi | |
fi | |
if (( ctadescriptorblockoffset + 18 > afterctadescriptorblockoffset )); then | |
break | |
fi | |
local ctadescriptorlength=18 | |
local ctadescriptor=${theblock:$ctadescriptorblockoffset*2:$ctadescriptorlength * 2} | |
# blocks that won't fit are inserted into a list that will be added later | |
if (( overflow || (4 + (${#newctablock} + ${#newctadescriptor})/2 + ctadescriptorlength > 0x7f) )); then | |
overflow=1 | |
case ${ctadescriptor} in | |
000000000000000000000000000000000000) ;; # "Empty" | |
000000100000000000000000000000000000) ;; # "Dummy block" | |
*) | |
newctadescriptors+=("$ctadescriptor") | |
if ((lastctadescriptoroffset == 0)); then | |
lastctadescriptoroffset=$ctadescriptorblockoffset | |
fi | |
;; | |
esac | |
else | |
newctadescriptor+="${ctadescriptor}" | |
fi | |
((ctadescriptorblockoffset+=ctadescriptorlength)) | |
done | |
if ((lastctadescriptoroffset == 0)); then | |
lastctadescriptoroffset=$ctadescriptorblockoffset | |
fi | |
fi | |
if (( ctablocksAdded || ctadescriptorsAdded )); then | |
detailedTimingDescriptorsOffset=$(( 4 + ${#newctablock}/2 )) | |
replacebytes $(( 2 + blockoffset )) "$( printf "%02x" "$detailedTimingDescriptorsOffset" )" | |
replacebytes $(( 4 + blockoffset )) "${newctablock}${newctadescriptor}$(printf "%0*x" $((0x7b*2 - ${#newctablock} - ${#newctadescriptor})) 0)" | |
theblock=${theedid:$blockoffset*2:254} | |
if (( ${#newctablocks[@]} > 0 )); then | |
doaddctablockoffset=-1 | |
fi | |
if (( ${#newctadescriptors[@]} > 0 )); then | |
doaddctadescriptoroffset=-1 | |
fi | |
fi | |
if (( CTAversion > 2 )); then | |
# Process CTA blocks | |
CTAdatablockoffset=4 | |
(( dodump && (CTAdatablockoffset < detailedTimingDescriptorsOffset) )) && echo " CTA data blocks:" | |
while (( CTAdatablockoffset < detailedTimingDescriptorsOffset )); do | |
CTAdatablocklength=$(((0x${theblock:$CTAdatablockoffset*2:2} & 0x1f) + 1)) | |
CTAdatablock=${theblock:$CTAdatablockoffset*2:$CTAdatablocklength * 2} | |
CTAtagcode=$((0x${CTAdatablock:0:2} >> 5)) | |
if (( CTAtagcode == 7 )); then | |
CTAtagcode=$(printf "%x" $((0x${CTAdatablock:2:2} + 0x700))) | |
fi | |
if (( dodump )); then | |
echo -n " $((blockoffset + CTAdatablockoffset))) " | |
case $CTAtagcode in | |
0) printf "Reserved" ;; | |
1) printf "Audio" ;; | |
2) printf "Video" ;; | |
3) printf "Vendor-specific" ;; | |
4) printf "Speaker allocation" ;; | |
5) printf "Display transfer characteristic" ;; | |
6) printf "Reserved" ;; | |
700) printf "Video capability" ;; | |
701) printf "Vendor-specific video" ;; | |
702) printf "VESA display device" ;; | |
703) printf "VESA video timing block" ;; | |
704) printf "Reserved for HDMI video" ;; | |
705) printf "Colorimetry" ;; | |
706) printf "HDR static metadata" ;; | |
707) printf "HDR dynamic metadata" ;; | |
70d) printf "Video format preference" ;; | |
70e) printf "YCbCr 4:2:0 video" ;; | |
70f) printf "YCbCr 4:2:0 capability map" ;; | |
710) printf "Reserved for CTA miscellaneous audio fields" ;; | |
711) printf "Vendor-specific audio" ;; | |
712) printf "Reserved for HDMI audio" ;; | |
713) printf "Room configuration" ;; | |
714) printf "Speaker location" ;; | |
720) printf "InfoFrames" ;; | |
*) | |
if (( 0x$CTAtagcode < 0x70d )); then | |
printf "Reserved for video-related" | |
elif (( 0x$CTAtagcode < 0x720 )); then | |
printf "Reserved for audio-related" | |
else | |
printf "Reserved" | |
fi | |
printf " (e%s)" "${CTAtagcode: -2}" | |
;; | |
esac | |
echo -n ": $CTAdatablock" | |
fi | |
local thepattern=".*:$CTAtagcode:.*" | |
local willberemoved=0 | |
if (( blockoffset + CTAdatablockoffset == deletectablockoffset )); then | |
willberemoved=1 | |
deletectablockoffset=0 | |
fi | |
if [[ $ctablocktypetodelete =~ $thepattern ]]; then | |
willberemoved=1 | |
fi | |
case $CTAtagcode in | |
1) | |
(( dodump )) && echo | |
HasAudio=1 | |
;; | |
3) | |
IEEEOUI=${CTAdatablock:6:2}${CTAdatablock:4:2}${CTAdatablock:2:2} | |
(( dodump )) && echo -n " = $IEEEOUI:" | |
case $IEEEOUI in | |
000c03) | |
(( dodump )) && echo " HDMI Licensing, LLC -> H14b VSDB" | |
H14bByte=${CTAdatablock:12:2} | |
if [[ -n $H14bByte ]]; then | |
H14bByte=$((0x${H14bByte})) | |
(( dodump )) && printf " Supports AI - %s\n" "$( (( H14bByte & 0x80 )) && echo "Yes" || echo "No")" | |
(( dodump )) && | |
case $(( (H14bByte >> 4) & 7 )) in | |
0) echo " Supports Deep Color - No" ;; | |
1) echo " Supports Deep Color - 10 bpc" ;; | |
2) echo " Supports Deep Color - 12 bpc" ;; | |
3) echo " Supports Deep Color - 10 bpc, 12 bpc" ;; | |
4) echo " Supports Deep Color - 16 bpc" ;; | |
5) echo " Supports Deep Color - 10 bpc, 16 bpc" ;; | |
6) echo " Supports Deep Color - 12 bpc, 16 bpc" ;; | |
7) echo " Supports Deep Color - 10 bpc, 12 bpc, 16 bpc" ;; | |
esac | |
if (( do8bpc )); then | |
local newH14bByte=$(( H14bByte & ~0x70 )) | |
replacebytes $((blockoffset+CTAdatablockoffset+6)) "$(printf "%02x" $newH14bByte)" | |
(( dodump )) && echo " changed: Supports Deep Color - No" | |
fi | |
(( dodump )) && printf " Supports Deep Color YCbCr 4:4:4 - %s\n" "$( (( H14bByte & 0x08 )) && echo "Yes" || echo "No")" | |
if (( doRGB )); then | |
local newH14bByte=$(( (H14bByte & ~0x08) | (0 << 3) )) # 0: No (RGB only), 1: Yes (YCbCr 4:4:4) | |
replacebytes $((blockoffset+CTAdatablockoffset+6)) "$(printf "%02x" $newH14bByte)" | |
(( dodump )) && echo " changed: Support YCbCr 4:4:4 - No" | |
fi | |
if (( do422 )); then | |
local newH14bByte=$(( (H14bByte & ~0x08) | (1 << 3) )) # 0: No (RGB only), 1: Yes (YCbCr 4:4:4) | |
replacebytes $((blockoffset+CTAdatablockoffset+6)) "$(printf "%02x" $newH14bByte)" | |
(( dodump )) && echo " changed: Support YCbCr 4:4:4 - Yes" | |
fi | |
(( dodump )) && printf " Supports DVI Dual-Link - %s\n" "$( (( H14bByte & 0x01 )) && echo "Yes" || echo "No")" | |
fi | |
;; | |
c45dd8) | |
(( dodump )) && echo " HDMI Forum -> HF-VSDB" | |
HFByte=$((0x${CTAdatablock:14:2})) | |
HF=$(( (HFByte >> 0) & 7 )) | |
(( dodump )) && | |
case $HF in | |
0) echo " 4:2:0 10/12/16 bpc - No" ;; | |
1) echo " 4:2:0 10 bpc - Yes" ;; | |
2) echo " 4:2:0 12 bpc - Yes" ;; | |
3) echo " 4:2:0 10/12 bpc - Yes" ;; | |
4) echo " 4:2:0 16 bpc - Yes" ;; | |
5) echo " 4:2:0 10/16 bpc - Yes" ;; | |
6) echo " 4:2:0 12/16 bpc - Yes" ;; | |
7) echo " 4:2:0 10/12/16 bpc - Yes" ;; | |
esac | |
if (( doRGB )); then | |
newHFByte=$(( (HFByte & ~0x07) | (0 << 0) )) | |
replacebytes $((blockoffset+CTAdatablockoffset+7)) "$(printf "%02x" $newHFByte)" | |
(( dodump )) && echo " changed: 4:2:0 10/12/16 bpc - No" | |
fi | |
if (( do422 )); then | |
newHFByte=$(( (HFByte & ~0x07) | (7 << 0) )) | |
replacebytes $((blockoffset+CTAdatablockoffset+7)) "$(printf "%02x" $newHFByte)" | |
(( dodump )) && echo " changed: 4:2:0 10/12/16 bpc - Yes" | |
fi | |
;; | |
*) | |
(( dodump )) && echo " Unknown OUI" | |
;; | |
esac | |
;; | |
*) | |
(( dodump )) && echo | |
;; | |
esac | |
if (( willberemoved )); then | |
((detailedTimingDescriptorsOffset-=CTAdatablocklength)) | |
replacebytes $((blockoffset+2)) "$(printf "%02x" "$detailedTimingDescriptorsOffset")" | |
local nextctablockoffset=$((CTAdatablockoffset+CTAdatablocklength)) | |
replacebytes $((blockoffset+CTAdatablockoffset)) "${theedid:(blockoffset+nextctablockoffset)*2:(127-nextctablockoffset)*2}${CTAdatablock//?/0}" | |
theblock=${theedid:$blockoffset*2:254} | |
(( dodump )) && echo " changed: deleted" | |
else | |
ctablocks+=("$CTAdatablock") | |
((CTAdatablockoffset+=CTAdatablocklength)) | |
EndOfLastctablock=$((blockoffset + CTAdatablockoffset)) | |
fi | |
done | |
(( dodump && (ctablocksAdded > 0) )) && echo " changed: added $ctablocksAdded" | |
if ((CTAdatablockoffset < detailedTimingDescriptorsOffset || detailedTimingDescriptorsOffset + 18 > 0x7f )); then | |
(( dodump )) && echo " $((blockoffset + CTAdatablockoffset)))" | |
fi | |
fi | |
# Process CTA descriptors | |
detailed_blocks $((blockoffset+detailedTimingDescriptorsOffset)) $((blockoffset + 127)) "$dodump" "$doreplacedescriptoroffset" "$deletedescriptoroffset" "$replacementdescriptor" | |
local ctadescriptorblockoffset=$((detailedTimingDescriptorsOffset)) | |
local ctadescriptorlength=18 | |
while (( ctadescriptorblockoffset + 18 <= afterctadescriptorblockoffset )); do | |
local ctadescriptor=${theblock:$ctadescriptorblockoffset*2:$ctadescriptorlength * 2} | |
case ${ctadescriptor} in | |
000000000000000000000000000000000000) ;; # "Empty" | |
000000100000000000000000000000000000) ;; # "Dummy block" | |
*) | |
ctadescriptors+=("$ctadescriptor") | |
EndOfLastctadescriptor=$((blockoffset + ctadescriptorblockoffset + ctadescriptorlength)) | |
;; | |
esac | |
((ctadescriptorblockoffset+=ctadescriptorlength)) | |
done | |
(( dodump && (ctadescriptorsAdded > 0) )) && echo " changed: added $ctadescriptorsAdded" | |
elif [[ $blocktag = 70 ]]; then | |
(( debug )) && echo ": parsing DisplayID extension block" 1>&2 | |
# 00 edid tag 70 | |
# | |
# 01 1 DisplayID version | |
# 02 2 DisplayID len 0x79 | |
# 03 3 DisplayID product type | |
# 04 4 DisplayID nextcount | |
# | |
# 05 00 DisplayID block #1 | |
# 06 01 DisplayID block #1 revision | |
# 07 02 DisplayID block #1 length | |
# | |
# 7E 5 displayID checksum | |
# | |
# 7F EDID checksum | |
DisplayIDversion=${theblock:2:1}.${theblock:3:1} | |
# maximum length of DisplayID section in an EDID extension block is 121 = 0x79 bytes. | |
# this is the length of all the DisplayID blocks | |
DisplayIDlength=$((0x${theblock:4:2})) | |
DisplayIDproducttype=$((0x${theblock:6:2})) | |
#DisplayIDextcount=$((0x${theblock:8:2})) | |
DisplayIDblockoffset=5 | |
if (( doadddisplayidblockoffset == -1 )); then | |
doadddisplayidblockoffset=$((blockoffset + DisplayIDblockoffset)) | |
fi | |
local newdisplayidblock="" | |
local newDisplayIDblocklength=0 | |
local lastDisplayIDblockoffset=0 | |
local displayidblocksAdded=0 | |
local overflow=0 | |
while (( DisplayIDblockoffset < DisplayIDlength + 5 )); do | |
if (( blockoffset + DisplayIDblockoffset == doadddisplayidblockoffset )); then | |
(( debug )) && echo ": found DisplayID block $doadddisplayidblockoffset" 1>&2 | |
# concatenate all the new blocks that will fit | |
while (( currentnewdisplayidblock < ${#newdisplayidblocks[@]} )); do | |
local DisplayIDblock=${newdisplayidblocks[currentnewdisplayidblock+arrstart]} | |
(( debug )) && echo ": testing $DisplayIDblock" 1>&2 | |
if (( ${#DisplayIDblock}/2 > 0x79 )); then | |
echo "Error: DisplayID block is too large: ${DisplayIDblock}" 1>&2 | |
else | |
if (( (${#newdisplayidblock} + ${#DisplayIDblock})/2 > 0x7e - DisplayIDblockoffset )); then | |
(( debug )) && echo ": overflow" 1>&2 | |
overflow=1 | |
break | |
fi | |
newdisplayidblock+="${DisplayIDblock}" | |
((displayidblocksAdded++)) | |
(( debug )) && echo ": $displayidblocksAdded: concetenate result: $newdisplayidblock" 1>&2 | |
fi | |
((currentnewdisplayidblock++)) | |
done | |
newdisplayidblocks=("${newdisplayidblocks[@]:$currentnewdisplayidblock}") | |
currentnewdisplayidblock=0 | |
newDisplayIDblocklength=$((${#newdisplayidblock}/2)) | |
if (( displayidblocksAdded == 0 )); then | |
# none fit here, try in the next block | |
doadddisplayidblockoffset=-1 | |
fi | |
fi | |
# stop when the remaining bytes are 0 | |
local remains=${theblock:$DisplayIDblockoffset * 2:($DisplayIDlength + 5 - $DisplayIDblockoffset)*2} | |
if [ -z "${remains//0/}" ]; then | |
break | |
fi | |
local DisplayIDblocklength=$((0x${theblock:$DisplayIDblockoffset * 2 + 4:2} + 3)) | |
# blocks that won't fit are inserted into a list that will be added later | |
if (( overflow || (DisplayIDblockoffset + DisplayIDblocklength + newDisplayIDblocklength > 0x7e) )); then | |
overflow=1 | |
local DisplayIDblock=${theblock:$DisplayIDblockoffset*2:$DisplayIDblocklength * 2} | |
newdisplayidblocks+=("$DisplayIDblock") | |
if ((lastDisplayIDblockoffset == 0)); then | |
lastDisplayIDblockoffset=$DisplayIDblockoffset | |
fi | |
fi | |
((DisplayIDblockoffset+=DisplayIDblocklength)) | |
done | |
if ((lastDisplayIDblockoffset == 0)); then | |
lastDisplayIDblockoffset=$DisplayIDblockoffset | |
fi | |
(( dodump )) && printf "%s) DisplayID extension block: version %s, type %d\n" $blockoffset "$DisplayIDversion" $DisplayIDproducttype | |
DisplayIDblockoffset=5 | |
while (( DisplayIDblockoffset < DisplayIDlength + 5 )); do | |
if (( blockoffset + DisplayIDblockoffset == doadddisplayidblockoffset )); then | |
replacebytes $((doadddisplayidblockoffset)) "$newdisplayidblock${theblock:$DisplayIDblockoffset*2:($lastDisplayIDblockoffset-$DisplayIDblockoffset)*2}" | |
doadddisplayidblockoffset=-1 | |
((lastDisplayIDblockoffset+=newDisplayIDblocklength)) | |
if (( DisplayIDlength + 5 < lastDisplayIDblockoffset )); then | |
DisplayIDlength=$((lastDisplayIDblockoffset - 5)) | |
replacebytes $((blockoffset+2)) "$(printf "%02x" $DisplayIDlength)" | |
fi | |
theblock=${theedid:$blockoffset*2:254} | |
fi | |
local DisplayIDblocklength=$((0x${theblock:$DisplayIDblockoffset * 2 + 4:2} + 3)) | |
(( dodump )) && echo -n " $((blockoffset + DisplayIDblockoffset)))" | |
local DisplayIDblock=${theblock:$DisplayIDblockoffset*2:$DisplayIDblocklength * 2} | |
local DisplayIDtagcode=${DisplayIDblock:0:2} | |
# stop when the remaining bytes are 0 | |
local remains=${theblock:$DisplayIDblockoffset * 2:($DisplayIDlength + 5 - $DisplayIDblockoffset)*2} | |
if [ -z "${remains//0/}" ]; then | |
(( dodump )) && echo | |
break | |
fi | |
if (( dodump )); then | |
printf " " | |
case $DisplayIDtagcode in | |
# DisplayID 1.3 | |
00) printf "Product identification" ;; | |
01) printf "Display parameters" ;; | |
02) printf "Color characteristics" ;; | |
03) printf "Type 1 detailed timing" ;; | |
04) printf "Type 2 detailed timing" ;; | |
05) printf "Type 3 short timing" ;; | |
06) printf "Type 4 DMT timing" ;; | |
07) printf "VESA timings" ;; | |
08) printf "CTA timings" ;; | |
09) printf "Video timing range" ;; | |
0a) printf "Product serial number" ;; | |
0b) printf "General purpose ASCII string" ;; | |
0c) printf "Display device data" ;; | |
0d) printf "Interface power sequencing" ;; | |
0e) printf "Transfer characterisitics" ;; | |
0f) printf "Display interface" ;; | |
10) printf "Stereo display interface" ;; | |
12) printf "Tiled display topology" ;; | |
# DisplayID 2.0 | |
20) printf "Product ID data" ;; | |
21) printf "Display parameters data" ;; | |
22) printf "Type 7 timing - detailed timing data" ;; | |
23) printf "Type 8 timing - enumerated timing code data" ;; | |
24) printf "Type 9 timing - formula-based timing data" ;; | |
25) printf "Dynamic video timing range limits data" ;; | |
26) printf "Display interface features data" ;; | |
27) printf "Stereo display interface data" ;; | |
28) printf "Tiled display topology data" ;; | |
29) printf "ContainerID data" ;; | |
# 2Ah .. 7Dh RESERVED for Additional VESA-defined Data Blocks | |
7e) printf "2.0 Vendor-specific data" ;; | |
7f) printf "1.3 Vendor-specific data" ;; | |
81) printf "CTA DisplayID data" ;; | |
# 82h .. FFh RESERVED | |
*) | |
if (( 0x$DisplayIDtagcode <= 0x1f )); then | |
printf "Reserved for legacy" | |
elif (( 0x$DisplayIDtagcode <= 0x7d )); then | |
printf "Reserved for VESA" | |
elif (( 0x$DisplayIDtagcode <= 7f )); then | |
printf "Reserved" | |
else | |
printf "Reserved for external standards" | |
fi | |
printf " (%s)" "$DisplayIDtagcode" | |
;; | |
esac | |
echo -n ": $DisplayIDblock" | |
fi | |
local willberemoved=0 | |
if (( blockoffset + DisplayIDblockoffset == deletedisplayidblockoffset )); then | |
willberemoved=1 | |
deletedisplayidblockoffset=0 | |
fi | |
if (( 0x$DisplayIDtagcode == displayidblocktypetodelete )); then | |
willberemoved=1 | |
fi | |
case $DisplayIDtagcode in | |
03) | |
local timing1offset=3 | |
(( dodump == 1 && DisplayIDblocklength > 23 )) && echo | |
while ((timing1offset < DisplayIDblocklength )); do | |
local type1timing=${DisplayIDblock:$timing1offset*2:40} | |
if (( dodump )); then | |
(( DisplayIDblocklength > 23 )) && echo -n " $((blockoffset+DisplayIDblockoffset+timing1offset))) $type1timing" | |
fi | |
local type1timingtext="" | |
type1timingtext="$(dumptype1timingdescriptor "$type1timing")" | |
if (( willberemoved == 0 )); then | |
thetimings+=("$type1timingtext") | |
thetimingsoffsets+=("$(( blockoffset + DisplayIDblockoffset + timing1offset ))") | |
thetimingshex+=("$type1timing") | |
fi | |
(( dodump )) && echo " = $type1timingtext" | |
((timing1offset+=20)) | |
done | |
;; | |
12) | |
HasTile=1 | |
(( dodump )) && printf " = " | |
dumptileddisplaytopologyblock "$DisplayIDblock" | |
(( dodump )) && echo | |
;; | |
26) (( dodump )) && printf " = " | |
dumpdisplayinterfacefeaturesdata "$DisplayIDblock" | |
(( dodump )) && echo | |
if (( do8bpc || doRGB )); then | |
# RGB: 6 8 10 12 14 16 | |
# 444: 6 8 10 12 14 16 | |
# 422: 8 10 12 14 16 | |
# 420: 8 10 12 14 16 | |
local validdepths=$((0x3f3f1f1f)) | |
if (( do8bpc )); then | |
((validdepths &= 0x03030101)) | |
fi | |
if (( doRGB )); then | |
((validdepths &= 0xff000000)) | |
fi | |
replacebytes $((blockoffset + DisplayIDblockoffset + 3)) "$( printf "%08x" $(( 0x${DisplayIDblock:6:8} & validdepths )) )" | |
theblock=${theedid:$blockoffset*2:254} | |
DisplayIDblock=${theblock:$DisplayIDblockoffset*2:$DisplayIDblocklength * 2} | |
if (( dodump )); then | |
printf " changed: %s = " "$DisplayIDblock" | |
dumpdisplayinterfacefeaturesdata "$DisplayIDblock" | |
echo | |
fi | |
fi | |
;; | |
*) | |
(( dodump )) && echo | |
;; | |
esac | |
if (( willberemoved )); then | |
(( debug )) && echo ":" replacebytes $((blockoffset + DisplayIDblockoffset)) "${theblock:($DisplayIDblockoffset + $DisplayIDblocklength)*2:($lastDisplayIDblockoffset - $DisplayIDblockoffset - $DisplayIDblocklength)*2}${DisplayIDblock//?/0}" 1>&2 | |
(( debug )) && echo ":" $DisplayIDblockoffset $DisplayIDblocklength "$lastDisplayIDblockoffset" "${DisplayIDblock//?/0}" 1>&2 | |
replacebytes $((blockoffset + DisplayIDblockoffset)) "${theblock:($DisplayIDblockoffset + $DisplayIDblocklength)*2:($lastDisplayIDblockoffset - $DisplayIDblockoffset - $DisplayIDblocklength)*2}${DisplayIDblock//?/0}" | |
((lastDisplayIDblockoffset-=DisplayIDblocklength)) | |
theblock=${theedid:$blockoffset*2:254} | |
(( dodump )) && echo " changed: deleted" | |
else | |
DisplayIDblocks+=("$DisplayIDblock") | |
((DisplayIDblockoffset+=DisplayIDblocklength)) | |
EndOfLastDisplayIDblock=$((blockoffset + DisplayIDblockoffset)) | |
fi | |
done | |
(( dodump && (displayidblocksAdded > 0) )) && echo " changed: added $displayidblocksAdded" | |
else | |
(( dodump )) && echo "$blockoffset) Extension block: type:$blocktag: $theblock" | |
fi | |
((blockoffset+=128)) | |
if (( ((blockoffset*2 == ${#theedid}) || (0x${theedid:$blockoffset*2:2} != 2) ) && ((doaddctablockoffset == -1) && (${#newctablocks[@]} > 0) || (doaddctadescriptoroffset == -1) && (${#newctadescriptors[@]} > 0)) )); then | |
addctaextensionblock "${CTAversion:=3}" "$YCbCrSupportbyte" "$blockoffset" | |
fi | |
if (( (blockoffset*2 == ${#theedid}) && (doadddisplayidblockoffset == -1) && (${#newdisplayidblocks[@]} > 0) )); then | |
adddisplayidextensionblock "${DisplayIDversion:=1.3}" ${DisplayIDproducttype:=0} | |
fi | |
done | |
(( dodump )) && echo "$blockoffset) End" | |
# post processing | |
local timingndx=0 | |
local tileTimingsCurrent="" | |
for ((timingndx = 0 ; timingndx < ${#thetimings[@]} ; timingndx++)); do | |
local thetiming="${thetimings[timingndx+arrstart]}" | |
local thewidth=${thetiming%%x*} | |
local theheight=${thetiming#*x} | |
theheight=${theheight%%@*} | |
local thetimingrefresh=${thetiming#*@} | |
thetimingrefresh=${thetimingrefresh%%Hz*} | |
thetimingrefresh=0000${thetimingrefresh/./} | |
thetimingrefresh=${thetimingrefresh: -7} | |
if (( thewidth > maxresH )); then | |
maxresH=$thewidth | |
maxresV=$theheight | |
fi | |
if (( HasTile )); then | |
if [[ "$thetiming" =~ ${tileSizeH}x${tileSizeV}@([0-9.]+)Hz.* ]]; then | |
tileTimingsCurrent+="$thetimingrefresh $thetiming\n" | |
fi | |
fi | |
done | |
if (( HasTile )); then | |
if [[ -n $tileTimingsCurrent ]]; then | |
tileTimings=$(echo "$tileTimingsCurrent" | sort -r) | |
tileRefresh=$(( (10#${tileTimings%% *} + 50)/100)) # round to 1 decimal | |
if (( tileRefresh % 10 )); then | |
tileRefresh=$((tileRefresh / 10)).${tileRefresh: -1} | |
else | |
tileRefresh=$((tileRefresh / 10)) | |
fi | |
fi | |
fi | |
} | |
createdetailedtiming () { | |
# currently supports only "Normal Display" with "Digital Separate Sync" | |
local param="" | |
for param in MHz hactive hfront hpulse hback vactive vfront vpulse vback hsync vsync hmm vmm hborder vborder; do | |
eval "local $param=\"$1\""; (( $# )) && shift | |
done | |
local interlaced=0 | |
[[ -n ${vactive//[^i]} ]] && interlaced=1 | |
vactive=${vactive//[^0-9]} | |
[[ "$hsync" = '+' ]] && hsync=1 || hsync=0 | |
[[ "$vsync" = '+' ]] && vsync=1 || vsync=0 | |
local MHzint=$(( (10#$(printf "0%s.000" $MHz | sed -E "s/^([0-9]*)\.([0-9])\.*([0-9])\.*([0-9]).*/\1\2\3\4/g") + 5) / 10)) | |
local hblank=$((hfront + hpulse + hback)) | |
local vblank=$((vfront + vpulse + vback)) | |
printf "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" \ | |
$((MHzint & 255)) $((MHzint >> 8)) \ | |
$((hactive & 255)) \ | |
$((hblank & 255)) \ | |
$(((hactive >> 8 << 4) + (hblank >> 8))) \ | |
$((vactive & 255)) \ | |
$((vblank & 255)) \ | |
$(((vactive >> 8 << 4) + (vblank >> 8))) \ | |
$((hfront & 255)) \ | |
$((hpulse & 255)) \ | |
$((((vfront & 15) << 4) + (vpulse & 15))) \ | |
$(((hfront >> 8 << 6) + (hpulse >> 8 << 4) + (vfront >> 4 << 2) + (vpulse >> 4))) \ | |
$((${hmm:=0} & 255)) \ | |
$((${vmm:=0} & 255)) \ | |
$(((${hmm:=0} >> 8 << 4) + (${vmm:=0} >> 8))) \ | |
${hborder:=0} \ | |
${vborder:=0} \ | |
$(((interlaced << 7) + 0x18 + (vsync << 2) + (hsync << 1))) | |
} | |
createtype1timingdescriptor () { | |
# currently supports only "Normal Display" with "Digital Separate Sync" | |
# no 3D, no interlaced | |
local param="" | |
for param in MHz hactive hfront hpulse hback vactive vfront vpulse vback hsync vsync preferred; do | |
eval "local $param=\"$1\""; (( $# )) && shift | |
done | |
local interlaced=0 | |
[[ -n ${vactive//[^i]} ]] && interlaced=1 | |
vactive=${vactive//[^0-9]} | |
[[ "$hsync" = '+' ]] && hsync=1 || hsync=0 | |
[[ "$vsync" = '+' ]] && vsync=1 || vsync=0 | |
local MHzint=$(((10#$(printf "0%s.000" $MHz | sed -E "s/^([0-9]*)\.([0-9])\.*([0-9])\.*([0-9]).*/\1\2\3\4/g") + 5) / 10)) | |
local hblank=$((hfront + hpulse + hback)) | |
local vblank=$((vfront + vpulse + vback)) | |
local aspect=8 | |
case $(((hactive * 10000 / vactive + 5)/10)) in | |
1000) aspect=0 ;; | |
1250) aspect=1 ;; | |
1333) aspect=2 ;; | |
1667) aspect=3 ;; | |
1778) aspect=4 ;; | |
1600) aspect=5 ;; | |
2370) aspect=6 ;; | |
1896) aspect=7 ;; | |
esac | |
((MHzint-=1)) | |
((hactive-=1)) | |
((hblank-=1)) | |
((hfront-=1)) | |
((hpulse-=1)) | |
((vactive-=1)) | |
((vblank-=1)) | |
((vfront-=1)) | |
((vpulse-=1)) | |
printf "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" \ | |
$((MHzint & 255)) $(((MHzint >> 8) & 255)) $((MHzint >> 16)) \ | |
$(((${preferred:=0} << 7) + (interlaced << 4) + aspect)) \ | |
$((hactive & 255)) $((hactive >> 8)) \ | |
$((hblank & 255)) $((hblank >> 8)) \ | |
$((hfront & 255)) $((((hfront >> 8) & 127) + (hsync << 7))) \ | |
$((hpulse & 255)) $((hpulse >> 8)) \ | |
$((vactive & 255)) $((vactive >> 8)) \ | |
$((vblank & 255)) $((vblank >> 8)) \ | |
$((vfront & 255)) $((((vfront >> 8) & 127) + (vsync << 7))) \ | |
$((vpulse & 255)) $((vpulse >> 8)) | |
} | |
createtype1timingblock () { | |
local type1timingblock="" | |
while (( $# )); do | |
type1timingblock+=$1 | |
shift | |
done | |
printf "0300%02x%s" $((${#type1timingblock}/2)) "$type1timingblock" | |
} | |
addchromasubsampling () { | |
processedid do422 dodeletectablocktype 70f # = YCbCr 4:2:0 capability map | |
repairchecksums | |
} | |
removechromasubsampling () { | |
processedid doRGB dodeletectablocktype 70f # = YCbCr 4:2:0 capability map | |
repairchecksums | |
} | |
set8bpcmax () { | |
processedid do8bpc dodeletectablocktype 706 707 # = HDR static metadata, HDR dynamic metadata | |
repairchecksums | |
} | |
deletectablock () { | |
processedid dodeletectablock "$1" | |
repairchecksums | |
} | |
deletectablocktype () { | |
processedid dodeletectablocktype "$1" | |
repairchecksums | |
} | |
addctablock () { | |
processedid doaddctablock "$@" | |
repairchecksums | |
} | |
deletedescriptor () { | |
processedid dodeletedescriptor "$1" | |
repairchecksums | |
} | |
addctadescriptor () { | |
processedid doaddctadescriptor "$@" | |
repairchecksums | |
} | |
replacedescriptor () { | |
processedid doreplacedescriptor "$1" "$2" | |
repairchecksums | |
} | |
cleardate () { | |
processedid docleardate | |
repairchecksums | |
} | |
clearserialnumber () { | |
processedid doclearserialnumber | |
repairchecksums | |
} | |
setpreferredisnative () { | |
processedid dosetpreferredisnative "$1" | |
repairchecksums | |
} | |
clearchromaticity () { | |
processedid doclearchromaticity | |
repairchecksums | |
} | |
clearestablishedtimings () { | |
processedid doclearestablishedtimings | |
repairchecksums | |
} | |
clearmanufacturerstimings () { | |
processedid doclearmanufacturerstimings | |
repairchecksums | |
} | |
clearstandardtimings () { | |
processedid doclearstandardtimings | |
repairchecksums | |
} | |
deletedisplayidblock () { | |
processedid dodeletedisplayidblock "$1" | |
repairchecksums | |
} | |
deletedisplayidblocktype () { | |
processedid dodeletedisplayidblockblocktype "$1" | |
repairchecksums | |
} | |
adddisplayidblock () { | |
processedid doadddisplayidblock "$@" | |
repairchecksums | |
} | |
dumpedid () { | |
processedid dodump | |
} | |
dumpedidall () { | |
local dostdout=0 | |
local thefolderpath="." | |
while (( $# )); do | |
case "$1" in | |
"-s") dostdout=1 ;; | |
*) thefolderpath="$1" ;; | |
esac | |
shift | |
done | |
local saveedid="$theedid" | |
local i="" | |
for ((i = 1 ; i <= ${#edids[@]} ; i++)); do | |
useedidnum "$i" | |
if ((dostdout)); then | |
echo "==========================================================================================" | |
echo "$i)" | |
echo "${paths[i+arrstart-1]}" | |
echo "==================" | |
dumpedid | |
else | |
dumpedid > "${thefolderpath:=.}/${thefilenamebase}_dumpedid.txt" | |
fi | |
done | |
useedidstring "$saveedid" | |
} | |
createdummydescriptor () { | |
echo -n "000000100000000000000000000000000000" | |
} | |
createemptydescriptor () { | |
echo -n "000000000000000000000000000000000000" | |
} | |
#========================================================================================= | |
# Use EDID | |
clearedidinfo () { | |
tileTimings="" | |
tileSizeH="" | |
tileSizeV="" | |
tileRefresh="" | |
maxresH=0 | |
maxresV=0 | |
} | |
useedidstring () { | |
clearedidinfo | |
(( debug )) && echo ": useedidstring $1" 1>&2 | |
theedid="$1" | |
processedid | |
} | |
useedidnum () { | |
clearedidinfo | |
theedid=${edids[arrstart - 1 + $1]} | |
processedid | |
thefilenamebase="${thefilenamebase}_$i" | |
} | |
#========================================================================================= | |
# Get EDID | |
clearedids () { | |
edids=() | |
paths=() | |
} | |
clearedids | |
applypatches () { | |
thefilename="$1" | |
sourcename="$2" | |
if [[ -f "${thefilename}" ]]; then | |
if /usr/libexec/PlistBuddy -c 'Print :edid-patches' "${thefilename}" > /dev/null 2>&1; then | |
local index=0 | |
while [ -n "$(/usr/libexec/PlistBuddy -c "Print :edid-patches:$index:offset" "${thefilename}" 2> /dev/null)" ]; do | |
local theoffset="" | |
local thedata="" | |
theoffset=$(/usr/libexec/PlistBuddy -c "Print :edid-patches:$index:offset" "${thefilename}") | |
thedata=$(/usr/libexec/PlistBuddy -c "Print :edid-patches:$index:data" "${thefilename}" | xxd -p -c 99999) | |
thedata=${thedata%0a} # remove extra linefeed that was added by PlistBuddy | |
theedid=${theedid:0:$theoffset*2}${thedata}${theedid:$theoffset*2 + ${#thedata}} | |
((index+=1)) | |
done | |
if (( ${#theedid} % 256 == 0 )); then | |
if [[ -n $sourcename ]]; then | |
addedid "${thefilename}:edid-patches of ($sourcename)" "$theedid" | |
else | |
addedid "${thefilename}:edid-patches" "$theedid" | |
fi | |
else | |
theedid="" | |
fi | |
fi | |
fi | |
} | |
addedid () { | |
local saveedid="$theedid" | |
local thepath="$1" | |
useedidstring "$2" | |
local isnew=1 | |
local i="" | |
for ((i = 0 ; i < ${#edids[@]} ; i++)); do | |
if [[ $theedid = "${edids[i+arrstart]}" ]]; then | |
if [[ ! "$(printf "_\n%s\n_" "${paths[i+arrstart]}")" =~ $(printf ".*\n%s\n.*" "${thepath}") ]]; then | |
paths[i+arrstart]="$(printf "%s\n%s" "${paths[i+arrstart]}" "$thepath")" | |
fi | |
isnew=0 | |
break | |
fi | |
done | |
if (( isnew )); then | |
(( debug )) && echo ": isnew" 1>&2 | |
edids+=("$theedid") | |
paths+=("$thepath") | |
local newndx=${#edids[@]} | |
local thefilename="" | |
local thedir="" | |
for thedir in "/System" ""; do | |
local fulldir="$thedir/Library/Displays/Contents/Resources/Overrides" | |
for thefilename in "$fulldir/$themanufacturefile" "$fulldir/$theproductfile"; do | |
(( debug )) && echo ": checking $thefilename" 1>&2 | |
if [[ -f "${thefilename}" ]]; then | |
loadoverridefile "${thefilename}" | |
[[ -n $lastoverrideedid ]] && theedid=$lastoverrideedid | |
applypatches "${thefilename}" "$newndx" | |
fi | |
done | |
for thefilename in "$fulldir/${themanufacturefile}.mtdd" "$fulldir/${theproductfile}.mtdd"; do | |
(( debug )) && echo ": checking $thefilename" 1>&2 | |
if [[ -f "${thefilename}" ]]; then | |
loadmtddfile "${thefilename}" | |
fi | |
done | |
done | |
fi | |
useedidstring "$saveedid" | |
} | |
loadoverridefile () { | |
while (( $# )); do | |
local thefilename="" | |
thefilename="$1" | |
shift | |
# lastoverrideedid is not local | |
lastoverrideedid=$(/usr/libexec/PlistBuddy -c 'Print :IODisplayEDID' "${thefilename}" 2> /dev/null | xxd -p -c 99999) | |
lastoverrideedid=${lastoverrideedid%0a} # remove extra linefeed that was added by PlistBuddy | |
[[ -n $lastoverrideedid ]] && addedid "${thefilename}:IODisplayEDID" "$lastoverrideedid" | |
local theedid="" | |
theedid=$(/usr/libexec/PlistBuddy -c 'Print :"SwitchResX backuped settings":IODisplayEDID' "${thefilename}" 2> /dev/null | xxd -p -c 99999) | |
theedid=${theedid%0a} # remove extra linefeed that was added by PlistBuddy | |
[[ -n $theedid ]] && addedid "${thefilename}:SwitchResX backuped settings:IODisplayEDID" "$theedid" | |
done | |
} | |
loadmtddfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
local theedid="" | |
theedid=$(/usr/libexec/PlistBuddy -c 'Print :display:overlay' "${thefilename}" 2> /dev/null | xxd -p -c 99999) | |
theedid=${theedid%0a} # remove extra linefeed that was added by PlistBuddy | |
[[ -n $theedid ]] && addedid "${thefilename}:overlay" "$theedid" | |
done | |
} | |
loadswitchresxfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
local theedid="" | |
theedid=$(sed -n -E -e $'/^ *<([0-9A-F \t]+)[ \t]*>/s//\\1/p' "${thefilename}" | xxd -r -p | xxd -p -c 99999) | |
addedid "${thefilename}:switchresx" "$theedid" | |
done | |
} | |
loadmamhexfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
local theedid="" | |
theedid=$(sed -n -E -e "/^:[0-9A-F]{8}([0-9A-F]{64})[0-9A-F]{2}.?$/s//\1/p" "${thefilename}" | xxd -p -r | xxd -p -c 99999) | |
addedid "${thefilename}:Monitor Asset Manager.hex" "$theedid" | |
done | |
} | |
loadmaminffile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
local theedid="" | |
theedid=$(sed -n -E -e '/^HKR,EDID_OVERRIDE,".+",0x01((,0x[0-9A-F]{2})*).?$/s//\1/;s/,0x//gp' "${thefilename}" | xxd -p -r | xxd -p -c 99999) | |
addedid "${thefilename}:Monitor Asset Manager.hex" "$theedid" | |
done | |
} | |
loadmamdatfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
local theedid="" | |
theedid=$(sed -n -E -e '/^[0-9A-F]{2,4} \|(( [0-9A-F]{2})*).?$/s//\1/p' "${thefilename}" | xxd -r -p | xxd -p -c 99999) | |
addedid "${thefilename}:Monitor Asset Manager.dat" "$theedid" | |
done | |
} | |
numstrings=0 | |
loadstring () { | |
local theedid="$1" | |
local sourcename="$2" | |
theedid=$(echo ${theedid//0x/} | tr -d ' \n\r\t,$') | |
if [[ -z $sourcename ]]; then | |
((numstrings++)) | |
sourcename="string:$numstrings" | |
fi | |
addedid "$sourcename" "$(tr 'A-F' 'a-f' <<< "$theedid")" | |
} | |
loadcurrentedid () { | |
loadstring "$theedid" "$1" | |
} | |
loadbinfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
addedid "$thefilename" "$(xxd -p -c 99999 < "$thefilename")" | |
done | |
} | |
loadhexfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
addedid "$thefilename" "$( | |
if [[ -z $(tr -d 'a-fA-F0-9 \n\t' < "$thefilename") ]]; then | |
xxd -p -r < "$thefilename" | |
else | |
xxd -r < "$thefilename" | |
fi | xxd -p -c 99999 | |
)" | |
done | |
} | |
loadoneediditem () { | |
local ediditem="$1" | |
local thepath="${ediditem% = <*}" | |
local theedid="${ediditem##* = <}" | |
local theedid="${theedid%>}" | |
(( debug )) && echo ":" addedid "${thepath}" "${theedid}" 1>&2 | |
addedid "${thepath}" "${theedid}" | |
} | |
loadagdcfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
IFS=$'\n' | |
local ediditem="" | |
for ediditem in $( | |
perl -e ' | |
$thepath=""; while (<>) { | |
if ( m|^(?:\[\d+\] )?IOService:(/.*)| ) { $thepath = $1 } | |
if ( /^[#|]* ?EDID Dump (Port \d+) - Start( ##)?/ ) { $theport = $1; $edid = "" } | |
if ( m|^( )?/\*? ...: \*?/ ?(.*)| ) { $edid .= $2 } | |
if ( /^(## )?EDID Dump (Port \d+) - End( ##)?/ and length $edid > 0 ) { $edid =~ s/0x(..)(, *)?/$1/g; print "'"${thefilename}"':" . $thepath . "/" . $theport . " = <" . $edid . ">\n" } | |
} | |
' < "${thefilename}" | |
); do | |
(( debug )) && echo ":" loadoneediditem "${ediditem}" 1>&2 | |
loadoneediditem "${ediditem}" | |
done | |
done | |
} | |
loadmamfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
IFS=$'\n' | |
local ediditem="" | |
for ediditem in $( | |
perl -e ' | |
$thepath=""; while (<>) { | |
if ( m|^(Monitor( #.*\S)?)\s*$| ) { $thepath = $1 } | |
if ( /^Raw data.?$/ ) { $edid = "" } | |
if ( m| *(([0-9A-F]{2},){31}[0-9A-F]{2},).?$| ) { $edid .= $1 } | |
if ( m| *(([0-9A-F]{2},){31}[0-9A-F]{2})[^,]*$| ) { $edid .= $1 . ","; $edid =~ s/(..),/$1/g; print "'"${thefilename}"':" . $thepath . " = <" . lc $edid . ">\n" } | |
} | |
' < "${thefilename}" | |
); do | |
(( debug )) && echo ":" loadoneediditem "${ediditem}" 1>&2 | |
loadoneediditem "${ediditem}" | |
done | |
done | |
} | |
loadagdc () { | |
local thefilename="$1" | |
if [[ -z $thefilename ]]; then | |
thefilename=$(mktemp /tmp/local_AGDCDiagnose.XXXXXX) || exit 1 | |
fi | |
/System/Library/Extensions/AppleGraphicsControl.kext/Contents/MacOS/AGDCDiagnose -a > "$thefilename" 2>&1 | |
loadagdcfile "$thefilename" | |
} | |
loadioregfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
IFS=$'\n' | |
local ediditem="" | |
for ediditem in $( | |
perl -e ' | |
$thepath=""; while (<>) { | |
if ( /^([ |]*)\+\-o (.+) </ ) { $indent = (length $1) / 2; $name = $2; $thepath =~ s|^((/[^/]*){$indent}).*|$1/$name| } | |
if ( /^[ |]*"([^"]+)" = <(00ffffffffffff00[0-9a-f]*)>/i ) { print "'"${thefilename}"'" . ":" . $thepath . "/" . $1 . " = <" . $2 . ">\n" } | |
} | |
' < "${thefilename}" | |
); do | |
loadoneediditem "${ediditem}" | |
done | |
done | |
} | |
loadallrezfile () { | |
while (( $# )); do | |
local thefilename="$1" | |
shift | |
IFS=$'\n' | |
local ediditem="" | |
for ediditem in $( | |
perl -e ' | |
$agdcpath=""; | |
$thepath=""; while (<>) { | |
if ( /^( *)(\w.*?) += \{$/ ) { $indent = (length $1) / 4; $name = $2 =~ s|/|•|gr; $thepath =~ s|^((/[^/]*){$indent}).*|$1/$name| } | |
elsif ( /^( *)\}.*$/ ) { $indent = (length $1) / 4; $thepath =~ s|^((/[^/]*){$indent}).*|$1| } | |
if ( /^ *(\w.*?) += (00ffffffffffff00[0-9a-f]*)/i ) { $var = $1; $edid = $2; print "'"${thefilename}"'" . ":" . ($thepath =~ s|•|/|gr) . "/" . $var . " = <" . $edid . ">\n" } | |
if ( m|^(?:\[\d+\] )?IOService:(/.*)| ) { $agdcpath = $1 } | |
if ( /^[#|]* ?EDID Dump (Port \d+) - Start( ##)?/ ) { $theport = $1; $edid = "" } | |
if ( m|^( )?/\*? ...: \*?/ ?(.*)| ) { $edid .= $2 } | |
if ( /^(## )?EDID Dump (Port \d+) - End( ##)?/ and length $edid > 0 ) { $edid =~ s/0x(..)(, *)?/$1/g; print "'"${thefilename}"':" . $agdcpath . "/" . $theport . " = <" . $edid . ">\n" } | |
} | |
' < "${thefilename}" | |
); do | |
loadoneediditem "${ediditem}" | |
done | |
done | |
} | |
loadioreg () { | |
local tmpfilename="" | |
tmpfilename=$(mktemp /tmp/local_ioreg.XXXXXX) || exit 1 | |
ioreg -lw0 > "$tmpfilename" | |
loadioregfile "$tmpfilename" | |
} | |
listedids () { | |
local saveedid="$theedid" | |
local i="" | |
for ((i = 1 ; i <= ${#edids[@]} ; i++)); do | |
useedidnum "$i" | |
echo "$i)" | |
echo "vendor:$thevendorid ($thevendorcode) product:$theproductid ID:${thevendorcode}$(printf "%04X" $theproductid)/$(printf "$theedid" | md5 | sed -E 's/(.{12}).*/\1/' | tr 'abcdef' 'ABCDEF')" | |
echo "override product name:$theproductfile" | |
echo "override date name:$themanufacturefile" | |
echo "strings:$(echo -n "$theedid" | xxd -p -r | strings - | tr -s '\n\t ' ' ' | sed '/ *$/s///' )" | |
echo "theedid=$theedid" | |
echo "sources:" | |
echo "${paths[i+arrstart-1]}" | |
echo | |
done | |
useedidstring "$saveedid" | |
} | |
#========================================================================================= | |
# Files from EDID | |
edidbin () { | |
echo -n "$theedid" | xxd -p -r | |
} | |
edidbinall () { | |
local saveedid="$theedid" | |
local thefolderpath="$1" | |
local i="" | |
for ((i = 1 ; i <= ${#edids[@]} ; i++)); do | |
useedidnum "$i" | |
edidbin > "${thefolderpath:=.}/${thefilenamebase}.bin" | |
done | |
useedidstring "$saveedid" | |
} | |
decode () { | |
local tmpfilename="" | |
tmpfilename=$(mktemp /tmp/edidbin.XXXXXX) || exit 1 | |
edidbin > "$tmpfilename" | |
"$edid_decode" -cC --skip-sha "$tmpfilename" 2>&1 | |
} | |
decodeall () { | |
local dostdout=0 | |
local thefolderpath="." | |
while (( $# )); do | |
case "$1" in | |
"-s") dostdout=1 ;; | |
*) thefolderpath="$1" ;; | |
esac | |
shift | |
done | |
local saveedid="$theedid" | |
local i="" | |
for ((i = 1 ; i <= ${#edids[@]} ; i++)); do | |
useedidnum "$i" | |
if ((dostdout)); then | |
echo "==========================================================================================" | |
echo "$i)" | |
echo "${paths[i+arrstart-1]}" | |
echo "==================" | |
decode | |
else | |
decode > "${thefolderpath:=.}/${thefilenamebase}_edid-decode.txt" | |
fi | |
done | |
useedidstring "$saveedid" | |
} | |
agdcdevicedump () { | |
# Indent the Device Dump section of a AGDCDiagnose file. | |
# Note that some DICT sizes seem to be greater than the number of lines included in the dump. | |
local thefilename="$1" | |
perl -e ' | |
sub dict { | |
my $indent = $_[0]; | |
my $lines = $_[1]; | |
while ($lines-- != 0) { | |
my $theline = ""; | |
do { | |
$theline = <>; | |
} until ($theline !~ /^$/); | |
die if ($theline =~ /\-\-END Device Dump\-\-/); | |
print $indent.$theline; | |
dict($indent."\t", $1) if ($theline =~ /^.*[\t ]DICT[\t ]+(\d+)\n$/); | |
} | |
} | |
while (<>) { if ( /\-\-BEGIN Device Dump\-\-/ ) { print "----------------\n"; eval { dict("", -1); } } } | |
' < "$thefilename" | |
} | |
updateoverride () { | |
local thefilename="$1" | |
plutil -replace IODisplayEDID -data "$(echo -n "$theedid" | xxd -p -r | base64)" "${thefilename}" | |
plutil -replace DisplayProductID -integer $((0x${theedid:22:2}${theedid:20:2})) "${thefilename}" | |
plutil -replace DisplayVendorID -integer $((0x${theedid:16:4})) "${thefilename}" | |
} | |
makeoverride () { | |
local noedid=0 | |
if [[ $1 == '-noedid' ]]; then | |
noedid=1 | |
shift | |
fi | |
local thefilename="${theproductfile}" | |
if [[ $1 == '-m' ]]; then | |
thefilename="$themanufacturefile" | |
shift | |
fi | |
if [[ -z $1 ]]; then | |
[[ -d "${thevendordir}" ]] || mkdir "${thevendordir}" | |
else | |
thefilename="$1" | |
fi | |
[[ -f "${thefilename}" ]] && rm "${thefilename}" | |
/usr/libexec/PlistBuddy \ | |
-c "Add :DisplayProductID integer ${theproductid}" \ | |
-c "Add :DisplayVendorID integer ${thevendorid}" \ | |
-c 'Add :IODisplayEDID data ""' \ | |
-c 'Add :DisplayPixelDimensions data ""' \ | |
"${thefilename}" > /dev/null | |
plutil -replace 'IODisplayEDID' -data "$(echo -n "$theedid" | xxd -p -r | base64)" "${thefilename}" | |
# the hex is big endian | |
plutil -replace 'DisplayPixelDimensions' -data "$(printf "%08x%08x" $maxresH $maxresV | xxd -p -r | base64)" "${thefilename}" | |
if (( noedid )); then | |
plutil -remove 'IODisplayEDID' "${thefilename}" | |
fi | |
# // IOGraphicsLibInternal.h flags for IOGFlags in override file | |
# enum { | |
# // disable any use of scaled modes, | |
# kOvrFlagDisableScaling = 0x00000001, | |
# // remove driver modes, | |
# kOvrFlagDisableNonScaled = 0x00000002, | |
# // disable scaled modes made up by the system (just use the override list) | |
# kOvrFlagDisableGenerated = 0x00000004 | |
# }; | |
} | |
installoverride () { | |
local thedir="/System" | |
local dstfile="$theproductfile" | |
local thefilename="" | |
while (( $# )); do | |
if [[ $1 == '-l' ]]; then | |
thedir="" | |
elif [[ $1 == '-m' ]]; then | |
dstfile="$themanufacturefile" | |
else | |
thefilename="$1" | |
fi | |
shift | |
done | |
[[ -z $thefilename ]] && thefilename="${dstfile}" | |
echo "# source file: ${thefilename}" | |
mount | grep ' on / ' | grep -q 'read-only' && sudo mount -uw / | |
local fulldir="$thedir/Library/Displays/Contents/Resources/Overrides" | |
[[ -d "${fulldir}/${thevendordir}" ]] || sudo mkdir -p "${fulldir}/${thevendordir}" | |
sudo cp "${thefilename}" "${fulldir}/${dstfile}" | |
echo "# Installed file: ${fulldir}/${dstfile}" | |
if [[ "$(basename "${dstfile}")" =~ DisplayProductID-.* ]]; then | |
[[ -f ${fulldir}/$themanufacturefile ]] && echo "# Warning: alternative override exists at ${fulldir}/$themanufacturefile" | |
else | |
[[ -f ${fulldir}/$theproductfile ]] && echo "# Warning: alternative override exists at ${fulldir}/$theproductfile" | |
fi | |
} | |
makemtdd () { | |
local donew=0 | |
local thefilename="" | |
while (( $# )); do | |
case "$1" in | |
"-n") donew=1 ;; | |
*) thefilename="$1" ;; | |
esac | |
shift | |
done | |
if [[ -z ${thefilename} ]]; then | |
[[ -d "${thevendordir}" ]] || mkdir "${thevendordir}" | |
thefilename="${theproductfile}.mtdd" | |
fi | |
[[ -f "${thefilename}" ]] && rm "${thefilename}" | |
/usr/libexec/PlistBuddy \ | |
-c 'Add display dict' \ | |
-c 'Add :display:linkmode string multi-cable' \ | |
-c 'Add :display:overlay data ""' \ | |
-c "Add :display:streamcount integer $((tileCountH * tileCountV))" \ | |
-c "Add :display:tileinfo string ($tileCountH,$tileCountV)" \ | |
-c "Add :productid string $(printf "0x%04x" $theproductid)" \ | |
-c "Add :serial integer 1" \ | |
-c "Add :vendorid string $(printf "0x%04x" $thevendorid)" \ | |
-c "Add :version string 1.3" \ | |
"${thefilename}" > /dev/null | |
if (( donew )); then | |
plutil -insert 'display.backendtiming' -xml "<array>$(echo "$tileTimings" | perl -pe's/^[0-9]+ ([0-9]+)x([0-9]+)@([0-9.]+)Hz [0-9.]+kHz ([0-9]+)\.([0-9]+)MHz h\(([0-9]+) ([0-9]+) ([0-9]+) ([-+])\) v\(([0-9]+) ([0-9]+) ([0-9]+) ([-+])\).*/"<string>$1,$6,$7,".($1+$6+$7+$8)."x$2,$10,$11,".($2+$10+$11+$12)."\@$4${5}0000,$9$13<\/string>"/e')<string>*</string></array>" "${thefilename}" | |
plutil -insert 'display.frontendtiming' -xml "<array>$(echo "$tileTimings" | perl -pe's/^[0-9]+ ([0-9]+)x([0-9]+)@([0-9.]+)Hz [0-9.]+kHz ([0-9]+)\.([0-9]+)MHz h\(([0-9]+) ([0-9]+) ([0-9]+) ([-+])\) v\(([0-9]+) ([0-9]+) ([0-9]+) ([-+])\).*/"<string>".($1*2).",".($6*2).",".($7*2).",".($1+$6+$7+$8)."x$2,$10,$11,".($2+$10+$11+$12)."\@".("$4${5}0000" * 2).",$9$13<\/string>"/e')</array>" "${thefilename}" | |
else | |
plutil -insert 'display.backendtiming' -string "${tileSizeH}x${tileSizeV}@${tileRefresh}" "${thefilename}" | |
plutil -insert 'display.frontendtiming' -string "$((tileSizeH * 2))x${tileSizeV}@${tileRefresh}" "${thefilename}" | |
fi | |
plutil -replace 'display.overlay' -data "$(echo -n "$theedid" | xxd -p -r | base64)" "${thefilename}" | |
if (( HasAudio )); then | |
plutil -insert 'display.audio' -string '(1,1)' "${thefilename}" | |
fi | |
echo "# Created mtdd file: ${thefilename}" | |
} | |
makepatch () { | |
local thefilename="$1" | |
if [[ -z ${thefilename} ]]; then | |
[[ -d "${thevendordir}" ]] || mkdir "${thevendordir}" | |
thefilename="${theproductfile}" | |
fi | |
[[ -f "${thefilename}" ]] && rm "${thefilename}" | |
/usr/libexec/PlistBuddy \ | |
-c "Add :DisplayProductID integer ${theproductid}" \ | |
-c "Add :DisplayVendorID integer ${thevendorid}" \ | |
-c 'Add edid-patches array' \ | |
"${thefilename}" > /dev/null | |
local i="" | |
for ((i = 0 ; i < ${#patches[@]} ; i++)); do | |
local thepatch="${patches[i+arrstart]}" | |
local offset=$((${thepatch%:*})) | |
local data=${thepatch#*:} | |
plutil -insert "edid-patches.$i" -xml "<dict> | |
<key>offset</key> | |
<integer>$offset</integer> | |
<key>data</key> | |
<data>$(echo -n "$data" | xxd -p -r | base64)</data> | |
</dict>" "${thefilename}" | |
done | |
echo "# Created patch file: ${thefilename}" | |
} | |
makemtddall () { | |
local saveedid="$theedid" | |
local thefolderpath="$1" | |
local i="" | |
for ((i = 1 ; i <= ${#edids[@]} ; i++)); do | |
useedidnum "$i" | |
[[ -d "${thefolderpath:=.}/${thevendordir}" ]] || mkdir "${thefolderpath}/${thevendordir}" | |
makemtdd "${thefolderpath}/$theproductfile".mtdd | |
done | |
useedidstring "$saveedid" | |
} | |
translateoui () { | |
local oui=$1 | |
if [[ $oui =~ ([0-9]+)-([0-9]+)-([0-9]+) ]]; then | |
oui="$(eval "$(echo -n "$oui" | sed -E '/([0-9]+)-([0-9]+)-([0-9]+)/s//printf "%02X%02X%02X" \1 \2 \3/')")" | |
else | |
oui=${oui//-/} | |
oui=${oui//0x/} | |
oui=$(printf "%06X" $((0x$oui))) | |
fi | |
local thetype="" | |
for thetype in oui cid; do | |
[[ -f ~/${thetype}.txt ]] || curl -s "http://standards-oui.ieee.org/${thetype}/${thetype}.txt" > ~/${thetype}.txt | |
local thetranslate="" | |
thetranslate="$(sed -nE '/^'"$oui"'[ ]+\(base 16\)*(.*)/s//\1/p' ~/${thetype}.txt | tr -d '\t\r')" | |
[[ -n $thetranslate ]] && echo "$thetype: 0x$oui = $thetranslate" | |
done | |
} | |
translatevendor () { | |
local thevendorid=$1 | |
local vendorascii="" | |
local pnppattern="^[A-Za-z]{3}$" | |
if [[ $thevendorid =~ $pnppattern ]]; then | |
thevendorid=$(printf "%s" "$thevendorid" | xxd -p) | |
thevendorid=$(( (0x${thevendorid:0:2} & 31) << 10 + (0x${thevendorid:2:2} & 31) << 5 + (0x${thevendorid:4:2} & 31) )) | |
else | |
thevendorid=$((thevendorid)) | |
fi | |
vendorascii=$(printf "%06x" $((((thevendorid&0x7c00)<<6)+((thevendorid&0x3e0)<<3)+(thevendorid&0x1f)+0x404040)) | xxd -p -r) | |
if [[ ! -f ~/pnp_id_list.txt ]]; then | |
curl -s "https://uefi.org/uefi-pnp-export" | \ | |
tidy -wrap 0 -raw -utf8 -q | \ | |
perl -0777 -nE ' | |
s!(?: )*(</td>)!\1!g; | |
s!&!&!g; | |
while ( | |
m! | |
^<tr\ class=\"(?:odd|even)">\n | |
<td>(.*)</td>\n | |
<td>(...)</td>\n | |
<td>(../../....)</td>\n | |
</tr> | |
!xmg | |
) { | |
print $3 . " " . $2 . " " . $1 . "\n" | |
} | |
' | \ | |
sort -f -k 3 -k 2 -k 1 > ~/pnp_id_list.txt | |
fi | |
printf "0x%04x = %s = %s\n" $thevendorid "$vendorascii" "$(sed -nE '/[0-9/]+ '"$vendorascii"' (.*)/s//\1/p' ~/pnp_id_list.txt)" | |
# $(sed -nE '/^'$oui'[ ]+\(base 16\)*(.*)/s//\1/p' ~/oui.txt | tr -d '\t\r') | |
} | |
#========================================================================================= | |
edidhelp () { | |
cat << edidhelp_done | |
Commands: | |
Get EDID | |
loadagdc [dstfilepath] | |
loadioreg | |
loadstring hexstring [sourcename] | |
loadcurrentedid [sourcename] | |
loadbinfile filepath... | |
loadhexfile filepath... # reverses xxd | |
loadagdcfile filepath... | |
loadioregfile filepath... | |
loadoverridefile filepath... | |
loadmtddfile filepath... | |
loadswitchresxfile filepath... | |
loadmamfile filepath... # Monitor Asset Manager.txt | |
loadmamhexfile filepath... # Monitor Asset Manager.hex | |
loadmaminffile filepath... # Monitor Asset Manager.inf | |
loadmamdatfile filepath... # Monitor Asset Manager.dat | |
listedids | |
clearedids | |
Use EDID | |
useedidnum numberfromlist | |
useedidstring lowercasehexstring | |
Modify EDID | |
repairchecksums | |
replacebytes bytepos lowercasehexstring [numbytestoreplace] | |
deleteextensionblock blocknumber | |
deleteextensionblocktype blocktype(decimal or 0xhex) | |
adddisplayidextensionblock version producttype | |
addctaextensionblock version [YCbCrSupportbyte offset] | |
addchromasubsampling | |
removechromasubsampling | |
set8bpcmax | |
cleardate | |
clearserialnumber | |
setpreferredisnative preferredvalue(0/1) | |
clearchromaticity | |
clearestablishedtimings | |
clearmanufacturerstimings | |
clearstandardtimings | |
deletectablock offset | |
deletectablocktype ctablocktype(1, 2, ..., 6, 700, 701, ..., 70f, 710, ..., hex for extended) | |
addctablock offset newctablock... # -1 = insert before first CTA block; 0 = insert after last CTA block | |
deletedescriptor offset | |
addctadescriptor offset newctadescriptor... # -1 = insert before first CTA block; 0 = insert after last CTA block | |
createdetailedtiming MHz hactive hfront hpulse hback vactive[i=interlaced] vfront vpulse vback hsync(+/-) vsync(+/-) [hmm] [vmm] [hborder] [vborder] | |
createdummydescriptor | |
createemptydescriptor | |
replacedescriptor offset replacementdescriptor | |
createtype1timingdescriptor MHz hactive hfront hpulse hback vactive[i=interlaced] vfront vpulse vback hsync(+/-) vsync(+/-) [preferred(1/0)] | |
createtype1timingblock descriptors... | |
dumptype1timingdescriptor 20_byte_descriptor | |
deletedisplayidblock offset | |
deletedisplayidblocktype displayidblocktype(decimal or 0xhex) | |
adddisplayidblock offset newdisplayidblock... # -1 = insert before first DisplayID block; 0 = insert after last DisplayID block | |
applypatches filepath [sourcename] | |
Files from EDID | |
makemtdd [-n] [filepath] | |
The edid needs to be manually edited. | |
clearserialnumber | |
cleardate | |
#clearchromaticity | |
#clearestablishedtimings | |
#clearstandardtimings | |
#clearmanufacturerstimings | |
#removechromasubsampling | |
deletedisplayidblocktype 3 # remove type 1 DisplayID timings | |
deletedisplayidblocktype 0x12 # remove tile topology | |
# Add the deleted type 1 DisplayID timings, except replace the tile timing (backend timing) with a full size timing (frontend timing). | |
# Frontend timing in this example doubles the MHz and horizontal numbers of the backend timing. | |
adddisplayidblock 0 \$(createtype1timingblock 9aa00104ff0ea0002f8021006f083e0003000500 \$(createtype1timingdescriptor 1264.02 3840 96 64 20 2160 2 4 20 + - 1 )) | |
makepatch [filepath] | |
Creates an override file with edid-patches array from shell array variable called patches. e.g. patches=("94:0818900a" "304:7f00080000000000000000") | |
makemtddall [folderpath] | |
makeoverride [-noedid] [-m | dstfilepath] | |
updateoverride filepath | |
installoverride [-l] [-m] [srcfilepath] | |
decode | |
decodeall [-s | folderpath] | |
edidbin | |
edidbinall [folderpath] | |
dumpedid | |
dumpedidall [-s | folderpath] | |
agdcdevicedump filepath | |
Miscellaneous functions | |
translateoui oui # AGDCDiagnose DisplayPort registers and EDIDs may have an oui. | |
translatevendor pnp # a 15 bit value or a 3 character ASCII code. | |
Variables | |
dodump # Set to 1 to dump the EDID while changes are made to the EDID. | |
debug # Set to 1 to output debugging info (uses stderr) | |
DisplayIDblocks # An array of DisplayID blocks that are used in the EDID. Save these using something like saveDisplayIDblocks=(\$DisplayIDblocks) before modifying the EDID. | |
ctablocks # An array of CTA data blocks that are used in the EDID. Save these using something like savectablocks=(\$ctablocks) before modifying the EDID. | |
ctadescriptors # An array of CTA descriptors that are used in the EDID. Save these using something like savectadescriptors=(\$ctadescriptors) before modifying the EDID. | |
thetimings # a list of detailed timings (printf "%s\\n" "\${thetimings[@]}") | |
theproductfile # the name of an override file in the form of DisplayVendorID-%x/DisplayProductID-%x | |
themanufacturefile # the name of an override file in the form of DisplayVendorID-%x/DisplayYearManufacture-%d-DisplayWeekManufacture-%d | |
... | |
Help | |
edidhelp | |
edidhelp_done | |
} | |
#edidhelp | |
#========================================================================================= |
If your output looks like these:
https://gist.github.com/joevt/32e5efffe3459958759fb702579b9529#gistcomment-3250289
https://gist.github.com/joevt/32e5efffe3459958759fb702579b9529#gistcomment-3110065
Then it means you have an old AMD GPU that doesn't support properly a width greater than 4096.
Read here: https://forums.macrumors.com/threads/intel-graphics-and-5120x1440-testing-in-big-sur.2244174/
If the 5120 width works in Boot Camp or Linux, then you should send feedback to Apple to request that it be fixed.
Thanks for the investigation! It seems I pulled the shortest straw on this one.
Could anyone give me a hand figuring out what's going wrong, I've got an Asus XG27UQ which can run 4k 144hz & a Macbook Pro 15" 2018 with an AMD 555X but I've never been able to see anything higher than 1440p in the list of resolutions. I've tried many different cables but it's all been the same, currently using a USB C to Displayport cable.
Here's my dumpedid
output: https://pastebin.com/qejBvQqH
& AGDCDiagnose -a
output: https://pastebin.com/HuS663ir
What HDMI adapter are you using? Is it the Club-3d CAC-1085 (OUI:000-224-076 Dp1.2? [068-112-049-046-050-000] HW Version: 0 FW Version: 0.0
)? It appears to have an old firmware. You can ask for a newer firmware by emailing club-3d support. You'll need Windows to apply the firmware update.
The adapter is only connecting with one lane of HBR3 ([1 x HBR3 70 0]
). It should be connecting with four lanes of HBR3. Maybe there's something wrong with the adapter or the port that it's connected to. Try all of the other ports.
You're not using a dock with the adapter? USB-C docks that support USB 3.x will limit the lanes to two. A Thunderbolt dock should be ok.
Asus XG27UQ supports HDMI 2.0 up to 120 Hz. You should be using DisplayPort connection for 144Hz.
Are you using an override? You should try without using an override to start with.
Sorry if it's confused things, I do have a separate adapter (cable matters) which I use for a 2nd external monitor (However, I unplugged it when I ran AGDCDiagnose so thought it wouldn't show in the output). So to clarify, I use the Cable Matters adapter to HDMI/DVI into an old 1440p monitor, which works fine.
But the monitor in question when I ran the diagnose is connected via a direct USB C to Displayport cable. Which is the only thing I had plugged in when I ran AGDCDiangose. AFAIK I thought this was what was plugged into Port 1 (or does that denote the internal monitor?)
Just to clarify I had the USB C -> Displayport cable plugged into the left side of the laptop & my Cable matters adapter into the right side (I'm guessing port 4).
If that's correct, then I reckon Port 2 would've been my USB C -> Displayport cable. If that's the case, I'm confused as to why it's coming up as a Club-3d adapter. Could this be something with the cable or internal to the monitor?
What I'm seeing is a Realtek device similar to the one used inside a Club-3d CAC-1085 as listed at https://forums.macrumors.com/threads/thunderbolt-hub-with-ethernet-for-big-data-transfers-recommendation.2278473/post-29466205
It could be internal to the monitor.
Redo the AGDCDiagnose for each port of the MacBook Pro. Also for each DisplayPort port of the display.
You can zip all the files into a single zip file.
We need to find a combination that can properly do HBR3 x4.
Did the USB-C to DisplayPort cable come with the display? Maybe it's a bad cable.
Which Cable Matters adapter is it? I wonder if the DPCD registers have stale information from when it was connected? That would be extremely weird. This might be a new feature/bug of Big Sur where it's not rereading display stuff when a display is disconnected and reconnected. Switching ports should fix that.
Ok, just to clarify & rule it out, I plugged in my Cable Matters adapter & ran diagnose again & I can see it as a separate device:
* 1: [DP 1.1 4 x HBR ] Status: [4 x 3_24 7777] caps [features 0x103001f, p_encoding 0xd] Sink OUI:000-016-250 eD?gba [101-068-021-103-098-097] HW Version: 1 FW Version: 8.4
* 2: [DP 1.2 4 x HBR2] Status: [1 x HBR3 70 0] caps [features 0x101001b, p_encoding 0xd] Sink OUI:000-224-076 Dp1.2? [068-112-049-046-050-000] HW Version: 0 FW Version: 0.0
3:
* 4: [DP 1.2 2 x HBR2] Status: [2 x HBR2 77 0] caps [features 0x101001b, p_encoding 0xd] DVI/HDMI Branch OUI:000-028-248 176GB0 [049-055-054-071-066-048] HW Version: 16 FW Version: 7.85
5:
So we can rule out the cable matters adapter (it's model 201048 FYI), what you're looking at is definitely the USB C -> Displayport cable, this is the cable I'm using (https://www.amazon.co.uk/DisplayPort-Maxonar-Thunderbolt-Adapter-Certified-2M-Grey/dp/B08B3SB5VC). When I first got the monitor in January I went through a phase of buying different cables on Amazon & went through about 5 and returned them as I was having the same problems regardless of the cable.
I'm not sure if it's important, but when plugging in the cable or turning on the laptop & monitor, sometimes it completely fails to work & I get a no signal. Some days I have to unplug & plug it back in a few times before it picks up a signal again.
Your Cable Matters is running on 2 lanes instead of 4. Are all your Thunderbolt ports broken? Need AGDCDiagnose from all Thunderbolt ports to see if any of them are working.
Consider getting a Club-3d or Cable Matters USB-C to DisplayPort 1.4 adapter.
https://www.amazon.com/dp/B07F17ZHJY
https://www.amazon.com/dp/B082XC4KM8
Then connect a normal DisplayPort cable to that.
Have you got any working Thunderbolt devices? Do they connect at 40 Gbps x1? If you can't get proper DisplayPort from the Mac, then maybe you can get it from a Thunderbolt device. Problem is, if one lane is broken, then you may be limited to 20 Gbps which is not enough for HBR3 but at least you can get four lanes of HBR2.
Haha funny enough I just saw on Amazon I'd already bought that adapter, just managed to dig it out the drawer (I'd tried this before). So I've got the cable matters USB C to Displayport 1.4 adapter going to a 8k DP 1.4 cable. Exactly the same thing, I've also just ran the diagnose & attached the results
AGDCDiagnose results
AGDCDiagnose Version: 6.3.5 (AGDC node count: 6)
### Start: GPUWrangler #######################################################
Stats: GPUCAdded:1 GpuAdded:2 Eject:0/f0/fd0/c0 Remove:0/t0 Un:0
gpu 0x56ce flags 0xb2000010 (IG,published,quiet,pubSched,pubArmed) vid.did=8086.3e9b b:d:f=0:2:0
gpu 0x56ce pci 0x100000377 IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2
gpu 0x56ce agdc 0x1000007fb /AppleIntelFramebufferController/IntelFBClientControl
gpu 0x56ce gpuc 0x000000000
gpu 0x56ce agdpclient 0x000000000
gpu 0x56ce accel 0x1000007c2 /IntelAccelerator
gpu 0x56ce fb0:0 0x1000007ca /AppleIntelFramebuffer@0
gpu 0x9f3b flags 0xbe000020 (DG,published,driversStarted,hasGPUC,quiet,pubSched,pubArmed) vid.did=1002.67ef b:d:f=1:0:0
gpu 0x9f3b pci 0x100000290 IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1/IOPP/GFX0@0
gpu 0x9f3b agdc 0x100000827 /AtiDeviceControl
gpu 0x9f3b gpuc 0x1000007be /AMD9500ControllerWrangler
gpu 0x9f3b agdpclient 0x100000829 /AtiDeviceControl/AppleGraphicsDevicePolicy/AGDPClientControl
gpu 0x9f3b accel 0x1000007f7 /AMDRadeonX4000_AMDBaffinGraphicsAccelerator
gpu 0x9f3b fb0:0 0x100000809 /ATY,Palena@0/AMDFramebufferVIB
gpu 0x9f3b fb1:1 0x10000080f /ATY,Palena@1/AMDFramebufferVIB
gpu 0x9f3b fb2:2 0x100000815 /ATY,Palena@2/AMDFramebufferVIB
gpu 0x9f3b fb3:3 0x10000081b /ATY,Palena@3/AMDFramebufferVIB
gpu 0x9f3b fb4:4 0x100000821 /ATY,Palena@4/AMDFramebufferVIB
### End: GPUWrangler (took 0.009 sec) ########################################
### Start: EFIDisplayInfo ####################################################
Dumping EFI data for GPU Path IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2
Dumping EFI data for GPU Path IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1/IOPP/GFX0@0
GraphicsDisplaySetup:
Version 65536
ConnectorNumber 1
AvailableLanes 4
AvailableBitRate 3240
DisplayRestoredFromNVRAM 0
HibernateWake 0
DP Configuration
Version: 65537
Mode: 0
BitRate: 4294901760
Lanes: 4
CommonVoltage: 0
CommonPreEmphasis: 0
CommonPostCursor2: 0
EnhancedFraming: 1
Scrambling: 1
AlternateScramblerSeedReset: 1
OtherBitRateInMegaBitsPerSecond: 3240
Framebuffer Timing
TimingIndex: 0
Encoding: 1
BitDepth: 3
PixelClock: 328920000
HActive: 2880
VActive: 1800
HBlank: 80
HBorderLeft: 0
HBorderRight: 0
VBlank: 52
VBorderTop: 0
VBorderBottom: 0
HSyncStart: 8
HSyncWidth: 32
HSyncPositive: 1
VSyncStart: 38
VSyncWidth: 8
VSyncPositive: 0
Interlace: 0
Framebuffer resolution
Version: 65536
Width: 3360
Height: 2100
Stride: 0
Format: 1
Rotation: 0
Reverse: 0
### End: EFIDisplayInfo (took 0.006 sec) #####################################
### Start: Mux ###############################################################
System is in Dynamic mode: Better Battery Mode set, using Discrete
gMUX Status: Version: 5.0.0, 3D:2, FB:6
LVDS: EG [DDC: None], DP: IG [Disabled] [0, 0]
IG: FB0:off FB1:N/A FB2:N/A FB3:N/A FB4:N/A 3D:idle HDA:N/A Power:on
EG: FB0:on FB1:on FB2:off FB3:on FB4:off 3D:idle HDA:busy Power:on
Policy:on GPUPowerDown:on Backlight Control:on Recovery:on
Power State Machine IG: 0 EG: 0
StateMachine: 0 [AGC_GPU_IDLE]
Switch Statistics: Switches 10 Errors 0 CRC 00000000
0000: 0000246 ms 0016: 0000000 ms
0001: 0001252 ms 0017: 0000000 ms
0002: 0000380 ms 0018: 0000000 ms
0003: 0003811 ms 0019: 0000000 ms
0004: 0000445 ms 0020: 0000000 ms
0005: 0002361 ms 0021: 0000000 ms
0006: 0000411 ms 0022: 0000000 ms
0007: 0002644 ms 0023: 0000000 ms
0008: 0000291 ms 0024: 0000000 ms
0009: 0001210 ms* 0025: 0000000 ms
0010: 0000000 ms 0026: 0000000 ms
0011: 0000000 ms 0027: 0000000 ms
0012: 0000000 ms 0028: 0000000 ms
0013: 0000000 ms 0029: 0000000 ms
0014: 0000000 ms 0030: 0000000 ms
0015: 0000000 ms 0031: 0000000 ms
Register Dump:
00: 00 00 00 00 00 00 00 00
08: 00 00 03 00 00 00 00 00
10: 05 03 00 00 ff 00 00 00
18: 00 00 00 00 00 00 00 00
20: 00 e6 00 00 00 00 00 00
28: 00 00 00 00 00 00 00 00
30: 7f 00 ff 00 61 61 ff 00
38: ff ff 00 00 00 00 01 03
40: 01 10 00 00 00 00 00 00
48: 00 00 00 00 00 00 00 00
50: 03 7f 1f 00 00 00 00 00
58: 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00
68: 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00
78: 00 00 00 00 00 00 00 00
### End: Mux (took 0.160 sec) ################################################
### Start: Ports #############################################################
### Start: AGDC[1] 0x1000007b1 ###############################################
IOService:/IOResources/AppleGPUWrangler
Vendor: Apple [0000106b]: AppleGPUWrangler [8 10000] (0)
### End: AGDC[1] 0x1000007b1 (took 0.001 sec) ################################
### Start: AGDC[2] 0x100000784 ###############################################
IOService:/AppleACPIPlatformExpert/GPUC/AppleMuxControl/AGDCMuxClientControl
Vendor: AppleMuxControl [0000106b]: AppleMuxControl [9 10000] (0)
### End: AGDC[2] 0x100000784 (took 0.002 sec) ################################
### Start: AGDC[3] 0x1000007be ###############################################
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1/IOPP/GFX0@0/AMD9500ControllerWrangler
Vendor: AMD [00001002]: GPURoot [7 30000] (0)
### End: AGDC[3] 0x1000007be (took 0.002 sec) ################################
### Start: AGDC[4] 0x1000007fb ###############################################
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebufferController/IntelFBClientControl
Vendor: AppleIntelFramebufferController [0000106b]: IntegratedGPU [1 10000] (0)
FBs: 1, Ports: 0x2 mst:0 ddc:0 aux:0x2, Streams: dp:0 dvi:0 mst:2 max:3
Framebuffers:
* 0: Address: 1.0 Stream: Not Associated Group: 0 Online Fixed
Port Capabilities:
* 1: AUX
Connections:
* 1:
## EDID Dump Port 1 - Start ##
// EDID Dump: device, 0 bytes, Invalid
uint8_t EDID_@@@_0_0[] = {
};
## EDID Dump Port 1 - End ##
### End: AGDC[4] 0x1000007fb (took 0.127 sec) ################################
### Start: AGDC[5] 0x100000827 ###############################################
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1/IOPP/GFX0@0/AtiDeviceControl
See 0x100000829
### End: AGDC[5] 0x100000827 (took 0.003 sec) ################################
### Start: AGDC[6] 0x100000829 ###############################################
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1/IOPP/GFX0@0/AtiDeviceControl/AppleGraphicsDevicePolicy/AGDPClientControl
Vendor: AMD [00001002]: DiscreteGPU [2 30000] (0)
FBs: 5, Ports: 0x3e mst:0x3c ddc:0x3e aux:0x3e, Streams: dp:6 dvi:7 mst:6 max:6
Framebuffers:
* 0: Address: 1.0 Stream: Enabled Group: -1 Online Assoc'd MayGroup Fixed
* 1: Address: 2.0 Stream: Enabled Group: -1 Online Assoc'd MayGroup
2: Address: 2.0 Stream: Enabled Group: -1 Assoc'd MayGroup
* 3: Address: 4.0 Stream: Enabled Group: -1 Online Assoc'd MayGroup
4: Address: 5.0 Stream: Enabled Group: -1 Assoc'd MayGroup
Port Capabilities:
* 1: AUX, DDC
* 2: AUX, DDC, MST
3: AUX, DDC, MST
* 4: AUX, DDC, MST
5: AUX, DDC, MST
Connections:
* 1: [DP 1.1 4 x HBR ] Status: [4 x 3_24 7777] caps [features 0x103001f, p_encoding 0xd] Sink OUI:000-016-250 eD?gba [101-068-021-103-098-097] HW Version: 1 FW Version: 8.4
* 2: [DP 1.2 4 x HBR2] Status: [1 x HBR3 70 0] caps [features 0x101001b, p_encoding 0xd] Sink OUI:000-224-076 Dp1.2? [068-112-049-046-050-000] HW Version: 0 FW Version: 0.0
3:
* 4: [DP 1.2 2 x HBR2] Status: [2 x HBR2 77 0] caps [features 0x101001b, p_encoding 0xd] DVI/HDMI Branch OUI:000-028-248 176GB0 [049-055-054-071-066-048] HW Version: 16 FW Version: 7.85
5:
## Register Dump Port 1 - Start ##
000000: 0x11 0x0a 0x84 0x41 0x00 0x00 0x01 0x80 0x02 0x00 0x00 0x00 0x0f 0x0b 0x00 0x00
Reg: 000000: 11 : DPCD_REV: 1.1
Reg: 000001: 0a : MAX_LINK_RATE: HBR
Reg: 000002: 84 : MAX_LANE_COUNT: 4, TPS3_SUPPORTED: 0, ENHANCED_FRAME_CAP: 1
Reg: 000003: 41 : MAX_DOWNSPREAD: 0.5% down, NO_AUX_HANDSHAKE_LINK_TRAINING: 1
Reg: 000004: 00 : NORP: 0
Reg: 000005: 00 : DOWNSTREAMPORT_PRESENT: DWN_STRM_PORT_PRESENT: 0, DWN_STRM_PORT_TYPE: [0] DisplayPort, FORMAT_CONVERSION: 0, DETAILED_CAP_INFO_AVAILABLE: 0
Reg: 000006: 01 : MAIN_LINK_CHANNEL_CODING: ANSI 8B/10B
Reg: 000007: 80 : DOWN_STREAM_PORT_COUNT: DWN_STRM_PORT_COUNT: 0, MSA_TIMING_PAR_IGNORED: 0, OUI: 1
Reg: 000008: 02 : RECEIVE_PORT0_CAP_0: LOCAL_EDID_PRESENT: 1, ASSOCIATED_TO_PRECEDING_PORT: 0
Reg: 000009: 00 : RECEIVE_PORT0_CAP_1: BUFFER_SIZE: 32
Reg: 00000a: 00 : RECEIVE_PORT1_CAP_0:
Reg: 00000b: 00 : RECEIVE_PORT1_CAP_1:
Reg: 00000c: 0f : I2C Speed: 1Kbps 5Kbps 10Kbps 100Kbps
Reg: 00000d: 0b : eDP_CONFIGURATION_CAP: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 1, FRAMING_CHANGE_CAPABLE: 1
Reg: 00000e: 00 : TRAINING_AUX_RD_INTERVAL: 100 us, EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT: NO
Reg: 00000f: 00 : ADAPTER_CAP: FORCE_LOAD_SENSE_CAP: 0, ALTERNATE_I2C_PATTERN_CAP: 0
000020: 0x00 0x00 0x00
Reg: 000020: 00 : FAUX_CAP: FAUX_CAP: 0
Reg: 000021: 00 : MSTM_CAP: MST_CAP: 0
Reg: 000022: 00 : NUMBER_OF_AUDIO_ENDPOINTS: 0
000060: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Reg: 000060: 00 : DSC Support: 0
Reg: 000061: 00 : DSC Algorithm revision: 0
Reg: 000062: 00 : DSC RC Buffer Block size: 0
Reg: 000063: 00 : DSC RC Buffer size: 0
Reg: 000064: 00 : DSC slice Capabilities 1 : 0
Reg: 000065: 00 : DSC Line buffer bit depth: 0
Reg: 000066: 00 : DSC Block prediction support: 0
Reg: 000067: 00 : DSC Maximum bit per pixel: 0
Reg: 000068: 00 : DSC Maximum bit per pixel: 0
Reg: 000069: 00 : DSC Decoder color format capabilities: 0
Reg: 00006a: 00 : DSC decoder color depth capabilities: 0
Reg: 00006b: 00 : DSC Peak Throughput: 0
Reg: 00006c: 00 : DSC Maximum Slice width: 0
Reg: 00006d: 00 : DSC Slice capabilities 2: 0
Reg: 00006e: 00 : Reserved: 0
Reg: 00006f: 00 : DSC Bits per pixel increment: 0
000090: 0x00
Reg: 000090: 00 : FEC Capability: 0x0
000080: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Reg: 000080: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000081: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000082: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000083: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000084: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000085: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000086: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000087: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000088: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000089: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008a: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008b: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008c: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008d: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008e: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008f: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
000100: 0x0c 0x84
Reg: 000100: 0c : LINK_BW_SET: 3_24
Reg: 000101: 84 : LANE_COUNT_SET: LANE_COUNT_SET 4, ENHANCED_FRAME_EN: 1
000107: 0x10
Reg: 000107: 10 : DOWNSPREAD_CTRL: SPREAD_AMP: 1, MSA_TIMING_PAR_IGNORE_EN: 0
00010a: 0x01
Reg: 00010a: 01 : eDP_CONFIGURATION_CAP_SET: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 1, FRAMING_CHANGE_CAPABLE: 0
000111: 0x00
Reg: 000111: 00 : MSTM_CTRL: UPSTREAM_IS_SRC:0 UP_REQ_EN:0 MST_EN:0
000120: 0x00
Reg: 000120: 00 : FEC Configuration: 0x0
000160: 0x00
Reg: 000160: 00 : DSC Enable: 0x0
000200: 0x01 0x00 0x77 0x77 0x01 0x01 0x00 0x00
Reg: 000200: 01 : SINK_COUNT: SINK_COUNT 1, CP_READY: 0
Reg: 000202: 77 : LANE0: CR_DONE: 1, CHANNEL_EQ_DONE: 1, SYMBOL_LOCKED: 1
Reg: 000202: 77 : LANE1: CR_DONE: 1, CHANNEL_EQ_DONE: 1, SYMBOL_LOCKED: 1
Reg: 000203: 77 : LANE2: CR_DONE: 1, CHANNEL_EQ_DONE: 1, SYMBOL_LOCKED: 1
Reg: 000203: 77 : LANE3: CR_DONE: 1, CHANNEL_EQ_DONE: 1, SYMBOL_LOCKED: 1
Reg: 000205: 01 : SINK_STATUS: RECEIVE_PORT_0_STATUS: 1, RECEIVE_PORT_1_STATUS: 0
Reg: 000206: 00 : LANE0: VOLTAGE_SWING: 0, PRE-EMPHASIS: 0
Reg: 000206: 00 : LANE1: VOLTAGE_SWING: 0, PRE-EMPHASIS: 0
Reg: 000207: 00 : LANE2: VOLTAGE_SWING: 0, PRE-EMPHASIS: 0
Reg: 000207: 00 : LANE3: VOLTAGE_SWING: 0, PRE-EMPHASIS: 0
00020f: 0x00
Reg: 00020f: 00 : DSC Status: 0
000280: 0x00
Reg: 000280: 00 : FEC Status: 0
00042f: 0x00
Reg: 00042f: 00 : DISPLAY_ROTATION: 0x0
002200: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Reg: 002200: 00 : DPCD_REV: 0.0
Reg: 002201: 00 : MAX_LINK_RATE: ???
Reg: 002202: 00 : MAX_LANE_COUNT: 0, TPS3_SUPPORTED: 0, ENHANCED_FRAME_CAP: 0
Reg: 002203: 00 : MAX_DOWNSPREAD: None, NO_AUX_HANDSHAKE_LINK_TRAINING: 0
Reg: 002204: 00 : NORP: 0
Reg: 002205: 00 : DOWNSTREAMPORT_PRESENT: DWN_STRM_PORT_PRESENT: 0, DWN_STRM_PORT_TYPE: [0] DisplayPort, FORMAT_CONVERSION: 0, DETAILED_CAP_INFO_AVAILABLE: 0
Reg: 002206: 00 : MAIN_LINK_CHANNEL_CODING_SET: ??
Reg: 002207: 00 : DOWN_STREAM_PORT_COUNT: DWN_STRM_PORT_COUNT: 0, MSA_TIMING_PAR_IGNORED: 0, OUI: 0
Reg: 002208: 00 : RECEIVE_PORT0_CAP_0: LOCAL_EDID_PRESENT: 0, ASSOCIATED_TO_PRECEDING_PORT: 0
Reg: 002209: 00 : RECEIVE_PORT0_CAP_1: BUFFER_SIZE: 32
Reg: 00220a: 00 : RECEIVE_PORT1_CAP_0:
Reg: 00220b: 00 : RECEIVE_PORT1_CAP_1:
Reg: 00220c: 00 : I2C Speed:
Reg: 00220d: 00 : eDP_CONFIGURATION_CAP_SET: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
Reg: 00220e: 00 : TRAINING_AUX_RD_INTERVAL: 100 us, EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT: NO
Reg: 00220f: 00 : ADAPTER_CAP: FORCE_LOAD_SENSE_CAP: 0, ALTERNATE_I2C_PATTERN_CAP: 0
068028: 0x00
Reg: 068028: 00 : HDCP_CAPABLE: 0, REPEATER: 0
06921d: 0x00 0x00 0x00
Reg: 06921d: 00 : VERSION: 0
Reg: 06921f: 00 : HDCP_CAPABLE: 0, REPEATER: 0
069330: 0x00 0x00
Reg: 069330: 00 : HDCP_Depth: 0
Reg: 069331: 00 : HDCP_count: 0 HDCP2_0 Downstream: 0 HDCP1 Downstream: 0
069493: 0x00
Reg: 069493: 00 : Ready: 0 , H' Available: 0, Pairing_available: 0 , Reauth_req: 0, Link Integrity: 0
## Register Dump Port 1 - End ##
## EDID Dump Port 1 - Start ##
// EDID Dump: device, 256 bytes, OK
uint8_t EDID_APP_610_a040[] = {
/* 000: */ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
/* 008: */ 0x06, 0x10, 0x40, 0xa0, 0x00, 0x00, 0x00, 0x00,
/* 010: */ 0x10, 0x1b, 0x01, 0x04, 0xb5, 0x21, 0x15, 0x78,
/* 018: */ 0x02, 0x0f, 0x61, 0xae, 0x52, 0x43, 0xb0, 0x26,
/* 020: */ 0x0d, 0x50, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01,
/* 028: */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
/* 030: */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x7c, 0x80,
/* 038: */ 0x40, 0x50, 0xb0, 0x08, 0x34, 0x70, 0x08, 0x20,
/* 040: */ 0x68, 0x08, 0x4b, 0xcf, 0x10, 0x00, 0x00, 0x1a,
/* 048: */ 0x00, 0x00, 0x00, 0xfc, 0x00, 0x43, 0x6f, 0x6c,
/* 050: */ 0x6f, 0x72, 0x20, 0x4c, 0x43, 0x44, 0x0a, 0x20,
/* 058: */ 0x20, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
/* 060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
/* 070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4,
/* 080: */ 0x70, 0x12, 0x79, 0x03, 0x00, 0x7f, 0x81, 0x3f,
/* 088: */ 0xfa, 0x10, 0x00, 0x03, 0x01, 0x18, 0x0f, 0x28,
/* 090: */ 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0a0: */ 0x4c, 0x50, 0x31, 0x35, 0x34, 0x57, 0x54, 0x35,
/* 0a8: */ 0x2d, 0x53, 0x4a, 0x41, 0x31, 0x0a, 0x20, 0x00,
/* 0b0: */ 0x44, 0x43, 0x4e, 0x38, 0x31, 0x37, 0x32, 0x30,
/* 0b8: */ 0x32, 0x31, 0x53, 0x4a, 0x34, 0x36, 0x54, 0x33,
/* 0c0: */ 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7f,
/* 0c8: */ 0x81, 0x29, 0xfa, 0x10, 0x00, 0x02, 0x01, 0x00,
/* 0d0: */ 0x11, 0x00, 0x00, 0x02, 0x90, 0x03, 0x65, 0x04,
/* 0d8: */ 0x89, 0x06, 0x18, 0x08, 0x38, 0x0b, 0x20, 0x0f,
/* 0e0: */ 0x19, 0x14, 0x8a, 0x1c, 0x00, 0x26, 0x3d, 0x34,
/* 0e8: */ 0x51, 0x47, 0xae, 0x62, 0x5a, 0x87, 0x21, 0xb9,
/* 0f0: */ 0xe3, 0xfd, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x90
};
## EDID Dump Port 1 - End ##
## Register Dump Port 2 - Start ##
000000: 0x12 0x14 0xc4 0x81 0x01 0x00 0x01 0xc0 0x02 0x00 0x06 0x00 0x00 0x00 0x84 0x00
Reg: 000000: 12 : DPCD_REV: 1.2
Reg: 000001: 14 : MAX_LINK_RATE: HBR2
Reg: 000002: c4 : MAX_LANE_COUNT: 4, TPS3_SUPPORTED: 1, ENHANCED_FRAME_CAP: 1
Reg: 000003: 81 : MAX_DOWNSPREAD: 0.5% down, NO_AUX_HANDSHAKE_LINK_TRAINING: 0
Reg: 000004: 01 : NORP: 1
Reg: 000005: 00 : DOWNSTREAMPORT_PRESENT: DWN_STRM_PORT_PRESENT: 0, DWN_STRM_PORT_TYPE: [0] DisplayPort, FORMAT_CONVERSION: 0, DETAILED_CAP_INFO_AVAILABLE: 0
Reg: 000006: 01 : MAIN_LINK_CHANNEL_CODING: ANSI 8B/10B
Reg: 000007: c0 : DOWN_STREAM_PORT_COUNT: DWN_STRM_PORT_COUNT: 0, MSA_TIMING_PAR_IGNORED: 1, OUI: 1
Reg: 000008: 02 : RECEIVE_PORT0_CAP_0: LOCAL_EDID_PRESENT: 1, ASSOCIATED_TO_PRECEDING_PORT: 0
Reg: 000009: 00 : RECEIVE_PORT0_CAP_1: BUFFER_SIZE: 32
Reg: 00000a: 06 : RECEIVE_PORT1_CAP_0:
Reg: 00000b: 00 : RECEIVE_PORT1_CAP_1:
Reg: 00000c: 00 : I2C Speed:
Reg: 00000d: 00 : eDP_CONFIGURATION_CAP: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
Reg: 00000e: 84 : TRAINING_AUX_RD_INTERVAL: 0 RESERVED, EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT: YES
Reg: 00000f: 00 : ADAPTER_CAP: FORCE_LOAD_SENSE_CAP: 0, ALTERNATE_I2C_PATTERN_CAP: 0
000020: 0x00 0x00 0x00
Reg: 000020: 00 : FAUX_CAP: FAUX_CAP: 0
Reg: 000021: 00 : MSTM_CAP: MST_CAP: 0
Reg: 000022: 00 : NUMBER_OF_AUDIO_ENDPOINTS: 0
000060: 0x01 0x21 0x00 0x02 0x2b 0x04 0x01 0x00 0x00 0x1f 0x0e 0x11 0x08 0x00 0x00 0x00
Reg: 000060: 01 : DSC Support: 1
Reg: 000061: 21 : DSC Algorithm revision: 33
Reg: 000062: 00 : DSC RC Buffer Block size: 0
Reg: 000063: 02 : DSC RC Buffer size: 2
Reg: 000064: 2b : DSC slice Capabilities 1 : 43
Reg: 000065: 04 : DSC Line buffer bit depth: 4
Reg: 000066: 01 : DSC Block prediction support: 1
Reg: 000067: 00 : DSC Maximum bit per pixel: 0
Reg: 000068: 00 : DSC Maximum bit per pixel: 0
Reg: 000069: 1f : DSC Decoder color format capabilities: 31
Reg: 00006a: 0e : DSC decoder color depth capabilities: 14
Reg: 00006b: 11 : DSC Peak Throughput: 17
Reg: 00006c: 08 : DSC Maximum Slice width: 8
Reg: 00006d: 00 : DSC Slice capabilities 2: 0
Reg: 00006e: 00 : Reserved: 0
Reg: 00006f: 00 : DSC Bits per pixel increment: 0
000090: 0xbf
Reg: 000090: bf : FEC Capability: 0xbf
000080: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Reg: 000080: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000081: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000082: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000083: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000084: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000085: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000086: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000087: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000088: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000089: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008a: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008b: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008c: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008d: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008e: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008f: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
000100: 0x1e 0x81
Reg: 000100: 1e : LINK_BW_SET: HBR3
Reg: 000101: 81 : LANE_COUNT_SET: LANE_COUNT_SET 1, ENHANCED_FRAME_EN: 1
000107: 0x10
Reg: 000107: 10 : DOWNSPREAD_CTRL: SPREAD_AMP: 1, MSA_TIMING_PAR_IGNORE_EN: 0
00010a: 0x00
Reg: 00010a: 00 : eDP_CONFIGURATION_CAP_SET: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
000111: 0x00
Reg: 000111: 00 : MSTM_CTRL: UPSTREAM_IS_SRC:0 UP_REQ_EN:0 MST_EN:0
000120: 0x00
Reg: 000120: 00 : FEC Configuration: 0x0
000160: 0x00
Reg: 000160: 00 : DSC Enable: 0x0
000200: 0x41 0x00 0x07 0x00 0x01 0x03 0x22 0x22
Reg: 000200: 41 : SINK_COUNT: SINK_COUNT 1, CP_READY: 1
Reg: 000202: 07 : LANE0: CR_DONE: 1, CHANNEL_EQ_DONE: 1, SYMBOL_LOCKED: 1
Reg: 000202: 07 : LANE1: CR_DONE: 0, CHANNEL_EQ_DONE: 0, SYMBOL_LOCKED: 0
Reg: 000203: 00 : LANE2: CR_DONE: 0, CHANNEL_EQ_DONE: 0, SYMBOL_LOCKED: 0
Reg: 000203: 00 : LANE3: CR_DONE: 0, CHANNEL_EQ_DONE: 0, SYMBOL_LOCKED: 0
Reg: 000205: 03 : SINK_STATUS: RECEIVE_PORT_0_STATUS: 1, RECEIVE_PORT_1_STATUS: 1
Reg: 000206: 22 : LANE0: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
Reg: 000206: 22 : LANE1: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
Reg: 000207: 22 : LANE2: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
Reg: 000207: 22 : LANE3: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
00020f: 0x00
Reg: 00020f: 00 : DSC Status: 0
000280: 0x00
Reg: 000280: 00 : FEC Status: 0
00042f: 0x00
Reg: 00042f: 00 : DISPLAY_ROTATION: 0x0
002200: 0x14 0x1e 0xc4 0x81 0x01 0x00 0x01 0xc0 0x02 0x00 0x06 0x00 0x00 0x00 0x84 0x00
Reg: 002200: 14 : DPCD_REV: 1.4
Reg: 002201: 1e : MAX_LINK_RATE: HBR3
Reg: 002202: c4 : MAX_LANE_COUNT: 4, TPS3_SUPPORTED: 1, ENHANCED_FRAME_CAP: 1
Reg: 002203: 81 : MAX_DOWNSPREAD: 0.5% down, NO_AUX_HANDSHAKE_LINK_TRAINING: 0
Reg: 002204: 01 : NORP: 1
Reg: 002205: 00 : DOWNSTREAMPORT_PRESENT: DWN_STRM_PORT_PRESENT: 0, DWN_STRM_PORT_TYPE: [0] DisplayPort, FORMAT_CONVERSION: 0, DETAILED_CAP_INFO_AVAILABLE: 0
Reg: 002206: 01 : MAIN_LINK_CHANNEL_CODING_SET: ANSI 8B/10B
Reg: 002207: c0 : DOWN_STREAM_PORT_COUNT: DWN_STRM_PORT_COUNT: 0, MSA_TIMING_PAR_IGNORED: 1, OUI: 1
Reg: 002208: 02 : RECEIVE_PORT0_CAP_0: LOCAL_EDID_PRESENT: 1, ASSOCIATED_TO_PRECEDING_PORT: 0
Reg: 002209: 00 : RECEIVE_PORT0_CAP_1: BUFFER_SIZE: 32
Reg: 00220a: 06 : RECEIVE_PORT1_CAP_0:
Reg: 00220b: 00 : RECEIVE_PORT1_CAP_1:
Reg: 00220c: 00 : I2C Speed:
Reg: 00220d: 00 : eDP_CONFIGURATION_CAP_SET: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
Reg: 00220e: 84 : TRAINING_AUX_RD_INTERVAL: 0 RESERVED, EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT: YES
Reg: 00220f: 00 : ADAPTER_CAP: FORCE_LOAD_SENSE_CAP: 0, ALTERNATE_I2C_PATTERN_CAP: 0
068028: 0x01
Reg: 068028: 01 : HDCP_CAPABLE: 1, REPEATER: 0
06921d: 0x02 0x00 0x02
Reg: 06921d: 02 : VERSION: 2
Reg: 06921f: 02 : HDCP_CAPABLE: 1, REPEATER: 0
069330: 0x00 0x00
Reg: 069330: 00 : HDCP_Depth: 0
Reg: 069331: 00 : HDCP_count: 0 HDCP2_0 Downstream: 0 HDCP1 Downstream: 0
069493: 0x00
Reg: 069493: 00 : Ready: 0 , H' Available: 0, Pairing_available: 0 , Reauth_req: 0, Link Integrity: 0
## Register Dump Port 2 - End ##
## EDID Dump Port 2 - Start ##
// EDID Dump: device, 384 bytes, OK
uint8_t EDID_AUS_6b3_272a[] = {
/* 000: */ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
/* 008: */ 0x06, 0xb3, 0x2a, 0x27, 0x01, 0x01, 0x01, 0x01,
/* 010: */ 0x31, 0x1d, 0x01, 0x04, 0xb5, 0x3c, 0x22, 0x78,
/* 018: */ 0x3b, 0x0b, 0x10, 0xb0, 0x4c, 0x45, 0xa8, 0x26,
/* 020: */ 0x0a, 0x50, 0x54, 0xbf, 0xcf, 0x00, 0x71, 0x4f,
/* 028: */ 0x81, 0xc0, 0x81, 0x40, 0x81, 0x80, 0xd1, 0xc0,
/* 030: */ 0xd1, 0xfc, 0x95, 0x00, 0xb3, 0x00, 0x4d, 0xd0,
/* 038: */ 0x00, 0xa0, 0xf0, 0x70, 0x3e, 0x80, 0x30, 0x20,
/* 040: */ 0x35, 0x00, 0x54, 0x4f, 0x21, 0x00, 0x00, 0x1a,
/* 048: */ 0x00, 0x00, 0x00, 0xfd, 0x0c, 0x30, 0x90, 0x4a,
/* 050: */ 0x4a, 0x81, 0x01, 0x0a, 0x20, 0x20, 0x20, 0x20,
/* 058: */ 0x20, 0x20, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x52,
/* 060: */ 0x4f, 0x47, 0x20, 0x58, 0x47, 0x32, 0x37, 0x55,
/* 068: */ 0x51, 0x0a, 0x20, 0x20, 0x00, 0x00, 0x00, 0xff,
/* 070: */ 0x00, 0x4b, 0x43, 0x4c, 0x4d, 0x51, 0x53, 0x30,
/* 078: */ 0x30, 0x30, 0x38, 0x38, 0x37, 0x20, 0x02, 0x0a,
/* 080: */ 0x02, 0x03, 0x3f, 0xf2, 0x50, 0x60, 0x61, 0x01,
/* 088: */ 0x02, 0x03, 0x11, 0x12, 0x13, 0x04, 0x0e, 0x0f,
/* 090: */ 0x1d, 0x1e, 0x1f, 0x10, 0x3f, 0xe2, 0x00, 0xd5,
/* 098: */ 0x23, 0x09, 0x07, 0x07, 0x83, 0x01, 0x00, 0x00,
/* 0a0: */ 0x65, 0x03, 0x0c, 0x00, 0x10, 0x00, 0xe3, 0x05,
/* 0a8: */ 0xc0, 0x00, 0xe6, 0x06, 0x05, 0x01, 0x70, 0x70,
/* 0b0: */ 0x07, 0x6d, 0x1a, 0x00, 0x00, 0x02, 0x0b, 0x30,
/* 0b8: */ 0x90, 0x00, 0x07, 0x70, 0x35, 0x70, 0x35, 0x56,
/* 0c0: */ 0x5e, 0x00, 0xa0, 0xa0, 0xa0, 0x29, 0x50, 0x30,
/* 0c8: */ 0x20, 0x35, 0x00, 0x54, 0x4f, 0x21, 0x00, 0x00,
/* 0d0: */ 0x1a, 0x86, 0xbc, 0x00, 0x50, 0xa0, 0xa0, 0x55,
/* 0d8: */ 0x50, 0x08, 0x20, 0x78, 0x00, 0x54, 0x4f, 0x21,
/* 0e0: */ 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b,
/* 100: */ 0x70, 0x12, 0x67, 0x00, 0x00, 0x03, 0x01, 0x64,
/* 108: */ 0x9b, 0x12, 0x01, 0x04, 0xff, 0x0e, 0x4f, 0x00,
/* 110: */ 0x07, 0x00, 0x1f, 0x00, 0x6f, 0x08, 0x52, 0x00,
/* 118: */ 0x44, 0x00, 0x07, 0x00, 0x15, 0x4c, 0x01, 0x04,
/* 120: */ 0xff, 0x0e, 0x3b, 0x00, 0x07, 0x80, 0x1f, 0x00,
/* 128: */ 0x6f, 0x08, 0x40, 0x00, 0x02, 0x00, 0x04, 0x00,
/* 130: */ 0x7b, 0x5a, 0x01, 0x04, 0xff, 0x0e, 0x4f, 0x00,
/* 138: */ 0x07, 0x00, 0x1f, 0x00, 0x6f, 0x08, 0x68, 0x00,
/* 140: */ 0x5a, 0x00, 0x07, 0x00, 0x3a, 0x9b, 0x01, 0x04,
/* 148: */ 0xff, 0x0e, 0x4f, 0x00, 0x07, 0x80, 0x1f, 0x00,
/* 150: */ 0x6f, 0x08, 0x4d, 0x00, 0x02, 0x00, 0x04, 0x00,
/* 158: */ 0x47, 0xf8, 0x01, 0x04, 0xff, 0x0e, 0x4f, 0x00,
/* 160: */ 0x07, 0x00, 0x1f, 0x00, 0x6f, 0x08, 0x7e, 0x00,
/* 168: */ 0x70, 0x00, 0x07, 0x00, 0x52, 0x00, 0x00, 0x00,
/* 170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90
};
## EDID Dump Port 2 - End ##
## Display Connection Stats Dump Port 2 - End ##
Display mfgName: AUS, productID: 0x272a
Time to EDID read: 95466
Time to link train: 1014560
Link training duration: 22084
Link training status: 1
Link training count: 7
HDCP status: 0
HDCP retry count: 1
EFI w/a data: 0x0
## Display Connection Stats Dump Port 2 - End ##
## Register Dump Port 4 - Start ##
000000: 0x12 0x14 0xc2 0x01 0x01 0x15 0x01 0x81 0x00 0x01 0x04 0x01 0x0f 0x00 0x04 0x00
Reg: 000000: 12 : DPCD_REV: 1.2
Reg: 000001: 14 : MAX_LINK_RATE: HBR2
Reg: 000002: c2 : MAX_LANE_COUNT: 2, TPS3_SUPPORTED: 1, ENHANCED_FRAME_CAP: 1
Reg: 000003: 01 : MAX_DOWNSPREAD: 0.5% down, NO_AUX_HANDSHAKE_LINK_TRAINING: 0
Reg: 000004: 01 : NORP: 1
Reg: 000005: 15 : DOWNSTREAMPORT_PRESENT: DWN_STRM_PORT_PRESENT: 1, DWN_STRM_PORT_TYPE: [2] DVI/HDMI, FORMAT_CONVERSION: 0, DETAILED_CAP_INFO_AVAILABLE: 1
Reg: 000006: 01 : MAIN_LINK_CHANNEL_CODING: ANSI 8B/10B
Reg: 000007: 81 : DOWN_STREAM_PORT_COUNT: DWN_STRM_PORT_COUNT: 1, MSA_TIMING_PAR_IGNORED: 0, OUI: 1
Reg: 000008: 00 : RECEIVE_PORT0_CAP_0: LOCAL_EDID_PRESENT: 0, ASSOCIATED_TO_PRECEDING_PORT: 0
Reg: 000009: 01 : RECEIVE_PORT0_CAP_1: BUFFER_SIZE: 64
Reg: 00000a: 04 : RECEIVE_PORT1_CAP_0:
Reg: 00000b: 01 : RECEIVE_PORT1_CAP_1:
Reg: 00000c: 0f : I2C Speed: 1Kbps 5Kbps 10Kbps 100Kbps
Reg: 00000d: 00 : eDP_CONFIGURATION_CAP: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
Reg: 00000e: 04 : TRAINING_AUX_RD_INTERVAL: 16 ms, EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT: NO
Reg: 00000f: 00 : ADAPTER_CAP: FORCE_LOAD_SENSE_CAP: 0, ALTERNATE_I2C_PATTERN_CAP: 0
000020: 0x00 0x00 0x01
Reg: 000020: 00 : FAUX_CAP: FAUX_CAP: 0
Reg: 000021: 00 : MSTM_CAP: MST_CAP: 0
Reg: 000022: 01 : NUMBER_OF_AUDIO_ENDPOINTS: 1
000060: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Reg: 000060: 00 : DSC Support: 0
Reg: 000061: 00 : DSC Algorithm revision: 0
Reg: 000062: 00 : DSC RC Buffer Block size: 0
Reg: 000063: 00 : DSC RC Buffer size: 0
Reg: 000064: 00 : DSC slice Capabilities 1 : 0
Reg: 000065: 00 : DSC Line buffer bit depth: 0
Reg: 000066: 00 : DSC Block prediction support: 0
Reg: 000067: 00 : DSC Maximum bit per pixel: 0
Reg: 000068: 00 : DSC Maximum bit per pixel: 0
Reg: 000069: 00 : DSC Decoder color format capabilities: 0
Reg: 00006a: 00 : DSC decoder color depth capabilities: 0
Reg: 00006b: 00 : DSC Peak Throughput: 0
Reg: 00006c: 00 : DSC Maximum Slice width: 0
Reg: 00006d: 00 : DSC Slice capabilities 2: 0
Reg: 00006e: 00 : Reserved: 0
Reg: 00006f: 00 : DSC Bits per pixel increment: 0
000090: 0x00
Reg: 000090: 00 : FEC Capability: 0x0
000080: 0x0b 0x78 0x02 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Reg: 000080: 0b : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [3] HDMI, DWN_STRM_PORTX_HPD: 1, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0 Reserved
Reg: 000084: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 000088: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
Reg: 00008c: 00 : DETAILED_CAP_INFO_AVAILABLE: DWN_STRM_PORTX_CAP: [0] DisplayPort, DWN_STRM_PORTX_HPD: 0, NON_EDID_DWN_STRM_PORTX_ATTRIBUTE: 0
000100: 0x14 0x82
Reg: 000100: 14 : LINK_BW_SET: HBR2
Reg: 000101: 82 : LANE_COUNT_SET: LANE_COUNT_SET 2, ENHANCED_FRAME_EN: 1
000107: 0x10
Reg: 000107: 10 : DOWNSPREAD_CTRL: SPREAD_AMP: 1, MSA_TIMING_PAR_IGNORE_EN: 0
00010a: 0x00
Reg: 00010a: 00 : eDP_CONFIGURATION_CAP_SET: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
000111: 0x00
Reg: 000111: 00 : MSTM_CTRL: UPSTREAM_IS_SRC:0 UP_REQ_EN:0 MST_EN:0
000120: 0x00
Reg: 000120: 00 : FEC Configuration: 0x0
000160: 0x00
Reg: 000160: 00 : DSC Enable: 0x0
000200: 0x01 0x00 0x77 0x00 0x01 0x01 0x22 0x22
Reg: 000200: 01 : SINK_COUNT: SINK_COUNT 1, CP_READY: 0
Reg: 000202: 77 : LANE0: CR_DONE: 1, CHANNEL_EQ_DONE: 1, SYMBOL_LOCKED: 1
Reg: 000202: 77 : LANE1: CR_DONE: 1, CHANNEL_EQ_DONE: 1, SYMBOL_LOCKED: 1
Reg: 000203: 00 : LANE2: CR_DONE: 0, CHANNEL_EQ_DONE: 0, SYMBOL_LOCKED: 0
Reg: 000203: 00 : LANE3: CR_DONE: 0, CHANNEL_EQ_DONE: 0, SYMBOL_LOCKED: 0
Reg: 000205: 01 : SINK_STATUS: RECEIVE_PORT_0_STATUS: 1, RECEIVE_PORT_1_STATUS: 0
Reg: 000206: 22 : LANE0: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
Reg: 000206: 22 : LANE1: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
Reg: 000207: 22 : LANE2: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
Reg: 000207: 22 : LANE3: VOLTAGE_SWING: 2, PRE-EMPHASIS: 0
00020f: 0x00
Reg: 00020f: 00 : DSC Status: 0
000280: 0x00
Reg: 000280: 00 : FEC Status: 0
00042f: 0x00
Reg: 00042f: 00 : DISPLAY_ROTATION: 0x0
002200: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Reg: 002200: 00 : DPCD_REV: 0.0
Reg: 002201: 00 : MAX_LINK_RATE: ???
Reg: 002202: 00 : MAX_LANE_COUNT: 0, TPS3_SUPPORTED: 0, ENHANCED_FRAME_CAP: 0
Reg: 002203: 00 : MAX_DOWNSPREAD: None, NO_AUX_HANDSHAKE_LINK_TRAINING: 0
Reg: 002204: 00 : NORP: 0
Reg: 002205: 00 : DOWNSTREAMPORT_PRESENT: DWN_STRM_PORT_PRESENT: 0, DWN_STRM_PORT_TYPE: [0] DisplayPort, FORMAT_CONVERSION: 0, DETAILED_CAP_INFO_AVAILABLE: 0
Reg: 002206: 00 : MAIN_LINK_CHANNEL_CODING_SET: ??
Reg: 002207: 00 : DOWN_STREAM_PORT_COUNT: DWN_STRM_PORT_COUNT: 0, MSA_TIMING_PAR_IGNORED: 0, OUI: 0
Reg: 002208: 00 : RECEIVE_PORT0_CAP_0: LOCAL_EDID_PRESENT: 0, ASSOCIATED_TO_PRECEDING_PORT: 0
Reg: 002209: 00 : RECEIVE_PORT0_CAP_1: BUFFER_SIZE: 32
Reg: 00220a: 00 : RECEIVE_PORT1_CAP_0:
Reg: 00220b: 00 : RECEIVE_PORT1_CAP_1:
Reg: 00220c: 00 : I2C Speed:
Reg: 00220d: 00 : eDP_CONFIGURATION_CAP_SET: ALTERNATE_SCRAMBLER_RESET_CAPABLE: 0, FRAMING_CHANGE_CAPABLE: 0
Reg: 00220e: 00 : TRAINING_AUX_RD_INTERVAL: 100 us, EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT: NO
Reg: 00220f: 00 : ADAPTER_CAP: FORCE_LOAD_SENSE_CAP: 0, ALTERNATE_I2C_PATTERN_CAP: 0
068028: 0x03
Reg: 068028: 03 : HDCP_CAPABLE: 1, REPEATER: 1
06921d: 0x02 0x00 0x03
Reg: 06921d: 02 : VERSION: 2
Reg: 06921f: 03 : HDCP_CAPABLE: 1, REPEATER: 1
069330: 0x02 0x11
Reg: 069330: 02 : HDCP_Depth: 1
Reg: 069331: 11 : HDCP_count: 1 HDCP2_0 Downstream: 0 HDCP1 Downstream: 1
069493: 0x00
Reg: 069493: 00 : Ready: 0 , H' Available: 0, Pairing_available: 0 , Reauth_req: 0, Link Integrity: 0
## Register Dump Port 4 - End ##
## EDID Dump Port 4 - Start ##
// EDID Dump: device, 256 bytes, OK
uint8_t EDID_HYO_232f_49b[] = {
/* 000: */ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
/* 008: */ 0x23, 0x2f, 0x9b, 0x04, 0x00, 0x00, 0x00, 0x00,
/* 010: */ 0x28, 0x15, 0x01, 0x03, 0xa5, 0x3c, 0x22, 0x78,
/* 018: */ 0x22, 0x6f, 0xb1, 0xa7, 0x55, 0x4c, 0x9e, 0x25,
/* 020: */ 0x0c, 0x50, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01,
/* 028: */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
/* 030: */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x56, 0x5e,
/* 038: */ 0x00, 0xa0, 0xa0, 0xa0, 0x29, 0x50, 0x30, 0x20,
/* 040: */ 0x35, 0x00, 0x55, 0x50, 0x21, 0x00, 0x00, 0x1a,
/* 048: */ 0x00, 0x00, 0x00, 0xfc, 0x00, 0x44, 0x55, 0x41,
/* 050: */ 0x4c, 0x2d, 0x44, 0x56, 0x49, 0x0a, 0x20, 0x20,
/* 058: */ 0x20, 0x20, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x0a,
/* 060: */ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
/* 068: */ 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfc,
/* 070: */ 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
/* 078: */ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x11,
/* 080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
## EDID Dump Port 4 - End ##
## Display Connection Stats Dump Port 4 - End ##
Display mfgName: HYO, productID: 0x49b
Time to EDID read: 747
Time to link train: 2073733
Link training duration: 56049
Link training status: 1
Link training count: 2
HDCP status: 0
HDCP retry count: 3
EFI w/a data: 0x0
## Display Connection Stats Dump Port 4 - End ##
### End: AGDC[6] 0x100000829 (took 0.233 sec) ################################
### End: Ports (took 0.234 sec) ##############################################
### Start: Metrics ###########################################################
Display Metric Tool Version: 1.2
Display Metric Plugin Version: 1.2 AGDC Version: 6.3.5
Dumping Metric Logs: currentlog(2686) logsize(32768) numberlogs(819)
Total lines: 819
2021-08-25 17:28:34.214920+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 07:59:41.440088+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 07:59:41.440753+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 07:59:41.463367+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 07:59:41.463911+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 07:59:41.485975+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 07:59:41.486840+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 07:59:41.509047+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 07:59:41.522396+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 07:59:41.647854+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 07:59:41.648326+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 07:59:41.772794+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 07:59:41.773362+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 07:59:41.829643+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 07:59:41.852927+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x1 LT Status:0x1 (OK)
2021-08-25 07:59:42.351443+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 07:59:42.382465+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 07:59:42.547012+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 07:59:42.603877+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 07:59:42.615894+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 07:59:42.718071+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 07:59:42.749123+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 07:59:42.866097+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 07:59:44.534633+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 07:59:44.565756+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 07:59:44.684251+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 07:59:54.675806+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 2 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x2
2021-08-25 07:59:55.847473+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 2 2002h-2005h: 0x41 0x4 0x0 0x0 200Ch-200Fh: 0x7 0x0 0x1 0x3
2021-08-25 07:59:55.847475+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 2 Latency(in microsecond) 219
2021-08-25 07:59:55.850366+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 2 Status:0 (OK) Stored Km:0x1
2021-08-25 07:59:55.869174+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 2 Status:0 (OK)
2021-08-25 08:01:29.331893+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 4 Latency(in microsecond) 108282036700
2021-08-25 08:01:29.411628+0100: kAGDCPluginMetricsPlug(4100) GPU:0x9f3b Port: 4
2021-08-25 08:01:29.923969+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 4 Latency(in microsecond) 43048336
2021-08-25 08:01:32.117881+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 4 Latency(in microsecond) 2117604668
2021-08-25 08:01:32.191235+0100: kAGDCPluginMetricsPlug(4100) GPU:0x9f3b Port: 4
2021-08-25 08:01:32.276822+0100: kAGDCPluginMetricsDisplayInfo(4108) GPU:0x9f3b Port: 4 dpcd_rev:0x12 max_link_rate:0x14 max_lane_count:0xc2 max_downspread:0x1 downstreamport_present:0x15 mstm_cap:0 number_of_audio_endpoints:0x1
2021-08-25 08:01:32.277611+0100: kAGDCPluginMetricsMonitorInfo(4109) GPU:0x9f3b Port: 4 mfgName:HYO mfgID:0x232f productID:0x49b
2021-08-25 08:01:32.720306+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 4
2021-08-25 08:01:32.720866+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 4
2021-08-25 08:01:32.776159+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 4 link_rate:0x14 lane_count:0x82 LT Status:0x1 (OK)
2021-08-25 08:01:32.798466+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 4 link_rate:0x14 lane_count:0x2 LT Status:0x1 (OK)
2021-08-25 08:01:33.015380+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:01:33.046553+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:01:33.172703+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 08:01:33.287244+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 4
2021-08-25 08:01:33.344565+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 4 link_rate:0x14 lane_count:0x82 LT Status:0x1 (OK)
2021-08-25 08:01:33.356185+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:01:33.432109+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:01:33.463211+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:01:33.556353+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 08:01:33.639752+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:01:35.082005+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:01:35.113163+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:01:43.547352+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 2 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x2
2021-08-25 08:01:43.630509+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 4 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x3
2021-08-25 08:01:44.722756+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 2 2002h-2005h: 0x41 0x4 0x0 0x0 200Ch-200Fh: 0x7 0x0 0x1 0x3
2021-08-25 08:01:44.722757+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 2 Latency(in microsecond) 247
2021-08-25 08:01:44.728712+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 2 Status:0 (OK) Stored Km:0x1
2021-08-25 08:01:44.745467+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 2 Status:0 (OK)
2021-08-25 08:01:44.792658+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 4 Status:0 (OK) Stored Km:0x1
2021-08-25 08:01:44.794645+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:01:44.794646+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 178
2021-08-25 08:01:44.811467+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:01:44.820093+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:01:44.977826+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:01:44.977827+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 312
2021-08-25 08:01:45.044322+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:01:45.053609+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:01:45.259388+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:08:43.885378+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 2 Latency(in microsecond) 431616417938
2021-08-25 08:08:43.887661+0100: kAGDCPluginMetricsUnPlug(4101) GPU:0x9f3b Port: 2
2021-08-25 08:08:44.337410+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:44.368555+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:44.489820+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:08:44.570837+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:44.601879+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:44.689977+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:08:44.837386+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:44.868534+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:46.124476+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:08:47.322509+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 2 Latency(in microsecond) 3343561982
2021-08-25 08:08:47.399366+0100: kAGDCPluginMetricsPlug(4100) GPU:0x9f3b Port: 2
2021-08-25 08:08:47.481998+0100: kAGDCPluginMetricsDisplayInfo(4108) GPU:0x9f3b Port: 2 dpcd_rev:0x14 max_link_rate:0x1e max_lane_count:0xc4 max_downspread:0x81 downstreamport_present:0 mstm_cap:0 number_of_audio_endpoints:0
2021-08-25 08:08:47.482812+0100: kAGDCPluginMetricsMonitorInfo(4109) GPU:0x9f3b Port: 2 mfgName:AUS mfgID:0x6b3 productID:0x272a
2021-08-25 08:08:47.750865+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 08:08:47.751284+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:47.772269+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:47.772643+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:47.793057+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:47.793433+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:47.912364+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:47.912905+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.040444+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:48.040949+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.166150+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:48.166714+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.223790+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:08:48.247537+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x1 LT Status:0x1 (OK)
2021-08-25 08:08:48.370533+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:48.401779+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:48.541939+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.562968+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:48.577552+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.598148+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:48.615715+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.636347+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:48.654377+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.674911+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:48.759948+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:08:48.837302+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:48.868430+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:48.959167+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:48.980855+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:48.996248+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:49.018876+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:49.034235+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:49.055933+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:49.073050+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:49.113831+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:08:49.126910+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 08:08:49.210319+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:08:49.770530+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:49.801741+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:49.894206+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:08:49.970604+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:50.001732+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:08:50.052750+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.053771+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.075703+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:50.076337+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.098955+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:50.100962+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.123575+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:50.124296+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.146804+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:50.147505+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.274904+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:50.275520+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.297092+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:50.297620+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.317958+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:50.318713+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.446133+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:50.447138+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.571315+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:50.572391+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.695736+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:50.696493+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.821543+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:50.822149+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:50.947095+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:50.995100+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:08:51.049224+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:08:51.067651+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.068676+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.091603+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.092203+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.113551+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.114027+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.136477+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.137217+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.160828+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.161523+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.184239+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.184849+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.207293+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.207878+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.229223+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.229654+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.251788+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.252368+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.274899+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.275498+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.298065+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.298708+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.321199+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.321759+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.345035+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.367606+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:08:51.635862+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.636284+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.656751+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.657102+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.677679+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.677997+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.698811+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.699130+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.719973+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.720335+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.741079+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.741431+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.762133+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.762487+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.782969+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.783354+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.804278+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.804671+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.825524+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.825888+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.846676+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:51.846991+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.867681+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.867994+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.888660+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:51.910785+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:08:51.963599+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.971160+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:51.992433+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:51.992801+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.013800+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:52.028997+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.050099+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:52.073802+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.095000+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:52.095403+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.116142+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:52.116570+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.137903+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:52.138313+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.158901+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:08:52.159414+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.181484+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:52.182171+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.204545+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:52.205089+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.226450+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:08:52.226984+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.248129+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:52.248626+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:08:52.270402+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:08:52.292882+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:09:00.987004+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 4 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x3
2021-08-25 08:09:01.316018+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 2 Latency(in microsecond) 13842863836
2021-08-25 08:09:01.318326+0100: kAGDCPluginMetricsUnPlug(4101) GPU:0x9f3b Port: 2
2021-08-25 08:09:02.154268+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 4 Status:0 (OK) Stored Km:0x1
2021-08-25 08:09:02.155039+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:09:02.155041+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 429
2021-08-25 08:09:02.172040+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:09:02.181391+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:09:02.255242+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:09:02.255245+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 461
2021-08-25 08:09:02.408708+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:09:02.419050+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:09:02.624085+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:09:03.563509+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 2 Latency(in microsecond) 2160453268
2021-08-25 08:09:03.642931+0100: kAGDCPluginMetricsPlug(4100) GPU:0x9f3b Port: 2
2021-08-25 08:09:03.731458+0100: kAGDCPluginMetricsDisplayInfo(4108) GPU:0x9f3b Port: 2 dpcd_rev:0x14 max_link_rate:0x1e max_lane_count:0xc4 max_downspread:0x81 downstreamport_present:0 mstm_cap:0 number_of_audio_endpoints:0
2021-08-25 08:09:03.732298+0100: kAGDCPluginMetricsMonitorInfo(4109) GPU:0x9f3b Port: 2 mfgName:AUS mfgID:0x6b3 productID:0x272a
2021-08-25 08:09:04.001788+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.002650+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.024696+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:09:04.025078+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.045907+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:09:04.046292+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.067532+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:09:04.068002+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.090649+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:09:04.091195+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.215665+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:09:04.216149+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.273321+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:09:04.301154+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x1 LT Status:0x1 (OK)
2021-08-25 08:09:04.470209+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:09:04.501340+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:09:04.638177+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.696030+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:09:04.706229+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 08:09:04.822990+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:09:04.903568+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:09:04.934669+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:09:05.023153+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 2
2021-08-25 08:09:05.106558+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:09:06.470361+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:09:06.501290+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:09:06.607774+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:09:15.014041+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 2 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x2
2021-08-25 08:09:16.188371+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 2 2002h-2005h: 0x41 0x4 0x0 0x0 200Ch-200Fh: 0x7 0x0 0x1 0x3
2021-08-25 08:09:16.188372+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 2 Latency(in microsecond) 449
2021-08-25 08:09:16.192536+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 2 Status:0 (OK) Stored Km:0x1
2021-08-25 08:09:16.210281+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 2 Status:0 (OK)
2021-08-25 08:09:16.598782+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 4 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x3
2021-08-25 08:09:17.769062+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:09:17.769063+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 272
2021-08-25 08:09:17.769509+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 4 Status:0 (OK) Stored Km:0x1
2021-08-25 08:09:17.786298+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:09:17.795402+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:09:17.869544+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:09:17.869546+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 360
2021-08-25 08:09:18.020883+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:09:18.031625+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:09:18.233922+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:16:51.604291+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 2 Latency(in microsecond) 467883204376
2021-08-25 08:16:51.606784+0100: kAGDCPluginMetricsUnPlug(4101) GPU:0x9f3b Port: 2
2021-08-25 08:16:52.290677+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:52.321789+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:52.435656+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:16:52.523984+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:52.555113+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:52.635820+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:16:52.790607+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:52.821770+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:54.053635+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:16:56.491492+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 5 Latency(in microsecond) 4792961586
2021-08-25 08:16:56.572843+0100: kAGDCPluginMetricsPlug(4100) GPU:0x9f3b Port: 5
2021-08-25 08:16:56.668291+0100: kAGDCPluginMetricsDisplayInfo(4108) GPU:0x9f3b Port: 5 dpcd_rev:0x14 max_link_rate:0x1e max_lane_count:0xc4 max_downspread:0x81 downstreamport_present:0 mstm_cap:0 number_of_audio_endpoints:0
2021-08-25 08:16:56.669121+0100: kAGDCPluginMetricsMonitorInfo(4109) GPU:0x9f3b Port: 5 mfgName:AUS mfgID:0x6b3 productID:0x272a
2021-08-25 08:16:56.936273+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 5
2021-08-25 08:16:56.937391+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:56.958962+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:56.959382+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:56.980336+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:56.980709+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.002105+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:57.002499+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.023853+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:57.024234+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.150721+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:57.151243+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.208705+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:16:57.235193+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x1 LT Status:0x1 (OK)
2021-08-25 08:16:57.390490+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:57.421639+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:57.587560+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.608189+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:57.622781+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.643506+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:57.656094+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.676742+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:57.691025+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:57.711706+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:57.789994+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:16:57.857227+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:57.888296+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:57.972381+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:58.030650+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:16:58.040199+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 5
2021-08-25 08:16:58.123597+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:16:58.723783+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:58.754936+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:58.840852+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:16:58.907088+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:58.938265+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:16:58.989247+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 5
2021-08-25 08:16:58.990277+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.013821+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.014421+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.037122+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.037922+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.061324+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.061769+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.083211+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.083684+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.105613+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.106313+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.129316+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.130049+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.153247+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.154821+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.177257+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.177792+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.199880+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.200391+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.221997+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.257858+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:16:59.290108+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.311790+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.312266+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.333663+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.355623+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 5 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:16:59.372938+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.373512+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.395037+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.395584+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.417371+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.417898+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.439855+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.440382+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.461789+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.462245+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.483577+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.484077+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.506081+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.506753+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.528822+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.529400+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.552429+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.553033+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.575762+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.576282+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.598941+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.599438+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.620791+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.621192+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.642303+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:16:59.663666+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 5 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:16:59.933204+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.933718+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.954496+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.954861+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.975450+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:16:59.975805+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:16:59.996637+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:16:59.996983+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.017754+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:00.018106+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.038711+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:00.039056+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.059961+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.060385+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.081056+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:00.081440+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.102249+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.102563+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.123395+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:00.123742+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.144599+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:00.159161+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.179953+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.199525+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.220486+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.242267+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 5 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:17:00.258816+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.259234+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.279765+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:00.280121+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.300698+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:00.301013+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.321991+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:00.322690+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.345531+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:00.346132+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.367925+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:00.368457+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.389761+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.390233+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.410668+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:00.411133+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.432333+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.432742+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.453831+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:00.454263+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.475328+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:00.475809+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.497069+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.497671+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:00.519644+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x6 lane_count:0x81 LT Status:0 (FAIL)
2021-08-25 08:17:00.541847+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 5 link_rate:0 lane_count:0 LT Status:0 (FAIL)
2021-08-25 08:17:09.249201+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 4 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x3
2021-08-25 08:17:10.416719+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:17:10.416722+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 567
2021-08-25 08:17:10.417293+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 4 Status:0 (OK) Stored Km:0x1
2021-08-25 08:17:10.435074+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:17:10.444222+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:17:10.517203+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:17:10.517205+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 262
2021-08-25 08:17:10.670327+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:17:10.681227+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:17:10.883626+0100: kAGDCPluginMetricsRepeaterAuthentication(410e) GPU:0x9f3b Port: 4 Status:0 (OK) Depth 2 Device count 11
2021-08-25 08:17:13.642399+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 5 Latency(in microsecond) 16999704751
2021-08-25 08:17:13.721688+0100: kAGDCPluginMetricsUnPlug(4101) GPU:0x9f3b Port: 5
2021-08-25 08:17:15.953789+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 5 Latency(in microsecond) 2227259182
2021-08-25 08:17:16.036415+0100: kAGDCPluginMetricsPlug(4100) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.119197+0100: kAGDCPluginMetricsDisplayInfo(4108) GPU:0x9f3b Port: 5 dpcd_rev:0x14 max_link_rate:0x1e max_lane_count:0xc4 max_downspread:0x81 downstreamport_present:0 mstm_cap:0 number_of_audio_endpoints:0
2021-08-25 08:17:16.120038+0100: kAGDCPluginMetricsMonitorInfo(4109) GPU:0x9f3b Port: 5 mfgName:AUS mfgID:0x6b3 productID:0x272a
2021-08-25 08:17:16.389174+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.393651+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.416610+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:16.417127+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.440182+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:16.440705+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.463439+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:16.463803+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.485391+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:17:16.485791+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.609908+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:17:16.610440+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:16.668771+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:17:16.692990+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x1 LT Status:0x1 (OK)
2021-08-25 08:17:16.873312+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:17:16.904431+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:17:17.037749+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 5
2021-08-25 08:17:17.093629+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 5 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:17:17.105651+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 5
2021-08-25 08:17:17.222418+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:17:17.289984+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:17:17.321082+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:17:17.405896+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 5
2021-08-25 08:17:17.489304+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:17:18.839936+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:17:18.871039+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:17:18.973840+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:17:27.397204+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 5 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x2
2021-08-25 08:17:28.571884+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 5 2002h-2005h: 0x41 0x4 0x0 0x0 200Ch-200Fh: 0x7 0x0 0x1 0x3
2021-08-25 08:17:28.571887+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 5 Latency(in microsecond) 398
2021-08-25 08:17:28.575843+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 5 Status:0 (OK) Stored Km:0x1
2021-08-25 08:17:28.593712+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 5 Status:0 (OK)
2021-08-25 08:17:28.969173+0100: kAGDCPluginMetricsHDCPStart(410b) GPU:0x9f3b Port: 4 HDCP version:0x2.0x2 Authenticated Version:0x2 Bcaps:0x3
2021-08-25 08:17:30.133799+0100: kAGDCPluginMetricsFirstPhaseComplete(410c) GPU:0x9f3b Port: 4 Status:0 (OK) Stored Km:0x1
2021-08-25 08:17:30.134336+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:17:30.134337+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 260
2021-08-25 08:17:30.151654+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:17:30.160298+0100: kAGDCPluginMetricsLocalityCheck(410d) GPU:0x9f3b Port: 4 Status:0 (OK)
2021-08-25 08:17:30.234501+0100: kAGDCPluginMetricsSPIData(4120) GPU:0x9f3b Port: 4 200h-205h: 0x1 0x4 0x77 0x0 0x1 0x1
2021-08-25 08:17:30.234503+0100: kAGDCPluginMetricsSPI(4103) GPU:0x9f3b Port: 4 Latency(in microsecond) 369
2021-08-25 08:21:23.531019+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 5 Latency(in microsecond) 247420947089
2021-08-25 08:21:23.610932+0100: kAGDCPluginMetricsUnPlug(4101) GPU:0x9f3b Port: 5
2021-08-25 08:21:24.083080+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:24.114184+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:24.239372+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 4
2021-08-25 08:21:24.316315+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:24.347508+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:24.381115+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 4 Latency(in microsecond) 761945659
2021-08-25 08:21:24.383465+0100: kAGDCPluginMetricsUnPlug(4101) GPU:0x9f3b Port: 4
2021-08-25 08:21:25.583038+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:25.614145+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:25.982883+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:26.014127+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:26.083048+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:26.114127+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:26.883014+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:26.914110+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port: 1
2021-08-25 08:21:30.496159+0100: kAGDCPluginMetricsHPD(4102) GPU:0x9f3b Port: 2 Latency(in microsecond) 6106226781
2021-08-25 08:21:30.496303+0100: kAGDCPluginMetricsPlug(4100) GPU:0x9f3b Port: 2
2021-08-25 08:21:30.590133+0100: kAGDCPluginMetricsDisplayInfo(4108) GPU:0x9f3b Port: 2 dpcd_rev:0x14 max_link_rate:0x1e max_lane_count:0xc4 max_downspread:0x81 downstreamport_present:0 mstm_cap:0 number_of_audio_endpoints:0
2021-08-25 08:21:30.591017+0100: kAGDCPluginMetricsMonitorInfo(4109) GPU:0x9f3b Port: 2 mfgName:AUS mfgID:0x6b3 productID:0x272a
2021-08-25 08:21:30.859684+0100: kAGDCPluginMetricsSyncLT(4104) GPU:0x9f3b Port: 2
2021-08-25 08:21:30.860270+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:21:30.883106+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:21:30.883613+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:21:30.906657+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:21:30.907231+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:21:30.930167+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:21:30.930687+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:21:30.953498+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x14 lane_count:0x82 LT Status:0 (FAIL)
2021-08-25 08:21:30.953997+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:21:31.080465+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0xa lane_count:0x84 LT Status:0 (FAIL)
2021-08-25 08:21:31.081036+0100: kAGDCPluginMetricsLTBegin(4106) GPU:0x9f3b Port: 2
2021-08-25 08:21:31.139931+0100: kAGDCPluginMetricsLTEnd(4107) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x81 LT Status:0x1 (OK)
2021-08-25 08:21:31.166722+0100: kAGDCPluginMetricsSyncLTEnd(4105) GPU:0x9f3b Port: 2 link_rate:0x1e lane_count:0x1 LT Status:0x1 (OK)
2021-08-25 08:21:31.482828+0100: kAGDCPluginMetricsLightUpDp(410a) GPU:0x9f3b Port:
Thanks a lot for such a thorough investigation, @joevt! I'll try to fiddle around with the timing and pixel format. Oh, and to answer your question: I do have an option to enable HDR in System Preferences > Displays, if that's what you mean. The monitor detects it upon turning on but the colors are even worse.
Welp, can't argue with that. Not my first rodeo with Apple trying to be (too) clever.