Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/iommu/iommu_gas.c
Show First 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | |||||
#include <vm/uma.h> | #include <vm/uma.h> | ||||
#include <dev/pci/pcireg.h> | #include <dev/pci/pcireg.h> | ||||
#include <dev/pci/pcivar.h> | #include <dev/pci/pcivar.h> | ||||
#include <dev/iommu/iommu.h> | #include <dev/iommu/iommu.h> | ||||
#include <machine/atomic.h> | #include <machine/atomic.h> | ||||
#include <machine/bus.h> | #include <machine/bus.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
#if defined(__amd64__) || defined(__i386__) | #if defined(__amd64__) || defined(__i386__) | ||||
#include <machine/specialreg.h> | |||||
#include <x86/include/busdma_impl.h> | |||||
#include <x86/iommu/intel_reg.h> | #include <x86/iommu/intel_reg.h> | ||||
#include <x86/iommu/intel_dmar.h> | |||||
#endif | #endif | ||||
#include <dev/iommu/busdma_iommu.h> | #include <dev/iommu/busdma_iommu.h> | ||||
/* | /* | ||||
* Guest Address Space management. | * Guest Address Space management. | ||||
*/ | */ | ||||
static uma_zone_t iommu_map_entry_zone; | static uma_zone_t iommu_map_entry_zone; | ||||
▲ Show 20 Lines • Show All 534 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
KASSERT(error == 0, | KASSERT(error == 0, | ||||
("unexpected error %d from iommu_gas_find_entry", error)); | ("unexpected error %d from iommu_gas_find_entry", error)); | ||||
KASSERT(entry->end < domain->end, ("allocated GPA %jx, max GPA %jx", | KASSERT(entry->end < domain->end, ("allocated GPA %jx, max GPA %jx", | ||||
(uintmax_t)entry->end, (uintmax_t)domain->end)); | (uintmax_t)entry->end, (uintmax_t)domain->end)); | ||||
entry->flags |= eflags; | entry->flags |= eflags; | ||||
IOMMU_DOMAIN_UNLOCK(domain); | IOMMU_DOMAIN_UNLOCK(domain); | ||||
error = domain_map_buf(domain, entry->start, entry->end - entry->start, | error = domain->ops->map(domain, entry->start, | ||||
ma, eflags, | entry->end - entry->start, ma, eflags, | ||||
((flags & IOMMU_MF_CANWAIT) != 0 ? IOMMU_PGF_WAITOK : 0)); | ((flags & IOMMU_MF_CANWAIT) != 0 ? IOMMU_PGF_WAITOK : 0)); | ||||
if (error == ENOMEM) { | if (error == ENOMEM) { | ||||
iommu_domain_unload_entry(entry, true); | iommu_domain_unload_entry(entry, true); | ||||
return (error); | return (error); | ||||
} | } | ||||
KASSERT(error == 0, | KASSERT(error == 0, | ||||
("unexpected error %d from domain_map_buf", error)); | ("unexpected error %d from domain_map_buf", error)); | ||||
*res = entry; | *res = entry; | ||||
Show All 19 Lines | if (error != 0) { | ||||
IOMMU_DOMAIN_UNLOCK(domain); | IOMMU_DOMAIN_UNLOCK(domain); | ||||
return (error); | return (error); | ||||
} | } | ||||
entry->flags |= eflags; | entry->flags |= eflags; | ||||
IOMMU_DOMAIN_UNLOCK(domain); | IOMMU_DOMAIN_UNLOCK(domain); | ||||
if (entry->end == entry->start) | if (entry->end == entry->start) | ||||
return (0); | return (0); | ||||
error = domain_map_buf(domain, entry->start, entry->end - entry->start, | error = domain->ops->map(domain, entry->start, | ||||
ma + OFF_TO_IDX(start - entry->start), eflags, | entry->end - entry->start, ma + OFF_TO_IDX(start - entry->start), | ||||
((flags & IOMMU_MF_CANWAIT) != 0 ? IOMMU_PGF_WAITOK : 0)); | eflags, ((flags & IOMMU_MF_CANWAIT) != 0 ? IOMMU_PGF_WAITOK : 0)); | ||||
if (error == ENOMEM) { | if (error == ENOMEM) { | ||||
iommu_domain_unload_entry(entry, false); | iommu_domain_unload_entry(entry, false); | ||||
return (error); | return (error); | ||||
} | } | ||||
KASSERT(error == 0, | KASSERT(error == 0, | ||||
("unexpected error %d from domain_map_buf", error)); | ("unexpected error %d from domain_map_buf", error)); | ||||
return (0); | return (0); | ||||
▲ Show 20 Lines • Show All 70 Lines • Show Last 20 Lines |