Blame SOURCES/edk2-OvmfPkg-SmmControl2Dxe-negotiate-ICH9_LPC_SMI_F_CPU_.patch

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