R3g Radeon Vii

Mid 2015 15-inch MacBook Pro eGPU Master Thread

eGPU Mac 59 Comments

Thanks to @nando4‘s and @itsage‘s earlier implementations, I was interested in trying out a direct M.2 PCIe 3.0 x4 interface of my Mid 2015 15″ MBP (M370X) for eGPU. This is now my primary Mac as it has a brand new battery and top case with the keyboard. Official battery replacement was not as expensive as I thought and the cycle count was 0! This model supports “silent clicking”, a nice feature that turns off the sound of your trackpad’s click. The new MBPs do not have this feature. There are so many things we miss from this machine. The most interesting thing is PCIe 3.0 x4 of course, more than doubling the transfer speed compared to TB2, and leaves behind TB3 as well due to its 22Gbps limit and complex design.

As we know, Apple uses a proprietary interface but luckily there exists M.2 NVMe adapters for upgrading 2013-2015 MBP‘s SSD. So I ordered both the short and longer adapters from Sintech:


It turned out that the socket of the longer adapter was too tall. During reassembly of the lower case, the other plastic clip in the middle did not seem to snap in. For this reason, I recommend to use the short Sintech adapter which did not have this issue.

The root issue with the Thunderbolt is too narrow PCIe bridges. This is a big obstacle in Windows, resulting in error code 12. I decided to put my theory in practice and enlarged the problematic memory area the eGPU requests. To my knowledge, this method is not described anywhere else. I originally got the idea some years ago when someone asked how to fix the error code 12 with the nMP on this forum. The memory areas presented here are machine specific and not applicable to other systems as such. However, if you choose the right values, there is a high chance it will work.

The iGPU activation also differs from previous implementions because now we control the gmux directly, not through nvram variables. It follows the same memory address sequences that Linux driver uses:


The fastest way to clone your internal disk is to use dd command, for example I am using Corsair MP510 960GB (be careful with disk identifiers):

diskutil unmountDisk /dev/disk2
diskutil eraseDisk ExFAT MP510 /dev/disk2
sudo dd if=/dev/rdisk0 of=/dev/rdisk2 bs=2m conv=noerror,sync

Works well between two NVMe SSD Boot Camp installations but Windows does not like if you are cloning from the original AHCI SSD or from the NVMe SSD to USB. Use Boot Camp Assistant with your new NVMe SSD. My shortcut was WinClone but that also failed if the destination was USB drive. The final fix was sysprep, otherwise the boot got stuck at blue screen:


With NVMeFix (https://github.com/acidanthera/NVMeFix) I saw a reduce in power consumption, not close to original Apple SSD readings but very welcome improvement. NVMe SSDs are completely another story, let’s now focus on eGPU.

A TB2 disk is possible but it takes more PCIe resources due to bridges and shows up irregularly in startup manager. For these reasons, I recommend an external USB for Boot Camp. I chose Samsung Portable SSD T5, attached to the right side USB 3 port (up to 5Gbps).

Installation steps:

1) Identify your external disk.

diskutil list

/dev/disk2 (external, physical):
0: GUID_partition_scheme *500.1 GB disk2
1: EFI EFI 209.7 MB disk2s1
2: Microsoft Basic Data BOOTCAMP 499.9 GB disk2s2

2) sudo mkdir /Volumes/EFI

3) sudo mount -t msdos /dev/disk2s1 /Volumes/EFI (where disk2s1 is your EFI disk identifier)

4) Download EFI Dev Kit: https://sourceforge.net/projects/efidevkit/files/latest/download

5) Create startup.nsh EFI Shell script

Rows 4-6 are only necessary if your eGPU occupies the TB2 port (left top) and you are using a Radeon VII, because it requires twice as much non-prefetchable memory in 32bit space than RX 580. The tested eGPU enclosures via TB2 were Netstor HL23T and Asus XG-Station Pro. You might need to disable and enable the PCI Express Root Port as shown in the image below:

