diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
index 3d9e887..6fbeafe 100644
--- a/arch/powerpc/include/asm/dma-mapping.h
+++ b/arch/powerpc/include/asm/dma-mapping.h
@@ -89,6 +89,8 @@ struct dma_mapping_ops {
                 struct dma_attrs *attrs);
     int        (*addr_needs_map)(struct device *dev, dma_addr_t addr,
                 size_t size);
+    int        (*mmap_coherent)(struct device *dev, struct vm_area_struct *vma,
+                void *cpu_addr, dma_addr_t handle, size_t size);
 #ifdef CONFIG_PPC_NEED_DMA_SYNC_OPS
     void            (*sync_single_range_for_cpu)(struct device *hwdev,
                 dma_addr_t dma_handle, unsigned long offset,
@@ -301,6 +303,18 @@ static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
     dma_unmap_sg_attrs(dev, sg, nhwentries, direction, NULL);
 }
 
+static inline int dma_mmap_coherent(struct device *dev,
+                    struct vm_area_struct *vma,
+                    void *cpu_addr, dma_addr_t handle,
+                    size_t size)
+{
+    struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
+
+    BUG_ON(!dma_ops);
+
+    return dma_ops->mmap_coherent(dev, vma, cpu_addr, handle, size);
+}
+
 #ifdef CONFIG_PPC_NEED_DMA_SYNC_OPS
 static inline void dma_sync_single_for_cpu(struct device *dev,
         dma_addr_t dma_handle, size_t size,
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
index 20a60d6..7ff3772 100644
--- a/arch/powerpc/kernel/dma.c
+++ b/arch/powerpc/kernel/dma.c
@@ -120,6 +120,26 @@ static inline void dma_direct_unmap_page(struct device *dev,
 {
 }
 
+/*
+ * A helper to mmap the pages allocated via dma_alloc_coherent()
+ */
+static inline int dma_direct_mmap_coherent(struct device *dev,
+                       struct vm_area_struct *vma,
+                       void *cpu_addr, dma_addr_t handle,
+                       size_t size)
+{
+    struct page *pg;
+
+#ifdef CONFIG_NOT_COHERENT_CACHE
+    /* I'm too lazy and can't stop using bus_to_virt() here... */
+    cpu_addr = bus_to_virt(handle);
+#endif
+    pg = virt_to_page(cpu_addr);
+    return remap_pfn_range(vma, vma->vm_start,
+                   page_to_pfn(pg) + vma->vm_pgoff,
+                   size, vma->vm_page_prot);
+}
+
 #ifdef CONFIG_NOT_COHERENT_CACHE
 static inline void dma_direct_sync_sg(struct device *dev,
         struct scatterlist *sgl, int nents,
@@ -148,6 +168,7 @@ struct dma_mapping_ops dma_direct_ops = {
     .dma_supported    = dma_direct_dma_supported,
     .map_page    = dma_direct_map_page,
     .unmap_page    = dma_direct_unmap_page,
+    .mmap_coherent    = dma_direct_mmap_coherent,
 #ifdef CONFIG_NOT_COHERENT_CACHE
     .sync_single_range_for_cpu     = dma_direct_sync_single_range,
     .sync_single_range_for_device     = dma_direct_sync_single_range,
