TLDR: fix is forced bios flash underclock on default memory clocks
So on my Win8.1 r9 290x I tried to update to the latest Crimson drivers (mind you I haven't updated for 1+ year), and then the dreaded black screen crash on installation, then crash every logon. I can recover by booting into safe mode and using DDU to uninstall Crimson and GPU drivers and going back to microsoft basic display adapter.
Looking at threads such as Re: AMD Display Drivers causing black screen freezes after windows 10 login (and before if enabled before) and To people who have instant Black Screen or Freeze on installing ANY AMD driver 50+ forum pages of this exact issue, and no one has solved it.
I'm lucky I had my old Win7 partition still active with 2013 CCC drivers, but my GPU would run fine on that without crashing!?! However it turned out it wasn't the old 2013 driver which allowed my GPU to run as I tried it on Win8.1 and still crash. I remember I underclocked the card in Win7 to keep it silent/cool last year, this in turn lead me to test some theories. And guess what happened when I reverted to stock clocks on Win7? It crashed! Exactly the same as the Win8.1 Crimson upgrade, and after reboots just before Windows logon screen.So what happens on an installation of your GPU driver, your clocks are set back to default!!! Probing the clocks even further on my working Win7, my GPU clock could revert to stock 1000 MHz fine and even overclock to 1300MHz. HOWEVER my memory clock couldn't even approach 1100 MHz before it would crash, and default memory clock for 290x is 1250MHz. So it looks like a memory controller problem, no wonder in those threads above AMD doesn't knowledge it, my theory is that it's a manufacturing issue with lower quality control on the silicon purity or something along those lines.
Fortunately this can be resolved, by UNDERCLOCKing your card, and least being able to use it once again. But you can't software underclock it like my Win7 machine, as most of yours will have the Crimson software and drivers uninstalled so default clocks are back, so software is out of the window. What remains is a forced BIOS underclock on the GPU.
The following is not for the faint of heart (: It requires extracting the BIOS from your card, and I luckily found what I presumed to be the GPU clock and memory clock default values used, patched those bytes and flashed the bios back. This is why most people haven't solved the issue, it's at the bleeding edge of overclocking
How to underclock via BIOS flash:
Disclaimer: This voids your warranty, and could potentially brick your GPU - not very likely though as we're not changing voltage, or clocks too drastically (:
1. Download GPU-z https://www.techpowerup.com/gpuz/ and extract bios (the circled blue button).
* Also notice the default clock values (green), this is with my successfully underclocked bios. Yours probably says GPU 1000 MHz, MEM 1250 MHz
2. Download AtinWinFlash https://www.techpowerup.com/download/ati-winflash/ (I personally had success with 2.6.7 on Win7).
* Other forums recommend AtiFlash using a bootable WIN98 DOS USB, unfortunately the AtiFlash software doesn't work for modern cards such as r9 290 and above. Hence the latest released tool is called AtiWinFlash and for Windows NT machines (Windows 2000+), and that worked for me.
* So if unlike me you don't have another OS, just boot into safe mode and DDU uninstall all the drivers, so your card uses microsoft basic display adapters when you next reboot.
3. In the AtinWinFlash folder, open an admin cmd and identify your GPU atiflash.exe -i
* Notice the adapter number in the output, mine is 0
4. Make another backup of the BIOS via the atiflash tool (you can never have enough backups) and to prove it works using your adapter number (mine is 0): atiflash.exe -s 0 backup_bios.rom
5. Now it's time to patch our bios (don't use anyones premade bios, patch your own and use it to be most safe).
* Their is an easy tool to find bios info called HawaiiBiosReader https://github.com/OneB1t/HawaiiBiosReader but it only supports (290, 290x, 295x, 390, 390x, FirePro W9100, FirePro W8100).
* For those with a supported card modify the MEM Clock 1 and MEM Clock 2, and set them to a lower rate. I set them to 900, and 800. I presume the default values are GPU Clock 1, and MEM Clock 1. So any new installation of drivers, would jump to those clocks initially. Then hit "save file" at the top, place it in same folder as AtiWinFlash name it underclock_bios.rom, and it will calculate the new CRC for you and fix up other values automatically in your new bios.
* If you don't have one of those cards, you would unfortunately need to find the offsets yourself and manually patch the bytes in a hex editor like HxD https://mh-nexus.de/en/hxd/ (explained in appendix 1 at end)
6. Flashing the bios back to the GPU, this is the riskiest part.
* We're flashing the bios live, crazy *_* but the recommended WIN98 bootable usb doesn't work for modern GPU as I mentioned, so we have to do it live, and hope.
* Close anything graphically intensive, ideally load this page up from your mobile, disable your antvirus, close the browser, just close all open applications, as you will be reboot after anyway.
* It takes a few mins after you have executed the command, so be patient, and your screen may flicker like crazy:
* My adapter number is 0
atiflash.exe -p 0 underclock_bios.rom
* Sorry I didn't use my own screenshot, but this is same output I got:
* Note: If the flash output gives you a SSID check error, you can try a force flash with the force flag "-f", but don't try it with other errors as this has a high chance of bricking due to bad bios flash:
atiflash -p 0 -f underclock_bios.rom
* If you get error: "Failed to read ROM ERROR 0FL01 : press '1' to continue". You need to unlock the rom of the chip for writing:
atiflash -unlockrom 0
7. Hopefully your flash succeeded, and reboot. Now try to install those AMD drivers again, and I wish you luck!
* If it still crashes on driver installation/win logon, you could try lowering you GPU clock too, and set MEM clock even lower.
* If you totally can't boot because of a bad flash, all hope is not lost. You can plug your monitor cable into your onboard graphics, or get a spare GPU and plug it into pcie slot 1 and connect the monitor to it, while keeping dead gpu in another pcie slot. Then load back into Windows, and using atiflash.exe -i to find your dead GPU adapter (probably a different adapter number now), then flash your backup bios onto it, and it should at be revived at least.
I hope I helped some of you. Like and comment (:
- Patching bios via HxD, because your card is not supported by hawaiibiosreader
- GPU clock 1 and MEM clock 1, sit together as 24bit values. Well I think they're actually a WORD size 16 bit, but with a NULL terminator of 8 bits
- So GPU clock = 1000 (decimal), append the NULL 00 at end to make 100000
- Convert it to hex = 0x186A0 (windows calc will miss first 0 off), but it's actually 0x0186A0
- But since GPU uses little endian format (bytes revered) in bios it will be written as: 0xa0 0x86 0x01
- Do same for MEM clock = 1250 (decimal). Append NULL = 125000. Hex = 0x01E848. Little endian = 0x48 0xe8 0x01
- Now as I said, the clocks are together so we search for in HxD, only 1 occurrence: Search (at top) -> Find -> (Hex values): a0 86 01 48 e8 01
- Now I want to patch a 1000 MHz (GPU clock) and 900 MHz (MEM clock), so create the hex first:
- GPU: 1000 (decimal), append null 10000, hex 0x0186A0, little endian: a0 86 01
- MEM: 900 (decimal), append null 90000, hex 0x015F90, little endian: 90 f5 01
- Now in HxD write it in by double clicking bytes. Notice my bottom file is patched:
- Typically you to need to fix the 16bit checksum for bios changes, but in our case it doesn't change due to the algorithm only changing for new bytes added. The atiflash tool has a checksummer:
- But if you need to append GPU Clock 2, and MEM Clock 2 (as it's 1250 as well). Then it's possible your checksum will need to be updated. Now I could explain how to correctly append junk data to the end to generate the correct checksum, but simply you can use "-f" force flag in your flash write command, and it write regardless of checksum mismatch (: