From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: hao.a.wu@intel.com) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by groups.io with SMTP; Sun, 01 Sep 2019 18:10:52 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Sep 2019 18:10:51 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,457,1559545200"; d="scan'208";a="265893620" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga001.jf.intel.com with ESMTP; 01 Sep 2019 18:10:51 -0700 Received: from fmsmsx123.amr.corp.intel.com (10.18.125.38) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 1 Sep 2019 18:10:51 -0700 Received: from shsmsx106.ccr.corp.intel.com (10.239.4.159) by fmsmsx123.amr.corp.intel.com (10.18.125.38) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sun, 1 Sep 2019 18:10:50 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.32]) by SHSMSX106.ccr.corp.intel.com ([169.254.10.86]) with mapi id 14.03.0439.000; Mon, 2 Sep 2019 09:10:48 +0800 From: "Wu, Hao A" To: "Gao, Liming" , "Zurcher, Christopher J" , "devel@edk2.groups.io" , "Kinney, Michael D" CC: "Yao, Jiewen" , "Wang, Jian J" Subject: Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out Thread-Topic: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out Thread-Index: AQHVWTVJRJk+SR3YyUSLfUXnUkNgjKcON75ggASZrECAAFuM8P//wUEAgAS1X1A= Date: Mon, 2 Sep 2019 01:10:48 +0000 Message-ID: References: <20190822220215.24536-1-christopher.j.zurcher@intel.com> <20190822220215.24536-2-christopher.j.zurcher@intel.com> <8EE4873E19344F4DA986A2AC15D512AE4A4802AF@CRSMSX103.amr.corp.intel.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14E4E1373@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E4E1373@SHSMSX104.ccr.corp.intel.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: hao.a.wu@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > -----Original Message----- > From: Gao, Liming > Sent: Friday, August 30, 2019 5:15 PM > To: Wu, Hao A; Zurcher, Christopher J; devel@edk2.groups.io; Kinney, > Michael D > 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 >=20 > UefiScsiLib is designed for the convenient usage with SCSI commands. The= y > 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. >=20 > For the change in MdePkg\Include\Protocol\ScsiIo.h, where is new definit= ion > EFI_SCSI_IO_TYPE_WLUN from? Hello Liming, The macro "EFI_SCSI_IO_TYPE_WLUN" comes from the SCSI Primary Commands sta= ndard (SPC), just like other existing definitions listed together in the header = file. Best Regards, Hao Wu >=20 > Thanks > Liming > >-----Original Message----- > >From: Wu, Hao A > >Sent: Friday, August 30, 2019 1:18 PM > >To: Zurcher, Christopher J ; > >devel@edk2.groups.io; Gao, Liming ; Kinney, > Michael > >D > >Cc: Yao, Jiewen ; Wang, Jian J > > > >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 A= PI. > > > >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 w= ith > >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 alway= s 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@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. T= hat 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@edk2.groups.io; Zurcher, Christopher J > >> > >> 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 > >> > >> Hello, > >> > >> Please refer to the below inline comments: > >> > >> > >> > -----Original Message----- > >> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf > Of > >> > Zurcher, Christopher J > >> > Sent: Friday, August 23, 2019 6:02 AM > >> > To: devel@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 Protoco= l Out > >> > commands in UefiScsiLib to prepare support for the Storage Security > >> > Command Protocol. > >> > > >> > Cc: Jiewen Yao > >> > Cc: Jian J Wang > >> > Cc: Liming Gao > >> > Signed-off-by: Christopher J Zurcher > >> > --- > >> > 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 reserve= d.
> >> > + Copyright (c) 2006 - 2019, Intel Corporation. All rights reserve= d.
> >> > 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 devic= e (e.g. > >> > magnetic disk) > >> > -#define EFI_SCSI_TYPE_TAPE 0x01 ///< Sequential-access d= evice > >(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 devi= ce > >(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=3D,,,20,0,0,0::Created,,s= csi, > >> 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 dev= ice (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 de= vice > >> (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 con= troller > >> > device (e.g., RAID) > >> > +#define EFI_SCSI_TYPE_SES 0x0D ///< Enclosure service= s 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 Stor= age > >> 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 logica= l 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.=
> >> > +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.=
> >> > SPDX-License-Identifier: BSD-2-Clause-Patent > >> > > >> > **/ > >> > @@ -813,6 +813,130 @@ ScsiWrite16Command ( > >> > ); > >> > > >> > > >> > +/** > >> > + Execute Security Protocol In SCSI command on a specific SCSI tar= get. > >> > + > >> > + Executes the SCSI Security Protocol In command on the SCSI targe= t > >> > specified by ScsiIo. > >> > + If Timeout is zero, then this function waits indefinitely for th= e > command > >> to > >> > complete. > >> > + If Timeout is greater than zero, then the command is executed an= d > will > >> > timeout after > >> > + Timeout 100 ns units. The StartLba and SectorSize parameters ar= e > 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 perio= d. > >> > + @param[in, out] SenseData A pointer to output sense d= ata. > >> > + @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 us= e. > >> > + @param[in] SecurityProtocolSpecific The Security Protocol = Specific > >> data. > >> > + @param[in] TransferLength The size in bytes of the da= ta > 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 'DataBuff= er'; > >> '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 t= o the data > >> buffer. > >> > >> > >> > + > >> > + @retval EFI_SUCCESS Command is executed success= fully. > >> > + @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was > >> > executed, but the entire DataBuffer could > >> > + not be transferred. The act= ual number of bytes > >> > transferred is returned in DataLength. > >> > + @retval EFI_NOT_READY The SCSI Request Packet cou= ld not > be > >> > sent because there are too many > >> > + SCSI Command Packets alread= y queued. > >> > + @retval EFI_DEVICE_ERROR A device error occurred whi= le > >> > attempting to send SCSI Request Packet. > >> > + @retval EFI_UNSUPPORTED The command described by th= e > SCSI > >> > Request Packet is not supported by > >> > + the SCSI initiator(i.e., SC= SI Host Controller) > >> > + @retval EFI_TIMEOUT A timeout occurred while wa= iting 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, b= ut > >> for other devices, setting this field to 1 may be a valid configurati= on. > >> > >> > >> 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 ta= rget. > >> > + > >> > + Executes the SCSI Security Protocol Out command on the SCSI targ= et > >> > specified by ScsiIo. > >> > + If Timeout is zero, then this function waits indefinitely for th= e > command > >> to > >> > complete. > >> > + If Timeout is greater than zero, then the command is executed an= d > will > >> > timeout after > >> > + Timeout 100 ns units. The StartLba and SectorSize parameters ar= e > 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 perio= d. > >> > + @param[in, out] SenseData A pointer to output sense d= ata. > >> > + @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 us= e. > >> > + @param[in] SecurityProtocolSpecific The Security Protocol = Specific > >> data. > >> > + @param[in] TransferLength The size in bytes of the tr= ansfer > 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 'DataB= uffer'. > >> > >> > >> > + > >> > + @retval EFI_SUCCESS Command is executed success= fully. > >> > + @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was > >> > executed, but the entire DataBuffer could > >> > + not be transferred. The act= ual number of bytes > >> > transferred is returned in DataLength. > >> > + @retval EFI_NOT_READY The SCSI Request Packet cou= ld not > be > >> > sent because there are too many > >> > + SCSI Command Packets alread= y queued. > >> > + @retval EFI_DEVICE_ERROR A device error occurred whi= le > >> > attempting to send SCSI Request Packet. > >> > + @retval EFI_UNSUPPORTED The command described by th= e > SCSI > >> > Request Packet is not supported by > >> > + the SCSI initiator(i.e., SC= SI Host Controller) > >> > + @retval EFI_TIMEOUT A timeout occurred while wa= iting 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 specifi= c > 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, func= tions > for > >> > managing devices on SCSI buses are defined here. > >> > > >> > - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserve= d.
> >> > + Copyright (c) 2006 - 2019, Intel Corporation. All rights reserve= d.
> >> > 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 0x0= F ///< Optical > >> card > >> > reader/writer device > >> > #define MFI_SCSI_IO_TYPE_BRIDGE 0x1= 0 ///< Bridge > >> > Controller Commands > >> > #define MFI_SCSI_IO_TYPE_OSD 0x1= 1 ///< Object- > >> based > >> > Storage Device > >> > -#define EFI_SCSI_IO_TYPE_RESERVED_LOW 0x1= 2 ///< > >> > Reserved (low) > >> > -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH 0x1= E ///< > >> > Reserved (high) > >> > +#define MFI_SCSI_IO_TYPE_AUTOMATION 0x1= 2 ///< > >> > Automation/Drive Interface > >> > +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER 0x1= 3 > ///< > >> > Security manager device > >> > +#define EFI_SCSI_IO_TYPE_RESERVED_LOW 0x1= 4 ///< > >> > Reserved (low) > >> > +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH 0x1= D ///< > >> > Reserved (high) > >> > +#define EFI_SCSI_IO_TYPE_WLUN 0x1= E ///< Well > >> known > >> > logical unit > >> > #define EFI_SCSI_IO_TYPE_UNKNOWN 0x1= F ///< > >> 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 reserve= d.
> >> > + Copyright (c) 2006 - 2019, Intel Corporation. All rights reserve= d.
> >> > 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 tar= get. > >> > + > >> > + Executes the SCSI Security Protocol In command on the SCSI targe= t > >> > specified by ScsiIo. > >> > + If Timeout is zero, then this function waits indefinitely for th= e > command > >> to > >> > complete. > >> > + If Timeout is greater than zero, then the command is executed an= d > will > >> > timeout after > >> > + Timeout 100 ns units. The StartLba and SectorSize parameters ar= e > 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 perio= d. > >> > + @param[in, out] SenseData A pointer to output sense d= ata. > >> > + @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 us= e. > >> > + @param[in] SecurityProtocolSpecific The Security Protocol = Specific > >> data. > >> > + @param[in] TransferLength The size in bytes of the da= ta > 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 success= fully. > >> > + @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was > >> > executed, but the entire DataBuffer could > >> > + not be transferred. The act= ual number of bytes > >> > transferred is returned in DataLength. > >> > + @retval EFI_NOT_READY The SCSI Request Packet cou= ld not > be > >> > sent because there are too many > >> > + SCSI Command Packets alread= y queued. > >> > + @retval EFI_DEVICE_ERROR A device error occurred whi= le > >> > attempting to send SCSI Request Packet. > >> > + @retval EFI_UNSUPPORTED The command described by th= e > SCSI > >> > Request Packet is not supported by > >> > + the SCSI initiator(i.e., SC= SI Host Controller) > >> > + @retval EFI_TIMEOUT A timeout occurred while wa= iting 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 !=3D NULL); > >> > + ASSERT (HostAdapterStatus !=3D NULL); > >> > + ASSERT (TargetStatus !=3D NULL); > >> > + ASSERT (DataLength !=3D NULL); > >> > + ASSERT (ScsiIo !=3D NULL); > >> > + > >> > + ZeroMem (&CommandPacket, sizeof > >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); > >> > + ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE); > >> > + > >> > + CommandPacket.Timeout =3D Timeout; > >> > + CommandPacket.InDataBuffer =3D DataBuffer; > >> > + CommandPacket.SenseData =3D SenseData; > >> > + CommandPacket.InTransferLength =3D TransferLength; > >> > + CommandPacket.Cdb =3D Cdb; > >> > + // > >> > + // Fill Cdb for Security Protocol In Command > >> > + // > >> > + Cdb[0] =3D EFI_SCSI_OP_SECURITY_PROTOCOL_= IN; > >> > + Cdb[1] =3D SecurityProtocol; > >> > + WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16 > >> > (SecurityProtocolSpecific)); > >> > + WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 > (TransferLength)); > >> > + > >> > + CommandPacket.CdbLength =3D EFI_SCSI_OP_LENGTH_TWELVE; > >> > + CommandPacket.DataDirection =3D EFI_SCSI_DATA_IN; > >> > + CommandPacket.SenseDataLength =3D *SenseDataLength; > >> > + > >> > + Status =3D ScsiIo->ExecuteScsiCommand (Sc= siIo, > >> > &CommandPacket, NULL); > >> > + > >> > + *HostAdapterStatus =3D CommandPacket.HostAdapterStatu= s; > >> > + *TargetStatus =3D CommandPacket.TargetStatus; > >> > + *SenseDataLength =3D CommandPacket.SenseDataLength; > >> > + *DataLength =3D CommandPacket.InTransferLength= ; > >> > + > >> > + return Status; > >> > +} > >> > + > >> > + > >> > +/** > >> > + Execute Security Protocol Out SCSI command on a specific SCSI ta= rget. > >> > + > >> > + Executes the SCSI Security Protocol Out command on the SCSI targ= et > >> > specified by ScsiIo. > >> > + If Timeout is zero, then this function waits indefinitely for th= e > command > >> to > >> > complete. > >> > + If Timeout is greater than zero, then the command is executed an= d > will > >> > timeout after > >> > + Timeout 100 ns units. The StartLba and SectorSize parameters ar= e > 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 perio= d. > >> > + @param[in, out] SenseData A pointer to output sense d= ata. > >> > + @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 us= e. > >> > + @param[in] SecurityProtocolSpecific The Security Protocol = Specific > >> data. > >> > + @param[in] TransferLength The size in bytes of the tr= ansfer > data. > >> > + @param[in, out] DataBuffer A pointer to a data buffer. > >> > + > >> > + @retval EFI_SUCCESS Command is executed success= fully. > >> > + @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was > >> > executed, but the entire DataBuffer could > >> > + not be transferred. The act= ual number of bytes > >> > transferred is returned in DataLength. > >> > + @retval EFI_NOT_READY The SCSI Request Packet cou= ld not > be > >> > sent because there are too many > >> > + SCSI Command Packets alread= y queued. > >> > + @retval EFI_DEVICE_ERROR A device error occurred whi= le > >> > attempting to send SCSI Request Packet. > >> > + @retval EFI_UNSUPPORTED The command described by th= e > SCSI > >> > Request Packet is not supported by > >> > + the SCSI initiator(i.e., SC= SI Host Controller) > >> > + @retval EFI_TIMEOUT A timeout occurred while wa= iting 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 !=3D NULL); > >> > + ASSERT (HostAdapterStatus !=3D NULL); > >> > + ASSERT (TargetStatus !=3D NULL); > >> > + ASSERT (ScsiIo !=3D NULL); > >> > + > >> > + ZeroMem (&CommandPacket, sizeof > >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET)); > >> > + ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE); > >> > + > >> > + CommandPacket.Timeout =3D Timeout; > >> > + CommandPacket.OutDataBuffer =3D DataBuffer; > >> > + CommandPacket.SenseData =3D SenseData; > >> > + CommandPacket.OutTransferLength =3D TransferLength; > >> > + CommandPacket.Cdb =3D Cdb; > >> > + // > >> > + // Fill Cdb for Security Protocol Out Command > >> > + // > >> > + Cdb[0] =3D EFI_SCSI_OP_SECURITY_PROTOCOL_= OUT; > >> > + Cdb[1] =3D SecurityProtocol; > >> > + WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16 > >> > (SecurityProtocolSpecific)); > >> > + WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 > (TransferLength)); > >> > + > >> > + CommandPacket.CdbLength =3D EFI_SCSI_OP_LENGTH_TWELVE; > >> > + CommandPacket.DataDirection =3D EFI_SCSI_DATA_OUT; > >> > + CommandPacket.SenseDataLength =3D *SenseDataLength; > >> > + > >> > + Status =3D ScsiIo->ExecuteScsiCommand (Sc= siIo, > >> > &CommandPacket, NULL); > >> > + > >> > + *HostAdapterStatus =3D CommandPacket.HostAdapterStatu= s; > >> > + *TargetStatus =3D CommandPacket.TargetStatus; > >> > + *SenseDataLength =3D CommandPacket.SenseDataLength; > >> > + > >> > + return Status; > >> > +} > >> > + > >> > + > >> > /** > >> > Internal helper notify function in which update the result of th= e > >> > non-blocking SCSI Read/Write commands and signal caller event. > >> > -- > >> > 2.16.2.windows.1 > >> > > >> > > >> >=20