From 72a1100171a627ce26789c193ca7036eb8a5364a Mon Sep 17 00:00:00 2001 From: Gabriel Somlo Date: Fri, 14 Nov 2014 00:38:00 +0000 Subject: 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 Reviewed-by: Paolo Bonzini Reviewed-by: Jordan Justen Reviewed-by: Gerd Hoffmann Reviewed-by: Laszlo Ersek git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16375 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf | 3 +++ OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c | 28 ++++++++++++++++++++++++++-- OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h | 6 +++++- 3 files changed, 34 insertions(+), 3 deletions(-) (limited to 'OvmfPkg/Csm/CsmSupportLib') diff --git a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf b/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf index 34cadb2b65..1f16646f1b 100644 --- a/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf +++ b/OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf @@ -38,6 +38,9 @@ MdePkg/MdePkg.dec IntelFrameworkPkg/IntelFrameworkPkg.dec +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId + [Protocols] gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEfiDiskInfoProtocolGuid # PROTOCOL ALWAYS_CONSUMED diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c b/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c index cd984174ab..328a432b6c 100644 --- a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c +++ b/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.c @@ -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 // diff --git a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h b/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h index 193e48bad2..eb1f583007 100644 --- a/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h +++ b/OvmfPkg/Csm/CsmSupportLib/LegacyInterrupt.h @@ -20,12 +20,16 @@ #include +#include #include #include #include +#include + #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 -- cgit v1.2.3