#include <Library/DebugLib.h>\r
#include <Library/QemuFwCfgLib.h>\r
#include <Library/MemEncryptSevLib.h>\r
+#include <WorkArea.h>\r
\r
#include "QemuFwCfgLibInternal.h"\r
\r
STATIC BOOLEAN mQemuFwCfgSupported = FALSE;\r
STATIC BOOLEAN mQemuFwCfgDmaSupported;\r
\r
+/**\r
+ Check if it is Tdx guest\r
+\r
+ @retval TRUE It is Tdx guest\r
+ @retval FALSE It is not Tdx guest\r
+**/\r
+BOOLEAN\r
+QemuFwCfgIsTdxGuest (\r
+ VOID\r
+ )\r
+{\r
+ CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER *CcWorkAreaHeader;\r
+\r
+ CcWorkAreaHeader = (CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER *)FixedPcdGet32 (PcdOvmfWorkAreaBase);\r
+ return (CcWorkAreaHeader != NULL && CcWorkAreaHeader->GuestType == GUEST_TYPE_INTEL_TDX);\r
+}\r
+\r
/**\r
Returns a boolean indicating if the firmware configuration interface\r
is available or not.\r
//\r
if (MemEncryptSevIsEnabled ()) {\r
DEBUG ((DEBUG_INFO, "SEV: QemuFwCfg fallback to IO Port interface.\n"));\r
+ } else if (QemuFwCfgIsTdxGuest ()) {\r
+ //\r
+ // If TDX is enabled then we do not support DMA operations in PEI phase.\r
+ // This is mainly because DMA in TDX guest requires using bounce buffer\r
+ // (which need to allocate dynamic memory and allocating a PAGE size'd\r
+ // buffer can be challenge in PEI phase)\r
+ //\r
+ DEBUG ((DEBUG_INFO, "TDX: QemuFwCfg fallback to IO Port interface.\n"));\r
} else {\r
mQemuFwCfgDmaSupported = TRUE;\r
DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));\r
//\r
ASSERT (!MemEncryptSevIsEnabled ());\r
\r
+ //\r
+ // TDX does not support DMA operations in PEI stage, we should\r
+ // not have reached here.\r
+ //\r
+ ASSERT (!QemuFwCfgIsTdxGuest ());\r
+\r
Access.Control = SwapBytes32 (Control);\r
Access.Length = SwapBytes32 (Size);\r
Access.Address = SwapBytes64 ((UINTN)Buffer);\r