summaryrefslogtreecommitdiff
path: root/arch/powerpc/mm/ioremap_32.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_32.c
parent4a45b7460cf458012a6930f675e141256b81dcf4 (diff)
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_32.c')
-rw-r--r--arch/powerpc/mm/ioremap_32.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/arch/powerpc/mm/ioremap_32.c b/arch/powerpc/mm/ioremap_32.c
index fcf343dbf2bf..f36121f25243 100644
--- a/arch/powerpc/mm/ioremap_32.c
+++ b/arch/powerpc/mm/ioremap_32.c
@@ -60,24 +60,21 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, pgprot_t prot, void *call
*/
v = p_block_mapped(p);
if (v)
- goto out;
+ return (void __iomem *)v + offset;
- if (slab_is_available()) {
+ if (slab_is_available())
return do_ioremap(p, offset, size, prot, caller);
- } else {
- v = (ioremap_bot -= size);
- }
/*
* Should check if it is a candidate for a BAT mapping
*/
- err = ioremap_range((unsigned long)v, p, size, prot);
+ err = early_ioremap_range(ioremap_bot - size, p, size, prot);
if (err)
return NULL;
+ ioremap_bot -= size;
-out:
- return (void __iomem *)(v + ((unsigned long)addr & ~PAGE_MASK));
+ return (void __iomem *)ioremap_bot + offset;
}
void iounmap(volatile void __iomem *addr)