Uncomment these rows (remove the # character) in that case. The R43SG does not need rows 4-6 so you can use the script as shown. The rest of the commands activate the iGPU and completely switches off the dGPU, making possible to install latest official AMD drivers.

echo -off
#mm 00010122 2 ;PCI :BA10 -n
#mm 00010124 2 ;PCI :BA20 -n
#mm 00010126 2 ;PCI :DC10 -n
mm 7C2 ;IO :1 -n
mm 7D4 ;IO :28 -n
mm 7C2 ;IO :2 -n
mm 7D4 ;IO :10 -n
mm 7C2 ;IO :2 -n
mm 7D4 ;IO :40 -n
mm 7C2 ;IO :1 -n
mm 7D4 ;IO :50 -n
mm 7C2 ;IO :0 -n
mm 7D4 ;IO :50 -n

6) Your folder structure in Finder should look as follows:

where bootx64.efi is the renamed Shell_Full.efi file from EFI Dev Kit’s /Edk/Other/Maintained/Application/UefiShell/bin/x64/ folder.

apple_set_os.efi from here:


and Microsoft’s bootx64.efi renamed as bootx64-original.efi

7) Not sure if this step is necessary but disable SIP and run:

sudo nvram fa4ce28d-b62f-4c99-9cc3-6815686e30f9:gpu-power-prefs=%01%00%00%00

8) Shut down your Mac, then turn on with the option key pressed down, and select “EFI boot”.

Benchmarks (RX 580)

  M.2 external TB2 external difference M.2 internal TB2 internal difference
Forza Horizon 4 94.9 49.5 47.4% 90.6 37 59.2%
3DMark 11 Extr. 4769 4612 3.3% 4776 4575 4.2%
Superposition 8405 7774 7.5% 8329 5988 28,1%
TimeSpy 4445 4157 6.5% N/A N/A N/A

Benchmarks (Radeon VII)

  M.2 external TB2 external difference M.2 internal TB2 internal difference
Forza Horizon 4 129.3 70.3 45.6% 117.8 55.6 52.8%
3DMark 11 Extr. 9609 9338 2.8% 9654 8848 8.3%
Superposition 17409 15838 9.0% 15838 8744 44.8%
TimeSpy 8719 7673 12% N/A N/A N/A


M.2 interface and RX 580 beats Radeon VII and TB2 in Forza Horizon 4. Amazing. For some reason TimeSpy produced an error when I tried to use internal screen. Nowadays, setting the preference is easy in Windows 10:


On the macOS side, you don’t need any workarounds with the ADT-Link R43SG. The eGPU works as if it was a built-in GPU.


Share this Post

Related Articles


Notify of
Newest Most Voted
Inline Feedbacks
View all comments

@goalque, thank you for this first M.2 eGPU implementation on a MacBook.   Excellent results on a 32Gbps M.2 port compared to the 16Gbps TB2 port.



Would this implementation work with the trash can Mac Pro?


@goalque Thank you for your pioneering work as always! I will follow the instructions to replicate a similar build on my 2015 15-in MacBook Pro. @tsakal In terms of hardware, the SSD drive slot in the 2013 Mac Pro is routed through the Graphics B card and runs at x4 PCIe 2.0 to the PCH. The Thunderbolt 2 ports has direct CPU access and run at x4 PCIe 2.0. Another physical challenge is a magnet placed near the Power Button on the outter shell. Without which the computer won’t turn on. In terms of software, I think it’s possible and… Read more »



Use an amfeltec angelshark carrier board and connect two GPUs plus keep the SSD.



@joevt I think the PCIe drive slot in the nMP is not as good as Thunderbolt 2 ports. It provides no higher bandwidth and goes through the PCH compared to TB2 ports that has direct access to CPU through a x8 PCIe 3.0 switch.


@itsage But the PCIe slot won’t have the latency of Thunderbolt. You’ve shown gaming benchmarks before where PCIe 3.0 x1 can beat Thunderbolt 3. In this case we are comparing PCIe 2.0 x4 and Thunderbolt 2 which should have a greater difference since PCIe 2.0 x4 is twice as fast as PCIe 3.0 x1, and Thunderbolt 2 is slower than Thunderbolt 3. I don’t think going through the PCH will reduce the PCI 2.0 x4 bandwidth of the SSD slot as much as going through Thunderbolt 2 does (also limited to PCIe 2.0 x4) even though the PCH is shared… Read more »


@joevt I agree Thunderbolt encoding/decoding speed would make the Thunderbolt 2 connection slower than PCIe 2.0 through the PCH. If we consider the Amfeltec Angelshark carrier board to host stock SSD, and one or two eGPU that would be quite a bit more convoluted than in my test of dGPU running at x1 PCIe 3.0 straight to CPU.



@goalque,  I tried the new method with the revised apple_set_os.efi on my 2017 13-in MacBook Pro. It worked well with Win10 1903 (OS Build 18363.657). Do I need to create a startup.nsh if I was to try it on 2018 Mac mini and 2019 13-in MacBook Pro? Thank you!

comment image


@goalque,  I tried this new solution on 2019 13-in MacBook Pro last night. The revised apple_set_os.efi works very well in keeping the iGPU activated during boot. However the laptop struggles with Thunderbolt device detection once Windows fully loads. Hot-plug would detect the Thunderbolt device but causes error 12. This could be due to the latest Windows 10 version 2004 I’m running on this laptop. I created startup.nsh using a text editor and paste the code you provided in #post-74447.



@goalque,  I will try pci.sys replacement next (using one from Win10 1903 V1 ISO) and see if either Thunderbolt detection or hot-plug would improve.

This new solution is certainly more flexible but I’m afraid it’s too technical. Your automate-eGPU EFI is more friendly for beginners. Is there a chance you can revise it to auto-reset when apple_set_os.efi is not active?



@goalque, where can I search the correct mm commands for the AMD Radeon Vega 64?
And could you please be so kind to explain the different mm rows and their functions?
So I had understood that :
rows 5-7 are for cards which needs bigger memory
rows 8-13 to change the gmux state (whatever that in detail means)
rows 14-17 to power off the dGPU.
Although I am happy with my RX 580, I must change the script, to get my Vega 64 run and eliminate error 12.


So the only way I can get my Razer Core X / Vega 64 to load is by going through the whole Enable / Disable PCIE Ports procedure but I need to go through it numerous times and it’s a bit hit and miss. Is this usual? Would somebody be kind enough put up a screenshot of the ports to you need to target and the correct order in which to hit them. I’m pretty sure I’m doing something wrong. I was also wondering, does this procedure need to be done with each boot? Is there not some kind of… Read more »


@goalque, Posted by: @Weekendiac where can I search the correct mm commands for the AMD Radeon Vega 64? And could you please be so kind to explain the different mm rows and their functions? So I had understood that : rows 5-7 are for cards which needs bigger memory rows 8-13 to change the gmux state (whatever that in detail means) rows 14-17 to power off the dGPU. Although I am happy with my RX 580, I must change the script, to get my Vega 64 run and eliminate error 12. Meanwhile I tried everything, getting my Vega 64 (not)… Read more »


I had this setup working fine (except I am using a 5700xt). I was forced to reinstall my windows after an update stopped it working. I installed the 1809 (I think) version, didn’t do much to make it work.   Have been gaming on it for weeks now but tonight something has mysteriously made it code 12 again. I should mentioned that my Windows doesn’t update anything as I change what was necessary in the reg to make it not.   Any ideas on what made it stop working?    And also, more related to this tread, any simpler ways… Read more »


i just followed the above steps on my 15in 2018 mbp and it booted into windows. I thought all was good so far until I installed theintel gpu drivers. It installed with no errors but in device manager there is aMicrosoft basic display adapter and theintel one. The display is running off of basic drivers but theintel drivers are installed. Also the amd drivers do not detect my egpu when installing them. Is there something I might need to fix.

Hello, can you please provide clarity on instruction #5? This is somewhat broad and I do not know how to proceed. Been trying everything to get rid of Error 12. Early 2015 MBP with Thunderbolt 2 and M370X. RX 5700 eGPU

Posted by: @goalque
5) Create startup.nsh EFI Shell script



, there were some backslashes missing in the code at point 5. Please recreate the startup.nsh and try again.



@Gg Gg, To solve this part, it took me the whole weekend. But meanwhile I got it. 😁 To create startup.nsh go to terminal and enter: sudo nano Volumes/EFI\ Boot/startup.nsh Copy the above script in the terminal window. Then save it by ctrl + o If this is not possible to save there, you will just save it under „startup.nsh“ without the clarification of any directory. Then search it in Finder and copy it to the above mentioned folder. Follow the rest of the manual. It works great and with each start of Windows my dGPU is completely turned off,… Read more »


