OvmfPkg/QemuFwCfgLib: Use BusMasterCommonBuffer to map FW_CFG_DMA_ACCESS

Commit 09719a01b1 (OvmfPkg/QemuFwCfgLib: Implement SEV internal function
for Dxe phase) uses IOMMU protocol to allocate and free FW_CFG_DMA_ACCESS
buffer when SEV is active. During initial commits we made assumption that
IOMMU.AllocateBuffer() will provide PlainTextAddress (i.e C-bit cleared).
This assumption was wrong, the AllocateBuffer() protocol member is not
expected to produce a buffer that is immediatly usable, and client is
required to call Map() uncondtionally with BusMasterCommonBuffer[64] to
get a mapping which is accessable by both host and device.

The patch refactors code a bit and add the support to Map()
FW_CFG_DMA_ACCESS buffer using BusMasterCommonBuffer operation after
allocation and Unamp() before free.

The complete discussion about this and recommendation from Laszlo can be
found here [1]

[1] https://lists.01.org/pipermail/edk2-devel/2017-July/012652.html

Suggested-by: Laszlo Ersek <lersek@redhat.com>
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>
[lersek@redhat.com: convert pointers to UINTN before converting to UINT64]
[lersek@redhat.com: fix argument indentation in multi-line function call]
[lersek@redhat.com: explicitly compare pointers to NULL]
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Brijesh Singh
2017-08-02 18:12:48 -04:00
committed by Laszlo Ersek
parent d0c9afea42
commit f6c909ae5d
5 changed files with 373 additions and 298 deletions

View File

@@ -45,39 +45,25 @@ InternalQemuFwCfgDmaIsAvailable (
);
/**
Returns a boolean indicating whether SEV support is enabled
Transfer an array of bytes, or skip a number of bytes, using the DMA
interface.
@retval TRUE SEV is enabled
@retval FALSE SEV is disabled
**/
BOOLEAN
InternalQemuFwCfgSevIsEnabled (
VOID
);
@param[in] Size Size in bytes to transfer or skip.
/**
Allocate a bounce buffer for SEV DMA.
@param[out] Buffer Allocated DMA Buffer pointer
@param[in] NumPage Number of pages.
@param[in,out] Buffer Buffer to read data into or write data from. Ignored,
and may be NULL, if Size is zero, or Control is
FW_CFG_DMA_CTL_SKIP.
@param[in] Control One of the following:
FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer.
FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer.
FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg.
**/
VOID
InternalQemuFwCfgSevDmaAllocateBuffer (
OUT VOID **Buffer,
IN UINT32 NumPages
InternalQemuFwCfgDmaBytes (
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
);
/**
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
);
#endif