static void ingenic_rng_attach(device_t parent, device_t self, void *aux) { struct ingenic_rng_softc * const sc = device_private(self); const struct apbus_attach_args * const aa = aux; bus_addr_t addr = aa->aa_addr; int error; sc->sc_dev = self; sc->sc_bst = aa->aa_bst; if (addr == 0) addr = JZ_RNG; error = bus_space_map(aa->aa_bst, addr, 4, 0, &sc->sc_bsh); if (error) { aprint_error_dev(self, "can't map registers for %s: %d\n", aa->aa_name, error); return; } mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); aprint_naive(": Ingenic random number generator\n"); aprint_normal(": Ingenic random number generator\n"); rndsource_setcb(&sc->sc_rndsource, ingenic_rng_get, sc); rnd_attach_source(&sc->sc_rndsource, device_xname(self), RND_TYPE_RNG, RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB); ingenic_rng_get(RND_POOLBITS / NBBY, sc); }
static void bcmrng_attach(device_t parent, device_t self, void *aux) { struct bcm2835rng_softc *sc = device_private(self); struct amba_attach_args *aaa = aux; uint32_t ctrl; aprint_naive("\n"); aprint_normal(": RNG\n"); sc->sc_dev = self; sc->sc_iot = aaa->aaa_iot; if (bus_space_map(aaa->aaa_iot, aaa->aaa_addr, BCM2835_RNG_SIZE, 0, &sc->sc_ioh)) { aprint_error_dev(sc->sc_dev, "unable to map device\n"); goto fail0; } /* discard initial numbers, broadcom says they are "less random" */ bus_space_write_4(sc->sc_iot, sc->sc_ioh, RNG_STATUS, 0x40000); /* enable rng */ ctrl = bus_space_read_4(sc->sc_iot, sc->sc_ioh, RNG_CTRL); ctrl |= RNG_CTRL_EN; bus_space_write_4(sc->sc_iot, sc->sc_ioh, RNG_CTRL, ctrl); /* set up a softint for adding data */ mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SERIAL); sc->sc_bytes_wanted = 0; sc->sc_sih = softint_establish(SOFTINT_SERIAL|SOFTINT_MPSAFE, &bcmrng_get_intr, sc); if (sc->sc_sih == NULL) { aprint_error_dev(sc->sc_dev, "unable to establish softint"); goto fail1; } /* set up an rndsource */ mutex_init(&sc->sc_rnd_lock, MUTEX_DEFAULT, IPL_SERIAL); rndsource_setcb(&sc->sc_rndsource, &bcmrng_get_cb, sc); rnd_attach_source(&sc->sc_rndsource, device_xname(self), RND_TYPE_RNG, RND_FLAG_NO_ESTIMATE|RND_FLAG_HASCB); /* get some initial entropy ASAP */ bcmrng_get_cb(RND_POOLBITS / NBBY, sc); /* Success! */ return; fail1: mutex_destroy(&sc->sc_intr_lock); bus_space_unmap(aaa->aaa_iot, sc->sc_ioh, BCM2835_RNG_SIZE); fail0: return; }
void rump_hyperentropy_init(void) { if (rump_threads) { rndsource_setcb(&rndsrc, feedrandom, &rndsrc); rnd_attach_source(&rndsrc, "rump_hyperent", RND_TYPE_VM, RND_FLAG_NO_ESTIMATE|RND_FLAG_HASCB); } else { /* without threads, just fill the pool */ rnd_attach_source(&rndsrc, "rump_hyperent", RND_TYPE_VM, RND_FLAG_NO_ESTIMATE); feedrandom(RND_POOLBITS/NBBY, NULL); } }
static void ingenic_rng_attach(device_t parent, device_t self, void *aux) { struct ingenic_rng_softc * const sc = device_private(self); struct apbus_attach_args * const aa = aux; int error; sc->sc_dev = self; sc->sc_bst = aa->aa_bst; if (aa->aa_addr == 0) { aa->aa_addr = JZ_RNG; } error = bus_space_map(aa->aa_bst, aa->aa_addr, 4, 0, &sc->sc_bsh); if (error) { aprint_error_dev(self, "can't map registers for %s: %d\n", aa->aa_name, error); return; } mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SERIAL); mutex_init(&sc->sc_rnd_lock, MUTEX_DEFAULT, IPL_SERIAL); aprint_naive(": Ingenic random number generator\n"); aprint_normal(": Ingenic random number generator\n"); sc->sc_sih = softint_establish(SOFTINT_SERIAL|SOFTINT_MPSAFE, ingenic_rng_get_intr, sc); if (sc->sc_sih == NULL) { aprint_error_dev(self, "couldn't establish softint\n"); return; } rndsource_setcb(&sc->sc_rndsource, ingenic_rng_get_cb, sc); rnd_attach_source(&sc->sc_rndsource, device_xname(self), RND_TYPE_RNG, RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB); ingenic_rng_get_cb(RND_POOLBITS / NBBY, sc); }
void viornd_attach( device_t parent, device_t self, void *aux) { struct viornd_softc *sc = device_private(self); struct virtio_softc *vsc = device_private(parent); bus_dma_segment_t segs[1]; int nsegs; int error; uint32_t features; char buf[256]; vsc->sc_vqs = &sc->sc_vq; vsc->sc_nvqs = 1; vsc->sc_config_change = NULL; if (vsc->sc_child != NULL) panic("already attached to something else"); vsc->sc_child = self; vsc->sc_ipl = IPL_NET; vsc->sc_intrhand = virtio_vq_intr; sc->sc_virtio = vsc; sc->sc_dev = self; features = virtio_negotiate_features(vsc, 0); snprintb(buf, sizeof(buf), VIRTIO_COMMON_FLAG_BITS, features); aprint_normal(": Features: %s\n", buf); aprint_naive("\n"); mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_VM); error = bus_dmamem_alloc(vsc->sc_dmat, VIRTIO_PAGE_SIZE, 0, 0, segs, 1, &nsegs, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); if (error) { aprint_error_dev(sc->sc_dev, "can't alloc dmamem: %d\n", error); goto alloc_failed; } error = bus_dmamem_map(vsc->sc_dmat, segs, nsegs, VIORND_BUFSIZE, &sc->sc_buf, BUS_DMA_NOWAIT); if (error) { aprint_error_dev(sc->sc_dev, "can't map dmamem: %d\n", error); goto map_failed; } error = bus_dmamap_create(vsc->sc_dmat, VIORND_BUFSIZE, 1, VIORND_BUFSIZE, 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->sc_dmamap); if (error) { aprint_error_dev(sc->sc_dev, "can't alloc dmamap: %d\n", error); goto create_failed; } error = bus_dmamap_load(vsc->sc_dmat, sc->sc_dmamap, sc->sc_buf, VIORND_BUFSIZE, NULL, BUS_DMA_NOWAIT|BUS_DMA_READ); if (error) { aprint_error_dev(sc->sc_dev, "can't load dmamap: %d\n", error); goto load_failed; } error = virtio_alloc_vq(vsc, &sc->sc_vq, 0, VIORND_BUFSIZE, 1, "Entropy request"); if (error) { aprint_error_dev(sc->sc_dev, "can't alloc virtqueue: %d\n", error); goto vio_failed; } sc->sc_vq.vq_done = viornd_vq_done; virtio_start_vq_intr(vsc, &sc->sc_vq); rndsource_setcb(&sc->sc_rndsource, viornd_get, sc); rnd_attach_source(&sc->sc_rndsource, device_xname(sc->sc_dev), RND_TYPE_RNG, RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB); viornd_get(VIORND_BUFSIZE, sc); return; vio_failed: bus_dmamap_unload(vsc->sc_dmat, sc->sc_dmamap); load_failed: bus_dmamap_destroy(vsc->sc_dmat, sc->sc_dmamap); create_failed: bus_dmamem_unmap(vsc->sc_dmat, sc->sc_buf, VIORND_BUFSIZE); map_failed: bus_dmamem_free(vsc->sc_dmat, segs, nsegs); alloc_failed: vsc->sc_child = (void *)1; /* XXX bare constant 1 */ return; }