3 Copyright (c) 2008-2009, Apple Inc. All rights reserved.
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include <Chipset/Cortex-A8.h>
16 #include <Library/ArmLib.h>
17 #include <Library/BaseLib.h>
18 #include <Library/BaseMemoryLib.h>
19 #include <Library/MemoryAllocationLib.h>
20 #include "ArmCortexALib.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_DEVICE
:
42 Attributes
= TT_DESCRIPTOR_SECTION_DEVICE
;
44 case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
:
46 Attributes
= TT_DESCRIPTOR_SECTION_UNCACHED
;
50 Entry
= TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable
, MemoryRegion
->VirtualBase
);
51 Sections
= MemoryRegion
->Length
/ TT_DESCRIPTOR_SECTION_SIZE
;
53 for (Index
= 0; Index
< Sections
; Index
++) {
54 *Entry
++ = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase
) | Attributes
;
55 PhysicalBase
+= TT_DESCRIPTOR_SECTION_SIZE
;
62 IN ARM_MEMORY_REGION_DESCRIPTOR
*MemoryTable
,
63 OUT VOID
**TranslationTableBase OPTIONAL
,
64 OUT UINTN
*TranslationTableSize OPTIONAL
67 VOID
*TranslationTable
;
69 // Allocate pages for translation table.
70 TranslationTable
= AllocatePages(EFI_SIZE_TO_PAGES(TRANSLATION_TABLE_SIZE
+ TRANSLATION_TABLE_ALIGNMENT
));
71 TranslationTable
= (VOID
*)(((UINTN
)TranslationTable
+ TRANSLATION_TABLE_ALIGNMENT_MASK
) & ~TRANSLATION_TABLE_ALIGNMENT_MASK
);
73 if (TranslationTableBase
!= NULL
) {
74 *TranslationTableBase
= TranslationTable
;
77 if (TranslationTableBase
!= NULL
) {
78 *TranslationTableSize
= TRANSLATION_TABLE_SIZE
;
81 ZeroMem(TranslationTable
, TRANSLATION_TABLE_SIZE
);
83 ArmCleanInvalidateDataCache();
84 ArmInvalidateInstructionCache();
87 ArmDisableDataCache();
88 ArmDisableInstructionCache();
91 // Make sure nothing sneaked into the cache
92 ArmCleanInvalidateDataCache();
93 ArmInvalidateInstructionCache();
95 while (MemoryTable
->Length
!= 0) {
96 FillTranslationTable(TranslationTable
, MemoryTable
);
100 ArmSetTranslationTableBaseAddress(TranslationTable
);
102 ArmSetDomainAccessControl(DOMAIN_ACCESS_CONTROL_NONE(15) |
103 DOMAIN_ACCESS_CONTROL_NONE(14) |
104 DOMAIN_ACCESS_CONTROL_NONE(13) |
105 DOMAIN_ACCESS_CONTROL_NONE(12) |
106 DOMAIN_ACCESS_CONTROL_NONE(11) |
107 DOMAIN_ACCESS_CONTROL_NONE(10) |
108 DOMAIN_ACCESS_CONTROL_NONE( 9) |
109 DOMAIN_ACCESS_CONTROL_NONE( 8) |
110 DOMAIN_ACCESS_CONTROL_NONE( 7) |
111 DOMAIN_ACCESS_CONTROL_NONE( 6) |
112 DOMAIN_ACCESS_CONTROL_NONE( 5) |
113 DOMAIN_ACCESS_CONTROL_NONE( 4) |
114 DOMAIN_ACCESS_CONTROL_NONE( 3) |
115 DOMAIN_ACCESS_CONTROL_NONE( 2) |
116 DOMAIN_ACCESS_CONTROL_NONE( 1) |
117 DOMAIN_ACCESS_CONTROL_MANAGER(0));
119 ArmEnableInstructionCache();
120 ArmEnableDataCache();
130 return ARM_CACHE_TYPE_WRITE_BACK
;
133 ARM_CACHE_ARCHITECTURE
135 ArmCacheArchitecture (
139 return ARM_CACHE_ARCHITECTURE_SEPARATE
;
144 ArmDataCachePresent (
162 ArmDataCacheAssociativity (
179 ArmDataCacheLineLength (
188 ArmInstructionCachePresent (
197 ArmInstructionCacheSize (
206 ArmInstructionCacheAssociativity (
215 ArmInstructionCacheLineLength (
223 ArmCortexADataCacheOperation (
224 IN ARM_CORTEX_A_CACHE_OPERATION DataCacheOperation
234 UINTN SavedInterruptState
;
236 SetCount
= ArmDataCacheSets();
237 WayCount
= ArmDataCacheAssociativity();
239 // Cortex-A8 Manual, System Control Coprocessor chapter
241 WayShift
= 32 - LowBitSet32 ((UINT32
)WayCount
);
243 SavedInterruptState
= ArmDisableInterrupts();
245 for (Way
= 0; Way
< WayCount
; Way
++) {
246 for (Set
= 0; Set
< SetCount
; Set
++) {
247 // Build the format that the CP15 instruction can understand
248 SetWayFormat
= (Way
<< WayShift
) | (Set
<< SetShift
);
251 (*DataCacheOperation
)(SetWayFormat
);
255 ArmDrainWriteBuffer();
257 if (SavedInterruptState
) {
258 ArmEnableInterrupts();
264 ArmInvalidateDataCache (
268 ArmCortexADataCacheOperation(ArmInvalidateDataCacheEntryBySetWay
);
273 ArmCleanInvalidateDataCache (
277 ArmCortexADataCacheOperation(ArmCleanInvalidateDataCacheEntryBySetWay
);
286 ArmCortexADataCacheOperation(ArmCleanDataCacheEntryBySetWay
);