* [edk2-platforms: PATCH v3 1/1] Marvell/Armada7k8k: Implement PMU interrupt handling
@ 2019-04-17 9:31 Marcin Wojtas
2019-04-17 16:07 ` Ard Biesheuvel
0 siblings, 1 reply; 2+ messages in thread
From: Marcin Wojtas @ 2019-04-17 9:31 UTC (permalink / raw)
To: devel
Cc: leif.lindholm, ard.biesheuvel, mw, jsd, jaz, kostap,
jeremy.linton, Jici.Gao
Generic handling of the PMU interrupts in UEFI and Linux with
ACPI require enabling a dedicated handler in the EL3.
Extend the PlatInitDxe with enabler code.
Because for DT world the EL3 service must remain disabled,
switch it off in the ExitBootServicesEvent. Its execution
depends on the gEdkiiPlatformHasAcpiGuid status check in the new
gEfiEventReadyToBootGuid routine.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
Changelog:
v2->v3:
* Invert and add comments in OnReadyToBoot event
* Use ASSERT_EFI_ERROR
* Close OnReadyToBoot event
Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf | 6 ++
Silicon/Marvell/Include/IndustryStandard/MvSmc.h | 2 +
Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c | 88 ++++++++++++++++++++
3 files changed, 96 insertions(+)
diff --git a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf
index e707fe9..df10526 100644
--- a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf
+++ b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf
@@ -25,6 +25,7 @@
PlatInitDxe.c
[Packages]
+ ArmPkg/ArmPkg.dec
EmbeddedPkg/EmbeddedPkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
@@ -32,6 +33,7 @@
[LibraryClasses]
ArmadaIcuLib
+ ArmSmcLib
ComPhyLib
DebugLib
MppLib
@@ -40,6 +42,10 @@
UefiDriverEntryPoint
UtmiPhyLib
+[Guids]
+ gEdkiiPlatformHasAcpiGuid
+ gEfiEventReadyToBootGuid
+
[Protocols]
gMarvellPlatformInitCompleteProtocolGuid ## PRODUCES
diff --git a/Silicon/Marvell/Include/IndustryStandard/MvSmc.h b/Silicon/Marvell/Include/IndustryStandard/MvSmc.h
index 0c90f11..e5c89d9 100644
--- a/Silicon/Marvell/Include/IndustryStandard/MvSmc.h
+++ b/Silicon/Marvell/Include/IndustryStandard/MvSmc.h
@@ -20,5 +20,7 @@
#define MV_SMC_ID_COMPHY_POWER_OFF 0x82000002
#define MV_SMC_ID_COMPHY_PLL_LOCK 0x82000003
#define MV_SMC_ID_DRAM_SIZE 0x82000010
+#define MV_SMC_ID_PMU_IRQ_ENABLE 0x82000012
+#define MV_SMC_ID_PMU_IRQ_DISABLE 0x82000013
#endif //__MV_SMC_H__
diff --git a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c
index 18b6783..30336fe 100644
--- a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c
+++ b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c
@@ -12,7 +12,12 @@
**/
+#include <Guid/EventGroup.h>
+
+#include <IndustryStandard/MvSmc.h>
+
#include <Library/ArmadaIcuLib.h>
+#include <Library/ArmSmcLib.h>
#include <Library/DebugLib.h>
#include <Library/MppLib.h>
#include <Library/MvComPhyLib.h>
@@ -21,6 +26,72 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UtmiPhyLib.h>
+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);
+
+ return;
+}
+
+/**
+ 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 (
@@ -28,7 +99,9 @@ ArmadaPlatInitDxeEntryPoint (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
+ ARM_SMC_ARGS SmcRegs = {0};
EFI_STATUS Status;
+ EFI_EVENT Event;
DEBUG ((DEBUG_ERROR, "\nArmada Platform Init\n\n"));
@@ -43,5 +116,20 @@ ArmadaPlatInitDxeEntryPoint (
MppInitialize ();
ArmadaIcuInitialize ();
+ /*
+ * 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;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [edk2-platforms: PATCH v3 1/1] Marvell/Armada7k8k: Implement PMU interrupt handling
2019-04-17 9:31 [edk2-platforms: PATCH v3 1/1] Marvell/Armada7k8k: Implement PMU interrupt handling Marcin Wojtas
@ 2019-04-17 16:07 ` Ard Biesheuvel
0 siblings, 0 replies; 2+ messages in thread
From: Ard Biesheuvel @ 2019-04-17 16:07 UTC (permalink / raw)
To: Marcin Wojtas
Cc: edk2-devel-groups-io, Leif Lindholm, Jan Dąbroś,
Grzegorz Jaszczyk, Kostya Porotchkin, Jeremy Linton, Jici Gao
On Wed, 17 Apr 2019 at 02:32, Marcin Wojtas <mw@semihalf.com> wrote:
>
> Generic handling of the PMU interrupts in UEFI and Linux with
> ACPI require enabling a dedicated handler in the EL3.
> Extend the PlatInitDxe with enabler code.
>
> Because for DT world the EL3 service must remain disabled,
> switch it off in the ExitBootServicesEvent. Its execution
> depends on the gEdkiiPlatformHasAcpiGuid status check in the new
> gEfiEventReadyToBootGuid routine.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Marcin Wojtas <mw@semihalf.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Pushed as df2ad607e1be..af08f2f4d4a3
> ---
> Changelog:
> v2->v3:
> * Invert and add comments in OnReadyToBoot event
> * Use ASSERT_EFI_ERROR
> * Close OnReadyToBoot event
>
> Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf | 6 ++
> Silicon/Marvell/Include/IndustryStandard/MvSmc.h | 2 +
> Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c | 88 ++++++++++++++++++++
> 3 files changed, 96 insertions(+)
>
> diff --git a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf
> index e707fe9..df10526 100644
> --- a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf
> +++ b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.inf
> @@ -25,6 +25,7 @@
> PlatInitDxe.c
>
> [Packages]
> + ArmPkg/ArmPkg.dec
> EmbeddedPkg/EmbeddedPkg.dec
> MdeModulePkg/MdeModulePkg.dec
> MdePkg/MdePkg.dec
> @@ -32,6 +33,7 @@
>
> [LibraryClasses]
> ArmadaIcuLib
> + ArmSmcLib
> ComPhyLib
> DebugLib
> MppLib
> @@ -40,6 +42,10 @@
> UefiDriverEntryPoint
> UtmiPhyLib
>
> +[Guids]
> + gEdkiiPlatformHasAcpiGuid
> + gEfiEventReadyToBootGuid
> +
> [Protocols]
> gMarvellPlatformInitCompleteProtocolGuid ## PRODUCES
>
> diff --git a/Silicon/Marvell/Include/IndustryStandard/MvSmc.h b/Silicon/Marvell/Include/IndustryStandard/MvSmc.h
> index 0c90f11..e5c89d9 100644
> --- a/Silicon/Marvell/Include/IndustryStandard/MvSmc.h
> +++ b/Silicon/Marvell/Include/IndustryStandard/MvSmc.h
> @@ -20,5 +20,7 @@
> #define MV_SMC_ID_COMPHY_POWER_OFF 0x82000002
> #define MV_SMC_ID_COMPHY_PLL_LOCK 0x82000003
> #define MV_SMC_ID_DRAM_SIZE 0x82000010
> +#define MV_SMC_ID_PMU_IRQ_ENABLE 0x82000012
> +#define MV_SMC_ID_PMU_IRQ_DISABLE 0x82000013
>
> #endif //__MV_SMC_H__
> diff --git a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c
> index 18b6783..30336fe 100644
> --- a/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c
> +++ b/Silicon/Marvell/Armada7k8k/Drivers/PlatInitDxe/PlatInitDxe.c
> @@ -12,7 +12,12 @@
>
> **/
>
> +#include <Guid/EventGroup.h>
> +
> +#include <IndustryStandard/MvSmc.h>
> +
> #include <Library/ArmadaIcuLib.h>
> +#include <Library/ArmSmcLib.h>
> #include <Library/DebugLib.h>
> #include <Library/MppLib.h>
> #include <Library/MvComPhyLib.h>
> @@ -21,6 +26,72 @@
> #include <Library/UefiBootServicesTableLib.h>
> #include <Library/UtmiPhyLib.h>
>
> +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);
> +
> + return;
> +}
> +
> +/**
> + 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 (
> @@ -28,7 +99,9 @@ ArmadaPlatInitDxeEntryPoint (
> IN EFI_SYSTEM_TABLE *SystemTable
> )
> {
> + ARM_SMC_ARGS SmcRegs = {0};
> EFI_STATUS Status;
> + EFI_EVENT Event;
>
> DEBUG ((DEBUG_ERROR, "\nArmada Platform Init\n\n"));
>
> @@ -43,5 +116,20 @@ ArmadaPlatInitDxeEntryPoint (
> MppInitialize ();
> ArmadaIcuInitialize ();
>
> + /*
> + * 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;
> }
> --
> 2.7.4
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-04-17 16:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-04-17 9:31 [edk2-platforms: PATCH v3 1/1] Marvell/Armada7k8k: Implement PMU interrupt handling Marcin Wojtas
2019-04-17 16:07 ` Ard Biesheuvel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox