Декодеры видео VDPU381 и VDPU383 применяются в системах на кристалле Rockchip RK3588 и RK3576, а также в их вариантах, таких как RK3588S и RK3576J. До сих пор для поддержки аппаратного декодирования видео приходилось полагаться на BSP (пакет поддержки оборудования) от Rockchip, но Collabora только что анонсировала поддержку декодирования видео H.264 (AVC) и H.265 (HEVC) для SoC RK3588 и RK3576 в основной (upstream/mainline) ветке Linux.
Ключевые особенности реализации декодера H.265/H.264 в основной ветке Linux:
- Серию из 17 патчей, добавляющих поддержку декодера, в дополнение к привязкам устройств (dt-bindings) и узлам в дереве устройств (device tree nodes)
- Новые элементы управления V4L2 HEVC UAPI для явного управления краткосрочными и долгосрочными RPS (Reference Picture Set)
- Устранение неочевидной проблемы восстановления IOMMU, вызванной сбросами IOMMU, встроенного в декодер
- Модель программирования регистров на основе структур C для обеспечения полноты, правильного порядка и готовности к будущей поддержке многоядерности

Новые элементы управления V4L2 UAPI для долгосрочных и краткосрочных наборов опорных кадров (Reference Picture Set, RPS) в HEVC необходимы для видеодекодеров VDPU381 (RK3588) и VDPU383 (RK3576), в отличие от некоторых других декодеров (например, VeriSilicon), которые могут их игнорировать. Поэтому потребовался API, чтобы пользовательское пространство могло передавать в ядро полностью описанные таблицы краткосрочных и долгосрочных RPS. Компания также добавила поддержку в драйвер Virtual Stateless Decoder (visl), который показывает ftrace со всеми параметрами управления. Элементы управления V4L2 UAPI были реализованы в GStreamer 1.28 (включено) и FFmpeg (предварительно). Новый API также обеспечивает совместимость с Vulkan Video Decode.
Проблема с восстановлением IOMMU представляет особый интерес. Ядро IOMMU встроено в декодеры Rockchip, поэтому при сбросе декодера внутренний IOMMU также сбрасывается, очищая все предыдущие сопоставления адресов. Однако ядро всё ещё считает сопоставление IOMMU действительным после сброса декодера. Патч исправляет эту проблему путем явного восстановления кэшированных сопоставлений IOMMU после сброса декодера. Это также влияет на другие блоки IP в SoC Rockchip, такие как 2D-ускоритель графики RGA.
В документации на декодеры Rockchip для регистров указаны некоторые значения по умолчанию. Однако оборудование может оказаться в неконсистентном состоянии, если код ядра пропустит запись в регистр, даже для значения по умолчанию. Это означает, что безопаснее просто записывать все регистры, а инженеры Collabora также поняли, что порядок записи имеет значение, и запись значений в неправильной последовательности также может нарушить работу декодера. По этим двум причинам было принято решение использовать для программирования регистров структуру C, а не отдельные вызовы writel() или regmap. Подробности см. в коммите .
Поддержка была включена в Linux 7.0 (см. раздел комментариев). Такие новости одновременно отличные и разочаровывающие, потому что можно получить относительно новый и мощный процессор с BSP от вендора или же процессор 4-5-летней давности с основной веткой Linux, но, кажется, нельзя получить новый процессор с основной веткой Linux.
В дальнейшем Collabora будет работать над поддержкой многоядерности на RK3588, поскольку в нём есть два ядра декодера VDPU381, поддержкой AV1 на RK3576, поддержкой кодека VP9 на RK3588, а также добавит поддержку декодера VDPU346 — варианта VDPU381, используемого в SoC серии RK356X (RK3562/RK3566/RK3568). Более подробное описание изменений можно найти на сайте Collabora .
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.
