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