[edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out

Zurcher, Christopher J christopher.j.zurcher at intel.com
Fri Aug 30 00:34:45 UTC 2019


I've implemented all the suggested changes except changing the arguments from UINT32 to UINTN. No other functions in UefiScsiLib take UINTN arguments, and since the library is directly packing the CDB, I think it makes sense to force the caller to provide the correct-size length value. That way there is no ambiguity on what is going to the device.
If you agree I will send the updated patchset.

Thanks,
Christopher Zurcher

-----Original Message-----
From: Wu, Hao A 
Sent: Monday, August 26, 2019 20:03
To: devel at edk2.groups.io; Zurcher, Christopher J <christopher.j.zurcher at intel.com>
Cc: Yao, Jiewen <jiewen.yao at intel.com>; Wang, Jian J <jian.j.wang at intel.com>; Gao, Liming <liming.gao at intel.com>
Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out

Hello,

Please refer to the below inline comments:


> -----Original Message-----
> From: devel at edk2.groups.io [mailto:devel at edk2.groups.io] On Behalf Of
> Zurcher, Christopher J
> Sent: Friday, August 23, 2019 6:02 AM
> To: devel at edk2.groups.io
> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands
> for Security Protocol In/Out
> 
> This patch implements the Security Protocol In and Security Protocol Out
> commands in UefiScsiLib to prepare support for the Storage Security
> Command Protocol.
> 
> Cc: Jiewen Yao <jiewen.yao at intel.com>
> Cc: Jian J Wang <jian.j.wang at intel.com>
> Cc: Liming Gao <liming.gao at intel.com>
> Signed-off-by: Christopher J Zurcher <christopher.j.zurcher at intel.com>
> ---
>  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
>  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
>  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
>  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205 +++++++++++++++++++-
>  4 files changed, 366 insertions(+), 22 deletions(-)
> 
> diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> b/MdePkg/Include/IndustryStandard/Scsi.h
> index cbe5709fe5..10d7b49ba7 100644
> --- a/MdePkg/Include/IndustryStandard/Scsi.h
> +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Support for SCSI-2 standard
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -163,6 +163,12 @@
>  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
>  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> 
> +//
> +// Additional commands for Secure Transactions
> +//
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> +
>  //
>  // SCSI Data Transfer Direction
>  //
> @@ -172,22 +178,30 @@
>  //
>  // Peripheral Device Type Definitions
>  //
> -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
> magnetic disk)
> -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device (e.g.
> magnetic tape)
> -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g. some
> optical disks)
> -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device (e.g.
> some optical disks)
> -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
> device (e.g. jukeboxes)
> -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
> device
> -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)
> -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)


Could you help to address Liming's comment in the V4 series that to preserve
the definition for EFI_SCSI_TYPE_ASCIT8_1 & EFI_SCSI_TYPE_ASCIT8_2 for
compatibility consideration:

https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,20,2,40,32048246


> -//
> -// 0Ch - 1Eh are reserved
> -//
> -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no device
> type
> +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
> magnetic disk)
> +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device (e.g.
> magnetic tape)
> +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device (obsolete)
> +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer
> device (e.g. jukeboxes)
> +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications
> device (obsolete)
> +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
> +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
> +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
> device (e.g., RAID)
> +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
> +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access device
> (e.g., magnetic disk)
> +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer
> device
> +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller Commands
> +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage Device
> +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
> Interface
> +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager
> device
> +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
> +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
> +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no device
> type
> 
>  //
>  // Page Codes for INQUIRY command
> diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> b/MdePkg/Include/Library/UefiScsiLib.h
> index 10dd81902b..a0d99e703a 100644
> --- a/MdePkg/Include/Library/UefiScsiLib.h
> +++ b/MdePkg/Include/Library/UefiScsiLib.h
> @@ -5,7 +5,7 @@
>    for hard drive, CD and DVD devices that are the most common SCSI boot
> targets used by UEFI platforms.
>    This library class depends on SCSI I/O Protocol defined in UEFI Specification
> and SCSI-2 industry standard.
> 
> -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -813,6 +813,130 @@ ScsiWrite16Command (
>    );
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the data allocation.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +  @param[in, out] DataLength           The length of data buffer.


