Hello,
Recent AMD GPUs have a hybrid ROM which contains two images: A legacy video BIOS (vBIOS) image and a compressed graphics output protocol (GOP) driver image. In theory this allows the card to work well on both legacy systems (which will use the vBIOS image) and more modern systems with a unified extensible firmware interface (UEFI) compatible pre-boot firmware architecture (which use the GOP driver).
However some early UEFI implementations cannot cope with the hybrid BIOS, they try to load the GOP driver and fail, hanging at boot with a blank screen. I have personally experienced this with an AMD RX480 and an Alienware Aurora R3 system (other examples:
RX 480 incompatibility thread on reddit,
R3 with an RX580,
another R3 with an RX480)
It is a particular problem for branded systems with custom motherboards like many systems from HP, Dell, Lenovo etc that no longer receive BIOS updates from the manufacturer and have no options within the BIOS to force legacy mode boot when an EFI module is detected.
Some older video cards have a physical switch on them to swap between legacy and UEFI mode. The RX 480 however has no switch and exposes both the legacy and the GOP images to the pre boot firmware. I found that by modifying the firmware ROM for my GPU to mark the legacy image as the "
last" image it would hide the GOP image and render the system bootable.
Here is what I did (cross posted from the
AMD and Nvidia GOP update thread):
drbob said:
I manually edited the BIOS ROM of my RX 480 to set the last image indicator byte to 0x80 in the PCIR header of the first (legacy) vbios image in the ROM. I found
this table helpful in identifying the correct byte to set (byte offset 0x15 from the start of the PCIR header), as I found the image @lordkag posted at the top of this thread a bit confusing.
The biggest hassle was finding out how to fix the BIOS checksum. I modified a 0xFF byte in the padding at the end of the legacy image to 0x7F (0xFF-0x80=0x7F), thereby compensating for the 0x80 I had added to the total, to make the checksum for the entire legacy image match that of the original. There is probably a better way to do this, but I couldn't work out how the value at 0x21 related to the image checksum. On my RX480 the legacy image occupied offset 0x00 to 0xE5FF
After loading the modified image, my RX480 card no longer hangs at boot in my Alienware Aurora R3 and I can use it normally. Similar mods may well help others with poorly implemented EFI BIOS that can't cope with the GOP image on a stock radeon card.
I was expecting the modification to trigger the AMD driver vbios signature checks and necessitate use of the
AMD/ATI Pixel Clock Patcher driver patch, but with Radeon 18.12.3 at least, this was not necessary.
To perform this fix you will need a system that will boot with the card you plan to modifiy (I had an older legacy BIOS only Q6600 system to hand). I downloaded the firmware of my GPU to a ROM file using
atiwinflash (included with the command line too atiflash.exe, which would also work). I then used
HxD to edit the ROM and verified that the ROM checksum matched that of the original BIOS with atiflash (atiflash.exe -cf <FILE> on both original and modified bios, or load the modified bios into atiwinflash without programming it to the card).
I programmed the modified BIOS to the GPU using atiflash.
IMPORTANT: If you plan to do this - backup your original BIOS first (make all edits to
second copy) and be very careful you are modifying the correct bytes in the ROM, an error could easily brick your GPU.
NOTE: The offsets mentioned in
the table I link above are from the start of the PCIR header. The actual location of this header
will vary depending on your GPU rom, it won't start at 0x00. For example, in the ROM of my RX 480 the PCIR header of the legacy VBIOS image starts at offset 0x254 and the last image indicator byte which I modified from 0x00 to 0x80 is at offset 0x269 (0x254 + 0x15):
Below is an example showing how I modified ROM of my card at offset 0xE568 in the the padding at the end of the legacy vBIOS image to balance the checksum so it would match the checksum of the original BIOS. You can also see the start of the next image (the GOP UEFI driver) which begins at 0xE600:

ALSO NOTE: All the offsets and values mentioned above are in
hexadecimal Don't attempt this unless you understand what that means and what a hex editor is.