X系列 fb_stage 与 fb_stage_wip DPU 差异及升级说明

fb_stage 与 fb_stage_wip DPU 差异及升级说明

1. 文档目的

本文用于介绍kernel5.10在从2025.04更新到2026.01之后,即dpu使用的目录由fb_stage变为fb_stage_wip之后,DPU 显示主链路获得的能力、稳定性和使用收益,供客户评估后续软件升级。

对比目录:

kernel/kernel-5.10/module_drivers/drivers/video/fbdev/ingenic/fb_stage
kernel/kernel-5.10/module_drivers/drivers/video/fbdev/ingenic/fb_stage_wip

2. 总体结论

fb_stage_wip 对 DPU Composer/RDMA 的提交和完成链路进行了系统性增强。

相对 fb_stage,fb_stage_wip 的核心提升是:将原先偏“当前配置后立即启动”的控制方式,扩展为“图层更新请求 -> frame descriptor 队列 -> DPU 中断完成回收 -> 下一帧安全提交”的调度模型;同时补足 DMMU/TLB 映射、DMA descriptor 生命周期、刷新等待、旋转联动和用户态控制接口。

因此,fb_stage_wip 更适合持续刷帧、多图层、Composer 叠加、RDMA/Writeback、动态旋转及复杂 buffer 切换场景。fb_stage 后续不再维护;客户如需持续获得 DPU 主链路的功能完善与问题修正,应以升级至 fb_stage_wip 为主。

3. 框架差异

3.1 fb_stage:基础直接控制模型

fb_stage 已具备基础 framebuffer、RDMA、Composer、DMMU/TLB 和 rotator 控制能力,但主流程更接近:

应用/Framebuffer 提交 layer 配置
        -> 设置 frame/layer descriptor
        -> 启动或切换 DPU
        -> 由基础中断完成显示状态维护

该模型适合单 framebuffer、固定图层配置、较简单的显示切换。多图层独立更新、硬件仍在读取旧 descriptor 时的软件更新保护、以及不同输出通路之间的切换控制相对有限。

3.2 fb_stage_wip:队列化的 Composer/RDMA 调度模型

fb_stage_wip 将 Composer 提交链路拆分为请求、描述符、硬件完成三个阶段:

应用/Framebuffer 更新某个 layer
        -> 记录该 layer 的更新请求
        -> 比较新旧配置,仅更新必要的 frame/layer descriptor
        -> 将 descriptor 加入 DPU 使用队列
        -> DPU 在 EOD/EOW/EOC/SOC 等中断节点推进状态
        -> 已完成 descriptor 回收到可复用队列

主要新增的内部管理对象包括:

• 每图层请求队列:独立缓存各 layer 的待提交更新;

• comp_desc_queued_list 与 comp_desc_done_list:区分“硬件正在使用”和“软件可复用”的 frame descriptor;

• 新旧 comp_setup_info 比较:避免每次提交均无差别重建全部配置;

• rdma_next_frame、rdma_changed、display_end 等状态:把 RDMA 切帧与 DPU 完成时序关联起来;

• wait queue、completion 和 refresh/vblank 状态:为提交、写回完成、图层安全更新提供同步点。

该变化的直接收益是:软件不会轻易改写硬件仍在读取的 descriptor 或 buffer 对应配置,DPU 在多帧连续更新时的时序更可控。

4. 面向 DPU 的主要优化

以下列出对 DPU 使用价值较大的改动。

优化方向fb_stagefb_stage_wip 的增强 对实际使用的价值
Composer descriptor 管理 以直接 setup/启动为主 增加 queued/done descriptor 队列和回收机制 降低连续提交时 descriptor 被提前改写的风险
多 layer 更新 更新路径较集中,缺少完整的逐 layer 请求调度 每个 layer 维护请求队列,按帧聚合提交 图层可独立刷新,更适合 UI、视频、OSD 等组合显示
配置变更处理 容易重复建立较多配置 比较新旧 comp_setup_info 和 layer 配置 减少无必要的 descriptor 更新,提交行为更可控
DPU 中断驱动 基础 IRQ 状态维护 增加 EOD、EOW、EOC、SOC 等事件的细化处理 把“何时显示结束、何时写回结束、何时可继续提交”明确化
RDMA 切帧 基础 frame change/start/stop 增加 RDMA 等待 vblank、下一帧状态及与 Composer 输出联动 连续刷新或间接输出时,降低切换时序不稳的概率
输出通路 基础 direct out/writeback 扩展 Composer -> RDMA、Composer -> Rotator 等组合通路 支持合成、写回、旋转、上屏之间的完整硬件链路
DMMU/TLB 具备基础 DMMU/TLB 支持 在 Composer 提交前增加 DMMU 映射流程,并结合 TLB/cache 同步 外部 buffer 或 TLB 图层的地址映射和数据可见性更完整
cache/DMA 同步 基础 flush 路径 按 TLB 图层和 cacheable framebuffer 路径分别处理同步 降低 CPU 写入后 DPU 取到旧数据的风险
descriptor DMA 内存 部分 descriptor 路径使用普通内存再取物理地址 RDMA/Composer descriptor 使用 DMA coherent 分配并初始化 更符合 DPU 硬件直接读取 descriptor 的 DMA 使用模型
用户态提交同步 基础 framebuffer 切换 增加 wait done、wait layer vsync、force update、render lock 等接口 应用可在相对安全的时机更新/提交图层,降低竞争与撕裂风险
动态旋转 有 rotator 基础控制 将目标旋转角度、layer angle、完成同步接入 Composer/DPU 通路 横竖屏和动态角度切换更容易与当前显示帧衔接
framebuffer 内存布局 基础按分辨率计算 framebuffer 大小与行长度 旋转场景下按 rotator 对齐要求计算 line length 与 frame 空间 90/270 度场景下 stride/内存布局更匹配硬件要求

