141 lines
5.4 KiB
Diff
141 lines
5.4 KiB
Diff
From a5efebddb858c739d4a67865a4f8d836ba989d30 Mon Sep 17 00:00:00 2001
|
|
From: Laszlo Ersek <lersek@redhat.com>
|
|
Date: Tue, 14 Jul 2020 20:43:05 +0200
|
|
Subject: [PATCH 1/5] OvmfPkg/SmmControl2Dxe: negotiate
|
|
ICH9_LPC_SMI_F_CPU_HOTPLUG
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
RH-Author: Laszlo Ersek (lersek)
|
|
RH-MergeRequest: 1: [RHEL-8.4.0] complete the "VCPU hotplug with SMI" OVMF feature
|
|
RH-Commit: [1/3] 33d820d43a1be2ece09044b0cf105275f3fcc9ce (lersek/edk2)
|
|
RH-Bugzilla: 1849177
|
|
|
|
The ICH9_LPC_SMI_F_BROADCAST and ICH9_LPC_SMI_F_CPU_HOTPLUG feature flags
|
|
cause QEMU to behave as follows:
|
|
|
|
BROADCAST CPU_HOTPLUG use case / behavior
|
|
--------- ----------- ------------------------------------------------
|
|
clear clear OVMF built without SMM_REQUIRE; or very old OVMF
|
|
(from before commit a316d7ac91d3 / 2017-02-07).
|
|
QEMU permits CPU hotplug operations, and does
|
|
not cause the OS to inject an SMI upon hotplug.
|
|
Firmware is not expected to be aware of hotplug
|
|
events.
|
|
|
|
clear set Invalid feature set; QEMU rejects the feature
|
|
negotiation.
|
|
|
|
set clear OVMF after a316d7ac91d3 / 2017-02-07, built with
|
|
SMM_REQUIRE, but no support for CPU hotplug.
|
|
QEMU gracefully refuses hotplug operations.
|
|
|
|
set set OVMF after a316d7ac91d3 / 2017-02-07, built with
|
|
SMM_REQUIRE, and supporting CPU hotplug. QEMU
|
|
permits CPU hotplug operations, and causes the
|
|
OS to inject an SMI upon hotplug. Firmware is
|
|
expected to deal with hotplug events.
|
|
|
|
Negotiate ICH9_LPC_SMI_F_CPU_HOTPLUG -- but only if SEV is disabled, as
|
|
OvmfPkg/CpuHotplugSmm can't deal with SEV yet.
|
|
|
|
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
|
|
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
|
|
Cc: Igor Mammedov <imammedo@redhat.com>
|
|
Cc: Jordan Justen <jordan.l.justen@intel.com>
|
|
Cc: Liran Alon <liran.alon@oracle.com>
|
|
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
|
|
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
|
|
Message-Id: <20200714184305.9814-1-lersek@redhat.com>
|
|
Acked-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
|
|
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
|
(cherry picked from commit 5ba203b54e5953572e279e5505cd65e4cc360e34)
|
|
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
|
|
---
|
|
OvmfPkg/SmmControl2Dxe/SmiFeatures.c | 26 +++++++++++++++++++++--
|
|
OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf | 1 +
|
|
2 files changed, 25 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c
|
|
index 6210b7515e..c9d8755432 100644
|
|
--- a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c
|
|
+++ b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c
|
|
@@ -9,6 +9,7 @@
|
|
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/DebugLib.h>
|
|
+#include <Library/MemEncryptSevLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/QemuFwCfgLib.h>
|
|
@@ -21,6 +22,12 @@
|
|
// "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg files.
|
|
//
|
|
#define ICH9_LPC_SMI_F_BROADCAST BIT0
|
|
+//
|
|
+// The following bit value stands for "enable CPU hotplug, and inject an SMI
|
|
+// with control value ICH9_APM_CNT_CPU_HOTPLUG upon hotplug", in the
|
|
+// "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg files.
|
|
+//
|
|
+#define ICH9_LPC_SMI_F_CPU_HOTPLUG BIT1
|
|
|
|
//
|
|
// Provides a scratch buffer (allocated in EfiReservedMemoryType type memory)
|
|
@@ -67,6 +74,7 @@ NegotiateSmiFeatures (
|
|
UINTN SupportedFeaturesSize;
|
|
UINTN RequestedFeaturesSize;
|
|
UINTN FeaturesOkSize;
|
|
+ UINT64 RequestedFeaturesMask;
|
|
|
|
//
|
|
// Look up the fw_cfg files used for feature negotiation. The selector keys
|
|
@@ -104,9 +112,16 @@ NegotiateSmiFeatures (
|
|
QemuFwCfgReadBytes (sizeof mSmiFeatures, &mSmiFeatures);
|
|
|
|
//
|
|
- // We want broadcast SMI and nothing else.
|
|
+ // We want broadcast SMI, SMI on CPU hotplug, and nothing else.
|
|
//
|
|
- mSmiFeatures &= ICH9_LPC_SMI_F_BROADCAST;
|
|
+ RequestedFeaturesMask = ICH9_LPC_SMI_F_BROADCAST;
|
|
+ if (!MemEncryptSevIsEnabled ()) {
|
|
+ //
|
|
+ // For now, we only support hotplug with SEV disabled.
|
|
+ //
|
|
+ RequestedFeaturesMask |= ICH9_LPC_SMI_F_CPU_HOTPLUG;
|
|
+ }
|
|
+ mSmiFeatures &= RequestedFeaturesMask;
|
|
QemuFwCfgSelectItem (mRequestedFeaturesItem);
|
|
QemuFwCfgWriteBytes (sizeof mSmiFeatures, &mSmiFeatures);
|
|
|
|
@@ -144,6 +159,13 @@ NegotiateSmiFeatures (
|
|
DEBUG ((DEBUG_INFO, "%a: using SMI broadcast\n", __FUNCTION__));
|
|
}
|
|
|
|
+ if ((mSmiFeatures & ICH9_LPC_SMI_F_CPU_HOTPLUG) == 0) {
|
|
+ DEBUG ((DEBUG_INFO, "%a: CPU hotplug not negotiated\n", __FUNCTION__));
|
|
+ } else {
|
|
+ DEBUG ((DEBUG_INFO, "%a: CPU hotplug with SMI negotiated\n",
|
|
+ __FUNCTION__));
|
|
+ }
|
|
+
|
|
//
|
|
// Negotiation successful (although we may not have gotten the optimal
|
|
// feature set).
|
|
diff --git a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf
|
|
index 3abed141e6..b8fdea8deb 100644
|
|
--- a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf
|
|
+++ b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf
|
|
@@ -46,6 +46,7 @@
|
|
BaseLib
|
|
DebugLib
|
|
IoLib
|
|
+ MemEncryptSevLib
|
|
MemoryAllocationLib
|
|
PcdLib
|
|
PciLib
|
|
--
|
|
2.27.0
|
|
|