Skip to content

Instantly share code, notes, and snippets.

@joevt
Last active July 23, 2024 03:03
Show Gist options
  • Save joevt/32e5efffe3459958759fb702579b9529 to your computer and use it in GitHub Desktop.
Save joevt/32e5efffe3459958759fb702579b9529 to your computer and use it in GitHub Desktop.
A set of shell functions used to view and edit EDIDs.
#!/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!(?:&nbsp;)*(</td>)!\1!g;
s!&amp;!&!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
#=========================================================================================
@aleskrejci
Copy link

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.

Send feedback to Apple to tell them they suck.

Welp, can't argue with that. Not my first rodeo with Apple trying to be (too) clever.

@lasombra
Copy link

lasombra commented Jun 9, 2021

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.

@jaffacake
Copy link

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

@joevt
Copy link
Author

joevt commented Aug 23, 2021

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.

@jaffacake
Copy link

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?)

@jaffacake
Copy link

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?

@joevt
Copy link
Author

joevt commented Aug 24, 2021

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.

@joevt
Copy link
Author

joevt commented Aug 24, 2021

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.

@jaffacake
Copy link

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.

@joevt
Copy link
Author

joevt commented Aug 25, 2021

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.

@jaffacake
Copy link

jaffacake commented Aug 25, 2021

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: