git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10404 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			298 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  This protocol abstracts the 8259 interrupt controller. This includes
 | 
						|
  PCI IRQ routing needed to program the PCI Interrupt Line register.
 | 
						|
 | 
						|
Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
 | 
						|
This program and the accompanying materials are licensed and made available under 
 | 
						|
the terms and conditions of the BSD License that 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.
 | 
						|
 | 
						|
  @par Revision Reference:
 | 
						|
  This protocol is defined in Framework for EFI Compatibility Support Module spec
 | 
						|
  Version 0.97.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _EFI_LEGACY_8259_H_
 | 
						|
#define _EFI_LEGACY_8259_H_
 | 
						|
 | 
						|
 | 
						|
#define EFI_LEGACY_8259_PROTOCOL_GUID \
 | 
						|
  { \
 | 
						|
    0x38321dba, 0x4fe0, 0x4e17, {0x8a, 0xec, 0x41, 0x30, 0x55, 0xea, 0xed, 0xc1 } \
 | 
						|
  }
 | 
						|
 | 
						|
typedef struct _EFI_LEGACY_8259_PROTOCOL EFI_LEGACY_8259_PROTOCOL;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  Efi8259Irq0,
 | 
						|
  Efi8259Irq1,
 | 
						|
  Efi8259Irq2,
 | 
						|
  Efi8259Irq3,
 | 
						|
  Efi8259Irq4,
 | 
						|
  Efi8259Irq5,
 | 
						|
  Efi8259Irq6,
 | 
						|
  Efi8259Irq7,
 | 
						|
  Efi8259Irq8,
 | 
						|
  Efi8259Irq9,
 | 
						|
  Efi8259Irq10,
 | 
						|
  Efi8259Irq11,
 | 
						|
  Efi8259Irq12,
 | 
						|
  Efi8259Irq13,
 | 
						|
  Efi8259Irq14,
 | 
						|
  Efi8259Irq15,
 | 
						|
  Efi8259IrqMax
 | 
						|
} EFI_8259_IRQ;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  Efi8259LegacyMode,
 | 
						|
  Efi8259ProtectedMode,
 | 
						|
  Efi8259MaxMode
 | 
						|
} EFI_8259_MODE;
 | 
						|
 | 
						|
