Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm64/mm/ioremap.c
26425 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_ON(pfn_is_map_memory(__phys_to_pfn(phys_addr))))
28
return NULL;
29
30
/*
31
* If a hook is registered (e.g. for confidential computing
32
* purposes), call that now and barf if it fails.
33
*/
34
if (unlikely(ioremap_prot_hook) &&
35
WARN_ON(ioremap_prot_hook(phys_addr, size, &pgprot))) {
36
return NULL;
37
}
38
39
return generic_ioremap_prot(phys_addr, size, pgprot);
40
}
41
EXPORT_SYMBOL(ioremap_prot);
42
43
/*
44
* Must be called after early_fixmap_init
45
*/
46
void __init early_ioremap_init(void)
47
{
48
early_ioremap_setup();
49
}
50
51
bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size,
52
unsigned long flags)
53
{
54
unsigned long pfn = PHYS_PFN(offset);
55
56
return pfn_is_map_memory(pfn);
57
}
58
59