Skip to content

86 — panthor M2b:wrapper-CS 解释器,fence 全通桌面渲染循环活(2026-09-03) ​

战役七终章。note 76 §3.5 的 M2a-noop 量具形态(本项目编号 M2b): 调度/fence/swap 量具可用,像素免责。

0. 结果 ​

项结果
fence 完成链✅ mutter 的 GROUP_SUBMIT → 假 MCU 消费 ring → SYNC_ADD64 真执行 → SYNC_UPDATE/cs_irq/JOB_IRQ → fence 完成 → drm_syncobj_wait 醒
桌面渲染循环✅ mutter 持续 submit/swap(fb-phys 跨帧翻页 1798967296→710213632),VOP 扫描活动
反证(免责)✅ screendump 1024×600 纯黑——用户段未执行、BO 零初始化,fake completion 未伪装渲染(note 76 §3.5 的验收负面测试)
长稳✅ 12min+ 零 panthor 错误、零 reset、GDM active
12min 冷启动✅ 同机台 GDM 负载冷启动 14min+ 稳(B 役证)

1. 实现(QEMU rk3588-lite.c) ​

数据面两条 walk 通道:

  • fw VM(AS0):接口结构、ring 的 insert/extract 指针
  • 用户 VM:ring 内容、syncobj——AS 扫描(va_pa_user:扫 as_transtab[1..7] 第一个 walk 成功者,内核 group start 时 program)

解释器(cs_consume,寄存器文件 192×u64):

  • 识别 v10 编码(mesa genxml):MOVE48(1)/MOVE32(2) 装寄存器; SYNC_ADD32(37)/SYNC_ADD64(51) 真执行(addr/data 从寄存器取, 32/64 位读-改-写 sync 内存);CALL(32)/WAIT(3)/FLUSH_CACHE2(36)/ NOP/ERROR_BARRIER(47) 及 RUN_* 一律跳过(M2b 语义)
  • 消费循环:extract→insert(环形取模,64K 指令上限)

完成面:extract=insert 写回、CS output.ack 追平、CSG input.req ^= SYNC_UPDATE(bit28)、csg output.cs_irq_req ^= BIT(cs)、job_rawstat |= BIT(csg) 拉 JOB_IRQ(电平)。

触发点:doorbell(0)(内核 submit 走 panthor_fw_toggle_reqs(csg doorbell_req) + ring_csg_doorbells——还是汇到 glb doorbell(0),与 M2a 的 CSG update 同通道;per-CS 响铃 = csg.in.doorbell_req ^ csg.out.doorbell_ack 的 toggle 位差)。

2. 战役七终局 ​

输出
M-pre0(SCMI/SMCCC) → M0(renderD128) → M1(mesa 认 G610)
→ M2a(CSG 生命周期) → M2b(fence 量具,桌面渲染循环活) → [真像素=执行器,No-Go 维持 note 76 裁决]
  • 全链 5 个里程碑、~6 天战役
  • 真像素(M2b-执行器)维持 note 76 No-Go:wrapper 解释器到用户段 Valhall 执行之间隔着 1-3 人月的 ISA 解释器工程——当前量具形态已是 调度/驱动/用户态三层的完整验证平台
  • 桌面工作流决策:snapshot.py 的 panthor_init 拉黑保留(拉了黑 = llvmpipe 慢但可见;放开 = panfrost 快但黑屏——快照是"可用桌面"生产线, 选可见)。研究机(resboot)不拉黑。

3. 挂账转移 ​

  • restore 多核 loadvm 锁死(note 85 §3 四方向)
  • 真机 fixture 补采(CS features 192 占位等)
  • PANTHORIOCTL 打点仍在内核树(战役七全收官,可撤——留 M2b-执行器 复审时用,或下会话撤)

由 rk-forge pdf/2026-06-23-1120-192-gd5045ae 构建