I found something that might fix the data corruption on the i2c bus, and some freezes/crashes.
Try to add that to xorg.conf or xorg.conf.d:
Section "Device"
Identifier "Device0"
Driver "nvidia"
Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100"
EndSection
These 2 “registry keys” come from the binary blob (“strings nvidia.ko | grep -i i2c”), they are part the same list as other documented keys which are used with the “RegistryDwords” option. RMI2cSpeed seems to be in KHz, but that’s just a guess because 100 works very well (DDC/CI standard speed is 100KHz) with the least data corruption (compared to 33, 200, 400 or no value set).
There is also a RMUseHwI2c which adds an i2c-device but makes ddccontrol crash.
I also had to recompile ddccontrol after increasing the value of the DELAY macro from 45000 to 50000 in the file src/lib/ddcci.c because there was some leading zero bytes before the actual DDC response.