[BOOT] Spelling fixes by Josh Soref. CORE-12286
[reactos.git] / reactos / boot / freeldr / freeldr / arch / arm / macharm.c
1 /*
2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: boot/freeldr/freeldr/arch/arm/macharm.c
5 * PURPOSE: Provides abstraction between the ARM Boot Loader and FreeLDR
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <freeldr.h>
12 #include <internal/arm/intrin_i.h>
13
14 /* GLOBALS ********************************************************************/
15
16 PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock;
17 ULONG gDiskReadBuffer, gFileSysBuffer;
18 BOOLEAN ArmHwDetectRan;
19 PCONFIGURATION_COMPONENT_DATA RootNode;
20
21 BOOLEAN AcpiPresent = FALSE;
22
23 ULONG FirstLevelDcacheSize;
24 ULONG FirstLevelDcacheFillSize;
25 ULONG FirstLevelIcacheSize;
26 ULONG FirstLevelIcacheFillSize;
27 ULONG SecondLevelDcacheSize;
28 ULONG SecondLevelDcacheFillSize;
29 ULONG SecondLevelIcacheSize;
30 ULONG SecondLevelIcacheFillSize;
31
32 extern ULONG reactos_disk_count;
33 extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
34 extern CHAR reactos_arc_strings[32][256];
35
36 ULONG SizeBits[] =
37 {
38 -1, // INVALID
39 -1, // INVALID
40 1 << 12, // 4KB
41 1 << 13, // 8KB
42 1 << 14, // 16KB
43 1 << 15, // 32KB
44 1 << 16, // 64KB
45 1 << 17 // 128KB
46 };
47
48 ULONG AssocBits[] =
49 {
50 -1, // INVALID
51 -1, // INVALID
52 4 // 4-way associative
53 };
54
55 ULONG LenBits[] =
56 {
57 -1, // INVALID
58 -1, // INVALID
59 8 // 8 words per line (32 bytes)
60 };
61
62 /* FUNCTIONS ******************************************************************/
63
64 VOID DiskStopFloppyMotor(VOID)
65 {
66 }
67
68 VOID
69 FrLdrCheckCpuCompatibility(VOID)
70 {
71 /* Nothing for now */
72 }
73
74 VOID
75 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext)
76 {
77 /* Remember the pointer */
78 ArmBoardBlock = BootContext;
79
80 /* Let's make sure we understand the LLB */
81 ASSERT(ArmBoardBlock->MajorVersion == ARM_BOARD_CONFIGURATION_MAJOR_VERSION);
82 ASSERT(ArmBoardBlock->MinorVersion == ARM_BOARD_CONFIGURATION_MINOR_VERSION);
83
84 /* This should probably go away once we support more boards */
85 ASSERT((ArmBoardBlock->BoardType == MACH_TYPE_FEROCEON) ||
86 (ArmBoardBlock->BoardType == MACH_TYPE_VERSATILE_PB) ||
87 (ArmBoardBlock->BoardType == MACH_TYPE_OMAP3_BEAGLE) ||
88 (ArmBoardBlock->BoardType == MACH_TYPE_OMAP_ZOOM2));
89
90 /* Call FreeLDR's portable entrypoint with our command-line */
91 BootMain(ArmBoardBlock->CommandLine);
92 }
93
94 VOID
95 ArmPrepareForReactOS(IN BOOLEAN Setup)
96 {
97 return;
98 }
99
100 BOOLEAN
101 ArmDiskGetBootPath(OUT PCHAR BootPath,
102 IN unsigned Size)
103 {
104 PCCH Path = "ramdisk(0)";
105
106 /* Make sure enough space exists */
107 if (Size < sizeof(Path)) return FALSE;
108
109 /* On ARM platforms, the loader is always in RAM */
110 strcpy(BootPath, Path);
111 return TRUE;
112 }
113
114 PCONFIGURATION_COMPONENT_DATA
115 ArmHwDetect(VOID)
116 {
117 ARM_CACHE_REGISTER CacheReg;
118
119 /* Create the root node */
120 if (ArmHwDetectRan++) return RootNode;
121 FldrCreateSystemKey(&RootNode);
122
123 /*
124 * TODO:
125 * There's no such thing as "PnP" on embedded hardware.
126 * The boot loader will send us a device tree, similar to ACPI
127 * or OpenFirmware device trees, and we will convert it to ARC.
128 */
129
130 /* Get cache information */
131 CacheReg = KeArmCacheRegisterGet();
132 FirstLevelDcacheSize = SizeBits[CacheReg.DSize];
133 FirstLevelDcacheFillSize = LenBits[CacheReg.DLength];
134 FirstLevelDcacheFillSize <<= 2;
135 FirstLevelIcacheSize = SizeBits[CacheReg.ISize];
136 FirstLevelIcacheFillSize = LenBits[CacheReg.ILength];
137 FirstLevelIcacheFillSize <<= 2;
138 SecondLevelDcacheSize =
139 SecondLevelDcacheFillSize =
140 SecondLevelIcacheSize =
141 SecondLevelIcacheFillSize = 0;
142
143 /* Register RAMDISK Device */
144 RamDiskInitialize();
145
146 /* Fill out the ARC disk block */
147 reactos_arc_disk_info[reactos_disk_count].Signature = 0xBADAB00F;
148 reactos_arc_disk_info[reactos_disk_count].CheckSum = 0xDEADBABE;
149 strcpy(reactos_arc_strings[reactos_disk_count], "ramdisk(0)");
150 reactos_arc_disk_info[reactos_disk_count].ArcName =
151 reactos_arc_strings[reactos_disk_count];
152 reactos_disk_count++;
153 ASSERT(reactos_disk_count == 1);
154
155 /* Return the root node */
156 return RootNode;
157 }
158
159 BOOLEAN
160 ArmInitializeBootDevices(VOID)
161 {
162 /* Emulate old behavior */
163 return (ArmHwDetect() != NULL);
164 }
165
166 FREELDR_MEMORY_DESCRIPTOR ArmMemoryMap[32];
167
168 PFREELDR_MEMORY_DESCRIPTOR
169 ArmMemGetMemoryMap(OUT ULONG *MemoryMapSize)
170 {
171 ULONG i;
172 ASSERT(ArmBoardBlock->MemoryMapEntryCount <= 32);
173
174 /* Return whatever the board returned to us (CS0 Base + Size and FLASH0) */
175 for (i = 0; i < ArmBoardBlock->MemoryMapEntryCount; i++)
176 {
177 ArmMemoryMap[i].BasePage = ArmBoardBlock->MemoryMap[i].BaseAddress / PAGE_SIZE;
178 ArmMemoryMap[i].PageCount = ArmBoardBlock->MemoryMap[i].Length / PAGE_SIZE;
179 if (ArmBoardBlock->MemoryMap[i].Type == BiosMemoryUsable)
180 ArmMemoryMap[i].MemoryType = MemoryFree;
181 else
182 ArmMemoryMap[i].MemoryType = MemoryFirmwarePermanent;
183 }
184
185 *MemoryMapSize = ArmBoardBlock->MemoryMapEntryCount;
186
187 // FIXME
188 return NULL;
189 }
190
191 VOID
192 ArmHwIdle(VOID)
193 {
194 /* UNIMPLEMENTED */
195 }
196
197 VOID
198 MachInit(IN PCCH CommandLine)
199 {
200 /* Copy Machine Routines from Firmware Table */
201 MachVtbl.ConsPutChar = ArmBoardBlock->ConsPutChar;
202 MachVtbl.ConsKbHit = ArmBoardBlock->ConsKbHit;
203 MachVtbl.ConsGetCh = ArmBoardBlock->ConsGetCh;
204 MachVtbl.VideoClearScreen = ArmBoardBlock->VideoClearScreen;
205 MachVtbl.VideoSetDisplayMode = ArmBoardBlock->VideoSetDisplayMode;
206 MachVtbl.VideoGetDisplaySize = ArmBoardBlock->VideoGetDisplaySize;
207 MachVtbl.VideoPutChar = ArmBoardBlock->VideoPutChar;
208 MachVtbl.GetTime = ArmBoardBlock->GetTime;
209
210 /* Setup board-specific ARM routines */
211 switch (ArmBoardBlock->BoardType)
212 {
213 /* Check for Feroceon-base boards */
214 case MACH_TYPE_FEROCEON:
215 TuiPrintf("Not implemented\n");
216 while (TRUE);
217 break;
218
219 /* Check for TI OMAP3 ZOOM-II MDK */
220 case MACH_TYPE_OMAP_ZOOM2:
221
222 /* Setup the disk and file system buffers */
223 gDiskReadBuffer = 0x81094000;
224 gFileSysBuffer = 0x81094000;
225 break;
226
227 /* Check for ARM Versatile PB boards */
228 case MACH_TYPE_VERSATILE_PB:
229
230 /* Setup the disk and file system buffers */
231 gDiskReadBuffer = 0x00090000;
232 gFileSysBuffer = 0x00090000;
233 break;
234
235 /* Check for TI OMAP3 Beagleboard */
236 case MACH_TYPE_OMAP3_BEAGLE:
237 TuiPrintf("Not implemented\n");
238 while (TRUE);
239 break;
240
241 default:
242 ASSERT(FALSE);
243 }
244
245 /* Setup generic ARM routines for all boards */
246 MachVtbl.PrepareForReactOS = ArmPrepareForReactOS;
247 MachVtbl.GetMemoryMap = ArmMemGetMemoryMap;
248 MachVtbl.InitializeBootDevices = ArmInitializeBootDevices;
249 MachVtbl.HwDetect = ArmHwDetect;
250 MachVtbl.DiskGetBootPath = ArmDiskGetBootPath;
251 MachVtbl.HwIdle = ArmHwIdle;
252 }