tangled
alpha
login
or
join now
jcs.org
/
openbsd-src
0
fork
atom
jcs's openbsd hax
openbsd
0
fork
atom
overview
issues
pulls
pipelines
Add RK3588 support.
ok dlg@
kettenis
6 months ago
4fbcdec9
5668f3d1
+86
-2
1 changed file
expand all
collapse all
unified
split
sys
dev
fdt
rkrng.c
+86
-2
sys/dev/fdt/rkrng.c
reviewed
···
1
1
-
/* $OpenBSD: rkrng.c,v 1.7 2025/09/30 14:18:26 kettenis Exp $ */
1
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
59
+
/* RK3588 TRNG */
60
60
+
#define TRNG_V1_CTRL 0x0000
61
61
+
#define TRNG_V1_CTRL_NOP 0x00
62
62
+
#define TRNG_V1_CTRL_RAND 0x01
63
63
+
#define TRNG_V1_STAT 0x0004
64
64
+
#define TRNG_V1_STAT_SEEDED (1U << 9)
65
65
+
#define TRNG_V1_STAT_GENERATING (1U << 30)
66
66
+
#define TRNG_V1_STAT_RESEEDING (1U << 31)
67
67
+
#define TRNG_V1_MODE 0x0008
68
68
+
#define TRNG_V1_MODE_256_BIT (1U << 3)
69
69
+
#define TRNG_V1_ISTAT 0x0014
70
70
+
#define TRNG_V1_ISTAT_RAND_RDY (1U << 0)
71
71
+
#define TRNG_V1_RAND0 0x0020
72
72
+
#define TRNG_V1_AUTO_RQSTS 0x0060
73
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
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
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
138
+
int rkrng_rk3588_init(struct rkrng_softc *);
139
139
+
void rkrng_rk3588_start(struct rkrng_softc *);
140
140
+
int rkrng_rk3588_starting(struct rkrng_softc *);
141
141
+
void rkrng_rk3588_stop(struct rkrng_softc *);
142
142
+
143
143
+
static const struct rkrng_v rkrnv_rk3588 = {
144
144
+
.version = 3,
145
145
+
.init = rkrng_rk3588_init,
146
146
+
.start = rkrng_rk3588_start,
147
147
+
.starting = rkrng_rk3588_starting,
148
148
+
.stop = rkrng_rk3588_stop,
149
149
+
.dout = TRNG_V1_RAND0,
150
150
+
};
151
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
131
-
OF_is_compatible(faa->fa_node, "rockchip,rk3568-rng");
162
162
+
OF_is_compatible(faa->fa_node, "rockchip,rk3568-rng") ||
163
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
180
+
else if (OF_is_compatible(faa->fa_node, "rockchip,rk3588-rng"))
181
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
203
+
204
204
+
if (sc->sc_v->init && sc->sc_v->init(sc)) {
205
205
+
printf("%s: initialization failed\n", sc->sc_dev.dv_xname);
206
206
+
return;
207
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
257
+
}
258
258
+
259
259
+
int
260
260
+
rkrng_rk3588_init(struct rkrng_softc *sc)
261
261
+
{
262
262
+
uint32_t stat;
263
263
+
uint32_t mask;
264
264
+
int timo;
265
265
+
266
266
+
mask = TRNG_V1_STAT_SEEDED;
267
267
+
mask |= TRNG_V1_STAT_GENERATING | TRNG_V1_STAT_RESEEDING;
268
268
+
for (timo = 100; timo > 0; timo--) {
269
269
+
stat = HREAD4(sc, TRNG_V1_STAT);
270
270
+
if ((stat & mask) == TRNG_V1_STAT_SEEDED)
271
271
+
break;
272
272
+
delay(100);
273
273
+
}
274
274
+
if (timo == 0)
275
275
+
return ETIMEDOUT;
276
276
+
277
277
+
HWRITE4(sc, TRNG_V1_ISTAT, HREAD4(sc, TRNG_V1_ISTAT));
278
278
+
HWRITE4(sc, TRNG_V1_AUTO_RQSTS, 1000);
279
279
+
280
280
+
return 0;
281
281
+
}
282
282
+
283
283
+
void
284
284
+
rkrng_rk3588_start(struct rkrng_softc *sc)
285
285
+
{
286
286
+
HWRITE4(sc, TRNG_V1_ISTAT, HREAD4(sc, TRNG_V1_ISTAT));
287
287
+
HWRITE4(sc, TRNG_V1_MODE, TRNG_V1_MODE_256_BIT);
288
288
+
HWRITE4(sc, TRNG_V1_CTRL, TRNG_V1_CTRL_RAND);
289
289
+
}
290
290
+
291
291
+
int
292
292
+
rkrng_rk3588_starting(struct rkrng_softc *sc)
293
293
+
{
294
294
+
return ((HREAD4(sc, TRNG_V1_ISTAT) & TRNG_V1_ISTAT_RAND_RDY) == 0);
295
295
+
}
296
296
+
297
297
+
void
298
298
+
rkrng_rk3588_stop(struct rkrng_softc *sc)
299
299
+
{
300
300
+
HWRITE4(sc, TRNG_V1_ISTAT, HREAD4(sc, TRNG_V1_ISTAT));
301
301
+
HWRITE4(sc, TRNG_V1_CTRL, TRNG_V1_CTRL_NOP);
218
302
}
219
303
220
304
void