You have to be very careful when you don't use the RCCE API to modify the voltage and frequency. You can put the chip into a state that causes actual hardware damage. The RCCE API protects you from that possibility.
You can look at the RCCE source code and see what it does. When you change the voltage, you are restricted to changing the voltage in a voltage domain. But you can get a finer voltage control by setting bits 7:0 in the voltage control register. Bits 7:0 are called the VID, and it has 256 values. Each step is 6.25 mv. But it will max out ... it won't let you set a voltage higher than 1.3v. Look at the EAS (Section 5) for more information.
What you can do with the frequency (programatically) is also described in the EAS, Section 4.
There is the possibility of some additional frequency control through the JTAG interface. When you train, you get the following choices ... for tile, mesh, and memory frequency.
Please select from the following possibilities:
INFO: (0) Tile533_Mesh800_DDR800
INFO: (1) Tile800_Mesh1600_DDR1066
INFO: (2) Tile800_Mesh1600_DDR800
INFO: (3) Tile800_Mesh800_DDR1066
INFO: (4) Tile800_Mesh800_DDR800
INFO: (others) Abort!
Make your selection:
The choices come from the files in /opt/sccKit/current/setting. You can add other choices to the sccBmc list by writing your own *.rlb files. When you do this, you are controlling frequency through the JTAG interface. This is not something I'd recommend doing. In fact you can't do it yourself on a data center system; you'd have to have your own MCPC/Rocky Lake system.