blob: 45eaf55d2cf0cdb02b0dc19cc8fcdc708879e4e8 [file] [log] [blame]
Antonio Nino Diaz233c7c12017-03-08 14:40:23 +00001/*
2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Antonio Nino Diaz233c7c12017-03-08 14:40:23 +00005 */
6
7#ifndef __XLAT_TABLES_PRIVATE_H__
8#define __XLAT_TABLES_PRIVATE_H__
9
Antonio Nino Diaz233c7c12017-03-08 14:40:23 +000010#include <platform_def.h>
Sandrine Bailleux090c8492017-05-19 09:59:37 +010011#include <xlat_tables_defs.h>
Antonio Nino Diaz233c7c12017-03-08 14:40:23 +000012
Antonio Nino Diazac998032017-02-27 17:23:54 +000013#if PLAT_XLAT_TABLES_DYNAMIC
14/*
15 * Shifts and masks to access fields of an mmap_attr_t
16 */
17/* Dynamic or static */
18#define MT_DYN_SHIFT 30 /* 31 would cause undefined behaviours */
19
20/*
21 * Memory mapping private attributes
22 *
23 * Private attributes not exposed in the mmap_attr_t enum.
24 */
25typedef enum {
26 /*
27 * Regions mapped before the MMU can't be unmapped dynamically (they are
28 * static) and regions mapped with MMU enabled can be unmapped. This
29 * behaviour can't be overridden.
30 *
31 * Static regions can overlap each other, dynamic regions can't.
32 */
33 MT_STATIC = 0 << MT_DYN_SHIFT,
34 MT_DYNAMIC = 1 << MT_DYN_SHIFT
35} mmap_priv_attr_t;
36
37/*
38 * Function used to invalidate all levels of the translation walk for a given
39 * virtual address. It must be called for every translation table entry that is
40 * modified.
41 */
42void xlat_arch_tlbi_va(uintptr_t va);
43
44/*
45 * This function has to be called at the end of any code that uses the function
46 * xlat_arch_tlbi_va().
47 */
48void xlat_arch_tlbi_va_sync(void);
49
50/* Add a dynamic region to the specified context. */
51int mmap_add_dynamic_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm);
52
53/* Remove a dynamic region from the specified context. */
54int mmap_remove_dynamic_region_ctx(xlat_ctx_t *ctx, uintptr_t base_va,
55 size_t size);
56
57#endif /* PLAT_XLAT_TABLES_DYNAMIC */
58
Antonio Nino Diaz233c7c12017-03-08 14:40:23 +000059/* Print VA, PA, size and attributes of all regions in the mmap array. */
60void print_mmap(mmap_region_t *const mmap);
61
62/*
63 * Print the current state of the translation tables by reading them from
64 * memory.
65 */
66void xlat_tables_print(xlat_ctx_t *ctx);
67
68/*
69 * Initialize the translation tables by mapping all regions added to the
70 * specified context.
71 */
72void init_xlation_table(xlat_ctx_t *ctx);
73
74/* Add a static region to the specified context. */
75void mmap_add_region_ctx(xlat_ctx_t *ctx, mmap_region_t *mm);
76
77/*
78 * Architecture-specific initialization code.
79 */
Antonio Nino Diazefabaa92017-04-27 13:30:22 +010080
81/* Returns the current Exception Level. The returned EL must be 1 or higher. */
82int xlat_arch_current_el(void);
83
84/*
85 * Returns the bit mask that has to be ORed to the rest of a translation table
86 * descriptor so that execution of code is prohibited at the given Exception
87 * Level.
88 */
89uint64_t xlat_arch_get_xn_desc(int el);
Antonio Nino Diaz233c7c12017-03-08 14:40:23 +000090
91/* Execute architecture-specific translation table initialization code. */
92void init_xlat_tables_arch(unsigned long long max_pa);
93
94/* Enable MMU and configure it to use the specified translation tables. */
95void enable_mmu_arch(unsigned int flags, uint64_t *base_table);
96
97/* Return 1 if the MMU of this Exception Level is enabled, 0 otherwise. */
98int is_mmu_enabled(void);
99
100#endif /* __XLAT_TABLES_PRIVATE_H__ */