I’m not really the guy to run on unlimited supply of patience, so this will be more a mix of tutorial, tool to do the job for you, assistance (“as long as you don’t insist with unlimited/unrelated questions” kind) and ABSOLUTELY NO GUARANTEES. Users should read this again, I am not offering any kind of assurance that this will work for each and one of you; it might work for 99 users and the 100th could get his GPU toasted, so please take this as a disclaimer and don’t pretend you didn’t knew what risks were involved. I tend to check my work and hate when something goes wrong, but I’m not a machine and I don’t own every GPU to make sure it will work every time.
If you are interested in this thread, then you should know a thing or two about GOP. If you need/want pure UEFI Boot (CSM disabled) or Fast Boot, then you need a GOP for your GPU/iGPU, otherwise it is optional (for now). For the iGPU side there is not much you can do, because manufacturers have included them in the UEFI firmware, with GOP drivers from Intel, AMD, ASPEED, Nvidia (recently) and even Matrox. This thread only deals with external cards and only with AMD and Nvidia. This is further limited by the fact that only specific generations have GOP support: for AMD there is a list of IDs in each GOP version, but it is safe to assume that every card after 7xxx generation should work, maybe even 6xxx; for Nvidia there are 6 generations supported - GT21x, GF10x, GF119, GK1xx/GK2xx, GM1xx, GM2xx.
The current situation is that the cards still have a legacy ROM part, which makes it a hybrid firmware. I think the legacy part still stores the important settings and voltages/frequencies, so don’t expect a GOP update to fix any bugs you might have. Don’t take the risk for anything other than UEFI Boot/Fast Boot. The AMD GPU firmware is formed from a Legacy ROM + an optional GOP in a compressed EFI ROM + possibly a microcode, although extremely rare. Only the Legacy ROM is checksummed, the checksum byte being the one after IBM string, offset 0x21. The Nvidia GPU firmware is formed from an optional IFR header + a Legacy ROM + an optional GOP in a compressed EFI ROM + some optional Nvidia images with signature 564E (Nvidia NBSI/ISBN for signing, Nvidia HDCP, Nvidia x86 extension). Apart from the IFR header, all other Nvidia images are checksummed, the last byte being the checksum byte. A special care for Nvidia is recommended, since it is using some extended headers. This is the normal PCIR structure, found in every ROM, not just GPU.
Apart from the PCIR structure, Nvidia is also using NPDS (Nvidia PCI Data Structure), RGIS (dummy structure, maybe reversed SIGR?), NPDE (Nvidia PCI Data Structure Extended).
This way, Nvidia can have the EFI ROM marked as last image in PCIR/NPDS, while still having the last image bit cleared in NPDE, for special images linking. To get your GPU firmware, also called VBIOS for many years, you can either check the manufacturer for a download link, or dump it using GPU-Z, or dump it yourself using nvflash. The VBIOS file has to be updated, for your own sake. The flow should be like this: 1. - get the dump from your current card by using GPU-Z (novice) or nvflash (advanced); 2 - check the manufacturer for an updated VBIOS; 3 - check with techpowerup database. Users should decide if they want to keep the current VBIOS and only update the GOP, or go for the one on manufacturer site, if it is newer than their own. The techpowerup database should be used only as a last resort and only if it is a newer version and ONLY IF it is compatible with your card. Otherwise you might flash a wrong VBIOS and blame my tool, when it was you who made a big mistake in the first place. As a recommendation, always update the GOP of an already flashed VBIOS, so you can rule out a bad flash.
Here is how to add/update the GOP section, if you want to do it by hand:
- make sure the last image bit in Legacy ROM is 0.
- fix checksum of Legacy ROM.
- add/replace EFI ROM after Legacy ROM.
- make sure the EFI ROM has the same ID as the Legacy ROM.
- Nvidia only: determine if legacy images are stored in one container - if so, add EFI ROM after this container, than set last image bit in Legacy ROM and last special image to 0, fix the checksum of changed ROMs.
- Nvidia only: determine if the last image bit in NPDE of EFI ROM must be cleared or not - 0x00 if special images follow, 0x80 otherwise.
- Nvidia only: fix the checksum of EFI ROM.
- if your VBIOS comes from a dump, you must remove the end padding, so that the flasher doesn’t complain about the big size of the file.
- make sure you don’t remove extra data when removing padding.
- make sure the new size is not a problem. To do so, check the size of the VBIOS dump = this is the size of the chip.
To my knowledge, there is already a similar tool, with some disadvantages:
- you need a Mac OS.
- you need to find the right EFI ROM by yourself.
- it uses EfiRom for glueing parts, but EfiRom doesn’t add the AMD/Nvidia extended EFI header. This is especially bad for Nvidia.
- it uses the checksum byte as always last. Wrong for AMD.
- it doesn’t account for Nvidia IFR header.
- it doesn’t remove end padding from dump.
- the advantage is that it is properly codded.
Here is the difference between original EFI in ROM and the one resulted from EfiRom:
The image is not entirely right. It was taken with only the first strip of arguments, thus the different PCI revision and class code. The other two strips are the ones to be used for AMD/Nvidia. But the essence is the same, the extended headers are missing.
If you do decide to use GOPupd, keep all the files in the archive. The only optional are the ones related to the main bat. If you have Python 3.x installed, you will need GOPupd.py and you can remove GOPupd.exe, GOPupd.zip and the three dlls. If you don’t have Python installed, the GOPupd.bat will switch to use GOPupd.exe, GOPupd.zip and the three dlls. The #ROM_Info folder stores the files needed for #xxx_ROM_Info.bat files, #GOP_Files stores the compressed EFI ROM files, cecho is used only for the coloured output of a few lines in bat, #xxx_ROM_Info.bat offers details about a VBIOS file, UEFIRomExtract is used for decompressing the EFI ROM.
Edit: for a smooth experience, please unpack the archive to a folder outside your regular download folder. Make sure the name of the folder doesn’t have any strange characters. Place your VBIOS in this folder and again make sure the name is not made of special chars, keep it as simple as possible. Also, when I say drop xyz on the *.bat file, I really mean dropping the xyz on the *.bat file, not on the window it is opening.
The VBIOS file has to be latest version, for your own sake. The flow should be like this: 1 - get the dump from your current card by using GPU-Z (novice) or nvflash (advanced); 2 - check the manufacturer for an updated VBIOS; 3 - check with techpowerup database. Users should decide if they want to keep the current VBIOS and only update the GOP, or go for the one on manufacturer site, if it is newer than their own. The techpowerup database should be used only as a last resort and only if it is a newer version and ONLY IF it is compatible with your card. Otherwise you might flash a wrong VBIOS and blame my tool, when it was you who made a big mistake in the first place. As a recommendation, always update the GOP of an already flashed VBIOS, so you can rule out a bad flash.
To work with GOPupd, you just drop the VBIOS file on GOPupd.bat and follow the instructions. There are two limitations: AMD GOP has some IDs inside, so I compare your VBIOS ID with the ones inside - if there is not a match, I compare it with an older GOP that has more IDs; Nvidia GOP is architecture based - in case I can’t find the GOP variant, the user must select from 6 choices - use GPU-Z or HWiNFO or AIDA64 or any tool/site to find your card architecture. To check that everything went fine, you first read the messages from screen. If you see a red warning with “[…] Please report it!” - this a clear sign that something went wrong and a report is helpful. It can be something as simple as OEM related data added at the end of VBIOS (saw a few samples from MSI and Asus with a DJH block at the end), or it can be something really important that needs a specific location. Even if you get an updated file, you still have to double check: drop the original file on #AMD_ROM_Info.bat or #Nvidia_ROM_Info.bat, then do the same with the updated file. If you don’t see a similar output, with the differences being the size, CRC32 and obviously the GOP, then be wise and report it. I noticed that Nvidia trusts more in the data from NPDE rather than PCI DS, so there is one particular case where I need users to test some things, but this is rather limited, so I would rather discuss it when it happens.
DO NOT use the files from #ROM_Info folder for flashing your GPU! It was not my intention to add the files for flashing purposes, they are present only for dumping info from ROM files, not to mention that the AMD flasher is stripped down from several dlls and the Nvidia one is 32 bit only. A link to the AMD/Nvidia flashers is in the second post and was added only as a courtesy. If a user is not accustomed with flashing his GPU, he/she should not proceed with this GOP update.
Even if you don’t want to update your GOP, it will still be nice to run the script and check your GOP version, maybe you can find a new GOP. Or maybe you can find new bugs to report. If you decide to update your GOP, please post your intention and the following requirements:
- a screen of the tool, so I know that it worked as intended and that you run it the way it was meant to be.
- a link to the original VBIOS, so I can have something to work it.
- a hash of the updated file or the updated file, so I can produce an updated file on my PC, manually check it, then compare the CRC.
Do not bother to post unless you provide the above. I have tried to be nice and users just skipped to the request. This is a safety measure, to be sure that users have used the tool appropriately and that the tool worked flawlessly. I will consider removing the restriction only when there will be a large base of successful reports.