2 Simple wrapper functions that access QEMU's modern CPU hotplug register
5 These functions thinly wrap some of the registers described in
6 "docs/specs/acpi_cpu_hotplug.txt" in the QEMU source. IO Ports are accessed
7 via EFI_MM_CPU_IO_PROTOCOL. If a protocol call fails, these functions don't
10 Copyright (c) 2020, Red Hat, Inc.
12 SPDX-License-Identifier: BSD-2-Clause-Patent
15 #include <IndustryStandard/Q35MchIch9.h> // ICH9_CPU_HOTPLUG_BASE
16 #include <IndustryStandard/QemuCpuHotplug.h> // QEMU_CPUHP_R_CMD_DATA2
17 #include <Library/BaseLib.h> // CpuDeadLoop()
18 #include <Library/DebugLib.h> // DEBUG()
20 #include "QemuCpuhp.h"
23 QemuCpuhpReadCommandData2 (
24 IN CONST EFI_MM_CPU_IO_PROTOCOL
*MmCpuIo
31 Status
= MmCpuIo
->Io
.Read (
34 ICH9_CPU_HOTPLUG_BASE
+ QEMU_CPUHP_R_CMD_DATA2
,
38 if (EFI_ERROR (Status
)) {
39 DEBUG ((DEBUG_ERROR
, "%a: %r\n", __FUNCTION__
, Status
));
47 QemuCpuhpReadCpuStatus (
48 IN CONST EFI_MM_CPU_IO_PROTOCOL
*MmCpuIo
55 Status
= MmCpuIo
->Io
.Read (
58 ICH9_CPU_HOTPLUG_BASE
+ QEMU_CPUHP_R_CPU_STAT
,
62 if (EFI_ERROR (Status
)) {
63 DEBUG ((DEBUG_ERROR
, "%a: %r\n", __FUNCTION__
, Status
));
71 QemuCpuhpReadCommandData (
72 IN CONST EFI_MM_CPU_IO_PROTOCOL
*MmCpuIo
79 Status
= MmCpuIo
->Io
.Read (
82 ICH9_CPU_HOTPLUG_BASE
+ QEMU_CPUHP_RW_CMD_DATA
,
86 if (EFI_ERROR (Status
)) {
87 DEBUG ((DEBUG_ERROR
, "%a: %r\n", __FUNCTION__
, Status
));
95 QemuCpuhpWriteCpuSelector (
96 IN CONST EFI_MM_CPU_IO_PROTOCOL
*MmCpuIo
,
102 Status
= MmCpuIo
->Io
.Write (
105 ICH9_CPU_HOTPLUG_BASE
+ QEMU_CPUHP_W_CPU_SEL
,
109 if (EFI_ERROR (Status
)) {
110 DEBUG ((DEBUG_ERROR
, "%a: %r\n", __FUNCTION__
, Status
));
117 QemuCpuhpWriteCommand (
118 IN CONST EFI_MM_CPU_IO_PROTOCOL
*MmCpuIo
,
124 Status
= MmCpuIo
->Io
.Write (
127 ICH9_CPU_HOTPLUG_BASE
+ QEMU_CPUHP_W_CMD
,
131 if (EFI_ERROR (Status
)) {
132 DEBUG ((DEBUG_ERROR
, "%a: %r\n", __FUNCTION__
, Status
));