[edk2-devel] [PATCH v2 08/12] OvmfPkg/LsiScsiDxe: Map DMA buffer

Gary Lin glin at suse.com
Thu Jul 16 07:46:03 UTC 2020


Map DMA buffer and perpare for the implementation of LsiScsiPassThru().

v2:
  - Replace 0x10000 with SIZE_64KB macro for the DMA buffer data array
  - Remove DUAL_ADDRESS_CYCLE from PciIo since we don't really need
    64-bit DMA address

Cc: Jordan Justen <jordan.l.justen at intel.com>
Cc: Laszlo Ersek <lersek at redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel at arm.com>
Signed-off-by: Gary Lin <glin at suse.com>
Reviewed-by: Laszlo Ersek <lersek at redhat.com>
---
 OvmfPkg/LsiScsiDxe/LsiScsi.c | 62 +++++++++++++++++++++++++++++++++++-
 OvmfPkg/LsiScsiDxe/LsiScsi.h | 14 ++++++++
 2 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index b21387db6e5a..4e84afa40085 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -356,6 +356,8 @@ LsiScsiControllerStart (
 {

   EFI_STATUS           Status;

   LSI_SCSI_DEV         *Dev;

+  UINTN                Pages;

+  UINTN                BytesMapped;

 

   Dev = AllocateZeroPool (sizeof (*Dev));

   if (Dev == NULL) {

@@ -411,11 +413,45 @@ LsiScsiControllerStart (
     goto CloseProtocol;

   }

 

-  Status = LsiScsiReset (Dev);

+  //

+  // Create buffers for data transfer

+  //

+  Pages = EFI_SIZE_TO_PAGES (sizeof (*Dev->Dma));

+  Status = Dev->PciIo->AllocateBuffer (

+                         Dev->PciIo,

+                         AllocateAnyPages,

+                         EfiBootServicesData,

+                         Pages,

+                         (VOID **)&Dev->Dma,

+                         EFI_PCI_ATTRIBUTE_MEMORY_CACHED

+                         );

   if (EFI_ERROR (Status)) {

     goto RestoreAttributes;

   }

 

+  BytesMapped = EFI_PAGES_TO_SIZE (Pages);

+  Status = Dev->PciIo->Map (

+                         Dev->PciIo,

+                         EfiPciIoOperationBusMasterCommonBuffer,

+                         Dev->Dma,

+                         &BytesMapped,

+                         &Dev->DmaPhysical,

+                         &Dev->DmaMapping

+                         );

+  if (EFI_ERROR (Status)) {

+    goto FreeBuffer;

+  }

+

+  if (BytesMapped != EFI_PAGES_TO_SIZE (Pages)) {

+    Status = EFI_OUT_OF_RESOURCES;

+    goto Unmap;

+  }

+

+  Status = LsiScsiReset (Dev);

+  if (EFI_ERROR (Status)) {

+    goto Unmap;

+  }

+

   Status = gBS->CreateEvent (

                   EVT_SIGNAL_EXIT_BOOT_SERVICES,

                   TPL_CALLBACK,

@@ -462,6 +498,19 @@ CloseExitBoot:
 UninitDev:

   LsiScsiReset (Dev);

 

+Unmap:

+  Dev->PciIo->Unmap (

+                Dev->PciIo,

+                Dev->DmaMapping

+                );

+

+FreeBuffer:

+  Dev->PciIo->FreeBuffer (

+                Dev->PciIo,

+                Pages,

+                Dev->Dma

+                );

+

 RestoreAttributes:

   Dev->PciIo->Attributes (

                 Dev->PciIo,

@@ -524,6 +573,17 @@ LsiScsiControllerStop (
 

   LsiScsiReset (Dev);

 

+  Dev->PciIo->Unmap (

+                Dev->PciIo,

+                Dev->DmaMapping

+                );

+

+  Dev->PciIo->FreeBuffer (

+                Dev->PciIo,

+                EFI_SIZE_TO_PAGES (sizeof (*Dev->Dma)),

+                Dev->Dma

+                );

+

   Dev->PciIo->Attributes (

                 Dev->PciIo,

                 EfiPciIoAttributeOperationSet,

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index 8c2acff6e86f..9f9e5c7fed00 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -12,6 +12,17 @@
 #ifndef _LSI_SCSI_DXE_H_

 #define _LSI_SCSI_DXE_H_

 

+typedef struct {

+  //

+  // Allocate 64KB for read/write buffer. It seems sufficient for the common

+  // boot scenarios.

+  //

+  // NOTE: The number of bytes for data transmission is bounded by DMA Byte

+  //       Count (DBC), a 24-bit register, so the maximum is 0xFFFFFF (16MB-1).

+  //

+  UINT8                           Data[SIZE_64KB];

+} LSI_SCSI_DMA_BUFFER;

+

 typedef struct {

   UINT32                          Signature;

   UINT64                          OrigPciAttrs;

@@ -19,6 +30,9 @@ typedef struct {
   EFI_PCI_IO_PROTOCOL             *PciIo;

   UINT8                           MaxTarget;

   UINT8                           MaxLun;

+  LSI_SCSI_DMA_BUFFER             *Dma;

+  EFI_PHYSICAL_ADDRESS            DmaPhysical;

+  VOID                            *DmaMapping;

   EFI_EXT_SCSI_PASS_THRU_MODE     PassThruMode;

   EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;

 } LSI_SCSI_DEV;

-- 
2.25.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#62662): https://edk2.groups.io/g/devel/message/62662
Mute This Topic: https://groups.io/mt/75537212/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list