vtdmap
static struct vtdmap *vtdmaps[DRHD_MAX_UNITS];
vtd_max_domains(struct vtdmap *vtdmap)
nd = VTD_CAP_ND(vtdmap->cap);
static struct vtdmap *
struct vtdmap *vtdmap;
vtdmap = vtdmaps[i];
return(vtdmap);
vtdmap = vtdmaps[i];
return (vtdmap);
vtd_wbflush(struct vtdmap *vtdmap)
if (VTD_ECAP_COHERENCY(vtdmap->ext_cap) == 0)
if (VTD_CAP_RWBF(vtdmap->cap)) {
vtdmap->gcr = VTD_GCR_WBF;
while ((vtdmap->gsr & VTD_GSR_WBFS) != 0)
vtd_ctx_global_invalidate(struct vtdmap *vtdmap)
vtdmap->ccr = VTD_CCR_ICC | VTD_CCR_CIRG_GLOBAL;
while ((vtdmap->ccr & VTD_CCR_ICC) != 0)
vtd_iotlb_global_invalidate(struct vtdmap *vtdmap)
vtd_wbflush(vtdmap);
offset = VTD_ECAP_IRO(vtdmap->ext_cap) * 16;
iotlb_reg = (volatile uint64_t *)((caddr_t)vtdmap + offset + 8);
vtd_translation_enable(struct vtdmap *vtdmap)
vtdmap->gcr = VTD_GCR_TE;
while ((vtdmap->gsr & VTD_GSR_TES) == 0)
vtd_translation_disable(struct vtdmap *vtdmap)
vtdmap->gcr = 0;
while ((vtdmap->gsr & VTD_GSR_TES) != 0)
struct vtdmap *vtdmap;
vtdmaps[units] = (struct vtdmap *)PHYS_TO_DMAP(mapaddr);
vtdmaps[units] = (struct vtdmap *)PHYS_TO_DMAP(drhd->Address);
vtdmap = vtdmaps[i];
if (VTD_CAP_CM(vtdmap->cap) != 0)
if ((tmp = vtd_max_domains(vtdmap)) < max_domains)
struct vtdmap *vtdmap;
vtdmap = vtdmaps[i];
vtd_wbflush(vtdmap);
vtdmap->rta = vtophys(root_table);
vtdmap->gcr = VTD_GCR_SRTP;
while ((vtdmap->gsr & VTD_GSR_RTPS) == 0)
vtd_ctx_global_invalidate(vtdmap);
vtd_iotlb_global_invalidate(vtdmap);
vtd_translation_enable(vtdmap);
struct vtdmap *vtdmap;
vtdmap = vtdmaps[i];
vtd_translation_disable(vtdmap);
struct vtdmap *vtdmap;
if ((vtdmap = vtd_device_scope(rid)) == NULL)
if (VTD_ECAP_DI(vtdmap->ext_cap))
struct vtdmap *vtdmap;
vtdmap = vtdmaps[i];
vtd_ctx_global_invalidate(vtdmap);
vtd_iotlb_global_invalidate(vtdmap);
struct vtdmap *vtdmap;
vtdmap = vtdmaps[i];
vtd_iotlb_global_invalidate(vtdmap);
struct vtdmap *vtdmap;
vtdmap = vtdmaps[i];
tmp &= VTD_CAP_SAGAW(vtdmap->cap);
vtdmap = vtdmaps[i];
dom->spsmask &= VTD_CAP_SPS(vtdmap->cap);