|
@@ -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
|