diff options
author | klu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524> | 2008-04-18 04:13:47 +0000 |
---|---|---|
committer | klu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524> | 2008-04-18 04:13:47 +0000 |
commit | 1166d06825aca8d7e172776bd1297d6bcd3ad47c (patch) | |
tree | dfbde6aa0bd42bd7fb16f698b97585d729f92b4b | |
parent | d55eb54dabc54d1ed390d8548f898bf929f34819 (diff) | |
download | edk2-platforms-1166d06825aca8d7e172776bd1297d6bcd3ad47c.tar.xz |
Add legacy8259 module for PcAt.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5090 6f19259b-4bc3-4df7-8a09-765794883524
4 files changed, 1029 insertions, 0 deletions
diff --git a/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.c b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.c new file mode 100644 index 0000000000..dc1c50ff8a --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.c @@ -0,0 +1,658 @@ +/**@file
+ This contains the installation function for the driver.
+
+Copyright (c) 2005 - 2007, Intel Corporation
+All rights reserved. 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 "8259.h"
+
+//
+// Global for the CPU I/O Protocol that is consumed by this driver
+//
+EFI_CPU_IO_PROTOCOL *mCpuIo;
+
+//
+// Global for the Legacy 8259 Protocol that is prodiced by this driver
+//
+EFI_LEGACY_8259_PROTOCOL m8259 = {
+ Interrupt8259SetVectorBase,
+ Interrupt8259GetMask,
+ Interrupt8259SetMask,
+ Interrupt8259SetMode,
+ Interrupt8259GetVector,
+ Interrupt8259EnableIrq,
+ Interrupt8259DisableIrq,
+ Interrupt8259GetInterruptLine,
+ Interrupt8259EndOfInterrupt
+};
+
+//
+// Global for the handle that the Legacy 8259 Protocol is installed
+//
+EFI_HANDLE m8259Handle = NULL;
+
+UINT8 mMasterBase = 0xff;
+UINT8 mSlaveBase = 0xff;
+EFI_8259_MODE mMode = Efi8259ProtectedMode;
+UINT16 mProtectedModeMask = 0xffff;
+UINT16 mLegacyModeMask = 0x06b8;
+UINT16 mProtectedModeEdgeLevel = 0x0000;
+UINT16 mLegacyModeEdgeLevel = 0x0000;
+
+//
+// Worker Functions
+//
+VOID
+IoWrite8 (
+ IN UINT16 Port,
+ IN UINT8 Value
+ )
+/**
+
+ Routine Description:
+ Writes an I/O port using the CPU I/O Protocol
+
+ Arguments:
+ Register - I/O Port to write
+ Value - The 8 bit value to write to Port
+
+ Returns:
+ None
+
+**/
+{
+ mCpuIo->Io.Write (mCpuIo, EfiCpuIoWidthUint8, Port, 1, &Value);
+}
+
+UINT8
+IoRead8 (
+ IN UINT16 Port
+ )
+/**
+
+ Routine Description:
+ Writes an I/O port using the CPU I/O Protocol
+
+ Arguments:
+ Register - I/O Port to write
+ Value - The 8 bit value to write to Port
+
+ Returns:
+ None
+
+**/
+{
+ UINT8 Value;
+
+ mCpuIo->Io.Read (mCpuIo, EfiCpuIoWidthUint8, Port, 1, &Value);
+ return Value;
+}
+
+VOID
+Interrupt8259WriteMask (
+ IN UINT16 Mask,
+ IN UINT16 EdgeLevel
+ )
+/**
+
+ Routine Description:
+ Sets the 8250 mask to the valud specified by Mask
+
+ Arguments:
+ Mask - A 16 bit valute that represents the master and slave mask values
+
+ Returns:
+ None
+
+**/
+// TODO: EdgeLevel - add argument and description to function comment
+{
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, (UINT8) Mask);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, (UINT8) (Mask >> 8));
+ IoWrite8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER, (UINT8) EdgeLevel);
+ IoWrite8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE, (UINT8) (EdgeLevel >> 8));
+}
+
+VOID
+Interrupt8259ReadMask (
+ IN UINT16 *Mask,
+ IN UINT16 *EdgeLevel
+ )
+/**
+
+ Routine Description:
+ Sets the 8250 mask to the valud specified by Mask
+
+ Arguments:
+ Mask - A 16 bit valute that represents the master and slave mask values
+
+ Returns:
+ None
+
+**/
+// TODO: EdgeLevel - add argument and description to function comment
+{
+ if (Mask != NULL) {
+ *Mask = (UINT16) (IoRead8 (LEGACY_8259_MASK_REGISTER_MASTER) | (IoRead8 (LEGACY_8259_MASK_REGISTER_SLAVE) << 8));
+ }
+
+ if (EdgeLevel != NULL) {
+ *EdgeLevel = (UINT16)
+ (
+ IoRead8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER) |
+ (IoRead8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE) << 8)
+ );
+ }
+}
+//
+// Legacy 8259 Protocol Interface Function
+//
+EFI_STATUS
+EFIAPI
+Interrupt8259SetVectorBase (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN UINT8 MasterBase,
+ IN UINT8 SlaveBase
+ )
+/**
+
+ Routine Description:
+ Sets the base vector for the 8250 Master and Slave interrupt controllers
+
+ Arguments:
+ This - Protocol instance pointer.
+ MasterBase - Base vector of the 8259 Master
+ SlaveBase - Base vector of the 8259 Slave
+
+ Returns:
+ EFI_SUCCESS - 8259 programmed
+
+**/
+{
+ UINT8 Mask;
+
+ if (SlaveBase != mSlaveBase) {
+ mSlaveBase = SlaveBase;
+
+ //
+ // Initialize Slave interrupt controller.
+ //
+ Mask = IoRead8 (LEGACY_8259_MASK_REGISTER_SLAVE);
+ IoWrite8 (LEGACY_8259_CONTROL_REGISTER_SLAVE, 0x11);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, mSlaveBase);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0x02);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0x01);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, Mask);
+ }
+
+ if (MasterBase != mMasterBase) {
+ mMasterBase = MasterBase;
+
+ //
+ // Initialize Master interrupt controller.
+ //
+ Mask = IoRead8 (LEGACY_8259_MASK_REGISTER_MASTER);
+ IoWrite8 (LEGACY_8259_CONTROL_REGISTER_MASTER, 0x11);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, mMasterBase);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0x04);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0x01);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, Mask);
+ }
+
+ IoWrite8 (LEGACY_8259_CONTROL_REGISTER_SLAVE, 0x20);
+ IoWrite8 (LEGACY_8259_CONTROL_REGISTER_MASTER, 0x20);
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259GetMask (
+ IN EFI_LEGACY_8259_PROTOCOL * This,
+ OUT UINT16 *LegacyMask, OPTIONAL
+ OUT UINT16 *LegacyEdgeLevel, OPTIONAL
+ OUT UINT16 *ProtectedMask, OPTIONAL
+ OUT UINT16 *ProtectedEdgeLevel OPTIONAL
+ )
+/**
+
+ Routine Description:
+ Get the 8259 master and slave address that maps IRQ to processor interrupt
+ vector number. Get the Context of the device including the state of the
+ interrupt mask.
+
+ Arguments:
+ This - Protocol instance pointer.
+
+ Returns:
+ EFI_SUCCESS - 8259 programmed
+ EFI_DEVICE_ERROR - Error writting to 8259
+
+**/
+// TODO: LegacyMask - add argument and description to function comment
+// TODO: LegacyEdgeLevel - add argument and description to function comment
+// TODO: ProtectedMask - add argument and description to function comment
+// TODO: ProtectedEdgeLevel - add argument and description to function comment
+{
+ if (LegacyMask != NULL) {
+ *LegacyMask = mLegacyModeMask;
+ }
+
+ if (LegacyEdgeLevel != NULL) {
+ *LegacyEdgeLevel = mLegacyModeEdgeLevel;
+ }
+
+ if (ProtectedMask != NULL) {
+ *ProtectedMask = mProtectedModeMask;
+ }
+
+ if (ProtectedEdgeLevel != NULL) {
+ *ProtectedEdgeLevel = mProtectedModeEdgeLevel;
+ }
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259SetMask (
+ IN EFI_LEGACY_8259_PROTOCOL * This,
+ IN UINT16 *LegacyMask, OPTIONAL
+ IN UINT16 *LegacyEdgeLevel, OPTIONAL
+ IN UINT16 *ProtectedMask, OPTIONAL
+ IN UINT16 *ProtectedEdgeLevel OPTIONAL
+ )
+/**
+
+ Routine Description:
+ Set the 8259 interrupt and edge/level masks for legacy and/or protected
+ mode operation. This routine does not touch the hardware but only the
+ RAM copies of the masks.
+
+ Arguments:
+ This - Protocol instance pointer.
+
+ Returns:
+ EFI_SUCCESS - 8259 masks updated
+
+**/
+// TODO: LegacyMask - add argument and description to function comment
+// TODO: LegacyEdgeLevel - add argument and description to function comment
+// TODO: ProtectedMask - add argument and description to function comment
+// TODO: ProtectedEdgeLevel - add argument and description to function comment
+{
+ if (LegacyMask != NULL) {
+ mLegacyModeMask = *LegacyMask;
+ }
+
+ if (LegacyEdgeLevel != NULL) {
+ mLegacyModeEdgeLevel = *LegacyEdgeLevel;
+ }
+
+ if (ProtectedMask != NULL) {
+ mProtectedModeMask = *ProtectedMask;
+ }
+
+ if (ProtectedEdgeLevel != NULL) {
+ mProtectedModeEdgeLevel = *ProtectedEdgeLevel;
+ }
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259SetMode (
+ IN EFI_LEGACY_8259_PROTOCOL * This,
+ IN EFI_8259_MODE Mode,
+ IN UINT16 *Mask, OPTIONAL
+ IN UINT16 *EdgeLevel OPTIONAL
+ )
+/**
+
+ Routine Description:
+ Set the 8259 master and slave address that maps IRQ to processor interrupt
+ vector number. Restore the Context of the device, so that the interrupt
+ mask is put back in it's previous mode.
+
+ Arguments:
+ This - Protocol instance pointer.
+ Mode -
+ Mask -
+
+ Returns:
+ EFI_SUCCESS - 8259 programmed
+ EFI_DEVICE_ERROR - Error writting to 8259
+
+**/
+// TODO: EdgeLevel - add argument and description to function comment
+// TODO: EFI_INVALID_PARAMETER - add return value to function comment
+{
+ if (Mode == mMode) {
+ return EFI_SUCCESS;
+ }
+
+ if (Mode == Efi8259LegacyMode) {
+ //
+ // Save the protected mode mask
+ //
+ Interrupt8259ReadMask (&mProtectedModeMask, &mProtectedModeEdgeLevel);
+
+ if (Mask != NULL) {
+ //
+ // Update the Mask for the new mode
+ //
+ mLegacyModeMask = *Mask;
+ }
+
+ if (EdgeLevel != NULL) {
+ //
+ // Update the Edge/Level triggered mask for the new mode
+ //
+ mLegacyModeEdgeLevel = *EdgeLevel;
+ }
+
+ mMode = Mode;
+
+ //
+ // Set 8259 Vector Base
+ //
+ //
+ Interrupt8259SetVectorBase (This, LEGACY_MODE_BASE_VECTOR_MASTER, LEGACY_MODE_BASE_VECTOR_SLAVE);
+
+ //
+ // Enable Interrupts
+ //
+ Interrupt8259WriteMask (mLegacyModeMask, mLegacyModeEdgeLevel);
+
+ return EFI_SUCCESS;
+ }
+
+ if (Mode == Efi8259ProtectedMode) {
+ //
+ // Save the legacy mode mask
+ //
+ Interrupt8259ReadMask (&mLegacyModeMask, &mLegacyModeEdgeLevel);
+ //
+ // Always force Timer to be enabled after return from 16-bit code.
+ // This always insures that on next entry, timer is counting.
+ //
+ mLegacyModeMask &= 0xFFFE;
+
+ if (Mask != NULL) {
+ //
+ // Update the Mask for the new mode
+ //
+ mProtectedModeMask = *Mask;
+ }
+
+ if (EdgeLevel != NULL) {
+ //
+ // Update the Edge/Level triggered mask for the new mode
+ //
+ mProtectedModeEdgeLevel = *EdgeLevel;
+ }
+
+ mMode = Mode;
+
+ //
+ // Set 8259 Vector Base
+ //
+ //
+ Interrupt8259SetVectorBase (This, PROTECTED_MODE_BASE_VECTOR_MASTER, PROTECTED_MODE_BASE_VECTOR_SLAVE);
+
+ //
+ // Enable Interrupts
+ //
+ Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel);
+
+ return EFI_SUCCESS;
+ }
+
+ return EFI_INVALID_PARAMETER;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259GetVector (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq,
+ OUT UINT8 *Vector
+ )
+/**
+
+ Routine Description:
+ Convert from IRQ to processor interrupt vector number.
+
+ Arguments:
+ This - Protocol instance pointer.
+ Irq - 8259 IRQ0 - IRQ15
+ Vector - Processor vector number that matches Irq
+
+ Returns:
+ EFI_SUCCESS - The Vector matching Irq is returned
+ EFI_INVALID_PARAMETER - Irq not valid
+
+**/
+{
+ if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Irq <= Efi8259Irq7) {
+ *Vector = (UINT8) (mMasterBase + Irq);
+ } else {
+ *Vector = (UINT8) (mSlaveBase + (Irq - Efi8259Irq8));
+ }
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259EnableIrq (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq,
+ IN BOOLEAN LevelTriggered
+ )
+/**
+
+ Routine Description:
+ Enable Irq by unmasking interrupt in 8259
+
+ Arguments:
+ This - Protocol instance pointer.
+ Irq - 8259 IRQ0 - IRQ15
+
+ Returns:
+ EFI_SUCCESS - Irq enabled on 8259
+ EFI_INVALID_PARAMETER - Irq not valid
+
+**/
+// TODO: LevelTriggered - add argument and description to function comment
+{
+ if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ mProtectedModeMask &= ~(1 << Irq);
+ if (LevelTriggered) {
+ mProtectedModeEdgeLevel |= (1 << Irq);
+ } else {
+ mProtectedModeEdgeLevel &= ~(1 << Irq);
+ }
+
+ Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel);
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259DisableIrq (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq
+ )
+/**
+
+ Routine Description:
+ Disable Irq by masking interrupt in 8259
+
+ Arguments:
+ This - Protocol instance pointer.
+ Irq - 8259 IRQ0 - IRQ15
+
+ Returns:
+ EFI_SUCCESS - Irq disabled on 8259
+ EFI_INVALID_PARAMETER - Irq not valid
+
+**/
+{
+ if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ mProtectedModeMask |= (1 << Irq);
+ mProtectedModeEdgeLevel &= ~(1 << Irq);
+
+ Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel);
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259GetInterruptLine (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_HANDLE PciHandle,
+ OUT UINT8 *Vector
+ )
+/**
+
+ Routine Description:
+ 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.
+
+ Arguments:
+ This - Protocol instance pointer.
+ PciHandle - PCI function to return vector for
+ Vector - Vector for fucntion that matches
+
+ Returns:
+ EFI_SUCCESS - A valid Vector is returned
+ EFI_INVALID_PARAMETER - PciHandle not valid
+
+**/
+{
+ return EFI_UNSUPPORTED;
+}
+
+EFI_STATUS
+EFIAPI
+Interrupt8259EndOfInterrupt (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq
+ )
+/**
+
+ Routine Description:
+ Send an EOI to 8259
+
+ Arguments:
+ This - Protocol instance pointer.
+ Irq - 8259 IRQ0 - IRQ15
+
+ Returns:
+ EFI_SUCCESS - EOI successfully sent to 8259
+ EFI_INVALID_PARAMETER - Irq not valid
+
+**/
+{
+ if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Irq >= Efi8259Irq8) {
+ IoWrite8 (LEGACY_8259_CONTROL_REGISTER_SLAVE, LEGACY_8259_EOI);
+ }
+
+ IoWrite8 (LEGACY_8259_CONTROL_REGISTER_MASTER, LEGACY_8259_EOI);
+
+ return EFI_SUCCESS;
+}
+
+//
+// Legacy 8259 Driver Entry Point
+//
+EFI_STATUS
+EFIAPI
+Install8259 (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+/**
+
+Routine Description:
+
+
+Arguments:
+
+ (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
+
+Returns:
+
+ EFI_SUCCESS - Legacy 8259 Protocol Installed
+
+**/
+// TODO: ImageHandle - add argument and description to function comment
+// TODO: SystemTable - add argument and description to function comment
+{
+ EFI_STATUS Status;
+ EFI_8259_IRQ Irq;
+
+ //
+ // Find the CPU I/O Protocol
+ //
+ Status = gBS->LocateProtocol (&gEfiCpuIoProtocolGuid, NULL, (VOID **) &mCpuIo);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Clear all pending interrupt
+ //
+ for (Irq = Efi8259Irq0; Irq <= Efi8259Irq15; Irq++) {
+ Interrupt8259EndOfInterrupt (&m8259, Irq);
+ }
+
+ //
+ // Set the 8259 Master base to 0x68 and the 8259 Slave base to 0x70
+ //
+ Status = Interrupt8259SetVectorBase (&m8259, PROTECTED_MODE_BASE_VECTOR_MASTER, PROTECTED_MODE_BASE_VECTOR_SLAVE);
+
+ //
+ // Set all 8259 interrupts to edge triggered and disabled
+ //
+ Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel);
+
+ //
+ // Install 8259 Protocol onto a new handle
+ //
+ Status = gBS->InstallProtocolInterface (
+ &m8259Handle,
+ &gEfiLegacy8259ProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &m8259
+ );
+
+ return Status;
+}
+
diff --git a/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.dxs b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.dxs new file mode 100644 index 0000000000..e2c384524f --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.dxs @@ -0,0 +1,28 @@ +/*++
+
+Copyright (c) 2005, Intel Corporation
+All rights reserved. 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.
+
+Module Name:
+
+ 8259.dxs
+
+Abstract:
+ Dependency expression source file.
+
+--*/
+
+#include "EfiDepex.h"
+
+#include EFI_PROTOCOL_DEFINITION (CpuIo)
+
+DEPENDENCY_START
+ EFI_CPU_IO_PROTOCOL_GUID
+DEPENDENCY_END
+
diff --git a/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.h b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.h new file mode 100644 index 0000000000..18bd37bddd --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.h @@ -0,0 +1,293 @@ +/**
+
+Copyright (c) 2005, Intel Corporation
+All rights reserved. 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.
+
+Module Name:
+ 8259.h
+
+Abstract:
+
+ Driver implementing the Tiano Legacy 8259 Protocol
+
+**/
+
+#ifndef _8259_H__
+#define _8259_H__
+
+#include <FrameworkDxe.h>
+
+#include <Protocol/CpuIo.h>
+#include <Protocol/Legacy8259.h>
+
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+
+//
+// 8259 Hardware definitions
+//
+#define LEGACY_MODE_BASE_VECTOR_MASTER 0x08
+#define LEGACY_MODE_BASE_VECTOR_SLAVE 0x70
+
+#define PROTECTED_MODE_BASE_VECTOR_MASTER 0x68
+#define PROTECTED_MODE_BASE_VECTOR_SLAVE 0x70
+
+#define LEGACY_8259_CONTROL_REGISTER_MASTER 0x20
+#define LEGACY_8259_MASK_REGISTER_MASTER 0x21
+#define LEGACY_8259_CONTROL_REGISTER_SLAVE 0xA0
+#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1
+#define LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER 0x4D0
+#define LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE 0x4D1
+
+#define LEGACY_8259_EOI 0x20
+
+//
+// Protocol Function Prototypes
+//
+EFI_STATUS
+EFIAPI
+Interrupt8259SetVectorBase (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN UINT8 MasterBase,
+ IN UINT8 SlaveBase
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ MasterBase - TODO: add argument description
+ SlaveBase - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259GetMask (
+ IN EFI_LEGACY_8259_PROTOCOL * This,
+ OUT UINT16 *LegacyMask, OPTIONAL
+ OUT UINT16 *LegacyEdgeLevel, OPTIONAL
+ OUT UINT16 *ProtectedMask, OPTIONAL
+ OUT UINT16 *ProtectedEdgeLevel OPTIONAL
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ LegacyMask - TODO: add argument description
+ LegacyEdgeLevel - TODO: add argument description
+ ProtectedMask - TODO: add argument description
+ ProtectedEdgeLevel - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259SetMask (
+ IN EFI_LEGACY_8259_PROTOCOL * This,
+ IN UINT16 *LegacyMask, OPTIONAL
+ IN UINT16 *LegacyEdgeLevel, OPTIONAL
+ IN UINT16 *ProtectedMask, OPTIONAL
+ IN UINT16 *ProtectedEdgeLevel OPTIONAL
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ LegacyMask - TODO: add argument description
+ LegacyEdgeLevel - TODO: add argument description
+ ProtectedMask - TODO: add argument description
+ ProtectedEdgeLevel - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259SetMode (
+ IN EFI_LEGACY_8259_PROTOCOL * This,
+ IN EFI_8259_MODE Mode,
+ IN UINT16 *Mask, OPTIONAL
+ IN UINT16 *EdgeLevel OPTIONAL
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Mode - TODO: add argument description
+ Mask - TODO: add argument description
+ EdgeLevel - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259GetVector (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq,
+ OUT UINT8 *Vector
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Irq - TODO: add argument description
+ Vector - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259EnableIrq (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq,
+ IN BOOLEAN LevelTriggered
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Irq - TODO: add argument description
+ LevelTriggered - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259DisableIrq (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Irq - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259GetInterruptLine (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_HANDLE PciHandle,
+ OUT UINT8 *Vector
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ PciHandle - TODO: add argument description
+ Vector - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+EFI_STATUS
+EFIAPI
+Interrupt8259EndOfInterrupt (
+ IN EFI_LEGACY_8259_PROTOCOL *This,
+ IN EFI_8259_IRQ Irq
+ )
+/**
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Irq - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+**/
+;
+
+#endif
diff --git a/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.inf b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.inf new file mode 100644 index 0000000000..9887bbf10b --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/Legacy8259Dxe/8259.inf @@ -0,0 +1,50 @@ +#/*++
+#
+# Copyright (c) 2005, Intel Corporation
+# All rights reserved. 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.
+#
+# Module Name:
+#
+# 8259.inf
+#
+# Abstract:
+#
+#--*/
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = Legacy8259
+ FILE_GUID = 79CA4208-BBA1-4a9a-8456-E1E66A81484E
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ EDK_RELEASE_VERSION = 0x00020000
+ EFI_SPECIFICATION_VERSION = 0x00020000
+
+ ENTRY_POINT = Install8259
+
+[Packages]
+ MdePkg/MdePkg.dec
+ IntelFrameworkPkg/IntelFrameworkPkg.dec
+ IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
+
+[LibraryClasses]
+ UefiBootServicesTableLib
+ DebugLib
+ UefiDriverEntryPoint
+
+[Sources.common]
+ 8259.c
+ 8259.h
+
+[Protocols]
+ gEfiLegacy8259ProtocolGuid
+ gEfiCpuIoProtocolGuid
+
+[Depex]
+ gEfiCpuIoProtocolGuid
\ No newline at end of file |