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