summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorriastradh <riastradh@NetBSD.org>2022-03-19 11:55:03 +0000
committerriastradh <riastradh@NetBSD.org>2022-03-19 11:55:03 +0000
commitfa5a7cd4feae6182b6f5f4e96eb094546fa352ea (patch)
treed5a343a59180b85a9efeeb5f727cbe5b8c1f3502
parentb2f23986bc461ea1f2c7b9f45d032fc63b597ba3 (diff)
rnd(9): Omit needless locks in various HWRNG drivers.
Now that the rnd(9) API guarantees serial callbacks, we can simplify everything a bit more. (Some drivers like hifn(4) and sun8icrypto(4) still use locks to coordinate with other parts of the driver to submit requests to and process responses from the device.)
-rw-r--r--sys/arch/arm/broadcom/bcm2835_rng.c8
-rw-r--r--sys/arch/arm/omap/am335x_trng.c9
-rw-r--r--sys/arch/arm/ti/ti_rng.c9
-rw-r--r--sys/arch/mips/cavium/dev/octeon_rnm.c18
-rw-r--r--sys/arch/mips/ingenic/ingenic_rng.c9
-rw-r--r--sys/dev/ic/amdccp.c7
-rw-r--r--sys/dev/ic/amdccpvar.h3
-rw-r--r--sys/dev/ic/rng200.c7
-rw-r--r--sys/dev/ic/rng200var.h3
9 files changed, 17 insertions, 56 deletions
diff --git a/sys/arch/arm/broadcom/bcm2835_rng.c b/sys/arch/arm/broadcom/bcm2835_rng.c
index 04061c76731..c759ce04908 100644
--- a/sys/arch/arm/broadcom/bcm2835_rng.c
+++ b/sys/arch/arm/broadcom/bcm2835_rng.c
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_rng.c,v 1.16 2022/03/19 11:37:05 riastradh Exp $ */
+/* $NetBSD: bcm2835_rng.c,v 1.17 2022/03/19 11:55:03 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_rng.c,v 1.16 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_rng.c,v 1.17 2022/03/19 11:55:03 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -58,7 +58,6 @@ struct bcm2835rng_softc {
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
- kmutex_t sc_lock;
krndsource_t sc_rndsource;
};
@@ -121,7 +120,6 @@ bcmrng_attach(device_t parent, device_t self, void *aux)
bus_space_write_4(sc->sc_iot, sc->sc_ioh, RNG_CTRL, ctrl);
/* set up an rndsource */
- mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
rndsource_setcb(&sc->sc_rndsource, &bcmrng_get, sc);
rnd_attach_source(&sc->sc_rndsource, device_xname(self), RND_TYPE_RNG,
RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB);
@@ -134,7 +132,6 @@ bcmrng_get(size_t bytes_wanted, void *arg)
uint32_t status, cnt;
uint32_t buf[RNG_DATA_MAX]; /* 1k on the stack */
- mutex_enter(&sc->sc_lock);
while (bytes_wanted) {
status = bus_space_read_4(sc->sc_iot, sc->sc_ioh, RNG_STATUS);
cnt = __SHIFTOUT(status, RNG_STATUS_CNT);
@@ -148,5 +145,4 @@ bcmrng_get(size_t bytes_wanted, void *arg)
bytes_wanted -= MIN(bytes_wanted, (cnt * 4));
}
explicit_memset(buf, 0, sizeof(buf));
- mutex_exit(&sc->sc_lock);
}
diff --git a/sys/arch/arm/omap/am335x_trng.c b/sys/arch/arm/omap/am335x_trng.c
index ebfb3a4d967..76d99a34d07 100644
--- a/sys/arch/arm/omap/am335x_trng.c
+++ b/sys/arch/arm/omap/am335x_trng.c
@@ -1,4 +1,4 @@
-/* $NetBSD: am335x_trng.c,v 1.4 2022/03/19 11:37:05 riastradh Exp $ */
+/* $NetBSD: am335x_trng.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca>
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: am335x_trng.c,v 1.4 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: am335x_trng.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $");
#include "opt_omap.h"
@@ -56,7 +56,6 @@ struct trng_softc {
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
- kmutex_t sc_lock;
krndsource_t sc_rndsource;
};
@@ -99,8 +98,6 @@ trng_attach(device_t parent, device_t self, void *aux)
return;
}
- mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
prcm_module_enable(&rng_module);
if ((TRNG_READ(sc, TRNG_CONTROL_REG) & TRNG_CONTROL_ENABLE) == 0) {
@@ -127,7 +124,6 @@ trng_callback(size_t bytes_wanted, void *priv)
uint32_t buf[2];
u_int retry;
- mutex_enter(&sc->sc_lock);
while (bytes_wanted) {
for (retry = 10; retry > 0; retry--) {
if (TRNG_READ(sc, TRNG_STATUS_REG) & TRNG_STATUS_READY)
@@ -144,5 +140,4 @@ trng_callback(size_t bytes_wanted, void *priv)
bytes_wanted -= MIN(bytes_wanted, sizeof(buf));
}
explicit_memset(buf, 0, sizeof(buf));
- mutex_exit(&sc->sc_lock);
}
diff --git a/sys/arch/arm/ti/ti_rng.c b/sys/arch/arm/ti/ti_rng.c
index a0a59bc4a09..4270ab64490 100644
--- a/sys/arch/arm/ti/ti_rng.c
+++ b/sys/arch/arm/ti/ti_rng.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ti_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $ */
+/* $NetBSD: ti_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca>
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ti_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ti_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -51,7 +51,6 @@ struct ti_rng_softc {
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
- kmutex_t sc_lock;
krndsource_t sc_rndsource;
};
@@ -101,8 +100,6 @@ ti_rng_attach(device_t parent, device_t self, void *aux)
return;
}
- mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
if ((RD4(sc, TRNG_CONTROL_REG) & TRNG_CONTROL_ENABLE) == 0) {
WR4(sc, TRNG_CONFIG_REG,
__SHIFTIN(0x21, TRNG_CONFIG_MIN_REFILL) |
@@ -127,7 +124,6 @@ ti_rng_callback(size_t bytes_wanted, void *priv)
uint32_t buf[2];
u_int retry;
- mutex_enter(&sc->sc_lock);
while (bytes_wanted) {
for (retry = 10; retry > 0; retry--) {
if (RD4(sc, TRNG_STATUS_REG) & TRNG_STATUS_READY)
@@ -144,5 +140,4 @@ ti_rng_callback(size_t bytes_wanted, void *priv)
bytes_wanted -= MIN(bytes_wanted, sizeof(buf));
}
explicit_memset(buf, 0, sizeof(buf));
- mutex_exit(&sc->sc_lock);
}
diff --git a/sys/arch/mips/cavium/dev/octeon_rnm.c b/sys/arch/mips/cavium/dev/octeon_rnm.c
index c5736edbcb5..f0ef235fe03 100644
--- a/sys/arch/mips/cavium/dev/octeon_rnm.c
+++ b/sys/arch/mips/cavium/dev/octeon_rnm.c
@@ -1,4 +1,4 @@
-/* $NetBSD: octeon_rnm.c,v 1.14 2022/03/19 11:37:05 riastradh Exp $ */
+/* $NetBSD: octeon_rnm.c,v 1.15 2022/03/19 11:55:03 riastradh Exp $ */
/*
* Copyright (c) 2007 Internet Initiative Japan, Inc.
@@ -99,7 +99,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: octeon_rnm.c,v 1.14 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: octeon_rnm.c,v 1.15 2022/03/19 11:55:03 riastradh Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -127,7 +127,6 @@ struct octrnm_softc {
uint64_t sc_sample[RNG_FIFO_WORDS];
bus_space_tag_t sc_bust;
bus_space_handle_t sc_regh;
- kmutex_t sc_lock;
krndsource_t sc_rndsrc; /* /dev/random source */
unsigned sc_rogroup;
};
@@ -184,9 +183,6 @@ octrnm_attach(device_t parent, device_t self, void *aux)
return;
}
- /* Create a mutex to serialize access to the FIFO. */
- mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
/*
* Reset the core, enable the RNG engine without entropy, wait
* 81 cycles for it to produce a single sample, and draw the
@@ -230,7 +226,6 @@ octrnm_rng(size_t nbytes, void *vsc)
unsigned i;
/* Sample the ring oscillators round-robin. */
- mutex_enter(&sc->sc_lock);
while (needed) {
/*
* Switch to the next RO group once we drain the FIFO.
@@ -262,14 +257,9 @@ octrnm_rng(size_t nbytes, void *vsc)
sizeof sc->sc_sample, NBBY*sizeof(sc->sc_sample)/BPB);
needed -= MIN(needed, MAX(1, NBBY*sizeof(sc->sc_sample)/BPB));
- /* Now's a good time to yield if need. */
- if (__predict_false(preempt_needed())) {
- mutex_exit(&sc->sc_lock);
- preempt();
- mutex_enter(&sc->sc_lock);
- }
+ /* Now's a good time to yield. */
+ preempt_point();
}
- mutex_exit(&sc->sc_lock);
/* Zero the sample. */
explicit_memset(sc->sc_sample, 0, sizeof sc->sc_sample);
diff --git a/sys/arch/mips/ingenic/ingenic_rng.c b/sys/arch/mips/ingenic/ingenic_rng.c
index 9f4d1ba01f3..791b45fea89 100644
--- a/sys/arch/mips/ingenic/ingenic_rng.c
+++ b/sys/arch/mips/ingenic/ingenic_rng.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ingenic_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $ */
+/* $NetBSD: ingenic_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $ */
/*-
* Copyright (c) 2015 Michael McConville
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ingenic_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ingenic_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $");
/*
* adapted from Jared McNeill's amlogic_rng.c
@@ -59,7 +59,6 @@ struct ingenic_rng_softc {
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
- kmutex_t sc_lock;
krndsource_t sc_rndsource;
};
@@ -94,8 +93,6 @@ ingenic_rng_attach(device_t parent, device_t self, void *aux)
return;
}
- mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
aprint_naive(": Ingenic random number generator\n");
aprint_normal(": Ingenic random number generator\n");
@@ -110,7 +107,6 @@ ingenic_rng_get(size_t bytes_wanted, void *priv)
struct ingenic_rng_softc * const sc = priv;
uint32_t data;
- mutex_enter(&sc->sc_lock);
while (bytes_wanted) {
data = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 0);
delay(1);
@@ -119,5 +115,4 @@ ingenic_rng_get(size_t bytes_wanted, void *priv)
bytes_wanted -= MIN(bytes_wanted, sizeof(data));
}
explicit_memset(&data, 0, sizeof(data));
- mutex_exit(&sc->sc_lock);
}
diff --git a/sys/dev/ic/amdccp.c b/sys/dev/ic/amdccp.c
index 6d3071c40b3..702fd5b2277 100644
--- a/sys/dev/ic/amdccp.c
+++ b/sys/dev/ic/amdccp.c
@@ -1,4 +1,4 @@
-/* $NetBSD: amdccp.c,v 1.4 2022/03/19 11:37:06 riastradh Exp $ */
+/* $NetBSD: amdccp.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $ */
/*
* Copyright (c) 2018 Jonathan A. Kollasch
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdccp.c,v 1.4 2022/03/19 11:37:06 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdccp.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -45,7 +45,6 @@ void
amdccp_common_attach(struct amdccp_softc *sc)
{
- mutex_init(&sc->sc_rndlock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
rndsource_setcb(&sc->sc_rndsource, amdccp_rnd_callback, sc);
rnd_attach_source(&sc->sc_rndsource, device_xname(sc->sc_dev),
RND_TYPE_RNG, RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB);
@@ -74,7 +73,6 @@ amdccp_rnd_callback(size_t bytes_wanted, void *priv)
uint32_t buf[128];
size_t cnt;
- mutex_enter(&sc->sc_rndlock);
while (bytes_wanted) {
const size_t nbytes = MIN(bytes_wanted, sizeof(buf));
const size_t nwords = howmany(nbytes, sizeof(buf[0]));
@@ -95,5 +93,4 @@ amdccp_rnd_callback(size_t bytes_wanted, void *priv)
bytes_wanted -= MIN(bytes_wanted, cntby);
}
explicit_memset(buf, 0, sizeof(buf));
- mutex_exit(&sc->sc_rndlock);
}
diff --git a/sys/dev/ic/amdccpvar.h b/sys/dev/ic/amdccpvar.h
index 92698f94a9a..e95a56eac81 100644
--- a/sys/dev/ic/amdccpvar.h
+++ b/sys/dev/ic/amdccpvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: amdccpvar.h,v 1.1 2018/10/19 21:09:10 jakllsch Exp $ */
+/* $NetBSD: amdccpvar.h,v 1.2 2022/03/19 11:55:03 riastradh Exp $ */
/*
* Copyright (c) 2018 Jonathan A. Kollasch
@@ -38,7 +38,6 @@ struct amdccp_softc {
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
- kmutex_t sc_rndlock;
krndsource_t sc_rndsource;
};
diff --git a/sys/dev/ic/rng200.c b/sys/dev/ic/rng200.c
index f16e26f8f63..692f0480c3d 100644
--- a/sys/dev/ic/rng200.c
+++ b/sys/dev/ic/rng200.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rng200.c,v 1.3 2022/03/19 11:37:06 riastradh Exp $ */
+/* $NetBSD: rng200.c,v 1.4 2022/03/19 11:55:03 riastradh Exp $ */
/*
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -79,7 +79,6 @@ rng200_get(size_t bytes_wanted, void *priv)
uint32_t w, data;
unsigned count;
- mutex_enter(&sc->sc_lock);
while (bytes_wanted) {
w = READ4(sc, RNG200_STATUS);
@@ -98,15 +97,12 @@ rng200_get(size_t bytes_wanted, void *priv)
bytes_wanted -= MIN(bytes_wanted, sizeof(data));
}
explicit_memset(&data, 0, sizeof(data));
- mutex_exit(&sc->sc_lock);
}
void
rng200_attach(struct rng200_softc *sc)
{
- mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
rndsource_setcb(&sc->sc_rndsource, rng200_get, sc);
rnd_attach_source(&sc->sc_rndsource, sc->sc_name,
RND_TYPE_RNG, RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB);
@@ -117,6 +113,5 @@ rng200_detach(struct rng200_softc *sc)
{
rnd_detach_source(&sc->sc_rndsource);
- mutex_destroy(&sc->sc_lock);
}
diff --git a/sys/dev/ic/rng200var.h b/sys/dev/ic/rng200var.h
index fe00d799ee5..3fc770e3eaf 100644
--- a/sys/dev/ic/rng200var.h
+++ b/sys/dev/ic/rng200var.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rng200var.h,v 1.1 2019/09/01 14:44:14 mlelstv Exp $ */
+/* $NetBSD: rng200var.h,v 1.2 2022/03/19 11:55:03 riastradh Exp $ */
/*
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -41,7 +41,6 @@ struct rng200_softc {
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh;
- kmutex_t sc_lock;
krndsource_t sc_rndsource;
const char *sc_name;
};