xref: /openbsd-src/sys/dev/ic/ccp.c (revision 8eadc5ec180d138c03464eee5b23b29a4079a186)
1*8eadc5ecSjsg /*	$OpenBSD: ccp.c,v 1.11 2024/09/04 07:45:08 jsg Exp $ */
25f5e4d1bSdlg 
35f5e4d1bSdlg /*
45f5e4d1bSdlg  * Copyright (c) 2018 David Gwynne <dlg@openbsd.org>
55f5e4d1bSdlg  *
65f5e4d1bSdlg  * Permission to use, copy, modify, and distribute this software for any
75f5e4d1bSdlg  * purpose with or without fee is hereby granted, provided that the above
85f5e4d1bSdlg  * copyright notice and this permission notice appear in all copies.
95f5e4d1bSdlg  *
105f5e4d1bSdlg  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
115f5e4d1bSdlg  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
125f5e4d1bSdlg  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
135f5e4d1bSdlg  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
145f5e4d1bSdlg  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
155f5e4d1bSdlg  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
165f5e4d1bSdlg  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
175f5e4d1bSdlg  */
185f5e4d1bSdlg 
195f5e4d1bSdlg #include <sys/param.h>
205f5e4d1bSdlg #include <sys/systm.h>
215f5e4d1bSdlg #include <sys/device.h>
225f5e4d1bSdlg #include <sys/timeout.h>
235f5e4d1bSdlg 
245f5e4d1bSdlg #include <machine/bus.h>
255f5e4d1bSdlg 
265f5e4d1bSdlg #include <dev/ic/ccpvar.h>
275f5e4d1bSdlg 
285f5e4d1bSdlg #define CCP_REG_TRNG		0xc
295f5e4d1bSdlg 
305f5e4d1bSdlg static void	ccp_rng(void *);
315f5e4d1bSdlg 
325f5e4d1bSdlg struct cfdriver ccp_cd = {
335f5e4d1bSdlg 	NULL,
345f5e4d1bSdlg 	"ccp",
355f5e4d1bSdlg 	DV_DULL
365f5e4d1bSdlg };
375f5e4d1bSdlg 
385f5e4d1bSdlg void
395f5e4d1bSdlg ccp_attach(struct ccp_softc *sc)
405f5e4d1bSdlg {
415f5e4d1bSdlg 	timeout_set(&sc->sc_tick, ccp_rng, sc);
425f5e4d1bSdlg 	ccp_rng(sc);
435f5e4d1bSdlg 
44*8eadc5ecSjsg 	printf("\n");
455f5e4d1bSdlg }
465f5e4d1bSdlg 
475f5e4d1bSdlg static void
485f5e4d1bSdlg ccp_rng(void *arg)
495f5e4d1bSdlg {
505f5e4d1bSdlg 	struct ccp_softc *sc = arg;
515f5e4d1bSdlg 	uint32_t trng;
525f5e4d1bSdlg 
535f5e4d1bSdlg 	trng = bus_space_read_4(sc->sc_iot, sc->sc_ioh, CCP_REG_TRNG);
545f5e4d1bSdlg 	if (trng != 0)
559e9abf5bSjasper 		enqueue_randomness(trng);
565f5e4d1bSdlg 
575f5e4d1bSdlg 	timeout_add_msec(&sc->sc_tick, 100);
585f5e4d1bSdlg }
59