aboutsummaryrefslogtreecommitdiff
path: root/mm/early_ioremap.c
diff options
context:
space:
mode:
authorAlex Shi <alex.shi@linaro.org>2016-04-11 11:16:39 +0800
committerAlex Shi <alex.shi@linaro.org>2016-04-11 11:16:39 +0800
commitd83731cf53fd3af7173cab5e3f573d06ebc852be (patch)
treed61002ed1d894fe2d9b26003a1230f05a61ed51b /mm/early_ioremap.c
parentbfbd381ea0ca274e4c07ea62acaaeac31829cd5d (diff)
parent017cfa86c2450b158d7d0336f2f3ea685da1230b (diff)
Merge branch 'linux-linaro-lsk-v4.1' into linux-linaro-lsk-v4.1-rtlsk-v4.1-16.04-rt
Diffstat (limited to 'mm/early_ioremap.c')
-rw-r--r--mm/early_ioremap.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/mm/early_ioremap.c b/mm/early_ioremap.c
index e10ccd299d66..a0baeb4be934 100644
--- a/mm/early_ioremap.c
+++ b/mm/early_ioremap.c
@@ -217,6 +217,28 @@ early_memremap(resource_size_t phys_addr, unsigned long size)
return (__force void *)__early_ioremap(phys_addr, size,
FIXMAP_PAGE_NORMAL);
}
+
+#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 = src & ~PAGE_MASK;
+ 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 *