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
9 /* INCLUDES *******************************************************************/
12 #include <internal/arm/intrin_i.h>
14 /* GLOBALS ********************************************************************/
16 PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock
;
17 ULONG gDiskReadBuffer
, gFileSysBuffer
;
18 BOOLEAN ArmHwDetectRan
;
19 PCONFIGURATION_COMPONENT_DATA RootNode
;
21 BOOLEAN AcpiPresent
= FALSE
;
23 ULONG FirstLevelDcacheSize
;
24 ULONG FirstLevelDcacheFillSize
;
25 ULONG FirstLevelIcacheSize
;
26 ULONG FirstLevelIcacheFillSize
;
27 ULONG SecondLevelDcacheSize
;
28 ULONG SecondLevelDcacheFillSize
;
29 ULONG SecondLevelIcacheSize
;
30 ULONG SecondLevelIcacheFillSize
;
32 extern ULONG reactos_disk_count
;
33 extern ARC_DISK_SIGNATURE reactos_arc_disk_info
[];
34 extern CHAR reactos_arc_strings
[32][256];
52 4 // 4-way associative
59 8 // 8 words per line (32 bytes)
62 /* FUNCTIONS ******************************************************************/
64 VOID
DiskStopFloppyMotor(VOID
)
69 FrLdrCheckCpuCompatibility(VOID
)
75 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext
)
77 /* Remember the pointer */
78 ArmBoardBlock
= BootContext
;
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
);
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
));
90 /* Call FreeLDR's portable entrypoint with our command-line */
91 BootMain(ArmBoardBlock
->CommandLine
);
95 ArmPrepareForReactOS(IN BOOLEAN Setup
)
101 ArmDiskGetBootPath(OUT PCHAR BootPath
,
104 PCCH Path
= "ramdisk(0)";
106 /* Make sure enough space exists */
107 if (Size
< sizeof(Path
)) return FALSE
;
109 /* On ARM platforms, the loader is always in RAM */
110 strcpy(BootPath
, Path
);
114 PCONFIGURATION_COMPONENT_DATA
117 ARM_CACHE_REGISTER CacheReg
;
119 /* Create the root node */
120 if (ArmHwDetectRan
++) return RootNode
;
121 FldrCreateSystemKey(&RootNode
);
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.
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;
143 /* Register RAMDISK Device */
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);
155 /* Return the root node */
160 ArmInitializeBootDevices(VOID
)
162 /* Emulate old behavior */
163 return (ArmHwDetect() != NULL
);
166 FREELDR_MEMORY_DESCRIPTOR ArmMemoryMap
[32];
168 PFREELDR_MEMORY_DESCRIPTOR
169 ArmMemGetMemoryMap(OUT ULONG
*MemoryMapSize
)
172 ASSERT(ArmBoardBlock
->MemoryMapEntryCount
<= 32);
174 /* Return whatever the board returned to us (CS0 Base + Size and FLASH0) */
175 for (i
= 0; i
< ArmBoardBlock
->MemoryMapEntryCount
; i
++)
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
;
182 ArmMemoryMap
[i
].MemoryType
= MemoryFirmwarePermanent
;
185 *MemoryMapSize
= ArmBoardBlock
->MemoryMapEntryCount
;
198 MachInit(IN PCCH CommandLine
)
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
;
210 /* Setup board-specific ARM routines */
211 switch (ArmBoardBlock
->BoardType
)
213 /* Check for Feroceon-base boards */
214 case MACH_TYPE_FEROCEON
:
215 TuiPrintf("Not implemented\n");
219 /* Check for TI OMAP3 ZOOM-II MDK */
220 case MACH_TYPE_OMAP_ZOOM2
:
222 /* Setup the disk and file system buffers */
223 gDiskReadBuffer
= 0x81094000;
224 gFileSysBuffer
= 0x81094000;
227 /* Check for ARM Versatile PB boards */
228 case MACH_TYPE_VERSATILE_PB
:
230 /* Setup the disk and file system buffers */
231 gDiskReadBuffer
= 0x00090000;
232 gFileSysBuffer
= 0x00090000;
235 /* Check for TI OMAP3 Beagleboard */
236 case MACH_TYPE_OMAP3_BEAGLE
:
237 TuiPrintf("Not implemented\n");
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
;