Files
claude-noether 3834ba012f Phase 2 close: VP9 backend compiles clean on 7.0.0-rc3 arm64
Three commits stacked on boltzmann:~/src/linux-rockchip
vp9-enablement-iter1 branch (1262 LoC total):

  47431635801d  regs header VP9 struct definitions (+238)
  da8482271938  shared codec-spec helpers in rkvdec-vp9-common.h (+511)
  71cc0d96d212  new backend rkvdec-vdpu381-vp9.c + wiring (+513)

Module builds clean against 7.0.0-rc3 ARM64 kernel after fixing two
compiler-caught typos (BSP-style regNNN_ field naming vs mainline plain
names — exactly the namespace-bridging risk Janet flagged in v2 review).

What's NOT yet correct: 5 TODO Phase 2.1 markers in
vdpu381_config_vp9_regs covering RCB address setup, segmentation
register packing, ref-deltas/mode-deltas bit-packing, and probability
storage rotation. Each TODO has the BSP reference location identified
(mpp/hal/rkdec/vp9d/hal_vp9d_vdpu382.c lines).

Push to gitea hanging (ssh timeout); commits safe on boltzmann disk.

Phase 3 entry point documented: retry push, implement 5 TODOs, build,
backup ampere module, install + modprobe cycle, sanity v4l2-ctl
enumeration, pre-flight IRQ diagnostic, first decode attempt with
watchdog watch.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 23:21:57 +00:00

