These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / mm / early_ioremap.c
index e10ccd2..6d5717b 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
 #include <asm/fixmap.h>
+#include <asm/early_ioremap.h>
 
 #ifdef CONFIG_MMU
 static int early_ioremap_debug __initdata;
@@ -125,7 +126,7 @@ __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
        /*
         * Mappings have to be page-aligned
         */
-       offset = phys_addr & ~PAGE_MASK;
+       offset = offset_in_page(phys_addr);
        phys_addr &= PAGE_MASK;
        size = PAGE_ALIGN(last_addr + 1) - phys_addr;
 
@@ -188,7 +189,7 @@ void __init early_iounmap(void __iomem *addr, unsigned long size)
        if (WARN_ON(virt_addr < fix_to_virt(FIX_BTMAP_BEGIN)))
                return;
 
-       offset = virt_addr & ~PAGE_MASK;
+       offset = offset_in_page(virt_addr);
        nrpages = PAGE_ALIGN(offset + size) >> PAGE_SHIFT;
 
        idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot;
@@ -217,6 +218,35 @@ early_memremap(resource_size_t phys_addr, unsigned long size)
        return (__force void *)__early_ioremap(phys_addr, size,
                                               FIXMAP_PAGE_NORMAL);
 }
+#ifdef FIXMAP_PAGE_RO
+void __init *
+early_memremap_ro(resource_size_t phys_addr, unsigned long size)
+{
+       return (__force void *)__early_ioremap(phys_addr, size, FIXMAP_PAGE_RO);
+}
+#endif
+
+#define MAX_MAP_CHUNK  (NR_FIX_BTMAPS << PAGE_SHIFT)
+
+void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size)
+{
+       unsigned long slop, clen;
+       char *p;
+
+       while (size) {
+               slop = offset_in_page(src);
+               clen = size;
+               if (clen > MAX_MAP_CHUNK - slop)
+                       clen = MAX_MAP_CHUNK - slop;
+               p = early_memremap(src & PAGE_MASK, clen + slop);
+               memcpy(dest, p + slop, clen);
+               early_memunmap(p, clen + slop);
+               dest += clen;
+               src += clen;
+               size -= clen;
+       }
+}
+
 #else /* CONFIG_MMU */
 
 void __init __iomem *
@@ -231,6 +261,11 @@ early_memremap(resource_size_t phys_addr, unsigned long size)
 {
        return (void *)phys_addr;
 }
+void __init *
+early_memremap_ro(resource_size_t phys_addr, unsigned long size)
+{
+       return (void *)phys_addr;
+}
 
 void __init early_iounmap(void __iomem *addr, unsigned long size)
 {