[Report] GA-990FX-Gaming (Rev.1.0) Bios with nat.4G Decod.+Rebar

After months of trying, countless hours in Ghidra, around 26 executable patches, a full DSDT recompilation, and the creation of an independent orchestrator module injected into the BIOS… I was finally able to load a model and run inference natively on this motherboard.

Specs:

  • CPU: AMD FX-8350

  • GPUs: 2x Tesla P100 (16GB) + 1x Intel Arc A770 (16GB) + 1x AMD FirePro W9100 (16GB, on a PCIe 1x riser)

  • RAM: 16 GB DDR3

The primary aim was to run AI inference using whatever scrap hardware I had lying around, especially considering current RAM and SSD prices. I had a stash of older GPUs (like a FirePro S9170 already modded for vertical cooling, a GTX 1660, an RTX 2060, etc.). So the goal was to make them all work together using an old 990FX motherboard and an FX-8350.

The first steps weren’t easy, but with a bit of kernel tweaking, I was able to run some small models, given the amount of VRAM (around 40GB). Then I got my hands on two Tesla P100s and an Arc A770… and that’s when the war started.

I started with what I could find online about the 990FX chipset, but there wasn’t much about my specific motherboard. I had to turn my brain on and start from solid foundations, like xCuri0’s ReBar modules. (xCuri0, if you are reading this, you are my hero. My custom module uses your GUID in your honor). I don’t even know how to explain everything I’ve done over the last 3 months without writing a full research paper.

In the beginning, with the P100s installed (with the pins taped), the system booted normally, but the motherboard absolutely refused to assign the BAR to the GPUs, and the Arc A770 was trapped with only 256MB of assigned space. When I tried injecting the xCuri0 module, the only thing I got was a 00 POST error code.

Then I brought out Ghidra, AMI tools, UEFITool, and UEFIPatch, and kept going with several EXE patches. I even patched the AMD AGESA module. I gave it my best shot, ending up with more than 20 EXE patches, systematically modifying the 4G limits and other constraints inside PCIBUS, CSMDXE, PCIROOTBRIDGE, AMD BOARD INFO, and the AMD AGESA DXE DRIVER. But all I got was being permanently stuck on the d4 error code for a very long time.

At one point, I was so desperate that I completely dumped the ACPI DSDT table. I found that the code for 64-bit PCI compatibility was completely absent, so I rewrote the PCI0 tables, recompiled them (which took massive effort), and re-injected them. This alone wasn’t enough, but it ended up being an essential piece of the bigger picture.

As a final effort, I decided to build my own module that acts as a complete orchestrator, As a final effort, I decided to build my own module that acts as a complete orchestrator, heavily inspired by the xCuri0 ReBar module (but with over 2,000 lines of custom code). As you can see in the screenshots, I did a before/after test: pci=realloc doesn’t change anything—the custom BIOS mod does all the real work.

What my module does, in summary (extremely short):

Dynamic DSDT (ACPI) table patching: Instantly modifies the ACPI tables in memory (setting a variable MALH=One) to inform the operating system that a 64-bit memory window (QWordMemory) is available for use.

Preliminary Northbridge programming (CPU NB MMIO): Attempts to open at the CPU level (on the AMD Northbridge) the “windows” (Window 1) necessary to route communications to such high memory addresses.

Pre-scan and Link Disable (The concealment): Even before the normal BIOS inventories the connected PCI devices, this module scans everything. If it finds devices with massive memory requests (> 4GB, typically the Tesla P100s or compute GPUs), it temporarily pulls the plug on their PCIe bridge (Link Disable). The BIOS will believe those slots are empty (VID=0xFFFF), skipping them entirely and preventing errors. However, it takes care not to hide the primary video card (Intel Arc) to ensure something appears on the screen during boot.

PCI Enumeration Hook (PreprocessController): While the BIOS is configuring the remaining powered-on devices, the module intercepts these communications. In this way, it can handle the ReBAR for the primary video card (the Intel Arc), but deliberately refrains from applying aggressive “quirks” to the PCI bridges which, if done during the BIOS phase, would cause a black screen.

