Repository navigation
Ryazha-clk v3.2.0
Ryazha-clk v3.2.0
Кратко
Большой релиз. Три темы:
- Память — шестнадцать новых ручек пропускной способности, HP Mode, тайминги по отдельным частотам на лету и замер потока и задержки прямо в оверлее, чтобы перебор перестал быть гаданием.
- Оверлей переписан — собственные элементы отрисовки, живой монитор с графиками, плавные счётчики, UV/OV для ГПУ.
- Десяток исправлений, найденных по логам с железа — включая три падения системы, разобранных до причины.
Ревизия таблицы настроек поднята до CUST_REV 34. Кип, сисмодуль и оверлей обновляются только вместе.
Память
Пропускная способность
До этой версии из таймингов до железа доходили только те, что умеют затягивать: индекс 0 у каждого — самое свободное, что даёт движок, и ослабить ниже было нечем. Всё, что определяет пропускную способность, было зашито в движок константами.
Добавлен массив tMEH — шестнадцать знаковых ручек. Ноль у каждой означает «как считалось раньше», минус ослабляет, плюс затягивает. Нетронутый набор даёт бит в бит прежние таблицы.
| Группа | Ручки |
|---|---|
| HP Mode | сон памяти |
| Задержки | RL, WL, набор задержек записи (A/B) |
| Шина и арбитр | растяжка чтения, растяжка записи, запас арбитра, окно арбитра, допуск задержки клиентов, приоритет арбитра |
| Строки и банки | окно четырёх активаций (tFAW), предзаряд всех банков (tRPab), запись→предзаряд (tW2P) |
| Регенерация | предзапрос, tXP, tCKESR |
Свободных слотов в pMEH/sMEH/SHAITAN не было ни одного — все сорок восемь заняты. Массив дописан в конец структуры, поэтому смещения полей 33-й ревизии не сдвинуты.
HP Mode
Движок лестницы зашивал сон памяти включённым намертво (старший нибл emc_cfg = 0xF), хотя на стоковых частотах он выключен. Банки засыпают между пачками обращений, и каждое следующее платит за пробуждение.
Бьёт по задержкам, а значит по низкому 1 % и подёргиваниям, а не только по среднему потоку. Действует живьём.
Порядок важен: сначала найдите потолок частоты и тайминги без HP Mode, и только потом включайте. Он съедает запас.
Приоритет арбитра
Движок лестницы занулял два поля в mc_emem_arb_misc0, хотя стоковая таблица их заполняет (36 и 12). Старый движок правит ровно их, с пометкой «значения ниже 6 ухудшают производительность». Теперь это управляемо.
Тайминги по отдельным частотам
Файл поправок config/ryazha-clk/timings.ini вырос с 13 ключей до 29 — теперь туда входят и все ручки пропускной способности.
Поправки накладываются демоном живьём и в загрузке не участвуют, поэтому окирпичить консоль ими невозможно в принципе. В комплект добавлен timings.ini.template с описанием всех ключей и диапазонов.
Замер памяти в оверлее
Поток и задержка считаются сами, раз в полторы секунды, пока открыто меню, и стоят в шапке вместе с частотой, на которой сняты.
- буфер 4 МБ — вдвое больше кэша второго уровня, иначе меряется кэш;
- поток — восемь независимых накопителей: с одним загрузки выстраиваются в цепочку зависимостей, и меряется сумматор, а не память;
- задержка — обход по случайной перестановке строк кэша: последовательное чтение задержку не покажет, предвыборка притащит строку заранее. Перестановка пишется в сам буфер, тасование Саттоло даёт один цикл на все строки;
- оба числа берутся лучшими из нескольких проходов: чужая нагрузка портит среднее, но лучшему не мешает.
Числа не сравнивать с чужими бенчмарками — метод другой. Они осмысленны только относительно друг друга.
Исправления в движке таймингов
- Потолок tFAW. Поле
emc_tfawсемь бит. При зашитом множителе ×4.0 в него было не попасть мимо, но новая ручка поднимает множитель до ×6.0 — это 144 такта при пределе 127. Лишние биты не насыщают, а отрезаются: 144 стало бы 16, то есть окно вшестеро туже запрошенного там, где просили самое свободное. - Обрезка вместо маски у допуска задержки клиентов:
& 0xFFпри переполнении даёт не «много», а случайный остаток.
Разгон памяти: разведены традиционная и максимальная частота
Одно число решало две несвязанные задачи: докуда готовить таблицы лестницы и что прописать в генератор при инициализации. Из-за этого консоль с модулем Hynix NEE не поднималась вовсе: профильные 2934.4 МГц уходили прямо в генератор, и она умирала на заставке до появления картинки и до записи любых логов. Лечилось только изъятием кипа с карты.
Теперь максимальная частота строит лестницу и вольтажи, а в генератор на буте уходит только традиционная (1638.4 МГц). Проверено на двух консолях.
SoC памяти: требование из максимума двух источников
Источников вольтажа SoC было два, и они расходились: собственная кривая демона и таблица DVB, по которой рейл гоняет сам pcv. Выше ~2 ГГц DVB заметно выше — на 2400 это 925 против наших 813. Демон считал 813, видел рейл на 900 и не делал ничего: расчёт был холостым. В логе это годами читалось как «SoC tgt 925 act 987», будто мы промахнулись мимо цели.
Требование теперь равно максимуму из двух. Ничего не опускается, физика на рейле не меняется, но цель совпадает с реальностью.
Оверлей
Переписана отрисовка
Собственные элементы вместо стандартных: строка списка, переключатель, заголовок раздела, подсказка, ползунок. Подмодуль оформления не тронут — весь вид сделан наследованием.
- Телеметрия переложена со сплошной сетки на строку по модулю: заданная и измеренная частота, напряжение, температура, полоса нагрузки. Координаты считаются долями ширины кадра, а не вбиты числами.
- Подписи обрезаются по остатку после значения — длинные пункты больше не налезают на своё же значение.
- Заголовки разделов сначала ужимают шрифт и только потом обрезаются: раньше они просто уезжали за правый край.
- Перенос строки в подсказках больше не наползает на соседние элементы: текст делится на абзацы, и высота считается честно.
- Стиль выделения на выбор:
ui_highlight = outline | fillвtheme.ini.
Монитор
Экран наблюдения с семью графиками за пять минут. Кольцевой буфер хранит сырые замеры: сглаженные значения на графике врали бы — сгладили бы ровно те всплески, ради которых на него и смотрят.
Рядом с SaltyNX добавлена строка состояния sys-dock.
Плавные счётчики
Экспоненциальное сглаживание заменено критически демпфированной пружиной с шагом по реальному времени: скорость больше не зависит от частоты кадров. Добавлена гарантия хода не меньше деления шкалы за кадр — цифра не стоит на месте, доползая к цели.
Через сглаживание теперь идут все живые значения, а не половина: температуры, вольтаж ОЗУ, батарея и кулер брались напрямую из контекста и щёлкали рывками рядом с плавными соседями.
Единицы во «Временных значениях»
Выставляешь 2934 МГц, заходишь на страницу снова — а там 2934000000. Хранилище держит герцы, а форматировалось как мегагерцы.
ГПУ
UV и OV
Слоты тонкой подстройки стали знаковыми: от +45 до −45 мВ. Загрузчик применял их как −5 × значение со знаковым полем, то есть овервольт арифметика умела всегда — не пускал только валидатор настроек. Заводские таблицы Mariko жёсткие, и выше стока частоте не хватает как раз десятков милливольт.
Добавлено живое смещение таблицы вольтажа двумя точками — низ и вершина, между ними по прямой. Вне CUST, применяется без перезагрузки.
Ручная таблица и ползунки смещения меняются местами по режиму ГПУ; тонкий UV/OV прячется, когда вольтаж задан вручную и ручки ни на что не влияют.
Пять мест, где терялся пол вольтажа
Пол, поднятый под разгон памяти, терялся пятью разными способами:
- пересчёт живой таблицы собирал её заново и терял его;
- применение термальных настроек писало поверх значение из настройки;
- пол поднимался на тик позже, чем ускорялась память — окно, в котором картинка рассыпалась;
- установившийся путь держал свой кэш применённого значения, который разъезжался после каждого подъёма лестницы;
- рейл умели только поднимать, поэтому срез жил лишь в таблицах и не экономил ничего.
Дополнительно: срез пола применяется только на устоявшейся частоте. Подъём лестницы — самый хрупкий момент, и отнимать в нём последние милливольты нечестно по отношению к железу.
И gContext.voltages[GPU] больше не подделывается намерением: в шапке стоит показание с I2C, а не то, что мы хотели поставить. Раньше два писателя в одну ячейку давали прыгающую цифру.
Промежуточные частоты
pcv умеет ставить ГПУ только кратно 76.8 МГц, а GPCPLL внутри самого ГПУ может вдвое мельче. Демон просит округлённую вверх частоту и прямой записью в GPCPLL сдвигает её вниз до цели.
Обнаружено, что напряжение при этом приходит от округлённой вверх частоты: до +110 мВ на 1574.4 МГц, в среднем +30 по десяти точкам. Мощность растёт как квадрат напряжения — промежуточная ступень местами обходилась дороже соседней стоковой, и задумка терялась полностью.
Добавлена настройка, снимающая переплату. Выключена по умолчанию: инъекция может не пройти после сна, и тогда ГПУ остаётся на округлённой вверх частоте.
ЦПУ: исправления по логам
Залипание частоты на 1428 МГц
Конфигурация APM читалась дважды за тик, и решения принимались по разным значениям. В логе это видно прямо: напечатана конфигурация, которая не входит в диапазон буста, а флаг «особый режим» при этом стоит.
С мнимым режимом сброс частоты пропускался, и ЦПУ оставался на том, что оставил HOS, — а оставляет он середину своей лестницы 1785 → 1428 → 1020. Теперь чтение одно на тик.
Дополнительно: при отсутствии цели по ЦПУ частота приводится к текущей конфигурации APM, а не висит.
Частота буста не работала
Сколько ни поставь — работали 1785 МГц. Загрузчик патчит таблицу PTM на выбранную частоту, а демон держал свою таблицу конфигураций APM с жёстко зашитыми 1785 и возвращал их при каждом сбросе к стоку. Теперь сброс уважает выставленный буст и клампит его по потолку ЦПУ.
Война за напряжение
Рейл метался между двумя значениями на частоте тика. Причина оказалась внутренней:
- вольтажный путь ставит форс DFLL, чтобы удержать напряжение слота;
- сброс частоты снимает форс и увеличивает счётчик потерянных форсов;
- вольтажный путь видит счётчик, считает форс потерянным и ставит его заново.
Сброс частоты больше не трогает форс — им владеет вольтажный путь. Заодно сам сброс стал идемпотентным: раньше он писал частоту каждый тик заново, ту же самую.
Проба контура DFLL
Демон периодически отпускал форс, чтобы проверить, удержит ли контур напряжение сам. Остановки у пробы не было: интервал удваивался до 64 тиков и там оставался, то есть провал рейла повторялся каждые тринадцать секунд бесконечно.
Теперь: если напряжение для этой частоты задано вручную — проба не делается вовсе; где напряжение автоматическое — проба останавливается после двух неудач подряд на одной точке.
Живая правка CL-DVFS на Mariko вырезана
Она писала регистры тюна напрямую и сама выбирала диапазон DVCO по своему порогу, а pcv переключает его по собственному. Результат: pcv и ptm падали с ошибкой I2C, следом Bus, следом система.
Загрузчик делает то же самое правильно — патчит поля таблицы pcv до её запуска. Настройка DVCO работает, просто требует перезагрузки.
Скидка напряжения промежуточных частот перенесена в тик
Она висела в пути смены частоты, а лестница ГПУ шагает тридцать ступеней подряд — выходило под шесть десятков обращений к PMIC на один подъём, поперёк транзакций pcv и ptm. Драйвер I2C в демоне без блокировки.
Прочее
Секьюр-монитор: оставлена одна правка из трёх
Реальный потребитель был только у доступа к RTC/PMC: без него не читается датчик температуры на кристалле, из которого считается температура памяти.
Убраны две мёртвые: неограниченная копия обработчика, доступная в стоке под другим номером и не вызывавшаяся нигде, и доступ к EMC целиком — демон читает эти регистры отладочными вызовами, минуя монитор. Раскладка памяти монитора теперь идентична стоковой.
Изменённые умолчания
| Настройка | Было | Стало |
|---|---|---|
| Снять потолки частот | выкл | вкл |
| Mariko Middle Clocks | вкл | выкл |
| Вольтаж промежуточных частот | — | выкл |
| Live CPU Undervolt | выкл | выкл (на Mariko не действует) |
Снятие потолков включено потому, что свежая установка молча ограничивала частоты, о которых пользователь уже попросил в профиле.
Открыта настройка «Перезаписывать буст HOS»
Читалась демоном, подсказка для неё в оверлее лежала, а строки не было ни на одном экране — добраться можно было только правкой config.ini руками.
Инструменты проверки
Семь скриптов-стражей в tools/ не запускались на Windows вовсе: пути в git show подставлялись с обратными слэшами, а вывод декодировался системной кодировкой вместо UTF-8. Оба дефекта исправлены — теперь они выполняются и показывают результат.
Документация
Руководство пользователя переписано с нуля. Прошлая редакция описывала 3.0.1. Структура меню вытащена из кода, чтобы документ совпадал с экраном.
Что появилось нового: разбор трёх частей системы и почему одно применяется сразу, а другое требует перезагрузки; раздел про напряжение ЦПУ и форс контура; справочник таймингов — что каждый значит физически, что даёт затягивание и чем грозит перебор; где тайминги действуют, а где нет; порядок настройки памяти по шагам; диагностика по логу; сводная таблица «живьём / после перезагрузки».
Артефакты
Release публикует Ryazha-clk.zip: кип rcu.kip, sysmodule, оверлей, exosphere.bin, конфиг-шаблоны (включая новый timings.ini.template), языковые файлы и ресурс уведомлений. SaltyNX не упаковывается — он ставится отдельно и нужен только для Ряженки-Авто.
Собранный пакет также лежит в ветке main исходного репозитория, в каталоге dist/.
Установка
Распаковать в корень SD-карты с объединением каталогов atmosphere, config и switch. Полностью перезагрузить консоль — ревизия таблицы настроек изменилась, и старый кип с новым сисмодулем работать не будет.
Если консоль не загружается
Убрать atmosphere/kips/rcu.kip с карты — консоль поднимется на стоковых частотах. Тайминги по частотам (timings.ini) окирпичить не могут: они не участвуют в загрузке.