#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: tc_dma_3000_500.c,v 1.24 2021/07/18 05:12:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/kernel.h>
#include <sys/kmem.h>
#define _ALPHA_BUS_DMA_PRIVATE
#include <sys/bus.h>
#include <dev/tc/tcvar.h>
#include <alpha/tc/tc_sgmap.h>
#include <alpha/tc/tc_dma_3000_500.h>
struct alpha_bus_dma_tag tc_dmat_sgmap = {
NULL,
0,
0,
NULL,
0,
NULL,
PAGE_SIZE,
0,
NULL,
tc_bus_dmamap_create_sgmap,
tc_bus_dmamap_destroy_sgmap,
tc_bus_dmamap_load_sgmap,
tc_bus_dmamap_load_mbuf_sgmap,
tc_bus_dmamap_load_uio_sgmap,
tc_bus_dmamap_load_raw_sgmap,
tc_bus_dmamap_unload_sgmap,
_bus_dmamap_sync,
_bus_dmamem_alloc,
_bus_dmamem_free,
_bus_dmamem_map,
_bus_dmamem_unmap,
_bus_dmamem_mmap,
};
struct tc_dma_slot_info {
struct alpha_sgmap tdsi_sgmap;
struct alpha_bus_dma_tag tdsi_dmat;
};
struct tc_dma_slot_info *tc_dma_slot_info;
void
tc_dma_init_3000_500(int nslots)
{
extern struct alpha_bus_dma_tag tc_dmat_direct;
size_t sisize;
int i;
sisize = nslots * sizeof(struct tc_dma_slot_info);
tc_dma_slot_info = kmem_zalloc(sisize, KM_SLEEP);
for (i = 0; i < nslots; i++)
memcpy(&tc_dma_slot_info[i].tdsi_dmat, &tc_dmat_direct,
sizeof(tc_dma_slot_info[i].tdsi_dmat));
}
bus_dma_tag_t
tc_dma_get_tag_3000_500(int slot)
{
return (&tc_dma_slot_info[slot].tdsi_dmat);
}
int
tc_bus_dmamap_create_sgmap(
bus_dma_tag_t t,
bus_size_t size,
int nsegments,
bus_size_t maxsegsz,
bus_size_t boundary,
int flags,
bus_dmamap_t *dmamp)
{
int error;
error = _bus_dmamap_create(t, size, nsegments, maxsegsz,
boundary, flags, dmamp);
if (error)
return (error);
(void)*dmamp;
return (error);
}
void
tc_bus_dmamap_destroy_sgmap(bus_dma_tag_t t, bus_dmamap_t map)
{
KASSERT(map->dm_mapsize == 0);
_bus_dmamap_destroy(t, map);
}
int
tc_bus_dmamap_load_sgmap(bus_dma_tag_t t, bus_dmamap_t map, void *buf, bus_size_t buflen, struct proc *p, int flags)
{
struct tc_dma_slot_info *tdsi = t->_cookie;
return (tc_sgmap_load(t, map, buf, buflen, p, flags,
&tdsi->tdsi_sgmap));
}
int
tc_bus_dmamap_load_mbuf_sgmap(bus_dma_tag_t t, bus_dmamap_t map, struct mbuf *m, int flags)
{
struct tc_dma_slot_info *tdsi = t->_cookie;
return (tc_sgmap_load_mbuf(t, map, m, flags, &tdsi->tdsi_sgmap));
}
int
tc_bus_dmamap_load_uio_sgmap(bus_dma_tag_t t, bus_dmamap_t map, struct uio *uio, int flags)
{
struct tc_dma_slot_info *tdsi = t->_cookie;
return (tc_sgmap_load_uio(t, map, uio, flags, &tdsi->tdsi_sgmap));
}
int
tc_bus_dmamap_load_raw_sgmap(bus_dma_tag_t t, bus_dmamap_t map, bus_dma_segment_t *segs, int nsegs, bus_size_t size, int flags)
{
struct tc_dma_slot_info *tdsi = t->_cookie;
return (tc_sgmap_load_raw(t, map, segs, nsegs, size, flags,
&tdsi->tdsi_sgmap));
}
void
tc_bus_dmamap_unload_sgmap(bus_dma_tag_t t, bus_dmamap_t map)
{
struct tc_dma_slot_info *tdsi = t->_cookie;
tc_sgmap_unload(t, map, &tdsi->tdsi_sgmap);
_bus_dmamap_unload_common(t, map);
}