1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
4 #include <linux/export.h>
6 #include <linux/vmalloc.h>
9 #include <asm/pgtable.h>
11 static void __iomem *__ioremap_caller(phys_addr_t addr, size_t size,
12 pgprot_t prot, void *caller)
14 phys_addr_t last_addr;
15 unsigned long offset, vaddr;
16 struct vm_struct *area;
18 last_addr = addr + size - 1;
19 if (!size || last_addr < addr)
22 offset = addr & (~PAGE_MASK);
24 size = PAGE_ALIGN(size + offset);
26 area = get_vm_area_caller(size, VM_IOREMAP, caller);
30 vaddr = (unsigned long)area->addr;
32 if (ioremap_page_range(vaddr, vaddr + size, addr, prot)) {
37 return (void __iomem *)(vaddr + offset);
40 void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot)
42 return __ioremap_caller(phys_addr, size, prot,
43 __builtin_return_address(0));
45 EXPORT_SYMBOL(__ioremap);
47 void iounmap(void __iomem *addr)
49 vunmap((void *)((unsigned long)addr & PAGE_MASK));
51 EXPORT_SYMBOL(iounmap);
53 pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
54 unsigned long size, pgprot_t vma_prot)
56 if (!pfn_valid(pfn)) {
57 return pgprot_noncached(vma_prot);
58 } else if (file->f_flags & O_SYNC) {
59 return pgprot_writecombine(vma_prot);
64 EXPORT_SYMBOL(phys_mem_access_prot);