--- /dev/null
+/** @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
--- /dev/null
+/** @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