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); }
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); }