sparc64: Initialize iommu_map_table and iommu_pool
authorTushar Dave <tushar.n.dave@oracle.com>
Fri, 28 Oct 2016 17:12:42 +0000 (10:12 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Nov 2016 19:16:59 +0000 (11:16 -0800)
Like legacy IOMMU, use common iommu_map_table and iommu_pool for ATU.
This change initializes iommu_map_table and iommu_pool for ATU.

Signed-off-by: Tushar Dave <tushar.n.dave@oracle.com>
Reviewed-by: chris hyser <chris.hyser@oracle.com>
Reviewed-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/include/asm/iommu_64.h
arch/sparc/kernel/pci_sun4v.c

index 93daa5965b3d26a7cf4b900ef63b7702d93d57fa..f24f356f250376e0931a4d4bc5d6bc631f469a74 100644 (file)
@@ -45,8 +45,10 @@ struct atu_ranges {
 struct atu {
        struct  atu_ranges      *ranges;
        struct  atu_iotsb       *iotsb;
+       struct  iommu_map_table tbl;
        u64                     base;
        u64                     size;
+       u64                     dma_addr_mask;
 };
 
 struct iommu {
index 2afb86c73da9c2df1bbbdcb90ee120ac423a6993..242477cbfdf2095b4f1e45e565e67db9a461497f 100644 (file)
@@ -644,6 +644,8 @@ static int pci_sun4v_atu_init(struct pci_pbm_info *pbm)
        struct atu *atu = pbm->iommu->atu;
        unsigned long err;
        const u64 *ranges;
+       u64 map_size, num_iotte;
+       u64 dma_mask;
        const u32 *page_size;
        int len;
 
@@ -682,6 +684,23 @@ static int pci_sun4v_atu_init(struct pci_pbm_info *pbm)
                return err;
        }
 
+       /* Create ATU iommu map.
+        * One bit represents one iotte in IOTSB table.
+        */
+       dma_mask = (roundup_pow_of_two(atu->size) - 1UL);
+       num_iotte = atu->size / IO_PAGE_SIZE;
+       map_size = num_iotte / 8;
+       atu->tbl.table_map_base = atu->base;
+       atu->dma_addr_mask = dma_mask;
+       atu->tbl.map = kzalloc(map_size, GFP_KERNEL);
+       if (!atu->tbl.map)
+               return -ENOMEM;
+
+       iommu_tbl_pool_init(&atu->tbl, num_iotte, IO_PAGE_SHIFT,
+                           NULL, false /* no large_pool */,
+                           0 /* default npools */,
+                           false /* want span boundary checking */);
+
        return 0;
 }