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

Liming Gao liming.gao at intel.com
Fri Aug 30 09:14:48 UTC 2019


UefiScsiLib is designed for the convenient usage with SCSI commands. They should try to align to UEFI definition. 
If you check current SCSI APIs, their interface matches EFI_SCSI_IO_SCSI_REQUEST_PACKET strut. 
So, new added APIs had better match EFI_STORAGE_SECURITY_COMMAND_PROTOCOL. 

For the change in MdePkg\Include\Protocol\ScsiIo.h, where is new definition EFI_SCSI_IO_TYPE_WLUN from?

Thanks
Liming
>-----Original Message-----
>From: Wu, Hao A
>Sent: Friday, August 30, 2019 1:18 PM
>To: Zurcher, Christopher J <christopher.j.zurcher at intel.com>;
>devel at edk2.groups.io; Gao, Liming <liming.gao at intel.com>; Kinney, Michael
>D <michael.d.kinney at intel.com>
>Cc: Yao, Jiewen <jiewen.yao at intel.com>; Wang, Jian J
><jian.j.wang at intel.com>
>Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands
>for Security Protocol In/Out
>
>Hello,
>
>Sorry for top-posting.
>
>I was thinking to make the parameters interface match between the
>UefiScsiLib
>API and the EFI Storage Security Command Protocol service, since the
>implementation of the SSC protocol will directly call the UefiScsiLib API.
>
>More specifically, for UefiScsiLib API:
>EFI_STATUS
>EFIAPI
>ScsiSecurityProtocolInCommand (
>  ...
>  IN     UINT32  TransferLength,
>  ...
>  IN OUT UINT32  *DataLength
>  )
>
>to match the SSC protocol service:
>typedef
>EFI_STATUS
>(EFIAPI *EFI_STORAGE_SECURITY_RECEIVE_DATA)(
>  ...
>  IN UINTN   PayloadBufferSize,
>  ...
>  OUT UINTN  *PayloadTransferSize
>  )
>
>and for UefiScsiLib API:
>EFI_STATUS
>EFIAPI
>ScsiSecurityProtocolOutCommand (
>  ...
>  IN     UINT32  TransferLength,
>  ...
>  )
>
>to match the SSC protocol service:
>typedef
>EFI_STATUS
>(EFIAPI *EFI_STORAGE_SECURITY_SEND_DATA) (
>  ...
>  IN UINTN  PayloadBufferSize,
>  ...
>  )
>
>I am okay with the cast from UINTN to UINT32, as long as we can ensure
>truncation will not happen (which I think should be safe when dealing with
>data transfer with actual devices).
>
>But for casting from UINTN* to UINT32*, I am not sure if this is a
>recommended
>coding style. Maybe within the BIOS perspective, little endian is always the
>case where such cast should work well.
>
>I will leave this open to MdePkg package maintainers for their inputs.
>
>Best Regards,
>Hao Wu
>
>
>> -----Original Message-----
>> From: Zurcher, Christopher J
>> Sent: Friday, August 30, 2019 8:35 AM
>> To: Wu, Hao A; devel at edk2.groups.io
>> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
>> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
>> commands for Security Protocol In/Out
>>
>> 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 (#46614): https://edk2.groups.io/g/devel/message/46614
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