Lines Matching +full:iommu +full:- +full:ctx
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
8 * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
54 #include <dev/iommu/busdma_iommu.h>
63 #include "iommu.h"
66 static MALLOC_DEFINE(M_IOMMU, "IOMMU", "IOMMU framework");
77 struct iommu_unit *iommu; member
86 struct iommu_unit *iommu; in iommu_domain_unmap_buf() local
89 iommu = iodom->iommu; in iommu_domain_unmap_buf()
90 error = IOMMU_UNMAP(iommu->dev, iodom, entry->start, entry->end - in iommu_domain_unmap_buf()
91 entry->start); in iommu_domain_unmap_buf()
99 struct iommu_unit *iommu; in iommu_domain_map_buf() local
112 va = entry->start; in iommu_domain_map_buf()
113 iommu = iodom->iommu; in iommu_domain_map_buf()
114 error = IOMMU_MAP(iommu->dev, iodom, va, ma, entry->end - in iommu_domain_map_buf()
115 entry->start, prot); in iommu_domain_map_buf()
125 iommu_domain_alloc(struct iommu_unit *iommu) in iommu_domain_alloc() argument
129 iodom = IOMMU_DOMAIN_ALLOC(iommu->dev, iommu); in iommu_domain_alloc()
133 KASSERT(iodom->end != 0, ("domain end is not set")); in iommu_domain_alloc()
135 iommu_domain_init(iommu, iodom, &domain_map_ops); in iommu_domain_alloc()
136 iodom->iommu = iommu; in iommu_domain_alloc()
145 struct iommu_unit *iommu; in iommu_domain_free() local
147 iommu = iodom->iommu; in iommu_domain_free()
149 IOMMU_LOCK(iommu); in iommu_domain_free()
151 if ((iodom->flags & IOMMU_DOMAIN_GAS_INITED) != 0) { in iommu_domain_free()
159 IOMMU_DOMAIN_FREE(iommu->dev, iodom); in iommu_domain_free()
160 IOMMU_UNLOCK(iommu); in iommu_domain_free()
170 maxaddr = MIN(iodom->end, BUS_SPACE_MAXADDR); in iommu_tag_init()
172 t->common.impl = &bus_dma_iommu_impl; in iommu_tag_init()
173 t->common.alignment = 1; in iommu_tag_init()
174 t->common.boundary = 0; in iommu_tag_init()
175 t->common.lowaddr = maxaddr; in iommu_tag_init()
176 t->common.highaddr = maxaddr; in iommu_tag_init()
177 t->common.maxsize = maxaddr; in iommu_tag_init()
178 t->common.nsegments = BUS_SPACE_UNRESTRICTED; in iommu_tag_init()
179 t->common.maxsegsz = maxaddr; in iommu_tag_init()
185 struct iommu_unit *iommu; in iommu_ctx_alloc() local
188 iommu = iodom->iommu; in iommu_ctx_alloc()
190 ioctx = IOMMU_CTX_ALLOC(iommu->dev, iodom, requester, disabled); in iommu_ctx_alloc()
194 ioctx->domain = iodom; in iommu_ctx_alloc()
204 struct iommu_unit *iommu; in iommu_ctx_init() local
207 iodom = ioctx->domain; in iommu_ctx_init()
208 iommu = iodom->iommu; in iommu_ctx_init()
210 error = IOMMU_CTX_INIT(iommu->dev, ioctx); in iommu_ctx_init()
214 tag = ioctx->tag = malloc(sizeof(struct bus_dma_tag_iommu), in iommu_ctx_init()
216 tag->owner = requester; in iommu_ctx_init()
217 tag->ctx = ioctx; in iommu_ctx_init()
218 tag->ctx->domain = iodom; in iommu_ctx_init()
229 struct iommu_unit *iommu; in iommu_lookup() local
233 iommu = entry->iommu; in iommu_lookup()
234 if (iommu->dev == dev) { in iommu_lookup()
236 return (iommu); in iommu_lookup()
249 struct iommu_unit *iommu; in iommu_get_ctx_ofw() local
266 "iommus", "#iommu-cells", &niommus); in iommu_get_ctx_ofw()
268 device_printf(dev, "%s can't get iommu list.\n", __func__); in iommu_get_ctx_ofw()
273 device_printf(dev, "%s iommu list is empty.\n", __func__); in iommu_get_ctx_ofw()
277 error = ofw_bus_parse_xref_list_alloc(node, "iommus", "#iommu-cells", in iommu_get_ctx_ofw()
280 device_printf(dev, "%s can't get iommu device xref.\n", in iommu_get_ctx_ofw()
287 device_printf(dev, "%s can't get iommu device.\n", __func__); in iommu_get_ctx_ofw()
291 iommu = iommu_lookup(iommu_dev); in iommu_get_ctx_ofw()
292 if (iommu == NULL) { in iommu_get_ctx_ofw()
293 device_printf(dev, "%s can't lookup iommu.\n", __func__); in iommu_get_ctx_ofw()
298 * In our current configuration we have a domain per each ctx, in iommu_get_ctx_ofw()
301 iodom = iommu_domain_alloc(iommu); in iommu_get_ctx_ofw()
313 ioctx->domain = iodom; in iommu_get_ctx_ofw()
315 error = IOMMU_OFW_MD_DATA(iommu->dev, ioctx, cells, ncells); in iommu_get_ctx_ofw()
323 IOMMU_CTX_FREE(iommu->dev, ioctx); in iommu_get_ctx_ofw()
333 iommu_get_ctx(struct iommu_unit *iommu, device_t requester, in iommu_get_ctx() argument
340 IOMMU_LOCK(iommu); in iommu_get_ctx()
341 ioctx = IOMMU_CTX_LOOKUP(iommu->dev, requester); in iommu_get_ctx()
343 IOMMU_UNLOCK(iommu); in iommu_get_ctx()
346 IOMMU_UNLOCK(iommu); in iommu_get_ctx()
349 * In our current configuration we have a domain per each ctx. in iommu_get_ctx()
352 iodom = iommu_domain_alloc(iommu); in iommu_get_ctx()
364 IOMMU_CTX_FREE(iommu->dev, ioctx); in iommu_get_ctx()
373 iommu_free_ctx_locked(struct iommu_unit *iommu, struct iommu_ctx *ioctx) in iommu_free_ctx_locked() argument
378 IOMMU_ASSERT_LOCKED(iommu); in iommu_free_ctx_locked()
380 tag = ioctx->tag; in iommu_free_ctx_locked()
382 IOMMU_CTX_FREE(iommu->dev, ioctx); in iommu_free_ctx_locked()
383 IOMMU_UNLOCK(iommu); in iommu_free_ctx_locked()
387 /* Since we have a domain per each ctx, remove the domain too. */ in iommu_free_ctx_locked()
388 error = iommu_domain_free(ioctx->domain); in iommu_free_ctx_locked()
390 device_printf(iommu->dev, "Could not free a domain\n"); in iommu_free_ctx_locked()
401 entry->flags = 0; in iommu_domain_free_entry()
412 KASSERT((entry->flags & IOMMU_MAP_ENTRY_MAP) != 0, in iommu_domain_unload()
414 error = iodom->ops->unmap(iodom, entry, in iommu_domain_unload()
428 iommu_register(struct iommu_unit *iommu) in iommu_register() argument
432 mtx_init(&iommu->lock, "IOMMU", NULL, MTX_DEF); in iommu_register()
435 entry->iommu = iommu; in iommu_register()
441 sysctl_ctx_init(&iommu->sysctl_ctx); in iommu_register()
442 iommu_init_busdma(iommu); in iommu_register()
448 iommu_unregister(struct iommu_unit *iommu) in iommu_unregister() argument
454 if (entry->iommu == iommu) { in iommu_unregister()
461 iommu_fini_busdma(iommu); in iommu_unregister()
462 sysctl_ctx_free(&iommu->sysctl_ctx); in iommu_unregister()
464 mtx_destroy(&iommu->lock); in iommu_unregister()
473 struct iommu_unit *iommu; in iommu_find() local
478 iommu = entry->iommu; in iommu_find()
479 error = IOMMU_FIND(iommu->dev, dev); in iommu_find()
482 return (entry->iommu); in iommu_find()
509 sx_init(&iommu_sx, "IOMMU list"); in iommu_init()
512 SYSINIT(iommu, SI_SUB_DRIVERS, SI_ORDER_FIRST, iommu_init, NULL);