Как Apple (некоторые) MacBook'и сломали

Здравствуйте. В этой статье мне бы хотелось бы рассказать про то, как Apple незаметно некоторое время назад сломали регулировку яркости и уход в режим сна некоторым MacBook’ам с gMux, что по какой-то причине осталось сравнительно незамеченным, а также задать несколько вопросов, поскольку у меня есть некоторые основания полагать, что сделано это было намеренно.

С чего все началось?

Некоторое время назад мне дали на ковыряние старый MacBook 2010 года с диагональю экрана 15 дюймов на процессоре Core i7 (с интегрированным в процессор видеоядром Intel HD Graphics 1st Gen) с проблемным дискретным видеоядром, из-за чего мне достаточно продолжительное время пришлось копать в то, можно ли на нем без железных модификаций и перепрошивки контроллера поднять яркость с режимом сна. Мне нужно было понять, по какой же причине оно не работает.

В чем сама проблема, сэр?

Некоторые MacBook с дискретным видеоядром имели досадную оплошность в виде отслоения кристалла видеоядра от подложки, которая припаивается к материнской плате. Приводило это к тому, что в народе называют «отвал». Мак начинает артефачить/перестает грузиться на этапе инициализации драйвера для дискретного ядра самой операционной системой. В некоторых случаях гарантийного ремонта не было либо по причине конца гарантии, либо по причине того, что для конкретной модели это не является признанным гарантийным случаем, а ремонт в неофициальных сервисах является дорогим в силу своей специфики (данное видеоядро припаяно с помощью BGA-пайки). Все ужасно и мрачно?

Нет, у пользователя при наличии интегрированного в процессор Intel видео остается возможность выключить дискретное видеоядро через аргументы NVRAM, которые читает прошивка.

Чтобы это сделать, в single-user mode (+S после запуска Mac) достаточно ввести эту длинную строку в NVRAM:

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

После изменений в NVRAM MacBook начнет грузиться на интегрированном видеоядре и будет работать полностью исправно. Или нет?

У нас что-то сломалось?

После данных изменений вы скорее всего осознаете, что у вас по какой-то неведомой причине не работает режим сна, а вы вовсе не можете регулировать уровень яркости дисплея, что характеризуется резким вытеканием глаз в темноте. Многие (включая dosdude1) это приняли как данность, не обратив внимание на причину. Но почему так происходит?

Из того, что мне удалось выяснить, за это поведение отвечает AppleGraphicsControl.kext, внутри которого находится плагин AppleMuxControl, который управляет аппаратным свитчером графики gMux, который и отвечает в том числе за регулировку яркости на компьютерах MacBook с дискретным видео.

Начиная с одной из версий macOS Sierra при загрузке с Intel Graphics в логе загрузки системы (либо в verbose mode, +V) вы увидите одну неприметную строку:

AGC: booted to IG, policy disable!!

Она означает для вас вот что:
У вас полностью пропадает возможность полноценно использовать сон (подсветка экрана просто не включится, но матрица продолжит выводить изображение, что можно заметить посветив в яблоко сзади матрицы, поскольку оно пропускает свет), у вас полностью пропадает возможность изменять уровень яркости экрана.

Что, если я скажу вам, что так было не всегда?

На ОС ниже определенной версии данный плагин не выдавал данный стринг, а регулировка яркости и сон спокойно работали. Это происходило, поскольку в коде плагина еще не было проверки на загрузку с интегрированного видеоядра.

El Capitan на MBP2010 с выключенной дискреткой. Регулировка яркости и сон - стабильно работают. Дискретка скрыта мной для того чтобы не грелась в простое.El Capitan на MBP2010 с выключенной дискреткой. Регулировка яркости и сон — стабильно работают. Дискретка скрыта мной для того чтобы не грелась в простое.

Однако в macOS Sierra и выше разработчики из Apple внедрили туда проверку, которая отрабатывает исключительно при загрузке без dGPU. Все, что она делает — меняет policy на 0, что приводит к абсолютной неработоспособности регулировки яркости экрана в macOS. Даже установка policy на нужный (дернутый из того же кекста) через аргумент ядра agc= вам ничем не поможет, потому что она в любом случае меняет его на 0.

macOS Mojave на MBP2010 с выключенной дискреткой, как видно - не работает регулировка яркости, ее слайдер даже не отображается. Также нормально не работает сон.macOS Mojave на MBP2010 с выключенной дискреткой, как видно — не работает регулировка яркости, ее слайдер даже не отображается. Также нормально не работает сон.

Примечание: скриншот сделан с macOS Mojave, официально не поддерживающей данный MacBook, но могу вас заверить, что на Sierra и High Sierra (официально поддерживающих данный MacBook) поведение абсолютно идентично, в чем вы можете при желании убедиться и сами.

И что дальше?

Из всего вышесказанного можно сделать данные выводы:

  1. Данное поведение было вхардкожено в драйвер gMux Apple намеренно, на что указывает тот факт, что плагин из AGC даже плюётся логом выключения регулировки яркости (выключение policy из-за загрузки с графикой от Intel).

  2. На данных макбуках технически существует возможность регулировки яркости даже без патчей прошивки gMux/железных модификаций, которая, судя по всему, намереннно сломана компанией Apple.

Из этого вытекают вопросы:

  1. о какой причине Apple софтверно ломает пользователям возможность, которая на протяжении многих версий macOS / Mac OS X никому не мешала и стабильно работала, позволяя нормально использовать MacBook с неисправным дискретным видеоядром?

    Стоит учесть, что в некоторых ноутбуках от компании Apple шанс словить дефект дискретного видеоядра уже после конца поддержки достаточно велик, так что необходимость использовать эту возможность может возникнуть в любой момент.

  2. Является ли это попыткой загнать пользователей на более новое железо/заплатить за гарантийный ремонт вместо использования компьютера в любом виде? Напомню, что в случае владения купленным на свои кровные яблочным железом — это является правом пользователя, особенно учитывая факт наличия штатной возможности выключения видеоядра через прошивку одним аргументом NVRAM.

Я ничего не заявляю, но это абсолютно не выглядит как случайность.

Посему, мне хотелось бы донести до Интернета более подробную информацию об этой забавной особенности железа от Apple, с которой возможно кто-то из вас даже сталкивался. У меня не получалось поднять яркость и сон на ОС выше El Capitan, поскольку кекст AppleGraphicsControl не совместим с новыми версиями macOS.

P.S. Если кто-то когда-то копал дальше меня — мне было бы интересно услышать, что вы делали и к чему это в итоге привело. Спасибо.

© Habrahabr.ru