Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F170549366
D25956.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D25956.id.diff
View Options
Index: head/sys/dev/iommu/busdma_iommu.c
===================================================================
--- head/sys/dev/iommu/busdma_iommu.c
+++ head/sys/dev/iommu/busdma_iommu.c
@@ -1063,3 +1063,23 @@
free(ma, M_TEMP);
return (error);
}
+
+void
+iommu_domain_init(struct iommu_unit *unit, struct iommu_domain *domain,
+ const struct iommu_domain_map_ops *ops)
+{
+
+ domain->ops = ops;
+ domain->iommu = unit;
+
+ RB_INIT(&domain->rb_root);
+ TAILQ_INIT(&domain->unload_entries);
+ mtx_init(&domain->lock, "iodom", NULL, MTX_DEF);
+}
+
+void
+iommu_domain_fini(struct iommu_domain *domain)
+{
+
+ mtx_destroy(&domain->lock);
+}
Index: head/sys/dev/iommu/iommu.h
===================================================================
--- head/sys/dev/iommu/iommu.h
+++ head/sys/dev/iommu/iommu.h
@@ -223,6 +223,9 @@
void iommu_set_buswide_ctx(struct iommu_unit *unit, u_int busno);
bool iommu_is_buswide_ctx(struct iommu_unit *unit, u_int busno);
+void iommu_domain_init(struct iommu_unit *unit, struct iommu_domain *domain,
+ const struct iommu_domain_map_ops *ops);
+void iommu_domain_fini(struct iommu_domain *domain);
bool bus_dma_iommu_set_buswide(device_t dev);
int bus_dma_iommu_load_ident(bus_dma_tag_t dmat, bus_dmamap_t map,
Index: head/sys/x86/iommu/intel_ctx.c
===================================================================
--- head/sys/x86/iommu/intel_ctx.c
+++ head/sys/x86/iommu/intel_ctx.c
@@ -322,6 +322,7 @@
dmar_domain_alloc(struct dmar_unit *dmar, bool id_mapped)
{
struct iommu_domain *iodom;
+ struct iommu_unit *unit;
struct dmar_domain *domain;
int error, id, mgaw;
@@ -330,16 +331,14 @@
return (NULL);
domain = malloc(sizeof(*domain), M_DMAR_DOMAIN, M_WAITOK | M_ZERO);
iodom = DOM2IODOM(domain);
+ unit = DMAR2IOMMU(dmar);
domain->domain = id;
LIST_INIT(&domain->contexts);
- RB_INIT(&domain->iodom.rb_root);
- TAILQ_INIT(&domain->iodom.unload_entries);
TASK_INIT(&domain->iodom.unload_task, 0, dmar_domain_unload_task,
domain);
- mtx_init(&domain->iodom.lock, "dmardom", NULL, MTX_DEF);
+ iommu_domain_init(unit, iodom, &dmar_domain_map_ops);
+
domain->dmar = dmar;
- domain->iodom.iommu = &dmar->iommu;
- domain_pgtbl_init(domain);
/*
* For now, use the maximal usable physical address of the
@@ -430,8 +429,11 @@
static void
dmar_domain_destroy(struct dmar_domain *domain)
{
+ struct iommu_domain *iodom;
struct dmar_unit *dmar;
+ iodom = DOM2IODOM(domain);
+
KASSERT(TAILQ_EMPTY(&domain->iodom.unload_entries),
("unfinished unloads %p", domain));
KASSERT(LIST_EMPTY(&domain->contexts),
@@ -442,7 +444,7 @@
("destroying dom %p with refs %d", domain, domain->refs));
if ((domain->iodom.flags & IOMMU_DOMAIN_GAS_INITED) != 0) {
DMAR_DOMAIN_LOCK(domain);
- iommu_gas_fini_domain(DOM2IODOM(domain));
+ iommu_gas_fini_domain(iodom);
DMAR_DOMAIN_UNLOCK(domain);
}
if ((domain->iodom.flags & IOMMU_DOMAIN_PGTBL_INITED) != 0) {
@@ -450,7 +452,7 @@
DMAR_DOMAIN_PGLOCK(domain);
domain_free_pgtbl(domain);
}
- mtx_destroy(&domain->iodom.lock);
+ iommu_domain_fini(iodom);
dmar = DOM2DMAR(domain);
free_unr(dmar->domids, domain->domain);
free(domain, M_DMAR_DOMAIN);
Index: head/sys/x86/iommu/intel_dmar.h
===================================================================
--- head/sys/x86/iommu/intel_dmar.h
+++ head/sys/x86/iommu/intel_dmar.h
@@ -264,7 +264,7 @@
iommu_gaddr_t size);
int domain_alloc_pgtbl(struct dmar_domain *domain);
void domain_free_pgtbl(struct dmar_domain *domain);
-void domain_pgtbl_init(struct dmar_domain *domain);
+extern const struct iommu_domain_map_ops dmar_domain_map_ops;
int dmar_dev_depth(device_t child);
void dmar_dev_path(device_t child, int *busno, void *path1, int depth);
Index: head/sys/x86/iommu/intel_idpgtbl.c
===================================================================
--- head/sys/x86/iommu/intel_idpgtbl.c
+++ head/sys/x86/iommu/intel_idpgtbl.c
@@ -813,16 +813,7 @@
DMAR_UNLOCK(unit);
}
-static const struct iommu_domain_map_ops dmar_domain_map_ops = {
+const struct iommu_domain_map_ops dmar_domain_map_ops = {
.map = domain_map_buf,
.unmap = domain_unmap_buf,
};
-
-void
-domain_pgtbl_init(struct dmar_domain *domain)
-{
- struct iommu_domain *iodom;
-
- iodom = DOM2IODOM(domain);
- iodom->ops = &dmar_domain_map_ops;
-}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Sep 6, 8:54 AM (18 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38213472
Default Alt Text
D25956.id.diff (4 KB)
Attached To
Mode
D25956: iommu_domain constructor
Attached
Detach File
Event Timeline
Log In to Comment