]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/Arm11/Arm11LibMem.c
ArmPkg: Made ArmConfigureMmu() returns a status code
[mirror_edk2.git] / ArmPkg / Library / ArmLib / Arm11 / Arm11LibMem.c
CommitLineData
1e57a462 1/** @file\r
2\r
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
6f050ad6 4 Copyright (c) 2011 - 2013, ARM Limited. All rights reserved.\r
1e57a462 5 \r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include <Chipset/ARM1176JZ-S.h>\r
17#include <Library/ArmLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/MemoryAllocationLib.h>\r
20\r
21VOID\r
22FillTranslationTable (\r
23 IN UINT32 *TranslationTable,\r
24 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryRegion\r
25 )\r
26{\r
27 UINT32 *Entry;\r
28 UINTN Sections;\r
29 UINTN Index;\r
30 UINT32 Attributes;\r
31 UINT32 PhysicalBase = MemoryRegion->PhysicalBase;\r
32 \r
33 switch (MemoryRegion->Attributes) {\r
34 case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK:\r
35 Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(0);\r
36 break;\r
37 case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:\r
38 Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH(0);\r
39 break;\r
40 case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED:\r
41 Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(0);\r
42 break;\r
43 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK:\r
44 Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(1);\r
45 break;\r
46 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH:\r
47 Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH(1);\r
48 break;\r
49 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED:\r
50 Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(1);\r
51 break;\r
52 default:\r
53 Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(0);\r
54 break;\r
55 }\r
56 \r
57 Entry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase);\r
58 Sections = ((( MemoryRegion->Length - 1 ) / TT_DESCRIPTOR_SECTION_SIZE ) + 1 );\r
59 \r
60 for (Index = 0; Index < Sections; Index++)\r
61 {\r
62 *Entry++ = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase) | Attributes;\r
63 PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE;\r
64 }\r
65}\r
66\r
6f050ad6 67RETURN_STATUS\r
1e57a462 68EFIAPI\r
69ArmConfigureMmu (\r
70 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,\r
6f050ad6
OM
71 OUT VOID **TranslationTableBase OPTIONAL,\r
72 OUT UINTN *TranslationTableSize OPTIONAL\r
1e57a462 73 )\r
74{\r
75 VOID *TranslationTable;\r
76\r
77 // Allocate pages for translation table.\r
6f050ad6
OM
78 TranslationTable = AllocatePages (EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SIZE + TRANSLATION_TABLE_ALIGNMENT));\r
79 if (TranslationTable == NULL) {\r
80 return RETURN_OUT_OF_RESOURCES;\r
81 }\r
1e57a462 82 TranslationTable = (VOID *)(((UINTN)TranslationTable + TRANSLATION_TABLE_ALIGNMENT_MASK) & ~TRANSLATION_TABLE_ALIGNMENT_MASK);\r
83\r
84 if (TranslationTableBase != NULL) {\r
85 *TranslationTableBase = TranslationTable;\r
86 }\r
87 \r
88 if (TranslationTableBase != NULL) {\r
89 *TranslationTableSize = TRANSLATION_TABLE_SIZE;\r
90 }\r
91\r
92 ZeroMem(TranslationTable, TRANSLATION_TABLE_SIZE);\r
93\r
94 ArmCleanInvalidateDataCache();\r
95 ArmInvalidateInstructionCache();\r
96 ArmInvalidateTlb();\r
97\r
98 ArmDisableDataCache();\r
99 ArmDisableInstructionCache();\r
100 ArmDisableMmu();\r
101\r
102 // Make sure nothing sneaked into the cache\r
103 ArmCleanInvalidateDataCache();\r
104 ArmInvalidateInstructionCache();\r
105\r
106 while (MemoryTable->Length != 0) {\r
107 FillTranslationTable(TranslationTable, MemoryTable);\r
108 MemoryTable++;\r
109 }\r
110\r
111 ArmSetTTBR0(TranslationTable);\r
112 \r
113 ArmSetDomainAccessControl(DOMAIN_ACCESS_CONTROL_NONE(15) |\r
114 DOMAIN_ACCESS_CONTROL_NONE(14) |\r
115 DOMAIN_ACCESS_CONTROL_NONE(13) |\r
116 DOMAIN_ACCESS_CONTROL_NONE(12) |\r
117 DOMAIN_ACCESS_CONTROL_NONE(11) |\r
118 DOMAIN_ACCESS_CONTROL_NONE(10) |\r
119 DOMAIN_ACCESS_CONTROL_NONE( 9) |\r
120 DOMAIN_ACCESS_CONTROL_NONE( 8) |\r
121 DOMAIN_ACCESS_CONTROL_NONE( 7) |\r
122 DOMAIN_ACCESS_CONTROL_NONE( 6) |\r
123 DOMAIN_ACCESS_CONTROL_NONE( 5) |\r
124 DOMAIN_ACCESS_CONTROL_NONE( 4) |\r
125 DOMAIN_ACCESS_CONTROL_NONE( 3) |\r
126 DOMAIN_ACCESS_CONTROL_NONE( 2) |\r
127 DOMAIN_ACCESS_CONTROL_NONE( 1) |\r
128 DOMAIN_ACCESS_CONTROL_MANAGER(0));\r
129 \r
130 ArmEnableInstructionCache();\r
131 ArmEnableDataCache();\r
6f050ad6 132 ArmEnableMmu();\r
1e57a462 133\r
6f050ad6
OM
134 return RETURN_SUCCESS;\r
135}\r