# 用户故事:Kaisa Linux HDMI(BP 假设投票后续) 来源:**BP 头脑风暴** 中 H1–H6 假设投票后的三条实现/验证故事。 硬件:**Google Kaisa**(Chromebox),Coreboot;**同机 ChromeOS/Windows HDMI 正常**,Ubuntu 下 **HDMI 无声**、**3.5mm 正常**。 ### 当前策略(2026-04-05 更新) - **Story A(上游)**:**暂缓**——先有**可验证的行为性修复**再发 Issue/邮件;材料清单仍保留,便于日后一次贴齐。 - **Story C**:**优先**——**`full-build-620-j4` 已完成**,deb 在 **`kernel-src/`**;**Stock** 已采(见执行记录与 `audio_topology/collected/dmesg_storyC_STOCK_*`);**下一步**:按 **`OPERATION_Install_CustomKernel_Ubuntu_HWE617.md` §2.1** 安装 **unsigned** → **`collect-storyc-dmesg.sh save PATCHED`** → 填表与 H2 结论。 - **补丁合理性**:见下文 **「补丁复核」**。 --- ## Story A — 上游最小复现包(假设 **H1**:固件/拓扑拒参) **状态:暂缓**(待真修复后再执行 AC §6 发出上游)。 **作为** 希望推动 SOF/ALSA 社区协助的维护者, **我希望** 按仓库清单整理一份可邮寄或发 Issue 的复现材料, **以便** 上游能判断 `-EIO` 是否属固件侧拒绝或需内核侧进一步信息。 ### 背景 - 真机已观察到 **`STREAM_PCM_PARAMS`(`0x60010000`)** 类失败;载荷解码见 `patches/ubuntu-hwe-6.17/STREAM_PCM_PARAMS_CHROME_UBUNTU_NOTES.md` §5。 - 示例 dmesg:`audio_topology/collected/dmesg_sof_TRACE_PAYLOAD_jack-Kaisa_6.17.0-20-generic_20260404_210954.txt`。 ### 验收标准(AC) 1. **硬件与对照**写清:机型、Coreboot、同机 ChromeOS HDMI 正常(与 `UPSTREAM_SOF_Kaisa_HDMI_REPRO.md` §1 一致)。 2. **软件版本**填实测:`uname -r`、发行版;若用自编内核,附 `dpkg -l | grep linux-image` 相关行。 3. **必附日志**:完整 `dmesg`(含 `STREAM_PCM_PARAMS` / `ipc` / `pcm*` / `iDisp`);`alsa-info` 或等效 `aplay -L` + `/proc/asound` 片段。 4. **固件与拓扑**:按 `docs/linux-hdmi/SOF_FIRMWARE_TOPO_Kaisa_CHECKLIST.md` 附路径与 `sha256sum`。 5. **可选增强(建议完成)**:带 **`sof_debug=0x800`** 的 IPC 载荷 dmesg,采集步骤见 `docs/linux-hdmi/OPERATION_Kaisa_SOF_HDMI_Trace.md`。 6. **正文**:使用或改编自 `docs/linux-hdmi/UPSTREAM_SOF_Kaisa_HDMI_REPRO.md` §6 模板,发出至 **thesofproject/sof** 或 **alsa-devel**(或两者之一),并**记录链接/邮件 Message-ID** 到本仓库 `audio_topology/collected/README*.md` 或本文件「执行记录」小节。 ### 参考路径 - `docs/linux-hdmi/UPSTREAM_SOF_Kaisa_HDMI_REPRO.md` - `docs/linux-hdmi/SOF_FIRMWARE_TOPO_Kaisa_CHECKLIST.md` - `patches/ubuntu-hwe-6.17/STREAM_PCM_PARAMS_CHROME_UBUNTU_NOTES.md` ### 任务拆分(建议) - [ ] 填齐 §2 版本与 §4 固件快照 - [ ] 采集/更新 dmesg 与 alsa-info - [ ] 粘贴模板、发送、登记链接 --- ## Story B — 链路 / stream_tag / iDisp 一致性核对(假设 **H3**) **作为** 负责驱动与拓扑对照的实现者, **我希望** 把 dmesg 与拓扑里的 **comp_id、stream_tag、HDMI/iDisp 管道** 对齐核实, **以便** 确认是否存在 **Link DMA / DAI** 与 SOF 拓扑不一致导致的参数被拒。 ### 背景 - 载荷示例:`comp_id = 0x14`、`stream_tag = 1`、48 kHz、2 ch(见 §5 解码表与上述 collected dmesg)。 - 代码差异背景:`patches/ubuntu-hwe-6.17/reference/` 下 `hda-dai.c` 等与 Chrome 树 diff;说明见 `STREAM_PCM_PARAMS_CHROME_UBUNTU_NOTES.md` §3。 ### 验收标准(AC) 1. **列出** 当前失败场景下 dmesg 中的 **`pcmN (HDMI*)`**、**`iDisp*`**、**`stream_tag`**、**`comp_id`**(与 IPC 载荷或 `0002` 诊断行一致即可)。 2. **对照** 所用 **tplg/固件** 中对应 PCM/DAI 节点(路径来自 Story A 或 `SOF_FIRMWARE_TOPO_Kaisa_CHECKLIST.md`),说明 **stream_tag / link / widget** 是否与主机侧配置一致;结论写为 **「一致 / 不一致 / 无法判定」** 之一,并附**证据**(拓扑片段名、行号或截图路径)。 3. **记录** 若发现不一致:拟议的**下一代码入口**(例如 `sound/soc/sof/intel/hda-dai.c`、`hda-pcm.c` 中的函数名),写入本文件「执行记录」或 `docs/linux-hdmi/REANALYSIS_Linux_HDMI_Audio_Kaisa.md` 的追加小节(二选一,避免重复粘贴大段日志)。 ### 参考路径 - `patches/ubuntu-hwe-6.17/STREAM_PCM_PARAMS_CHROME_UBUNTU_NOTES.md` §5、§3 - `docs/linux-hdmi/CHROMEOS_VS_UBUNTU_HDMI_NOTES.md` - `audio_topology/` 下拓扑与 collected 日志 ### 任务拆分(建议) - [ ] 从 dmesg/载荷提取 comp_id、stream_tag、pcm/iDisp 名称 - [ ] 在 tplg 或文档中定位对应节点 - [ ] 写下一致性结论与后续代码假设 --- ## Story C — 0001 内核 A/B 与 trace(假设 **H2**) **状态:进行中** — **`full-build-620-j4` 已成功产出 deb**;真机 **当前多为官方 `linux-image-6.17.0-20-generic`(signed)**,**`linux-image-unsigned` 未装**时,**补丁在 vmlinuz 里的部分不会生效**,须按 **`OPERATION_Install_CustomKernel_Ubuntu_HWE617.md` §2.1** 与 signed **二选一**后再测。 **作为** 验证「FREE/TRIGGER 是否需等 DSP 回复」的维护者, **我希望** 在 **带 `0001` 补丁的自编 6.17** 与 **.stock 内核** 上各采一轮相同 trace, **以便** 判断 **PCM_PARAMS 失败是否仍出现**、时序是否变化。 ### 背景 - `0001` 仅将 `sof_ipc3_pcm_hw_free` / `sof_ipc3_pcm_trigger` 从 `sof_ipc_tx_message_no_reply` 改为 `sof_ipc_tx_message`(见 `patches/ubuntu-hwe-6.17/0001-*.patch`);**不修改** `sof_ipc3_pcm_hw_params`。 - 构建与安装:`docs/kernel-build/OPERATION_Install_CustomKernel_Ubuntu_HWE617.md`;低并行构建建议 `CONCURRENCY_LEVEL=4`(见 `_bmad-output/problem-solution-2026-04-04-linux-hdmi-kaisa.md`)。 - **历史旁证**:`audio_topology/collected/dmesg_sof_STREAM_PCM_PARAMS_HDMI3_jack-Kaisa_6.17.0-19-generic_20260404.txt` 注释称 **已含 0001 时 `STREAM_PCM_PARAMS` 仍 -5**;**Story C** 仍应在 **6.17.0-20 + j4 构建** 上再采一轮,与 **stock .20** 对照,避免内核版本混杂。 ### Story C 操作卡片(本仓库路径) **前提**:deb 在 **`$REPO_ROOT/kernel-src/`**,版本 **`6.17.0-20.20~24.04.1`**(以 `ls *.deb` 为准)。 1. **Stock 侧(先采或补采)** - 在 **仍使用官方 signed `6.17.0-20`** 时:**一键**:`sudo ./scripts/collect-storyc-dmesg.sh auto STOCK`(内部 **`dmesg -C` → `speaker-test` 首个 HDMI → 写 dmesg**)。 - 指定 HDMI:`sudo ./scripts/collect-storyc-dmesg.sh auto STOCK plughw:0,3`(或 `sudo -E env STORYC_HDMI_PLUGHW=plughw:0,3 …`) - 分步:`clear` → 手动试 HDMI → `save STOCK`。 - 产出:`audio_topology/collected/dmesg_storyC_STOCK__<主机>_<时间戳>.txt`。 - 记录:`uname -r`、`dpkg -l`(signed **ii**)。 2. **换自编 unsigned(与 signed 冲突,必读 §2.1)** - **同 ABI 下** `linux-image-6.17.0-20-generic`(signed)与 **`linux-image-unsigned-6.17.0-20-generic`** **不能同时装**。 - **做法**:先 **重启进 GRUB → Advanced → 选非 .20 的备用内核**(如 **6.17.0-19** 或 **6.17.0-14**);`uname -r` **不得**仍是 `6.17.0-20-generic` → 再 `sudo apt remove linux-image-6.17.0-20-generic`(按提示可一并卸 `linux-modules-6.17.0-20-generic`)→ 再 **`dpkg -i`** 自编 **`linux-image-unsigned` + `linux-modules` + `linux-modules-extra` + `linux-modules-iwlwifi`**(同目录一次装齐)→ `sudo apt-get install -f` → `sudo update-grub` → 重启选 **6.17.0-20-generic**。 - 若 **没有备用内核**,须先按 **`OPERATION_…`** 里「GRUB 里只有 Ubuntu」装出一条可启动的旧版,再卸 signed .20。 3. **0001 侧(自编镜像)** - 确认:`dpkg -l | grep linux-image-unsigned-6.17.0-20` 为 **ii**;必要时 `grep '' /proc/version` 与 stock 对照。 - 同样步骤采 **HDMI** trace → - `audio_topology/collected/dmesg_storyC_PATCHED_6.17.0-20-generic_<主机>_<日期>.txt` 4. **填下方对比表**,并写 **H2:支持 / 削弱 / 无变化**。 5. **回滚**:需要恢复官方栈时,再 **boot 备用内核** → `apt install` 装回 **linux-image-6.17.0-20-generic**(signed)等(按 apt 提示),或保留 GRUB 多版本切换。 6. **安装 unsigned(命令摘要,完整说明见 `OPERATION_Install_CustomKernel_Ubuntu_HWE617.md` §2.1)** - **必须先**从 GRUB 进入 **非 `6.17.0-20-generic`** 的备用内核,`uname -r` 确认后再 `apt remove linux-image-6.17.0-20-generic`(signed)。 - 在 **`kernel-src/`** 同目录一次装齐(版本号以 `ls *.deb` 为准): ```bash REPO_ROOT="$HOME/文档/chromebox_10th_audio_driver" cd "$REPO_ROOT/kernel-src" sudo dpkg -i \ linux-image-unsigned-6.17.0-20-generic_6.17.0-20.20~24.04.1_amd64.deb \ linux-modules-6.17.0-20-generic_6.17.0-20.20~24.04.1_amd64.deb \ linux-modules-extra-6.17.0-20-generic_6.17.0-20.20~24.04.1_amd64.deb \ linux-modules-iwlwifi-6.17.0-20-generic_6.17.0-20.20~24.04.1_amd64.deb sudo apt-get install -f sudo update-grub ``` - 重启选 **6.17.0-20-generic**,确认 **`dpkg -l linux-image-unsigned-6.17.0-20-generic`** 为 **ii**。再跑 **`collect-storyc-dmesg.sh`** 的 **clear → 试 HDMI → save PATCHED**。 ### 验收标准(AC) 1. **构建或取得** 带 **0001+0002**(或至少 **0001**)的 `linux-image-unsigned-*` 与匹配 **modules**,并成功引导(`uname -r` 可区分于 stock)。 2. **两侧各执行一次** 相同复现步骤(播放 HDMI → 失败即可),按 `OPERATION_Kaisa_SOF_HDMI_Trace.md` 或 `scripts/collect-kaisa-sof-trace.sh` 采集 **dmesg**;建议 **`sof_debug=0x800`** 一致。 3. **对比表**(写入本文件「执行记录」即可): | 项目 | Stock 内核(官方 **signed** `linux-image-6.17.0-20-generic`) | 0001 内核(**`linux-image-unsigned` + 0001/0002**) | |------|------------|-----------| | `uname -r` | 均为 **`6.17.0-20-generic`**(ABI 相同;是否 signed 见各文件头 `dpkg`) | 同上;**`dpkg -l linux-image-unsigned-6.17.0-20-generic` → ii**(见 PATCHED 文件) | | 采集方式 / 文件 | 历史 ring:`dmesg_storyC_STOCK_*_025700.txt`;`…_032031.txt`(空) | **PATCHED(unsigned)**:早期 `…042242` / `…042458`;**设备扫全**:`…042627`(**plughw:0,3**)、`…042637`(**0,4**)、`…042646`(**0,2**) | | 是否出现 `STREAM_PCM_PARAMS` / `ipc tx error` / `0x60010000` | **025700** 中有 `0x60010000`、pcm2、iDisp 等 | **上述 PATCHED 文件**在 **`dmesg -C` + 短 `speaker-test` 后**:**过滤区与「未过滤全文」均为空**(**ring 内无任何新内核行**),**无法**与 **STREAM_PCM_PARAMS** 对照 | | `speaker-test` 侧记 | — | **0,3 / 0,4**:声道显示 **Unknown**;**0,2**:**Front Left / Front Right**。均 **exit 0**;**`0,2`≠3.5mm 那条**(本机 **选对 plughw 时模拟耳机可播**);短测可能**不向 dmesg 打 SOF printk**(与 **`OPERATION_Kaisa_SOF_HDMI_Trace.md` + `sof_debug=0x800`** 的采法不同) | 4. **结论(H2)**:**仍无法从本套 Story C 采集判定 H2**——不是「0001 无效」的证明,而是 **当前脚本路径下 ring 为空**,看不到 IPC。要观察 **`STREAM_PCM_PARAMS` / -5**,请改用:**`sof_debug=0x800` + `dynamic_debug` + 复现失败**(见 **`OPERATION_Kaisa_SOF_HDMI_Trace.md`**),或保留 **历史 025700 / TRACE_PAYLOAD** 与 **0001** 的对比叙述。 **0001 对 HDMI 无声**:本 Story **既不能证实也不能证伪**。 ### 参考路径 - `patches/ubuntu-hwe-6.17/0001-ASoC-SOF-ipc3-pcm-await-DSP-reply-for-FREE-and-trigger.patch` - `docs/kernel-build/OPERATION_Install_CustomKernel_Ubuntu_HWE617.md` - `docs/linux-hdmi/OPERATION_Kaisa_SOF_HDMI_Trace.md` - `scripts/collect-kaisa-sof-trace.sh` ### 任务拆分(建议) - [x] `full-build-620-j4` 完成;`kernel-src/` 已有 **`linux-image-unsigned-6.17.0-20-generic_6.17.0-20.20~24.04.1_amd64.deb`** 及 **modules / extra / iwlwifi** 等 - [x] **Stock**:`dmesg_storyC_STOCK_*_20260405_025700.txt`(历史 ring);`…_032031.txt`(空) - [x] **unsigned 安装**:`linux-image-unsigned-6.17.0-20-generic` **ii**(见 **042242** 内 `dpkg`) - [x] **Patched**:`042242` / `042458`;**plughw 扫全** `042627`(0,3)、`042637`(0,4)、`042646`(0,2)— **ring 仍无 SOF 行**,H2 见上表结论 --- ## 补丁复核(0001 / 0002,Story C 前置) 结论先说:**两则补丁在技术上都「合理、可装车做 A/B」**;**0002 零行为风险(仅诊断)**;**0001 是小而正当的 IPC 契约收紧**,与 Chromium 5.15 路径一致,但**不保证**解决 HDMI `STREAM_PCM_PARAMS -5`。 ### 0001 — FREE / TRIGGER 等待 DSP 回复 | 项 | 说明 | |----|------| | **改什么** | `sof_ipc3_pcm_hw_free`、`sof_ipc3_pcm_trigger`:`sof_ipc_tx_message_no_reply` → **`sof_ipc_tx_message(..., &reply, sizeof(reply))`**。 | | **为何合理** | 与 **`sof_ipc3_pcm_hw_params`** 一样走「发 IPC + 等 mailbox 回复」;固件对 FREE/TRIGGER 若返回 **`reply.error < 0`**,现在能**向上传递**,避免主机以为成功而 DSP 已报错。 | | **栈 / ABI** | 局部 `struct sof_ipc_reply reply` 与现有 **`hw_params`** 用法一致;`sizeof(reply)` 与 IPC3 通用 reply 布局匹配。 | | **风险** | **延迟**:多一次等待回复(通常可忽略)。若极老旧固件对某子命令**从不回包**,理论上可能挂起——标准 SOF IPC3 下罕见;Kaisa 使用常规模板,可接受。 | | **与 HDMI 关系** | **不直接改** `STREAM_PCM_PARAMS` 发送路径;仅当失败根因是 **FREE/TRIGGER 不同步导致的脏状态** 时,才可能间接改善。 | ### 0002 — `STREAM_PCM_PARAMS` 字段 `spcm_dbg` | 项 | 说明 | |----|------| | **改什么** | 在 **`sof_ipc_tx_message(..., &pcm, ...)` 之前**,若 **`sof_debug_check_flag(SOF_DBG_DUMP_IPC_MESSAGE_PAYLOAD)`**(`0x800`),打印 `comp_id`、`stream_tag`、buffer、平台参数等。 | | **为何合理** | **门控严格**:默认用户无日志;与 `ipc3.c` 里载荷 hex dump 配套。 | | **行为** | **不修改** `pcm` 结构体字段,**不改变** IPC 内容与顺序。 | | **风险** | 几乎无;仅在高负载 + 全开 debug 时多几行 log。 | ### 应用顺序 先 **0001** 再 **0002**(与 `DIFF_SUMMARY.txt` 一致),避免 context 行冲突。 --- ## 依赖与顺序 - **Story A**:**暂缓**;待有行为性修复后再走 `UPSTREAM_SOF_Kaisa_HDMI_REPRO.md`。 - **Story B**:已完成(见执行记录)。 - **Story C**:依赖 **j4 自编 deb**;与 A 无先后绑定。 - 推荐:**C 闭环(装 deb → A/B dmesg)** → 再视结果决定是否重启 **A**。 --- ## 执行记录(完成后填写) | 故事 | 执行日期 | 结果摘要 | 链接/文件 | |------|----------|----------|-----------| | A | | | | | B | 2026-04-04 | 真机 `alsatplg` 解码 `sof-cml-rt5682.tplg.zst`:PCM2↔HDMI1↔iDisp1↔PIPELINE.4 与 dmesg 一致;`comp_id=0x14` 与拓扑 PGA `token251 20` 对齐(H3「错 comp_id」削弱) | [`audio_topology/collected/h3-topology-check-jack-Kaisa_20260404.md`](../audio_topology/collected/h3-topology-check-jack-Kaisa_20260404.md) | | C | 2026-04-05 | **PATCHED** 已扫 **plughw 0,2/0,3/0,4**(`042646`/`042627`/`042637`);**ring 仍空**;**H2 无法由本脚本证实/证伪** → 需 **`OPERATION` + sof_debug** 或历史 **TRACE** 对照 | 见 **§验收标准** |