/* FIXME this part of code is untested */
        for_each_sg(sgl, sg, nents, i) {
                sg->dma_address = sg_phys(sg);
+
+               if (attrs & DMA_ATTR_SKIP_CPU_SYNC)
+                       continue;
+
                __dma_sync(page_to_phys(sg_page(sg)) + sg->offset,
                                                        sg->length, direction);
        }
                                             enum dma_data_direction direction,
                                             unsigned long attrs)
 {
-       __dma_sync(page_to_phys(page) + offset, size, direction);
+       if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC))
+               __dma_sync(page_to_phys(page) + offset, size, direction);
        return page_to_phys(page) + offset;
 }
 
  * phys_to_virt is here because in __dma_sync_page is __virt_to_phys and
  * dma_address is physical address
  */
-       __dma_sync(dma_address, size, direction);
+       if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC))
+               __dma_sync(dma_address, size, direction);
 }
 
 static inline void