xref: /linux-6.15/include/asm-generic/fixmap.h (revision b4e89190)
1d57c33c5SMark Salter /*
2d57c33c5SMark Salter  * fixmap.h: compile-time virtual memory allocation
3d57c33c5SMark Salter  *
4d57c33c5SMark Salter  * This file is subject to the terms and conditions of the GNU General Public
5d57c33c5SMark Salter  * License.  See the file "COPYING" in the main directory of this archive
6d57c33c5SMark Salter  * for more details.
7d57c33c5SMark Salter  *
8d57c33c5SMark Salter  * Copyright (C) 1998 Ingo Molnar
9d57c33c5SMark Salter  *
10d57c33c5SMark Salter  * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
11d57c33c5SMark Salter  * x86_32 and x86_64 integration by Gustavo F. Padovan, February 2009
12d57c33c5SMark Salter  * Break out common bits to asm-generic by Mark Salter, November 2013
13d57c33c5SMark Salter  */
14d57c33c5SMark Salter 
15d57c33c5SMark Salter #ifndef __ASM_GENERIC_FIXMAP_H
16d57c33c5SMark Salter #define __ASM_GENERIC_FIXMAP_H
17d57c33c5SMark Salter 
18d57c33c5SMark Salter #include <linux/bug.h>
19*d1402fc7SLogan Gunthorpe #include <linux/mm_types.h>
20d57c33c5SMark Salter 
21d57c33c5SMark Salter #define __fix_to_virt(x)	(FIXADDR_TOP - ((x) << PAGE_SHIFT))
22d57c33c5SMark Salter #define __virt_to_fix(x)	((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
23d57c33c5SMark Salter 
24d57c33c5SMark Salter #ifndef __ASSEMBLY__
25d57c33c5SMark Salter /*
26d57c33c5SMark Salter  * 'index to address' translation. If anyone tries to use the idx
27d57c33c5SMark Salter  * directly without translation, we catch the bug with a NULL-deference
28d57c33c5SMark Salter  * kernel oops. Illegal ranges of incoming indices are caught too.
29d57c33c5SMark Salter  */
fix_to_virt(const unsigned int idx)30d57c33c5SMark Salter static __always_inline unsigned long fix_to_virt(const unsigned int idx)
31d57c33c5SMark Salter {
32d57c33c5SMark Salter 	BUILD_BUG_ON(idx >= __end_of_fixed_addresses);
33d57c33c5SMark Salter 	return __fix_to_virt(idx);
34d57c33c5SMark Salter }
35d57c33c5SMark Salter 
virt_to_fix(const unsigned long vaddr)36d57c33c5SMark Salter static inline unsigned long virt_to_fix(const unsigned long vaddr)
37d57c33c5SMark Salter {
38d57c33c5SMark Salter 	BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
39d57c33c5SMark Salter 	return __virt_to_fix(vaddr);
40d57c33c5SMark Salter }
41d57c33c5SMark Salter 
42d57c33c5SMark Salter /*
43d57c33c5SMark Salter  * Provide some reasonable defaults for page flags.
44d57c33c5SMark Salter  * Not all architectures use all of these different types and some
45d57c33c5SMark Salter  * architectures use different names.
46d57c33c5SMark Salter  */
47d57c33c5SMark Salter #ifndef FIXMAP_PAGE_NORMAL
48d57c33c5SMark Salter #define FIXMAP_PAGE_NORMAL PAGE_KERNEL
49d57c33c5SMark Salter #endif
502592dbbbSJuergen Gross #if !defined(FIXMAP_PAGE_RO) && defined(PAGE_KERNEL_RO)
512592dbbbSJuergen Gross #define FIXMAP_PAGE_RO PAGE_KERNEL_RO
522592dbbbSJuergen Gross #endif
53d57c33c5SMark Salter #ifndef FIXMAP_PAGE_NOCACHE
54d57c33c5SMark Salter #define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_NOCACHE
55d57c33c5SMark Salter #endif
56d57c33c5SMark Salter #ifndef FIXMAP_PAGE_IO
57d57c33c5SMark Salter #define FIXMAP_PAGE_IO PAGE_KERNEL_IO
58d57c33c5SMark Salter #endif
59d57c33c5SMark Salter #ifndef FIXMAP_PAGE_CLEAR
60d57c33c5SMark Salter #define FIXMAP_PAGE_CLEAR __pgprot(0)
61d57c33c5SMark Salter #endif
62d57c33c5SMark Salter 
63d57c33c5SMark Salter #ifndef set_fixmap
64d57c33c5SMark Salter #define set_fixmap(idx, phys)				\
65d57c33c5SMark Salter 	__set_fixmap(idx, phys, FIXMAP_PAGE_NORMAL)
66d57c33c5SMark Salter #endif
67d57c33c5SMark Salter 
68d57c33c5SMark Salter #ifndef clear_fixmap
69d57c33c5SMark Salter #define clear_fixmap(idx)			\
70d57c33c5SMark Salter 	__set_fixmap(idx, 0, FIXMAP_PAGE_CLEAR)
71d57c33c5SMark Salter #endif
72d57c33c5SMark Salter 
73d57c33c5SMark Salter /* Return a pointer with offset calculated */
74d57c33c5SMark Salter #define __set_fixmap_offset(idx, phys, flags)				\
75d57c33c5SMark Salter ({									\
763694bd76SMark Rutland 	unsigned long ________addr;					\
77d57c33c5SMark Salter 	__set_fixmap(idx, phys, flags);					\
783694bd76SMark Rutland 	________addr = fix_to_virt(idx) + ((phys) & (PAGE_SIZE - 1));	\
793694bd76SMark Rutland 	________addr;							\
80d57c33c5SMark Salter })
81d57c33c5SMark Salter 
82d57c33c5SMark Salter #define set_fixmap_offset(idx, phys) \
83d57c33c5SMark Salter 	__set_fixmap_offset(idx, phys, FIXMAP_PAGE_NORMAL)
84d57c33c5SMark Salter 
85d57c33c5SMark Salter /*
86d57c33c5SMark Salter  * Some hardware wants to get fixmapped without caching.
87d57c33c5SMark Salter  */
88d57c33c5SMark Salter #define set_fixmap_nocache(idx, phys) \
89d57c33c5SMark Salter 	__set_fixmap(idx, phys, FIXMAP_PAGE_NOCACHE)
90d57c33c5SMark Salter 
91d57c33c5SMark Salter #define set_fixmap_offset_nocache(idx, phys) \
92d57c33c5SMark Salter 	__set_fixmap_offset(idx, phys, FIXMAP_PAGE_NOCACHE)
93d57c33c5SMark Salter 
94d57c33c5SMark Salter /*
95d57c33c5SMark Salter  * Some fixmaps are for IO
96d57c33c5SMark Salter  */
97d57c33c5SMark Salter #define set_fixmap_io(idx, phys) \
98d57c33c5SMark Salter 	__set_fixmap(idx, phys, FIXMAP_PAGE_IO)
99d57c33c5SMark Salter 
100d57c33c5SMark Salter #endif /* __ASSEMBLY__ */
101d57c33c5SMark Salter #endif /* __ASM_GENERIC_FIXMAP_H */
102