Due to recent events I have decided to forego bashing my head against the wall with windows 10- My alternative being the Linux based SimpleMining OS.
So far I am a huge fan of it. One (huge) weakpoint is that undervolting just doesn't work on it for reasons that I at one time had read but have now forgotten. Because of this, I am forced to deactivate one of my GPUs or exceed my 1200W PSUs capacity.
I have searched around for the past few days now and have found a few posts/tutorials on editing the BIOS in a hex editor that touched on the subject, some more than others, but none were comprehensive enough to strictly cover undervolting.
I've gotten as far as finding the 'VoltageObjectInfo' section of my bios and adding the voltage offset register(8D 00)using ATOM Bios reader and HxD/HexWorkshop, but past that I am stuck as far as what to do as far as adding something to bring my voltages down to the 900 mV for the core and clock that worked for me through Wattool when I was on windows.
Can anyone give me a hand?
Tutorials I've found useful so far-
Anorak Tech AMD VBIOS Hex Modification TutorialAdding VDDC offset to Fury X ROM
Comments
I recall reading something from wolf0 about it, but can't recall where it was. Link me?
What are you stuck on?
I've been running modded cards on Win7 and 10 (both 64 bit). Zero issues. The only issues I had was due to greedy tuning. Since your rig has been running fine on Linux and you can't undervolt, I can only assume that perhaps your windows undervolt settings for the cards were a bit over the edge hence the frustration over the instability?
I'm not new to working with hardware at a low level but I am new to doing it for GPUs
It wasn't due to the card tuning at all. The last straw was when windows randomly, with no interference from myself, forgot where the onboard LAN was(works fine on linux.) Following that it just didn't see two of my cards anymore. Other than that I am just tired of dealing with endlessly installing/uninstalling drivers, patching, clock settings not sticking, CPU overhead, etc.... It's the least elegant solution to mining IMO. Nothing I couldn't have troubleshot, but I felt it wasn't the best use of my time when there are alternatives out there.
Of course, you'd have to do it by paw with a hex editor, but that should show you the basic idea. The ID in that one is 8 - which means CHL822x, but ironically always means IR3567B or compatible. Other ones you can ID this way is 16 - NCP81022. And so on. It's not 100%, but in a pinch, it works.
Command Tables:
0000: ae26 Len 0085 (ASIC_Init)
0001: aeac Len 0057 (GetDisplaySurfaceSize)
0002: af04 Len 00b7 (ASIC_RegistersInit)
0003: cbfe Len 009e (VRAM_BlockVenderDetection)
0004: d698 Len 0267 (SetClocksRatio/DIGxEncoderControl)
0005: afbc Len 010b (MemoryControllerInit)
0006: - (EnableCRTCMemReq)
0007: cc9c Len 001a (MemoryParamAdjust)
0008: - (DVOEncoderControl)
0009: b0c8 Len 00ff (GPIOPinControl)
000a: b1c8 Len 0193 (SetEngineClock)
000b: b35c Len 0122 (SetMemoryClock)
000c: b47e Len 04cb (SetPixelClock)
000d: b94a Len 0187 (DynamicClockGating)
000e: bad2 Len 0007 (ResetMemoryDLL)
000f: bada Len 008a (ResetMemoryDevice)
0010: d40e Len 0031 (MemoryPLLInit)
0011: d440 Len 0010 (AdjustDisplayPll)
0012: beee Len 0111 (AdjustMemoryController)
0013: c000 Len 0021 (EnableASIC_StaticPwrMgt)
0014: c022 Len 008e (ASIC_StaticPwrMgtStatusChange/SetUniphyInstance)
0015: - (DAC_LoadDetection)
0016: - (LVTMAEncoderControl)
0017: - (LCD1OutputControl)
0018: - (DAC1EncoderControl)
0019: - (DAC2EncoderControl)
001a: - (DVOOutputControl)
001b: c0b0 Len 02bf (CV1OutputControl)
001c: - (GetConditionalGoldenSetting/SetCRTC_DPM_State)
001d: - (TVEncoderControl)
001e: e050 Len 0096 (TMDSAEncoderControl)
001f: e0e6 Len 0189 (LVDSEncoderControl)
0020: - (TV1OutputControl)
0021: c370 Len 0078 (EnableScaler)
0022: c3e8 Len 0074 (BlankCRTC)
0023: c45c Len 003e (EnableCRTC)
0024: - (GetPixelClock)
0025: c49a Len 002c (EnableVGA_Render)
0026: c4c6 Len 0022 (EnableVGA_Access/GetSCLKOverMCLKRatio)
0027: - (SetCRTC_Timing)
0028: c4e8 Len 0019 (SetCRTC_OverScan)
0029: c502 Len 0080 (SetCRTC_Replication)
002a: c582 Len 00c6 (SelectCRTC_Source)
002b: c648 Len 01af (EnableGraphSurfaces)
002c: c7f8 Len 004e (UpdateCRTC_DoubleBufferRegisters)
002d: c846 Len 0090 (LUT_AutoFill)
002e: e66a Len 02f9 (EnableHW_IconCursor)
002f: c8d6 Len 003d (GetMemoryClock)
0030: c914 Len 00d8 (GetEngineClock)
0031: c9ec Len 0153 (SetCRTC_UsingDTDTiming)
0032: - (ExternalEncoderControl)
0033: e356 Len 01d1 (LVTMAOutputControl)
0034: cb40 Len 00be (VRAM_BlockDetectionByStrap)
0035: e59a Len 00cf (MemoryCleanUp)
0036: ccb6 Len 0231 (ReadEDIDFromHWAssistedI2C/ProcessI2cChannelTransaction)
0037: e270 Len 00e5 (WriteOneByteToHWAssistedI2C)
0038: cee8 Len 005f (ReadHWAssistedI2CStatus/HPDInterruptService)
0039: cf48 Len 000a (SpeedFanControl)
003a: cf52 Len 000a (PowerConnectorDetection)
003b: cf5c Len 003c (MC_Synchronization)
003c: cf98 Len 017b (ComputeMemoryEnginePLL)
003d: d114 Len 0007 (MemoryRefreshConversion)
003e: d900 Len 0029 (VRAM_GetCurrentInfoBlock)
003f: d11c Len 0165 (DynamicMemorySettings)
0040: d282 Len 0100 (MemoryTraining)
0041: d382 Len 008c (EnableSpreadSpectrumOnPPLL)
Here is my VoltageObjectInfo section as well, if it is somewhere near there
I see a couple '10's and on '08' which I read had something to do with the actual offset?
It looks very similar to previous HD 7*** voltage schema.
Just count 6 bytes. For example
00 80 10 00 E8 03
that marked in red on your screenshot
last two E8 03 - hex voltage encoding. It needs to be reverted to 03 E8 - mean 1000 (decimal) or 1.000 V
first four 00 80 10 00 - data for VRM to be set to have 1.000 V on GPU.
B6 03 - 03 B6 = 950 = 0.95 V and so on.
If he listened to you, he might brutally murder his GPU and maybe die in the resulting house fire. :P
@CryptoTenny
You need to parse the table - first part is the table header all tables have, 2-byte size, 1-byte format revision, 1-byte content revision. Assuming you're working on an RX card, it should be format revision 3, content revision 1.
Now, parse each voltage object in turn... 1-byte type, 1-byte mode, 2-byte size. If it's not mode 3, it's not an init regulator section, and not what you care about. When you find one, it should be of type 1, which is core voltage. If you see one that's mode 3 & NOT type 1, show me that shit! Cause that'd be hella interesting.
Anyways, once you've found your desired voltage object (one of type init regulator) the rest of the voltage object goes like this (NOTE: only applies to mode 3): 1-byte regulator ID, 1-byte I2C line, 1-byte I2C address (this is in 7-bit format, shift right by 1 to get 8-bit format), 1-byte control offset, and 1-byte flag (indicates whether regulator eats 1-byte or 2-byte codes.) After this, is three reserved bytes, probably to align the I2C table by a dword (4 bytes.)
From this point, you have an I2C register, zero byte, I2C code to be written, zero byte... repeat. This table is terminated with the sequence 0xFF 0x00 (but you can also tell by checking the size of the voltage object, as I detailed earlier.)
For IR3567B & compatible, the offset is a signed byte - meaning two's complement - which is why Jukebox's advice could have been fatal. The offset format is x * 6.25; example: 0x04 is +25mV, while 0xFC is -25mV.
I was wrong, the table only looks like, but it's too short.
Now trying to follow to your manual.
Appreciate all the detial- Thanks. So this is what I got from all the info you gave me. Does it look right?
So from what I gathered, I need to be looking for a 0x01 03 for init regulator, which I could not find in my voltage object info as defined by the offset/length my ATOM reader .txt file. Is there somewhere else I should be looking?
I built a few NVIDIA rigs on Linux that let me set power ceilings with nvidia-smi. Dead simple. For some reason I saw opportunity with a shipment of RX470s offered to me for a decent price, so I bought 57 of them! All the watchdog and reporting work in Linux was gone after my 6th night in a row of trying to get it all to work. I f'in hate these cards with linux and 7 slot mobos! Onto Windows I regrettably went.
Anyway, I am trying to get a memory voltage in VBOIS. If I can get this done I can migrate back to Linux and that would make me very happy.
My cards are: "SAPPHIRE Radeon RX 470 11256-31-21G 4GB GDDR5 PCI-E (UEFI) (Built with Samsung Memory) Brown Box Version"
I decoded the VBIOS per your instructions and as follows:
4200030101030E001096200000000000FF0001070C000E0000000000000004002400000400000280100000001000520302000000840302001000B60300801000E803
Table Header
42 00 (size)
03 (format revision)
01 (content revision)
VoltageObject
01 (type)
03 (mode)
0E 00 (size)
10 (regulator ID)
96 (I2C line)
20 (I2C address)
00 (control offset)
00 (flag)
00 00 00 (reserved bytes)
FF (I2C register)
00 (zero byte)
01 (I2C code to be written)
07 (zero btye) ???
0C
00
0E
...
It seems I have found the init regulator (01 03) but thereafter I get lost as the voltage object doesn't seem to follow the pattern you wrote of.
Are you able to offer and advice? At the end of the day I want the memory voltage to match core voltage at 810mv.
Thank you!
The best I can make of it after terminating per your advice is as such:
42000301 01030E00 1096200000000000FF00 01070C00 0E00000000000000 04002400 000400000280100000001000520302000000840302001000B60300801000E803
Table Header
42 00 (size)
03 (format revision)
01 (content revision)
VoltageObject 0
01 (type)
03 (mode)
0E 00 (size)
10 (regulator ID)
96 (I2C line)
20 (I2C address)
00 (control offset)
00 (flag)
00 00 00 (reserved bytes)
FF 00 (terminate)
Voltage Object 1
01
07
0C 00
0E00000000000000
Voltage Object 2
04
00
24 00
000400000280100000001000520302000000840302001000B60300801000E803
Voltage Object 3 ends in the 6-byte string @Jukebox alluded to above, specifically:
00 80 10 00 E8 03
This is interesting as the E8 03 transcribes to 1000mv which is where the memory voltage defaults.
However, I am afraid to edit this down to 810mv because I don't fully understand your criticism of @Jukebox 's original comment (which he seemed to admit was problematic.
I am hoping the I2C "control offset" being 00 means that I can simply edit the E8 03 to whatever 810 is in reverse hex, as there is no offset.
I am happy to do legwork here, but I don't know where to read.
Thanks!
One question as an input to that work. How do I learn which regulator the card has? I see, per your guide, the regulator ID is hex 10. Not sure where to do a lookup on where that's IR3567B or otherwise.
Yeah! You have a uP1637.