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