Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/iommu/intel_qi.c
Show First 20 Lines • Show All 237 Lines • ▼ Show 20 Lines | dmar_qi_emit(unit, DMAR_IQ_DESCR_IOTLB_INV | | ||||
DMAR_IQ_DESCR_IOTLB_DID(domain->domain), | DMAR_IQ_DESCR_IOTLB_DID(domain->domain), | ||||
base | am); | base | am); | ||||
} | } | ||||
dmar_qi_emit_wait_seq(unit, pseq, emit_wait); | dmar_qi_emit_wait_seq(unit, pseq, emit_wait); | ||||
dmar_qi_advance_tail(unit); | dmar_qi_advance_tail(unit); | ||||
} | } | ||||
void | void | ||||
dmar_qi_invalidate_sync_locked(struct dmar_domain *domain, iommu_gaddr_t base, | |||||
iommu_gaddr_t size, bool cansleep) | |||||
{ | |||||
struct iommu_qi_genseq gseq; | |||||
DMAR_ASSERT_LOCKED(domain->dmar); | |||||
dmar_qi_invalidate_locked(domain, base, size, &gseq, true); | |||||
dmar_qi_wait_for_seq(domain->dmar, &gseq, !cansleep); | |||||
} | |||||
void | |||||
dmar_qi_invalidate_ctx_glob_locked(struct dmar_unit *unit) | dmar_qi_invalidate_ctx_glob_locked(struct dmar_unit *unit) | ||||
{ | { | ||||
struct iommu_qi_genseq gseq; | struct iommu_qi_genseq gseq; | ||||
DMAR_ASSERT_LOCKED(unit); | DMAR_ASSERT_LOCKED(unit); | ||||
dmar_qi_ensure(unit, 2); | dmar_qi_ensure(unit, 2); | ||||
dmar_qi_emit(unit, DMAR_IQ_DESCR_CTX_INV | DMAR_IQ_DESCR_CTX_GLOB, 0); | dmar_qi_emit(unit, DMAR_IQ_DESCR_CTX_INV | DMAR_IQ_DESCR_CTX_GLOB, 0); | ||||
dmar_qi_emit_wait_seq(unit, &gseq, true); | dmar_qi_emit_wait_seq(unit, &gseq, true); | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | dmar_qi_task(void *arg, int pending __unused) | ||||
for (;;) { | for (;;) { | ||||
entry = TAILQ_FIRST(&unit->tlb_flush_entries); | entry = TAILQ_FIRST(&unit->tlb_flush_entries); | ||||
if (entry == NULL) | if (entry == NULL) | ||||
break; | break; | ||||
if (!dmar_qi_seq_processed(unit, &entry->gseq)) | if (!dmar_qi_seq_processed(unit, &entry->gseq)) | ||||
break; | break; | ||||
TAILQ_REMOVE(&unit->tlb_flush_entries, entry, dmamap_link); | TAILQ_REMOVE(&unit->tlb_flush_entries, entry, dmamap_link); | ||||
DMAR_UNLOCK(unit); | DMAR_UNLOCK(unit); | ||||
dmar_domain_free_entry(entry, (entry->flags & | dmar_domain_free_entry(entry, true); | ||||
IOMMU_MAP_ENTRY_QI_NF) == 0); | |||||
DMAR_LOCK(unit); | DMAR_LOCK(unit); | ||||
} | } | ||||
if (unit->inv_seq_waiters > 0) | if (unit->inv_seq_waiters > 0) | ||||
wakeup(&unit->inv_seq_waiters); | wakeup(&unit->inv_seq_waiters); | ||||
DMAR_UNLOCK(unit); | DMAR_UNLOCK(unit); | ||||
} | } | ||||
int | int | ||||
▲ Show 20 Lines • Show All 108 Lines • Show Last 20 Lines |