RK3588 Rockchip TRNG 驱动
1. 匹配
hw_random/rockchip-rng.c支持四类硬件:
| Compatible | 实现 |
|---|---|
rockchip,cryptov1-rng |
Crypto V1内嵌TRNG |
rockchip,cryptov2-rng |
Crypto V2 RNG window |
rockchip,trngv1 |
独立TRNG V1 |
rockchip,rkrng |
新RKRNG/DRNG接口 |
RK3588节点使用rockchip,trngv1。
2. DTS
SoC定义:
1 | rng: rng@fe378000 { |
rk3588-linux.dtsi和Android include将其设为okay。最终板级是否启用取决于实际include和运行DTB。
驱动当前使用MMIO、clock和polling;DTS IRQ/reset属性没有被此文件显式获取。
3. Probe
1 | rk_rng_probe |
每次read通过runtime PM启用clock,结束后mark last busy并autosuspend。
4. TRNG V1初始化
trng_v1_init():
- 校验VERSION为
0x46bc; - 检查seeded/generating/reseeding;
- 必要时poll到仅SEEDED;
- 清ISTAT;
- 设置auto reseed count 1000。
源码对某次poll返回值没有用于终止后续初始化,调试seed异常时应关注状态是否实际稳定。
5. 读取
trng_v1_read():
- 清旧ISTAT;
- 选择256-bit mode;
- 发RAND命令;
- udelay 10us;
- 若未ready,poll最多50ms;
- 最多读取32字节RAND0–RAND7;
- 清status并写NOP停止。
Core请求超过32字节时,外层rk_rng_read()循环多次生成。
6. 寄存器字节序
rk_rng_read_regs()对每个32-bit结果执行be32_to_cpu()。这表示driver按硬件输出字节序重新排列,再写入用户buffer;跨平台统计时不要直接拿寄存器dump与/dev/hwrng字节串逐字节比较。
7. Runtime PM
- resume:bulk enable clocks;
- suspend:bulk disable/unprepare;
- system sleep:
pm_runtime_force_suspend/resume。
Read用pm_runtime_get_sync(),失败时put_noidle();正常完成put_sync_autosuspend()。
8. 超时
Poll周期100us、总超时50ms。Timeout返回负errno并关闭生成器。若/dev/hwrng卡顿:
- 查secure clock;
- 查SCMI reset/firmware;
- 查TRNG version/status;
- 查runtime PM;
- 查安全世界是否占用;
- 查低频/电源域。
9. 安全评估
quality=999使后台线程几乎按满熵credit。产品应确认:
- 硬件有在线健康测试;
- secure firmware正确初始化;
- reset后不会重复输出;
- 多核并发由Core reading mutex串行;
- 故障不会返回全0;
- bootloader seed和TRNG不会共享可预测状态。
10. 运行验证
1 | cat /sys/class/misc/hw_random/rng_available |
统计测试只能发现部分明显故障,不能证明密码学安全。
正在加载留言…