Beispiel #1
0
void
tcbus_attach(device_t parent, device_t self, void *aux)
{
	struct vsbus_attach_args * const va = aux;
	struct tcbus_softc * const sc = device_private(self);
	struct tcbus_attach_args tba;
	struct pte *pte;
	const size_t nentries = 32768;
	int error;
	int i;

	error = bus_space_map(va->va_memt, KA4x_TURBO, 0x10000,
	    BUS_SPACE_MAP_LINEAR, &sc->sc_memh);
	if (error) {
		aprint_error(": failed to map TC slot 0: %d\n", error);
		return;
	}

	sc->sc_slots[0].tcs_addr = sc->sc_memh;
	sc->sc_slots[0].tcs_cookie = sc;

	tba.tba_speed = TC_SPEED_12_5_MHZ;
	tba.tba_slots = sc->sc_slots;
	tba.tba_nslots = 1;
	tba.tba_intr_evcnt = tcbus_intr_evcnt;
	tba.tba_intr_establish = tcbus_intr_establish;
	tba.tba_intr_disestablish = tcbus_intr_disestablish;
	tba.tba_get_dma_tag = tcbus_get_dma_tag;

	vax_sgmap_dmatag_init(&sc->sc_dmatag, sc, nentries);
	pte = (struct pte *) vax_map_physmem(KA4x_TURBOMAPS,
	    nentries * sizeof(pte[0]));

	for (i = nentries; i > 0; )
		((uint32_t *) pte)[--i] = 0;

	sc->sc_dmatag._sgmap = &sc->sc_sgmap;
	/*
	 * Initialize the SGMAP.
	 */
	vax_sgmap_init(&sc->sc_dmatag, &sc->sc_sgmap, "tc_sgmap",
	     sc->sc_dmatag._wbase, sc->sc_dmatag._wsize, pte, 0);

	aprint_normal("\n");

	aprint_verbose_dev(self, "32K entry DMA SGMAP at PA 0x%x (VA %p)\n",
	     KA4x_TURBOMAPS, pte);

	tcbus_dmat = &sc->sc_dmatag;

	/* XXX: why not config_found(9)?? */
	tcattach(parent, self, &tba);
}
Beispiel #2
0
void
uba_dma_init(struct uba_vsoftc *sc)
{
	bus_dma_tag_t t;
	struct pte *pte;

	/*
	 * Initialize the DMA tag used for sgmap-mapped DMA.
	 */
	t = &sc->uv_dmat;
	t->_cookie = sc;
	t->_wbase = 0;
	t->_wsize = sc->uv_size;
	t->_boundary = 0;
	t->_sgmap = &sc->uv_sgmap;
	t->_dmamap_create = uba_bus_dmamap_create_sgmap;
	t->_dmamap_destroy = uba_bus_dmamap_destroy_sgmap;
	t->_dmamap_load = uba_bus_dmamap_load_sgmap;
	t->_dmamap_load_mbuf = uba_bus_dmamap_load_mbuf_sgmap;
	t->_dmamap_load_uio = uba_bus_dmamap_load_uio_sgmap;
	t->_dmamap_load_raw = uba_bus_dmamap_load_raw_sgmap;
	t->_dmamap_unload = uba_bus_dmamap_unload_sgmap;
	t->_dmamap_sync = uba_bus_dmamap_sync;

	t->_dmamem_alloc = _bus_dmamem_alloc;
	t->_dmamem_free = _bus_dmamem_free;
	t->_dmamem_map = _bus_dmamem_map;
	t->_dmamem_unmap = _bus_dmamem_unmap;
	t->_dmamem_mmap = _bus_dmamem_mmap;

	/*
	 * Map in Unibus map registers, if not mapped in already.
	 */
	if (sc->uv_uba) {
		pte = sc->uv_uba->uba_map;
	} else {
		pte = (struct pte *)vax_map_physmem(sc->uv_addr,
		    vax_btoc(vax_btoc(sc->uv_size) * sizeof(struct pte)));
		if (pte == 0)
			panic("uba_dma_init");
	}
	/*
	 * Initialize the SGMAP.
	 */
	vax_sgmap_init(t, &sc->uv_sgmap, "uba_sgmap", 0, sc->uv_size, pte, 0);

}