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 void __iomem
*ioremap(phys_addr_t addr
, size_t size
)
13 phys_addr_t last_addr
;
14 unsigned long offset
, vaddr
;
15 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_ALLOC
, __builtin_return_address(0));
30 vaddr
= (unsigned long)area
->addr
;
32 prot
= __pgprot(_PAGE_PRESENT
| __READABLE
| __WRITEABLE
|
33 _PAGE_GLOBAL
| _CACHE_UNCACHED
| _PAGE_SO
);
35 if (ioremap_page_range(vaddr
, vaddr
+ size
, addr
, prot
)) {
40 return (void __iomem
*)(vaddr
+ offset
);
42 EXPORT_SYMBOL(ioremap
);
44 void iounmap(void __iomem
*addr
)
46 vunmap((void *)((unsigned long)addr
& PAGE_MASK
));
48 EXPORT_SYMBOL(iounmap
);
50 pgprot_t
phys_mem_access_prot(struct file
*file
, unsigned long pfn
,
51 unsigned long size
, pgprot_t vma_prot
)
53 if (!pfn_valid(pfn
)) {
54 vma_prot
.pgprot
|= _PAGE_SO
;
55 return pgprot_noncached(vma_prot
);
56 } else if (file
->f_flags
& O_SYNC
) {
57 return pgprot_noncached(vma_prot
);
62 EXPORT_SYMBOL(phys_mem_access_prot
);