/** @file Copyright (c) 2017, Linaro Limited. All rights reserved. Copyright (c) 2017, Marvell International Ltd. and its affiliates SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include STATIC EFI_EVENT mArmada7k8kExitBootServicesEvent; /** Disable extra EL3 handling of the PMU interrupts for DT world. @param[in] Event Event structure @param[in] Context Notification context **/ STATIC VOID EFIAPI Armada7k8kExitBootServicesHandler ( IN EFI_EVENT Event, IN VOID *Context ) { ARM_SMC_ARGS SmcRegs = {0}; SmcRegs.Arg0 = MV_SMC_ID_PMU_IRQ_DISABLE; ArmCallSmc (&SmcRegs); } /** Check if we boot with DT and trigger EBS event in such case. @param[in] Event Event structure @param[in] Context Notification context **/ STATIC VOID EFIAPI Armada7k8kOnReadyToBootHandler ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; VOID *Interface; // Ensure the event will be triggered only once gBS->CloseEvent (Event); Status = gBS->LocateProtocol (&gEdkiiPlatformHasAcpiGuid, NULL, (VOID **)&Interface); if (!EFI_ERROR (Status)) { /* ACPI is enabled, so leave the current settings intact. */ return; } // // In case DT is selected, create EBS event for disabling // extra EL3 handling of the PMU interrupts in EL3. // Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, Armada7k8kExitBootServicesHandler, NULL, &mArmada7k8kExitBootServicesEvent); ASSERT_EFI_ERROR (Status); } EFI_STATUS EFIAPI ArmadaPlatInitDxeEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { ARM_SMC_ARGS SmcRegs = {0}; EFI_STATUS Status; EFI_EVENT Event; DEBUG ((DEBUG_ERROR, "\n%a %a Init\n\n", (CHAR8 *)PcdGetPtr (PcdProductManufacturer), (CHAR8 *)PcdGetPtr (PcdProductPlatformName))); Status = gBS->InstallProtocolInterface (&ImageHandle, &gMarvellPlatformInitCompleteProtocolGuid, EFI_NATIVE_INTERFACE, NULL); ASSERT_EFI_ERROR (Status); MvComPhyInit (); UtmiPhyInit (); MppInitialize (); ArmadaIcuInitialize (); Status = ArmadaBoardInit (); ASSERT_EFI_ERROR (Status); /* * Enable EL3 PMU interrupt handler and * register the ReadyToBoot event. */ SmcRegs.Arg0 = MV_SMC_ID_PMU_IRQ_ENABLE; ArmCallSmc (&SmcRegs); Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, Armada7k8kOnReadyToBootHandler, NULL, &gEfiEventReadyToBootGuid, &Event); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; }