LINUX.ORG.RU

Избавление от PWM-мерцания на железе intel. Нюансы

 , , ,


2

1

Всем привет Как известно, есть такая проблема как PWM-мерцания, связанная с реализацией функции изменения яркости.

На драйверах intel есть возможность это пофиксить с помощью intel_gpu_tools. А точнее, прописать в спец регистр значение периода мерцания (обратно пропорционально частоте). Туда же в нижние байты можно записать значение цикла внутри периода, который отвечает за яркость (цикл =0 - яркость 0%, цикл = период - яркость 100%)

Собственно, с этим все ок, это действительно работает. Подробнее есть здесь

Но есть большая проблема в том, что после этого изменения яркость практически не регулируется. Например, оригинальный период 937 (200Hz, шаг изменения яркости - 9). Я меняю период на 94 (2000Hz, шаг изменения яркости должен стать 1). Кол-во шагов для примера - 100 (то есть, в условных единицах - от 0 до 100 с шагом 1)

Таким образом, получается, что после изменения частоты, я дохожу до 100% яркости всего за 10 шагов (10%). То есть 0-10% еще есть какая-то регулировка, а 10-100% уже максимальная яркость.

Полагаю, что эту ситуацию можно исправить, изменив параметр /sys/class/backlight/intel_backlight/max_brightness. Он всегда остается равным периоду, который был задан изначально. Если можно было бы синхронизировать изменение регистра и этого параметра, то теоретически можно было бы сохранить регулировку яркости в полном диапазоне. Но этот параметр не получается изменить даже под рутом (permission denied) путем echo >

Есть ли какие-нибудь мысли, каким образом его еще можно изменить. Может опять таки есть регистр, который отвечает за этот параметр?

Спасибо

Upd: Думаю важно добавить, что это ноут

★★

Последнее исправление: kao (всего исправлений: 1)

Попробовал заменить в значения частоты PWM в VBT дампе и подгрузить исправленный дамп через параметр i915.vbt_firmware. Все подгрузилось, но ничего не изменилось. В итоге в i915_vbt значение новое, но в i915_opregion значение старое, хотя opregion должен в себя инкапсулировать vbt.

kao ★★
() автор топика
Ответ на: комментарий от kao

а сама еепромка матрицы не шьется по DDM? можно заморочиться, и прошить ее отдельно, переходником из дохлого кабеля...

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

Для меня это будет совсем харкорно, тем более, что, я так понимаю, это связано с разбором ноута и выпаиванием схемки. Проще продать наверно будет)

kao ★★
() автор топика

Купи себе тусклую матрицу. Вот серьёзно, убитая TN тебе гораздо меньше навредит, чем адский прожектор с мерцанием.

anonymous
()

Но есть большая проблема в том, что после этого изменения яркость практически не регулируется.

Ну а ты что ожидал? Никаких чудес не будет.

anonymous
()
Ответ на: комментарий от kao

нет, взять разъем с дохлого шлейфа, завести на него питание и i2c с программатора (ch340), и подоткнуться в матрицу.

но может и без этого прошьется - если i2c контроллер видеочипа не блокирует запись.

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

В контроллере матрицы вообще есть такие значения? В гугле встречаются упоминания, что на подобные ноуты (mi 13.3) просто правят дампы биоса, прошивают и получают профит.

Плюс эти значения по идее должны быть в firmware для i915.

kao ★★
() автор топика
Ответ на: комментарий от kao

гм, мне попадалась инфа что в т.ч. параметры ШИМа подсветки хранятся в еепромке матрицы.

ну и не раз бывало, что замена матрицы на похожую приводила к проблемам с регулировкой яркости/низкой яркости экрана (правда это было на CCFL, не LED).

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

Чудо все-таки произошло без необходимости хардкорного вмешательства. Достаточно было изменить соответствующий регистр 0xc8254 с помощью intel_write до загрузки самого модуля i915. Сделал это через modprobe.d.

PS судя по коду драйвера, за макс яркость берется значение упомянутого регистра и прописывается в sysfs. Если же этот регистр пустой, то только тогда берется значение из vbt. Поэтому подгруженный vbt через параметр i915.vbt_firmware игнорировался

kao ★★
() автор топика

Изменяй период PWM до загрузки модуля:

❯ cat /etc/modprobe.d/i915-pwm.conf 
install i915 /usr/bin/intel_reg write 0xC8254 007d007d; /sbin/modprobe i915 --ignore-install

spijet ★★★
()
Ответ на: комментарий от spijet

Уже, собственно) Спасибо

kao ★★
() автор топика
17 июля 2018 г.
Ответ на: комментарий от spijet

После добавления файла, нужны какие либо телодвижения (dracut -f например)? В моем случае (centos 7.5) толку от этой строки нет, значение по умолчанию остается прежним.

robotron5
()
Ответ на: комментарий от robotron5

Проверь, чтоб модуля i915 не было в initramfs — если он там есть, а конфига и/или утилиты нет, то изменения не применятся.

Надо, чтоб либо модуль загружался уже после того, как подключилась rootfs, либо всё-всё добро должно быть встроено в initramfs. Не знаю, как скаазть dracut'у, чтоб добавил файлы в образ, но в Arch'евском mkinitcpio это делается так:

$ cat /etc/mkinitcpio.conf

MODULES=(… i915)
BINARIES=(… "/usr/bin/intel_reg")
HOOKS=(… modconf …)

spijet ★★★
()
Ответ на: комментарий от robotron5

Возможно не хватает самой intel_reg в initram образе Я сделал через hook функцию копирование бинарника при генерации инитрам.

kao ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.