Skip to content

Set VCP write is ignored on an LG display when initial DDC checks are skipped #626

Description

@Murderlon

Summary

On an LG UltraGear evo 27GM950B-B, a Set VCP brightness request is consistently ignored when --skip-ddc-checks is used. The same request works when initial DDC checks are enabled.

Verification reports DDCRC_VERIFY, while --noverify exits with status 0 even though the value does not change. A second verified attempt inside the same ddcutil process succeeds when the hidden --i5 2 option is used. Running two separate verified commands does not succeed.

This may indicate that the verification read primes the display and that the second write must reuse the same initialized display handle.

System

Component Value
Display LG UltraGear evo 27GM950B-B
Connection DisplayPort on DP-1
Product code 23800
DDC bus 9
VCP version response x02 x01
GPU AMD Radeon 780M using amdgpu
ddcutil 2.2.7 and 2.2.8-DEV at commit 20eee398
Kernel 7.1.9-arch1-2
Distribution Omarchy 4.0.1-1
Hyprland 0.56.2

The monitor reports VCP feature 0x10 as writable with a range of 0 through 100.

ddcutil-interrogate.txt

FAQ and development branch

I checked the project FAQ. DDC communication is enabled and full checked writes work. The documented picture mode cases do not explain why the result depends on --skip-ddc-checks. The documented sleep multiplier guidance was also tested as described below.

I built the current 2.2.8-dev branch at commit 20eee398. The behavior is unchanged.

skip_status=1 skip_observed=60 skip_elapsed=319ms
i5_status=0 i5_observed=61 i5_elapsed=624ms

Reproduction

Each case below started at 60 and was reset to 60 before the next case.

Skipped checks without verification

$ ddcutil --bus 9 --skip-ddc-checks --noverify setvcp 10 61
$ echo $?
0
$ ddcutil --bus 9 getvcp 10 --brief
VCP 10 C 60 100

Skipped checks with verification

$ ddcutil --bus 9 --skip-ddc-checks --verify setvcp 10 61
Verification failed for feature 10
    Try errors: DDCRC_VERIFY
$ echo $?
1
$ ddcutil --bus 9 getvcp 10 --brief
VCP 10 C 60 100

Full checks without verification

$ ddcutil --bus 9 --noverify setvcp 10 61
$ echo $?
0
$ ddcutil --bus 9 getvcp 10 --brief
VCP 10 C 61 100

Full checks with verification

$ ddcutil --bus 9 --verify setvcp 10 61
$ echo $?
0
$ ddcutil --bus 9 getvcp 10 --brief
VCP 10 C 61 100

Verification retry result

The hidden verification retry option succeeds consistently.

$ ddcutil --bus 9 --skip-ddc-checks --verify --i5 2 setvcp 10 61
$ echo $?
0
$ ddcutil --bus 9 getvcp 10 --brief
VCP 10 C 61 100

Three consecutive tests produced these results.

target=61 status=0 elapsed=624ms
target=62 status=0 elapsed=625ms
target=60 status=0 elapsed=623ms
final_observed=60

By contrast, two separate commands do not reproduce that success.

first_status=1 second_status=1 observed=60 target=61 elapsed=634ms

Both commands in that test used --skip-ddc-checks --verify without --i5.

Other tests

Forcing MCCS 2.2 did not help. Disabling dynamic sleep with fixed multipliers of 1.0 and 2.0 did not help. Every test that retained --skip-ddc-checks left the value unchanged unless --i5 2 was used.

Observed timings were approximately 113 ms for skipped checks without verification, 317 ms for skipped checks with verification, 932 ms for full checks without verification, and 1137 ms for full checks with verification.

Expected behavior

A verified Set VCP request should either apply the requested value or expose a supported retry mechanism that can recover without repeating full initialization on every CLI invocation.

Would it make sense for ddcutil to retry once after a verification mismatch in this case? If automatic retry is undesirable, could the verification retry count receive a stable public option instead of requiring the hidden --i5 option?

The downstream report is omacom/omarchy#8931.

I found #514, but that report appears different because skipped checks generally helped there while full checks failed.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions