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