/**
 | 
						|
  Get the 8259 interrupt masks for Irq0 - Irq15. A different mask exists for
 | 
						|
  the legacy mode mask and the protected mode mask. The base address for the 8259
 | 
						|
  is different for legacy and protected mode, so two masks are required.
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  MasterBase            The base vector for the Master PIC in the 8259 controller.
 | 
						|
  @param  SlaveBase             The base vector for the Slave PIC in the 8259 controller.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The new bases were programmed.
 | 
						|
  @retval EFI_DEVICE_ERROR      A device error occured programming the vector bases.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_SET_VECTOR_BASE)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  IN  UINT8                             MasterBase,
 | 
						|
  IN  UINT8                             SlaveBase
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get the 8259 interrupt masks for Irq0 - Irq15. A different mask exists for
 | 
						|
  the legacy mode mask and the protected mode mask. The base address for the 8259
 | 
						|
  is different for legacy and protected mode, so two masks are required.
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  LegacyMask            Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
  @param  LegacyEdgeLevel       Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
  @param  ProtectedMask         Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
  @param  ProtectedEdgeLevel    Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           8259 status returned.
 | 
						|
  @retval EFI_DEVICE_ERROR      Error reading 8259.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_GET_MASK)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  OUT UINT16                            *LegacyMask, OPTIONAL
 | 
						|
  OUT UINT16                            *LegacyEdgeLevel, OPTIONAL
 | 
						|
  OUT UINT16                            *ProtectedMask, OPTIONAL
 | 
						|
  OUT UINT16                            *ProtectedEdgeLevel OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Set the 8259 interrupt masks for Irq0 - Irq15. A different mask exists for
 | 
						|
  the legacy mode mask and the protected mode mask. The base address for the 8259
 | 
						|
  is different for legacy and protected mode, so two masks are required.
 | 
						|
  Also set the edge/level masks.
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  LegacyMask            Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
  @param  LegacyEdgeLevel       Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
  @param  ProtectedMask         Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
  @param  ProtectedEdgeLevel    Bit 0 is Irq0 - Bit 15 is Irq15.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           8259 status returned.
 | 
						|
  @retval EFI_DEVICE_ERROR      Error writing 8259.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_SET_MASK)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  IN  UINT16                            *LegacyMask, OPTIONAL
 | 
						|
  IN  UINT16                            *LegacyEdgeLevel, OPTIONAL
 | 
						|
  IN  UINT16                            *ProtectedMask, OPTIONAL
 | 
						|
  IN  UINT16                            *ProtectedEdgeLevel OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Set the 8259 mode of operation. The base address for the 8259 is different for
 | 
						|
  legacy and protected mode. The legacy mode requires the master 8259 to have a
 | 
						|
  master base of 0x08 and the slave base of 0x70. The protected mode base locations
 | 
						|
  are not defined. Interrupts must be masked by the caller before this function
 | 
						|
  is called. The interrupt mask from the current mode is saved. The interrupt
 | 
						|
  mask for the new mode is Mask, or if Mask does not exist the previously saved
 | 
						|
  mask is used.
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  Mode                  The mode of operation. i.e. the real mode or protected mode.
 | 
						|
  @param  Mask                  Optional interupt mask for the new mode.
 | 
						|
  @param  EdgeLevel             Optional trigger mask for the new mode.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           8259 programmed.
 | 
						|
  @retval EFI_DEVICE_ERROR      Error writing to 8259.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_SET_MODE)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL         *This,
 | 
						|
  IN  EFI_8259_MODE                   Mode,
 | 
						|
  IN  UINT16                          *Mask, OPTIONAL
 | 
						|
  IN  UINT16                          *EdgeLevel OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Convert from IRQ to processor interrupt vector number.
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  Irq                   8259 IRQ0 - IRQ15.
 | 
						|
  @param  Vector                The processor vector number that matches an Irq.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The Vector matching Irq is returned.
 | 
						|
  @retval EFI_INVALID_PARAMETER The Irq not valid.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_GET_VECTOR)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  IN  EFI_8259_IRQ                      Irq,
 | 
						|
  OUT UINT8                             *Vector
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Enable Irq by unmasking interrupt in 8259
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  Irq                   8259 IRQ0 - IRQ15.
 | 
						|
  @param  LevelTriggered        TRUE if level triggered. FALSE if edge triggered.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The Irq was enabled on 8259.
 | 
						|
  @retval EFI_INVALID_PARAMETER The Irq is not valid.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_ENABLE_IRQ)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  IN  EFI_8259_IRQ                      Irq,
 | 
						|
  IN  BOOLEAN                           LevelTriggered
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Disable Irq by masking interrupt in 8259
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  Irq                   8259 IRQ0 - IRQ15.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The Irq was disabled on 8259.
 | 
						|
  @retval EFI_INVALID_PARAMETER The Irq is not valid.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_DISABLE_IRQ)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  IN  EFI_8259_IRQ                      Irq
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  PciHandle represents a PCI config space of a PCI function. Vector
 | 
						|
  represents Interrupt Pin (from PCI config space) and it is the data
 | 
						|
  that is programmed into the Interrupt Line (from the PCI config space)
 | 
						|
  register.
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  PciHandle             The PCI function to return the vector for.
 | 
						|
  @param  Vector                The vector for the function it matches.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           A valid Vector was returned.
 | 
						|
  @retval EFI_INVALID_PARAMETER PciHandle not valid.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_GET_INTERRUPT_LINE)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  IN  EFI_HANDLE                        PciHandle,
 | 
						|
  OUT UINT8                             *Vector
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Send an EOI to 8259
 | 
						|
 | 
						|
  @param  This                  The protocol instance pointer.
 | 
						|
  @param  Irq                   8259 IRQ0 - IRQ15.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           EOI was successfully sent to 8259.
 | 
						|
  @retval EFI_INVALID_PARAMETER The Irq isnot valid.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_LEGACY_8259_END_OF_INTERRUPT)(
 | 
						|
  IN EFI_LEGACY_8259_PROTOCOL           *This,
 | 
						|
  IN  EFI_8259_IRQ                      Irq
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  @par Protocol Description:
 | 
						|
  Abstracts the 8259 and APIC hardware control between EFI usage and
 | 
						|
  Compatibility16 usage.
 | 
						|
 | 
						|
  @param SetVectorBase
 | 
						|
  Sets the vector bases for master and slave PICs.
 | 
						|
 | 
						|
  @param GetMask
 | 
						|
  Gets IRQ and edge/level masks for 16-bit real mode and 32-bit protected mode.
 | 
						|
 | 
						|
  @param SetMask
 | 
						|
  Sets the IRQ and edge\level masks for 16-bit real mode and 32-bit protected mode.
 | 
						|
 | 
						|
  @param SetMode
 | 
						|
  Sets PIC mode to 16-bit real mode or 32-bit protected mode.
 | 
						|
 | 
						|
  @param GetVector
 | 
						|
  Gets the base vector assigned to an IRQ.
 | 
						|
 | 
						|
  @param EnableIrq
 | 
						|
  Enables an IRQ.
 | 
						|
 | 
						|
  @param DisableIrq
 | 
						|
  Disables an IRQ.
 | 
						|
 | 
						|
  @param GetInterruptLine
 | 
						|
  Gets an IRQ that is assigned to a PCI device.
 | 
						|
 | 
						|
  @param EndOfInterrupt
 | 
						|
  Issues the end of interrupt command.
 | 
						|
 | 
						|
**/
 | 
						|
struct _EFI_LEGACY_8259_PROTOCOL {
 | 
						|
  EFI_LEGACY_8259_SET_VECTOR_BASE     SetVectorBase;
 | 
						|
  EFI_LEGACY_8259_GET_MASK            GetMask;
 | 
						|
  EFI_LEGACY_8259_SET_MASK            SetMask;
 | 
						|
  EFI_LEGACY_8259_SET_MODE            SetMode;
 | 
						|
  EFI_LEGACY_8259_GET_VECTOR          GetVector;
 | 
						|
  EFI_LEGACY_8259_ENABLE_IRQ          EnableIrq;
 | 
						|
  EFI_LEGACY_8259_DISABLE_IRQ         DisableIrq;
 | 
						|
  EFI_LEGACY_8259_GET_INTERRUPT_LINE  GetInterruptLine;
 | 
						|
  EFI_LEGACY_8259_END_OF_INTERRUPT    EndOfInterrupt;
 | 
						|
};
 | 
						|
 | 
						|
extern EFI_GUID gEfiLegacy8259ProtocolGuid;
 | 
						|
 | 
						|
#endif
 |