Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / boot / freeldr / freeldr / arch / arm / macharm.c
diff --git a/boot/freeldr/freeldr/arch/arm/macharm.c b/boot/freeldr/freeldr/arch/arm/macharm.c
new file mode 100644 (file)
index 0000000..8bf927d
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ * PROJECT:         ReactOS Boot Loader
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            boot/freeldr/freeldr/arch/arm/macharm.c
+ * PURPOSE:         Provides abstraction between the ARM Boot Loader and FreeLDR
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <freeldr.h>
+#include <internal/arm/intrin_i.h>
+
+/* GLOBALS ********************************************************************/
+
+PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock;
+ULONG gDiskReadBuffer, gFileSysBuffer;
+BOOLEAN ArmHwDetectRan;
+PCONFIGURATION_COMPONENT_DATA RootNode;
+
+BOOLEAN AcpiPresent = FALSE;
+
+ULONG FirstLevelDcacheSize;
+ULONG FirstLevelDcacheFillSize;
+ULONG FirstLevelIcacheSize;
+ULONG FirstLevelIcacheFillSize;
+ULONG SecondLevelDcacheSize;
+ULONG SecondLevelDcacheFillSize;
+ULONG SecondLevelIcacheSize;
+ULONG SecondLevelIcacheFillSize;
+
+extern ULONG reactos_disk_count;
+extern ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[];
+
+ULONG SizeBits[] =
+{
+    -1,      // INVALID
+    -1,      // INVALID
+    1 << 12, // 4KB
+    1 << 13, // 8KB
+    1 << 14, // 16KB
+    1 << 15, // 32KB
+    1 << 16, // 64KB
+    1 << 17  // 128KB
+};
+
+ULONG AssocBits[] =
+{
+    -1,      // INVALID
+    -1,      // INVALID
+    4        // 4-way associative
+};
+
+ULONG LenBits[] =
+{
+    -1,      // INVALID
+    -1,      // INVALID
+    8        // 8 words per line (32 bytes)
+};
+
+/* FUNCTIONS ******************************************************************/
+
+VOID DiskStopFloppyMotor(VOID)
+{
+}
+
+VOID
+FrLdrCheckCpuCompatibility(VOID)
+{
+    /* Nothing for now */
+}
+
+VOID
+ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext)
+{
+    /* Remember the pointer */
+    ArmBoardBlock = BootContext;
+
+    /* Let's make sure we understand the LLB */
+    ASSERT(ArmBoardBlock->MajorVersion == ARM_BOARD_CONFIGURATION_MAJOR_VERSION);
+    ASSERT(ArmBoardBlock->MinorVersion == ARM_BOARD_CONFIGURATION_MINOR_VERSION);
+
+    /* This should probably go away once we support more boards */
+    ASSERT((ArmBoardBlock->BoardType == MACH_TYPE_FEROCEON) ||
+           (ArmBoardBlock->BoardType == MACH_TYPE_VERSATILE_PB) ||
+           (ArmBoardBlock->BoardType == MACH_TYPE_OMAP3_BEAGLE) ||
+           (ArmBoardBlock->BoardType == MACH_TYPE_OMAP_ZOOM2));
+
+    /* Call FreeLDR's portable entrypoint with our command-line */
+    BootMain(ArmBoardBlock->CommandLine);
+}
+
+VOID
+ArmPrepareForReactOS(IN BOOLEAN Setup)
+{
+    return;
+}
+
+BOOLEAN
+ArmDiskGetBootPath(OUT PCHAR BootPath, IN ULONG Size)
+{
+    PCCH Path = "ramdisk(0)";
+
+    /* Make sure enough space exists */
+    if (Size < sizeof(Path)) return FALSE;
+
+    /* On ARM platforms, the loader is always in RAM */
+    strcpy(BootPath, Path);
+    return TRUE;
+}
+
+PCONFIGURATION_COMPONENT_DATA
+ArmHwDetect(VOID)
+{
+    ARM_CACHE_REGISTER CacheReg;
+
+    /* Create the root node */
+    if (ArmHwDetectRan++) return RootNode;
+    FldrCreateSystemKey(&RootNode);
+
+    /*
+     * TODO:
+     * There's no such thing as "PnP" on embedded hardware.
+     * The boot loader will send us a device tree, similar to ACPI
+     * or OpenFirmware device trees, and we will convert it to ARC.
+     */
+
+    /* Get cache information */
+    CacheReg = KeArmCacheRegisterGet();
+    FirstLevelDcacheSize = SizeBits[CacheReg.DSize];
+    FirstLevelDcacheFillSize = LenBits[CacheReg.DLength];
+    FirstLevelDcacheFillSize <<= 2;
+    FirstLevelIcacheSize = SizeBits[CacheReg.ISize];
+    FirstLevelIcacheFillSize = LenBits[CacheReg.ILength];
+    FirstLevelIcacheFillSize <<= 2;
+    SecondLevelDcacheSize =
+    SecondLevelDcacheFillSize =
+    SecondLevelIcacheSize =
+    SecondLevelIcacheFillSize = 0;
+
+    /* Register RAMDISK Device */
+    RamDiskInitialize();
+
+    /* Fill out the ARC disk block */
+    reactos_arc_disk_info[reactos_disk_count].DiskSignature.Signature = 0xBADAB00F;
+    reactos_arc_disk_info[reactos_disk_count].DiskSignature.CheckSum = 0xDEADBABE;
+    strcpy(reactos_arc_disk_info[reactos_disk_count].ArcName, "ramdisk(0)");
+    reactos_arc_disk_info[reactos_disk_count].DiskSignature.ArcName =
+        reactos_arc_disk_info[reactos_disk_count].ArcName;
+    reactos_disk_count++;
+    ASSERT(reactos_disk_count == 1);
+
+    /* Return the root node */
+    return RootNode;
+}
+
+BOOLEAN
+ArmInitializeBootDevices(VOID)
+{
+    /* Emulate old behavior */
+    return (ArmHwDetect() != NULL);
+}
+
+FREELDR_MEMORY_DESCRIPTOR ArmMemoryMap[32];
+
+PFREELDR_MEMORY_DESCRIPTOR
+ArmMemGetMemoryMap(OUT ULONG *MemoryMapSize)
+{
+    ULONG i;
+    ASSERT(ArmBoardBlock->MemoryMapEntryCount <= 32);
+
+    /* Return whatever the board returned to us (CS0 Base + Size and FLASH0) */
+    for (i = 0; i < ArmBoardBlock->MemoryMapEntryCount; i++)
+    {
+        ArmMemoryMap[i].BasePage = ArmBoardBlock->MemoryMap[i].BaseAddress / PAGE_SIZE;
+        ArmMemoryMap[i].PageCount = ArmBoardBlock->MemoryMap[i].Length / PAGE_SIZE;
+        if (ArmBoardBlock->MemoryMap[i].Type == BiosMemoryUsable)
+            ArmMemoryMap[i].MemoryType = MemoryFree;
+        else
+            ArmMemoryMap[i].MemoryType = MemoryFirmwarePermanent;
+    }
+
+    *MemoryMapSize = ArmBoardBlock->MemoryMapEntryCount;
+
+    // FIXME
+    return NULL;
+}
+
+VOID
+ArmHwIdle(VOID)
+{
+    /* UNIMPLEMENTED */
+}
+
+VOID
+MachInit(IN PCCH CommandLine)
+{
+    /* Copy Machine Routines from Firmware Table */
+    MachVtbl.ConsPutChar = ArmBoardBlock->ConsPutChar;
+    MachVtbl.ConsKbHit = ArmBoardBlock->ConsKbHit;
+    MachVtbl.ConsGetCh = ArmBoardBlock->ConsGetCh;
+    MachVtbl.VideoClearScreen = ArmBoardBlock->VideoClearScreen;
+    MachVtbl.VideoSetDisplayMode = ArmBoardBlock->VideoSetDisplayMode;
+    MachVtbl.VideoGetDisplaySize = ArmBoardBlock->VideoGetDisplaySize;
+    MachVtbl.VideoPutChar = ArmBoardBlock->VideoPutChar;
+    MachVtbl.GetTime = ArmBoardBlock->GetTime;
+
+    /* Setup board-specific ARM routines */
+    switch (ArmBoardBlock->BoardType)
+    {
+        /* Check for Feroceon-base boards */
+        case MACH_TYPE_FEROCEON:
+            TuiPrintf("Not implemented\n");
+            while (TRUE);
+            break;
+
+        /* Check for TI OMAP3 ZOOM-II MDK */
+        case MACH_TYPE_OMAP_ZOOM2:
+
+            /* Setup the disk and file system buffers */
+            gDiskReadBuffer = 0x81094000;
+            gFileSysBuffer = 0x81094000;
+            break;
+
+        /* Check for ARM Versatile PB boards */
+        case MACH_TYPE_VERSATILE_PB:
+
+            /* Setup the disk and file system buffers */
+            gDiskReadBuffer = 0x00090000;
+            gFileSysBuffer = 0x00090000;
+            break;
+
+        /* Check for TI OMAP3 Beagleboard */
+        case MACH_TYPE_OMAP3_BEAGLE:
+            TuiPrintf("Not implemented\n");
+            while (TRUE);
+            break;
+
+        default:
+            ASSERT(FALSE);
+    }
+
+    /* Setup generic ARM routines for all boards */
+    MachVtbl.PrepareForReactOS = ArmPrepareForReactOS;
+    MachVtbl.GetMemoryMap = ArmMemGetMemoryMap;
+    MachVtbl.InitializeBootDevices = ArmInitializeBootDevices;
+    MachVtbl.HwDetect = ArmHwDetect;
+    MachVtbl.DiskGetBootPath = ArmDiskGetBootPath;
+    MachVtbl.HwIdle = ArmHwIdle;
+}