80 lines
6.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase 2 close — VP9 backend compiles clean
Date: 2026-05-17 ~02:55. Phase 2 (`Implement rkvdec-vdpu381-vp9.c backend`) closed at the "compiles clean against 7.0.0-rc3 ARM64 kernel" milestone.
## Three commits on `boltzmann:~/src/linux-rockchip` branch `vp9-enablement-iter1`
| Commit | Subject | LoC |
|---|---|---|
| `47431635801d` | media: rkvdec: Add VP9 register-struct definitions for VDPU381 variant | +238 |
| `da8482271938` | media: rkvdec: Add shared VP9 codec-spec helpers in rkvdec-vp9-common.h | +511 |
| `71cc0d96d212` | media: rkvdec: Add VP9 backend for VDPU381 variant (RK3588) | +513 |
Total: +1262 lines across 4 files. The vdpu381-hevc reference (Casanova v7.0) is 639 lines; Phase 1 estimated VP9 backend at 550-700; we landed at 513 backend + 511 common-header = within range.
## Build verification
```
boltzmann$ cd ~/src/linux-rockchip
boltzmann$ PATH=/home/mfritsche/bin:$PATH make -j$(nproc) \
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
drivers/media/platform/rockchip/rkvdec/
CC [M] drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-vp9.o
LD [M] drivers/media/platform/rockchip/rkvdec/rockchip-vdec.o
```
Zero errors, zero warnings on the new file after fixing two field-name typos caught by the compiler:
| Bug | Fix |
|---|---|
| Used BSP-style `reg128_rlc_base` / `reg130_decout_base` / `reg131_colmv_cur_base` for `struct rkvdec_vdpu381_regs_common_addr` fields | Mainline naming is plain `rlc_base` / `decout_base` / `colmv_cur_base`; corrected |
| Unused variable `i` in `vdpu381_config_vp9_regs` | Removed |
These both are pre-flash compiler-caught bugs of exactly the kind Janet predicted in v2 review re. namespace bridging — the legacy `regs->common.reg02.dec_mode` style is muscle-memory from reading the legacy file. Corrected without regression.
## What's NOT yet correct (deferred TODOs in the backend file)
5 `TODO Phase 2.1` markers in `vdpu381_config_vp9_regs` for fields that compile fine but aren't yet packed correctly. These will be needed for first-light decode but the skeleton is structurally correct:
1. RCB address setup (`common_addr.rcb_base[10]` — currently NULL; needs `vdpu381_set_rcb_addrs` equivalent to HEVC path)
2. Segmentation register packing per `segid 0..7` (`reg067_074_segid[]` — currently zero-init; needs `config_seg_registers` port)
3. Loop-filter `ref_deltas[0..3]` bit-pack into `reg094_ref_deltas_lastframe.ref_deltas_lastframe` (28-bit field combining 4× 7-bit deltas)
4. Loop-filter `mode_deltas[0..1]` bit-pack into `reg075_last_frame_info.mode_deltas_lastframe` (14-bit field)
5. Probability storage rotation: `reg160_delta_prob_base`, `reg162_last_prob_base`, `reg172_update_prob_wr_base` (per BSP `Vdpu382Vp9dCtx_t::prob_idx` cycle logic)
## Open questions surfaced during Phase 2 implementation
| Q | Question | Status |
|---|---|---|
| C-1 | `reg103_frame_flags` extra bits (`prob_update_en`, `txfmmode_rfsh_en`, etc.) — required for first decode? | Hypothesis: only the most-obviously-needed bits set (intra_only, refresh_en, allow_high_precision_mv, interp_filter_switch_en); others left zero — verify empirically |
| C-2 | `reg160_delta_prob_base` and `reg162_last_prob_base` — new DMA allocations or alias existing? | Hypothesis: alias `priv_tbl.probs` regions; verify against BSP `vdpu382_set_vp9d_buffer` equivalent |
| C-3 | `reg028.vp9_rd_prob_idx`/`vp9_wr_prob_idx` first-frame values? | Currently both = 0 in skeleton. BSP rotates; will need iteration |
| C-4 | RCB write-out — does mainline `rkvdec_setup_rcb` already populate `common_addr.rcb_base[]`, or does each backend need to wire it? | HEVC backend (`rkvdec-vdpu381-hevc.c:362-374`) writes RCB addrs explicitly. Mirror that pattern in VP9 backend |
| C-5 | `reg032_timeout_threshold` — set to RKVDEC_TIMEOUT_4K (0x2cfffff) for 4K-max VP9? | Yes; add to register setup |
## Push status
`git push gitea vp9-enablement-iter1` from boltzmann is hanging (ssh timeout). Commits are safely on boltzmann disk in branch `vp9-enablement-iter1`. Will retry push next session. Branch will eventually land at `git.reauktion.de/marfrit/linux-rk3588-marfrit:vp9-enablement-iter1`.
## What Phase 3 needs (next-session entry point)
1. **Retry push** to gitea from boltzmann to back up the work off-disk.
2. **Implement the 5 TODOs** in `vdpu381_config_vp9_regs`. Each is a 5-15 line bit-packing task referencing the BSP `hal_vp9d_vdpu382.c` source. Expect ~100-200 LoC delta.
3. **Build module + backup ampere's current rockchip-vdec.ko** per [feedback_backup_before_module_replace](../../.claude/projects/-home-mfritsche-src-fresnel-fourier/memory/feedback_backup_before_module_replace.md) before install.
4. **Install + modprobe cycle**`scp boltzmann:~/src/linux-rockchip/drivers/media/platform/rockchip/rkvdec/rockchip-vdec.ko ampere:/lib/modules/7.0.0-rc3-devices+/kernel/drivers/media/platform/rockchip/rkvdec/`, then `ssh ampere "sudo modprobe -r rockchip-vdec && sudo modprobe rockchip-vdec"`.
5. **Sanity enumeration**: `v4l2-ctl --device=/dev/video0 --list-formats-out` should show VP9F alongside H264_SLICE and HEVC_SLICE.
6. **Pre-flight diagnostic**: instrument `vdpu381_irq_handler` with `pr_warn("vp9 irq status=0x%x\n", status)` for first 5 decodes (per Janet Amendment C) to verify IRQ status bit semantics before counting on `VDPU381_STA_INT_DEC_RDY_STA = BIT(2)`.
7. **First decode attempt**: `LIBVA_DRIVER_NAME=v4l2_request ffmpeg -hwaccel vaapi -i bbb_30s_720p.vp9.webm -vf hwdownload,format=nv12 -frames:v 5 -f rawvideo /tmp/hw-vp9.nv12`. Watch dmesg for IRQ status. Most likely outcome on first attempt with TODO #1-5 unresolved: watchdog 2-second timeout (no decode complete IRQ).
8. **Iterate** on the TODOs until first-light. Then SW byte-compare on a non-fade-in frame index.
## Persistence checkpoint
- **Campaign repo**: 4 commits at `git.reauktion.de/claude-noether/ampere-vp9-enablement` master (phase0, phase1, phase1_v2, phase1_v3_amendment, phase2_field_mapping, this doc).
- **Kernel branch**: 3 commits on `boltzmann:~/src/linux-rockchip:vp9-enablement-iter1` (not yet pushed to gitea due to ssh timeout).
- **Module artifact**: `boltzmann:~/src/linux-rockchip/drivers/media/platform/rockchip/rkvdec/rockchip-vdec.ko` (compiled, NOT yet installed on ampere).
- **No ampere changes**: ampere is still on sibling-campaign close state (HEVC bit-perfect, iter3+iter4 kernel patches in modules).
- **Rockchip BSP reference**: `boltzmann:~/src/rockchip-bsp/{mpp,rk-kernel-6.6}` — clones retained for Phase 3 cross-reference of `Vdpu382Vp9dCtx_t::prob_idx` rotation and RCB setup.
Phase 2 closes here. Substantial code artifact in hand; remaining bit-level field translation is well-scoped (5 TODOs, all with BSP reference locations identified) for the next session.