Добавил свою первую строчку в Linux. Будет чем козырнуть для подачи на визу талантов.
Несколько месяцев назад я поменял свой личный ноутбук на новый HP Omen Transcend 14. Несмотря на свежее железо, поддержка всего оборудования отличная — фактически всё заработало из коробки, включая корректные thermal profiles и NVIDIA. Ноутбук работает отлично: вентиляторы включаются только в играх или при тяжёлом рендере. Но была одна неприятная деталь: в режиме производительности видеокарта не поднимает ожидаемый вольтаж до 70 Вт (как в Windows), а оставляет его на уровне 45 Вт. Также не получалось перевести кулер в режим максимальных оборотов — это управляется тем же hp-wmi.
Сразу скажу: сам по себе патч интереса не представляет, но ресерч для него был не таким уж тривиальным.
Патч
Для начала я быстро выяснил, что питанием управляет firmware (он же BIOS), а BIOS получает команды от модуля ядра hp-wmi, поддерживаемого сообществом. Из исходников модуля выявились две детали. Во-первых, идентификатор моей видеокарты там не указан, поэтому модуль не используется. Во-вторых, есть с десяток возможных мест, куда его можно было бы вписать.
Далее начался реверс-инжиниринг. По исходникам я пытался сопоставить, какие именно биты какой разновидности WMI API соответствуют, чтобы через анализ памяти в Windows найти схожий паттерн и добавить идентификатор в нужное место. Успешно нашёл такое место, пропатчил ядро и протестировал в своей ОС.
Публикация
Далее нужно было разобраться, как опубликовать патч в мейлинг-лист Linux. С этим отлично справилась LLM. Оказалось, что у Git есть фича для формирования email с патчем и отправки через SMTP-сервер.
Через 20 дней мейнтейнер ответил, что добавит патч в свой локальный бранч. Ещё через месяц он появился в RC 6.12 и стабильной 6.11.
Fun fact: через день после публикации Google подкинул пост на Phoronix о поддержке именно для моего ноутбука в hp-wmi. Я успел обрадоваться, что кто-то шарит и сделал нужную фичу, но подробнее прочитав, понял: статья ссылается на мой же патч.
P.S. В какой-то момент наткнулся на крайне информативный пост о похожей проблеме на прошлогоднем Omen. В благодарность закинул пару патчей в их GUI-утилиту для управления питанием и охлаждением Omen’ов.