5. 关键能力说明

5.1 描述符队列和完成回收

fb_stage_wip 为 Composer descriptor 增加“空闲、已排队、已完成”的管理方式。软件提交新的图层组合时,优先从可用 descriptor 中构建新帧;DPU 硬件执行期间,该 descriptor 保持在 queued 状态;收到对应完成事件后才进入 done/可复用状态。

适用价值:

• 连续刷新时,避免软件覆盖硬件正在读取的 frame/layer descriptor;

• 多 layer 在不同时间更新时,能够聚合成完整帧后再提交;

• DPU 忙时可通过队列和等待机制协调提交,而不是依赖上层自行猜测硬件状态。

5.2 DPU 中断状态细化

WIP 对 DPU 的 EOD、EOW、EOC、SOC 等事件增加了单独处理逻辑,并用这些事件推进 descriptor、RDMA 和图层更新状态。

可将其理解为:

EOD/EOW 等硬件事件到来
        -> 标记当前帧/写回/图层状态完成
        -> 唤醒等待者或回收 descriptor
        -> 在合适时机链接下一批已排队 descriptor

这对“上一帧尚未结束、下一帧已经到来”的高频刷新场景尤其重要。

5.3 DMMU/TLB、cache 与 DMA 一致性处理

WIP 在 Composer 调用链中增加 DMMU 映射入口;提交前根据图层 tlb_en 与 framebuffer 的缓存属性执行相应同步。其目标不是单纯增加一次 cache flush,而是保证:

CPU 写入图层数据 / 更新地址
        -> 地址映射有效
        -> 必要的数据同步完成
        -> DPU 再读取 descriptor 和像素数据

该能力对下列 buffer 更有意义:

• 启用 TLB/DMMU 的用户 buffer;

• RGB 与 NV12/NV21 等不同格式混合的图层;

• CPU、视频模块或其他 DMA 设备生产、DPU 消费的图像 buffer;

• cacheable framebuffer 配置。

5.4 Composer、RDMA、Rotator 的组合输出

WIP 按使用场景选择 Composer 输出模式:

COMP_DIRECT_OUT              Composer 直接上屏
COMP_WRITE_BACK              Composer 合成结果写回内存
COMP_WRITE_BACK_2_RDMA       Composer 写回后由 RDMA 上屏
COMP_WRITE_BACK_2_ROTATOR    Composer 写回后进入 rotator

这使 DPU 可以按需求搭建“多图层合成 -> 写回 -> 旋转/上屏”的通路,而不局限于单一直接显示。

5.5 动态旋转与 framebuffer 对齐

WIP 将 rot_angle_set(请求的目标角度)与实际 DPU/rotator 工作状态结合,并增加 layer 角度及完成等待处理。对于 90 度和 270 度场景,还在 framebuffer 分配、line_length 和旋转对齐尺寸上做了适配。

实际含义:动态横竖屏切换不应只修改一个角度寄存器;framebuffer 的行长度、有效宽高和硬件输出路径也必须与旋转要求匹配。WIP 已在驱动主链路中补充相关处理,降低应用仅切角度造成内存布局不匹配的风险。

5.6 对外控制接口完善

WIP 扩展了与 framebuffer/Composer 相关的控制能力,包括旋转角度设置/获取、指定 layer 等待 vsync、等待合成完成、强制更新、render lock/unlock 等。

这些接口的目的不是增加普通显示功能,而是让上层在以下时刻有明确同步手段:

• 图层内容写完后再交给 DPU;

• 切换 buffer 前等待当前 layer 到达安全位置;

• Writeback 场景等待硬件合成完成后再使用输出 buffer;

• 动态旋转或图层参数改变时,减少与正在执行的帧发生竞争。

6. 建议升级到 fb_stage_wip 的具体使用场景

场景 1:双缓冲/多缓冲 UI 连续刷新

典型流程:应用持续绘制下一帧 framebuffer,并在 yoffset 或图层地址切换后上屏。

