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
9 /* INCLUDES *******************************************************************/
13 /* GLOBALS ********************************************************************/
15 UCHAR BootStack
[0x4000];
16 PUCHAR BootStackEnd
= &BootStack
[0x3FFF];
17 PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock
;
18 ULONG BootDrive
, BootPartition
;
19 VOID
ArmPrepareForReactOS(IN BOOLEAN Setup
);
20 ADDRESS_RANGE ArmBoardMemoryMap
[16];
21 ULONG ArmBoardMemoryMapRangeCount
;
23 /* FUNCTIONS ******************************************************************/
26 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext
)
31 // Remember the pointer
33 ArmBoardBlock
= BootContext
;
36 // Let's make sure we understand the boot-loader
38 ASSERT(ArmBoardBlock
->MajorVersion
== ARM_BOARD_CONFIGURATION_MAJOR_VERSION
);
39 ASSERT(ArmBoardBlock
->MinorVersion
== ARM_BOARD_CONFIGURATION_MINOR_VERSION
);
42 // This should probably go away once we support more boards
44 ASSERT((ArmBoardBlock
->BoardType
== MACH_TYPE_FEROCEON
) ||
45 (ArmBoardBlock
->BoardType
== MACH_TYPE_VERSATILE_PB
) ||
46 (ArmBoardBlock
->BoardType
== MACH_TYPE_OMAP3_BEAGLE
));
49 // Save data required for memory initialization
51 ArmBoardMemoryMapRangeCount
= ArmBoardBlock
->MemoryMapEntryCount
;
52 ASSERT(ArmBoardMemoryMapRangeCount
!= 0);
53 ASSERT(ArmBoardMemoryMapRangeCount
< 16);
54 for (i
= 0; i
< ArmBoardMemoryMapRangeCount
; i
++)
59 RtlCopyMemory(&ArmBoardMemoryMap
[i
],
60 &ArmBoardBlock
->MemoryMap
[i
],
61 sizeof(ADDRESS_RANGE
));
65 // Call FreeLDR's portable entrypoint with our command-line
67 BootMain(ArmBoardBlock
->CommandLine
);
71 ArmDiskGetDriveGeometry(IN ULONG DriveNumber
,
72 OUT PGEOMETRY Geometry
)
74 ASSERT(gRamDiskBase
== NULL
);
79 ArmDiskReadLogicalSectors(IN ULONG DriveNumber
,
80 IN ULONGLONG SectorNumber
,
84 ASSERT(gRamDiskBase
== NULL
);
89 ArmDiskGetCacheableBlockCount(IN ULONG DriveNumber
)
91 ASSERT(gRamDiskBase
== NULL
);
95 PCONFIGURATION_COMPONENT_DATA
98 PCONFIGURATION_COMPONENT_DATA RootNode
;
101 // Create the root node
103 FldrCreateSystemKey(&RootNode
);
107 // There's no such thing as "PnP" on embedded hardware.
108 // The boot loader will send us a device tree, similar to ACPI
109 // or OpenFirmware device trees, and we will convert it to ARC.
113 // Return the root node
119 ArmMemGetMemoryMap(OUT PBIOS_MEMORY_MAP BiosMemoryMap
,
120 IN ULONG MaxMemoryMapSize
)
123 // Return whatever the board returned to us (CS0 Base + Size and FLASH0)
125 RtlCopyMemory(BiosMemoryMap
,
126 ArmBoardBlock
->MemoryMap
,
127 ArmBoardBlock
->MemoryMapEntryCount
* sizeof(BIOS_MEMORY_MAP
));
128 return ArmBoardBlock
->MemoryMapEntryCount
;
132 MachInit(IN PCCH CommandLine
)
135 // Setup board-specific ARM routines
137 switch (ArmBoardBlock
->BoardType
)
140 // Check for Feroceon-base boards
142 case MACH_TYPE_FEROCEON
:
145 // These boards use a UART16550. Set us up for 115200 bps
147 ArmFeroSerialInit(115200);
148 MachVtbl
.ConsPutChar
= ArmFeroPutChar
;
149 MachVtbl
.ConsKbHit
= ArmFeroKbHit
;
150 MachVtbl
.ConsGetCh
= ArmFeroGetCh
;
154 // Check for ARM Versatile PB boards
156 case MACH_TYPE_VERSATILE_PB
:
159 // These boards use a PrimeCell UART (PL011)
161 ArmVersaSerialInit(115200);
162 MachVtbl
.ConsPutChar
= ArmVersaPutChar
;
163 MachVtbl
.ConsKbHit
= ArmVersaKbHit
;
164 MachVtbl
.ConsGetCh
= ArmVersaGetCh
;
168 // Check for TI OMAP3 boards
169 // For now that means only Beagle, but ZOOM and others should be ok too
171 case MACH_TYPE_OMAP3_BEAGLE
:
174 // These boards use a UART16550
176 ArmOmap3SerialInit(115200);
177 MachVtbl
.ConsPutChar
= ArmOmap3PutChar
;
178 MachVtbl
.ConsKbHit
= ArmOmap3KbHit
;
179 MachVtbl
.ConsGetCh
= ArmOmap3GetCh
;
187 // Setup generic ARM routines for all boards
189 MachVtbl
.PrepareForReactOS
= ArmPrepareForReactOS
;
190 MachVtbl
.GetMemoryMap
= ArmMemGetMemoryMap
;
191 MachVtbl
.HwDetect
= ArmHwDetect
;
194 // Setup disk I/O routines, switch to ramdisk ones for non-NAND boot
196 MachVtbl
.DiskReadLogicalSectors
= ArmDiskReadLogicalSectors
;
197 MachVtbl
.DiskGetDriveGeometry
= ArmDiskGetDriveGeometry
;
198 MachVtbl
.DiskGetCacheableBlockCount
= ArmDiskGetCacheableBlockCount
;
199 RamDiskSwitchFromBios();
202 // Now set default disk handling routines -- we don't need to override
204 MachVtbl
.DiskGetBootPath
= DiskGetBootPath
;
205 MachVtbl
.DiskGetBootDevice
= DiskGetBootDevice
;
206 MachVtbl
.DiskBootingFromFloppy
= DiskBootingFromFloppy
;
207 MachVtbl
.DiskNormalizeSystemPath
= DiskNormalizeSystemPath
;
208 MachVtbl
.DiskGetPartitionEntry
= DiskGetPartitionEntry
;
211 // We can now print to the console
213 TuiPrintf("%s for ARM\n", GetFreeLoaderVersionString());
214 TuiPrintf("Bootargs: %s\n", CommandLine
);