]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: Retrieve SMBIOS from Cloud Hypervisor
authorSebastien Boeuf <sebastien.boeuf@intel.com>
Fri, 10 Dec 2021 14:41:56 +0000 (22:41 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Sat, 11 Dec 2021 14:26:05 +0000 (14:26 +0000)
Add a fallback on the SMBIOS code to find the SMBIOS table for Cloud
Hypervisor if it couldn't be found for Qemu through fw_cfg.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Rob Bradford <robert.bradford@intel.com>
Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
OvmfPkg/Include/IndustryStandard/CloudHv.h
OvmfPkg/SmbiosPlatformDxe/CloudHv.c [new file with mode: 0644]
OvmfPkg/SmbiosPlatformDxe/EntryPoint.c
OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h
OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf

index 1155335690b77a7f7a239f8093712c1915e16661..d31ecc9eec93738198f3c6e474b812147d53dfc8 100644 (file)
@@ -33,4 +33,9 @@
 //\r
 #define CLOUDHV_MMIO_HOLE_SIZE  0x38000000\r
 \r
+//\r
+// SMBIOS address\r
+//\r
+#define CLOUDHV_SMBIOS_ADDRESS  0xf0000\r
+\r
 #endif // __CLOUDHV_H__\r
diff --git a/OvmfPkg/SmbiosPlatformDxe/CloudHv.c b/OvmfPkg/SmbiosPlatformDxe/CloudHv.c
new file mode 100644 (file)
index 0000000..792e4ae
--- /dev/null
@@ -0,0 +1,33 @@
+/** @file\r
+  Find Cloud Hypervisor SMBIOS data.\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+**/\r
+\r
+#include <IndustryStandard/CloudHv.h> // CLOUDHV_SMBIOS_ADDRESS\r
+#include <IndustryStandard/SmBios.h>  // SMBIOS_TABLE_3_0_ENTRY_POINT\r
+\r
+/**\r
+  Locates and extracts Cloud Hypervisor SMBIOS data\r
+\r
+  @return                 Address of extracted Cloud Hypervisor SMBIOS data\r
+\r
+**/\r
+UINT8 *\r
+GetCloudHvSmbiosTables (\r
+  VOID\r
+  )\r
+{\r
+  SMBIOS_TABLE_3_0_ENTRY_POINT  *CloudHvTables = (VOID *)CLOUDHV_SMBIOS_ADDRESS;\r
+\r
+  if ((CloudHvTables->AnchorString[0] == '_') &&\r
+      (CloudHvTables->AnchorString[1] == 'S') &&\r
+      (CloudHvTables->AnchorString[2] == 'M') &&\r
+      (CloudHvTables->AnchorString[3] == '3') &&\r
+      (CloudHvTables->AnchorString[4] == '_'))\r
+  {\r
+    return (UINT8 *)(UINTN)CloudHvTables->TableAddress;\r
+  }\r
+\r
+  return NULL;\r
+}\r
index f53af2b2e63554d426f8036bd049d81120d01cfb..e55d135504c1792725a395df8e3f10be4ca6319e 100644 (file)
@@ -5,6 +5,7 @@
 **/\r
 \r
 #include <Library/MemoryAllocationLib.h> // FreePool()\r
+#include <OvmfPlatforms.h>               // CLOUDHV_DEVICE_ID\r
 \r
 #include "SmbiosPlatformDxe.h"\r
 \r
@@ -27,15 +28,24 @@ SmbiosTablePublishEntry (
 {\r
   EFI_STATUS  Status;\r
   UINT8       *SmbiosTables;\r
+  UINT16      HostBridgeDevId;\r
 \r
   Status = EFI_NOT_FOUND;\r
   //\r
-  // Add QEMU SMBIOS data if found\r
+  // Add SMBIOS data if found\r
   //\r
-  SmbiosTables = GetQemuSmbiosTables ();\r
-  if (SmbiosTables != NULL) {\r
-    Status = InstallAllStructures (SmbiosTables);\r
-    FreePool (SmbiosTables);\r
+  HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);\r
+  if (HostBridgeDevId == CLOUDHV_DEVICE_ID) {\r
+    SmbiosTables = GetCloudHvSmbiosTables ();\r
+    if (SmbiosTables != NULL) {\r
+      Status = InstallAllStructures (SmbiosTables);\r
+    }\r
+  } else {\r
+    SmbiosTables = GetQemuSmbiosTables ();\r
+    if (SmbiosTables != NULL) {\r
+      Status = InstallAllStructures (SmbiosTables);\r
+      FreePool (SmbiosTables);\r
+    }\r
   }\r
 \r
   return Status;\r
index b7bf004be9dacec1fb8a65cb011f80d0bc4df2ee..709e096e7b77c2d927c35e00939b85596fbcb3a9 100644 (file)
@@ -33,4 +33,15 @@ GetQemuSmbiosTables (
   VOID\r
   );\r
 \r
+/**\r
+  Locates and extracts Cloud Hypervisor SMBIOS data\r
+\r
+  @return                 Address of extracted Cloud Hypervisor SMBIOS data\r
+\r
+**/\r
+UINT8 *\r
+GetCloudHvSmbiosTables (\r
+  VOID\r
+  );\r
+\r
 #endif\r
index e239a631f2a6a97e7d95ff77e6b1c7793aebfee6..0066bbc9229c95fbc8e3cb4df1d3edb417e2b055 100644 (file)
@@ -24,6 +24,7 @@
 #\r
 \r
 [Sources]\r
+  CloudHv.c\r
   EntryPoint.c\r
   Qemu.c\r
   SmbiosPlatformDxe.c\r
@@ -42,6 +43,7 @@
   UefiDriverEntryPoint\r
 \r
 [Pcd]\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId\r
   gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated\r
 \r
 [Protocols]\r