示例#1
0
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);
}
示例#2
0
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;
}
示例#3
0
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);
	}
}
示例#4
0
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);
}
示例#5
0
文件: viornd.c 项目: ryo/netbsd-src
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;
}