summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/arch/arm64/dev/smmu.c66
-rw-r--r--sys/arch/arm64/dev/smmu_fdt.c3
-rw-r--r--sys/arch/arm64/dev/smmuvar.h5
3 files changed, 33 insertions, 41 deletions
diff --git a/sys/arch/arm64/dev/smmu.c b/sys/arch/arm64/dev/smmu.c
index 175af795595..fd5fbd80615 100644
--- a/sys/arch/arm64/dev/smmu.c
+++ b/sys/arch/arm64/dev/smmu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smmu.c,v 1.1 2021/02/28 21:39:31 patrick Exp $ */
+/* $OpenBSD: smmu.c,v 1.2 2021/03/01 21:35:03 patrick Exp $ */
/*
* Copyright (c) 2008-2009,2014-2016 Dale Rahn <drahn@dalerahn.com>
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
@@ -514,33 +514,25 @@ smmu_device_hook(struct smmu_softc *sc, uint32_t sid, bus_dma_tag_t dmat)
dom = smmu_domain_lookup(sc, sid);
if (dom == NULL)
return dmat;
- if (dom->sd_parent_dmat == NULL)
- dom->sd_parent_dmat = dmat;
- if (dom->sd_parent_dmat != dmat &&
- memcmp(dom->sd_parent_dmat, dmat, sizeof(*dmat)) != 0) {
- printf("%s: different dma tag for same stream\n",
- sc->sc_dev.dv_xname);
- return dmat;
- }
- if (dom->sd_device_dmat == NULL) {
- dom->sd_device_dmat = malloc(sizeof(*dom->sd_device_dmat),
+ if (dom->sd_dmat == NULL) {
+ dom->sd_dmat = malloc(sizeof(*dom->sd_dmat),
M_DEVBUF, M_WAITOK);
- memcpy(dom->sd_device_dmat, dom->sd_parent_dmat,
- sizeof(*dom->sd_device_dmat));
- dom->sd_device_dmat->_cookie = dom;
- dom->sd_device_dmat->_dmamap_create = smmu_dmamap_create;
- dom->sd_device_dmat->_dmamap_destroy = smmu_dmamap_destroy;
- dom->sd_device_dmat->_dmamap_load = smmu_dmamap_load;
- dom->sd_device_dmat->_dmamap_load_mbuf = smmu_dmamap_load_mbuf;
- dom->sd_device_dmat->_dmamap_load_uio = smmu_dmamap_load_uio;
- dom->sd_device_dmat->_dmamap_load_raw = smmu_dmamap_load_raw;
- dom->sd_device_dmat->_dmamap_unload = smmu_dmamap_unload;
- dom->sd_device_dmat->_dmamap_sync = smmu_dmamap_sync;
- dom->sd_device_dmat->_dmamem_map = smmu_dmamem_map;
+ memcpy(dom->sd_dmat, sc->sc_dmat,
+ sizeof(*dom->sd_dmat));
+ dom->sd_dmat->_cookie = dom;
+ dom->sd_dmat->_dmamap_create = smmu_dmamap_create;
+ dom->sd_dmat->_dmamap_destroy = smmu_dmamap_destroy;
+ dom->sd_dmat->_dmamap_load = smmu_dmamap_load;
+ dom->sd_dmat->_dmamap_load_mbuf = smmu_dmamap_load_mbuf;
+ dom->sd_dmat->_dmamap_load_uio = smmu_dmamap_load_uio;
+ dom->sd_dmat->_dmamap_load_raw = smmu_dmamap_load_raw;
+ dom->sd_dmat->_dmamap_unload = smmu_dmamap_unload;
+ dom->sd_dmat->_dmamap_sync = smmu_dmamap_sync;
+ dom->sd_dmat->_dmamem_map = smmu_dmamem_map;
}
- return dom->sd_device_dmat;
+ return dom->sd_dmat;
}
void
@@ -1265,7 +1257,7 @@ smmu_dmamap_create(bus_dma_tag_t t, bus_size_t size, int nsegments,
{
struct smmu_domain *dom = t->_cookie;
- return dom->sd_parent_dmat->_dmamap_create(dom->sd_parent_dmat, size,
+ return dom->sd_sc->sc_dmat->_dmamap_create(dom->sd_sc->sc_dmat, size,
nsegments, maxsegsz, boundary, flags, dmamp);
}
@@ -1274,7 +1266,7 @@ smmu_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t map)
{
struct smmu_domain *dom = t->_cookie;
- dom->sd_parent_dmat->_dmamap_destroy(dom->sd_parent_dmat, map);
+ dom->sd_sc->sc_dmat->_dmamap_destroy(dom->sd_sc->sc_dmat, map);
}
int
@@ -1284,14 +1276,14 @@ smmu_dmamap_load(bus_dma_tag_t t, bus_dmamap_t map, void *buf,
struct smmu_domain *dom = t->_cookie;
int error;
- error = dom->sd_parent_dmat->_dmamap_load(dom->sd_parent_dmat, map,
+ error = dom->sd_sc->sc_dmat->_dmamap_load(dom->sd_sc->sc_dmat, map,
buf, buflen, p, flags);
if (error)
return error;
error = smmu_load_map(dom, map);
if (error)
- dom->sd_parent_dmat->_dmamap_unload(dom->sd_parent_dmat, map);
+ dom->sd_sc->sc_dmat->_dmamap_unload(dom->sd_sc->sc_dmat, map);
return error;
}
@@ -1303,14 +1295,14 @@ smmu_dmamap_load_mbuf(bus_dma_tag_t t, bus_dmamap_t map, struct mbuf *m0,
struct smmu_domain *dom = t->_cookie;
int error;
- error = dom->sd_parent_dmat->_dmamap_load_mbuf(dom->sd_parent_dmat, map,
+ error = dom->sd_sc->sc_dmat->_dmamap_load_mbuf(dom->sd_sc->sc_dmat, map,
m0, flags);
if (error)
return error;
error = smmu_load_map(dom, map);
if (error)
- dom->sd_parent_dmat->_dmamap_unload(dom->sd_parent_dmat, map);
+ dom->sd_sc->sc_dmat->_dmamap_unload(dom->sd_sc->sc_dmat, map);
return error;
}
@@ -1322,14 +1314,14 @@ smmu_dmamap_load_uio(bus_dma_tag_t t, bus_dmamap_t map, struct uio *uio,
struct smmu_domain *dom = t->_cookie;
int error;
- error = dom->sd_parent_dmat->_dmamap_load_uio(dom->sd_parent_dmat, map,
+ error = dom->sd_sc->sc_dmat->_dmamap_load_uio(dom->sd_sc->sc_dmat, map,
uio, flags);
if (error)
return error;
error = smmu_load_map(dom, map);
if (error)
- dom->sd_parent_dmat->_dmamap_unload(dom->sd_parent_dmat, map);
+ dom->sd_sc->sc_dmat->_dmamap_unload(dom->sd_sc->sc_dmat, map);
return error;
}
@@ -1341,14 +1333,14 @@ smmu_dmamap_load_raw(bus_dma_tag_t t, bus_dmamap_t map, bus_dma_segment_t *segs,
struct smmu_domain *dom = t->_cookie;
int error;
- error = dom->sd_parent_dmat->_dmamap_load_raw(dom->sd_parent_dmat, map,
+ error = dom->sd_sc->sc_dmat->_dmamap_load_raw(dom->sd_sc->sc_dmat, map,
segs, nsegs, size, flags);
if (error)
return error;
error = smmu_load_map(dom, map);
if (error)
- dom->sd_parent_dmat->_dmamap_unload(dom->sd_parent_dmat, map);
+ dom->sd_sc->sc_dmat->_dmamap_unload(dom->sd_sc->sc_dmat, map);
return error;
}
@@ -1359,7 +1351,7 @@ smmu_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t map)
struct smmu_domain *dom = t->_cookie;
smmu_unload_map(dom, map);
- dom->sd_parent_dmat->_dmamap_unload(dom->sd_parent_dmat, map);
+ dom->sd_sc->sc_dmat->_dmamap_unload(dom->sd_sc->sc_dmat, map);
}
void
@@ -1367,7 +1359,7 @@ smmu_dmamap_sync(bus_dma_tag_t t, bus_dmamap_t map, bus_addr_t addr,
bus_size_t size, int op)
{
struct smmu_domain *dom = t->_cookie;
- dom->sd_parent_dmat->_dmamap_sync(dom->sd_parent_dmat, map,
+ dom->sd_sc->sc_dmat->_dmamap_sync(dom->sd_sc->sc_dmat, map,
addr, size, op);
}
@@ -1379,7 +1371,7 @@ smmu_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
bus_addr_t addr, end;
int cache, seg, error;
- error = dom->sd_parent_dmat->_dmamem_map(dom->sd_parent_dmat, segs,
+ error = dom->sd_sc->sc_dmat->_dmamem_map(dom->sd_sc->sc_dmat, segs,
nsegs, size, kvap, flags);
if (error)
return error;
diff --git a/sys/arch/arm64/dev/smmu_fdt.c b/sys/arch/arm64/dev/smmu_fdt.c
index d11b0d2fe66..b21466abe36 100644
--- a/sys/arch/arm64/dev/smmu_fdt.c
+++ b/sys/arch/arm64/dev/smmu_fdt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smmu_fdt.c,v 1.1 2021/02/28 21:39:31 patrick Exp $ */
+/* $OpenBSD: smmu_fdt.c,v 1.2 2021/03/01 21:35:03 patrick Exp $ */
/*
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
*
@@ -70,6 +70,7 @@ smmu_fdt_attach(struct device *parent, struct device *self, void *aux)
return;
}
+ sc->sc_dmat = faa->fa_dmat;
sc->sc_iot = faa->fa_iot;
if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr,
faa->fa_reg[0].size, 0, &sc->sc_ioh)) {
diff --git a/sys/arch/arm64/dev/smmuvar.h b/sys/arch/arm64/dev/smmuvar.h
index b2a0c597de5..7af6ea6ee54 100644
--- a/sys/arch/arm64/dev/smmuvar.h
+++ b/sys/arch/arm64/dev/smmuvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smmuvar.h,v 1.1 2021/02/28 21:39:31 patrick Exp $ */
+/* $OpenBSD: smmuvar.h,v 1.2 2021/03/01 21:35:03 patrick Exp $ */
/*
* Copyright (c) 2021 Patrick Wildt <patrick@blueri.se>
*
@@ -19,8 +19,7 @@ struct smmu_softc;
struct smmu_domain {
struct smmu_softc *sd_sc;
uint32_t sd_sid;
- bus_dma_tag_t sd_parent_dmat;
- bus_dma_tag_t sd_device_dmat;
+ bus_dma_tag_t sd_dmat;
int sd_cb_idx;
int sd_smr_idx;
int sd_stage;