升级收益:WIP 的 RDMA 切帧状态、vblank 等待和 descriptor 队列更适合连续提交,可减少“软件快速切换、硬件尚未消费完成”的时序风险。

场景 2:多图层叠加显示

典型组合:背景 UI + 图标/OSD + 视频/YUV 图层;不同图层的更新频率不同。

升级收益:WIP 支持按 layer 缓存更新请求并聚合提交,配合 layer 的 format、stride、alpha、z-order 等配置,更适合让 DPU 硬件完成叠加,减少每次仅更新一个 layer 时影响其他 layer 的可能性。

场景 3:NV12/NV21 视频或相机 buffer 与 UI 合成

典型流程:视频模块提供 YUV buffer,UI 模块提供 RGB/ARGB buffer,DPU Composer 做硬件合成。

升级收益:WIP 对 layer stride、UV 地址、DMMU/TLB 映射和提交同步的处理更完整,适合多格式 buffer 进入同一 DPU 合成通路。

场景 3:Composer 写回后再上屏

典型流程:多个图层先合成为一张中间图,再通过 RDMA 读取该结果送屏。

升级收益:WIP 明确支持 COMP_WRITE_BACK_2_RDMA,并用写回结束/descriptor 队列协调 buffer 生命周期,适合需要中间合成结果的显示链路。

场景 5:开机后动态横竖屏切换

典型流程:设备运行中在 0、90、180、270 度之间切换,且界面/图层持续刷新。

升级收益:WIP 的 rotator、Composer 输出模式、framebuffer 对齐和 layer angle 联动更完整。对于 90/270 度,还能避免只修改角度而未同步处理 line length 与 frame 空间的典型问题。

场景 6:需要稳定定位 DPU 刷新问题

典型问题:偶现花屏、闪烁、切帧不同步、图层显示旧内容、合成结果未完成即被使用。

升级收益:WIP 的中断状态、descriptor 队列、等待接口和更细的 DPU 控制状态,能够提供更清晰的问题定位基础;fb_stage 后续不维护时,新问题也更难获得主线修正。

7. 不升级的风险

保留 fb_stage 不代表基础显示一定不可用;对于单 framebuffer、固定分辨率、低频更新的简单产品,现有版本可能仍可满足使用。但需要接受以下边界和风险:

风险类别 不升级时的影响
后续维护fb_stage 后续不维护,DPU 主链路的新修正与能力完善不会继续回补
连续刷新时序 缺少 WIP 的 descriptor 队列和完整事件推进,复杂连续提交场景更依赖上层时序控制
多 layer 场景 图层独立更新、同步和回收能力较弱,后续扩展 UI/视频/OSD 混合时成本更高
Writeback/间接输出 Composer -> RDMA/Rotator 等组合通路不如 WIP 完整,复杂显示链路需要自行补充适配
TLB/DMMU buffer 对外部 buffer、映射和 cache 同步的使用约束更严格,错误更难通过基础框架规避
动态旋转 横竖屏频繁切换时,角度、stride、framebuffer 对齐和通路切换更容易需要额外定制
问题定位 缺少更完整的状态/等待/队列基础,偶现刷新问题定位和复现成本更高

8. 升级建议

8.1 推荐策略

建议后续 DPU 功能开发和客户项目统一以 fb_stage_wip 为基础,不建议在 fb_stage 上继续叠加新的复杂显示功能。特别是涉及 Composer、RDMA、动态旋转、多图层或 TLB/DMMU 的项目,应优先升级。

8.2 升级验证重点

升级并不是只替换目录;应结合实际产品完成以下验证:

1. 基础显示:冷启动、热重启、待机恢复、背光开关后是否正常上屏。

2. RDMA:双/多缓冲连续切换,验证无明显错帧、闪烁和停帧。

3. Composer:RGB/ARGB/YUV 图层叠加、alpha、z-order、crop、stride 是否符合预期。

4. TLB/DMMU:使用外部/用户图像 buffer 时验证地址映射及 cache 同步正确性。

5. Writeback:确认写回完成后才读取或复用输出 buffer。

6. 旋转:分别验证 0/90/180/270 度,尤其检查 90/270 度的源图宽高、stride、framebuffer 行长度和显示方向。

7. 压力测试:高频提交、频繁切图层、长时间运行和异常恢复场景。

9. 最终建议

fb_stage_wip 的价值在于增强整个 DPU 的可控性,而不仅是解决单一显示问题:它将图层更新、descriptor 生命周期、DPU 中断、RDMA 切帧、Writeback、Rotator、TLB/DMMU 和用户态同步接口串成更完整的控制链路。

对于只需维持当前简单显示功能的产品,fb_stage 可以作为存量方案;对于后续需要维护、扩展或交付复杂显示能力的客户,应明确选择 fb_stage_wip 作为后续升级基线。由于 fb_stage 已停止维护,继续基于旧目录开发会逐步增加功能补丁分散、问题回归和维护成本。


评论交流 (共 0 条)