ReBarUEFI: Resizable BAR voor (bijna) elk UEFI-systeem

Let op: Indien u een NVIDIA Turing GPU (20- of 16-serie) gebruikt, raadpleeg dan NvStrapsReBar om Resizable BAR op deze kaarten in te schakelen.

Vereisten

  • (Optioneel) 4G Decoding ingeschakeld. Raadpleeg de wikipagina Enabling hidden 4G decoding als u geen optie hiervoor kunt vinden. Zonder 4G Decoding bent u beperkt tot een 1GB BAR (in sommige gevallen 512MB). U kunt proberen dit te verhogen tot 2GB door de TOLUD te verlagen.
  • (Optioneel) BIOS-ondersteuning voor Large BARs. Er bestaan patches om de meeste problemen die hiermee samenhangen op te lossen.

Gebruik

  1. Volg de wikipagina Adding FFS module en doorloop de stappen. Hierin wordt beschreven hoe u de module toevoegt en welke aanvullende modificaties indien nodig zijn.
  2. Zorg er bij het opstarten van de aangepaste firmware voor dat 4G decoding is ingeschakeld en CSM is uitgeschakeld.
  3. Start vervolgens ReBarState (te vinden onder Releases; voor Linux-gebruikers: bouwen met CMake) en stel de Resizable BAR-grootte in. In de meeste gevallen kunt u zonder problemen 32 (onbeperkt) gebruiken, maar het kan nodig zijn om een kleinere BAR-grootte te kiezen als 32 niet werkt.
  4. Indien Resizable BAR bij u werkt, kunt u dit melden in de List of working motherboards zodat deze aan de lijst kan worden toegevoegd. De meeste firmware accepteert ongetekende of gepatchte modules met Secure Boot ingeschakeld, waardoor er geen problemen zouden moeten zijn bij het draaien van bepaalde games.
  5. Bij problemen na het inschakelen van Resizable BAR kunt u kijken bij Common Issues (and fixes).

Hoe het werkt

De module wordt toegevoegd aan het DXE-volume van de UEFI-firmware, zodat deze bij elke boot wordt uitgevoerd. De ReBarDxe-module vervangt de functie PreprocessController van de PciHostBridgeResourceAllocationProtocol door een functie die controleert op Resizable BAR-capaciteit. Na het uitvoeren van de originele functie stelt deze de grootte in op basis van de ReBarState NVRAM-variabele.

De nieuwe PreprocessController-functie wordt later aangeroepen tijdens de PCI-enumeratie door de PciBus-module, die de nieuwe BAR-grootte detecteert en deze dienovereenkomstig toewijst.

UEFI Patching

De meeste UEFI-firmwares hebben problemen met het afhandelen van 64-bit BARs. Daarom zijn er verschillende patches gemaakt om deze problemen op te lossen. U kunt UEFIPatch gebruiken om deze patches toe te passen (te vinden in de map UEFIPatch). Raadpleeg de wikipagina Using UEFIPatch voor meer informatie. Controleer of de pad files niet zijn gewijzigd; indien dit wel het geval is, gebruik dan de workaround.

Werkende patches

  • Verwijdering van de BAR-grootte limiet van <4GB.
  • Verwijdering van de BAR-grootte limiet van <16GB.
  • Verwijdering van de BAR-grootte limiet van <64GB.
  • Voorkomen dat 64-bit BARs worden gedegradeerd naar 32-bit.
  • Vergroten van de MMIO-ruimte van 16-32GB naar volledig gebruik van de 512GB/39-bit range (Skylake/Kaby Lake/Coffee Lake).
  • Vergroten van de MMIO-ruimte van 8-16GB naar volledig gebruik van de 512GB/39-bit range (Haswell/Broadwell). Het probleem waarbij oudere patches beperkt waren tot 64GB is opgelost.
  • Vergroten van de MMIO-ruimte van 16GB naar volledig gebruik van de 64GB/36-bit range (Sandy/Ivy Bridge). Vereist DSDT-modificatie op bepaalde moederborden. Zie de wikipagina DSDT Patching voor meer informatie.
  • Verwijderen van de NVRAM-whitelist om ReBarState GetLastError: 5 op te lossen.
  • Fix voor USB 3-poorten die niet werken in de BIOS wanneer 4G Decoding is ingeschakeld (Ivy Bridge/Haswell/Broadwell).
  • X79 Above 4G Decoding fix.

Bouwen

Gebruik het meegeleverde buildffs.py script na het klonen binnen een edk2 tree om de DXE-driver te bouwen. ReBarState kan worden gebouwd op Windows of Linux met behulp van CMake. Zie de wikipagina Building voor meer informatie.

FAQ

Werkt het op een PCIe Gen2-systeem? Voorheen werd gedacht dat dit niet zou werken op PCIe Gen2-systemen, maar een gebruiker heeft bevestigd dat het werkt met een i5 2500k.

Kan ik Resizable BAR op mijn systeem gebruiken zonder de BIOS aan te passen? U kunt Linux gebruiken met 4G Decoding ingeschakeld; recente versies zullen GPU BARs automatisch herzien en toewijzen. Als uw BIOS geen 4G decoding-optie heeft (controleer ook de verborgen opties) of als de DSDT defect is, kunt u de Arch-wiki gids voor DSDT-modificatie volgen (met aanpassingen uit DSDT Patching) en booten met pci=realloc in uw kernel command line. Momenteel is er geen bekende methode om dit op Windows te bereiken zonder BIOS-modificatie.

Ik heb een niet-ondersteunde BAR-grootte ingesteld en mijn systeem start niet meer op. Wis de CMOS; Resizable BAR zou dan uitgeschakeld moeten worden. In sommige gevallen kan het nodig zijn om de CMOS-batterij te verwijderen om Resizable BAR uit te schakelen.

Zorgen minder dan optimale BAR-groottes nog steeds voor een prestatieverbetering? Op mijn systeem met een i5 3470 en Sapphire Nitro+ RX 580 8GB, met Resizable BAR ingeschakeld in de driver, krijg ik tot 12% FPS-toename met een 2GB BAR-grootte.

Credits

  • @dsanke, @cursemex, @dripsnek, @val3nt33n, @Mak3rde en @romulus2k4 voor het testen en helpen bij de ontwikkeling van patches.
  • De Linux-kernel, in het bijzonder de amdgpu driver.
  • EDK2 voor de basis die alle OEM UEFI volgt.
  • Ghidra, gebruikt voor het patchen van UEFI-modules om kunstmatige beperkingen te omzeilen.
  • @vit9696 voor de NVRAM-whitelist patches.
  • @ZOXZX voor hulp bij de X79 Above 4G patches.
  • @NikolajSchlej voor de ontwikkeling van UEFITool/UEFIPatch.
  • QEMU/OVMF maakten het testen van hooking veel eenvoudiger, hoewel het geen resizable BAR-apparaten had, waardoor testen uiteindelijk op de eigen pc moest gebeuren.