xref: /rk3399_ARM-atf/lib/xlat_tables_v2/xlat_tables_private.h (revision c17749bba73d17916a3b6e1e51788679ffca50c1)
1 /*
2  * Copyright (c) 2017-2021, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef XLAT_TABLES_PRIVATE_H
8 #define XLAT_TABLES_PRIVATE_H
9 
10 #include <stdbool.h>
11 
12 #include <platform_def.h>
13 
14 #include <lib/xlat_tables/xlat_tables_defs.h>
15 
16 #if PLAT_XLAT_TABLES_DYNAMIC
17 /*
18  * Private shifts and masks to access fields of an mmap attribute
19  */
20 /* Dynamic or static */
21 #define MT_DYN_SHIFT		U(31)
22 
23 /*
24  * Memory mapping private attributes
25  *
26  * Private attributes not exposed in the public header.
27  */
28 
29 /*
30  * Regions mapped before the MMU can't be unmapped dynamically (they are
31  * static) and regions mapped with MMU enabled can be unmapped. This
32  * behaviour can't be overridden.
33  *
34  * Static regions can overlap each other, dynamic regions can't.
35  */
36 #define MT_STATIC	(U(0) << MT_DYN_SHIFT)
37 #define MT_DYNAMIC	(U(1) << MT_DYN_SHIFT)
38 
39 #endif /* PLAT_XLAT_TABLES_DYNAMIC */
40 
41 extern uint64_t mmu_cfg_params[MMU_CFG_PARAM_MAX];
42 
43 /*
44  * Determine the physical address space encoded in the 'attr' parameter for the
45  * context 'ctx'.
46  */
47 uint32_t xlat_arch_get_pas(const xlat_ctx_t *ctx, uint32_t attr);
48 
49 /*
50  * Return the execute-never mask that will prevent instruction fetch at the
51  * given translation regime.
52  */
53 uint64_t xlat_arch_regime_get_xn_desc(int xlat_regime);
54 
55 /*
56  * Invalidate all TLB entries that match the given virtual address. This
57  * operation applies to all PEs in the same Inner Shareable domain as the PE
58  * that executes this function. This functions must be called for every
59  * translation table entry that is modified. It only affects the specified
60  * translation regime.
61  *
62  * Note, however, that it is architecturally UNDEFINED to invalidate TLB entries
63  * pertaining to a higher exception level, e.g. invalidating EL3 entries from
64  * S-EL1.
65  */
66 void xlat_arch_tlbi_va(uintptr_t va, int xlat_regime);
67 
68 /*
69  * This function has to be called at the end of any code that uses the function
70  * xlat_arch_tlbi_va().
71  */
72 void xlat_arch_tlbi_va_sync(void);
73 
74 /* Print VA, PA, size and attributes of all regions in the mmap array. */
75 void xlat_mmap_print(const mmap_region_t *mmap);
76 
77 /*
78  * Print the current state of the translation tables by reading them from
79  * memory.
80  */
81 void xlat_tables_print(xlat_ctx_t *ctx);
82 
83 /*
84  * Returns a block/page table descriptor for the given level and attributes.
85  */
86 uint64_t xlat_desc(const xlat_ctx_t *ctx, uint32_t attr,
87 		   unsigned long long addr_pa, unsigned int level);
88 
89 /*
90  * Architecture-specific initialization code.
91  */
92 
93 /* Returns the current Exception Level. The returned EL must be 1 or higher. */
94 unsigned int xlat_arch_current_el(void);
95 
96 /*
97  * Return the maximum physical address supported by the hardware.
98  * This value depends on the execution state (AArch32/AArch64).
99  */
100 unsigned long long xlat_arch_get_max_supported_pa(void);
101 
102 /*
103  * Returns true if the MMU of the translation regime managed by the given
104  * xlat_ctx_t is enabled, false otherwise.
105  */
106 bool is_mmu_enabled_ctx(const xlat_ctx_t *ctx);
107 
108 /*
109  * Returns minimum virtual address space size supported by the architecture
110  */
111 uintptr_t xlat_get_min_virt_addr_space_size(void);
112 
113 #endif /* XLAT_TABLES_PRIVATE_H */
114