]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/Arm11/Arm11LibMem.c
ARM Packages: Fixed line endings
[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
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/ARM1176JZ-S.h>\r
16#include <Library/ArmLib.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/MemoryAllocationLib.h>\r
19\r
20VOID\r
21FillTranslationTable (\r
22 IN UINT32 *TranslationTable,\r
23 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryRegion\r
24 )\r
25{\r
26 UINT32 *Entry;\r
27 UINTN Sections;\r
28 UINTN Index;\r
29 UINT32 Attributes;\r
30 UINT32 PhysicalBase = MemoryRegion->PhysicalBase;\r
31 \r
32 switch (MemoryRegion->Attributes) {\r
33 case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK:\r
34 Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(0);\r
35 break;\r
36 case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:\r
37 Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH(0);\r
38 break;\r
39 case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED:\r
40 Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(0);\r
41 break;\r
42 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK:\r
43 Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(1);\r
44 break;\r
45 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH:\r
46 Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH(1);\r
47 break;\r
48 case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED:\r
49 Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(1);\r
50 break;\r
51 default:\r
52 Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(0);\r
53 break;\r
54 }\r
55 \r
56 Entry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase);\r
57 Sections = ((( MemoryRegion->Length - 1 ) / TT_DESCRIPTOR_SECTION_SIZE ) + 1 );\r
58 \r
59 for (Index = 0; Index < Sections; Index++)\r
60 {\r
61 *Entry++ = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase) | Attributes;\r
62 PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE;\r
63 }\r
64}\r
65\r
66VOID\r
67EFIAPI\r
68ArmConfigureMmu (\r
69 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable,\r
70 OUT VOID **TranslationTableBase OPTIONAL,\r
71 OUT UINTN *TranslationTableSize OPTIONAL\r
72 )\r
73{\r
74 VOID *TranslationTable;\r
75\r
76 // Allocate pages for translation table.\r
77 TranslationTable = AllocatePages(EFI_SIZE_TO_PAGES(TRANSLATION_TABLE_SIZE + TRANSLATION_TABLE_ALIGNMENT));\r
78 TranslationTable = (VOID *)(((UINTN)TranslationTable + TRANSLATION_TABLE_ALIGNMENT_MASK) & ~TRANSLATION_TABLE_ALIGNMENT_MASK);\r
79\r
80 if (TranslationTableBase != NULL) {\r
81 *TranslationTableBase = TranslationTable;\r
82 }\r
83 \r
84 if (TranslationTableBase != NULL) {\r
85 *TranslationTableSize = TRANSLATION_TABLE_SIZE;\r
86 }\r
87\r
88 ZeroMem(TranslationTable, TRANSLATION_TABLE_SIZE);\r
89\r
90 ArmCleanInvalidateDataCache();\r
91 ArmInvalidateInstructionCache();\r
92 ArmInvalidateTlb();\r
93\r
94 ArmDisableDataCache();\r
95 ArmDisableInstructionCache();\r
96 ArmDisableMmu();\r
97\r
98 // Make sure nothing sneaked into the cache\r
99 ArmCleanInvalidateDataCache();\r
100 ArmInvalidateInstructionCache();\r
101\r
102 while (MemoryTable->Length != 0) {\r
103 FillTranslationTable(TranslationTable, MemoryTable);\r
104 MemoryTable++;\r
105 }\r
106\r
107 ArmSetTTBR0(TranslationTable);\r
108 \r
109 ArmSetDomainAccessControl(DOMAIN_ACCESS_CONTROL_NONE(15) |\r
110 DOMAIN_ACCESS_CONTROL_NONE(14) |\r
111 DOMAIN_ACCESS_CONTROL_NONE(13) |\r
112 DOMAIN_ACCESS_CONTROL_NONE(12) |\r
113 DOMAIN_ACCESS_CONTROL_NONE(11) |\r
114 DOMAIN_ACCESS_CONTROL_NONE(10) |\r
115 DOMAIN_ACCESS_CONTROL_NONE( 9) |\r
116 DOMAIN_ACCESS_CONTROL_NONE( 8) |\r
117 DOMAIN_ACCESS_CONTROL_NONE( 7) |\r
118 DOMAIN_ACCESS_CONTROL_NONE( 6) |\r
119 DOMAIN_ACCESS_CONTROL_NONE( 5) |\r
120 DOMAIN_ACCESS_CONTROL_NONE( 4) |\r
121 DOMAIN_ACCESS_CONTROL_NONE( 3) |\r
122 DOMAIN_ACCESS_CONTROL_NONE( 2) |\r
123 DOMAIN_ACCESS_CONTROL_NONE( 1) |\r
124 DOMAIN_ACCESS_CONTROL_MANAGER(0));\r
125 \r
126 ArmEnableInstructionCache();\r
127 ArmEnableDataCache();\r
128 ArmEnableMmu(); \r
129}\r
130\r
131\r
132\r
133\r