jcs's openbsd hax
openbsd

Add RK3588 support.

ok dlg@

kettenis 4fbcdec9 5668f3d1

+86 -2
+86 -2
sys/dev/fdt/rkrng.c
··· 1 - /* $OpenBSD: rkrng.c,v 1.7 2025/09/30 14:18:26 kettenis Exp $ */ 1 + /* $OpenBSD: rkrng.c,v 1.8 2025/10/09 19:25:37 kettenis Exp $ */ 2 2 /* 3 3 * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org> 4 4 * ··· 56 56 #define TRNG_SAMPLE_CNT 0x0404 57 57 #define TRNG_DOUT_BASE 0x0410 58 58 59 + /* RK3588 TRNG */ 60 + #define TRNG_V1_CTRL 0x0000 61 + #define TRNG_V1_CTRL_NOP 0x00 62 + #define TRNG_V1_CTRL_RAND 0x01 63 + #define TRNG_V1_STAT 0x0004 64 + #define TRNG_V1_STAT_SEEDED (1U << 9) 65 + #define TRNG_V1_STAT_GENERATING (1U << 30) 66 + #define TRNG_V1_STAT_RESEEDING (1U << 31) 67 + #define TRNG_V1_MODE 0x0008 68 + #define TRNG_V1_MODE_256_BIT (1U << 3) 69 + #define TRNG_V1_ISTAT 0x0014 70 + #define TRNG_V1_ISTAT_RAND_RDY (1U << 0) 71 + #define TRNG_V1_RAND0 0x0020 72 + #define TRNG_V1_AUTO_RQSTS 0x0060 73 + 59 74 #define HREAD4(sc, reg) \ 60 75 (bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (reg))) 61 76 #define HWRITE4(sc, reg, val) \ ··· 75 90 76 91 struct rkrng_v { 77 92 unsigned int version; 93 + int (*init)(struct rkrng_softc *sc); 78 94 void (*start)(struct rkrng_softc *sc); 79 95 int (*starting)(struct rkrng_softc *sc); 80 96 void (*stop)(struct rkrng_softc *sc); ··· 106 122 .dout = RNG_DATA0, 107 123 }; 108 124 125 + int rkrng_v2_init(struct rkrng_softc *); 109 126 void rkrng_v2_start(struct rkrng_softc *); 110 127 int rkrng_v2_starting(struct rkrng_softc *); 111 128 void rkrng_v2_stop(struct rkrng_softc *); ··· 118 135 .dout = TRNG_DOUT_BASE, 119 136 }; 120 137 138 + int rkrng_rk3588_init(struct rkrng_softc *); 139 + void rkrng_rk3588_start(struct rkrng_softc *); 140 + int rkrng_rk3588_starting(struct rkrng_softc *); 141 + void rkrng_rk3588_stop(struct rkrng_softc *); 142 + 143 + static const struct rkrng_v rkrnv_rk3588 = { 144 + .version = 3, 145 + .init = rkrng_rk3588_init, 146 + .start = rkrng_rk3588_start, 147 + .starting = rkrng_rk3588_starting, 148 + .stop = rkrng_rk3588_stop, 149 + .dout = TRNG_V1_RAND0, 150 + }; 151 + 121 152 int 122 153 rkrng_match(struct device *parent, void *match, void *aux) 123 154 { ··· 128 159 OF_is_compatible(faa->fa_node, "rockchip,rk3328-crypto") || 129 160 OF_is_compatible(faa->fa_node, "rockchip,rk3399-crypto") || 130 161 OF_is_compatible(faa->fa_node, "rockchip,cryptov2-rng") || 131 - OF_is_compatible(faa->fa_node, "rockchip,rk3568-rng"); 162 + OF_is_compatible(faa->fa_node, "rockchip,rk3568-rng") || 163 + OF_is_compatible(faa->fa_node, "rockchip,rk3588-rng"); 132 164 } 133 165 134 166 void ··· 145 177 else if (OF_is_compatible(faa->fa_node, "rockchip,cryptov2-rng") || 146 178 OF_is_compatible(faa->fa_node, "rockchip,rk3568-rng")) 147 179 sc->sc_v = &rkrnv_v2; 180 + else if (OF_is_compatible(faa->fa_node, "rockchip,rk3588-rng")) 181 + sc->sc_v = &rkrnv_rk3588; 148 182 else { 149 183 printf(": unhandled version\n"); 150 184 return; ··· 166 200 167 201 clock_set_assigned(faa->fa_node); 168 202 clock_enable_all(faa->fa_node); 203 + 204 + if (sc->sc_v->init && sc->sc_v->init(sc)) { 205 + printf("%s: initialization failed\n", sc->sc_dev.dv_xname); 206 + return; 207 + } 169 208 170 209 timeout_set(&sc->sc_to, rkrng_rnd, sc); 171 210 rkrng_rnd(sc); ··· 215 254 uint32_t ctl_m = TRNG_CTL_RNG_START | TRNG_CTL_RNG_ENABLE; 216 255 217 256 HWRITE4(sc, TRNG_CTL, (ctl_m << 16) | 0); 257 + } 258 + 259 + int 260 + rkrng_rk3588_init(struct rkrng_softc *sc) 261 + { 262 + uint32_t stat; 263 + uint32_t mask; 264 + int timo; 265 + 266 + mask = TRNG_V1_STAT_SEEDED; 267 + mask |= TRNG_V1_STAT_GENERATING | TRNG_V1_STAT_RESEEDING; 268 + for (timo = 100; timo > 0; timo--) { 269 + stat = HREAD4(sc, TRNG_V1_STAT); 270 + if ((stat & mask) == TRNG_V1_STAT_SEEDED) 271 + break; 272 + delay(100); 273 + } 274 + if (timo == 0) 275 + return ETIMEDOUT; 276 + 277 + HWRITE4(sc, TRNG_V1_ISTAT, HREAD4(sc, TRNG_V1_ISTAT)); 278 + HWRITE4(sc, TRNG_V1_AUTO_RQSTS, 1000); 279 + 280 + return 0; 281 + } 282 + 283 + void 284 + rkrng_rk3588_start(struct rkrng_softc *sc) 285 + { 286 + HWRITE4(sc, TRNG_V1_ISTAT, HREAD4(sc, TRNG_V1_ISTAT)); 287 + HWRITE4(sc, TRNG_V1_MODE, TRNG_V1_MODE_256_BIT); 288 + HWRITE4(sc, TRNG_V1_CTRL, TRNG_V1_CTRL_RAND); 289 + } 290 + 291 + int 292 + rkrng_rk3588_starting(struct rkrng_softc *sc) 293 + { 294 + return ((HREAD4(sc, TRNG_V1_ISTAT) & TRNG_V1_ISTAT_RAND_RDY) == 0); 295 + } 296 + 297 + void 298 + rkrng_rk3588_stop(struct rkrng_softc *sc) 299 + { 300 + HWRITE4(sc, TRNG_V1_ISTAT, HREAD4(sc, TRNG_V1_ISTAT)); 301 + HWRITE4(sc, TRNG_V1_CTRL, TRNG_V1_CTRL_NOP); 218 302 } 219 303 220 304 void