I’ve been having trouble with this step, too. Whenver I use sudo nano Volumes/EFI\ Boot/startup.nsh and hit ctrl + O, it won’t write. When I erase the directory and have it write, it creates the file but the file has no lines in it and the file size is zero. Am I missing something? Is there another way to create the startup.nsh?

Thanks for the help!


@tanukilandslide, I am always doing it a little bit different. Hope that will help you:
Open terminal and write:

sudo mountesp 


cd /Volumes/ESP/EFI/Boot


nano startup.nsh

then Type ctrl+o and then press Enter to save.
That should work, if the folder of your startup.nsh ist the same.


Thanks for the quick reply!
When I tried running sudo mountesp I got:

sudo: mountesp: command not found 

When I’m eventually able to make the startup.nsh file, how big should I expect that file to be? That way I can have an idea if it’s right or not. Also, I’m guessing this file is specific to each machine?


@tanukilandslide, mhh, did you do that in terminal in macOS? 🤔 For me it always works…  maybe you must deactivate the SIP (system protection) in recovery mode after start by pressing CMD+R (Recovery). (I am not sure if this is necessary, but I am having it deactivated.) then open terminal and type  Csrutil disable if you want know wether it‘s on or not type Csrutil status Startup.nsh is machine specific, but it matches fundamentally with the MacBook 15“ mid 2015. The size? I will post next time, when I am in MacOS 😁 and if you run the Radeon VII, you… Read more »


@Vumad, Which Windows build is it?
So, if you have Windows 10 something higher than 18362.295, try to delete (deinstall) the latest Windows updates. You could do that with “Windows updates”.
More Details you will get here:
Downgrade to Win10 18362.295 if see eGPU error code 12 after a Win10update to 1903/1909 as explained.


@Weekendiac, I have 1909 fully updated.


@Vumad, yeah you must deinstall 1909 and go back to 1903.
Just look for solutions „as explained.“


@Weekendiac, I have the iso from 1803. Will that work? Or do I need to find a different ISO.


@Vumad, hey I’d already copied the link for you.
But for your pleasure; the details:
If you need to do a clean install of Windows 10 1903 V1, a manual update to .295 can be done by downloading:

August 13, 2019—KB4512508 (OS Build 18362.295) which can be found Microsoft Update Catalog
“2019-08 Cumulative Update for Windows 10 Version 1903 for x64-based Systems (KB4512508)
Be careful one is for SERVER, that is not the one that will work with Bootcamp…



@Weekendiac,    Okay, so I removed bootcamp 1909 and I set it up fresh with 1903 .30 via the information you gave me.   It worked for a moment and then completely stopped functioning and kept crashing. I disabled the camera in device manager and everything was working quite well.   However, I had to run for a bit, and when I came back, my PC was asleep. I woke it up but the eGPU wont show up in device manager. I removed all USB devices, rebooted, hot plugged, not hot plugged, scanned for hardware changes, etc. Everything was working,… Read more »


@Vumad, yes, you did right! The energy management does not work with eGPU and Windows. Maybe anyone has a solution that for, but actually you need to reboot system. 
So better deactivate energy rules in Windows. 👍🏻
By the way, all the compliments on the UEFISHELL-script „startup.nsh“ and apple_set_os.efi  belongs to @goalque, who made a fantastic work here!🥰


Hi! Thanks for your tutorial!! I followed it step by step.
I am currently facing a problem; when I try to boot without any eGpu attached, windows symply cannot boot. I precise that I am still experiencing error 12 when my eGpu is attached. I did not desactivate the PCI port of my dGpu because it was not visible in the peripheric manager.
Is there any script I could run to use Windows without attaching my eGpu?
Thanks a lot for your help 🙂


@anonymousse,  I changed startup.nsh by going to the folder in terminal and enter: nano startup.nsh to the following:  echo -off fs0: EFIBootapple_set_os.efi stall 1000000 mm 00010122 2 ;PCI :BA10 -n mm 00010124 2 ;PCI :BA20 -n mm 00010126 2 ;PCI :DC10 -n mm 7C2 ;IO :1 -n mm 7D4 ;IO :28 -n mm 7C2 ;IO :2 -n mm 7D4 ;IO :10 -n mm 7C2 ;IO :2 -n mm 7D4 ;IO :40 -n mm 7C2 ;IO :1 -n mm 7D4 ;IO :50 -n mm 7C2 ;IO :0 -n mm 7D4 ;IO :50 -n if not %lasterror% == 0 then reset -w… Read more »


Thanks a lot! I’ll give it a try 🙂
Let me know also if you manage to make your Vega 64 work correctly, i suppose that its architecture is similar to my Vega 56.


@anonymousse, I count on goalque‘s answer 😉


@anonymousse, If you want to boot again with your dGPU activated, just change the startup.nsh as follows:

echo -off
stall 1000000
#mm 00010122 2 ;PCI :BA10 -n
#mm 00010124 2 ;PCI :BA20 -n
#mm 00010126 2 ;PCI :DC10 -n
#mm 7C2 ;IO :1 -n
#mm 7D4 ;IO :28 -n
#mm 7C2 ;IO :2 -n
#mm 7D4 ;IO :10 -n
#mm 7C2 ;IO :2 -n
#mm 7D4 ;IO :40 -n
#mm 7C2 ;IO :1 -n
#mm 7D4 ;IO :50 -n
#mm 7C2 ;IO :0 -n
#mm 7D4 ;IO :50 -n
if not %lasterror% == 0 then
reset -w



Hi, and thanks again!
I made a clean install of windows 1903 and I am actually stucked with this message when I try to boot with your code to activate the eGpu :
“set os vendor to apple inc ..”
Do you have an idea to fix this? I suppose that the apple_set_os.efi does not work properly… I tryed with with the update of the 16th february of this script.


@anonymousse, dones it work under MacOS? 
If you are in doubt of the changes that I had made in the startup.nsh, just use the original of goalque. For me the modifications are fine (with my RX 580), even if the eGPU is unplugged. 
And for me the apple_set_os.efi works great. 


@Weekendiac, it works properly in MacOS but i am experiencing the same problem with goalque ‘s script…


@Weekendiac I made my Vega 56 work properly! I followed the instryctions of this topic.
No need of EFI trick, just de-install -> install amd drivers and use the eGPU-toggler with you own material ID (follow the instructions).
I works just fine, I can play Far Cry 5 in Ultra, 2K resolution on an external display.
I hope that it will work for you too 🙂


mhhhh, not for me! I had already done that all before.
Ok I just did it now again, still no success! 
The eGPU-toggler did not help me. Maybe I did something wrong. I do not know, which is the right PCIE-Controller. I just choose the ID of that one over the eGPU. then run … after a while toggler finished without any comment.


Ok I admit that I was a bit confused with the right Material ID to choose too. The first one is the root pcie port (something like 0D05, exactly like the one in the script). And the second one is the ID that you obtain when you right-click directly on “Vega 64” device. The multiple occurences of this port must be changed in the script.
Maybe didn’t we pick the same drivers? :/


Well, today I tried it again. But it seems to me, that our Macs are different.
I had made some pictures. Do not wonder: it‘s a german windows version.


In Toggler, I changed the marked positions.
I hope that the selected points are the right ones!?
And here is my device manager:


I disabled and enabled all possible bridges.
Number 1,2,3 and 6 are only possible to deactivate. The rest is not possible.
And I tried these 4 in toggler too. Without success! 😞
I use the left Thunderbolt port on the left side.
Any Ideas?


Hi! Here are the ports i used:

9289 image

And the script i used:

Capture d’écran 2020 05 07 à 15.41.28

I’m pretty much sure that your adress number 1 must end in 0D05, it was the same for me than for the author of the script, and it is the number 8 in your picture i believe.
And what do you mean by “the rest is not possible to deactivate”?
And btw I use the thunderbolt port close to the USB port, it does not work with the other one…
Keep faith 🙂


@anonymousse, oh yes there is – after changing the thunderbolt-port – the above pcie bridge with 0d05.
Great! But I am not allowed to disable it. I do this as administrator – sure. And toggler just tells me that the device is not able to be disabled.

