]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c
ArmPlatformPkg/ArmJunoPkg: Added ACPI support
[mirror_edk2.git] / ArmPlatformPkg / ArmJunoPkg / Drivers / ArmJunoDxe / ArmJunoDxe.c
1 /** @file
2 *
3 * Copyright (c) 2013-2014, ARM Limited. All rights reserved.
4 *
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution. The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
9 *
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 *
13 **/
14
15 #include "ArmJunoDxeInternal.h"
16 #include <Library/ArmShellCmdLib.h>
17
18 // This GUID must match the FILE_GUID in ArmPlatformPkg/ArmJunoPkg/AcpiTables/AcpiTables.inf
19 STATIC CONST EFI_GUID mJunoAcpiTableFile = { 0xa1dd808e, 0x1e95, 0x4399, { 0xab, 0xc0, 0x65, 0x3c, 0x82, 0xe8, 0x53, 0x0c } };
20
21 EFI_STATUS
22 EFIAPI
23 ArmJunoEntryPoint (
24 IN EFI_HANDLE ImageHandle,
25 IN EFI_SYSTEM_TABLE *SystemTable
26 )
27 {
28 EFI_STATUS Status;
29 EFI_PHYSICAL_ADDRESS HypBase;
30
31 Status = PciEmulationEntryPoint ();
32 if (EFI_ERROR (Status)) {
33 return Status;
34 }
35
36 //
37 // If a hypervisor has been declared then we need to make sure its region is protected at runtime
38 //
39 // Note: This code is only a workaround for our dummy hypervisor (ArmPkg/Extra/AArch64ToAArch32Shim/)
40 // that does not set up (yet) the stage 2 translation table to hide its own memory to EL1.
41 //
42 if (FixedPcdGet32 (PcdHypFvSize) != 0) {
43 // Ensure the hypervisor region is strictly contained into a EFI_PAGE_SIZE-aligned region.
44 // The memory must be a multiple of EFI_PAGE_SIZE to ensure we do not reserve more memory than the hypervisor itself.
45 // A UEFI Runtime region size granularity cannot be smaller than EFI_PAGE_SIZE. If the hypervisor size is not rounded
46 // to this size then there is a risk some non-runtime memory could be visible to the OS view.
47 if (((FixedPcdGet32 (PcdHypFvSize) & EFI_PAGE_MASK) == 0) && ((FixedPcdGet32 (PcdHypFvBaseAddress) & EFI_PAGE_MASK) == 0)) {
48 // The memory needs to be declared because the DXE core marked it as reserved and removed it from the memory space
49 // as it contains the Firmware.
50 Status = gDS->AddMemorySpace (
51 EfiGcdMemoryTypeSystemMemory,
52 FixedPcdGet32 (PcdHypFvBaseAddress), FixedPcdGet32 (PcdHypFvSize),
53 EFI_MEMORY_WB | EFI_MEMORY_RUNTIME
54 );
55 if (!EFI_ERROR (Status)) {
56 // We allocate the memory to ensure it is marked as runtime memory
57 HypBase = FixedPcdGet32 (PcdHypFvBaseAddress);
58 Status = gBS->AllocatePages (AllocateAddress, EfiRuntimeServicesCode,
59 EFI_SIZE_TO_PAGES (FixedPcdGet32 (PcdHypFvSize)), &HypBase);
60 }
61 } else {
62 // The hypervisor must be contained into a EFI_PAGE_SIZE-aligned region and its size must also be aligned
63 // on a EFI_PAGE_SIZE boundary (ie: 4KB).
64 Status = EFI_UNSUPPORTED;
65 ASSERT_EFI_ERROR (Status);
66 }
67
68 if (EFI_ERROR (Status)) {
69 return Status;
70 }
71 }
72
73 // Install dynamic Shell command to run baremetal binaries.
74 Status = ShellDynCmdRunAxfInstall (ImageHandle);
75 if (EFI_ERROR (Status)) {
76 DEBUG ((EFI_D_ERROR, "ArmJunoDxe: Failed to install ShellDynCmdRunAxf\n"));
77 }
78
79 // Try to install the ACPI Tables
80 Status = LocateAndInstallAcpiFromFv (&mJunoAcpiTableFile);
81 if (EFI_ERROR (Status)) {
82 return Status;
83 }
84
85 // Try to install the Flat Device Tree (FDT). This function actually installs the
86 // UEFI Driver Binding Protocol.
87 Status = JunoFdtInstall (ImageHandle);
88
89 return Status;
90 }