Skip to content

feat(starryos): expose K230 KPU device - #1054

Merged
ZR233 merged 8 commits into
rcore-os:devfrom
Joshua912815:codex/k230-kpu-devfs-smoke
Jun 2, 2026
Merged

feat(starryos): expose K230 KPU device#1054
ZR233 merged 8 commits into
rcore-os:devfrom
Joshua912815:codex/k230-kpu-devfs-smoke

Conversation

@Joshua912815

@Joshua912815 Joshua912815 commented May 30, 2026

Copy link
Copy Markdown
Contributor

背景/问题

#1046 已经合入 dev,K230 QEMU 启动、SD rootfs 和 SDHCI 基础路径已经独立完成。#1053 已按 reviewer 意见关闭,其 driver crate 内容合并到本 PR,与 StarryOS /dev/kpukpu-smoke 一起提供可运行验证。

本 PR 的目标是完成 K230 KPU/NPU 的底层设备适配:StarryOS 能通过受限 /dev/kpu UAPI 提交 KPU command,等待 done/IRQ,并由 K230 QEMU smoke case 验证可观察行为。

主要修改

  • 新增 drivers/npu/k230-kpu no_std driver crate,并加入 workspace:封装 KPU CFG/L2/IRQ、runtime window、fake output window 等常量,提供 CommandRangeKpuInfoKpu::program_command/run_command/wait_done/status
  • 在 StarryOS devfs 中注册 /dev/kpu/dev/kpu0
  • 实现 KPU ioctl:GET_INFOGET_STATUSCLEARPROGRAM_COMMANDSTARTRUNWAIT_DONEGET_IRQ_COUNT
  • 支持受限 mmap 窗口:CFG、L2、fake output、runtime rdata、runtime command、runtime direct I/O 和 runtime DDR window。
  • 增加 IRQ-backed wait:有 KPU IRQ 时通过 WaitQueue 唤醒等待者,同时保留 timeout/轮询兜底。
  • 扩展 K230 feature 接线,使 starryosk230 feature 启用 starry-kernel/k230-kpu
  • 新增 kpu-smoke K230 QEMU case,覆盖 /dev/kpu 打开、info/status/clear、command submit、mmap、done/IRQ、fake output 和 runtime direct I/O .krun 复放。
  • 新增 test-suit/starryos/k230-qemu/prepare-k230-qemu.sh,文档化并脚本化 K230 QEMU fork 的获取、固定 commit、构建产物布局和测试时 PATH 使用方式。

设计理由

  • driver crate 只保留 OS-independent Rust driver core;FDT probe、iomap、IRQ wait queue、devfs 注册等 OS glue 留在 StarryOS devfs 层。
  • /dev/kpu 只暴露 KPU model 需要的受限窗口,不提供通用 /dev/mem 能力,避免为了 demo 放大内核 ABI 面。
  • CFG/L2 mmap 只保留固定虚拟 offset,不再接受物理地址 alias,避免用户态通过传入物理地址扩大可映射面。
  • KPU command range 校验和寄存器编程复用 k230-kpu driver crate,StarryOS devfs 层只负责资源发现、映射、IRQ 和 ioctl/mmap glue。
  • IRQ wait 作为主路径,轮询 timeout 作为兜底,这样 smoke 可以同时验证 QEMU IRQ 行为,又能在异常情况下给出明确超时失败。
  • kpu-smoke 不依赖真实模型或官方 SDK,确保底层设备适配可以独立 review、独立复现。

K230 QEMU 准备方式

K230 machine/KPU model 当前不在上游 QEMU 10.1、10.2 或 11.0 中,普通 qemu-system-riscv64 会报 unsupported machine type: "k230"。本 PR 使用固定的 K230 QEMU fork 版本:

  • repository: https://github.com/zevorn/qemu.git
  • ref: chao-k230-dev
  • commit: 539bd413497ccac9d3cf878036210e64830e7fd6

准备命令:

bash test-suit/starryos/k230-qemu/prepare-k230-qemu.sh

脚本会构建 riscv64-softmmu 并生成如下布局:

target/qemu-k230-docker-build/
  qemu-system-riscv64
  pc-bios/

qemu-riscv64.toml 中的 firmware 路径使用 ${workspace}/target/qemu-k230-docker-build/pc-bios。运行 K230 case 时,把同一目录放在 PATH 前面即可让 cargo xtask 选择这个 K230 QEMU:

PATH="$PWD/target/qemu-k230-docker-build:$PATH" \
  cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke

Review 更新

  • 已 rebase 到最新 devfeat(starryos): add QEMU K230 boot support #1046 的 board/DTS/boot 变更不再出现在本 PR diff 中。
  • feat(drivers): add K230 KPU driver #1053 已关闭,其 driver crate 内容已并入本 PR,和 /dev/kpu + kpu-smoke 一起提供可运行验证。
  • 已删除 drivers/npu/k230-kpu/include/k230_kpu_uapi.h,不再在 driver crate 中引入 C header;smoke case 自包含测试侧常量和 ABI struct。
  • 已适配当前 devDeviceMmap::Physical(range, retainer) 和共享 IRQ 注册接口。
  • 已新增 K230 QEMU 准备脚本和 README 说明,包含 fork/ref/commit、依赖、输出布局,以及 cargo xtask 如何通过 PATH 找到 K230 QEMU。
  • 已移除 CFG/L2 mmap 的物理地址 alias,只保留固定虚拟 offset 路径。
  • 已在 KPU_IRQ_COUNTKPU_DONE_WQ 附近补充注释,说明当前 K230 单 KPU 实例假设,未来多实例时需迁移为 per-device 状态。

验证

已在 Docker/Linux 环境完成验证:

