MdeModulePkg/NonDiscoverablePciDeviceDxe: add support for non-coherent DMA
Add support for non-coherent DMA, either by performing explicit cache maintenance when DMA mappings are aligned to the CPU's DMA buffer alignment, or by bounce buffering via uncached mappings otherwise. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Marcin Wojtas <mw@semihalf.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
@@ -15,6 +15,8 @@
|
||||
#ifndef __NON_DISCOVERABLE_PCI_DEVICE_IO_H__
|
||||
#define __NON_DISCOVERABLE_PCI_DEVICE_IO_H__
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
@@ -25,6 +27,7 @@
|
||||
|
||||
#include <Protocol/ComponentName.h>
|
||||
#include <Protocol/NonDiscoverableDevice.h>
|
||||
#include <Protocol/Cpu.h>
|
||||
#include <Protocol/PciIo.h>
|
||||
|
||||
#define NON_DISCOVERABLE_PCI_DEVICE_SIG SIGNATURE_32 ('P', 'P', 'I', 'D')
|
||||
@@ -38,6 +41,27 @@
|
||||
|
||||
#define PCI_MAX_BARS 6
|
||||
|
||||
extern EFI_CPU_ARCH_PROTOCOL *mCpu;
|
||||
|
||||
typedef struct {
|
||||
//
|
||||
// The linked-list next pointer
|
||||
//
|
||||
LIST_ENTRY List;
|
||||
//
|
||||
// The address of the uncached allocation
|
||||
//
|
||||
VOID *HostAddress;
|
||||
//
|
||||
// The number of pages in the allocation
|
||||
//
|
||||
UINTN NumPages;
|
||||
//
|
||||
// The attributes of the allocation
|
||||
//
|
||||
UINT64 Attributes;
|
||||
} NON_DISCOVERABLE_DEVICE_UNCACHED_ALLOCATION;
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
//
|
||||
@@ -71,6 +95,11 @@ typedef struct {
|
||||
// Whether this device has been enabled
|
||||
//
|
||||
BOOLEAN Enabled;
|
||||
//
|
||||
// Linked list to keep track of uncached allocations performed
|
||||
// on behalf of this device
|
||||
//
|
||||
LIST_ENTRY UncachedAllocationList;
|
||||
} NON_DISCOVERABLE_PCI_DEVICE;
|
||||
|
||||
VOID
|
||||
|
Reference in New Issue
Block a user