If you don't have time to read my story (which also describes
some interesting technical approaches) just scroll down this
thread until a "100% WORKING SOLUTION" text
Discrete AMD GPU of my 2011 MacBook Pro 8,2 has finally failed
because of the reasons mentioned here (
http://logicboardmac.blogspot.ru/ ) and there (
https://www.macrumors.com/2015/02/19/2011-macbook-pro-
repair-program-apple/ ) . It has been working perfectly for 6 years
under quite a high load, even tried SETI@HOME mining at
background! So I was confident that my MBP is not affected by bad
solder / bad soldering quality and didn't want to bring it to Apple for
a free repair program - partially because couldn't find the time to
pause my important software projects, partially because I was
afraid that Apple might give me a less reliable logic board or refuse
a free repair because of the several unrelated repairs that I did
manually by myself earlier to save money: changed thermal paste a
few times, replaced the internal battery 2 times, replaced a
keyboard with broken buttons, etc. But it finally broke down last
week: laptop's screen image became distorted, it refused to boot OS
X (always freezing half-way), and - Apple free repair program has
already ended! I know there are affordable solutions like $50 BGA
resoldering at unofficial local repair shop and that its possible to get
a new replacement HD 6750M chip from AliExpress for $35 or
cheaper ( http://www.aliexpress.com/item/DC-2...0028-216-
0810028-BGA-Chipset/32764872143.html or
https://www.aliexpress.com/item/DC-2015-New-216-0810001-216-
0810001-Graphic-Chipset/32718112928.html , because don't know
if this is true - https://www.rossmanngroup.com/board...0604-
replace-216-0810005-gpu-with-216-0810028 ) to guarantee a
successful repair, so the total price of repair would be either $50 or
$50+$35=$85 - less than $100 in any case. But I don't like
investing money to the old computers, so I have thought - what if
there is some hack to force MBP to use integrated graphics ALL THE
TIME, even while booting ? And then started to explore the possible
solutions...
===
First of all, it is possible to successfully boot a MBP to OS X while
still using the failed GPU, after you remove the AMD drivers by
booting in command line mode (CMD+S) and entering these
commands:
1) fsck -fy (to check a disk)
2) mount -uw / (mount a root filesystem with read/write
permissions)
3) sudo mkdir /AMD_Kexts/ (make a directory to store the AMD
drivers in case you'll need them in future)
4) sudo mv /System/Library/Extensions/AMD*.* /AMD_Kexts/
(move the AMD drivers)
5) sudo rm -rf
/System/Library/Caches/com.apple.kext.caches/ (remove the
AMD drivers cache)
6) sudo mkdir
/System/Library/Caches/com.apple.kext.caches/ (just in case
OS X will be dumb and will not recreate this directory, I am creating
it for OS X)
7) sudo touch /System/Library/Extensions/ (to update the
timestamps so that new driver caches - without AMD drivers - will
be definitely rebuilt)
8) sudo umount / (umount a partition to guarantee that your
changes are flushed to it)
9) sudo reboot
The degree of your inconvenience while doing these steps - strongly
depends on how heavily a screen's image is distorted in your case.
In my case it was even more difficult because the OS X partition
became a "read-only" partition (because of too many emergency
shutdowns I did while desperately trying to boot OS X with a failed
GPU) so I had to remove a hard drive from MacBook Pro and (using
a USB to SATA 2.5" adapter taken from my portable HDD) attached
it to a computer with Linux, then followed these instructions:
https://superuser.com/questions/961401/mounting-hfs-partition-
on-arch-linux (1st answer) - carefully executed a number of
commands, calculated a sizelimit for my parition layout, and finally
ran sudo mount -t hfsplus -o force,rw,sizelimit=YOURNUMBER
/dev/sdb2 /mnt to mount this HFS+ partition to /mnt directory in
read-write mode. Then I performed these "1)-7)" steps you see
above, and also repaired a filesystem by running sudo
fsck.hfsplus -f /dev/sdb2 before unmounting a partition with
sudo umount /mnt and putting a hard drive back to MBP...
===
This gave me a MBP which could boot to OS X although STILL using
a broken AMD GPU: so it screen's image is very distorted (could
browse the Internet but quite inconvenient to read a text),
Launchpad is super laggy, and you can't switch to Integrated GPU
using gfxCardStatus because: without AMD drivers (which we had to
remove to successfully boot to OS X) Macbook Pro thinks its'
internal screen is External Display and gfxCardStatus tells it is
impossible to switch because External Display is using AMD GPU.
Somewhere I found a suggestion that it is possible to rebuild a
gfxCardStatus from the source code -
https://github.com/codykrieger/gfxCardStatus - with removed or
commented out 156-166 lines in the
./gfxCardStatus/Classes/GSProcess.m to make it to ignore the
external display:
// find out if an external monitor is forcing the
discrete gpu on
CGDirectDisplayID displays[8];
CGDisplayCount displayCount = 0;
if (CGGetOnlineDisplayList(8, displays, &displayCount) ==
noErr) {
for (int i = 0; i < displayCount; i++) {
if ( ! CGDisplayIsBuiltin(displays))
[list addObject:[NSDictionary
dictionaryWithObjectsAndKeys:
Str(@"External Display"), kTaskItemName,
@"", kTaskItemPID, nil]];
}
}
So I rebuilt a gfxCardStatus using the instructions from the last
reply of this issue -
https://github.com/codykrieger/gfxCardStatus/issues/229
(also had to download a MacOSX10.11.sdk from here -
https://github.com/phracker/MacOSX-SDKs/releases - unpack and
copy it to XCode's
/Applications/Xcode.app/Contents/Developer/Platforms/MacO
SX.platform/Developer/SDKs/MacOSX10.11.sdk - because of the
Apple's stupidity the latest XCode for El Capitan does not include
SDK for El Capitan!) However, it still didn't work - gfxCardStatus
only pretended that it has switched to Integrated GPU, while in
reality OS X did not let it switch! Even after I edited
./gfxCardStatus/Classes/GSGPU.m file to enable the mysterious
"Nuke it from orbit switching" option, it still couldn't switch...
===
Then I discovered this interesting repository -
https://github.com/0xbb/gpu-switch - which is partially similar by
its' source code to gfxCardStatus but also has the "Login Hooks"
(install_hooks.sh) to "automate the switching process for
login/logout". Sadly it didn't work for me... However, there is a very
interesting gpu-switch text file right at the root of this repository,
which describes the EFI variables!
https://github.com/0xbb/gpu-switch/blob/master/gpu-switch
After studying it and also reading this issue's comments -
https://github.com/0xbb/gpu-switch/issues/11 - I became confident
to try this solution, but found out that my MacBook Pro 2011 8,2
with OS X El Capitan 10.11.6 is in a VERY problematic situation:
1) rEFInd is not installed, and to install it - must disable SIP
protection. But I cannot boot to Recovery mode
(Command+Option+R) or to OS X Installation DVD/USB (hold
Option), (to disable SIP), because they freeze while booting! -
although I removed AMD kexts from my system, of course these
recovery tools are using AMD kexts integrated to their design. Also
cannot use Rootfool hack ( https://github.com/gdbinit/rootfool ) to
disable SIP during runtime, because it works only at OS X version
older than 10.11.4
2) Tried overheating my Macbook Pro on purpose (forcing CPU
usage to 100% and putting it to a tightly closed bag) to force it to
shutdown from overheating and then quickly reboot so that
Integrated graphics will be enabled during the boot time - making it
possible to boot to Recovery. But because of the wonderful high end
thermal paste I have applied not so long ago - cannot overheat it
even after waiting for a long time! At this point I thought that could
either: a) remove AMD kexts from Installation media, or b) to
connect MBP's hard drive to a Linux machine again and run a bunch
of chmods to remove the SIP flags from the directories mentioned
here ( http://apple.stackexchange.com/questions/193368/what-is-
the-rootless-feature-in-el-capitan-really ) which could potentially
make a system unbootable, or c) to try installing rEFInd to HFS+
partition directly from a Linux machine with root rights because it
will bypass SIP --- but have not explored these options, although
some of them might have worked...
3) Wanted to boot a Linux LiveCD to edit the EFI variables from
there, but no matter what I did: tried booting straight without GRUB
option modifications, tried editing GRUB boot options (with "e"
key) to add nomodeset / remove quiet splash / or both in every
combination , or like suggested in this article (
https://wiki.archlinux.org/index.php/MacBookPro8,1/8,2/8,3_(2011
) ) also add i915.modeset=0 radeon.modeset=0 or
radeon.modeset=0 i915.modeset=1 i915.lvds_channel_mode=2 ;
and then pressed Fn+F10 or Shift+Ctrl+Fn+F10 to boot with
these options: but the Linux boot process always failed at different
boot stages, no matter what popular user-friendly Linux distribution
or what version of it I am trying: tried many releases of Ubuntu /
Lubuntu / Fedora , even the old "AMD64 Mac" and "Alternate
AMD64 Mac" images, but they always failed - either at the very
beginning of boot process (black screen, or a black screen with a
blinking or stuck _ character at the left upper corner) or failed at
the very end of it - right before it is supposed to show a
graphical desktop environment...
Later, totoe_84 wrote that he was able to boot Ubuntu in
graphical mode using the following setup for GRUB:
◦ To disable the AMD graphics card I added the following lines after
set gfxpayload=keep
outb 0x728 1
outb 0x710 2
outb 0x740 2
outb 0x750 0
◦ Next I added the following after quiet splash
◦ i915.lvds_channel_mode=2 i915.modeset=1
i915.lvds_use_ssc=0
(based on https://ubuntuforums.org/showthread.php?t=2157775 )
===
Then I remembered that there are not-mainstream Linux
distributions for advanced users, which have a LiveCD without any
graphical interface: you are dropped to a pure console and you
are supposed to install the system along with only those graphical
interfaces and software packages / groups of packages which you
explicitly select. For example: Arch Linux
(https://www.archlinux.org/) and Gentoo Linux
(https://gentoo.org/) . Because their LiveCD does not have a
graphical interface, they could be booted without a problem to a
pure Linux console and there you could edit the EFI variables !
So here is a...
===
=== 100% WORKING SOLUTION
===
=== Force your MBP to ALWAYS use Intel integrated GPU
(EFI variable fix)
===
=== to make it great again !
===
1) Create the Arch Linux LiveCD/LiveUSB :
You need a working computer for that and a spare CD/DVD/USB
drive. Download the latest Arch Linux ISO image from this page -
https://www.archlinux.org/download/ , at the time of writing it is
archlinux-2017.03.01-dual.iso . Then you could either simply
burn this ISO to CD/DVD (which later could be either inserted to
MBP's SuperDrive or External DVD Drive connected to MBP by two
USB cables) or create a bootable USB: use the great detailed
instructions from this page,
https://wiki.archlinux.org/index.php/USB_flash_installation_media
2) Boot to it: insert this CD/DVD/USB to Macbook Pro, hold Option
key while booting, choose "EFI boot" (that is your bootable
installation media), press "e" key to edit the GRUB options of the
Arch Linux archiso x86_64 UEFI CD menu entry while it is
selected at the main screen, add nomodeset to the end of this line
and press Enter. If everything is done correctly, you will find
yourself at the Linux console!
3) Edit EFI vars: looks like efivarfs filesystem is mounted by
default! So you can already cd /sys/firmware/efi/efivars and
ls to explore this directory and see if there is a "gpu-power-
prefs-..." variable (where ... is UUID of this variable). If there is
such a variable, its better to remove it with rm. In my case the
efivarfs has been mounted by default with read/write permissions,
but if you are getting the "operation not permitted" message
while attempting to rm, it means that in your case efivarfs has
been mounted as read-only and you need to remount it with read-
write permissions and try again (credits to totoe_84 for this
valuable addition) :
*) cd /
*) umount /sys/firmware/efi/efivars/
*) mount -t efivarfs rw /sys/firmware/efi/efivars/
*) cd /sys/firmware/efi/efivars/
If your screen is so distorted that it is difficult to see the letters, just
start typing the rm gpu-power-pre and then press TAB key for
autocompletion. In my case there were not such a EFI variable, only
"gpu-active-..." and maybe somehow related "gfx-saved-config-
restore-status-..." . Then I looked again at that gpu-switch text
file (mentioned above, https://github.com/0xbb/gpu-
switch/blob/master/gpu-switch),
and entered THESE COMMANDS:
*) chattr -i "/sys/firmware/efi/efivars/" <----- skip this
command
Actually a gpu-switch script had "${sysfs_efi_vars}/${efi_gpu}" but
I didnt have a "gpu-power-prefs-..." variable - so, partially by
mistake, I didn't add that efi_gpu suffix and entered this incomplete
path accidentally
*) printf "\x07\x00\x00\x00\x01\x00\x00\x00" >
/sys/firmware/efi/efivars/gpu-power-prefs-fa4ce28d-b62f-
4c99-9cc3-6815686e30f9
Did not have a EFI "gpu-power-prefs-" variable so I thought that it
will be OK to create a new one with a random UUID - in this case,
taken directly from a gpu-switch script
*) chattr +i "/sys/firmware/efi/efivars/gpu-power-prefs-
fa4ce28d-b62f-4c99-9cc3-6815686e30f9"
http://www.tecmint.com/chattr-command-examples/ - chattr
(Change Attribute) is a command line Linux utility that is used to
set/unset certain attributes to a file in Linux system to secure
accidental deletion or modification of important files and folders,
even though you are logged in as a root user.
...
Syntax of chattr ---> chattr [operator] [flags] [filename]
...
A file is set with ‘i‘ attribute (+i as you see in this command) ---
> cannot be modified (immutable). Means no renaming, no
symbolic link creation, no execution, no writable, only superuser can
unset the attribute.
...
Operator
1 + : Adds the attribute to the existing attribute of the files.
2 – : Removes the attribute to the existing attribute of the files.
3 = : Keep the existing attributes that the files have.
This chattr command is supposed to lock a file to make it accessible
only by "superuser" - and so that, while booting, your EFI will have
no chance to screw up your gpu-power-prefs-... variable under
any circumstances
*) cd /
Could not unmount efivars if you are inside this directory, so change
to the root directory
*) umount /sys/firmware/efi/efivars/
Guarantees that your EFI variables are flushed to efivarfs
filesystem, please unmount it safely before rebooting)
*) reboot
===> IF YOU DID EVERYTHING CORRECTLY, MOST LIKELY
THAT YOUR MACBOOK PRO IS NOW USING INTEGRATED
GRAPHICS WHILE BOOTING, AFTER BOOTING, AND IS
WORKING GREAT AGAIN !
In the future maybe you could need to re-apply this solution
if you would have to reset your PRAM / NVRAM / SMC
because of some other problems, so remember this solution
somewhere... Funny thing: now you can't switch to Discrete
GPU even using gfxCardStatus, it is forever stuck at
Integrated
I spent two working days to discover this solution, and really hope
that it will work flawlessly for every MBP owner with a broken
discrete GPU. Good luck!