-/**@file\r
+/** @file\r
This contains the installation function for the driver.\r
\r
-Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
//\r
// Global for the Legacy 8259 Protocol that is produced by this driver\r
//\r
-EFI_LEGACY_8259_PROTOCOL m8259 = {\r
+EFI_LEGACY_8259_PROTOCOL mInterrupt8259 = {\r
Interrupt8259SetVectorBase,\r
Interrupt8259GetMask,\r
Interrupt8259SetMask,\r
UINT8 mSlaveBase = 0xff;\r
EFI_8259_MODE mMode = Efi8259ProtectedMode;\r
UINT16 mProtectedModeMask = 0xffff;\r
-UINT16 mLegacyModeMask = FixedPcdGet16(Pcd8259LegacyModeMask);\r
+UINT16 mLegacyModeMask;\r
UINT16 mProtectedModeEdgeLevel = 0x0000;\r
-UINT16 mLegacyModeEdgeLevel = FixedPcdGet16(Pcd8259LegacyModeEdgeLevel);\r
+UINT16 mLegacyModeEdgeLevel;\r
\r
//\r
// Worker Functions\r
IN UINT8 SlaveBase\r
)\r
{\r
- UINT8 Mask;\r
+ UINT8 Mask;\r
+ EFI_TPL OriginalTpl;\r
\r
+ OriginalTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
//\r
// Set vector base for slave PIC\r
//\r
\r
//\r
// Preserve interrtup mask register before initialization sequence\r
- // because it will be cleared during intialization\r
+ // because it will be cleared during initialization\r
//\r
Mask = IoRead8 (LEGACY_8259_MASK_REGISTER_SLAVE);\r
\r
\r
//\r
// Preserve interrtup mask register before initialization sequence\r
- // because it will be cleared during intialization\r
+ // because it will be cleared during initialization\r
//\r
Mask = IoRead8 (LEGACY_8259_MASK_REGISTER_MASTER);\r
\r
\r
IoWrite8 (LEGACY_8259_CONTROL_REGISTER_SLAVE, LEGACY_8259_EOI);\r
IoWrite8 (LEGACY_8259_CONTROL_REGISTER_MASTER, LEGACY_8259_EOI);\r
+ \r
+ gBS->RestoreTPL (OriginalTpl);\r
\r
return EFI_SUCCESS;\r
}\r
OUT UINT8 *Vector\r
)\r
{\r
- if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {\r
+ if ((UINT32)Irq > Efi8259Irq15) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
IN BOOLEAN LevelTriggered\r
)\r
{\r
- if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {\r
+ if ((UINT32)Irq > Efi8259Irq15) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
IN EFI_8259_IRQ Irq\r
)\r
{\r
- if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {\r
+ if ((UINT32)Irq > Efi8259Irq15) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
IN EFI_8259_IRQ Irq\r
)\r
{\r
- if (Irq < Efi8259Irq0 || Irq > Efi8259Irq15) {\r
+ if ((UINT32)Irq > Efi8259Irq15) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
EFI_STATUS Status;\r
EFI_8259_IRQ Irq;\r
\r
+ //\r
+ // Initialze mask values from PCDs\r
+ //\r
+ mLegacyModeMask = PcdGet16 (Pcd8259LegacyModeMask);\r
+ mLegacyModeEdgeLevel = PcdGet16 (Pcd8259LegacyModeEdgeLevel);\r
+\r
//\r
// Clear all pending interrupt\r
//\r
for (Irq = Efi8259Irq0; Irq <= Efi8259Irq15; Irq++) {\r
- Interrupt8259EndOfInterrupt (&m8259, Irq);\r
+ Interrupt8259EndOfInterrupt (&mInterrupt8259, Irq);\r
}\r
\r
//\r
// Set the 8259 Master base to 0x68 and the 8259 Slave base to 0x70\r
//\r
- Status = Interrupt8259SetVectorBase (&m8259, PROTECTED_MODE_BASE_VECTOR_MASTER, PROTECTED_MODE_BASE_VECTOR_SLAVE);\r
+ Status = Interrupt8259SetVectorBase (&mInterrupt8259, PROTECTED_MODE_BASE_VECTOR_MASTER, PROTECTED_MODE_BASE_VECTOR_SLAVE);\r
\r
//\r
// Set all 8259 interrupts to edge triggered and disabled\r
&m8259Handle,\r
&gEfiLegacy8259ProtocolGuid,\r
EFI_NATIVE_INTERFACE,\r
- &m8259\r
+ &mInterrupt8259\r
);\r
return Status;\r
}\r