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