cargo fmt --check
bash -n test-suit/starryos/k230-qemu/prepare-k230-qemu.sh
cargo test -p k230-kpu
cargo xtask clippy --package k230-kpu
cargo xtask clippy --package starry-kernel
git diff --check

本轮 review 修复后,重新构建并验证 K230 QEMU:

QEMU_SOURCE_DIR=/Users/joshua/tmp/qemu \
QEMU_BUILD_DIR="$PWD/target/qemu-k230-docker-build" \
QEMU_JOBS=4 \
bash test-suit/starryos/k230-qemu/prepare-k230-qemu.sh

关键结果:

prepare-k230-qemu: K230 QEMU is ready
prepare-k230-qemu: binary: .../target/qemu-k230-docker-build/qemu-system-riscv64
prepare-k230-qemu: pc-bios: .../target/qemu-k230-docker-build/pc-bios

本轮 review 修复后,也重新执行 K230 smoke:

PATH="$PWD/target/qemu-k230-docker-build:$PATH" \
  cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke

关键结果:

clippy summary: 1 package(s), 13 check(s), 1 package(s) passed, 0 package(s) failed
all clippy checks passed

KPU_SMOKE: opened /dev/kpu
KPU_SMOKE: opened /dev/kpu0
KPU_SMOKE: run_wait_done status=0x0000000400000004 irq_count=0->1
KPU_SMOKE: fake_output_zeroed paddr=0x10090000 status=0x0000000400000004 irq_count=1->2
KPU_SMOKE: runtime_image file_runtime_arg_table_direct_io_blob status=0x0000000400000004 irq_count=5->6
KPU_SMOKE_PASS
PASS kpu-smoke
all starry k230-qemu qemu tests passed