As mentioned in V4 series:

Referring to the implementation of the library (changes made in
MdePkg/Library/UefiScsiLib/UefiScsiLib.c):

'TransferLength' (input) specifies the length of content in 'DataBuffer';
'DataLength' (input & output) reflects the actual number of bytes
transferred.

How about swapping their names and changing the description comments to:
(Please help to update UefiScsiLib.c as well.)

  @param[in]      DataLength           The size in bytes of the data buffer.
  ...
  @param[out]     TransferLength       A pointer to a buffer to store the size
                                       in bytes of the data written to the data
                                       buffer.


> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number of bytes
> transferred is returned in DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +  IN OUT UINT32                *DataLength
> +  );


As mentioned in V4 series, could you help to add a new parameter "Inc512" for
both new APIs:
ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Though UFS spec requires the INC_512 field of a CDB to be set to 0, but
for other devices, setting this field to 1 may be a valid configuration.


Also, I would suggest the below parameter type changes to match with the services
definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the
name swap mentioned above):

IN     UINT32                TransferLength,
to
IN     UINTN                 DataLength,

IN OUT UINT32                *DataLength
to
   OUT UINTN                 *TransferLength


> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the transfer data.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.


As mentioned in V4:

Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit
more clear for users to know 'DataLength' reflects the size of 'DataBuffer'.


> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number of bytes
> transferred is returned in DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer  OPTIONAL
> +  );


As mentioned in V4 series:

Suggest the below parameter type changes to match with the services
definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the
name change mentioned above):

IN     UINT32                TransferLength
to
IN     UINTN                 DataLength

Best Regards,
Hao Wu


> +
> +
>  /**
>    Execute blocking/non-blocking Read(10) SCSI command on a specific SCSI
>    target.
> diff --git a/MdePkg/Include/Protocol/ScsiIo.h
> b/MdePkg/Include/Protocol/ScsiIo.h
> index 05e46bda9c..27c31fe7f9 100644
> --- a/MdePkg/Include/Protocol/ScsiIo.h
> +++ b/MdePkg/Include/Protocol/ScsiIo.h
> @@ -4,7 +4,7 @@
>    services environment to access SCSI devices. In particular, functions for
>    managing devices on SCSI buses are defined here.
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
> EFI_SCSI_IO_PROTOCOL;
>  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical card
> reader/writer device
>  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge
> Controller Commands
>  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-based
> Storage Device
> -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
> Reserved (low)
> -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
> Reserved (high)
> +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///<
> Automation/Drive Interface
> +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13    ///<
> Security manager device
> +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///<
> Reserved (low)
> +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///<
> Reserved (high)
> +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well known
> logical unit
>  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///< Unknown
> no device type
> 
>  //
> diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> index c7491d1436..7584d717ad 100644
> --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> @@ -1,7 +1,7 @@
>  /** @file
>    UEFI SCSI Library implementation
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -23,6 +23,7 @@
>    //
>  #define EFI_SCSI_OP_LENGTH_SIX      0x6
>  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
>  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> 
>  //
> @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
>  }
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the data allocation.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +  @param[in, out] DataLength           The length of data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number of bytes
> transferred is returned in DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +  IN OUT UINT32                *DataLength
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (DataLength != NULL);
> +  ASSERT (ScsiIo != NULL);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.InDataBuffer      = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.InTransferLength  = TransferLength;
> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol In Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +  *DataLength                   = CommandPacket.InTransferLength;
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct
> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the transfer data.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @retval  EFI_BAD_BUFFER_SIZE         The SCSI Request Packet was
> executed, but the entire DataBuffer could
> +                                       not be transferred. The actual number of bytes
> transferred is returned in DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer   OPTIONAL
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (ScsiIo != NULL);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.OutDataBuffer     = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.OutTransferLength = TransferLength;
> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol Out Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +
> +  return Status;
> +}
> +
> +
>  /**
>    Internal helper notify function in which update the result of the
>    non-blocking SCSI Read/Write commands and signal caller event.
> --
> 2.16.2.windows.1
> 
> 
> 


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

View/Reply Online (#46605): https://edk2.groups.io/g/devel/message/46605
Mute This Topic: https://groups.io/mt/32994942/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