Updated Hardware Interrupt protocol to add an EOI member. Added ARM Data/Instruction...
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 24 Feb 2010 22:38:46 +0000 (22:38 +0000)
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 24 Feb 2010 22:38:46 +0000 (22:38 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10063 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Include/Library/ArmLib.h
ArmPkg/Library/ArmLib/Arm11/Arm11Lib.c
ArmPkg/Library/ArmLib/Arm11/Arm11Support.S
ArmPkg/Library/ArmLib/Arm11/Arm11Support.asm
ArmPkg/Library/ArmLib/Arm9/Arm9Lib.c
ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.S
ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm
Omap35xxPkg/InterruptDxe/HardwareInterrupt.c
Omap35xxPkg/InterruptDxe/InterruptDxe.inf
Omap35xxPkg/TimerDxe/Timer.c

index da28c34..d0928e7 100644 (file)
@@ -309,5 +309,23 @@ EFIAPI
 ArmDisableBranchPrediction (
   VOID
   );
-
+  
+VOID
+EFIAPI
+ArmDataMemoryBarrier (
+  VOID
+  );
+  
+VOID
+EFIAPI
+ArmDataSyncronizationBarrier (
+  VOID
+  );
+  
+VOID
+EFIAPI
+ArmInstructionSynchronizationBarrier (
+  VOID
+  );
+  
 #endif // __ARM_LIB__
index 3736904..6f0f599 100644 (file)
@@ -116,3 +116,34 @@ ArmConfigureMmu (
   ArmEnableDataCache();
   ArmEnableMmu();  
 }
+
+
+VOID
+EFIAPI
+ArmDataMemoryBarrier (
+  VOID
+  )
+{
+  // Should move to assembly with the 
+}
+  
+VOID
+EFIAPI
+ArmDataSyncronizationBarrier (
+  VOID
+  )
+{
+// MOV R0, #0
+// MCR P15, #0, R0, C7, C10, #4}
+}
+
+
+VOID
+EFIAPI
+ArmInstructionSynchronizationBarrier (
+  VOID
+  )
+{
+}
+
+
index e3b7746..6d178b1 100644 (file)
 .globl ASM_PFX(ArmDisableInstructionCache)
 .globl ASM_PFX(ArmEnableBranchPrediction)
 .globl ASM_PFX(ArmDisableBranchPrediction)
+.globl ASM_PFX(ArmDataMemoryBarrier)
+.globl ASM_PFX(ArmDataSyncronizationBarrier) 
+.globl ASM_PFX(ArmInstructionSynchronizationBarrier)
+
 
 .set DC_ON, (0x1<<2)
 .set IC_ON, (0x1<<12)
@@ -132,4 +136,20 @@ ASM_PFX(ArmDisableBranchPrediction):
   mcr     p15, 0, r0, c1, c0, 0
   bx      LR
 
+ASM_PFX(ArmDataMemoryBarrier):
+  mov R0, #0
+  mcr P15, #0, R0, C7, C10, #5 
+  bx      LR
+  
+ASM_PFX(ArmDataSyncronizationBarrier):
+  mov R0, #0
+  mcr P15, #0, R0, C7, C10, #4 
+  bx      LR
+  
+ASM_PFX(ArmInstructionSynchronizationBarrier):
+  mov R0, #0
+  mcr P15, #0, R0, C7, C5, #4 
+  bx      LR
+  
+
 ASM_FUNCTION_REMOVE_IF_UNREFERENCED
index a2ed2e6..546503b 100644 (file)
@@ -28,6 +28,9 @@
     EXPORT  ArmDisableInstructionCache
     EXPORT  ArmEnableBranchPrediction
     EXPORT  ArmDisableBranchPrediction
+    EXPORT  ArmDataMemoryBarrier
+    EXPORT  ArmDataSyncronizationBarrier
+    EXPORT  ArmInstructionSynchronizationBarrier
 
 
 DC_ON       EQU     ( 0x1:SHL:2 )
@@ -136,4 +139,19 @@ ArmDisableBranchPrediction
   mcr     p15, 0, r0, c1, c0, 0
   bx      LR
 
+ASM_PFX(ArmDataMemoryBarrier):
+  mov R0, #0
+  mcr P15, #0, R0, C7, C10, #5 
+  bx      LR
+  
+ASM_PFX(ArmDataSyncronizationBarrier):
+  mov R0, #0
+  mcr P15, #0, R0, C7, C10, #4 
+  bx      LR
+  
+ASM_PFX(ArmInstructionSynchronizationBarrier):
+  MOV R0, #0
+  MCR P15, #0, R0, C7, C5, #4 
+  bx      LR
+
     END
index 0ba2237..63d6830 100644 (file)
@@ -116,3 +116,30 @@ ArmConfigureMmu (
   ArmEnableDataCache();
   ArmEnableMmu();
 }
+
+
+VOID
+EFIAPI
+ArmDataMemoryBarrier (
+  VOID
+  )
+{
+}
+  
+VOID
+EFIAPI
+ArmDataSyncronizationBarrier (
+  VOID
+  )
+{
+}
+
+VOID
+EFIAPI
+ArmInstructionSynchronizationBarrier (
+  VOID
+  )
+{
+}
+
+
index 2cde8e2..b4ec9b5 100644 (file)
 .globl ASM_PFX(ArmEnableBranchPrediction)
 .globl ASM_PFX(ArmDisableBranchPrediction)
 .globl ASM_PFX(ArmV7AllDataCachesOperation)
+.globl ASM_PFX(ArmDataMemoryBarrier)
+.globl ASM_PFX(ArmDataSyncronizationBarrier) 
+.globl ASM_PFX(ArmInstructionSynchronizationBarrier)
+
 
 .set DC_ON, (0x1<<2)
 .set IC_ON, (0x1<<12)
@@ -222,5 +226,17 @@ L_Finished:
   ldmfd SP!, {r4-r12, lr}
   bx    LR
 
+ASM_PFX(ArmDataMemoryBarrier):
+  dmb
+  bx      LR
+  
+ASM_PFX(ArmDataSyncronizationBarrier):
+  dsb
+  bx      LR
+  
+ASM_PFX(ArmInstructionSynchronizationBarrier):
+  isb
+  bx      LR
 
 ASM_FUNCTION_REMOVE_IF_UNREFERENCED
index d1cf8c1..e2676d4 100644 (file)
     EXPORT  ArmEnableBranchPrediction
     EXPORT  ArmDisableBranchPrediction
     EXPORT  ArmV7AllDataCachesOperation
+    EXPORT  ArmDataMemoryBarrier
+    EXPORT  ArmDataSyncronizationBarrier
+    EXPORT  ArmInstructionSynchronizationBarrier
+
 
 DC_ON       EQU     ( 0x1:SHL:2 )
 IC_ON       EQU     ( 0x1:SHL:12 )
@@ -217,4 +221,17 @@ Finished
   LDMFD SP!, {r4-r12, lr}
   BX    LR
 
+
+ArmDataMemoryBarrier
+  DMB
+  BX      LR
+  
+ArmDataSyncronizationBarrier
+  DSB
+  BX      LR
+  
+ArmInstructionSynchronizationBarrier
+  ISB
+  BX      LR
+
     END
index 6e30eb7..eae9206 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
-  Template for Metronome Architecture Protocol driver of the ARM flavor\r
+  Handle OMAP35xx interrupt controller \r
 \r
-  Copyright (c) 2008-2009, Apple Inc. All rights reserved.\r
+  Copyright (c) 2008-2010, Apple Inc. All rights reserved.\r
   \r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -21,6 +21,7 @@
 #include <Library/UefiLib.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/IoLib.h>\r
+#include <Library/ArmLib.h>\r
 \r
 #include <Protocol/Cpu.h>\r
 #include <Protocol/HardwareInterrupt.h>\r
@@ -143,7 +144,7 @@ EnableInterruptSource (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-DisableInterruptSource(\r
+DisableInterruptSource (\r
   IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,\r
   IN HARDWARE_INTERRUPT_SOURCE          Source\r
   )\r
@@ -209,6 +210,28 @@ GetInterruptSourceState (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Signal to the hardware that the End Of Intrrupt state \r
+  has been reached.\r
+\r
+  @param This     Instance pointer for this protocol\r
+  @param Source   Hardware source of the interrupt\r
+\r
+  @retval EFI_SUCCESS       Source interrupt EOI'ed.\r
+  @retval EFI_DEVICE_ERROR  Hardware could not be programmed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EndOfInterrupt (\r
+  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,\r
+  IN HARDWARE_INTERRUPT_SOURCE          Source\r
+  )\r
+{\r
+  MmioWrite32 (INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);\r
+  ArmDataSyncronizationBarrier ();\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 \r
 /**\r
@@ -232,19 +255,21 @@ IrqInterruptHandler (
   UINT32                     Vector;\r
   HARDWARE_INTERRUPT_HANDLER InterruptHandler;\r
   \r
-  Vector = MmioRead32(INTCPS_SIR_IRQ) & INTCPS_SIR_IRQ_MASK;\r
+  Vector = MmioRead32 (INTCPS_SIR_IRQ) & INTCPS_SIR_IRQ_MASK;\r
 \r
   // Needed to prevent infinite nesting when Time Driver lowers TPL\r
   MmioWrite32 (INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);\r
-\r
+  ArmDataSyncronizationBarrier ();\r
+  \r
   InterruptHandler = gRegisteredInterruptHandlers[Vector];\r
   if (InterruptHandler != NULL) {\r
     // Call the registered interrupt handler.\r
-    InterruptHandler(Vector, SystemContext);\r
+    InterruptHandler (Vector, SystemContext);\r
   }\r
   \r
   // Needed to clear after running the handler\r
   MmioWrite32 (INTCPS_CONTROL, INTCPS_CONTROL_NEWIRQAGR);\r
+  ArmDataSyncronizationBarrier ();\r
 }\r
 \r
 //\r
@@ -259,7 +284,8 @@ EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptProtocol = {
   RegisterInterruptSource,\r
   EnableInterruptSource,\r
   DisableInterruptSource,\r
-  GetInterruptSourceState\r
+  GetInterruptSourceState,\r
+  EndOfInterrupt\r
 };\r
 \r
 //\r
@@ -277,19 +303,19 @@ CpuProtocolInstalledNotification (
   //\r
   // Get the cpu protocol that this driver requires.\r
   //\r
-  Status = gBS->LocateProtocol(&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);\r
+  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);\r
   ASSERT_EFI_ERROR(Status);\r
 \r
   //\r
   // Unregister the default exception handler.\r
   //\r
-  Status = Cpu->RegisterInterruptHandler(Cpu, EXCEPT_ARM_IRQ, NULL);\r
+  Status = Cpu->RegisterInterruptHandler (Cpu, EXCEPT_ARM_IRQ, NULL);\r
   ASSERT_EFI_ERROR(Status);\r
 \r
   //\r
   // Register to receive interrupts\r
   //\r
-  Status = Cpu->RegisterInterruptHandler(Cpu, EXCEPT_ARM_IRQ, IrqInterruptHandler);\r
+  Status = Cpu->RegisterInterruptHandler (Cpu, EXCEPT_ARM_IRQ, IrqInterruptHandler);\r
   ASSERT_EFI_ERROR(Status);\r
 }\r
 \r
index 832e715..533ca79 100644 (file)
@@ -41,6 +41,7 @@
 \r
 \r
 [Packages]\r
+  ArmPkg/ArmPkg.dec\r
   Omap35xxPkg/Omap35xxPkg.dec\r
   MdePkg/MdePkg.dec\r
   EmbeddedPkg/EmbeddedPkg.dec\r
@@ -53,6 +54,7 @@
   PrintLib\r
   UefiDriverEntryPoint\r
   IoLib\r
+  ArmLib\r
 \r
 [Guids]\r
   \r
index 2753b98..3ae0cc2 100644 (file)
@@ -59,19 +59,13 @@ volatile UINTN  gVector;
   C Interrupt Handler calledin the interrupt context when Source interrupt is active.
 
 
-
   @param Source         Source of the interrupt. Hardware routing off a specific platform defines
-
                         what source means.
 
   @param SystemContext  Pointer to system register context. Mostly used by debuggers and will
-
                         update the system context after the return from the interrupt if 
-
                         modified. Don't change these values unless you know what you are doing
 
-
-
 **/
 VOID
 EFIAPI
@@ -85,15 +79,10 @@ TimerInterruptHandler (
 
 
   //
-
   // DXE core uses this callback for the EFI timer tick. The DXE core uses locks 
-
   // that raise to TPL_HIGH and then restore back to current level. Thus we need
-
   // to make sure TPL level is set to TPL_HIGH while we are handling the timer tick. 
-
   //
-
   OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
 
 
@@ -115,63 +104,33 @@ TimerInterruptHandler (
 }
 
 /**
-
   This function registers the handler NotifyFunction so it is called every time 
-
   the timer interrupt fires.  It also passes the amount of time since the last 
-
   handler call to the NotifyFunction.  If NotifyFunction is NULL, then the 
-
   handler is unregistered.  If the handler is registered, then EFI_SUCCESS is 
-
   returned.  If the CPU does not support registering a timer interrupt handler, 
-
   then EFI_UNSUPPORTED is returned.  If an attempt is made to register a handler 
-
   when a handler is already registered, then EFI_ALREADY_STARTED is returned.  
-
   If an attempt is made to unregister a handler when a handler is not registered, 
-
   then EFI_INVALID_PARAMETER is returned.  If an error occurs attempting to 
-
   register the NotifyFunction with the timer interrupt, then EFI_DEVICE_ERROR 
-
   is returned.
 
-
-
   @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.
-
   @param  NotifyFunction   The function to call when a timer interrupt fires. This
-
                            function executes at TPL_HIGH_LEVEL. The DXE Core will
-
                            register a handler for the timer interrupt, so it can know
-
                            how much time has passed. This information is used to
-
                            signal timer based events. NULL will unregister the handler.
-
-
-
   @retval EFI_SUCCESS           The timer handler was registered.
-
   @retval EFI_UNSUPPORTED       The platform does not support timer interrupts.
-
   @retval EFI_ALREADY_STARTED   NotifyFunction is not NULL, and a handler is already
-
                                 registered.
-
   @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a handler was not
-
                                 previously registered.
-
   @retval EFI_DEVICE_ERROR      The timer handler could not be registered.
 
-
-
 **/
-
 EFI_STATUS
 EFIAPI
 TimerDriverRegisterHandler (
@@ -195,53 +154,30 @@ TimerDriverRegisterHandler (
 /**
 
   This function adjusts the period of timer interrupts to the value specified 
-
   by TimerPeriod.  If the timer period is updated, then the selected timer 
-
   period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned.  If 
-
   the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.  
-
   If an error occurs while attempting to update the timer period, then the 
-
   timer hardware will be put back in its state prior to this call, and 
-
   EFI_DEVICE_ERROR is returned.  If TimerPeriod is 0, then the timer interrupt 
-
   is disabled.  This is not the same as disabling the CPU's interrupts.  
-
   Instead, it must either turn off the timer hardware, or it must adjust the 
-
   interrupt controller so that a CPU interrupt is not generated when the timer 
-
   interrupt fires. 
 
-
-
   @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.
-
   @param  TimerPeriod      The rate to program the timer interrupt in 100 nS units. If
-
                            the timer hardware is not programmable, then EFI_UNSUPPORTED is
-
                            returned. If the timer is programmable, then the timer period
-
                            will be rounded up to the nearest timer period that is supported
-
                            by the timer hardware. If TimerPeriod is set to 0, then the
-
                            timer interrupts will be disabled.
 
 
-
   @retval EFI_SUCCESS           The timer period was changed.
-
   @retval EFI_UNSUPPORTED       The platform cannot change the period of the timer interrupt.
-
   @retval EFI_DEVICE_ERROR      The timer period could not be changed due to a device error.
 
-
-
 **/
 EFI_STATUS
 EFIAPI
@@ -286,31 +222,19 @@ TimerDriverSetTimerPeriod (
 
 
 /**
-
   This function retrieves the period of timer interrupts in 100 ns units, 
-
   returns that value in TimerPeriod, and returns EFI_SUCCESS.  If TimerPeriod 
-
   is NULL, then EFI_INVALID_PARAMETER is returned.  If a TimerPeriod of 0 is 
-
   returned, then the timer is currently disabled.
 
-
-
   @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.
-
   @param  TimerPeriod      A pointer to the timer period to retrieve in 100 ns units. If
-
                            0 is returned, then the timer is currently disabled.
 
 
-
   @retval EFI_SUCCESS           The timer period was returned in TimerPeriod.
-
   @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
 
-
-
 **/
 EFI_STATUS
 EFIAPI
@@ -328,33 +252,19 @@ TimerDriverGetTimerPeriod (
 }
 
 /**
-
   This function generates a soft timer interrupt. If the platform does not support soft 
-
   timer interrupts, then EFI_UNSUPPORTED is returned. Otherwise, EFI_SUCCESS is returned. 
-
   If a handler has been registered through the EFI_TIMER_ARCH_PROTOCOL.RegisterHandler() 
-
   service, then a soft timer interrupt will be generated. If the timer interrupt is 
-
   enabled when this service is called, then the registered handler will be invoked. The 
-
   registered handler should not be able to distinguish a hardware-generated timer 
-
   interrupt from a software-generated timer interrupt.
 
-
-
   @param  This             The EFI_TIMER_ARCH_PROTOCOL instance.
 
-
-
   @retval EFI_SUCCESS           The soft timer interrupt was generated.
-
   @retval EFI_UNSUPPORTED       The platform does not support the generation of soft timer interrupts.
 
-
-
 **/
 EFI_STATUS
 EFIAPI
@@ -388,71 +298,38 @@ TimerDriverRegisterPeriodicCallback (
 
 
 /**
-
   Interface stucture for the Timer Architectural Protocol.
 
-
-
   @par Protocol Description:
-
   This protocol provides the services to initialize a periodic timer 
-
   interrupt, and to register a handler that is called each time the timer
-
   interrupt fires.  It may also provide a service to adjust the rate of the
-
   periodic timer interrupt.  When a timer interrupt occurs, the handler is 
-
   passed the amount of time that has passed since the previous timer 
-
   interrupt.
 
-
-
   @param RegisterHandler
-
   Registers a handler that will be called each time the 
-
   timer interrupt fires.  TimerPeriod defines the minimum 
-
   time between timer interrupts, so TimerPeriod will also 
-
   be the minimum time between calls to the registered 
-
   handler.
 
-
-
   @param SetTimerPeriod
-
   Sets the period of the timer interrupt in 100 nS units.  
-
   This function is optional, and may return EFI_UNSUPPORTED.  
-
   If this function is supported, then the timer period will 
-
   be rounded up to the nearest supported timer period.
 
 
-
   @param GetTimerPeriod
-
   Retrieves the period of the timer interrupt in 100 nS units.
 
-
-
   @param GenerateSoftInterrupt
-
   Generates a soft timer interrupt that simulates the firing of 
-
-  the timer interrupt. This service can be used to invoke the 
-
-  registered handler if the timer interrupt has been masked for 
-
+  the timer interrupt. This service can be used to invoke the   registered handler if the timer interrupt has been masked for 
   a period of time.
 
-
-
 **/
 EFI_TIMER_ARCH_PROTOCOL   gTimer = {
   TimerDriverRegisterHandler,
@@ -467,29 +344,17 @@ TIMER_DEBUG_SUPPORT_PROTOCOL  gTimerDebugSupport = {
 
 
 /**
-
   Initialize the state information for the Timer Architectural Protocol and
-
   the Timer Debug support protocol that allows the debugger to break into a
-
   running program.
 
-
-
   @param  ImageHandle   of the loaded driver
-
   @param  SystemTable   Pointer to the System Table
 
-
-
   @retval EFI_SUCCESS           Protocol registered
-
   @retval EFI_OUT_OF_RESOURCES  Cannot allocate protocol data structure
-
   @retval EFI_DEVICE_ERROR      Hardware problems
 
-
-
 **/
 EFI_STATUS
 EFIAPI