aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/mm/ioremap.c
diff options
context:
space:
mode:
authorChristophe Leroy <christophe.leroy@c-s.fr>2019-08-20 14:07:20 +0000
committerMichael Ellerman <mpe@ellerman.id.au>2019-08-27 13:03:35 +1000
commit163918fc5741d755cf9d477ebfcb761f09b82982 (patch)
tree1fe435495b065344b797a5dd55cae150851d6748 /arch/powerpc/mm/ioremap.c
parentpowerpc/mm: refactor ioremap vm area setup. (diff)
downloadlinux-dev-163918fc5741d755cf9d477ebfcb761f09b82982.tar.xz
linux-dev-163918fc5741d755cf9d477ebfcb761f09b82982.zip
powerpc/mm: split out early ioremap path.
ioremap does things differently depending on whether SLAB is available or not at different levels. Try to separate the early path from the beginning. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/3acd2dbe04b04f111475e7a59f2b6f2ab9b95ab6.1566309263.git.christophe.leroy@c-s.fr
Diffstat (limited to 'arch/powerpc/mm/ioremap.c')
-rw-r--r--arch/powerpc/mm/ioremap.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/arch/powerpc/mm/ioremap.c b/arch/powerpc/mm/ioremap.c
index 57630325846c..fc669643ce6a 100644
--- a/arch/powerpc/mm/ioremap.c
+++ b/arch/powerpc/mm/ioremap.c
@@ -59,18 +59,11 @@ void __iomem *ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long f
}
EXPORT_SYMBOL(ioremap_prot);
-int ioremap_range(unsigned long ea, phys_addr_t pa, unsigned long size, pgprot_t prot)
+int early_ioremap_range(unsigned long ea, phys_addr_t pa,
+ unsigned long size, pgprot_t prot)
{
unsigned long i;
- if (slab_is_available()) {
- int err = ioremap_page_range(ea, ea + size, pa, prot);
-
- if (err)
- unmap_kernel_range(ea, size);
- return err;
- }
-
for (i = 0; i < size; i += PAGE_SIZE) {
int err = map_kernel_page(ea + i, pa + i, prot);
@@ -86,16 +79,20 @@ void __iomem *do_ioremap(phys_addr_t pa, phys_addr_t offset, unsigned long size,
{
struct vm_struct *area;
int ret;
+ unsigned long va;
area = __get_vm_area_caller(size, VM_IOREMAP, IOREMAP_START, IOREMAP_END, caller);
if (area == NULL)
return NULL;
area->phys_addr = pa;
- ret = ioremap_range((unsigned long)area->addr, pa, size, prot);
+ va = (unsigned long)area->addr;
+
+ ret = ioremap_page_range(va, va + size, pa, prot);
if (!ret)
return (void __iomem *)area->addr + offset;
+ unmap_kernel_range(va, size);
free_vm_area(area);
return NULL;