Loading drivers/iommu/ipmmu-vmsa.c +29 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <linux/platform_device.h> #include <linux/sizes.h> #include <linux/slab.h> #include <linux/sys_soc.h> #if defined(CONFIG_ARM) && !defined(CONFIG_IOMMU_DMA) #include <asm/dma-iommu.h> Loading Loading @@ -749,9 +750,24 @@ static int ipmmu_init_platform_device(struct device *dev, return 0; } static bool ipmmu_slave_whitelist(struct device *dev) { /* By default, do not allow use of IPMMU */ return false; } static const struct soc_device_attribute soc_r8a7795[] = { { .soc_id = "r8a7795", }, { /* sentinel */ } }; static int ipmmu_of_xlate(struct device *dev, struct of_phandle_args *spec) { /* For R-Car Gen3 use a white list to opt-in slave devices */ if (soc_device_match(soc_r8a7795) && !ipmmu_slave_whitelist(dev)) return -ENODEV; iommu_fwspec_add_ids(dev, spec->args, 1); /* Initialize once - xlate() will call multiple times */ Loading Loading @@ -903,10 +919,21 @@ static const struct ipmmu_features ipmmu_features_default = { .twobit_imttbcr_sl0 = false, }; static const struct ipmmu_features ipmmu_features_r8a7795 = { .use_ns_alias_offset = false, .has_cache_leaf_nodes = true, .number_of_contexts = 8, .setup_imbuscr = false, .twobit_imttbcr_sl0 = true, }; static const struct of_device_id ipmmu_of_ids[] = { { .compatible = "renesas,ipmmu-vmsa", .data = &ipmmu_features_default, }, { .compatible = "renesas,ipmmu-r8a7795", .data = &ipmmu_features_r8a7795, }, { /* Terminator */ }, Loading Loading @@ -1090,6 +1117,8 @@ static int __init ipmmu_vmsa_iommu_of_setup(struct device_node *np) IOMMU_OF_DECLARE(ipmmu_vmsa_iommu_of, "renesas,ipmmu-vmsa", ipmmu_vmsa_iommu_of_setup); IOMMU_OF_DECLARE(ipmmu_r8a7795_iommu_of, "renesas,ipmmu-r8a7795", ipmmu_vmsa_iommu_of_setup); #endif MODULE_DESCRIPTION("IOMMU API for Renesas VMSA-compatible IPMMU"); Loading Loading
drivers/iommu/ipmmu-vmsa.c +29 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <linux/platform_device.h> #include <linux/sizes.h> #include <linux/slab.h> #include <linux/sys_soc.h> #if defined(CONFIG_ARM) && !defined(CONFIG_IOMMU_DMA) #include <asm/dma-iommu.h> Loading Loading @@ -749,9 +750,24 @@ static int ipmmu_init_platform_device(struct device *dev, return 0; } static bool ipmmu_slave_whitelist(struct device *dev) { /* By default, do not allow use of IPMMU */ return false; } static const struct soc_device_attribute soc_r8a7795[] = { { .soc_id = "r8a7795", }, { /* sentinel */ } }; static int ipmmu_of_xlate(struct device *dev, struct of_phandle_args *spec) { /* For R-Car Gen3 use a white list to opt-in slave devices */ if (soc_device_match(soc_r8a7795) && !ipmmu_slave_whitelist(dev)) return -ENODEV; iommu_fwspec_add_ids(dev, spec->args, 1); /* Initialize once - xlate() will call multiple times */ Loading Loading @@ -903,10 +919,21 @@ static const struct ipmmu_features ipmmu_features_default = { .twobit_imttbcr_sl0 = false, }; static const struct ipmmu_features ipmmu_features_r8a7795 = { .use_ns_alias_offset = false, .has_cache_leaf_nodes = true, .number_of_contexts = 8, .setup_imbuscr = false, .twobit_imttbcr_sl0 = true, }; static const struct of_device_id ipmmu_of_ids[] = { { .compatible = "renesas,ipmmu-vmsa", .data = &ipmmu_features_default, }, { .compatible = "renesas,ipmmu-r8a7795", .data = &ipmmu_features_r8a7795, }, { /* Terminator */ }, Loading Loading @@ -1090,6 +1117,8 @@ static int __init ipmmu_vmsa_iommu_of_setup(struct device_node *np) IOMMU_OF_DECLARE(ipmmu_vmsa_iommu_of, "renesas,ipmmu-vmsa", ipmmu_vmsa_iommu_of_setup); IOMMU_OF_DECLARE(ipmmu_r8a7795_iommu_of, "renesas,ipmmu-r8a7795", ipmmu_vmsa_iommu_of_setup); #endif MODULE_DESCRIPTION("IOMMU API for Renesas VMSA-compatible IPMMU"); Loading