已知限制

  • 本 PR 只完成 StarryOS /dev/kpu 底层设备接口和 smoke 验证。
  • NNCase runtime demo、真实 .kmodel 加载、YOLOv8n 输入预处理和后处理不在本 PR 范围内,由后续 PR test(starryos): add K230 NNCase runtime demo #1058 覆盖。
  • 当前 K230 QEMU case 依赖带 K230 machine/KPU model 的 QEMU,不进入默认通用 QEMU 矩阵。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: feat(starryos): expose K230 KPU device (#1054)

概述

本 PR 在 StarryOS devfs 中注册 /dev/kpu/dev/kpu0,接入 k230-kpu driver crate,实现 KPU ioctl(GET_INFO/GET_STATUS/CLEAR/PROGRAM_COMMAND/START/RUN/WAIT_DONE/GET_IRQ_COUNT)、受限 mmap 窗口(CFG/L2/fake output/runtime rdata/command/direct I/ODDR)和 IRQ-backed wait,并增加 kpu-smoke K230 QEMU smoke case。

代码质量较高,分层清晰,设计合理。

验证结果

检查项 结果
cargo fmt --check ✅ 通过
cargo clippy --package k230-kpu ✅ 通过,无 warning
cargo test --package k230-kpu ✅ 4/4 测试通过(command_words 编码/拒绝、UAPI header 同步)
git diff --check ✅ 无 trailing whitespace
K230 QEMU kpu-smoke ⚠️ 无法验证(当前环境无 K230 QEMU machine model build)

QEMU 验证说明

当前环境的 qemu-system-riscv64 不包含 K230 machine model,无法运行 cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke。PR 描述中已提供 QEMU 运行输出,显示 smoke 完整通过。建议合入前在具备 K230 QEMU build 的 CI 环境中再次验证。

代码质量评价

优点:

  1. UAPI 同步保障k230-kpu crate 的单测验证 Rust 常量与 C UAPI header(k230_kpu_uapi.h)完全一致,避免用户态/内核态 ABI 不匹配。
  2. IRQ + 轮询兜底wait_done 先尝试 IRQ wakeup(100ms timeout),再回退 spin polling,兼顾 QEMU IRQ 验证和异常容错。
  3. 受限 mmap:只暴露 KPU 硬件窗口的特定物理地址范围,不提供通用 /dev/mem 能力,安全面小。
  4. FDT + 静态回退KpuResource::probe() 优先从 FDT 解析,不存在时使用硬编码常量,适配不同 K230 平台。
  5. smoke 测试覆盖全面:1869 行 C 代码覆盖 device open、ioctl、mmap、IRQ count、runtime image replay(包括 file-backed .krun 文件重放)。

建议/备注:

  1. KPU_IOC_WAIT_DONE 默认 poll_limitarg=0 时默认 1,000,000 次 spin loop。在 IRQ 不可用时(如 FDT 未提供 IRQ 信息),这是一个 busy-wait 路径。当前 100ms IRQ timeout 已覆盖大部分场景,但如果 IRQ 注册失败且 KPU 命令执行较慢,可能耗 CPU。建议在 KpuResource::info() 中增加一个 warn! 提示 IRQ 不可用时的 fallback 行为,或在 ioctl 层对 poll_limit 设一个合理上限。
  2. 全局静态 IRQ 计数KPU_IRQ_COUNTKPU_DONE_WQ 是全局静态变量,适用于 K230 单 KPU 场景。如果未来有多 KPU 实例,需要改为 per-device 计数。当前可以接受,建议加注释说明。
  3. kpu-smoke 测试体量main.c 约 1869 行,包含一个完整的 runtime image parser。这在 smoke 测试中偏重,但考虑到 KPU 指令编码的复杂性和可复放性需求,可以理解。

依赖关系

  • #1046(K230 boot support)已合入 dev
  • #1053(K230 KPU driver)仍未合入,本 PR 包含其变更

本 PR 合入前需 #1053 先合入并 rebase。

重复/冲突检查

已检查当前 open PR 列表,未发现与本 PR 的 /dev/kpu devfs 接入或 kpu-smoke 测试存在功能重叠的 PR。PR #1071(RISC-V64 动态 load address)可能与本 PR 的 someboot/build.rs 变更有轻微交互,建议关注 rebase 顺序。

结论

代码质量好,设计清晰,测试覆盖合理。因依赖 #1053 未合入且 K230 QEMU 环境不可用,暂留 comment 状态。待 #1053 合入、rebase 并在 K230 QEMU CI 中验证 smoke 后,可批准合入。

Powered by mimo-v2.5-pro

@ZR233 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请rebase dev

@@ -0,0 +1,77 @@
#ifndef K230_KPU_UAPI_H

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要加入 c 文件

@@ -0,0 +1,415 @@
// SPDX-License-Identifier: MIT

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

可只保留 dtb, dts 可通过 dtb 反编译到tmp

@Joshua912815
Joshua912815 force-pushed the codex/k230-kpu-devfs-smoke branch from ad6847b to 03ca35e Compare June 1, 2026 10:07

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审核总结

PR 内容

本 PR 在 StarryOS devfs 中注册 /dev/kpu/dev/kpu0,新增 k230-kpu no_std driver crate,并通过 kpu-smoke K230 QEMU case 验证设备接口。

实现逻辑

分层清晰合理:

  • drivers/npu/k230-kpu:纯 Rust/no_std,封装 KPU CFG/L2/IRQ 寄存器和常量,提供 Kpu::program_command/run_command/wait_done/status
  • StarryOS devfs 层 (kpu.rs):负责 FDT probe、iomap、IRQ handler 注册、ioctl/mmap glue,复用 driver crate。
  • kpu-smoke C 用户态测试:覆盖 device open、ioctl (GET_INFO/GET_STATUS/CLEAR/PROGRAM_COMMAND/RUN/WAIT_DONE/GET_IRQ_COUNT)、6 个 mmap 窗口、IRQ 计数和 runtime direct I/O .krun 文件复放。

IRQ wait 设计合理:IRQ wakeup (100ms timeout) + spin poll fallback,兼顾 QEMU IRQ 验证和异常容错。mmap 仅暴露 KPU 特定 MMIO 窗口,不提供通用 /dev/mem 能力。

本地验证结果

检查项 结果
cargo fmt --check ✅ 通过
cargo clippy -p k230-kpu ✅ 通过,无 warning
cargo test -p k230-kpu ✅ 4/4 通过 (command_words 编码、4G 跨窗口拒绝、空范围拒绝、UAPI 常量同步)
git diff --check ✅ 无 trailing whitespace
kpu-smoke QEMU ⚠️ 当前环境 QEMU 缺少 K230 machine model,无法运行

kpu-smoke 需要带 K230 machine/KPU model 的 QEMU,当前环境不支持,但 PR 描述已提供完整 QEMU 验证输出(KPU_SMOKE_PASS,IRQ count 0→4)。

CI 状态

所有 GitHub Actions 检查为 skipped,这是因为 K230 变更不触碰通用测试路径。没有 K230-specific CI job,本地 k230-kpu crate 测试已通过。

先前审核评论

  • ZR233 要求 rebase dev → ✅ 已 rebase(最新 dev commit 68ffbf6,当前 HEAD 03ca35e
  • ZR233 要求不加入 C header (k230_kpu_uapi.h) → ✅ 已删除
  • ZR233 建议只保留 DTB → 本 PR diff 不含 DTS 文件变更,与 rebase 后的状态一致
  • 上一次 mai-team COMMENTED review (ad6847b) 关注的问题均已修复

重复/冲突分析

已检查当前 open PR 列表(#1075 linker refactor, #1074 remove static aarch64, #1072, 等),均与本 PR 的 K230 KPU 变更无重叠。PR #1053 已关闭并入本 PR。无功能重复风险。

改进建议(非阻塞)

  1. mmap 中 CFG 和 L2 各有两组 match arm(KPU_MMAP_CFG_OFFSEToffset == cfg_paddr as u64),物理地址通路是冗余的。建议在 smoketest 验证后移除 paddr alias,统一使用固定虚拟偏移,缩小攻击面。
  2. KPU_IRQ_COUNTKPU_DONE_WQ 为全局静态变量,适用于单 KPU 实例。建议加注释说明此约束,未来多 KPU 实例时改为 per-device 计数。

结论

代码质量好,设计分层清晰,测试覆盖全面,先前提的审核意见均已修复。QEMU 验证因环境限制无法本地复现,但 PR 描述提供完整输出。批准合入。

Powered by mimo-v2.5-pro

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审核总结:feat(starryos): expose K230 KPU device (#1054)

概述

本 PR 在 StarryOS devfs 注册 /dev/kpu/dev/kpu0,新增 drivers/npu/k230-kpu no_std driver crate,实现 KPU ioctl(GET_INFO/GET_STATUS/CLEAR/PROGRAM_COMMAND/START/RUN/WAIT_DONE/GET_IRQ_COUNT)、受限 mmap 窗口(CFG/L2/fake output/runtime rdata/command/direct I/O/DDR)、IRQ-backed wait 机制,并增加 kpu-smoke K230 QEMU smoke case。

本地验证结果

检查项 结果
cargo fmt --check ✅ 通过
cargo clippy -p k230-kpu ✅ 通过,无 warning
cargo test -p k230-kpu ✅ 4/4 通过(command_words 编码/拒绝、UAPI 常量同步)
git diff --check ✅ 无 trailing whitespace
K230 QEMU kpu-smoke ⚠️ 当前环境 QEMU 无 K230 machine model,无法运行

QEMU 验证说明

当前环境 qemu-system-riscv64(10.2.1)不包含 K230 machine model,无法运行 cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke。PR 描述已提供完整 QEMU 验证输出(KPU_SMOKE_PASS,IRQ count 递增 0→6),建议在具备 K230 QEMU build 的 CI 环境中最终验证。

先前审核意见处理

  • ZR233 要求 rebase dev → ✅ 最新 HEAD 9e8f1fb 基于 dev 68ffbf6
  • ZR233 要求不加入 C header(k230_kpu_uapi.h)→ ✅ 已删除,smoke case 自包含 Rust 常量对应的 C 定义
  • 之前 mai-team 审核的改进建议已参考

代码质量评价

优点:

  1. 分层清晰k230-kpu crate 纯 Rust/no_std,只封装 KPU 寄存器和 UAPI 常量;OS 级 FDT probe、iomap、IRQ handler、devfs 注册、ioctl/mmap glue 全部在 kpu.rs 中,职责划分合理。
  2. UABI 一致性保障:Rust k230-kpu 单测 uapi_layout_and_constants_are_stable 验证 CommandRange/KpuInfo 结构体布局和全部 IOC 常量;C smoke case 同样使用 _Static_assert 校验结构体布局,双向互锁防止 ABI drift。
  3. IRQ + 轮询双路径wait_done 先尝试 IRQ wakeup(100ms timeout via WaitQueue::wait_timeout_until),失败后回退 spin polling(默认 1M 次)。这样 smoke 既能验证 QEMU IRQ 行为,又在 IRQ 不可用时有明确兜底。
  4. 受限 mmap 设计:仅暴露 KPU 特定 MMIO 窗口的固定虚拟偏移(CFG@0、L2@0x1000 等),不提供通用 /dev/mem,安全面小。
  5. FDT + 静态回退KpuResource::probe()plat-dyn 模式下优先从 FDT canaan,k230-kpu 节点解析资源;非动态模式使用硬编码常量,兼容不同 K230 平台。
  6. smoke 测试覆盖全面:1936 行 C 代码覆盖 device open、ioctl 全量命令、6 个 mmap 窗口、IRQ count 递增、GNNE runtime direct I/O 指令编排和 .krun 文件复放,包括 file-backed blob 加载。
  7. Feature 门控正确k230-kpu feature 在 starry-kernel/Cargo.toml 中正确拉入 ax-feat/xuantie-c9xxaxklibk230-kpu 依赖,starryos/Cargo.tomlk230 feature 传递启用 starry-kernel/k230-kpu

非阻塞备注:

  1. mmap paddr aliaskpu.rs mmap 中 CFG 和 L2 各有两组 match arm(虚拟偏移 + 物理地址 alias)。这是 smoke 通过物理地址访问寄存器的便捷路径,但扩大了攻击面。后续可考虑统一为纯虚拟偏移。
  2. 全局静态 IRQKPU_IRQ_COUNTKPU_DONE_WQ 是全局静态变量,适用于单 KPU 实例。建议加注释说明此约束。当前 K230 只有一个 KPU 实例,未来多实例需改为 per-device 计数。
  3. smoke 体量main.c 约 1936 行,包含完整的 .krun runtime image parser。考虑到 KPU 指令编码复杂性和可复放性需求,可以理解,后续如拆分为独立 library 可提升可维护性。

重复/冲突检查

已检查当前 open PR 列表:

  • #1075(linker refactor):draft,不触碰 K230 KPU
  • #1074(remove static aarch64):draft,不触碰 K230 KPU
  • #1072:不触碰 K230 KPU
  • #1053:已关闭,内容已并入本 PR

无功能重叠风险

CI 状态

GitHub Actions 检查均为 skipped(K230 变更不触碰通用测试路径),无 K230-specific CI job。本地 crate 测试已通过。

结论

代码质量好,分层清晰,UABI 双向互锁,IRQ+轮询设计合理,测试覆盖全面。先前提的审核意见均已修复。当前环境无法验证 K230 QEMU smoke,但 PR 描述提供完整输出。批准合入。

Powered by mimo-v2.5-pro

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审核总结:feat(starryos): expose K230 KPU device (#1054)

概述

本 PR 在 StarryOS devfs 中注册 /dev/kpu/dev/kpu0,新增 drivers/npu/k230-kpu no_std driver crate,实现 KPU ioctl(GET_INFO/GET_STATUS/CLEAR/PROGRAM_COMMAND/START/RUN/WAIT_DONE/GET_IRQ_COUNT)、受限 mmap 窗口(CFG/L2/fake output/runtime rdata/command/direct I/O/DDR)、IRQ-backed wait 机制,并增加 kpu-smoke K230 QEMU smoke case。

本地验证结果

检查项 结果
cargo fmt --check ✅ 通过
cargo clippy -p k230-kpu ✅ 通过,无 warning
cargo test -p k230-kpu ✅ 4/4 通过(command_words 编码/拒绝、UAPI 常量同步)
git diff --check ✅ 无 trailing whitespace
K230 QEMU kpu-smoke ⚠️ 当前环境 QEMU 10.2.1 不包含 K230 machine model,无法运行

QEMU 验证说明

kpu-smoke 位于 test-suit/starryos/k230-qemu/,使用 cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke 运行。当前环境的 qemu-system-riscv64(10.2.1)不包含 K230 machine model,无法在本地执行。PR 描述已提供完整 QEMU 验证输出(KPU_SMOKE_PASS,IRQ count 0→6),并包含 .krun runtime image 文件回放验证。此限制属于环境问题而非 PR 缺陷。

CI 状态

GitHub Actions 检查均为 skipped(K230 变更不触碰通用测试路径),Test starry x86_64 qemu / run_containercancelled(与本 PR 的 K230/RISC-V 变更无关,为通用 x86_64 路径)。无 K230-specific CI job。本地 k230-kpu crate 测试和 clippy 已通过。

先前审核意见处理

  • ZR233 要求 rebase dev → ✅ 已完成,当前 HEAD 基于 dev 68ffbf6
  • ZR233 要求不加入 C header(k230_kpu_uapi.h)→ ✅ 已删除,smoke case 自包含 Rust 常量对应的 C 定义
  • ZR233 建议只保留 DTB → ✅ 本 PR diff 不含 DTS 文件
  • 之前 mai-team 审核的改进建议已参考

代码质量评价

优点:

  1. 分层清晰k230-kpu crate 纯 Rust/no_std,只封装 KPU 寄存器和 UAPI 常量;OS 级 FDT probe、iomap、IRQ handler、devfs 注册、ioctl/mmap glue 全部在 kpu.rs 中。
  2. UABI 一致性保障:Rust 单测 uapi_layout_and_constants_are_stable 验证 CommandRange/KpuInfo 结构体布局和全部 IOC 常量;C smoke case 使用 _Static_assert 校验结构体布局,双向互锁防止 ABI drift。
  3. IRQ + 轮询双路径wait_done 先尝试 IRQ wakeup(100ms timeout via WaitQueue::wait_timeout_until),失败后回退 spin polling(默认 1M 次)。
  4. 受限 mmap 设计:仅暴露 KPU 特定 MMIO 窗口的固定虚拟偏移(CFG@0、L2@0x1000 等),不提供通用 /dev/mem
  5. FDT + 静态回退KpuResource::probe()plat-dyn 模式下优先从 FDT canaan,k230-kpu 节点解析资源;非动态模式使用硬编码常量。
  6. smoke 测试覆盖全面:覆盖 device open、ioctl 全量命令、6 个 mmap 窗口、IRQ count 递增、GNNE runtime direct I/O 指令编排和 .krun 文件复放。
  7. Feature 门控正确k230 feature 在 starryos/Cargo.toml 中传递启用 starry-kernel/k230-kpustarry-kernel/Cargo.toml 中正确拉入 ax-feat/xuantie-c9xxaxklibk230-kpu

非阻塞备注:

  1. mmap paddr alias:CFG 和 L2 各有两组 match arm(虚拟偏移 + 物理地址 alias),扩大了攻击面。后续可统一为纯虚拟偏移。
  2. 全局静态 IRQKPU_IRQ_COUNTKPU_DONE_WQ 为全局静态变量,适用于单 KPU 实例。当前 K230 只有一个 KPU,未来多实例需改为 per-device 计数。建议加注释说明此约束。

重复/冲突分析

已检查当前 open PR 列表:

  • #1072(mosquitto MQTT broker):不触碰 K230 KPU,无重叠
  • #1071(RISC-V64 动态 load address):不触碰 K230 KPU,无重叠
  • #1053:已关闭,内容已并入本 PR

无功能重叠或冲突风险。

结论

代码质量好,分层清晰,UABI 双向互锁,IRQ+轮询设计合理,测试覆盖全面。先前提的审核意见均已修复。K230 QEMU smoke 因环境限制无法本地复现,但 PR 描述提供完整输出,该 smoke 位于 test-suit/starryos/k230-qemu/ 正确位置。批准合入。

Powered by mimo-v2.5-pro

@mai-team-app
mai-team-app Bot requested a review from elliott10 June 1, 2026 12:55

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审核总结:feat(starryos): expose K230 KPU device (#1054)

PR 内容

本 PR 在 StarryOS devfs 中注册 /dev/kpu/dev/kpu0,新增 drivers/npu/k230-kpu no_std driver crate,实现 KPU ioctl(GET_INFO/GET_STATUS/CLEAR/PROGRAM_COMMAND/START/RUN/WAIT_DONE/GET_IRQ_COUNT)、受限 mmap 窗口(CFG/L2/fake output/runtime rdata/command/direct I/O/DDR)、IRQ-backed wait 机制,并增加 kpu-smoke K230 QEMU smoke case。

实现逻辑

分层清晰合理:

  • drivers/npu/k230-kpu:纯 Rust/no_std,封装 KPU CFG/L2/IRQ 寄存器和常量,提供 Kpu::program_command/run_command/wait_done/status
  • StarryOS devfs 层(kpu.rs):负责 FDT probe、iomap、IRQ handler 注册、ioctl/mmap glue,复用 driver crate。
  • kpu-smoke C 用户态测试:覆盖 device open、ioctl 全量命令、6 个 mmap 窗口、IRQ count 递增、GNNE runtime direct I/O .krun 文件复放。

IRQ wait 设计合理:IRQ wakeup(100ms timeout via WaitQueue::wait_timeout_until)+ spin poll fallback,兼顾 QEMU IRQ 验证和异常容错。mmap 仅暴露 KPU 特定 MMIO 窗口,不提供通用 /dev/mem 能力。

本地验证结果

检查项 结果
cargo fmt --check ✅ 通过
cargo clippy -p k230-kpu ✅ 通过,无 warning
cargo test -p k230-kpu ✅ 4/4 通过(command_words 编码/拒绝、UAPI 常量同步)
git diff --check ✅ 无 trailing whitespace
K230 QEMU kpu-smoke ⚠️ 当前环境 QEMU 10.2.1 不包含 K230 machine model,无法运行

QEMU 验证说明

kpu-smoke 位于 test-suit/starryos/k230-qemu/,使用 cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke 运行。当前环境的 qemu-system-riscv64(10.2.1)不包含 K230 machine model,无法在本地执行。PR 描述已提供完整 QEMU 验证输出(KPU_SMOKE_PASS,IRQ count 0→6),该 smoke 位于正确的 k230-qemu test-group 下而非 normal,测试位置正确。此限制属于环境问题而非 PR 缺陷。

CI 状态

GitHub Actions 检查均为 skipped(K230 变更不触碰通用测试路径),无 K230-specific CI job。本地 k230-kpu crate 测试和 clippy 已通过。

先前审核意见处理

  • ZR233 要求 rebase dev → ✅ 已完成,当前 HEAD 16539dc 基于 dev 68ffbf6
  • ZR233 要求不加入 C header(k230_kpu_uapi.h)→ ✅ 已删除,smoke case 自包含 Rust 常量对应的 C 定义
  • ZR233 建议只保留 DTB → ✅ 本 PR diff 不含 DTS 文件变更
  • 之前 mai-team 审核的改进建议已参考

代码质量评价

优点:

  1. 分层清晰k230-kpu crate 纯 Rust/no_std,只封装 KPU 寄存器和 UAPI 常量;OS 级 FDT probe、iomap、IRQ handler、devfs 注册、ioctl/mmap glue 全部在 kpu.rs 中,职责划分合理。
  2. UABI 一致性保障:Rust 单测 uapi_layout_and_constants_are_stable 验证 CommandRange/KpuInfo 结构体布局和全部 IOC 常量;C smoke case 使用 _Static_assert 校验结构体布局,双向互锁防止 ABI drift。
  3. IRQ + 轮询双路径wait_done 先尝试 IRQ wakeup(100ms timeout via WaitQueue::wait_timeout_until),失败后回退 spin polling(默认 1M 次)。
  4. 受限 mmap 设计:仅暴露 KPU 特定 MMIO 窗口的固定虚拟偏移(CFG@0、L2@0x1000 等),不提供通用 /dev/mem
  5. FDT + 静态回退KpuResource::probe()plat-dyn 模式下优先从 FDT canaan,k230-kpu 节点解析资源;非动态模式使用硬编码常量。
  6. smoke 测试覆盖全面:覆盖 device open、ioctl 全量命令、6 个 mmap 窗口、IRQ count 递增、GNNE runtime direct I/O .krun 文件复放。
  7. Feature 门控正确k230 feature 在 starryos/Cargo.toml 中传递启用 starry-kernel/k230-kpustarry-kernel/Cargo.toml 中正确拉入 ax-feat/xuantie-c9xxaxklibk230-kpu

重复/冲突分析

已检查当前 open PR 列表:

  • #1076(self-compile x86_64):不触碰 K230 KPU,无重叠
  • #1075(linker refactor):draft,不触碰 K230 KPU
  • #1074(remove static aarch64):draft,不触碰 K230 KPU
  • #1053:已关闭,内容已并入本 PR

无功能重叠或冲突风险。

结论

代码质量好,分层清晰,UABI 双向互锁,IRQ+轮询设计合理,测试覆盖全面。先前提的审核意见均已修复。K230 QEMU smoke 因环境限制无法本地复现,但 PR 描述提供完整输出,该 smoke 位于正确的 test-suit/starryos/k230-qemu/ 位置。批准合入。

Powered by mimo-v2.5-pro

),
offset if offset == self.resource.cfg_paddr as u64 && self.resource.cfg_size != 0 => {
DeviceMmap::Physical(
PhysAddrRange::from_start_size(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CFG 和 L2 的 mmap 各有两组 match arm(虚拟偏移 + 物理地址 alias)。物理地址通路是 smoke 通过 paddr 访问寄存器的便捷路径,但扩大了攻击面——用户态可以通过传入物理地址直接映射 KPU CFG/L2 区域。建议后续在 smoke 验证完成后统一为纯虚拟偏移路径,移除 paddr alias。当前不阻塞合入。

KPU_MMAP_RUNTIME_DDR_OFFSET, KPU_MMAP_RUNTIME_DIRECT_IO_OFFSET, KPU_MMAP_RUNTIME_RDATA_OFFSET,
Kpu, KpuInfo,
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

KPU_IRQ_COUNTKPU_DONE_WQ 是全局静态变量,适用于 K230 单 KPU 实例。建议加注释说明此约束,未来多 KPU 实例时需改为 per-device 计数。当前不阻塞合入。

@Joshua912815
Joshua912815 requested a review from ZR233 June 1, 2026 15:55

@ZR233 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本轮先请求修改,原因集中在 K230 QEMU 验证的可复现性。

这个 PR 的核心验证依赖带 k230 machine/KPU model 的非上游 QEMU;当前 README 只写了需要 target/qemu-k230-docker-build,但没有说明该 QEMU 从哪里获取、如何构建、对应哪个 fork/commit/patch、需要哪些依赖、以及如何把该 build 放到测试命令可发现的位置。实际在普通 QEMU 10.1/10.2/11.0 环境下运行 cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke 会失败为 unsupported machine type: "k230",因此现有说明不足以让 reviewer 或维护者复现 PR 声称的 KPU_SMOKE_PASS

请补充文档或脚本,明确获取/构建带 K230 machine model 的 QEMU 的步骤,并在补充后的步骤下重新运行 cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke,把验证结果同步到 PR 说明中。

Comment thread test-suit/starryos/k230-qemu/README.md Outdated

Local validation requires a QEMU build with the K230 machine model. The expected
layout is `target/qemu-k230-docker-build` relative to the repository root; put
that directory before the default QEMU path when running this group.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里需要补充可复现的 K230 QEMU 获取或构建方法。当前只说明需要 target/qemu-k230-docker-build,但没有给出对应 fork/commit/patch、构建命令、依赖、产物布局以及如何让 cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke 使用这个 QEMU。普通上游 QEMU 10.1/10.2/11.0 都不包含 k230 machine,本地按现有说明运行会在 QEMU 启动阶段失败为 unsupported machine type: "k230",因此 reviewer 无法复现 PR 里的 KPU_SMOKE_PASS。请补充脚本或文档,并用补充后的步骤重新跑一次 kpu-smoke

Copy link
Copy Markdown
Contributor Author

已处理本轮 review:

  • 新增 test-suit/starryos/k230-qemu/prepare-k230-qemu.sh,并在 README 中补充 K230 QEMU fork/ref/commit、Docker/Linux 依赖、输出目录布局,以及 cargo xtask 通过 PATH 选择 K230 QEMU 的方式。
  • 将 K230 QEMU config 的 -L 路径统一到 ${workspace}/target/qemu-k230-docker-build/pc-bios,和 README/脚本产物布局一致。
  • 移除 CFG/L2 mmap 的物理地址 alias,只保留固定虚拟 offset 路径。
  • KPU_IRQ_COUNT / KPU_DONE_WQ 补充单 KPU 实例约束说明。
  • 已同步更新 PR 描述中的 review 更新和验证记录。

本轮重新验证:

cargo fmt --check
bash -n test-suit/starryos/k230-qemu/prepare-k230-qemu.sh
cargo xtask clippy --package starry-kernel
git diff --check

并在 Docker/Linux 下用 target/qemu-k230-docker-build 中的 K230 QEMU 重新执行:

cargo xtask starry test qemu --test-group k230-qemu --arch riscv64 -c kpu-smoke

关键结果:

KPU_SMOKE_PASS
PASS kpu-smoke
all starry k230-qemu qemu tests passed

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审核总结:feat(starryos): expose K230 KPU device (#1054)

PR 内容

本 PR 在 StarryOS devfs 中注册 /dev/kpu/dev/kpu0,新增 drivers/npu/k230-kpu no_std driver crate,实现 KPU ioctl(GET_INFO/GET_STATUS/CLEAR/PROGRAM_COMMAND/START/RUN/WAIT_DONE/GET_IRQ_COUNT)、受限 mmap 窗口(CFG/L2/fake output/runtime rdata/command/direct I/O/DDR)、IRQ-backed wait 机制,并增加 kpu-smoke K230 QEMU smoke case。同时新增 prepare-k230-qemu.sh 脚本,文档化 K230 QEMU fork 的获取、构建和使用方式。

实现逻辑

分层清晰合理:

  • drivers/npu/k230-kpu:纯 Rust/no_std,封装 KPU CFG/L2/IRQ 寄存器和 UAPI 常量,提供 Kpu::program_command/run_command/wait_done/status。4 个单测覆盖 command_words 编码/拒绝和 UAPI 结构体布局+常量稳定性。
  • StarryOS devfs 层(kpu.rs):负责 FDT probe、iomap、IRQ handler 注册、ioctl/mmap glue,复用 driver crate。mmap 仅使用固定虚拟偏移(CFG@0、L2@0x1000 等),不含物理地址 alias,安全面小。
  • kpu-smoke C 用户态测试:覆盖 device open、ioctl 全量命令、6 个 mmap 窗口、IRQ count 递增、GNNE runtime direct I/O .krun 文件复放。

IRQ wait 设计合理:IRQ wakeup(100ms timeout via WaitQueue::wait_timeout_until)+ spin poll fallback,兼顾 QEMU IRQ 验证和异常容错。KPU_IRQ_COUNTKPU_DONE_WQ 已有注释说明单 KPU 实例约束。

Feature 门控正确:starryos/k230 feature 传递启用 starry-kernel/k230-kpustarry-kernel/Cargo.toml 中正确拉入 ax-feat/xuantie-c9xxaxklibk230-kpu 依赖。

本地验证结果

检查项 结果
cargo fmt --check ✅ 通过
cargo test -p k230-kpu ✅ 4/4 通过(command_words 编码/拒绝、UAPI 常量同步)
bash -n prepare-k230-qemu.sh ✅ 通过
git diff --check ✅ 无 trailing whitespace
K230 QEMU kpu-smoke ⚠️ 当前环境 QEMU 不包含 K230 machine model,无法运行

kpu-smoke 需要带 K230 machine/KPU model 的 QEMU fork(zevorn/qemu.git,commit 539bd413),当前环境不支持。PR 描述已提供完整 QEMU 验证输出(KPU_SMOKE_PASS,IRQ count 0→6),prepare-k230-qemu.sh 脚本文档化了完整的获取/构建/运行流程,reviewer 和维护者可复现。

CI 状态

GitHub Actions 检查均为 skipped(K230 变更不触碰通用测试路径),无 K230-specific CI job。本地 k230-kpu crate 测试和 fmt 已通过。

先前审核意见处理

  • ZR233 要求 rebase dev → ✅ 已完成,当前 HEAD 92587ad 基于 dev 68ffbf6
  • ZR233 要求不加入 C header(k230_kpu_uapi.h)→ ✅ 已删除,smoke case 自包含测试侧常量
  • ZR233 要求补充 K230 QEMU 获取/构建文档 → ✅ 已新增 prepare-k230-qemu.sh 和 README,包含 fork URL/ref/commit、依赖要求、构建产物布局、PATH 使用方式
  • ZR233 要求移除 mmap paddr alias → ✅ 已移除,只保留固定虚拟 offset 路径
  • mai-bot 建议全局 IRQ 静态加注释 → ✅ 已加注释说明单 KPU 实例约束

重复/冲突分析

已检查当前 open PR 列表:

  • #1080(feat/std std-aware builds):不触碰 K230 KPU,无重叠
  • #1076(self-compile x86_64):不触碰 K230 KPU,无重叠
  • #1075(linker refactor):draft,不触碰 K230 KPU
  • #1074(remove static aarch64):draft,不触碰 K230 KPU
  • #1053:已关闭,内容已并入本 PR

无功能重叠或冲突风险。

结论

代码质量好,分层清晰,UABI 双向互锁,IRQ+轮询设计合理,测试覆盖全面。Z233 所提的全部审核意见(rebase、移除 C header、QEMU 文档、mmap paddr alias、IRQ 注释)均已修复。K230 QEMU smoke 因环境限制无法本地复现,但 prepare-k230-qemu.sh 脚本和 README 已提供完整可复现路径。批准合入。

Powered by mimo-v2.5-pro

@ZR233
ZR233 merged commit 888b6ab into rcore-os:dev Jun 2, 2026
49 checks passed

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审核总结:feat(starryos): expose K230 KPU device (#1054)

PR 内容

本 PR 在 StarryOS devfs 中注册 /dev/kpu/dev/kpu0,新增 drivers/npu/k230-kpu no_std driver crate,实现 KPU ioctl(GET_INFO/GET_STATUS/CLEAR/PROGRAM_COMMAND/START/RUN/WAIT_DONE/GET_IRQ_COUNT)、受限 mmap 窗口(CFG/L2/fake output/runtime rdata/command/direct I/O/DDR)、IRQ-backed wait 机制,并增加 kpu-smoke K230 QEMU smoke case 和 prepare-k230-qemu.sh 脚本。

本地验证结果

检查项 结果
cargo fmt --check ✅ 通过
cargo clippy -p k230-kpu -- -D warnings ✅ 通过,无 warning
cargo test -p k230-kpu ✅ 4/4 通过(command_words 编码/拒绝、UAPI 常量同步)
git diff --check ✅ 无 trailing whitespace
K230 QEMU kpu-smoke ⚠️ 当前环境 QEMU 不含 K230 machine model,无法运行

kpu-smoke 需要带 K230 machine/KPU model 的 QEMU fork(zevorn/qemu.git,commit 539bd413),当前环境不支持。PR 描述已提供完整 QEMU 验证输出(KPU_SMOKE_PASS,IRQ count 0→6),prepare-k230-qemu.sh 脚本和 README 已提供完整可复现路径。

CI 状态

GitHub Actions 检查均为 skipped(K230 变更不触碰通用测试路径),无失败。无 K230-specific CI job。本地 k230-kpu crate 测试和 clippy 已通过。

先前审核意见处理

  • ZR233 要求 rebase dev → ✅ 已完成
  • ZR233 要求不加入 C header(k230_kpu_uapi.h)→ ✅ 已删除
  • ZR233 要求补充 K230 QEMU 获取/构建文档 → ✅ 已新增 prepare-k230-qemu.sh 和 README
  • ZR233 要求移除 mmap paddr alias → ✅ 已移除,只保留固定虚拟 offset 路径
  • 之前 mai-bot 建议全局 IRQ 静态加注释 → ✅ 已加注释说明单 KPU 实例约束
  • ZR233 最终已 APPROVE(2026-06-02T07:20:10Z)

代码质量评价

优点:

  1. 分层清晰k230-kpu crate 纯 Rust/no_std,只封装 KPU 寄存器和 UAPI 常量;OS 级 FDT probe、iomap、IRQ handler、devfs 注册、ioctl/mmap glue 全部在 kpu.rs 中,与现有 TPU/RTC 等设备驱动模式一致。
  2. UABI 一致性保障:Rust 单测 uapi_layout_and_constants_are_stable 验证 CommandRange/KpuInfo 结构体布局和全部 IOC 常量;C smoke case 使用 _Static_assert 校验结构体布局,双向互锁防止 ABI drift。
  3. IRQ + 轮询双路径wait_done 先尝试 IRQ wakeup(100ms timeout via WaitQueue::wait_timeout_until),失败后回退 spin polling(默认 1M 次)。
  4. 受限 mmap 设计:仅暴露 KPU 特定 MMIO 窗口的固定虚拟偏移,不提供通用 /dev/mem,安全面小。
  5. FDT + 静态回退KpuResource::probe()plat-dyn 模式下优先从 FDT 解析资源;非动态模式使用硬编码常量。
  6. Feature 门控正确starryos/k230 feature 传递启用 starry-kernel/k230-kpu,依赖链正确。
  7. QEMU 可复现性prepare-k230-qemu.sh 文档化了完整的 fork/ref/commit/依赖/构建/布局流程。

非阻塞备注:

  1. 全局静态 IRQKPU_IRQ_COUNTKPU_DONE_WQ 为全局静态变量,已有注释说明单 KPU 实例约束。当前 K230 只有一个 KPU,未来多实例需改为 per-device 计数。
  2. smoke 体量main.c 约 1936 行,包含完整的 .krun runtime image parser。考虑到 KPU 指令编码复杂性和可复放性需求,可以理解。

重复/冲突分析

已检查当前 open PR 列表,均与本 PR 的 K230 KPU 变更无重叠。#1053 已关闭并入本 PR。无功能重叠或冲突风险。

结论

代码质量好,分层清晰,UABI 双向互锁,IRQ+轮询设计合理,测试覆盖全面。先前提的全部审核意见(rebase、移除 C header、QEMU 文档、mmap paddr alias、IRQ 注释)均已修复。ZR233 已最终 APPROVE。批准合入。

Powered by mimo-v2.5-pro

@github-actions github-actions Bot mentioned this pull request Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants