Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/iommu/intel_ctx.c
Show First 20 Lines • Show All 862 Lines • ▼ Show 20 Lines | dmar_domain_free_entry(struct iommu_map_entry *entry, bool free) | ||||
IOMMU_DOMAIN_UNLOCK(domain); | IOMMU_DOMAIN_UNLOCK(domain); | ||||
if (free) | if (free) | ||||
iommu_gas_free_entry(domain, entry); | iommu_gas_free_entry(domain, entry); | ||||
else | else | ||||
entry->flags = 0; | entry->flags = 0; | ||||
} | } | ||||
void | void | ||||
iommu_domain_unload_entry(struct iommu_map_entry *entry, bool free) | iommu_domain_unload_entry(struct iommu_map_entry *entry, bool free, | ||||
bool cansleep) | |||||
{ | { | ||||
struct dmar_domain *domain; | struct dmar_domain *domain; | ||||
struct dmar_unit *unit; | struct dmar_unit *unit; | ||||
domain = IODOM2DOM(entry->domain); | domain = IODOM2DOM(entry->domain); | ||||
unit = DOM2DMAR(domain); | unit = DOM2DMAR(domain); | ||||
/* | |||||
* If "free" is false, then the IOTLB invalidation must be performed | |||||
* synchronously. Otherwise, the caller might free the entry before | |||||
* dmar_qi_task() is finished processing it. | |||||
*/ | |||||
if (unit->qi_enabled) { | if (unit->qi_enabled) { | ||||
DMAR_LOCK(unit); | DMAR_LOCK(unit); | ||||
dmar_qi_invalidate_locked(IODOM2DOM(entry->domain), | if (free) { | ||||
entry->start, entry->end - entry->start, &entry->gseq, | dmar_qi_invalidate_locked(domain, entry->start, | ||||
true); | entry->end - entry->start, &entry->gseq, true); | ||||
if (!free) | TAILQ_INSERT_TAIL(&unit->tlb_flush_entries, entry, | ||||
entry->flags |= IOMMU_MAP_ENTRY_QI_NF; | dmamap_link); | ||||
TAILQ_INSERT_TAIL(&unit->tlb_flush_entries, entry, dmamap_link); | } else { | ||||
dmar_qi_invalidate_sync_locked(domain, entry->start, | |||||
entry->end - entry->start, cansleep); | |||||
} | |||||
DMAR_UNLOCK(unit); | DMAR_UNLOCK(unit); | ||||
} else { | } else { | ||||
domain_flush_iotlb_sync(IODOM2DOM(entry->domain), | domain_flush_iotlb_sync(domain, entry->start, entry->end - | ||||
entry->start, entry->end - entry->start); | entry->start); | ||||
dmar_domain_free_entry(entry, free); | dmar_domain_free_entry(entry, free); | ||||
} | } | ||||
} | } | ||||
static bool | static bool | ||||
dmar_domain_unload_emit_wait(struct dmar_domain *domain, | dmar_domain_unload_emit_wait(struct dmar_domain *domain, | ||||
struct iommu_map_entry *entry) | struct iommu_map_entry *entry) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 80 Lines • Show Last 20 Lines |