OvmfPkg: CsmSupportLib: Set/use platform specific legacy interrupt device

Use a PCD set from PEI to determine the legacy interrupt device
number appropriate for the underlying platform type during protocol
initialization.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Gabriel Somlo <somlo@cmu.edu>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16375 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Gabriel Somlo 2014-11-14 00:38:00 +00:00 committed by jljusten
parent d55004dac9
commit 72a1100171
3 changed files with 34 additions and 3 deletions

View File

@ -38,6 +38,9 @@
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
[Pcd]
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
[Protocols]
gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiDiskInfoProtocolGuid # PROTOCOL ALWAYS_CONSUMED

View File

@ -20,6 +20,11 @@
//
STATIC EFI_HANDLE mLegacyInterruptHandle = NULL;
//
// Legacy Interrupt Device number (0x01 on piix4, 0x1f on q35/mch)
//
STATIC UINT8 mLegacyInterruptDevice;
//
// The Legacy Interrupt Protocol instance produced by this driver
//
@ -77,7 +82,7 @@ GetLocation (
)
{
*Bus = LEGACY_INT_BUS;
*Device = LEGACY_INT_DEV;
*Device = mLegacyInterruptDevice;
*Function = LEGACY_INT_FUNC;
return EFI_SUCCESS;
@ -98,7 +103,7 @@ GetAddress (
{
return PCI_LIB_ADDRESS(
LEGACY_INT_BUS,
LEGACY_INT_DEV,
mLegacyInterruptDevice,
LEGACY_INT_FUNC,
PirqReg[PirqNumber]
);
@ -173,6 +178,7 @@ LegacyInterruptInstall (
VOID
)
{
UINT16 HostBridgeDevId;
EFI_STATUS Status;
//
@ -180,6 +186,24 @@ LegacyInterruptInstall (
//
ASSERT_PROTOCOL_ALREADY_INSTALLED(NULL, &gEfiLegacyInterruptProtocolGuid);
//
// Query Host Bridge DID to determine platform type, then set device number
//
HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
switch (HostBridgeDevId) {
case INTEL_82441_DEVICE_ID:
mLegacyInterruptDevice = LEGACY_INT_DEV_PIIX4;
break;
case INTEL_Q35_MCH_DEVICE_ID:
mLegacyInterruptDevice = LEGACY_INT_DEV_Q35;
break;
default:
DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__, HostBridgeDevId));
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
//
// Make a new handle and install the protocol
//

View File

@ -20,12 +20,16 @@
#include <Protocol/LegacyInterrupt.h>
#include <Library/PcdLib.h>
#include <Library/PciLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <OvmfPlatforms.h>
#define LEGACY_INT_BUS 0
#define LEGACY_INT_DEV 1
#define LEGACY_INT_DEV_PIIX4 0x01
#define LEGACY_INT_DEV_Q35 0x1f
#define LEGACY_INT_FUNC 0
#define PIRQN 0x00 // PIRQ Null