From 3625c2cdeb5a66b10c23fb6a8bee6b528ff55d8b Mon Sep 17 00:00:00 2001
From: Olivier Martin <olivier.martin@arm.com>
Date: Fri, 27 Sep 2013 18:57:00 +0100
Subject: [PATCH 06/14] ArmPkg/ArmGic: Move the installation and the
 registration of the Interrupt Service to InstallAndRegisterInterruptService()

It will allows to reuse the same code for GICv2 and GICv3 only drivers.

Change-Id: I2f84344a57c741d31928e3e16ef5526528e90fbe
---
 ArmPkg/Drivers/ArmGic/ArmGicCommonDxe.c | 89 +++++++++++++++++++++++++++++++++
 ArmPkg/Drivers/ArmGic/ArmGicDxe.c       | 56 ++-------------------
 ArmPkg/Drivers/ArmGic/ArmGicDxe.h       | 39 +++++++++++++++
 ArmPkg/Drivers/ArmGic/ArmGicDxe.inf     |  1 +
 4 files changed, 132 insertions(+), 53 deletions(-)
 create mode 100644 ArmPkg/Drivers/ArmGic/ArmGicCommonDxe.c
 create mode 100644 ArmPkg/Drivers/ArmGic/ArmGicDxe.h

diff --git a/ArmPkg/Drivers/ArmGic/ArmGicCommonDxe.c b/ArmPkg/Drivers/ArmGic/ArmGicCommonDxe.c
new file mode 100644
index 0000000..a59e3b1
--- /dev/null
+++ b/ArmPkg/Drivers/ArmGic/ArmGicCommonDxe.c
@@ -0,0 +1,89 @@
+/*++
+
+Copyright (c) 2013, ARM Ltd. All rights reserved.<BR>
+
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+--*/
+
+#include "ArmGicDxe.h"
+
+VOID
+EFIAPI
+IrqInterruptHandler (
+  IN EFI_EXCEPTION_TYPE           InterruptType,
+  IN EFI_SYSTEM_CONTEXT           SystemContext
+  );
+
+VOID
+EFIAPI
+ExitBootServicesEvent (
+  IN EFI_EVENT  Event,
+  IN VOID       *Context
+  );
+
+//
+// Making this global saves a few bytes in image size
+//
+EFI_HANDLE  gHardwareInterruptHandle = NULL;
+
+//
+// Notifications
+//
+EFI_EVENT EfiExitBootServicesEvent      = (EFI_EVENT)NULL;
+
+// Maximum Number of Interrupts
+UINTN mGicNumInterrupts                 = 0;
+
+HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers = NULL;
+
+EFI_STATUS
+InstallAndRegisterInterruptService (
+  IN EFI_HARDWARE_INTERRUPT_PROTOCOL   *InterruptProtocol,
+  IN EFI_CPU_INTERRUPT_HANDLER          InterruptHandler,
+  IN EFI_EVENT_NOTIFY                   ExitBootServicesEvent
+  )
+{
+  EFI_STATUS               Status;
+  EFI_CPU_ARCH_PROTOCOL   *Cpu;
+
+  // Initialize the array for the Interrupt Handlers
+  gRegisteredInterruptHandlers = (HARDWARE_INTERRUPT_HANDLER*)AllocateZeroPool (sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
+
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &gHardwareInterruptHandle,
+                  &gHardwareInterruptProtocolGuid, InterruptProtocol,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Get the CPU protocol that this driver requires.
+  //
+  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Unregister the default exception handler.
+  //
+  Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Register to receive interrupts
+  //
+  Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, InterruptHandler);
+  ASSERT_EFI_ERROR (Status);
+
+  // Register for an ExitBootServicesEvent
+  Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
+  ASSERT_EFI_ERROR (Status);
+
+  return EFI_SUCCESS;
+}
diff --git a/ArmPkg/Drivers/ArmGic/ArmGicDxe.c b/ArmPkg/Drivers/ArmGic/ArmGicDxe.c
index ca3a12f..16201d5 100644
--- a/ArmPkg/Drivers/ArmGic/ArmGicDxe.c
+++ b/ArmPkg/Drivers/ArmGic/ArmGicDxe.c
@@ -24,34 +24,19 @@ Abstract:
 
 #include <PiDxe.h>
 
