OvmfPkg/QemuFwCfgLib: Implement SEV internal functions for PEI phase

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
Brijesh Singh 2017-07-06 09:29:03 -04:00 committed by Jordan Justen
parent 6264abc29e
commit 5feae25392
2 changed files with 71 additions and 2 deletions

View File

@ -4,6 +4,7 @@
Copyright (C) 2013, Red Hat, Inc. Copyright (C) 2013, Red Hat, Inc.
Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2017, Advanced Micro Devices. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License which accompanies this under the terms and conditions of the BSD License which accompanies this
@ -14,8 +15,10 @@
WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/ **/
#include <Library/BaseLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/QemuFwCfgLib.h> #include <Library/QemuFwCfgLib.h>
#include <Library/MemEncryptSevLib.h>
#include "QemuFwCfgLibInternal.h" #include "QemuFwCfgLibInternal.h"
@ -75,10 +78,20 @@ QemuFwCfgInitialize (
if ((Revision & FW_CFG_F_DMA) == 0) { if ((Revision & FW_CFG_F_DMA) == 0) {
DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n")); DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n"));
} else {
//
// If SEV is enabled then we do not support DMA operations in PEI phase.
// This is mainly because DMA in SEV guest requires using bounce buffer
// (which need to allocate dynamic memory and allocating a PAGE size'd
// buffer can be challenge in PEI phase)
//
if (InternalQemuFwCfgSevIsEnabled ()) {
DEBUG ((DEBUG_INFO, "SEV: QemuFwCfg fallback to IO Port interface.\n"));
} else { } else {
mQemuFwCfgDmaSupported = TRUE; mQemuFwCfgDmaSupported = TRUE;
DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n")); DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));
} }
}
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
@ -114,3 +127,58 @@ InternalQemuFwCfgDmaIsAvailable (
{ {
return mQemuFwCfgDmaSupported; return mQemuFwCfgDmaSupported;
} }
/**
Returns a boolean indicating whether SEV is enabled
@retval TRUE SEV is enabled
@retval FALSE SEV is disabled
**/
BOOLEAN
InternalQemuFwCfgSevIsEnabled (
VOID
)
{
return MemEncryptSevIsEnabled ();
}
/**
Allocate a bounce buffer for SEV DMA.
@param[in] NumPage Number of pages.
@param[out] Buffer Allocated DMA Buffer pointer
**/
VOID
InternalQemuFwCfgSevDmaAllocateBuffer (
OUT VOID **Buffer,
IN UINT32 NumPages
)
{
//
// We should never reach here
//
ASSERT (FALSE);
CpuDeadLoop ();
}
/**
Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer
@param[in] NumPage Number of pages.
@param[in] Buffer DMA Buffer pointer
**/
VOID
InternalQemuFwCfgSevDmaFreeBuffer (
IN VOID *Buffer,
IN UINT32 NumPages
)
{
//
// We should never reach here
//
ASSERT (FALSE);
CpuDeadLoop ();
}

View File

@ -47,4 +47,5 @@
DebugLib DebugLib
IoLib IoLib
MemoryAllocationLib MemoryAllocationLib
MemEncryptSevLib