For a while I could see the card. But after a restart the system does not detect it anymore on right TB-port.
Any ideas?


@anonymousse, so, I had made some changes. I had updated Windows to 1909 and changed the pci.sys.
Now I have the correct ID of the PCI Bridge. But I am not able to disable it. 


so I am Right at the finish line. I just need to disable/enable the bridge.
But how? Toggler is not able to… 🧐


Hi! I’m afraid I have no solution for you, I have no issue disabling this bridge… Maybe try to reinstall the drivers?


So last chance for me and maybe easiest way for most users, is to set the correct mm commands for different GPUs. As far as I understood; these are best for Radeon VII:  echo -off fs0: EFIBootapple_set_os.efi mm 00010122 2 ;PCI :BA10 -n mm 00010124 2 ;PCI :BA20 -n mm 00010126 2 ;PCI :DC10 -n mm 7C2 ;IO :1 -n mm 7D4 ;IO :28 -n mm 7C2 ;IO :2 -n mm 7D4 ;IO :10 -n mm 7C2 ;IO :2 -n mm 7D4 ;IO :40 -n mm 7C2 ;IO :1 -n mm 7D4 ;IO :50 -n mm 7C2 ;IO :0 -n… Read more »

Has anyone had any further success with this method on a 2018 13 inch MBP with a radeon VII in core X chroma?  I have been trying several automate.sh scripts including @Weekendiac one above and the igpu recomendation earlier (shown below) along with the first automate.sh script but have had no success. I have windows installed onto an external ssd and also have the 2 on seperate sides of the thunderbolt port. My monitor is the LG ultrafine 27 inch so only has tb ports as well, I’m not sure if this might be an issue ie do you have… Read more »


@Alexander Quessy, welcome to eGPU.io!
Try the whole startup.nsh from page 1 of this thread and delete the # in rows 4-6. Maybe then you will succeed! Although this is written for a MacBook Pro mid 2015, you will have a Good chance. Otherwise take a look at the rest of this thread, there are many links in it to other very good solutions (i.e. only use Windows build 1903 until .295).
Please create your signature so that it will be easier for all of us, to give you matching solutions.

@Weekendiac, Thanks for your response. I have changed the automate.sh to the original one on page 1 with uncommented lines. Do you know how to get the 1903 install, I can see the Windows 10 Version 1903 for x64-based Systems (KB4512508) on the microsoft update catalog but I receive an error if I double click to run it. The disk image ISO on https://egpu.io/forums/pc-setup/egpu-fail-after-update-to-windows-19-03/ links to https://tb.rg-adguard.net/public.php but this too appears not available. Am I missing something obvious here, unfortunately I cant restore to earlier as the ISO I downloaded from microsoft is the 1909 image. Thanks a lot for… Read more »


@Alexander Quessy, You have 2 ways, that I had experienced successfully. 1) Try to deinstall the Windows updates by using border tool Windows Update or 2) Update to Windows 1909 – the latest version – and change, if every update is installed, the file pci.sys. Open install.wim with 7-Zip Mount the Image and then extract the following file X:\sources\install.wim\1\Windows\System32\drivers\pci.sys After updating Windows to 1903/1909 boot from an “Emergency” USB-Drive and replace Windows\System32\drivers\pci.sys with the extract one. Reboot and your AMD eGPU will working.   Download Any Windows ISOs: If you need to download Windows 10 1903 V1 ISO (OS Build… Read more »

@Weekendiac, thanks for your help. 
All working now Ill try and write up a build guide for what I did over the next couple of days. 
I reinstalled windows in the end, for some reason the 1903 ISO wasnt working yesterday morning but worked in the afternoon, very unusual?
I have a slight audio stutter problem I think its the mac drivers though. 
Thanks v much for your help don’t think I could of got it working otherwise. 


Hi all, just wanted to do a massive thanks to the contributors of this thread. After going through just about every conceivable scenario I managed to get it to work. Currently my eGPU is running on the x4 PCI bridge, I had to disable the x16 PCI bridge to get it to work. Then with the apple_set_os and startup.nsh settings from @goalque the EGPU came to live.I am still wondering if I am getting all the performance out of the EGPU when running on the x4 bridge but anything other than that give me code 12, even when plugging it… Read more »