OvmfPkg/QemuFwCfgLib: support QEMU's DMA-like fw_cfg access method
The benefits of the DMA-like access method are (a) speed, (b) write support in QEMU 2.9+. (IOPort-based write support was discontinued in QEMU 2.4, and the DMA-based one is being added to QEMU 2.9. Write support needs no separate feature detection because writeability is governed on the level of individual fw_cfg files -- if a file meant to be written by the firmware exists in the directory, then it is writeable with the DMA method.) We don't enable this feature for the SEC library instance, because: - the SEC instance remains without clients (I've checked that it builds though), - in SEC, any possible fw_cfg use is expected to be small and read-only. Cc: Jordan Justen <jordan.l.justen@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "QemuFwCfgLibInternal.h"
|
||||
|
||||
STATIC BOOLEAN mQemuFwCfgSupported = FALSE;
|
||||
STATIC BOOLEAN mQemuFwCfgDmaSupported;
|
||||
|
||||
|
||||
/**
|
||||
@@ -53,8 +54,10 @@ QemuFwCfgInitialize (
|
||||
|
||||
//
|
||||
// Enable the access routines while probing to see if it is supported.
|
||||
// For probing we always use the IO Port (IoReadFifo8()) access method.
|
||||
//
|
||||
mQemuFwCfgSupported = TRUE;
|
||||
mQemuFwCfgDmaSupported = FALSE;
|
||||
|
||||
QemuFwCfgSelectItem (QemuFwCfgItemSignature);
|
||||
Signature = QemuFwCfgRead32 ();
|
||||
@@ -70,7 +73,12 @@ QemuFwCfgInitialize (
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
DEBUG ((EFI_D_INFO, "QemuFwCfg interface is supported.\n"));
|
||||
if ((Revision & FW_CFG_F_DMA) == 0) {
|
||||
DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n"));
|
||||
} else {
|
||||
mQemuFwCfgDmaSupported = TRUE;
|
||||
DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));
|
||||
}
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -91,3 +99,18 @@ InternalQemuFwCfgIsAvailable (
|
||||
{
|
||||
return mQemuFwCfgSupported;
|
||||
}
|
||||
|
||||
/**
|
||||
Returns a boolean indicating whether QEMU provides the DMA-like access method
|
||||
for fw_cfg.
|
||||
|
||||
@retval TRUE The DMA-like access method is available.
|
||||
@retval FALSE The DMA-like access method is unavailable.
|
||||
**/
|
||||
BOOLEAN
|
||||
InternalQemuFwCfgDmaIsAvailable (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return mQemuFwCfgDmaSupported;
|
||||
}
|
||||
|
Reference in New Issue
Block a user