Lines Matching full:ce

44 #define VTD_CE_GET_RID2PASID(ce) \  argument
45 ((ce)->val[1] & VTD_SM_CONTEXT_ENTRY_RID2PASID_MASK)
46 #define VTD_CE_GET_PASID_DIR_TABLE(ce) \ argument
47 ((ce)->val[0] & VTD_PASID_DIR_BASE_ADDR_MASK)
721 VTDContextEntry *ce) in vtd_get_context_entry_from_root() argument
738 ce, ce_size, MEMTXATTRS_UNSPECIFIED)) { in vtd_get_context_entry_from_root()
742 ce->lo = le64_to_cpu(ce->lo); in vtd_get_context_entry_from_root()
743 ce->hi = le64_to_cpu(ce->hi); in vtd_get_context_entry_from_root()
745 ce->val[2] = le64_to_cpu(ce->val[2]); in vtd_get_context_entry_from_root()
746 ce->val[3] = le64_to_cpu(ce->val[3]); in vtd_get_context_entry_from_root()
751 static inline dma_addr_t vtd_ce_get_slpt_base(VTDContextEntry *ce) in vtd_ce_get_slpt_base() argument
753 return ce->lo & VTD_CONTEXT_ENTRY_SLPTPTR; in vtd_ce_get_slpt_base()
948 VTDContextEntry *ce, in vtd_ce_get_rid2pasid_entry() argument
956 pasid = VTD_CE_GET_RID2PASID(ce); in vtd_ce_get_rid2pasid_entry()
958 pasid_dir_base = VTD_CE_GET_PASID_DIR_TABLE(ce); in vtd_ce_get_rid2pasid_entry()
965 VTDContextEntry *ce, in vtd_ce_get_pasid_fpd() argument
975 pasid = VTD_CE_GET_RID2PASID(ce); in vtd_ce_get_pasid_fpd()
977 pasid_dir_base = VTD_CE_GET_PASID_DIR_TABLE(ce); in vtd_ce_get_pasid_fpd()
1016 static inline uint32_t vtd_ce_get_level(VTDContextEntry *ce) in vtd_ce_get_level() argument
1018 return 2 + (ce->hi & VTD_CONTEXT_ENTRY_AW); in vtd_ce_get_level()
1022 VTDContextEntry *ce, in vtd_get_iova_level() argument
1028 vtd_ce_get_rid2pasid_entry(s, ce, &pe, pasid); in vtd_get_iova_level()
1036 return vtd_ce_get_level(ce); in vtd_get_iova_level()
1039 static inline uint32_t vtd_ce_get_agaw(VTDContextEntry *ce) in vtd_ce_get_agaw() argument
1041 return 30 + (ce->hi & VTD_CONTEXT_ENTRY_AW) * 9; in vtd_ce_get_agaw()
1045 VTDContextEntry *ce, in vtd_get_iova_agaw() argument
1051 vtd_ce_get_rid2pasid_entry(s, ce, &pe, pasid); in vtd_get_iova_agaw()
1055 return vtd_ce_get_agaw(ce); in vtd_get_iova_agaw()
1058 static inline uint32_t vtd_ce_get_type(VTDContextEntry *ce) in vtd_ce_get_type() argument
1060 return ce->lo & VTD_CONTEXT_ENTRY_TT; in vtd_ce_get_type()
1065 VTDContextEntry *ce) in vtd_ce_type_check() argument
1067 switch (vtd_ce_get_type(ce)) { in vtd_ce_type_check()
1085 error_report_once("%s: unknown ce type: %"PRIu32, __func__, in vtd_ce_type_check()
1086 vtd_ce_get_type(ce)); in vtd_ce_type_check()
1093 VTDContextEntry *ce, uint8_t aw, in vtd_iova_limit() argument
1096 uint32_t ce_agaw = vtd_get_iova_agaw(s, ce, pasid); in vtd_iova_limit()
1102 uint64_t iova, VTDContextEntry *ce, in vtd_iova_sl_range_check() argument
1109 return !(iova & ~(vtd_iova_limit(s, ce, aw, pasid) - 1)); in vtd_iova_sl_range_check()
1113 VTDContextEntry *ce, in vtd_get_iova_pgtbl_base() argument
1119 vtd_ce_get_rid2pasid_entry(s, ce, &pe, pasid); in vtd_get_iova_pgtbl_base()
1127 return vtd_ce_get_slpt_base(ce); in vtd_get_iova_pgtbl_base()
1171 static int vtd_iova_to_slpte(IntelIOMMUState *s, VTDContextEntry *ce, in vtd_iova_to_slpte() argument
1177 dma_addr_t addr = vtd_get_iova_pgtbl_base(s, ce, pasid); in vtd_iova_to_slpte()
1178 uint32_t level = vtd_get_iova_level(s, ce, pasid); in vtd_iova_to_slpte()
1183 if (!vtd_iova_sl_range_check(s, iova, ce, aw_bits, pasid)) { in vtd_iova_to_slpte()
1200 if (level == vtd_get_iova_level(s, ce, pasid)) { in vtd_iova_to_slpte()
1438 * @ce: context entry to walk upon
1443 static int vtd_page_walk(IntelIOMMUState *s, VTDContextEntry *ce, in vtd_page_walk() argument
1448 dma_addr_t addr = vtd_get_iova_pgtbl_base(s, ce, pasid); in vtd_page_walk()
1449 uint32_t level = vtd_get_iova_level(s, ce, pasid); in vtd_page_walk()
1451 if (!vtd_iova_sl_range_check(s, start, ce, info->aw, pasid)) { in vtd_page_walk()
1455 if (!vtd_iova_sl_range_check(s, end, ce, info->aw, pasid)) { in vtd_page_walk()
1457 end = vtd_iova_limit(s, ce, info->aw, pasid); in vtd_page_walk()
1487 VTDContextEntry *ce) in vtd_context_entry_rsvd_bits_check() argument
1490 (ce->hi & VTD_CONTEXT_ENTRY_RSVD_HI || in vtd_context_entry_rsvd_bits_check()
1491 ce->lo & VTD_CONTEXT_ENTRY_RSVD_LO(s->aw_bits))) { in vtd_context_entry_rsvd_bits_check()
1494 __func__, ce->hi, ce->lo); in vtd_context_entry_rsvd_bits_check()
1499 (ce->val[0] & VTD_SM_CONTEXT_ENTRY_RSVD_VAL0(s->aw_bits) || in vtd_context_entry_rsvd_bits_check()
1500 ce->val[1] & VTD_SM_CONTEXT_ENTRY_RSVD_VAL1 || in vtd_context_entry_rsvd_bits_check()
1501 ce->val[2] || in vtd_context_entry_rsvd_bits_check()
1502 ce->val[3])) { in vtd_context_entry_rsvd_bits_check()
1507 __func__, ce->val[3], ce->val[2], in vtd_context_entry_rsvd_bits_check()
1508 ce->val[1], ce->val[0]); in vtd_context_entry_rsvd_bits_check()
1516 VTDContextEntry *ce) in vtd_ce_rid2pasid_check() argument
1525 return vtd_ce_get_rid2pasid_entry(s, ce, &pe, PCI_NO_PASID); in vtd_ce_rid2pasid_check()
1530 uint8_t devfn, VTDContextEntry *ce) in vtd_dev_to_context_entry() argument
1552 ret_fr = vtd_get_context_entry_from_root(s, &re, devfn, ce); in vtd_dev_to_context_entry()
1557 if (!vtd_ce_present(ce)) { in vtd_dev_to_context_entry()
1563 ret_fr = vtd_context_entry_rsvd_bits_check(s, ce); in vtd_dev_to_context_entry()
1570 !vtd_is_sl_level_supported(s, vtd_ce_get_level(ce))) { in vtd_dev_to_context_entry()
1573 __func__, ce->hi, ce->lo, in vtd_dev_to_context_entry()
1574 vtd_ce_get_level(ce)); in vtd_dev_to_context_entry()
1580 if (!vtd_ce_type_check(x86_iommu, ce)) { in vtd_dev_to_context_entry()
1591 ret_fr = vtd_ce_rid2pasid_check(s, ce); in vtd_dev_to_context_entry()
1608 VTDContextEntry *ce, in vtd_get_domain_id() argument
1614 vtd_ce_get_rid2pasid_entry(s, ce, &pe, pasid); in vtd_get_domain_id()
1618 return VTD_CONTEXT_ENTRY_DID(ce->hi); in vtd_get_domain_id()
1622 VTDContextEntry *ce, in vtd_sync_shadow_page_table_range() argument
1632 .domain_id = vtd_get_domain_id(s, ce, vtd_as->pasid), in vtd_sync_shadow_page_table_range()
1635 return vtd_page_walk(s, ce, addr, addr + size, &info, vtd_as->pasid); in vtd_sync_shadow_page_table_range()
1641 VTDContextEntry ce; in vtd_address_space_sync() local
1654 vtd_as->devfn, &ce); in vtd_address_space_sync()
1674 return vtd_sync_shadow_page_table_range(vtd_as, &ce, 0, UINT64_MAX); in vtd_address_space_sync()
1683 static bool vtd_dev_pt_enabled(IntelIOMMUState *s, VTDContextEntry *ce, in vtd_dev_pt_enabled() argument
1690 ret = vtd_ce_get_rid2pasid_entry(s, ce, &pe, pasid); in vtd_dev_pt_enabled()
1701 return (vtd_ce_get_type(ce) == VTD_CONTEXT_TT_PASS_THROUGH); in vtd_dev_pt_enabled()
1708 VTDContextEntry ce; in vtd_as_pt_enabled() local
1714 &ce)) { in vtd_as_pt_enabled()
1724 return vtd_dev_pt_enabled(s, &ce, as->pasid); in vtd_as_pt_enabled()
1951 VTDContextEntry *ce, uint32_t pasid) in vtd_iova_fl_check_canonical() argument
1953 uint64_t iova_limit = vtd_iova_limit(s, ce, s->aw_bits, pasid); in vtd_iova_fl_check_canonical()
1983 static int vtd_iova_to_flpte(IntelIOMMUState *s, VTDContextEntry *ce, in vtd_iova_to_flpte() argument
1989 dma_addr_t addr = vtd_get_iova_pgtbl_base(s, ce, pasid); in vtd_iova_to_flpte()
1992 *flpte_level = vtd_get_iova_level(s, ce, pasid); in vtd_iova_to_flpte()
1994 if (!vtd_iova_fl_check_canonical(s, iova, ce, pasid)) { in vtd_iova_to_flpte()
2005 if (*flpte_level == vtd_get_iova_level(s, ce, pasid)) { in vtd_iova_to_flpte()
2090 VTDContextEntry ce; in vtd_do_iommu_translate() local
2134 ce = cc_entry->context_entry; in vtd_do_iommu_translate()
2135 is_fpd_set = ce.lo & VTD_CONTEXT_ENTRY_FPD; in vtd_do_iommu_translate()
2137 ret_fr = vtd_ce_get_pasid_fpd(s, &ce, &is_fpd_set, pasid); in vtd_do_iommu_translate()
2146 ret_fr = vtd_dev_to_context_entry(s, bus_num, devfn, &ce); in vtd_do_iommu_translate()
2147 is_fpd_set = ce.lo & VTD_CONTEXT_ENTRY_FPD; in vtd_do_iommu_translate()
2149 ret_fr = vtd_ce_get_pasid_fpd(s, &ce, &is_fpd_set, pasid); in vtd_do_iommu_translate()
2158 trace_vtd_iotlb_cc_update(bus_num, devfn, ce.hi, ce.lo, in vtd_do_iommu_translate()
2161 cc_entry->context_entry = ce; in vtd_do_iommu_translate()
2166 pasid = VTD_CE_GET_RID2PASID(&ce); in vtd_do_iommu_translate()
2173 if (vtd_dev_pt_enabled(s, &ce, pasid)) { in vtd_do_iommu_translate()
2208 ret_fr = vtd_iova_to_flpte(s, &ce, addr, is_write, &pte, &level, in vtd_do_iommu_translate()
2212 ret_fr = vtd_iova_to_slpte(s, &ce, addr, is_write, &pte, &level, in vtd_do_iommu_translate()
2247 vtd_update_iotlb(s, source_id, vtd_get_domain_id(s, &ce, pasid), in vtd_do_iommu_translate()
2432 VTDContextEntry ce; in vtd_iotlb_domain_invalidate() local
2444 vtd_as->devfn, &ce) && in vtd_iotlb_domain_invalidate()
2445 domain_id == vtd_get_domain_id(s, &ce, vtd_as->pasid)) { in vtd_iotlb_domain_invalidate()
2461 VTDContextEntry ce; in vtd_iotlb_page_invalidate_notify() local
2467 vtd_as->devfn, &ce); in vtd_iotlb_page_invalidate_notify()
2468 if (!ret && domain_id == vtd_get_domain_id(s, &ce, vtd_as->pasid)) { in vtd_iotlb_page_invalidate_notify()
2472 rid2pasid = VTD_CE_GET_RID2PASID(&ce); in vtd_iotlb_page_invalidate_notify()
2495 vtd_sync_shadow_page_table_range(vtd_as, &ce, addr, size); in vtd_iotlb_page_invalidate_notify()
2967 VTDContextEntry ce; in vtd_piotlb_pasid_invalidate() local
2979 vtd_as->devfn, &ce) && in vtd_piotlb_pasid_invalidate()
2980 domain_id == vtd_get_domain_id(s, &ce, vtd_as->pasid)) { in vtd_piotlb_pasid_invalidate()
2981 uint32_t rid2pasid = VTD_CE_GET_RID2PASID(&ce); in vtd_piotlb_pasid_invalidate()
4155 VTDContextEntry ce; in vtd_report_ir_illegal_access() local
4160 if (vtd_dev_to_context_entry(s, bus_n, vtd_as->devfn, &ce) == 0) { in vtd_report_ir_illegal_access()
4161 is_fpd_set = ce.lo & VTD_CONTEXT_ENTRY_FPD; in vtd_report_ir_illegal_access()
4163 vtd_ce_get_pasid_fpd(s, &ce, &is_fpd_set, vtd_as->pasid); in vtd_report_ir_illegal_access()
4514 VTDContextEntry ce; in vtd_iommu_replay() local
4520 if (vtd_dev_to_context_entry(s, bus_n, vtd_as->devfn, &ce) == 0) { in vtd_iommu_replay()
4525 vtd_get_domain_id(s, &ce, vtd_as->pasid), in vtd_iommu_replay()
4526 ce.hi, ce.lo); in vtd_iommu_replay()
4535 .domain_id = vtd_get_domain_id(s, &ce, vtd_as->pasid), in vtd_iommu_replay()
4538 vtd_page_walk(s, &ce, 0, ~0ULL, &info, vtd_as->pasid); in vtd_iommu_replay()