Partially implement LsiScsiControllerStart() and LsiScsiControllerStop()
to insert the scaffolding of EXT_SCSI_PASS_THRU functions.

v3: Squash the newline below the declaration of LSI_SCSI_FROM_PASS_THRU
v2: Remove the closing of PciIo protocol from LsiScsiControllerStop().

Cc: Jordan Justen <jordan.l.jus...@intel.com>
Cc: Laszlo Ersek <ler...@redhat.com>
Cc: Ard Biesheuvel <ard.biesheu...@arm.com>
Signed-off-by: Gary Lin <g...@suse.com>
Reviewed-by: Laszlo Ersek <ler...@redhat.com>
---
 OvmfPkg/LsiScsiDxe/LsiScsi.c      | 164 +++++++++++++++++++++++++++++-
 OvmfPkg/LsiScsiDxe/LsiScsi.h      |  78 ++++++++++++++
 OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf |   3 +
 3 files changed, 244 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index 5bca85bd75eb..67fadb411e85 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -11,14 +11,105 @@
 

 #include <IndustryStandard/LsiScsi.h>

 #include <IndustryStandard/Pci.h>

+#include <Library/BaseLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/DebugLib.h>

+#include <Library/MemoryAllocationLib.h>

 #include <Library/UefiBootServicesTableLib.h>

 #include <Library/UefiLib.h>

 #include <Protocol/PciIo.h>

 #include <Protocol/PciRootBridgeIo.h>

+#include <Protocol/ScsiPassThruExt.h>

 #include <Uefi/UefiSpec.h>

 

 #include "LsiScsi.h"

 

+//

+// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL

+// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,

+// sections

+// - 14.1 SCSI Driver Model Overview,

+// - 14.7 Extended SCSI Pass Thru Protocol.

+//

+

+EFI_STATUS

+EFIAPI

+LsiScsiPassThru (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                *This,

+  IN UINT8                                          *Target,

+  IN UINT64                                         Lun,

+  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,

+  IN EFI_EVENT                                      Event     OPTIONAL

+  )

+{

+  return EFI_UNSUPPORTED;

+}

+

+EFI_STATUS

+EFIAPI

+LsiScsiGetNextTargetLun (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN OUT UINT8                       **TargetPointer,

+  IN OUT UINT64                      *Lun

+  )

+{

+  return EFI_NOT_FOUND;

+}

+

+EFI_STATUS

+EFIAPI

+LsiScsiBuildDevicePath (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN UINT8                           *Target,

+  IN UINT64                          Lun,

+  IN OUT EFI_DEVICE_PATH_PROTOCOL    **DevicePath

+  )

+{

+  return EFI_NOT_FOUND;

+}

+

+EFI_STATUS

+EFIAPI

+LsiScsiGetTargetLun (

+  IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN  EFI_DEVICE_PATH_PROTOCOL        *DevicePath,

+  OUT UINT8                           **TargetPointer,

+  OUT UINT64                          *Lun

+  )

+{

+  return EFI_UNSUPPORTED;

+}

+

+EFI_STATUS

+EFIAPI

+LsiScsiResetChannel (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This

+  )

+{

+  return EFI_UNSUPPORTED;

+}

+

+EFI_STATUS

+EFIAPI

+LsiScsiResetTargetLun (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN UINT8                           *Target,

+  IN UINT64                          Lun

+  )

+{

+  return EFI_UNSUPPORTED;

+}

+

+EFI_STATUS

+EFIAPI

+LsiScsiGetNextTarget (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN OUT UINT8                       **TargetPointer

+  )

+{

+  return EFI_NOT_FOUND;

+}

+

 //

 // Probe, start and stop functions of this driver, called by the DXE core for

 // specific devices.

@@ -88,7 +179,49 @@ LsiScsiControllerStart (
   IN EFI_DEVICE_PATH_PROTOCOL    *RemainingDevicePath OPTIONAL

   )

 {

+  EFI_STATUS           Status;

+  LSI_SCSI_DEV         *Dev;

+

+  Dev = AllocateZeroPool (sizeof (*Dev));

+  if (Dev == NULL) {

+    return EFI_OUT_OF_RESOURCES;

+  }

+

+  Dev->Signature = LSI_SCSI_DEV_SIGNATURE;

+

+  //

+  // Host adapter channel, doesn't exist

+  //

+  Dev->PassThruMode.AdapterId = MAX_UINT32;

+  Dev->PassThruMode.Attributes =

+    EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL |

+    EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;

+

+  Dev->PassThru.Mode = &Dev->PassThruMode;

+  Dev->PassThru.PassThru = &LsiScsiPassThru;

+  Dev->PassThru.GetNextTargetLun = &LsiScsiGetNextTargetLun;

+  Dev->PassThru.BuildDevicePath = &LsiScsiBuildDevicePath;

+  Dev->PassThru.GetTargetLun = &LsiScsiGetTargetLun;

+  Dev->PassThru.ResetChannel = &LsiScsiResetChannel;

+  Dev->PassThru.ResetTargetLun = &LsiScsiResetTargetLun;

+  Dev->PassThru.GetNextTarget = &LsiScsiGetNextTarget;

+

+  Status = gBS->InstallProtocolInterface (

+                  &ControllerHandle,

+                  &gEfiExtScsiPassThruProtocolGuid,

+                  EFI_NATIVE_INTERFACE,

+                  &Dev->PassThru

+                  );

+  if (EFI_ERROR (Status)) {

+    goto FreePool;

+  }

+

   return EFI_SUCCESS;

+

+FreePool:

+  FreePool (Dev);

+

+  return Status;

 }

 

 EFI_STATUS

@@ -100,7 +233,36 @@ LsiScsiControllerStop (
   IN EFI_HANDLE                  *ChildHandleBuffer

   )

 {

-  return EFI_SUCCESS;

+  EFI_STATUS                      Status;

+  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;

+  LSI_SCSI_DEV                    *Dev;

+

+  Status = gBS->OpenProtocol (

+                  ControllerHandle,

+                  &gEfiExtScsiPassThruProtocolGuid,

+                  (VOID **)&PassThru,

+                  This->DriverBindingHandle,

+                  ControllerHandle,

+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL // Lookup only

+                  );

+  if (EFI_ERROR (Status)) {

+    return Status;

+  }

+

+  Dev = LSI_SCSI_FROM_PASS_THRU (PassThru);

+

+  Status = gBS->UninstallProtocolInterface (

+                  ControllerHandle,

+                  &gEfiExtScsiPassThruProtocolGuid,

+                  &Dev->PassThru

+                  );

+  if (EFI_ERROR (Status)) {

+    return Status;

+  }

+

+  FreePool (Dev);

+

+  return Status;

 }

 

 //

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index 6c8dcbd70a0a..751d5b193b51 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -12,6 +12,18 @@
 #ifndef _LSI_SCSI_DXE_H_

 #define _LSI_SCSI_DXE_H_

 

+typedef struct {

+  UINT32                          Signature;

+  EFI_EXT_SCSI_PASS_THRU_MODE     PassThruMode;

+  EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;

+} LSI_SCSI_DEV;

+

+#define LSI_SCSI_DEV_SIGNATURE SIGNATURE_32 ('L','S','I','S')

+

+#define LSI_SCSI_FROM_PASS_THRU(PassThruPtr) \

+  CR (PassThruPtr, LSI_SCSI_DEV, PassThru, LSI_SCSI_DEV_SIGNATURE)

+

+

 //

 // Probe, start and stop functions of this driver, called by the DXE core for

 // specific devices.

@@ -47,6 +59,72 @@ LsiScsiControllerStop (
   );

 

 

+//

+// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL

+// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,

+// sections

+// - 14.1 SCSI Driver Model Overview,

+// - 14.7 Extended SCSI Pass Thru Protocol.

+//

+

+EFI_STATUS

+EFIAPI

+LsiScsiPassThru (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                *This,

+  IN UINT8                                          *Target,

+  IN UINT64                                         Lun,

+  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,

+  IN EFI_EVENT                                      Event     OPTIONAL

+  );

+

+EFI_STATUS

+EFIAPI

+LsiScsiGetNextTargetLun (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN OUT UINT8                       **TargetPointer,

+  IN OUT UINT64                      *Lun

+  );

+

+EFI_STATUS

+EFIAPI

+LsiScsiBuildDevicePath (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN UINT8                           *Target,

+  IN UINT64                          Lun,

+  IN OUT EFI_DEVICE_PATH_PROTOCOL    **DevicePath

+  );

+

+EFI_STATUS

+EFIAPI

+LsiScsiGetTargetLun (

+  IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN  EFI_DEVICE_PATH_PROTOCOL        *DevicePath,

+  OUT UINT8                           **TargetPointer,

+  OUT UINT64                          *Lun

+  );

+

+EFI_STATUS

+EFIAPI

+LsiScsiResetChannel (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This

+  );

+

+EFI_STATUS

+EFIAPI

+LsiScsiResetTargetLun (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN UINT8                           *Target,

+  IN UINT64                          Lun

+  );

+

+EFI_STATUS

+EFIAPI

+LsiScsiGetNextTarget (

+  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,

+  IN OUT UINT8                       **TargetPointer

+  );

+

+

 //

 // The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and

 // EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf 
b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
index 7ce11fcc6a03..14f9c68308cc 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+++ b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
@@ -26,9 +26,12 @@ [Packages]
 

 [LibraryClasses]

   BaseLib

+  BaseMemoryLib

+  MemoryAllocationLib

   UefiBootServicesTableLib

   UefiDriverEntryPoint

   UefiLib

 

 [Protocols]

+  gEfiExtScsiPassThruProtocolGuid        ## BY_START

   gEfiPciIoProtocolGuid                  ## TO_START

-- 
2.25.1


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

View/Reply Online (#62726): https://edk2.groups.io/g/devel/message/62726
Mute This Topic: https://groups.io/mt/75607036/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to