Merge remote-tracking branch 'lsk/v3.10/topic/aosp' into linux-linaro-lsk-android
[firefly-linux-kernel-4.4.55.git] / arch / x86 / mm / ioremap.c
index 9a1e6583910c2e5ada549f52ff8dcb19639c3cd3..86c758de4b34618b323aa3553a3f27cccfc388ab 100644 (file)
@@ -50,6 +50,21 @@ int ioremap_change_attr(unsigned long vaddr, unsigned long size,
        return err;
 }
 
+static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages,
+                              void *arg)
+{
+       unsigned long i;
+
+       for (i = 0; i < nr_pages; ++i)
+               if (pfn_valid(start_pfn + i) &&
+                   !PageReserved(pfn_to_page(start_pfn + i)))
+                       return 1;
+
+       WARN_ONCE(1, "ioremap on RAM pfn 0x%lx\n", start_pfn);
+
+       return 0;
+}
+
 /*
  * Remap an arbitrary physical address space into the kernel virtual
  * address space. Needed when the kernel wants to access high addresses
@@ -93,14 +108,11 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
        /*
         * Don't allow anybody to remap normal RAM that we're using..
         */
+       pfn      = phys_addr >> PAGE_SHIFT;
        last_pfn = last_addr >> PAGE_SHIFT;
-       for (pfn = phys_addr >> PAGE_SHIFT; pfn <= last_pfn; pfn++) {
-               int is_ram = page_is_ram(pfn);
-
-               if (is_ram && pfn_valid(pfn) && !PageReserved(pfn_to_page(pfn)))
-                       return NULL;
-               WARN_ON_ONCE(is_ram);
-       }
+       if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL,
+                                 __ioremap_check_ram) == 1)
+               return NULL;
 
        /*
         * Mappings have to be page-aligned