diff options
Diffstat (limited to 'sys/x86/iommu/intel_gas.c')
-rw-r--r-- | sys/x86/iommu/intel_gas.c | 227 |
1 files changed, 140 insertions, 87 deletions
diff --git a/sys/x86/iommu/intel_gas.c b/sys/x86/iommu/intel_gas.c index 6b7ffa71baea..fc52885c224c 100644 --- a/sys/x86/iommu/intel_gas.c +++ b/sys/x86/iommu/intel_gas.c @@ -74,48 +74,48 @@ __FBSDID("$FreeBSD$"); * Guest Address Space management. */ -static uma_zone_t dmar_map_entry_zone; +static uma_zone_t iommu_map_entry_zone; static void intel_gas_init(void) { - dmar_map_entry_zone = uma_zcreate("DMAR_MAP_ENTRY", - sizeof(struct dmar_map_entry), NULL, NULL, + iommu_map_entry_zone = uma_zcreate("IOMMU_MAP_ENTRY", + sizeof(struct iommu_map_entry), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NODUMP); } SYSINIT(intel_gas, SI_SUB_DRIVERS, SI_ORDER_FIRST, intel_gas_init, NULL); -struct dmar_map_entry * +struct iommu_map_entry * dmar_gas_alloc_entry(struct dmar_domain *domain, u_int flags) { - struct dmar_map_entry *res; + struct iommu_map_entry *res; KASSERT((flags & ~(DMAR_PGF_WAITOK)) == 0, ("unsupported flags %x", flags)); - res = uma_zalloc(dmar_map_entry_zone, ((flags & DMAR_PGF_WAITOK) != + res = uma_zalloc(iommu_map_entry_zone, ((flags & DMAR_PGF_WAITOK) != 0 ? M_WAITOK : M_NOWAIT) | M_ZERO); if (res != NULL) { - res->domain = domain; + res->domain = (struct iommu_domain *)domain; atomic_add_int(&domain->entries_cnt, 1); } return (res); } void -dmar_gas_free_entry(struct dmar_domain *domain, struct dmar_map_entry *entry) +dmar_gas_free_entry(struct dmar_domain *domain, struct iommu_map_entry *entry) { - KASSERT(domain == entry->domain, + KASSERT(domain == (struct dmar_domain *)entry->domain, ("mismatched free domain %p entry %p entry->domain %p", domain, entry, entry->domain)); atomic_subtract_int(&domain->entries_cnt, 1); - uma_zfree(dmar_map_entry_zone, entry); + uma_zfree(iommu_map_entry_zone, entry); } static int -dmar_gas_cmp_entries(struct dmar_map_entry *a, struct dmar_map_entry *b) +dmar_gas_cmp_entries(struct iommu_map_entry *a, struct iommu_map_entry *b) { /* Last entry have zero size, so <= */ @@ -137,10 +137,10 @@ dmar_gas_cmp_entries(struct dmar_map_entry *a, struct dmar_map_entry *b) } static void -dmar_gas_augment_entry(struct dmar_map_entry *entry) +dmar_gas_augment_entry(struct iommu_map_entry *entry) { - struct dmar_map_entry *child; - dmar_gaddr_t free_down; + struct iommu_map_entry *child; + iommu_gaddr_t free_down; free_down = 0; if ((child = RB_LEFT(entry, rb_entry)) != NULL) { @@ -159,18 +159,18 @@ dmar_gas_augment_entry(struct dmar_map_entry *entry) entry->free_down = free_down; } -RB_GENERATE(dmar_gas_entries_tree, dmar_map_entry, rb_entry, +RB_GENERATE(dmar_gas_entries_tree, iommu_map_entry, rb_entry, dmar_gas_cmp_entries); #ifdef INVARIANTS static void dmar_gas_check_free(struct dmar_domain *domain) { - struct dmar_map_entry *entry, *l, *r; - dmar_gaddr_t v; + struct iommu_map_entry *entry, *l, *r; + iommu_gaddr_t v; RB_FOREACH(entry, dmar_gas_entries_tree, &domain->rb_root) { - KASSERT(domain == entry->domain, + KASSERT(domain == (struct dmar_domain *)entry->domain, ("mismatched free domain %p entry %p entry->domain %p", domain, entry, entry->domain)); l = RB_LEFT(entry, rb_entry); @@ -190,16 +190,16 @@ dmar_gas_check_free(struct dmar_domain *domain) #endif static bool -dmar_gas_rb_insert(struct dmar_domain *domain, struct dmar_map_entry *entry) +dmar_gas_rb_insert(struct dmar_domain *domain, struct iommu_map_entry *entry) { - struct dmar_map_entry *found; + struct iommu_map_entry *found; found = RB_INSERT(dmar_gas_entries_tree, &domain->rb_root, entry); return (found == NULL); } static void -dmar_gas_rb_remove(struct dmar_domain *domain, struct dmar_map_entry *entry) +dmar_gas_rb_remove(struct dmar_domain *domain, struct iommu_map_entry *entry) { RB_REMOVE(dmar_gas_entries_tree, &domain->rb_root, entry); @@ -208,7 +208,7 @@ dmar_gas_rb_remove(struct dmar_domain *domain, struct dmar_map_entry *entry) void dmar_gas_init_domain(struct dmar_domain *domain) { - struct dmar_map_entry *begin, *end; + struct iommu_map_entry *begin, *end; begin = dmar_gas_alloc_entry(domain, DMAR_PGF_WAITOK); end = dmar_gas_alloc_entry(domain, DMAR_PGF_WAITOK); @@ -219,12 +219,12 @@ dmar_gas_init_domain(struct dmar_domain *domain) begin->start = 0; begin->end = DMAR_PAGE_SIZE; - begin->flags = DMAR_MAP_ENTRY_PLACE | DMAR_MAP_ENTRY_UNMAPPED; + begin->flags = IOMMU_MAP_ENTRY_PLACE | IOMMU_MAP_ENTRY_UNMAPPED; dmar_gas_rb_insert(domain, begin); end->start = domain->end; end->end = domain->end; - end->flags = DMAR_MAP_ENTRY_PLACE | DMAR_MAP_ENTRY_UNMAPPED; + end->flags = IOMMU_MAP_ENTRY_PLACE | IOMMU_MAP_ENTRY_UNMAPPED; dmar_gas_rb_insert(domain, end); domain->first_place = begin; @@ -236,7 +236,7 @@ dmar_gas_init_domain(struct dmar_domain *domain) void dmar_gas_fini_domain(struct dmar_domain *domain) { - struct dmar_map_entry *entry, *entry1; + struct iommu_map_entry *entry, *entry1; DMAR_DOMAIN_ASSERT_LOCKED(domain); KASSERT(domain->entries_cnt == 2, ("domain still in use %p", domain)); @@ -244,7 +244,7 @@ dmar_gas_fini_domain(struct dmar_domain *domain) entry = RB_MIN(dmar_gas_entries_tree, &domain->rb_root); KASSERT(entry->start == 0, ("start entry start %p", domain)); KASSERT(entry->end == DMAR_PAGE_SIZE, ("start entry end %p", domain)); - KASSERT(entry->flags == DMAR_MAP_ENTRY_PLACE, + KASSERT(entry->flags == IOMMU_MAP_ENTRY_PLACE, ("start entry flags %p", domain)); RB_REMOVE(dmar_gas_entries_tree, &domain->rb_root, entry); dmar_gas_free_entry(domain, entry); @@ -252,14 +252,14 @@ dmar_gas_fini_domain(struct dmar_domain *domain) entry = RB_MAX(dmar_gas_entries_tree, &domain->rb_root); KASSERT(entry->start == domain->end, ("end entry start %p", domain)); KASSERT(entry->end == domain->end, ("end entry end %p", domain)); - KASSERT(entry->flags == DMAR_MAP_ENTRY_PLACE, + KASSERT(entry->flags == IOMMU_MAP_ENTRY_PLACE, ("end entry flags %p", domain)); RB_REMOVE(dmar_gas_entries_tree, &domain->rb_root, entry); dmar_gas_free_entry(domain, entry); RB_FOREACH_SAFE(entry, dmar_gas_entries_tree, &domain->rb_root, entry1) { - KASSERT((entry->flags & DMAR_MAP_ENTRY_RMRR) != 0, + KASSERT((entry->flags & IOMMU_MAP_ENTRY_RMRR) != 0, ("non-RMRR entry left %p", domain)); RB_REMOVE(dmar_gas_entries_tree, &domain->rb_root, entry); dmar_gas_free_entry(domain, entry); @@ -268,11 +268,11 @@ dmar_gas_fini_domain(struct dmar_domain *domain) struct dmar_gas_match_args { struct dmar_domain *domain; - dmar_gaddr_t size; + iommu_gaddr_t size; int offset; const struct bus_dma_tag_common *common; u_int gas_flags; - struct dmar_map_entry *entry; + struct iommu_map_entry *entry; }; /* @@ -282,10 +282,10 @@ struct dmar_gas_match_args { * by a, and return 'true' if and only if the allocation attempt succeeds. */ static bool -dmar_gas_match_one(struct dmar_gas_match_args *a, dmar_gaddr_t beg, - dmar_gaddr_t end, dmar_gaddr_t maxaddr) +dmar_gas_match_one(struct dmar_gas_match_args *a, iommu_gaddr_t beg, + iommu_gaddr_t end, iommu_gaddr_t maxaddr) { - dmar_gaddr_t bs, start; + iommu_gaddr_t bs, start; a->entry->start = roundup2(beg + DMAR_PAGE_SIZE, a->common->alignment); @@ -298,7 +298,7 @@ dmar_gas_match_one(struct dmar_gas_match_args *a, dmar_gaddr_t beg, return (false); /* No boundary crossing. */ - if (dmar_test_boundary(a->entry->start + a->offset, a->size, + if (iommu_test_boundary(a->entry->start + a->offset, a->size, a->common->boundary)) return (true); @@ -313,7 +313,7 @@ dmar_gas_match_one(struct dmar_gas_match_args *a, dmar_gaddr_t beg, /* DMAR_PAGE_SIZE to create gap after new entry. */ if (start + a->offset + a->size + DMAR_PAGE_SIZE <= end && start + a->offset + a->size <= maxaddr && - dmar_test_boundary(start + a->offset, a->size, + iommu_test_boundary(start + a->offset, a->size, a->common->boundary)) { a->entry->start = start; return (true); @@ -327,7 +327,7 @@ dmar_gas_match_one(struct dmar_gas_match_args *a, dmar_gaddr_t beg, * XXXKIB. It is possible that bs is exactly at the start of * the next entry, then we do not have gap. Ignore for now. */ - if ((a->gas_flags & DMAR_GM_CANSPLIT) != 0) { + if ((a->gas_flags & IOMMU_MF_CANSPLIT) != 0) { a->size = bs - a->entry->start; return (true); } @@ -353,13 +353,13 @@ dmar_gas_match_insert(struct dmar_gas_match_args *a) found = dmar_gas_rb_insert(a->domain, a->entry); KASSERT(found, ("found dup %p start %jx size %jx", a->domain, (uintmax_t)a->entry->start, (uintmax_t)a->size)); - a->entry->flags = DMAR_MAP_ENTRY_MAP; + a->entry->flags = IOMMU_MAP_ENTRY_MAP; } static int -dmar_gas_lowermatch(struct dmar_gas_match_args *a, struct dmar_map_entry *entry) +dmar_gas_lowermatch(struct dmar_gas_match_args *a, struct iommu_map_entry *entry) { - struct dmar_map_entry *child; + struct iommu_map_entry *child; child = RB_RIGHT(entry, rb_entry); if (child != NULL && entry->end < a->common->lowaddr && @@ -388,9 +388,9 @@ dmar_gas_lowermatch(struct dmar_gas_match_args *a, struct dmar_map_entry *entry) } static int -dmar_gas_uppermatch(struct dmar_gas_match_args *a, struct dmar_map_entry *entry) +dmar_gas_uppermatch(struct dmar_gas_match_args *a, struct iommu_map_entry *entry) { - struct dmar_map_entry *child; + struct iommu_map_entry *child; if (entry->free_down < a->size + a->offset + DMAR_PAGE_SIZE) return (ENOMEM); @@ -419,8 +419,8 @@ dmar_gas_uppermatch(struct dmar_gas_match_args *a, struct dmar_map_entry *entry) static int dmar_gas_find_space(struct dmar_domain *domain, - const struct bus_dma_tag_common *common, dmar_gaddr_t size, - int offset, u_int flags, struct dmar_map_entry *entry) + const struct bus_dma_tag_common *common, iommu_gaddr_t size, + int offset, u_int flags, struct iommu_map_entry *entry) { struct dmar_gas_match_args a; int error; @@ -454,10 +454,10 @@ dmar_gas_find_space(struct dmar_domain *domain, } static int -dmar_gas_alloc_region(struct dmar_domain *domain, struct dmar_map_entry *entry, +dmar_gas_alloc_region(struct dmar_domain *domain, struct iommu_map_entry *entry, u_int flags) { - struct dmar_map_entry *next, *prev; + struct iommu_map_entry *next, *prev; bool found; DMAR_DOMAIN_ASSERT_LOCKED(domain); @@ -485,16 +485,16 @@ dmar_gas_alloc_region(struct dmar_domain *domain, struct dmar_map_entry *entry, * extends both ways. */ if (prev != NULL && prev->end > entry->start && - (prev->flags & DMAR_MAP_ENTRY_PLACE) == 0) { - if ((flags & DMAR_GM_RMRR) == 0 || - (prev->flags & DMAR_MAP_ENTRY_RMRR) == 0) + (prev->flags & IOMMU_MAP_ENTRY_PLACE) == 0) { + if ((flags & IOMMU_MF_RMRR) == 0 || + (prev->flags & IOMMU_MAP_ENTRY_RMRR) == 0) return (EBUSY); entry->start = prev->end; } if (next->start < entry->end && - (next->flags & DMAR_MAP_ENTRY_PLACE) == 0) { - if ((flags & DMAR_GM_RMRR) == 0 || - (next->flags & DMAR_MAP_ENTRY_RMRR) == 0) + (next->flags & IOMMU_MAP_ENTRY_PLACE) == 0) { + if ((flags & IOMMU_MF_RMRR) == 0 || + (next->flags & IOMMU_MAP_ENTRY_RMRR) == 0) return (EBUSY); entry->end = next->start; } @@ -514,11 +514,11 @@ dmar_gas_alloc_region(struct dmar_domain *domain, struct dmar_map_entry *entry, found = dmar_gas_rb_insert(domain, entry); KASSERT(found, ("found RMRR dup %p start %jx end %jx", domain, (uintmax_t)entry->start, (uintmax_t)entry->end)); - if ((flags & DMAR_GM_RMRR) != 0) - entry->flags = DMAR_MAP_ENTRY_RMRR; + if ((flags & IOMMU_MF_RMRR) != 0) + entry->flags = IOMMU_MAP_ENTRY_RMRR; #ifdef INVARIANTS - struct dmar_map_entry *ip, *in; + struct iommu_map_entry *ip, *in; ip = RB_PREV(dmar_gas_entries_tree, &domain->rb_root, entry); in = RB_NEXT(dmar_gas_entries_tree, &domain->rb_root, entry); KASSERT(prev == NULL || ip == prev, @@ -537,16 +537,16 @@ dmar_gas_alloc_region(struct dmar_domain *domain, struct dmar_map_entry *entry, } void -dmar_gas_free_space(struct dmar_domain *domain, struct dmar_map_entry *entry) +dmar_gas_free_space(struct dmar_domain *domain, struct iommu_map_entry *entry) { DMAR_DOMAIN_ASSERT_LOCKED(domain); - KASSERT((entry->flags & (DMAR_MAP_ENTRY_PLACE | DMAR_MAP_ENTRY_RMRR | - DMAR_MAP_ENTRY_MAP)) == DMAR_MAP_ENTRY_MAP, + KASSERT((entry->flags & (IOMMU_MAP_ENTRY_PLACE | IOMMU_MAP_ENTRY_RMRR | + IOMMU_MAP_ENTRY_MAP)) == IOMMU_MAP_ENTRY_MAP, ("permanent entry %p %p", domain, entry)); dmar_gas_rb_remove(domain, entry); - entry->flags &= ~DMAR_MAP_ENTRY_MAP; + entry->flags &= ~IOMMU_MAP_ENTRY_MAP; #ifdef INVARIANTS if (dmar_check_free) dmar_gas_check_free(domain); @@ -554,19 +554,19 @@ dmar_gas_free_space(struct dmar_domain *domain, struct dmar_map_entry *entry) } void -dmar_gas_free_region(struct dmar_domain *domain, struct dmar_map_entry *entry) +dmar_gas_free_region(struct dmar_domain *domain, struct iommu_map_entry *entry) { - struct dmar_map_entry *next, *prev; + struct iommu_map_entry *next, *prev; DMAR_DOMAIN_ASSERT_LOCKED(domain); - KASSERT((entry->flags & (DMAR_MAP_ENTRY_PLACE | DMAR_MAP_ENTRY_RMRR | - DMAR_MAP_ENTRY_MAP)) == DMAR_MAP_ENTRY_RMRR, + KASSERT((entry->flags & (IOMMU_MAP_ENTRY_PLACE | IOMMU_MAP_ENTRY_RMRR | + IOMMU_MAP_ENTRY_MAP)) == IOMMU_MAP_ENTRY_RMRR, ("non-RMRR entry %p %p", domain, entry)); prev = RB_PREV(dmar_gas_entries_tree, &domain->rb_root, entry); next = RB_NEXT(dmar_gas_entries_tree, &domain->rb_root, entry); dmar_gas_rb_remove(domain, entry); - entry->flags &= ~DMAR_MAP_ENTRY_RMRR; + entry->flags &= ~IOMMU_MAP_ENTRY_RMRR; if (prev == NULL) dmar_gas_rb_insert(domain, domain->first_place); @@ -576,17 +576,17 @@ dmar_gas_free_region(struct dmar_domain *domain, struct dmar_map_entry *entry) int dmar_gas_map(struct dmar_domain *domain, - const struct bus_dma_tag_common *common, dmar_gaddr_t size, int offset, - u_int eflags, u_int flags, vm_page_t *ma, struct dmar_map_entry **res) + const struct bus_dma_tag_common *common, iommu_gaddr_t size, int offset, + u_int eflags, u_int flags, vm_page_t *ma, struct iommu_map_entry **res) { - struct dmar_map_entry *entry; + struct iommu_map_entry *entry; int error; - KASSERT((flags & ~(DMAR_GM_CANWAIT | DMAR_GM_CANSPLIT)) == 0, + KASSERT((flags & ~(IOMMU_MF_CANWAIT | IOMMU_MF_CANSPLIT)) == 0, ("invalid flags 0x%x", flags)); - entry = dmar_gas_alloc_entry(domain, (flags & DMAR_GM_CANWAIT) != 0 ? - DMAR_PGF_WAITOK : 0); + entry = dmar_gas_alloc_entry(domain, + (flags & IOMMU_MF_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); if (entry == NULL) return (ENOMEM); DMAR_DOMAIN_LOCK(domain); @@ -610,11 +610,11 @@ dmar_gas_map(struct dmar_domain *domain, error = domain_map_buf(domain, entry->start, entry->end - entry->start, ma, - ((eflags & DMAR_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | - ((eflags & DMAR_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | - ((eflags & DMAR_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | - ((eflags & DMAR_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), - (flags & DMAR_GM_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); + ((eflags & IOMMU_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | + ((eflags & IOMMU_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | + ((eflags & IOMMU_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | + ((eflags & IOMMU_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), + (flags & IOMMU_MF_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); if (error == ENOMEM) { dmar_domain_unload_entry(entry, true); return (error); @@ -627,15 +627,15 @@ dmar_gas_map(struct dmar_domain *domain, } int -dmar_gas_map_region(struct dmar_domain *domain, struct dmar_map_entry *entry, +dmar_gas_map_region(struct dmar_domain *domain, struct iommu_map_entry *entry, u_int eflags, u_int flags, vm_page_t *ma) { - dmar_gaddr_t start; + iommu_gaddr_t start; int error; KASSERT(entry->flags == 0, ("used RMRR entry %p %p %x", domain, entry, entry->flags)); - KASSERT((flags & ~(DMAR_GM_CANWAIT | DMAR_GM_RMRR)) == 0, + KASSERT((flags & ~(IOMMU_MF_CANWAIT | IOMMU_MF_RMRR)) == 0, ("invalid flags 0x%x", flags)); start = entry->start; @@ -652,11 +652,11 @@ dmar_gas_map_region(struct dmar_domain *domain, struct dmar_map_entry *entry, error = domain_map_buf(domain, entry->start, entry->end - entry->start, ma + OFF_TO_IDX(start - entry->start), - ((eflags & DMAR_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | - ((eflags & DMAR_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | - ((eflags & DMAR_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | - ((eflags & DMAR_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), - (flags & DMAR_GM_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); + ((eflags & IOMMU_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | + ((eflags & IOMMU_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | + ((eflags & IOMMU_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | + ((eflags & IOMMU_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), + (flags & IOMMU_MF_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); if (error == ENOMEM) { dmar_domain_unload_entry(entry, false); return (error); @@ -668,21 +668,74 @@ dmar_gas_map_region(struct dmar_domain *domain, struct dmar_map_entry *entry, } int -dmar_gas_reserve_region(struct dmar_domain *domain, dmar_gaddr_t start, - dmar_gaddr_t end) +dmar_gas_reserve_region(struct dmar_domain *domain, iommu_gaddr_t start, + iommu_gaddr_t end) { - struct dmar_map_entry *entry; + struct iommu_map_entry *entry; int error; entry = dmar_gas_alloc_entry(domain, DMAR_PGF_WAITOK); entry->start = start; entry->end = end; DMAR_DOMAIN_LOCK(domain); - error = dmar_gas_alloc_region(domain, entry, DMAR_GM_CANWAIT); + error = dmar_gas_alloc_region(domain, entry, IOMMU_MF_CANWAIT); if (error == 0) - entry->flags |= DMAR_MAP_ENTRY_UNMAPPED; + entry->flags |= IOMMU_MAP_ENTRY_UNMAPPED; DMAR_DOMAIN_UNLOCK(domain); if (error != 0) dmar_gas_free_entry(domain, entry); return (error); } + +struct iommu_map_entry * +iommu_map_alloc_entry(struct iommu_domain *iodom, u_int flags) +{ + struct dmar_domain *domain; + struct iommu_map_entry *res; + + domain = (struct dmar_domain *)iodom; + + res = dmar_gas_alloc_entry(domain, flags); + + return (res); +} + +void +iommu_map_free_entry(struct iommu_domain *iodom, struct iommu_map_entry *entry) +{ + struct dmar_domain *domain; + + domain = (struct dmar_domain *)iodom; + + dmar_gas_free_entry(domain, entry); +} + +int +iommu_map(struct iommu_domain *iodom, + const struct bus_dma_tag_common *common, iommu_gaddr_t size, int offset, + u_int eflags, u_int flags, vm_page_t *ma, struct iommu_map_entry **res) +{ + struct dmar_domain *domain; + int error; + + domain = (struct dmar_domain *)iodom; + + error = dmar_gas_map(domain, common, size, offset, eflags, flags, + ma, res); + + return (error); +} + +int +iommu_map_region(struct iommu_domain *iodom, struct iommu_map_entry *entry, + u_int eflags, u_int flags, vm_page_t *ma) +{ + struct dmar_domain *domain; + int error; + + domain = (struct dmar_domain *)iodom; + + error = dmar_gas_map_region(domain, entry, eflags, flags, ma); + + return (error); +} |