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

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