ReBarUEFI is een UEFI DXE-driver die Resizable BAR (ReBAR) activeert op systemen die dit officieel niet ondersteunen, wat essentieel is voor Intel Arc GPU's en prestatieverbeteringen biedt voor andere videokaarten.
Belangrijkste aspecten:
- Installatie en Gebruik: De driver wordt als FFS-module aan de UEFI-firmware toegevoegd. Gebruikers moeten 4G Decoding inschakelen en CSM uitschakelen, waarna de tool
ReBarState wordt gebruikt om de BAR-grootte te configureren.
- Technische Werking: De module vervangt de
PreprocessController-functie binnen de PciHostBridgeResourceAllocationProtocol, waardoor de BAR-grootte kan worden bepaald op basis van een NVRAM-variabele.
- UEFI Patching: Omdat veel firmware 64-bit BARs niet goed afhandelt, biedt het project
UEFIPatch aan om limieten (bijv. <4GB of <64GB) te verwijderen en de MMIO-ruimte te vergroten voor diverse CPU-generaties (van Sandy Bridge tot Coffee Lake).
- Compatibiliteit en Alternatieven: De driver werkt ook op PCIe Gen2-systemen. Voor Linux-gebruikers is er een mogelijkheid om ReBAR via de kernel (
pci=realloc) te activeren zonder BIOS-modificatie, mits 4G Decoding werkt.
- Veiligheid: Indien het systeem niet meer opstart na een wijziging, kan dit worden opgelost door de CMOS te wissen.
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
- 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.
- Zorg er bij het opstarten van de aangepaste firmware voor dat 4G decoding is ingeschakeld en CSM is uitgeschakeld.
- 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.
- 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.
- 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.
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
- 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.
- Zorg er bij het opstarten van de aangepaste firmware voor dat 4G decoding is ingeschakeld en CSM is uitgeschakeld.
- 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.
- 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.
- 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.