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.biesheu...@linaro.org> Cc: Igor Mammedov <imamm...@redhat.com> Cc: Jiewen Yao <jiewen....@intel.com> Cc: Jordan Justen <jordan.l.jus...@intel.com> Cc: Michael Kinney <michael.d.kin...@intel.com> Cc: Philippe Mathieu-Daudé <phi...@redhat.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1512 Signed-off-by: Laszlo Ersek <ler...@redhat.com> --- OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf | 2 + OvmfPkg/CpuHotplugSmm/QemuCpuhp.h | 47 +++++++ OvmfPkg/CpuHotplugSmm/QemuCpuhp.c | 136 ++++++++++++++++++++ 3 files changed, 185 insertions(+) diff --git a/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf b/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf index fa70858a8dab..ac4ca4c1f4f2 100644 --- a/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf +++ b/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf @@ -4,44 +4,46 @@ # Copyright (c) 2020, Red Hat, Inc. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## [Defines] INF_VERSION = 1.29 PI_SPECIFICATION_VERSION = 0x00010046 # PI-1.7.0 BASE_NAME = CpuHotplugSmm FILE_GUID = 84EEA114-C6BE-4445-8F90-51D97863E363 MODULE_TYPE = DXE_SMM_DRIVER ENTRY_POINT = CpuHotplugEntry # # The following information is for reference only and not required by the build # tools. # # VALID_ARCHITECTURES = IA32 X64 # [Sources] CpuHotplug.c + QemuCpuhp.c + QemuCpuhp.h [Packages] MdePkg/MdePkg.dec OvmfPkg/OvmfPkg.dec [LibraryClasses] BaseLib DebugLib MmServicesTableLib PcdLib UefiDriverEntryPoint [Protocols] gEfiMmCpuIoProtocolGuid ## CONSUMES [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase ## CONSUMES [FeaturePcd] gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire ## CONSUMES [Depex] diff --git a/OvmfPkg/CpuHotplugSmm/QemuCpuhp.h b/OvmfPkg/CpuHotplugSmm/QemuCpuhp.h new file mode 100644 index 000000000000..82f88f0b73bb --- /dev/null +++ b/OvmfPkg/CpuHotplugSmm/QemuCpuhp.h @@ -0,0 +1,47 @@ +/** @file + Simple wrapper functions that access QEMU's modern CPU hotplug register + block. + + These functions thinly wrap some of the registers described in + "docs/specs/acpi_cpu_hotplug.txt" in the QEMU source. IO Ports are accessed + via EFI_MM_CPU_IO_PROTOCOL. If a protocol call fails, these functions don't + return. + + Copyright (c) 2020, Red Hat, Inc. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef QEMU_CPUHP_H_ +#define QEMU_CPUHP_H_ + +#include <Protocol/MmCpuIo.h> // EFI_MM_CPU_IO_PROTOCOL + +UINT32 +QemuCpuhpReadCommandData2 ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo + ); + +UINT8 +QemuCpuhpReadCpuStatus ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo + ); + +UINT32 +QemuCpuhpReadCommandData ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo + ); + +VOID +QemuCpuhpWriteCpuSelector ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo, + IN UINT32 Selector + ); + +VOID +QemuCpuhpWriteCommand ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo, + IN UINT8 Command + ); + +#endif // QEMU_CPUHP_H_ diff --git a/OvmfPkg/CpuHotplugSmm/QemuCpuhp.c b/OvmfPkg/CpuHotplugSmm/QemuCpuhp.c new file mode 100644 index 000000000000..31e46f51934a --- /dev/null +++ b/OvmfPkg/CpuHotplugSmm/QemuCpuhp.c @@ -0,0 +1,136 @@ +/** @file + Simple wrapper functions that access QEMU's modern CPU hotplug register + block. + + These functions thinly wrap some of the registers described in + "docs/specs/acpi_cpu_hotplug.txt" in the QEMU source. IO Ports are accessed + via EFI_MM_CPU_IO_PROTOCOL. If a protocol call fails, these functions don't + return. + + Copyright (c) 2020, Red Hat, Inc. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <IndustryStandard/Q35MchIch9.h> // ICH9_CPU_HOTPLUG_BASE +#include <IndustryStandard/QemuCpuHotplug.h> // QEMU_CPUHP_R_CMD_DATA2 +#include <Library/BaseLib.h> // CpuDeadLoop() +#include <Library/DebugLib.h> // DEBUG() + +#include "QemuCpuhp.h" + +UINT32 +QemuCpuhpReadCommandData2 ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo + ) +{ + UINT32 CommandData2; + EFI_STATUS Status; + + CommandData2 = 0; + Status = MmCpuIo->Io.Read ( + MmCpuIo, + MM_IO_UINT32, + ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_R_CMD_DATA2, + 1, + &CommandData2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status)); + ASSERT (FALSE); + CpuDeadLoop (); + } + return CommandData2; +} + +UINT8 +QemuCpuhpReadCpuStatus ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo + ) +{ + UINT8 CpuStatus; + EFI_STATUS Status; + + CpuStatus = 0; + Status = MmCpuIo->Io.Read ( + MmCpuIo, + MM_IO_UINT8, + ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_R_CPU_STAT, + 1, + &CpuStatus + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status)); + ASSERT (FALSE); + CpuDeadLoop (); + } + return CpuStatus; +} + +UINT32 +QemuCpuhpReadCommandData ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo + ) +{ + UINT32 CommandData; + EFI_STATUS Status; + + CommandData = 0; + Status = MmCpuIo->Io.Read ( + MmCpuIo, + MM_IO_UINT32, + ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_RW_CMD_DATA, + 1, + &CommandData + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status)); + ASSERT (FALSE); + CpuDeadLoop (); + } + return CommandData; +} + +VOID +QemuCpuhpWriteCpuSelector ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo, + IN UINT32 Selector + ) +{ + EFI_STATUS Status; + + Status = MmCpuIo->Io.Write ( + MmCpuIo, + MM_IO_UINT32, + ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_W_CPU_SEL, + 1, + &Selector + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status)); + ASSERT (FALSE); + CpuDeadLoop (); + } +} + +VOID +QemuCpuhpWriteCommand ( + IN CONST EFI_MM_CPU_IO_PROTOCOL *MmCpuIo, + IN UINT8 Command + ) +{ + EFI_STATUS Status; + + Status = MmCpuIo->Io.Write ( + MmCpuIo, + MM_IO_UINT8, + ICH9_CPU_HOTPLUG_BASE + QEMU_CPUHP_W_CMD, + 1, + &Command + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, Status)); + ASSERT (FALSE); + CpuDeadLoop (); + } +} -- 2.19.1.3.g30247aa5d201 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#54738): https://edk2.groups.io/g/devel/message/54738 Mute This Topic: https://groups.io/mt/71494216/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-