Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iommu/rockchip: Make use of domain_alloc and domain_free

Implement domain_alloc and domain_free iommu-ops as a
replacement for domain_init/domain_destroy.

Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Joerg Roedel <jroedel@suse.de>

+24 -16
+24 -16
drivers/iommu/rockchip-iommu.c
··· 80 80 u32 *dt; /* page directory table */ 81 81 spinlock_t iommus_lock; /* lock for iommus list */ 82 82 spinlock_t dt_lock; /* lock for modifying page directory table */ 83 + 84 + struct iommu_domain domain; 83 85 }; 84 86 85 87 struct rk_iommu { ··· 100 98 101 99 __cpuc_flush_dcache_area(va, size); 102 100 outer_flush_range(pa_start, pa_end); 101 + } 102 + 103 + static struct rk_iommu_domain *to_rk_domain(struct iommu_domain *dom) 104 + { 105 + return container_of(dom, struct rk_iommu_domain, domain); 103 106 } 104 107 105 108 /** ··· 510 503 static phys_addr_t rk_iommu_iova_to_phys(struct iommu_domain *domain, 511 504 dma_addr_t iova) 512 505 { 513 - struct rk_iommu_domain *rk_domain = domain->priv; 506 + struct rk_iommu_domain *rk_domain = to_rk_domain(domain); 514 507 unsigned long flags; 515 508 phys_addr_t pt_phys, phys = 0; 516 509 u32 dte, pte; ··· 646 639 static int rk_iommu_map(struct iommu_domain *domain, unsigned long _iova, 647 640 phys_addr_t paddr, size_t size, int prot) 648 641 { 649 - struct rk_iommu_domain *rk_domain = domain->priv; 642 + struct rk_iommu_domain *rk_domain = to_rk_domain(domain); 650 643 unsigned long flags; 651 644 dma_addr_t iova = (dma_addr_t)_iova; 652 645 u32 *page_table, *pte_addr; ··· 677 670 static size_t rk_iommu_unmap(struct iommu_domain *domain, unsigned long _iova, 678 671 size_t size) 679 672 { 680 - struct rk_iommu_domain *rk_domain = domain->priv; 673 + struct rk_iommu_domain *rk_domain = to_rk_domain(domain); 681 674 unsigned long flags; 682 675 dma_addr_t iova = (dma_addr_t)_iova; 683 676 phys_addr_t pt_phys; ··· 733 726 struct device *dev) 734 727 { 735 728 struct rk_iommu *iommu; 736 - struct rk_iommu_domain *rk_domain = domain->priv; 729 + struct rk_iommu_domain *rk_domain = to_rk_domain(domain); 737 730 unsigned long flags; 738 731 int ret; 739 732 phys_addr_t dte_addr; ··· 785 778 struct device *dev) 786 779 { 787 780 struct rk_iommu *iommu; 788 - struct rk_iommu_domain *rk_domain = domain->priv; 781 + struct rk_iommu_domain *rk_domain = to_rk_domain(domain); 789 782 unsigned long flags; 790 783 791 784 /* Allow 'virtual devices' (eg drm) to detach from domain */ ··· 811 804 dev_info(dev, "Detached from iommu domain\n"); 812 805 } 813 806 814 - static int rk_iommu_domain_init(struct iommu_domain *domain) 807 + static struct iommu_domain *rk_iommu_domain_alloc(unsigned type) 815 808 { 816 809 struct rk_iommu_domain *rk_domain; 817 810 811 + if (type != IOMMU_DOMAIN_UNMANAGED) 812 + return NULL; 813 + 818 814 rk_domain = kzalloc(sizeof(*rk_domain), GFP_KERNEL); 819 815 if (!rk_domain) 820 - return -ENOMEM; 816 + return NULL; 821 817 822 818 /* 823 819 * rk32xx iommus use a 2 level pagetable. ··· 837 827 spin_lock_init(&rk_domain->dt_lock); 838 828 INIT_LIST_HEAD(&rk_domain->iommus); 839 829 840 - domain->priv = rk_domain; 830 + return &rk_domain->domain; 841 831 842 - return 0; 843 832 err_dt: 844 833 kfree(rk_domain); 845 - return -ENOMEM; 834 + return NULL; 846 835 } 847 836 848 - static void rk_iommu_domain_destroy(struct iommu_domain *domain) 837 + static void rk_iommu_domain_free(struct iommu_domain *domain) 849 838 { 850 - struct rk_iommu_domain *rk_domain = domain->priv; 839 + struct rk_iommu_domain *rk_domain = to_rk_domain(domain); 851 840 int i; 852 841 853 842 WARN_ON(!list_empty(&rk_domain->iommus)); ··· 861 852 } 862 853 863 854 free_page((unsigned long)rk_domain->dt); 864 - kfree(domain->priv); 865 - domain->priv = NULL; 855 + kfree(rk_domain); 866 856 } 867 857 868 858 static bool rk_iommu_is_dev_iommu_master(struct device *dev) ··· 960 952 } 961 953 962 954 static const struct iommu_ops rk_iommu_ops = { 963 - .domain_init = rk_iommu_domain_init, 964 - .domain_destroy = rk_iommu_domain_destroy, 955 + .domain_alloc = rk_iommu_domain_alloc, 956 + .domain_free = rk_iommu_domain_free, 965 957 .attach_dev = rk_iommu_attach_device, 966 958 .detach_dev = rk_iommu_detach_device, 967 959 .map = rk_iommu_map,