Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm64/mm/ioremap.c
50475 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
3
#include <linux/mm.h>
4
#include <linux/io.h>
5
6
static ioremap_prot_hook_t ioremap_prot_hook;
7
8
int arm64_ioremap_prot_hook_register(ioremap_prot_hook_t hook)
9
{
10
if (WARN_ON(ioremap_prot_hook))
11
return -EBUSY;
12
13
ioremap_prot_hook = hook;
14
return 0;
15
}
16
17
void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
18
pgprot_t pgprot)
19
{
20
unsigned long last_addr = phys_addr + size - 1;
21
22
/* Don't allow outside PHYS_MASK */
23
if (last_addr & ~PHYS_MASK)
24
return NULL;
25
26
/* Don't allow RAM to be mapped. */
27
if (WARN_ONCE(pfn_is_map_memory(__phys_to_pfn(phys_addr)),
28
"ioremap attempted on RAM pfn\n"))
29
return NULL;
30
31
/*
32
* If a hook is registered (e.g. for confidential computing
33
* purposes), call that now and barf if it fails.
34
*/
35
if (unlikely(ioremap_prot_hook) &&
36
WARN_ON(ioremap_prot_hook(phys_addr, size, &pgprot))) {
37
return NULL;
38
}
39
40
return generic_ioremap_prot(phys_addr, size, pgprot);
41
}
42
EXPORT_SYMBOL(ioremap_prot);
43
44
/*
45
* Must be called after early_fixmap_init
46
*/
47
void __init early_ioremap_init(void)
48
{
49
early_ioremap_setup();
50
}
51
52
bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
53
unsigned long flags)
54
{
55
unsigned long pfn = PHYS_PFN(offset);
56
57
return pfn_is_map_memory(pfn);
58
}
59
60