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