Merge tag 'iwlwifi-next-for-kalle-2014-12-30' of https://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / arch / microblaze / mm / consistent.c
index e10ad93..b06c3a7 100644 (file)
@@ -156,6 +156,25 @@ void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle)
 }
 EXPORT_SYMBOL(consistent_alloc);
 
+#ifdef CONFIG_MMU
+static pte_t *consistent_virt_to_pte(void *vaddr)
+{
+       unsigned long addr = (unsigned long)vaddr;
+
+       return pte_offset_kernel(pmd_offset(pgd_offset_k(addr), addr), addr);
+}
+
+unsigned long consistent_virt_to_pfn(void *vaddr)
+{
+       pte_t *ptep = consistent_virt_to_pte(vaddr);
+
+       if (pte_none(*ptep) || !pte_present(*ptep))
+               return 0;
+
+       return pte_pfn(*ptep);
+}
+#endif
+
 /*
  * free page(s) as defined by the above mapping.
  */
@@ -181,13 +200,9 @@ void consistent_free(size_t size, void *vaddr)
        } while (size -= PAGE_SIZE);
 #else
        do {
-               pte_t *ptep;
+               pte_t *ptep = consistent_virt_to_pte(vaddr);
                unsigned long pfn;
 
-               ptep = pte_offset_kernel(pmd_offset(pgd_offset_k(
-                                               (unsigned int)vaddr),
-                                       (unsigned int)vaddr),
-                               (unsigned int)vaddr);
                if (!pte_none(*ptep) && pte_present(*ptep)) {
                        pfn = pte_pfn(*ptep);
                        pte_clear(&init_mm, (unsigned int)vaddr, ptep);