From fda84b4c272001fef2ab6bc422400250bd34eba2 Mon Sep 17 00:00:00 2001 From: BFE Engineering Date: Mon, 24 Aug 2026 23:00:38 -0600 Subject: [PATCH] =?UTF-8?q?kernel:=20RGA=202D=20accelerator=20ported=20(op?= =?UTF-8?q?en-source=20vendor=20driver)=20=E2=80=94=20verified?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ported the vendor multicore RGA char-dev driver (drivers/video/rockchip/rga3/, CONFIG_ROCKCHIP_MULTI_RGA) to 6.18 — WardenOS's librga uses /dev/rga, not V4L2. On warden-c8a3: rga2 probe successful, hw_version 3.3.87975, /dev/rga + /dev/dma_heap present. This is the CPU-savings 2D accelerator (LVGL UI offload). 6 mechanical 5.10->6.18 API fixes (platform remove->void, hrtimer_init-> hrtimer_setup, iommu_map* gfp arg, get_user_pages_remote vmas arg, MAX_ORDER compat, MODULE_IMPORT_NS string). CMA via the default 64 MiB pool + DMABUF_HEAPS_CMA (a custom linux,cma DT node hangs boot). Recipe + deltas in rga/PORT-DONE.md. All open source (vendor C source). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_017wB8KB3MMQztRDXCMCkPrf --- kernel/rv1106-enablement/DRIVER-PARITY.md | 2 +- .../rv1106-enablement/dts/rv1106-warden.dts | 5 ++++ kernel/rv1106-enablement/rga/PORT-DONE.md | 27 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 kernel/rv1106-enablement/rga/PORT-DONE.md diff --git a/kernel/rv1106-enablement/DRIVER-PARITY.md b/kernel/rv1106-enablement/DRIVER-PARITY.md index a4a54be..605d3ba 100644 --- a/kernel/rv1106-enablement/DRIVER-PARITY.md +++ b/kernel/rv1106-enablement/DRIVER-PARITY.md @@ -36,7 +36,7 @@ c8a3, not just compiled. | AIC8800 wifi (bsp/fdrv) | aic8800_* | **out-of-tree** | ⬜ M5 | | AIC8800 BT (btlpm) | aic8800_btlpm | **out-of-tree** | ⬜ M5 | | NPU (rknpu, ff660000) | rknpu, ff660000.npu | **out-of-tree** | ⬜ M6 — plan: `npu/PORT-PLAN.md` | -| RGA 2D (rga2) | rga2 | rockchip | ⬜ M6 | +| RGA 2D (rga2) | rga2 | ported (vendor char-dev) | ✅ /dev/rga, hw 3.3.87975 | | I2S audio (i2s-tdm) | i2s | rv1126 fallback | 🔨 DAI built; needs acodec+card | | FIQ debugger (ttyFIQ0) | fiq_glue | rockchip | ⬜ optional (we use ttyS2) | diff --git a/kernel/rv1106-enablement/dts/rv1106-warden.dts b/kernel/rv1106-enablement/dts/rv1106-warden.dts index 2886869..9625087 100644 --- a/kernel/rv1106-enablement/dts/rv1106-warden.dts +++ b/kernel/rv1106-enablement/dts/rv1106-warden.dts @@ -159,3 +159,8 @@ &i2s0_8ch { status = "okay"; }; + + +&rga2 { + status = "okay"; +}; diff --git a/kernel/rv1106-enablement/rga/PORT-DONE.md b/kernel/rv1106-enablement/rga/PORT-DONE.md new file mode 100644 index 0000000..f3e3ade --- /dev/null +++ b/kernel/rv1106-enablement/rga/PORT-DONE.md @@ -0,0 +1,27 @@ +# RGA port — DONE, verified on hardware (2026-08-24) + +Ported the vendor char-dev RGA driver (`drivers/video/rockchip/rga3/`, the +multicore `CONFIG_ROCKCHIP_MULTI_RGA` driver — WardenOS's librga uses `/dev/rga`, +not V4L2) to 6.18. Open source (vendor C source). On warden-c8a3: +``` +rga: rga2, irq = 55, match scheduler +rga: rga2 hardware loaded successfully, hw_version:3.3.87975 +rga: rga2 probe successfully → /dev/rga present, /dev/dma_heap present +``` + +## Build tree wiring +`drivers/video/rockchip/{Kconfig,Makefile}` created (source rga3/); wired into +`drivers/video/{Kconfig,Makefile}`. `CONFIG_ROCKCHIP_MULTI_RGA=y`. +`&rga2 { status="okay"; }`. For `/dev/dma_heap/cma`: use the kernel's default 64 MiB +CMA + `CONFIG_DMABUF_HEAPS{,_CMA,_SYSTEM}=y` — do NOT add a `linux,cma` DT node +(a mis-aligned/duplicate one hangs the boot at reserved-memory init). + +## 5.10 → 6.18 API deltas fixed (all mechanical) +1. `platform_driver.remove`: `int` → `void` (`rga_drv_remove`, drop the returns). +2. `hrtimer_init(&t,…)` + `t.function=fn` → `hrtimer_setup(&t, fn, CLOCK_MONOTONIC, + HRTIMER_MODE_REL)` — the scheduler tick; verified under the live probe. +3. `iommu_map` / `iommu_map_sg`: added the new `gfp` arg (`GFP_KERNEL`). +4. `get_user_pages_remote`: dropped the removed `vmas` arg. +5. `MAX_ORDER` (removed) → compat `#define MAX_ORDER (MAX_PAGE_ORDER + 1)` in + `rga3/include/rga_drv.h` (preserves the old exclusive semantics everywhere). +6. `MODULE_IMPORT_NS()` → `MODULE_IMPORT_NS("DMA_BUF")` (string form).