First version
[3rdparty/ote_partner/tlk.git] / arch / arm / include / arch / arm / mmu.h
1 /*
2  * Copyright (c) 2008 Travis Geiselbrecht
3  * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files
7  * (the "Software"), to deal in the Software without restriction,
8  * including without limitation the rights to use, copy, modify, merge,
9  * publish, distribute, sublicense, and/or sell copies of the Software,
10  * and to permit persons to whom the Software is furnished to do so,
11  * subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24
25 #ifndef __ARCH_ARM_MMU_H
26 #define __ARCH_ARM_MMU_H
27
28 #include <sys/types.h>
29 #include <kernel/task.h>
30 #include <kernel/thread.h>
31
32 #if defined(__cplusplus)
33 extern "C" {
34 #endif
35
36 #define ALIGN_4KB       (4 * 1024)
37 #define ALIGN_1MB       (1 * 1024 * 1024)
38
39 /* define needed virtaddr alignment for non-secure memory */
40 #if ARM_WITH_LPAE
41 #define NS_VIRT_ADDR_ALIGN      ALIGN_4KB
42 #else
43 #define NS_VIRT_ADDR_ALIGN      ALIGN_1MB
44 #endif
45
46 /* PAR register: common defines (between short/long desc) */
47 #define PAR_ATTR_FAULTED        (0x1 <<  0)
48 #define PAR_ATTR_LPAE           (0x1 << 11)
49
50 /* PAR register: short desc defines */
51 #define PAR_SDESC_ATTR_NON_SECURE       (0x1 << 9)
52 #define PAR_SDESC_ATTR_SHAREABLE(par)   (((par) >> 7) & 0x1)
53 #define PAR_SDESC_ATTR_INNER(par)       (((par) >> 4) & 0x7)
54 #define PAR_SDESC_ATTR_OUTER(par)       (((par) >> 2) & 0x3)
55
56 #define PAR_SDESC_ATTR_SSECTION         (0x1 << 1)
57 #define PAR_SDESC_ALIGNED_PA(par)       \
58         (((par) & PAR_SDESC_ATTR_SSECTION) ?    /* super-section */             \
59                 (((par) & 0xFF000000ULL) | (((par) & 0x00FF0000ULL) << 16)) :   \
60                 ((par) & ~PAGE_MASK))   /* section or large/small page */
61
62 /* PAR register: long desc defines */
63 #define PAR_LDESC_ATTR_NON_SECURE       (0x1 << 9)
64 #define PAR_LDESC_ATTR_SHAREABLE(par)   (((par) >> 7) & 0x3)
65 #define PAR_LDESC_ATTR_INNER(par)       (((par) >> 56) & 0xF)
66 #define PAR_LDESC_ATTR_OUTER(par)       (((par) >> 60) & 0xF)
67
68 #define PAR_LDESC_ALIGNED_PA(par)       ((par) & 0xFFFFFF000ULL)
69
70 #define MAX_TASK_SIZE           (arm_max_task_space())
71 #define INVALID_PHYSADDR        (-1)
72
73 #if ARM_USE_MMU_RELOC
74 extern uint32_t __load_phys_base;
75 #define virtual_to_physical(v)  (((vaddr_t)(v) - (vaddr_t)VMEMBASE) + __load_phys_base)
76 #define physical_to_virtual(p)  ((vaddr_t)((((paddr_t)(p)) - __load_phys_base) + VMEMBASE))
77 #else
78 #define virtual_to_physical(v)  (v)
79 #define physical_to_virtual(p)  (p)
80 #endif
81
82 typedef struct arm_phys_attrs {
83         uint64_t physaddr;
84         uint8_t inner;
85         uint8_t outer;
86         uint8_t shareable;
87         uint8_t is_lpae;
88         uint8_t faulted;
89 } arm_phys_attrs_t;
90
91 void arm_mmu_init(void);
92 void arm_mmu_map_section(addr_t paddr, addr_t vaddr, uint flags);
93 void arm_mmu_map_kpage(vaddr_t vaddr, paddr_t paddr, task_map_t *mptr);
94 void arm_mmu_unmap_section(addr_t vaddr);
95 void arm_mmu_map_upage(task_t *taskp, vaddr_t vaddr, paddr_t paddr, task_map_t *mptr);
96 void arm_mmu_unmap_upage(task_t *taskp, addr_t vaddr);
97 void arm_mmu_translate_range(nsaddr_t vaddr, paddr_t *pagelist, task_map_t *mptr);
98 paddr_t arm_mmu_virt_to_phys(nsaddr_t vaddr, bool ns, bool priv);
99 status_t arm_mmu_set_attrs_task_init(task_map_t *mptr);
100
101 void arm_mmu_desc_set_default_kernel(arm_phys_attrs_t *attrs);
102 void arm_mmu_desc_set_default_task(arm_phys_attrs_t *attrs);
103 void arm_mmu_desc_map_page(vaddr_t vaddr, paddr_t paddr, paddr_t *pgtbl,
104                            tmflags_t flags, arm_phys_attrs_t *attrs);
105 void arm_mmu_desc_unmap_page(paddr_t pgtbl, vaddr_t vaddr, uint32_t asid);
106 vaddr_t arm_mmu_desc_get_max_user_space();
107 #if !defined(ARM_USE_MMU_RELOC)
108 void arm_mmu_desc_config_mmu()
109 #endif
110 inline vaddr_t arm_max_task_space() { return arm_mmu_desc_get_max_user_space(); }
111
112 #if defined(__cplusplus)
113 }
114 #endif
115
116 #endif