-#include <Library/ArmLib.h>
 #include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
 #include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
 #include <Library/UefiLib.h>
 #include <Library/PcdLib.h>
 #include <Library/IoLib.h>
 #include <Library/ArmGicLib.h>
 
-#include <Protocol/Cpu.h>
-#include <Protocol/HardwareInterrupt.h>
+#include "ArmGicDxe.h"
 
 #define ARM_GIC_DEFAULT_PRIORITY  0x80
 
 extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptProtocol;
 
-//
-// Notifications
-//
-EFI_EVENT EfiExitBootServicesEvent      = (EFI_EVENT)NULL;
-
-// Maximum Number of Interrupts
-UINTN mGicNumInterrupts                 = 0;
-
-HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers = NULL;
-
 /**
   Register Handler for the specified interrupt source.
 
@@ -241,11 +226,6 @@ IrqInterruptHandler (
 }
 
 //
-// Making this global saves a few bytes in image size
-//
-EFI_HANDLE  gHardwareInterruptHandle = NULL;
-
-//
 // The protocol instance produced by this driver
 //
 EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptProtocol = {
@@ -311,7 +291,6 @@ InterruptDxeInitialize (
   UINTN                   Index;
   UINT32                  RegOffset;
   UINTN                   RegShift;
-  EFI_CPU_ARCH_PROTOCOL   *Cpu;
   UINT32                  CpuTarget;
   
   // Make sure the Interrupt Controller Protocol is not already installed in the system.
@@ -366,37 +345,8 @@ InterruptDxeInitialize (
   // Enable gic distributor
   ArmGicEnableDistributor (PcdGet32(PcdGicDistributorBase));
   
-  // Initialize the array for the Interrupt Handlers
-  gRegisteredInterruptHandlers = (HARDWARE_INTERRUPT_HANDLER*)AllocateZeroPool (sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
-  
-  Status = gBS->InstallMultipleProtocolInterfaces (
-                  &gHardwareInterruptHandle,
-                  &gHardwareInterruptProtocolGuid,   &gHardwareInterruptProtocol,
-                  NULL
-                  );
-  ASSERT_EFI_ERROR (Status);
-  
-  //
-  // Get the CPU protocol that this driver requires.
-  //
-  Status = gBS->LocateProtocol(&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // Unregister the default exception handler.
-  //
-  Status = Cpu->RegisterInterruptHandler(Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
-  ASSERT_EFI_ERROR(Status);
-
-  //
-  // Register to receive interrupts
-  //
-  Status = Cpu->RegisterInterruptHandler(Cpu, ARM_ARCH_EXCEPTION_IRQ, IrqInterruptHandler);
-  ASSERT_EFI_ERROR(Status);
-
-  // Register for an ExitBootServicesEvent
-  Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
-  ASSERT_EFI_ERROR (Status);
+  Status = InstallAndRegisterInterruptService (
+      &gHardwareInterruptProtocol, IrqInterruptHandler, ExitBootServicesEvent);
 
   return Status;
 }
diff --git a/ArmPkg/Drivers/ArmGic/ArmGicDxe.h b/ArmPkg/Drivers/ArmGic/ArmGicDxe.h
new file mode 100644
index 0000000..4fc65b1
--- /dev/null
+++ b/ArmPkg/Drivers/ArmGic/ArmGicDxe.h
@@ -0,0 +1,39 @@
+/*++
+
+Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>
+
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+--*/
+
+#ifndef __ARM_GIC_DXE_H__
+#define __ARM_GIC_DXE_H__
+
+#include <Library/ArmLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#include <Protocol/Cpu.h>
+#include <Protocol/HardwareInterrupt.h>
+
+extern UINTN                        mGicNumInterrupts;
+extern HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers;
+
+//
+// Common API
+//
+EFI_STATUS
+InstallAndRegisterInterruptService (
+  IN EFI_HARDWARE_INTERRUPT_PROTOCOL   *InterruptProtocol,
+  IN EFI_CPU_INTERRUPT_HANDLER          InterruptHandler,
+  IN EFI_EVENT_NOTIFY                   ExitBootServicesEvent
+  );
+
+#endif
diff --git a/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf b/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
index 04927e0..a3529a9 100644
--- a/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
+++ b/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
@@ -24,6 +24,7 @@
 
 [Sources.common]
   ArmGicDxe.c
+  ArmGicCommonDxe.c
 
 [Packages]
   MdePkg/MdePkg.dec
-- 
1.8.5

