3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4 Copyright (c) 2011 - 2013, ARM Limited. All rights reserved.
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <Chipset/ARM926EJ-S.h>
17 #include <Library/ArmLib.h>
18 #include <Library/BaseMemoryLib.h>
19 #include <Library/MemoryAllocationLib.h>
20 #include <Library/DebugLib.h>
23 FillTranslationTable (
24 IN UINT32
*TranslationTable
,
25 IN ARM_MEMORY_REGION_DESCRIPTOR
*MemoryRegion
32 UINT32 PhysicalBase
= MemoryRegion
->PhysicalBase
;
34 switch (MemoryRegion
->Attributes
) {
35 case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
:
36 Attributes
= TT_DESCRIPTOR_SECTION_WRITE_BACK
;
38 case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH
:
39 Attributes
= TT_DESCRIPTOR_SECTION_WRITE_THROUGH
;
41 case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
:
42 Attributes
= TT_DESCRIPTOR_SECTION_UNCACHED_UNBUFFERED
;
44 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK
:
45 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH
:
46 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED
:
47 ASSERT(0); // Trustzone is not supported on ARMv5
49 Attributes
= TT_DESCRIPTOR_SECTION_UNCACHED_UNBUFFERED
;
53 Entry
= TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable
, MemoryRegion
->VirtualBase
);
54 Sections
= MemoryRegion
->Length
/ TT_DESCRIPTOR_SECTION_SIZE
;
56 // The current code does not support memory region size that is not aligned on TT_DESCRIPTOR_SECTION_SIZE boundary
57 ASSERT (MemoryRegion
->Length
% TT_DESCRIPTOR_SECTION_SIZE
== 0);
59 for (Index
= 0; Index
< Sections
; Index
++)
61 *Entry
++ = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase
) | Attributes
;
62 PhysicalBase
+= TT_DESCRIPTOR_SECTION_SIZE
;
69 IN ARM_MEMORY_REGION_DESCRIPTOR
*MemoryTable
,
70 OUT VOID
**TranslationTableBase OPTIONAL
,
71 OUT UINTN
*TranslationTableSize OPTIONAL
74 VOID
*TranslationTable
;
76 // Allocate pages for translation table.
77 TranslationTable
= AllocatePages (EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SIZE
+ TRANSLATION_TABLE_ALIGNMENT
));
78 if (TranslationTable
== NULL
) {
79 return RETURN_OUT_OF_RESOURCES
;
81 TranslationTable
= (VOID
*)(((UINTN
)TranslationTable
+ TRANSLATION_TABLE_ALIGNMENT_MASK
) & ~TRANSLATION_TABLE_ALIGNMENT_MASK
);
83 if (TranslationTableBase
!= NULL
) {
84 *TranslationTableBase
= TranslationTable
;
87 if (TranslationTableBase
!= NULL
) {
88 *TranslationTableSize
= TRANSLATION_TABLE_SIZE
;
91 ZeroMem(TranslationTable
, TRANSLATION_TABLE_SIZE
);
93 ArmCleanInvalidateDataCache();
94 ArmInvalidateInstructionCache();
97 ArmDisableDataCache();
98 ArmDisableInstructionCache();
101 // Make sure nothing sneaked into the cache
102 ArmCleanInvalidateDataCache();
103 ArmInvalidateInstructionCache();
105 while (MemoryTable
->Length
!= 0) {
106 FillTranslationTable(TranslationTable
, MemoryTable
);
110 ArmSetTTBR0(TranslationTable
);
112 ArmSetDomainAccessControl(DOMAIN_ACCESS_CONTROL_NONE(15) |
113 DOMAIN_ACCESS_CONTROL_NONE(14) |
114 DOMAIN_ACCESS_CONTROL_NONE(13) |
115 DOMAIN_ACCESS_CONTROL_NONE(12) |
116 DOMAIN_ACCESS_CONTROL_NONE(11) |
117 DOMAIN_ACCESS_CONTROL_NONE(10) |
118 DOMAIN_ACCESS_CONTROL_NONE( 9) |
119 DOMAIN_ACCESS_CONTROL_NONE( 8) |
120 DOMAIN_ACCESS_CONTROL_NONE( 7) |
121 DOMAIN_ACCESS_CONTROL_NONE( 6) |
122 DOMAIN_ACCESS_CONTROL_NONE( 5) |
123 DOMAIN_ACCESS_CONTROL_NONE( 4) |
124 DOMAIN_ACCESS_CONTROL_NONE( 3) |
125 DOMAIN_ACCESS_CONTROL_NONE( 2) |
126 DOMAIN_ACCESS_CONTROL_NONE( 1) |
127 DOMAIN_ACCESS_CONTROL_MANAGER(0));
129 ArmEnableInstructionCache();
130 ArmEnableDataCache();
133 return RETURN_SUCCESS
;