1
0
mirror of https://github.com/openbsd/src.git synced 2026-06-18 15:23:33 +02:00

Add RK3576 support.

ok dlg@
This commit is contained in:
kettenis
2026-05-05 10:23:27 +00:00
parent 9845333fcb
commit 1193c4b79d
3 changed files with 57 additions and 4 deletions
+5 -1
View File
@@ -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 <kettenis@openbsd.org>
*
@@ -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;
+1
View File
@@ -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
+51 -3
View File
@@ -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 <kettenis@openbsd.org>
*
@@ -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)
{