return ret;
 }
 
+static int __swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt,
+                                void *cpu_addr, dma_addr_t handle, size_t size,
+                                struct dma_attrs *attrs)
+{
+       int ret = sg_alloc_table(sgt, 1, GFP_KERNEL);
+
+       if (!ret)
+               sg_set_page(sgt->sgl, phys_to_page(dma_to_phys(dev, handle)),
+                           PAGE_ALIGN(size), 0);
+
+       return ret;
+}
+
 static struct dma_map_ops swiotlb_dma_ops = {
        .alloc = __dma_alloc,
        .free = __dma_free,
        .mmap = __swiotlb_mmap,
+       .get_sgtable = __swiotlb_get_sgtable,
        .map_page = __swiotlb_map_page,
        .unmap_page = __swiotlb_unmap_page,
        .map_sg = __swiotlb_map_sg_attrs,