Lines Matching full:domain

71 static int dmar_unmap_buf_locked(struct dmar_domain *domain,
166 dmar_get_idmap_pgtbl(struct dmar_domain *domain, iommu_gaddr_t maxaddr)
179 for (i = 0; i < domain->pglvl; i++) {
180 if (i == domain->pglvl - 1 || domain_is_sp_lvl(domain, i)) {
197 dmar_pglvl_supported(domain->dmar, tbl->pglvl) &&
202 domain->pglvl = tbl->pglvl; /* XXXKIB ? */
216 dmar_pglvl_supported(domain->dmar, tbl->pglvl) &&
221 domain->pglvl = tbl->pglvl; /* XXXKIB ? */
230 tbl->pglvl = domain->pglvl;
261 unit = domain->dmar;
326 dmar_pgtbl_map_pte(struct dmar_domain *domain, iommu_gaddr_t base, int lvl,
334 DMAR_DOMAIN_ASSERT_PGLOCKED(domain);
337 idx = pglvl_pgtbl_get_pindex(domain->pglvl, base, lvl);
345 pte = iommu_map_pgtbl(domain->pgtbl_obj, idx, flags, sf);
348 ("lost root page table page %p", domain));
354 m = iommu_pgalloc(domain->pgtbl_obj, idx, flags |
369 ptep = dmar_pgtbl_map_pte(domain, base, lvl - 1,
373 ("loosing root page %p", domain));
375 iommu_pgfree(domain->pgtbl_obj, m->pindex,
381 dmar_flush_pte_to_ram(domain->dmar, ptep);
389 pte += pglvl_pgtbl_pte_off(domain->pglvl, base, lvl);
394 dmar_map_buf_locked(struct dmar_domain *domain, iommu_gaddr_t base,
405 DMAR_DOMAIN_ASSERT_PGLOCKED(domain);
414 pg_sz = domain_page_size(domain, lvl);
416 if (lvl == domain->pglvl - 1)
422 if (!domain_is_sp_lvl(domain, lvl))
446 ("mapping loop overflow %p %jx %jx %jx", domain,
449 pte = dmar_pgtbl_map_pte(domain, base, lvl, flags, &idx, &sf);
452 ("failed waitable pte alloc %p", domain));
455 dmar_unmap_buf_locked(domain, base1, base - base1,
462 dmar_flush_pte_to_ram(domain->dmar, pte);
475 struct dmar_domain *domain;
489 domain = IODOM2DOM(iodom);
490 unit = domain->dmar;
493 ("modifying idmap pagetable domain %p", domain));
495 ("non-aligned base %p %jx %jx", domain, (uintmax_t)base,
498 ("non-aligned size %p %jx %jx", domain, (uintmax_t)base,
500 KASSERT(size > 0, ("zero size %p %jx %jx", domain, (uintmax_t)base,
502 KASSERT(base < (1ULL << domain->agaw),
503 ("base too high %p %jx %jx agaw %d", domain, (uintmax_t)base,
504 (uintmax_t)size, domain->agaw));
505 KASSERT(base + size < (1ULL << domain->agaw),
506 ("end too high %p %jx %jx agaw %d", domain, (uintmax_t)base,
507 (uintmax_t)size, domain->agaw));
509 ("size overflow %p %jx %jx", domain, (uintmax_t)base,
519 domain, (uintmax_t)pflags));
523 domain, (uintmax_t)pflags));
526 DMAR_DOMAIN_PGLOCK(domain);
527 error = dmar_map_buf_locked(domain, base, size, ma, pflags, flags,
529 DMAR_DOMAIN_PGUNLOCK(domain);
534 dmar_flush_iotlb_sync(domain, base, size);
544 static void dmar_unmap_clear_pte(struct dmar_domain *domain,
549 dmar_free_pgtbl_pde(struct dmar_domain *domain, iommu_gaddr_t base,
557 pde = dmar_pgtbl_map_pte(domain, base, lvl, flags, &idx, &sf);
558 dmar_unmap_clear_pte(domain, base, lvl, flags, pde, &sf,
563 dmar_unmap_clear_pte(struct dmar_domain *domain, iommu_gaddr_t base, int lvl,
570 dmar_flush_pte_to_ram(domain->dmar, pte);
579 ("lost reference (lvl) on root pg domain %p base %jx lvl %d",
580 domain, (uintmax_t)base, lvl));
582 ("lost reference (idx) on root pg domain %p base %jx lvl %d",
583 domain, (uintmax_t)base, lvl));
584 iommu_pgfree(domain->pgtbl_obj, m->pindex, flags, entry);
585 dmar_free_pgtbl_pde(domain, base, lvl - 1, flags, entry);
592 dmar_unmap_buf_locked(struct dmar_domain *domain, iommu_gaddr_t base,
601 DMAR_DOMAIN_ASSERT_PGLOCKED(domain);
605 KASSERT((domain->iodom.flags & IOMMU_DOMAIN_IDMAP) == 0,
606 ("modifying idmap pagetable domain %p", domain));
608 ("non-aligned base %p %jx %jx", domain, (uintmax_t)base,
611 ("non-aligned size %p %jx %jx", domain, (uintmax_t)base,
613 KASSERT(base < (1ULL << domain->agaw),
614 ("base too high %p %jx %jx agaw %d", domain, (uintmax_t)base,
615 (uintmax_t)size, domain->agaw));
616 KASSERT(base + size < (1ULL << domain->agaw),
617 ("end too high %p %jx %jx agaw %d", domain, (uintmax_t)base,
618 (uintmax_t)size, domain->agaw));
620 ("size overflow %p %jx %jx", domain, (uintmax_t)base,
629 for (lvl = 0; lvl < domain->pglvl; lvl++) {
630 if (lvl != domain->pglvl - 1 &&
631 !domain_is_sp_lvl(domain, lvl))
633 pg_sz = domain_page_size(domain, lvl);
636 pte = dmar_pgtbl_map_pte(domain, base, lvl, flags,
640 domain, (uintmax_t)base, lvl, flags));
642 lvl == domain->pglvl - 1) {
643 dmar_unmap_clear_pte(domain, base, lvl,
649 ("unmapping loop overflow %p %jx %jx %jx", domain,
667 struct dmar_domain *domain;
670 domain = IODOM2DOM(iodom);
672 DMAR_DOMAIN_PGLOCK(domain);
673 error = dmar_unmap_buf_locked(domain, entry->start, entry->end -
675 DMAR_DOMAIN_PGUNLOCK(domain);
680 dmar_domain_alloc_pgtbl(struct dmar_domain *domain)
685 KASSERT(domain->pgtbl_obj == NULL,
686 ("already initialized %p", domain));
688 unit = domain->dmar;
689 domain->pgtbl_obj = vm_pager_allocate(OBJT_PHYS, NULL,
690 IDX_TO_OFF(pglvl_max_pages(domain->pglvl)), 0, 0, NULL);
692 domain->pgtbl_obj->domain.dr_policy = DOMAINSET_PREF(
695 DMAR_DOMAIN_PGLOCK(domain);
696 m = iommu_pgalloc(domain->pgtbl_obj, 0, IOMMU_PGF_WAITOK |
700 DMAR_DOMAIN_PGUNLOCK(domain);
702 domain->iodom.flags |= IOMMU_DOMAIN_PGTBL_INITED;
708 dmar_domain_free_pgtbl(struct dmar_domain *domain)
713 obj = domain->pgtbl_obj;
715 KASSERT((domain->dmar->hw_ecap & DMAR_ECAP_PT) != 0 &&
716 (domain->iodom.flags & IOMMU_DOMAIN_IDMAP) != 0,
717 ("lost pagetable object domain %p", domain));
720 DMAR_DOMAIN_ASSERT_PGLOCKED(domain);
721 domain->pgtbl_obj = NULL;
723 if ((domain->iodom.flags & IOMMU_DOMAIN_IDMAP) != 0) {
725 domain->iodom.flags &= ~IOMMU_DOMAIN_IDMAP;
756 dmar_flush_iotlb_sync(struct dmar_domain *domain, iommu_gaddr_t base,
764 unit = domain->dmar;
771 DMAR_IOTLB_DID(domain->domain), iro);
782 DMAR_IOTLB_DID(domain->domain), iro);
791 * address space for the domain.