diff --git a/sys/dev/fdt/rkclock.c b/sys/dev/fdt/rkclock.c index 90ec196d52c..5cf37730bbd 100644 --- a/sys/dev/fdt/rkclock.c +++ b/sys/dev/fdt/rkclock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rkclock.c,v 1.98 2026/05/04 08:00:27 kettenis Exp $ */ +/* $OpenBSD: rkclock.c,v 1.99 2026/05/05 10:23:27 kettenis Exp $ */ /* * Copyright (c) 2017, 2018 Mark Kettenis * @@ -4494,6 +4494,10 @@ rk3576_reset(void *cookie, uint32_t *cells, int on) reg = RK3576_PHPTOPCRU_SOFTRST_CON(1); bit = 8; break; + case RK3576_SRST_H_TRNG_NS: + reg = RK3576_SECURECRU_SOFTRST_CON(0); + bit = 4; + break; case RK3576_SRST_P_OTPC_NS: reg = RK3576_SECURECRU_SOFTRST_CON(0); bit = 8; diff --git a/sys/dev/fdt/rkclock_clocks.h b/sys/dev/fdt/rkclock_clocks.h index 382f3d6e16d..0422993b2d0 100644 --- a/sys/dev/fdt/rkclock_clocks.h +++ b/sys/dev/fdt/rkclock_clocks.h @@ -494,6 +494,7 @@ #define RK3576_SRST_P_PCIE2_COMBOPHY1 419 #define RK3576_SRST_PCIE0_PIPE_PHY 421 #define RK3576_SRST_PCIE1_PIPE_PHY 422 +#define RK3576_SRST_H_TRNG_NS 424 #define RK3576_SRST_P_OTPC_NS 425 #define RK3576_SRST_OTPC_NS 426 diff --git a/sys/dev/fdt/rkrng.c b/sys/dev/fdt/rkrng.c index 71a6fedc4ae..541abfe1d77 100644 --- a/sys/dev/fdt/rkrng.c +++ b/sys/dev/fdt/rkrng.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rkrng.c,v 1.8 2025/10/09 19:25:37 kettenis Exp $ */ +/* $OpenBSD: rkrng.c,v 1.9 2026/05/05 10:23:27 kettenis Exp $ */ /* * Copyright (c) 2020 Mark Kettenis * @@ -56,6 +56,14 @@ #define TRNG_SAMPLE_CNT 0x0404 #define TRNG_DOUT_BASE 0x0410 +/* RK3576 TRNG */ +#define RKRNG_CFG 0x0000 +#define RKRNG_CTRL 0x0010 +#define RKRNG_CTRL_REQ_TRNG ((1U << 4) << 16 | (1U << 4)) +#define RKRNG_STATE 0x0014 +#define RKRNG_STATE_TRNG_RDY (1U << 4) +#define RKRNG_TRNG_DATA0 0x0050 + /* RK3588 TRNG */ #define TRNG_V1_CTRL 0x0000 #define TRNG_V1_CTRL_NOP 0x00 @@ -135,13 +143,23 @@ static const struct rkrng_v rkrnv_v2 = { .dout = TRNG_DOUT_BASE, }; +void rkrng_rk3576_start(struct rkrng_softc *); +int rkrng_rk3576_starting(struct rkrng_softc *); +void rkrng_rk3576_stop(struct rkrng_softc *); + +static const struct rkrng_v rkrnv_rk3576 = { + .start = rkrng_rk3576_start, + .starting = rkrng_rk3576_starting, + .stop = rkrng_rk3576_stop, + .dout = RKRNG_TRNG_DATA0, +}; + int rkrng_rk3588_init(struct rkrng_softc *); void rkrng_rk3588_start(struct rkrng_softc *); int rkrng_rk3588_starting(struct rkrng_softc *); void rkrng_rk3588_stop(struct rkrng_softc *); static const struct rkrng_v rkrnv_rk3588 = { - .version = 3, .init = rkrng_rk3588_init, .start = rkrng_rk3588_start, .starting = rkrng_rk3588_starting, @@ -160,6 +178,7 @@ rkrng_match(struct device *parent, void *match, void *aux) OF_is_compatible(faa->fa_node, "rockchip,rk3399-crypto") || OF_is_compatible(faa->fa_node, "rockchip,cryptov2-rng") || OF_is_compatible(faa->fa_node, "rockchip,rk3568-rng") || + OF_is_compatible(faa->fa_node, "rockchip,rk3576-rng") || OF_is_compatible(faa->fa_node, "rockchip,rk3588-rng"); } @@ -177,6 +196,8 @@ rkrng_attach(struct device *parent, struct device *self, void *aux) else if (OF_is_compatible(faa->fa_node, "rockchip,cryptov2-rng") || OF_is_compatible(faa->fa_node, "rockchip,rk3568-rng")) sc->sc_v = &rkrnv_v2; + else if (OF_is_compatible(faa->fa_node, "rockchip,rk3576-rng")) + sc->sc_v = &rkrnv_rk3576; else if (OF_is_compatible(faa->fa_node, "rockchip,rk3588-rng")) sc->sc_v = &rkrnv_rk3588; else { @@ -196,7 +217,13 @@ rkrng_attach(struct device *parent, struct device *self, void *aux) return; } - printf(": ver %u\n", sc->sc_v->version); + if (sc->sc_v->version > 0) + printf(": ver %u", sc->sc_v->version); + printf("\n"); + + reset_assert_all(faa->fa_node); + delay(2); + reset_deassert_all(faa->fa_node); clock_set_assigned(faa->fa_node); clock_enable_all(faa->fa_node); @@ -256,6 +283,27 @@ rkrng_v2_stop(struct rkrng_softc *sc) HWRITE4(sc, TRNG_CTL, (ctl_m << 16) | 0); } +void +rkrng_rk3576_start(struct rkrng_softc *sc) +{ + HWRITE4(sc, RKRNG_CTRL, RKRNG_CTRL_REQ_TRNG); +} + +int +rkrng_rk3576_starting(struct rkrng_softc *sc) +{ + if ((HREAD4(sc, RKRNG_STATE) & RKRNG_STATE_TRNG_RDY) == 0) + return 1; + + HWRITE4(sc, RKRNG_STATE, RKRNG_STATE_TRNG_RDY); + return 0; +} + +void +rkrng_rk3576_stop(struct rkrng_softc *sc) +{ +} + int rkrng_rk3588_init(struct rkrng_softc *sc) {