ExitBootServices (The final awakening for Linux): One Moment before control passes from UEFI to Linux (ExitBootServices), the module performs its final magic:

  • Definitively forces the CPU’s MMIO memory window (from above the RAM up to 256GB).

  • Opens the chipset’s HyperTransport “gates” (SR5690 HT Gate).

  • Applies the 64-bit prefetchable fixes to all PCIe bridges.

  • Reactivates the PCIe Link of the previously hidden GPUs.

  • Waits for the GPUs to respond (Link training) and finally programs their BARs above 4GB.

Not everything is 100% stable yet, but I’m working hard on it. Once everything is finalized, I will publish the module and documentation on GitHub. I’ll also post some inference benchmarks soon, as soon as the setup is fully dialed in.

Since new accounts can only post one image, here is the full gallery with all the terminal outputs: https://imgur.com/a/results-nyGocos

@XscannedX Wow, im impressed with your own research!

Does this mean, if the bios is running at Full UEFI (CSM Disabled, and additionally secure boot keys installed + enabled), it exposes the whole range of the 64 bit PCI Resource, which now it just explicitly use whatever the cpu supports (i think AM3/+ and FM2/+ uses 48 bit of Physical Address Range iirc), eliminating the need for Above 4G Decoding, since we know that some AM3/+ and FM2/+ UEFI Bioses lack Above 4G Decoding (and maybe potentially the same thing was able to be done on Intel 8 series chipset OR some 9 series that lack it)?

Does this work on linux only since dsdt patch and load it to the kernel without bios flashing at all will work on linux, or it could be done on windows too?

First of all thanks a lot, this is the first work that I am publishing, so be kind if my post lacks precise data, I’m not used to publishing stuff on the web. Answering your questions, this MB in particular doesn’t just lack 4G decoding, but completely lacks the 64-bit code even in the DSDT. From the data I could gather, the 990FX (SR5690) was used to run the Opteron at 48 bit in old datacenter motherboards, so yes. In theory I haven’t eliminated the need for 4G decoding, I simply hardcoded it. Regarding Linux, I haven’t used initramfs or other stuff for the DSDT, I directly (driven by desperation xD) dumped the AML, decompiled it, inserted the code for the QWordMemory with the related values, recompiled it, made an FFS and I directly changed the PE32 image in the BIOS, so even the DSDT patch is hardcoded. So once I finish testing all the inference parts on Linux, I will try if everything works on Windows. For Intel series 8 and 9 sincerely I dunno, in theory xCuri0’s module should do the job on these Intel series. I calibrated the module specifically for the 990FX at the moment.

@XscannedX
Welcome to the Win-Raid Forum and thanks for your input!
Unfortunately your chosen thread title is much too long. Please shrink it to a maximum of 3 lines. All details are readable within the intitial post. So there is no reason to put them into the title.

1 Like

Thanks a lot. Done, hope now could be ok.

I apologize for the language issue.
Great, this can be done for an Asus m5a97 evo r2.0. I’d like to know which patch I would need to use and if you could help me, thanks.

Hi, sincerely i dont know, or surely not without modify the original code. Im preparing the official release on github, once i’ve done that you’ll be free to get the module and modify it for a 970 Chipset.

Official first release on github. GitHub - XscannedX/990fxOrchestrator: This is a bios module that natively inject 4G decoding and ReBar logic on a 990fx Chipset. Be sure the read all the documentation before proceding flashing your bios and do other stuff. THIS IS NOT A OUT OF THE BOX READY TO WORK PRODUCT; (unless you share my same configuration). · GitHub

3 Likes

Hello

I have a few questions.

Is this the original F2 BIOS?

https://www.gigabyte.com/ua/Motherboard/GA-990FX-Gaming-rev-10/support#Support-Bios

Because the patch ‘# AGESA descriptor flag tweak (0x808A2B → 0x008A2B)’ cannot find this sequence.

Or is this a patch that needs to be applied after replacing AmiBoardInfo_ftp39.pe32.bin?

I can see that the DSL file is easy to compile for other Gigabyte AM3+ motherboards.

They’re very similar.

Do you know which variable enables the “Above4G decode” in the Gigabyte BIOS?

I can see that you’re forcing this feature to be enabled via patches.

P.S. When I was experimenting with the 970A-DS3P, the ‘vanilla’ rebar efi-module worked with the Radeon RX580. Mind you, only with the 1GB size.

It seems there just weren’t any patches available for ‘Above 4G’.