On 07/01/20 06:04, Gary Lin wrote:
> Partially implement LsiScsiControllerStart() and LsiScsiControllerStop()
> to insert the scaffolding of EXT_SCSI_PASS_THRU functions.
> 
> 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>
> ---
>  OvmfPkg/LsiScsiDxe/LsiScsi.c      | 171 +++++++++++++++++++++++++++++-
>  OvmfPkg/LsiScsiDxe/LsiScsi.h      |  77 ++++++++++++++
>  OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf |   3 +
>  3 files changed, 250 insertions(+), 1 deletion(-)
> 
> diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
> index 5bca85bd75eb..f633c6793298 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,43 @@ 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;
> +  }
> +
> +  gBS->CloseProtocol (
> +         ControllerHandle,
> +         &gEfiPciIoProtocolGuid,
> +         This->DriverBindingHandle,
> +         ControllerHandle
> +         );

(1) This CloseProtocol() call does not belong in this patch. In this
patch, the Start() function doesn't open the PCI IO protocol yet. Please
move the CloseProtocol() call to the following patch:

  [PATCH 07/11]
  OvmfPkg/LsiScsiDxe: Open PciIo protocol and initialize the device

with that:

Reviewed-by: Laszlo Ersek <ler...@redhat.com>

Thanks
Laszlo


> +
> +  FreePool (Dev);
> +
> +  return Status;
>  }
>  
>  //
> diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
> index 00db9ada12d2..fca1007f9b98 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 {
> +  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.
> @@ -48,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 e86c626a61aa..8660513e2ffd 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
> 


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

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

Reply via email to