You wait ten years for a driver to enable pre-boot graphics on unsupported GPUs in EFI era Macs, and then two come along at once...
This post is to announce a firmware driver to enable the native Apple boot picker and early macOS boot progress bar (plus other parts of the firmware UI: target disk mode; firmware password; internet recovery on machines which have it; etc.) on non-natively supported GPUs, before, or even without, the rest of OpenCore.
The basic idea is: if your GPU already works in but not before OpenCore, then with this driver added to your main firmware or GPU firmware it should be able to work before OpenCore, too.
It has now been fairly widely tested, on both iMac and Mac Pro, but nevertheless it is a firmware driver:
This driver has a completely separate origin and development history from @Syncretic's current impressive work. This driver aims to be lightweight and standalone. It comes naturally out of the huge amount of work already done in OpenCore (and mainly finished a couple of years ago, except for these additional steps) to support the OpenCore boot menu on non-natively supported GPUs, within OpenCore. It is also - as part of OpenCore - open source.
After reversing enough of the MacPro firmware to work out how to link OpenCore’s GOP to the Apple firmware UI protocol, it seemed worth trying to enable this before OpenCore as well - i.e. to try to get 'as native' support for these cards. A little bit more experimentation made it clear that the best way to do this would be to piggy-back off the existing, very well tested work already done in OpenCore to support these cards - basically to package up the required parts of OpenCore (
So after considerable reversing, some additional new code, and a lot of helpful testing and input from those listed below, this is now working.
This post is to announce a firmware driver to enable the native Apple boot picker and early macOS boot progress bar (plus other parts of the firmware UI: target disk mode; firmware password; internet recovery on machines which have it; etc.) on non-natively supported GPUs, before, or even without, the rest of OpenCore.
The basic idea is: if your GPU already works in but not before OpenCore, then with this driver added to your main firmware or GPU firmware it should be able to work before OpenCore, too.
It has now been fairly widely tested, on both iMac and Mac Pro, but nevertheless it is a firmware driver:
- If for any reason it fails (or perhaps is incorrectly installed) it can completely brick your machine.
- If you are not comfortable modifying and burning updates to main firmware or GPU firmware, and recovering from bricks of either of these (which will involve additional hardware) - do not proceed. (Or at the very least, wait for clear and replicable instructions and proven success stories for your specific system, from other users who do have this expertise, before proceeding.)
/Utilities/EnableGop
directory of the current OpenCore release. (To see the instructions directly, but without the required built files to actually use them, see here.) For the very latest build (if any recent updates have been made) see the first couple of posts in the thread below.Background
This driver has a completely separate origin and development history from @Syncretic's current impressive work. This driver aims to be lightweight and standalone. It comes naturally out of the huge amount of work already done in OpenCore (and mainly finished a couple of years ago, except for these additional steps) to support the OpenCore boot menu on non-natively supported GPUs, within OpenCore. It is also - as part of OpenCore - open source.
After reversing enough of the MacPro firmware to work out how to link OpenCore’s GOP to the Apple firmware UI protocol, it seemed worth trying to enable this before OpenCore as well - i.e. to try to get 'as native' support for these cards. A little bit more experimentation made it clear that the best way to do this would be to piggy-back off the existing, very well tested work already done in OpenCore to support these cards - basically to package up the required parts of OpenCore (
ForgeUefiSupport
, ProvideConsoleGop
and the recent code to connect this to the Apple firmware UI) into a firmware injectable driver, and then figure out a way to deliver its 'payload' (particularly the ProvideConsoleGop
part) at the right time. Early versions also used OpenCore’s ReloadOptionRoms
, as OpenCore has to do, to load any option ROM which needs ForgeUefiSupport
- but with the correct approach it was possible to avoid this, letting the firmware do it for us, which turned out to make the driver much more stable.So after considerable reversing, some additional new code, and a lot of helpful testing and input from those listed below, this is now working.
Tested Mac models:
- MacPro4,1/5,1
- MacPro5,1
- iMac10,1
- iMac11,1
- iMac11,2
- iMac11,3
- iMac12,2
- The current version of the driver is believed to be safe on all 2009-2012 iMacs and on the MacPro4,1/5,1 and MacPro5,1
- iMac12,1 should be supported but not yet known: a confirmed test result would be welcome
- Most recent available firmware in all cases
- Other Mac models not yet tested, and outside the ones listed above probably will not work (since the required patches apply to the listed firmware only) - please PM me to discuss support
NOT Supported:
- The current version of the driver is NOT compatible with the MacPro3,1, it will make the boot process hang and should not be installed there, in the MacPro3,1 BootROM or the GPU firmware
Tested GPUs:
- GT610 (with original or added GOP in VBIOS)
- GT640
- GT710
- GT720 (EnableGopDirect)
- GT730
- GTX60
- GTX660
- GTX670
- GTX750Ti
- GTX780
- GTX960
- GTX1050Ti
- GTX1070
- GTX1080Ti
- HD 7770
- HD 7970 (all except EnableGop(Direct) version 1.2)
- K2000
- K2000d
- K420
- K600 (with GOP addition in VBIOS)
- M4000, M5100, W5170M, M6000 (AMD Venus, MXM)
- M6100, W6150M, W6170M (AMD Saturn, MXM)
- NVS 510
- P3000
- Radeon VII
- This flagship card appears to have a buggy GOP ROM - replacing the GOP with the one from the Radeon VII Pro makes it fully work. The DirectGopRendering setting in OpenCore and EnableGopDirect are no longer needed - with this replacement EnableGop can be used.
- RX460
- RX480 (PCI and MXM)
- RX5500XT (PCI and MXM)
- RX5700XT
- RX580 Lite (no DVI) - works but reported very slow to start native picker
- RX580 Nitro+
- RX6800 (Syncretic patch required)
- RX6900XT (Syncretic patch required)
- W6600 (Syncretic patch required)
- W6800 (Syncretic patch required)
- Vega 56
- Vega (687F)
- RX560, RX570, RX580, RX590
- S7100X (MXM)
- WX4130, WX4150, WX4170, WX7100 (AMD GCN4, MXM)
Notes
- All GPUs work with EnableGop, unless explicitly listed as requiring EnableGopDirect
- Some GPUs listed above may need additional firmware - such as a GOP driver for older GPUs which do not come with one; or other patches - in order for them to work with OpenCore in the first place (hence to be eligible to work with EnableGop in firmware); try searching for the card in this thread or the following iMac specific threads:
- The driver should also work fine with natively supported GPUs such as GT120 (tested) (e.g. when installed in main firmware and swapping cards)
- It should work with OpenCore (of course) and with RefindPlus
- OpenCore settings which this driver already implements can be, but do not have to be, disabled
Releases of EnableGop in not-yet-released versions of OpenCore may be obtained as per the first couple of posts in the thread below. Older versions may be downloaded as required from the named OpenCore release.
If you find you are short on space when flashing to GPU firmware - which can be especially a problem for AMD GPUs - then try EnableGop 1.1 (available with the 0.9.0 release of OpenCore).
EnableGop version (released with OpenCore version):
Note 2: The compressed driver for version 1.2 is 1KB larger than for version 1.1, so for AMD GPU firmware which is tight on space version 1.1 may be used instead to avoid the need for VGA stripping to make additional space.
If you find you are short on space when flashing to GPU firmware - which can be especially a problem for AMD GPUs - then try EnableGop 1.1 (available with the 0.9.0 release of OpenCore).
EnableGop version (released with OpenCore version):
1.4 (0.9.3)
- Incorporates recent updates to OpenCore console control code, but no difference in behaviour compared to version 1.3 is expected on any supported systems.
1.3 (0.9.2)
- Included fix to GopBurstMode for non-standard frame buffer information on AMD Radeon HD 7970 and similar
- Applied GopBurstMode even on natively supported cards, as it can provide a noticable speed up
1.2 (0.9.1)
- Added GopBurstMode support
Note 2: The compressed driver for version 1.2 is 1KB larger than for version 1.1, so for AMD GPU firmware which is tight on space version 1.1 may be used instead to avoid the need for VGA stripping to make additional space.
1.1 (0.9.0)
- Fixed early verbose boot lines appearing over picker
- Added EnableGop version number to UI section
1.0 (0.8.9)
- Initial public release
The GPU firmware (aka VBIOS) insertion script
In the case of AMD, considerably less space is normally available than with Nvidia, due to a strict limit of 128k for legacy and EFI parts of the potentially larger ROM image (the rest of which is only usable internally by the card itself).
So far, there has largely been enough spare space on desktop format (PCIe) cards for Mac Pro, and not enough space on iMac format (MXM) cards. If there is not enough space (i.e. script reports ROM data exceeds the 128k limit) then it is necessary to strip some legacy VGA parts of the GPU firmware, or check on the iMac threads listed in the next spoiler to see if this has already been done for your card.
You can also inject EnableGop into the main system firmware instead of the GPU firmware - see the
NB If Enable AMD GOP from OCLP is required for you to get a menu is OpenCore then your card won't work as-is with EnableGop. Your card must include GOP in its own firmware in order to work with EnableGop. I have not tested this, but have been told that GopUpdater from WinRAID is one good solution for adding GOP to AMD cards. Once you have added GOP to the card and got it working in OpenCore without OCLP Enable AMD GOP, then it should work pre-OpenCore with EnableGop.
vBiosInsert.sh
now supports both AMD and Nvidia cards.In the case of AMD, considerably less space is normally available than with Nvidia, due to a strict limit of 128k for legacy and EFI parts of the potentially larger ROM image (the rest of which is only usable internally by the card itself).
So far, there has largely been enough spare space on desktop format (PCIe) cards for Mac Pro, and not enough space on iMac format (MXM) cards. If there is not enough space (i.e. script reports ROM data exceeds the 128k limit) then it is necessary to strip some legacy VGA parts of the GPU firmware, or check on the iMac threads listed in the next spoiler to see if this has already been done for your card.
You can also inject EnableGop into the main system firmware instead of the GPU firmware - see the
README.md
file in the Utilities/EnableGop
directory of the most recent OC builds, or here. In that case the AMD firmware size limit does not matter.NB If Enable AMD GOP from OCLP is required for you to get a menu is OpenCore then your card won't work as-is with EnableGop. Your card must include GOP in its own firmware in order to work with EnableGop. I have not tested this, but have been told that GopUpdater from WinRAID is one good solution for adding GOP to AMD cards. Once you have added GOP to the card and got it working in OpenCore without OCLP Enable AMD GOP, then it should work pre-OpenCore with EnableGop.
There has been an active community of iMac users making updates and modifications to iMac GPU firmware since long before EnableGop was written. They have kindly adopted EnableGop (and helped to test it), so for many iMac GPUs, you can already find a modified version including EnableGop (and with legacy VGA parts stripped if necessary, see previous spoiler), if you search for your GPU in these threads:
The script relies on the EDK-II
And for examining main firmware:
EfiRom
tool to compress the driver EFI file into option ROM format, and on UEFIRomExtract
as part of verifying the modified ROM.- A current version of
EfiRom
can be obtained from theUtilities/BaseTools
directory of OpenCore releases (0.9.0+)- Current official releases of OpenCore, and Dortania build server builds, include an Apple fat binary of
EfiRom
which will run on arm64 and x86_64. - Note that prior to commit https://github.com/acidanthera/OpenCorePkg/commit/ff7fd00788addd5a900f812dc3cd530416d9cda4 official OpenCore releases only supported x86_64 and Dortania build server builds only supported arm64.
- Current official releases of OpenCore, and Dortania build server builds, include an Apple fat binary of
UEFIRomExtract
can be obtained here: https://github.com/andyvand/UEFIRomExtract/tree/master/Release
mkdir ~/MyTools
- Copy the required tools into
~/MyTools
- Add
export PATH=~/MyTools:$PATH
to~/.bashrc
or~/.profile
- Close and re-open your shell window
And for examining main firmware:
Credits
- @cdf - extremely helpful input throughout
- @m0bil, @Ausdauersportler, @internetzel, @dfranetic, @Jazzzny - very helpful input, and much testing
- @Syncretic - additional helpful advice
- @joevt, @Dayo - additional advice on legacy details of
ForgeUefiSupport
- @Bmju - this driver
- OpenCore, @vit9696, @mhaeuser - sine qua non
Last edited: