public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Laszlo Ersek" <lersek@redhat.com>
To: Gary Lin <glin@suse.com>, devel@edk2.groups.io
Cc: Jordan Justen <jordan.l.justen@intel.com>,
	Ard Biesheuvel <ard.biesheuvel@arm.com>
Subject: Re: [PATCH 05/11] OvmfPkg/LsiScsiDxe: Install stubbed EXT_SCSI_PASS_THRU
Date: Tue, 7 Jul 2020 10:28:22 +0200	[thread overview]
Message-ID: <e0e8d255-c49f-d5ff-3a1b-d989774a715b@redhat.com> (raw)
In-Reply-To: <20200701040448.14871-6-glin@suse.com>

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.justen@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
> Signed-off-by: Gary Lin <glin@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 <lersek@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
> 


  reply	other threads:[~2020-07-07  8:28 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-01  4:04 [PATCH 00/11] Introduce LsiScsi driver to OvmfPkg Gary Lin
2020-07-01  4:04 ` [PATCH 01/11] OvmfPkg/LsiScsiDxe: Create the empty driver Gary Lin
2020-07-07  7:59   ` Laszlo Ersek
2020-07-07  8:24     ` Gary Lin
2020-07-01  4:04 ` [PATCH 02/11] OvmfPkg/LsiScsiDxe: Install the skeleton of driver binding Gary Lin
2020-07-07  8:06   ` Laszlo Ersek
2020-07-07  8:34     ` Gary Lin
2020-07-01  4:04 ` [PATCH 03/11] OvmfPkg/LsiScsiDxe: Report the name of the driver Gary Lin
2020-07-07  8:09   ` Laszlo Ersek
2020-07-01  4:04 ` [PATCH 04/11] OvmfPkg/LsiScsiDxe: Probe PCI devices and look for LsiScsi Gary Lin
2020-07-07  8:15   ` Laszlo Ersek
2020-07-07  8:16     ` Laszlo Ersek
2020-07-01  4:04 ` [PATCH 05/11] OvmfPkg/LsiScsiDxe: Install stubbed EXT_SCSI_PASS_THRU Gary Lin
2020-07-07  8:28   ` Laszlo Ersek [this message]
2020-07-01  4:04 ` [PATCH 06/11] OvmfPkg/LsiScsiDxe: Report Targets and LUNs Gary Lin
2020-07-07  9:04   ` Laszlo Ersek
2020-07-08  2:34     ` Gary Lin
2020-07-08 15:26       ` Laszlo Ersek
2020-07-01  4:04 ` [PATCH 07/11] OvmfPkg/LsiScsiDxe: Open PciIo protocol and initialize the device Gary Lin
2020-07-07  9:46   ` Laszlo Ersek
2020-07-08  2:37     ` Gary Lin
2020-07-01  4:04 ` [PATCH 08/11] OvmfPkg/LsiScsiDxe: Map DMA buffer Gary Lin
2020-07-07  9:59   ` Laszlo Ersek
2020-07-08  2:41     ` Gary Lin
2020-07-01  4:04 ` [PATCH 09/11] OvmfPkg/LsiScsiDxe: Examine the incoming SCSI Request Packet Gary Lin
2020-07-07 10:17   ` Laszlo Ersek
2020-07-08  2:43     ` Gary Lin
2020-07-01  4:04 ` [PATCH 10/11] OvmfPkg/LsiScsiDxe: Process the " Gary Lin
2020-07-07 12:46   ` Laszlo Ersek
2020-07-08  6:02     ` Gary Lin
     [not found]     ` <161FB1B03BD2D339.11266@groups.io>
2020-07-14  8:19       ` [edk2-devel] " Gary Lin
2020-07-01  4:04 ` [PATCH 11/11] Maintainers.txt: Add myself as the reviewer for LsiScsi driver Gary Lin
2020-07-07 12:49   ` Laszlo Ersek
2020-07-08  6:03     ` Gary Lin
2020-07-03 14:08 ` [edk2-devel] [PATCH 00/11] Introduce LsiScsi driver to OvmfPkg Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e0e8d255-c49f-d5ff-3a1b-d989774a715b@redhat.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox