Home | History | Annotate | Download | only in Protocol
      1 /** @file
      2   Abstraction for hardware based interrupt routine
      3 
      4   On non IA-32 systems it is common to have a single hardware interrupt vector
      5   and a 2nd layer of software that routes the interrupt handlers based on the
      6   interrupt source. This protocol enables this routing. The driver implementing
      7   this protocol is responsible for clearing the pending interrupt in the
      8   interrupt routing hardware. The HARDWARE_INTERRUPT_HANDLER is responsible
      9   for clearing interrupt sources from individual devices.
     10 
     11 
     12   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
     13 
     14   This program and the accompanying materials
     15   are licensed and made available under the terms and conditions of the BSD License
     16   which accompanies this distribution.  The full text of the license may be found at
     17   http://opensource.org/licenses/bsd-license.php
     18 
     19   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     20   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     21 
     22 **/
     23 
     24 #ifndef __HARDWARE_INTERRUPT_H__
     25 #define __HARDWARE_INTERRUPT_H__
     26 
     27 #include <Protocol/DebugSupport.h>
     28 
     29 
     30 //
     31 // Protocol GUID
     32 //
     33 // EAB39028-3D05-4316-AD0C-D64808DA3FF1
     34 
     35 #define EFI_HARDWARE_INTERRUPT_PROTOCOL_GGUID \
     36   { 0x2890B3EA, 0x053D, 0x1643, { 0xAD, 0x0C, 0xD6, 0x48, 0x08, 0xDA, 0x3F, 0xF1 } }
     37 
     38 
     39 typedef struct _EFI_HARDWARE_INTERRUPT_PROTOCOL EFI_HARDWARE_INTERRUPT_PROTOCOL;
     40 
     41 
     42 typedef UINTN HARDWARE_INTERRUPT_SOURCE;
     43 
     44 
     45 /**
     46   C Interrupt Handler calledin the interrupt context when Source interrupt is active.
     47 
     48   @param Source         Source of the interrupt. Hardware routing off a specific platform defines
     49                         what source means.
     50   @param SystemContext  Pointer to system register context. Mostly used by debuggers and will
     51                         update the system context after the return from the interrupt if
     52                         modified. Don't change these values unless you know what you are doing
     53 
     54 **/
     55 typedef
     56 VOID
     57 (EFIAPI *HARDWARE_INTERRUPT_HANDLER) (
     58   IN  HARDWARE_INTERRUPT_SOURCE   Source,
     59   IN  EFI_SYSTEM_CONTEXT          SystemContext
     60   );
     61 
     62 
     63 /**
     64   Register Handler for the specified interrupt source.
     65 
     66   @param This     Instance pointer for this protocol
     67   @param Source   Hardware source of the interrupt
     68   @param Handler  Callback for interrupt. NULL to unregister
     69 
     70   @retval EFI_SUCCESS Source was updated to support Handler.
     71   @retval EFI_DEVICE_ERROR  Hardware could not be programmed.
     72 
     73 **/
     74 typedef
     75 EFI_STATUS
     76 (EFIAPI *HARDWARE_INTERRUPT_REGISTER) (
     77   IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
     78   IN HARDWARE_INTERRUPT_SOURCE          Source,
     79   IN HARDWARE_INTERRUPT_HANDLER         Handler
     80   );
     81 
     82 
     83 /**
     84   Enable interrupt source Source.
     85 
     86   @param This     Instance pointer for this protocol
     87   @param Source   Hardware source of the interrupt
     88 
     89   @retval EFI_SUCCESS       Source interrupt enabled.
     90   @retval EFI_DEVICE_ERROR  Hardware could not be programmed.
     91 
     92 **/
     93 typedef
     94 EFI_STATUS
     95 (EFIAPI *HARDWARE_INTERRUPT_ENABLE) (
     96   IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
     97   IN HARDWARE_INTERRUPT_SOURCE          Source
     98   );
     99 
    100 
    101 
    102 /**
    103   Disable interrupt source Source.
    104 
    105   @param This     Instance pointer for this protocol
    106   @param Source   Hardware source of the interrupt
    107 
    108   @retval EFI_SUCCESS       Source interrupt disabled.
    109   @retval EFI_DEVICE_ERROR  Hardware could not be programmed.
    110 
    111 **/
    112 typedef
    113 EFI_STATUS
    114 (EFIAPI *HARDWARE_INTERRUPT_DISABLE) (
    115   IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
    116   IN HARDWARE_INTERRUPT_SOURCE          Source
    117   );
    118 
    119 
    120 /**
    121   Return current state of interrupt source Source.
    122 
    123   @param This     Instance pointer for this protocol
    124   @param Source   Hardware source of the interrupt
    125   @param InterruptState  TRUE: source enabled, FALSE: source disabled.
    126 
    127   @retval EFI_SUCCESS       InterruptState is valid
    128   @retval EFI_DEVICE_ERROR  InterruptState is not valid
    129 
    130 **/
    131 typedef
    132 EFI_STATUS
    133 (EFIAPI *HARDWARE_INTERRUPT_INTERRUPT_STATE) (
    134   IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
    135   IN HARDWARE_INTERRUPT_SOURCE          Source,
    136   IN BOOLEAN                            *InterruptState
    137   );
    138 
    139 /**
    140   Signal to the hardware that the End Of Intrrupt state
    141   has been reached.
    142 
    143   @param This     Instance pointer for this protocol
    144   @param Source   Hardware source of the interrupt
    145 
    146   @retval EFI_SUCCESS       Source interrupt EOI'ed.
    147   @retval EFI_DEVICE_ERROR  Hardware could not be programmed.
    148 
    149 **/
    150 typedef
    151 EFI_STATUS
    152 (EFIAPI *HARDWARE_INTERRUPT_END_OF_INTERRUPT) (
    153   IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
    154   IN HARDWARE_INTERRUPT_SOURCE          Source
    155   );
    156 
    157 
    158 struct _EFI_HARDWARE_INTERRUPT_PROTOCOL {
    159   HARDWARE_INTERRUPT_REGISTER         RegisterInterruptSource;
    160   HARDWARE_INTERRUPT_ENABLE           EnableInterruptSource;
    161   HARDWARE_INTERRUPT_DISABLE          DisableInterruptSource;
    162   HARDWARE_INTERRUPT_INTERRUPT_STATE  GetInterruptSourceState;
    163   HARDWARE_INTERRUPT_END_OF_INTERRUPT EndOfInterrupt;
    164 };
    165 
    166 extern EFI_GUID gHardwareInterruptProtocolGuid;
    167 
    168 #endif
    169 
    170 
    171