diff --git a/drivers/iommu/hisilicon/Kconfig b/drivers/iommu/hisilicon/Kconfig index 9b1a2acddcbc93a31c71ccd9b64fc622e9e323b9..e41f492a7ca65bf76c19cf3553077980e3ebf754 100644 --- a/drivers/iommu/hisilicon/Kconfig +++ b/drivers/iommu/hisilicon/Kconfig @@ -24,7 +24,8 @@ config UB_UMMU select IOMMU_IO_PGTABLE_LPAE select GENERIC_MSI_IRQ select IOMMUFD_DRIVER if IOMMUFD - select UMMU_CORE + select UB_UMMU_CORE + select UB_UMMU_CORE_DRIVER select UB_UMMU_BASE help Support for implementations of the hisilicon UMMU architecture. @@ -39,7 +40,6 @@ config UB_UMMU_SVA select IOMMU_SVA select IOMMU_KSVA select IOMMU_IOPF - select MMU_NOTIFIER default n help Support for sharing process address spaces with devices using diff --git a/drivers/iommu/hisilicon/iommu.c b/drivers/iommu/hisilicon/iommu.c index d2bd69b83f9a108f0b22ef419d63372fb50eafa5..49c377534b3b05995f567d68dae0883a5c54f0e7 100644 --- a/drivers/iommu/hisilicon/iommu.c +++ b/drivers/iommu/hisilicon/iommu.c @@ -506,12 +506,13 @@ static int ummu_dev_disable_feat(struct device *dev, static int ummu_def_domain_type(struct device *dev) { +#ifdef CONFIG_UB_UMMU_BYPASSDEV int ret; ret = ummu_bypass_dev_domain_type(dev); if (ret) return ret; - +#endif if (iommu_default_passthrough()) return IOMMU_DOMAIN_IDENTITY; return 0; diff --git a/drivers/iommu/hisilicon/logic_ummu/logic_ummu.c b/drivers/iommu/hisilicon/logic_ummu/logic_ummu.c index d9fe988ef72b6a7b9e37331273586c366ee69869..eede1c16bddf1907cbf166f6bce58bf4c36de68c 100644 --- a/drivers/iommu/hisilicon/logic_ummu/logic_ummu.c +++ b/drivers/iommu/hisilicon/logic_ummu/logic_ummu.c @@ -1003,6 +1003,7 @@ logic_ummu_viommu_alloc_domain_nested(struct iommufd_viommu *viommu, if (!domain->pgsize_bitmap) domain->pgsize_bitmap = drv_ops->pgsize_bitmap; nested_base_domain = to_ummu_base_domain(domain); + nested_base_domain->core_dev = &ummu->core_dev; nested_base_domain->parent = logic_vummu->parent; if (!domain->ops) { ret = -EOPNOTSUPP; @@ -1286,6 +1287,7 @@ static int logic_ummu_def_domain_type(struct device *dev) return ops->def_domain_type(dev); } +#ifdef CONFIG_UB_UMMU_SVA static void logic_ummu_remove_dev_pasid(struct device *dev, ioasid_t pasid, struct iommu_domain *domain) { @@ -1321,6 +1323,7 @@ static void logic_ummu_remove_dev_pasid(struct device *dev, ioasid_t pasid, /* release the tid */ ummu_core_free_tid(&logic_ummu.core_dev, tid); } +#endif static int logic_ummu_set_group_qos_params(struct iommu_group *group, u16 partid, diff --git a/drivers/iommu/hisilicon/nested.c b/drivers/iommu/hisilicon/nested.c index 366d47f7821e71dedd76436e7b6a0cf30e4ffce6..0eed1d9f8d25c275ea9c3e04614cc6bd198fe00e 100644 --- a/drivers/iommu/hisilicon/nested.c +++ b/drivers/iommu/hisilicon/nested.c @@ -210,7 +210,7 @@ int ummu_viommu_cache_invalidate_user(struct iommu_domain *domain, nested_domain = to_nested_domain(domain); tecte_tag = nested_domain->s2_parent->cfgs.tecte_tag; - ummu = core_to_ummu_device(nested_domain->s2_parent->base_domain.core_dev); + ummu = core_to_ummu_device(nested_domain->base_domain.core_dev); cmds = kcalloc(array->entry_num, sizeof(*cmds), GFP_KERNEL); if (!cmds) diff --git a/drivers/iommu/hisilicon/sva.h b/drivers/iommu/hisilicon/sva.h index 2f6a9a383444ffdb053794dd04cd86ab24432160..e91fa1e119205c3f69f89062a15214f2ddcb1100 100644 --- a/drivers/iommu/hisilicon/sva.h +++ b/drivers/iommu/hisilicon/sva.h @@ -44,6 +44,11 @@ static inline int ummu_master_enable_sva(struct ummu_master *master, return -ENODEV; } +static inline bool ummu_master_sva_enabled(struct ummu_master *master) +{ + return false; +} + static inline int ummu_master_disable_sva(struct ummu_master *master, enum iommu_dev_features feat) { diff --git a/drivers/iommu/hisilicon/ubmem-mmu/ubmem_mmu.c b/drivers/iommu/hisilicon/ubmem-mmu/ubmem_mmu.c index 4fe5d4635ea4f3282b81cb032aca8e861cc4f423..b8d22b7bfc6458cad70661170aee6dc4e361c5a1 100644 --- a/drivers/iommu/hisilicon/ubmem-mmu/ubmem_mmu.c +++ b/drivers/iommu/hisilicon/ubmem-mmu/ubmem_mmu.c @@ -516,6 +516,7 @@ static size_t ubmem_mmu_unmap_pages(struct iommu_domain *domain, { struct ubmem_mmu_domain *mdom = to_ubmem_mmu_domain(domain); struct maple_tree *mt = (struct maple_tree *)mdom->cached_pa_list; + unsigned long unmapped = 0; struct pa_info *info; MA_STATE(mas, mt, 0, 0); @@ -539,10 +540,11 @@ static size_t ubmem_mmu_unmap_pages(struct iommu_domain *domain, mdom->pte_valid = false; } + unmapped = mdom->iova_len; clear_cached_pa_list(mt); mmu_domain_cfg_clear(mdom); - return mdom->iova_len; + return unmapped; } static int ubmem_mmu_iotlb_sync_map(struct iommu_domain *domain, diff --git a/include/linux/ummu_core.h b/include/linux/ummu_core.h index eda283f7b5246f05ca1ad762569fbc4e67712896..ecb82709c73de57f4b9ac7e9f5ce78a382ae2d56 100644 --- a/include/linux/ummu_core.h +++ b/include/linux/ummu_core.h @@ -300,8 +300,6 @@ enum ummu_device_config_type { #if IS_ENABLED(CONFIG_UB_UMMU_CORE_DRIVER) extern const struct tid_ops *ummu_core_tid_ops[TID_OPS_MAX]; -#else -static const struct tid_ops *ummu_core_tid_ops[TID_OPS_MAX]; #endif /* CONFIG_UB_UMMU_CORE_DRIVER */ static inline struct ummu_core_device *to_ummu_core(struct iommu_device *iommu)