1 // SPDX-License-Identifier: GPL-2.0-only
3 * ioremap implementation.
5 * Copyright (C) 2015 Cadence Design Systems Inc.
9 #include <linux/vmalloc.h>
10 #include <linux/pgtable.h>
11 #include <asm/cacheflush.h>
14 static void __iomem
*xtensa_ioremap(unsigned long paddr
, unsigned long size
,
17 unsigned long offset
= paddr
& ~PAGE_MASK
;
18 unsigned long pfn
= __phys_to_pfn(paddr
);
19 struct vm_struct
*area
;
25 WARN_ON(pfn_valid(pfn
));
27 size
= PAGE_ALIGN(offset
+ size
);
29 area
= get_vm_area(size
, VM_IOREMAP
);
33 vaddr
= (unsigned long)area
->addr
;
34 area
->phys_addr
= paddr
;
36 err
= ioremap_page_range(vaddr
, vaddr
+ size
, paddr
, prot
);
39 vunmap((void *)vaddr
);
43 flush_cache_vmap(vaddr
, vaddr
+ size
);
44 return (void __iomem
*)(offset
+ vaddr
);
47 void __iomem
*xtensa_ioremap_nocache(unsigned long addr
, unsigned long size
)
49 return xtensa_ioremap(addr
, size
, pgprot_noncached(PAGE_KERNEL
));
51 EXPORT_SYMBOL(xtensa_ioremap_nocache
);
53 void __iomem
*xtensa_ioremap_cache(unsigned long addr
, unsigned long size
)
55 return xtensa_ioremap(addr
, size
, PAGE_KERNEL
);
57 EXPORT_SYMBOL(xtensa_ioremap_cache
);
59 void xtensa_iounmap(volatile void __iomem
*io_addr
)
61 void *addr
= (void *)(PAGE_MASK
& (unsigned long)io_addr
);
65 EXPORT_SYMBOL(xtensa_iounmap
);