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 PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock
;
16 ULONG BootDrive
, BootPartition
;
17 VOID
ArmPrepareForReactOS(IN BOOLEAN Setup
);
18 ADDRESS_RANGE ArmBoardMemoryMap
[16];
19 ULONG ArmBoardMemoryMapRangeCount
;
21 /* FUNCTIONS ******************************************************************/
24 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext
)
29 // Remember the pointer
31 ArmBoardBlock
= BootContext
;
34 // Let's make sure we understand the boot-loader
36 ASSERT(ArmBoardBlock
->MajorVersion
== ARM_BOARD_CONFIGURATION_MAJOR_VERSION
);
37 ASSERT(ArmBoardBlock
->MinorVersion
== ARM_BOARD_CONFIGURATION_MINOR_VERSION
);
40 // This should probably go away once we support more boards
42 ASSERT((ArmBoardBlock
->BoardType
== MACH_TYPE_FEROCEON
) ||
43 (ArmBoardBlock
->BoardType
== MACH_TYPE_VERSATILE_PB
));
46 // Save data required for memory initialization
48 ArmBoardMemoryMapRangeCount
= ArmBoardBlock
->MemoryMapEntryCount
;
49 ASSERT(ArmBoardMemoryMapRangeCount
!= 0);
50 ASSERT(ArmBoardMemoryMapRangeCount
< 16);
51 for (i
= 0; i
< ArmBoardMemoryMapRangeCount
; i
++)
56 RtlCopyMemory(&ArmBoardMemoryMap
[i
],
57 &ArmBoardBlock
->MemoryMap
[i
],
58 sizeof(ADDRESS_RANGE
));
62 // Call FreeLDR's portable entrypoint with our command-line
64 BootMain(ArmBoardBlock
->CommandLine
);
68 ArmDiskGetDriveGeometry(IN ULONG DriveNumber
,
69 OUT PGEOMETRY Geometry
)
71 ASSERT(gRamDiskBase
== NULL
);
76 ArmDiskReadLogicalSectors(IN ULONG DriveNumber
,
77 IN ULONGLONG SectorNumber
,
81 ASSERT(gRamDiskBase
== NULL
);
86 ArmDiskGetCacheableBlockCount(IN ULONG DriveNumber
)
88 ASSERT(gRamDiskBase
== NULL
);
92 PCONFIGURATION_COMPONENT_DATA
95 PCONFIGURATION_COMPONENT_DATA RootNode
;
98 // Create the root node
100 FldrCreateSystemKey(&RootNode
);
103 // Write null component information
105 FldrSetComponentInformation(RootNode
,
112 // There's no such thing as "PnP" on embedded hardware.
113 // The boot loader will send us a device tree, similar to ACPI
114 // or OpenFirmware device trees, and we will convert it to ARC.
118 // Return the root node
124 ArmMemGetMemoryMap(OUT PBIOS_MEMORY_MAP BiosMemoryMap
,
125 IN ULONG MaxMemoryMapSize
)
128 // Return whatever the board returned to us (CS0 Base + Size and FLASH0)
130 RtlCopyMemory(BiosMemoryMap
,
131 ArmBoardBlock
->MemoryMap
,
132 ArmBoardBlock
->MemoryMapEntryCount
* sizeof(BIOS_MEMORY_MAP
));
133 return ArmBoardBlock
->MemoryMapEntryCount
;
137 MachInit(IN PCCH CommandLine
)
140 // Setup board-specific ARM routines
142 switch (ArmBoardBlock
->BoardType
)
145 // Check for Feroceon-base boards
147 case MACH_TYPE_FEROCEON
:
150 // These boards use a UART16550. Set us up for 115200 bps
152 ArmFeroSerialInit(115200);
153 MachVtbl
.ConsPutChar
= ArmFeroPutChar
;
154 MachVtbl
.ConsKbHit
= ArmFeroKbHit
;
155 MachVtbl
.ConsGetCh
= ArmFeroGetCh
;
159 // Check for ARM Versatile PB boards
161 case MACH_TYPE_VERSATILE_PB
:
164 // These boards use a PrimeCell UART (PL011)
166 ArmVersaSerialInit(115200);
167 MachVtbl
.ConsPutChar
= ArmVersaPutChar
;
168 MachVtbl
.ConsKbHit
= ArmVersaKbHit
;
169 MachVtbl
.ConsGetCh
= ArmVersaGetCh
;
177 // Setup generic ARM routines for all boards
179 MachVtbl
.PrepareForReactOS
= ArmPrepareForReactOS
;
180 MachVtbl
.GetMemoryMap
= ArmMemGetMemoryMap
;
181 MachVtbl
.HwDetect
= ArmHwDetect
;
184 // Setup disk I/O routines, switch to ramdisk ones for non-NAND boot
186 MachVtbl
.DiskReadLogicalSectors
= ArmDiskReadLogicalSectors
;
187 MachVtbl
.DiskGetDriveGeometry
= ArmDiskGetDriveGeometry
;
188 MachVtbl
.DiskGetCacheableBlockCount
= ArmDiskGetCacheableBlockCount
;
189 RamDiskSwitchFromBios();
192 // Now set default disk handling routines -- we don't need to override
194 MachVtbl
.DiskGetBootVolume
= DiskGetBootVolume
;
195 MachVtbl
.DiskGetSystemVolume
= DiskGetSystemVolume
;
196 MachVtbl
.DiskGetBootPath
= DiskGetBootPath
;
197 MachVtbl
.DiskGetBootDevice
= DiskGetBootDevice
;
198 MachVtbl
.DiskBootingFromFloppy
= DiskBootingFromFloppy
;
199 MachVtbl
.DiskNormalizeSystemPath
= DiskNormalizeSystemPath
;
200 MachVtbl
.DiskGetPartitionEntry
= DiskGetPartitionEntry
;
203 // We can now print to the console
205 TuiPrintf("%s for ARM\n", GetFreeLoaderVersionString());
206 TuiPrintf("Bootargs: %s\n", CommandLine
);