]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/CpuHotplugSmm: add hotplug register block helper functions
authorLaszlo Ersek <lersek@redhat.com>
Wed, 26 Feb 2020 22:11:47 +0000 (23:11 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 4 Mar 2020 12:22:07 +0000 (12:22 +0000)
Add a handful of simple functions for accessing QEMU's hotplug registers
more conveniently. These functions thinly wrap some of the registers
described in "docs/specs/acpi_cpu_hotplug.txt" in the QEMU tree. The
functions hang (by design) if they encounter an internal failure.

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1512
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20200226221156.29589-8-lersek@redhat.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com>
Tested-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf
OvmfPkg/CpuHotplugSmm/QemuCpuhp.c [new file with mode: 0644]
OvmfPkg/CpuHotplugSmm/QemuCpuhp.h [new file with mode: 0644]

index fa70858a8dab1e5452eab7a9dfa92fc7096d9516..ac4ca4c1f4f2c0eb39168e28d20ff4995321677c 100644 (file)
@@ -23,6 +23,8 @@
 \r
 [Sources]\r
   CpuHotplug.c\r
+  QemuCpuhp.c\r
+  QemuCpuhp.h\r
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
diff --git a/OvmfPkg/CpuHotplugSmm/QemuCpuhp.c b/OvmfPkg/CpuHotplugSmm/QemuCpuhp.c
new file mode 100644 (file)
index 0000000..31e46f5
--- /dev/null
@@ -0,0 +1,136 @@
+/** @file\r
+  Simple wrapper functions that access QEMU's modern CPU hotplug register\r
+  block.\r
+\r
+  These functions thinly wrap some of the registers described in\r
+  "docs/specs/acpi_cpu_hotplug.txt" in the QEMU source. IO Ports are accessed\r
+  via EFI_MM_CPU_IO_PROTOCOL. If a protocol call fails, these functions don't\r
+  return.\r
+\r
+  Copyright (c) 2020, Red Hat, Inc.\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+**/\r
+\r
+#include <IndustryStandard/Q35MchIch9.h>     // ICH9_CPU_HOTPLUG_BASE\r
+#include <IndustryStandard/QemuCpuHotplug.h> // QEMU_CPUHP_R_CMD_DATA2\r
+#include <Library/BaseLib.h>                 // CpuDeadLoop()\r
+#include <Library/DebugLib.h>                // DEBUG()\r
+\r
+#include "QemuCpuhp.h"\r
+\r
+UINT32\r
+QemuCpuhpReadCommandData2 (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo\r
+  )\r
+{\r
+  UINT32     CommandData2;\r
+  EFI_STATUS Status;\r
+\r
+  CommandData2 = 0;\r
+  Status = MmCpuIo->Io.Read (\r
+                         MmCpuIo,\r
+                         MM_IO_UINT32,\r
+                         ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_R_CMD_DATA2,\r
+                         1,\r
+                         &CommandData2\r
+                         );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status));\r
+    ASSERT (FALSE);\r
+    CpuDeadLoop ();\r
+  }\r
+  return CommandData2;\r
+}\r
+\r
+UINT8\r
+QemuCpuhpReadCpuStatus (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo\r
+  )\r
+{\r
+  UINT8      CpuStatus;\r
+  EFI_STATUS Status;\r
+\r
+  CpuStatus = 0;\r
+  Status = MmCpuIo->Io.Read (\r
+                         MmCpuIo,\r
+                         MM_IO_UINT8,\r
+                         ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_R_CPU_STAT,\r
+                         1,\r
+                         &CpuStatus\r
+                         );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status));\r
+    ASSERT (FALSE);\r
+    CpuDeadLoop ();\r
+  }\r
+  return CpuStatus;\r
+}\r
+\r
+UINT32\r
+QemuCpuhpReadCommandData (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo\r
+  )\r
+{\r
+  UINT32     CommandData;\r
+  EFI_STATUS Status;\r
+\r
+  CommandData = 0;\r
+  Status = MmCpuIo->Io.Read (\r
+                         MmCpuIo,\r
+                         MM_IO_UINT32,\r
+                         ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_RW_CMD_DATA,\r
+                         1,\r
+                         &CommandData\r
+                         );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status));\r
+    ASSERT (FALSE);\r
+    CpuDeadLoop ();\r
+  }\r
+  return CommandData;\r
+}\r
+\r
+VOID\r
+QemuCpuhpWriteCpuSelector (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo,\r
+  IN UINT32                       Selector\r
+  )\r
+{\r
+  EFI_STATUS Status;\r
+\r
+  Status = MmCpuIo->Io.Write (\r
+                         MmCpuIo,\r
+                         MM_IO_UINT32,\r
+                         ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_W_CPU_SEL,\r
+                         1,\r
+                         &Selector\r
+                         );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status));\r
+    ASSERT (FALSE);\r
+    CpuDeadLoop ();\r
+  }\r
+}\r
+\r
+VOID\r
+QemuCpuhpWriteCommand (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo,\r
+  IN UINT8                        Command\r
+  )\r
+{\r
+  EFI_STATUS Status;\r
+\r
+  Status = MmCpuIo->Io.Write (\r
+                         MmCpuIo,\r
+                         MM_IO_UINT8,\r
+                         ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_W_CMD,\r
+                         1,\r
+                         &Command\r
+                         );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status));\r
+    ASSERT (FALSE);\r
+    CpuDeadLoop ();\r
+  }\r
+}\r
diff --git a/OvmfPkg/CpuHotplugSmm/QemuCpuhp.h b/OvmfPkg/CpuHotplugSmm/QemuCpuhp.h
new file mode 100644 (file)
index 0000000..82f88f0
--- /dev/null
@@ -0,0 +1,47 @@
+/** @file\r
+  Simple wrapper functions that access QEMU's modern CPU hotplug register\r
+  block.\r
+\r
+  These functions thinly wrap some of the registers described in\r
+  "docs/specs/acpi_cpu_hotplug.txt" in the QEMU source. IO Ports are accessed\r
+  via EFI_MM_CPU_IO_PROTOCOL. If a protocol call fails, these functions don't\r
+  return.\r
+\r
+  Copyright (c) 2020, Red Hat, Inc.\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+**/\r
+\r
+#ifndef QEMU_CPUHP_H_\r
+#define QEMU_CPUHP_H_\r
+\r
+#include <Protocol/MmCpuIo.h>  // EFI_MM_CPU_IO_PROTOCOL\r
+\r
+UINT32\r
+QemuCpuhpReadCommandData2 (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo\r
+  );\r
+\r
+UINT8\r
+QemuCpuhpReadCpuStatus (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo\r
+  );\r
+\r
+UINT32\r
+QemuCpuhpReadCommandData (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo\r
+  );\r
+\r
+VOID\r
+QemuCpuhpWriteCpuSelector (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo,\r
+  IN UINT32                       Selector\r
+  );\r
+\r
+VOID\r
+QemuCpuhpWriteCommand (\r
+  IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo,\r
+  IN UINT8                        Command\r
+  );\r
+\r
+#endif // QEMU_CPUHP_H_\r