From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=hao.a.wu@intel.com; receiver=edk2-devel@lists.01.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 47042211C2830 for ; Wed, 30 Jan 2019 21:28:46 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Jan 2019 21:28:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,543,1539673200"; d="scan'208";a="271350908" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga004.jf.intel.com with ESMTP; 30 Jan 2019 21:28:45 -0800 Received: from fmsmsx158.amr.corp.intel.com (10.18.116.75) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 30 Jan 2019 21:28:44 -0800 Received: from shsmsx108.ccr.corp.intel.com (10.239.4.97) by fmsmsx158.amr.corp.intel.com (10.18.116.75) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 30 Jan 2019 21:28:44 -0800 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.102]) by SHSMSX108.ccr.corp.intel.com ([169.254.8.36]) with mapi id 14.03.0415.000; Thu, 31 Jan 2019 13:28:42 +0800 From: "Wu, Hao A" To: "Ni, Ray" , "edk2-devel@lists.01.org" CC: "Wang, Jian J" , "Dong, Eric" Thread-Topic: [PATCH v2 02/12] MdeModulePkg: Add definitions for EDKII PEI ATA PassThru PPI Thread-Index: AQHUuQ+JSFtx/P6EZEKhqD6nDbvY3qXIMEKAgACpFOA= Date: Thu, 31 Jan 2019 05:28:42 +0000 Message-ID: References: <20190131024854.4880-1-hao.a.wu@intel.com> <20190131024854.4880-3-hao.a.wu@intel.com> <734D49CCEBEEF84792F5B80ED585239D5BFFFEC1@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5BFFFEC1@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 Subject: Re: [PATCH v2 02/12] MdeModulePkg: Add definitions for EDKII PEI ATA PassThru PPI X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Jan 2019 05:28:46 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > -----Original Message----- > From: Ni, Ray > Sent: Thursday, January 31, 2019 11:23 AM > To: Wu, Hao A; edk2-devel@lists.01.org > Cc: Wang, Jian J; Dong, Eric > Subject: RE: [PATCH v2 02/12] MdeModulePkg: Add definitions for EDKII PEI > ATA PassThru PPI >=20 > Hao, > You could re-use the structure definition in AtaPassThru protocol. > For example: EFI_ATA_PASS_THRU_MODE v.s. > EDKII_PEI_ATA_PASS_THRU_MODE > I see more duplicated structure definitions. We can avoid them. Got it. I will refine this patch in the next series. Best Regards, Hao Wu >=20 > Thanks, > Ray >=20 > > -----Original Message----- > > From: Wu, Hao A > > Sent: Thursday, January 31, 2019 10:49 AM > > To: edk2-devel@lists.01.org > > Cc: Wu, Hao A ; Wang, Jian J ; > > Ni, Ray ; Dong, Eric > > Subject: [PATCH v2 02/12] MdeModulePkg: Add definitions for EDKII PEI A= TA > > PassThru PPI > > > > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1409 > > > > This commit will add the definitions for EDKII PEI ATA PassThru PPI. Th= is PPI > > will provide services that allow ATA commands to be sent to ATA devices > > attached to an ATA controller in the PEI phase. > > > > More specifically, the PPI will provide services to: > > > > * Send ATA commands to an ATA device (by service 'PassThru'); > > * Get the list of the attached ATA device on a controller (by services > > 'GetNextPort' and 'GetNextDevice'); > > * Get the identification information (DevicePath) of the underlying ATA > > host controller (by service 'GetDevicePath'). > > > > Cc: Jian J Wang > > Cc: Ruiyu Ni > > Cc: Eric Dong > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Hao Wu > > --- > > MdeModulePkg/MdeModulePkg.dec | 3 + > > MdeModulePkg/Include/Ppi/AtaPassThru.h | 359 ++++++++++++++++++++ > > 2 files changed, 362 insertions(+) > > > > diff --git a/MdeModulePkg/MdeModulePkg.dec > > b/MdeModulePkg/MdeModulePkg.dec index 4411185073..8efb19e626 > > 100644 > > --- a/MdeModulePkg/MdeModulePkg.dec > > +++ b/MdeModulePkg/MdeModulePkg.dec > > @@ -483,6 +483,9 @@ > > ## Include/Ppi/AtaAhciController.h > > gEdkiiPeiAtaAhciHostControllerPpiGuid =3D { 0x61dd33ea, 0x421f, = 0x4cc0, > > { 0x89, 0x29, 0xff, 0xee, 0xa9, 0xa1, 0xa2, 0x61 } } > > > > + ## Include/Ppi/AtaPassThru.h > > + gEdkiiPeiAtaPassThruPpiGuid =3D { 0xa16473fd, 0xd474, = 0x4c89, > { 0xae, > > 0xc7, 0x90, 0xb8, 0x3c, 0x73, 0x86, 0x9 } } > > + > > [Protocols] > > ## Load File protocol provides capability to load and unload EFI ima= ge into > > memory and execute it. > > # Include/Protocol/LoadPe32Image.h > > diff --git a/MdeModulePkg/Include/Ppi/AtaPassThru.h > > b/MdeModulePkg/Include/Ppi/AtaPassThru.h > > new file mode 100644 > > index 0000000000..9281f0b833 > > --- /dev/null > > +++ b/MdeModulePkg/Include/Ppi/AtaPassThru.h > > @@ -0,0 +1,359 @@ > > +/** @file > > + > > + Copyright (c) 2019, Intel Corporation. All rights reserved.
Thi= s > > + program and the accompanying materials are licensed and made > > + available under the terms and conditions of the BSD License which > > + accompanies this distribution. The full text of the license may be > > + found at http://opensource.org/licenses/bsd-license.php > > + > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > + > > +**/ > > + > > +#ifndef _EDKII_ATA_PASS_THRU_PPI_H_ > > +#define _EDKII_ATA_PASS_THRU_PPI_H_ > > + > > +#include > > + > > +/// > > +/// Global ID for the EDKII_PEI_ATA_PASS_THRU_PPI. > > +/// > > +#define EDKII_PEI_ATA_PASS_THRU_PPI_GUID \ > > + { \ > > + 0xa16473fd, 0xd474, 0x4c89, { 0xae, 0xc7, 0x90, 0xb8, 0x3c, 0x73, > > +0x86, 0x9 } \ > > + } > > + > > +// > > +// Forward declaration for the EDKII_PEI_ATA_PASS_THRU_PPI. > > +// > > +typedef struct _EDKII_PEI_ATA_PASS_THRU_PPI > > +EDKII_PEI_ATA_PASS_THRU_PPI; > > + > > +// > > +// Revision The revision to which the ATA Pass Thru PPI interface adhe= res. > > +// All future revisions must be backwards compatible. > > +// If a future version is not back wards compatible it is not= the same > > GUID. > > +// > > +#define EDKII_PEI_ATA_PASS_THRU_PPI_REVISION 0x0001000= 0 > > + > > +typedef struct { > > + UINT32 Attributes; > > + UINT32 IoAlign; > > +} EDKII_PEI_ATA_PASS_THRU_MODE; > > + > > +/// > > +/// If this bit is set, then the EDKII_PEI_ATA_PASS_THRU_PPI interface > > +is for /// physical devices on the ATA controller. > > +/// > > +#define EDKII_PEI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL 0x0001 > > +/// > > +/// If this bit is set, then the EDKII_PEI_ATA_PASS_THRU_PPI interface > > +is for /// logical devices on the ATA controller. > > +/// > > +#define EDKII_PEI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL 0x0002 > > + > > +typedef struct { > > + UINT8 Reserved1[2]; > > + UINT8 AtaStatus; > > + UINT8 AtaError; > > + UINT8 AtaSectorNumber; > > + UINT8 AtaCylinderLow; > > + UINT8 AtaCylinderHigh; > > + UINT8 AtaDeviceHead; > > + UINT8 AtaSectorNumberExp; > > + UINT8 AtaCylinderLowExp; > > + UINT8 AtaCylinderHighExp; > > + UINT8 Reserved2; > > + UINT8 AtaSectorCount; > > + UINT8 AtaSectorCountExp; > > + UINT8 Reserved3[6]; > > +} EDKII_PEI_ATA_STATUS_BLOCK; > > + > > +typedef struct { > > + UINT8 Reserved1[2]; > > + UINT8 AtaCommand; > > + UINT8 AtaFeatures; > > + UINT8 AtaSectorNumber; > > + UINT8 AtaCylinderLow; > > + UINT8 AtaCylinderHigh; > > + UINT8 AtaDeviceHead; > > + UINT8 AtaSectorNumberExp; > > + UINT8 AtaCylinderLowExp; > > + UINT8 AtaCylinderHighExp; > > + UINT8 AtaFeaturesExp; > > + UINT8 AtaSectorCount; > > + UINT8 AtaSectorCountExp; > > + UINT8 Reserved2[6]; > > +} EDKII_PEI_ATA_COMMAND_BLOCK; > > + > > +typedef UINT8 EDKII_PEI_ATA_PASS_THRU_CMD_PROTOCOL; > > + > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_ATA_HARDWARE_RESET > > 0x00 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_ATA_SOFTWARE_RESET > > 0x01 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA > > 0x02 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN 0x04 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT 0x05 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_DMA 0x06 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_DMA_QUEUED 0x07 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_DEVICE_DIAGNOSTIC > > 0x08 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_DEVICE_RESET 0x09 > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_UDMA_DATA_IN > > 0x0A > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_UDMA_DATA_OUT > > 0x0B > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_FPDMA 0x0C > > +#define EDKII_PEI_ATA_PASS_THRU_PROTOCOL_RETURN_RESPONSE > > 0xFF > > + > > +typedef UINT8 EDKII_PEI_ATA_PASS_THRU_LENGTH; > > + > > +#define EDKII_PEI_ATA_PASS_THRU_LENGTH_BYTES 0x80 > > + > > + > > +#define EDKII_PEI_ATA_PASS_THRU_LENGTH_MASK 0x70 > > +#define EDKII_PEI_ATA_PASS_THRU_LENGTH_NO_DATA_TRANSFER > > 0x00 > > +#define EDKII_PEI_ATA_PASS_THRU_LENGTH_FEATURES 0x10 > > +#define EDKII_PEI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT 0x20 > > +#define EDKII_PEI_ATA_PASS_THRU_LENGTH_TPSIU 0x30 > > + > > +#define EDKII_PEI_ATA_PASS_THRU_LENGTH_COUNT 0x0F > > + > > +typedef struct { > > + // > > + // A pointer to the sense data that was generated by the execution o= f > > +the ATA > > + // command. It must be aligned to the boundary specified in the > > +IoAlign field > > + // in the EDKII_PEI_ATA_PASS_THRU_PASSTHRU structure. > > + // > > + EDKII_PEI_ATA_STATUS_BLOCK *Asb; > > + // > > + // A pointer to buffer that contains the Command Data Block to send > > +to the ATA > > + // device specified by Port and PortMultiplierPort. > > + // > > + EDKII_PEI_ATA_COMMAND_BLOCK *Acb; > > + // > > + // The timeout, in 100 ns units, to use for the execution of this AT= A > > command. > > + // A Timeout value of 0 means that this function will wait > > +indefinitely for the > > + // ATA command to execute. If Timeout is greater than zero, then thi= s > > +function > > + // will return EFI_TIMEOUT if the time required to execute the ATA > > +command is > > + // greater than Timeout. > > + // > > + UINT64 Timeout; > > + // > > + // A pointer to the data buffer to transfer between the ATA > > +controller and the > > + // ATA device for read and bidirectional commands. For all write and > > +non data > > + // commands where InTransferLength is 0 this field is optional and m= ay be > > NULL. > > + // If this field is not NULL, then it must be aligned on the boundar= y > > +specified > > + // by the IoAlign field in the EDKII_PEI_ATA_PASS_THRU_PASSTHRU > > structure. > > + // > > + VOID *InDataBuffer; > > + // > > + // A pointer to the data buffer to transfer between the ATA > > +controller and the > > + // ATA device for write or bidirectional commands. For all read and > > +non data > > + // commands where OutTransferLength is 0 this field is optional and = may > > be NULL. > > + // If this field is not NULL, then it must be aligned on the boundar= y > > +specified > > + // by the IoAlign field in the EDKII_PEI_ATA_PASS_THRU_PASSTHRU > > structure. > > + // > > + VOID *OutDataBuffer; > > + // > > + // On input, the size, in bytes, of InDataBuffer. On output, the > > +number of bytes > > + // transferred between the ATA controller and the ATA device. If > > +InTransferLength > > + // is larger than the ATA controller can handle, no data will be > > +transferred, > > + // InTransferLength will be updated to contain the number of bytes > > +that the ATA > > + // controller is able to transfer, and EFI_BAD_BUFFER_SIZE will be r= eturned. > > + // > > + UINT32 InTransferLength; > > + // > > + // On Input, the size, in bytes of OutDataBuffer. On Output, the > > +Number of bytes > > + // transferred between ATA Controller and the ATA device. If > > +OutTransferLength is > > + // larger than the ATA controller can handle, no data will be > > +transferred, > > + // OutTransferLength will be updated to contain the number of bytes > > +that the ATA > > + // controller is able to transfer, and EFI_BAD_BUFFER_SIZE will be r= eturned. > > + // > > + UINT32 OutTransferLength; > > + // > > + // Specifies the PPI used when the ATA device executes the command. > > + // > > + EDKII_PEI_ATA_PASS_THRU_CMD_PROTOCOL Protocol; > > + // > > + // Specifies the way in which the ATA command length is encoded. > > + // > > + EDKII_PEI_ATA_PASS_THRU_LENGTH Length; > > +} EDKII_PEI_ATA_PASS_THRU_COMMAND_PACKET; > > + > > + > > +/** > > + Sends an ATA command to an ATA device that is attached to the ATA > > controller. > > + > > + @param[in] This The PPI instance pointer. > > + @param[in] Port The port number of the ATA devi= ce to send > > + the command. > > + @param[in] PortMultiplierPort The port multiplier port number= of the > > ATA > > + device to send the command. > > + If there is no port multiplier,= then specify > > + 0xFFFF. > > + @param[in,out] Packet A pointer to the ATA command to= send to > > + the ATA device specified by Por= t and > > + PortMultiplierPort. > > + > > + @retval EFI_SUCCESS The ATA command was sent by the hos= t. For > > + bi-directional commands, InTransfer= Length bytes > > + were transferred from InDataBuffer.= For write > > + and bi-directional commands, OutTra= nsferLength > > + bytes were transferred by OutDataBu= ffer. > > + @retval EFI_NOT_FOUND The specified ATA device is not fou= nd. > > + @retval EFI_INVALID_PARAMETER The contents of Acb are invalid. Th= e > > ATA command > > + was not sent, so no additional stat= us information > > + is available. > > + @retval EFI_BAD_BUFFER_SIZE The ATA command was not executed. > > The number > > + of bytes that could be transferred = is returned > > + in InTransferLength. For write and = bi-directional > > + commands, OutTransferLength bytes w= ere transferred > > + by OutDataBuffer. > > + @retval EFI_NOT_READY The ATA command could not be sent > > because there > > + are too many ATA commands already q= ueued. The > > + caller may retry again later. > > + @retval EFI_DEVICE_ERROR A device error occurred while attem= pting > > to > > + send the ATA command. > > + > > +**/ > > +typedef > > +EFI_STATUS > > +(EFIAPI *EDKII_PEI_ATA_PASS_THRU_PASSTHRU) ( > > + IN EDKII_PEI_ATA_PASS_THRU_PPI *This, > > + IN UINT16 Port, > > + IN UINT16 PortMultiplierPort, > > + IN OUT EDKII_PEI_ATA_PASS_THRU_COMMAND_PACKET *Packet > > + ); > > + > > +/** > > + Used to retrieve the list of legal port numbers for ATA devices on a= n ATA > > controller. > > + These can either be the list of ports where ATA devices are actually > > +present or the > > + list of legal port numbers for the ATA controller. Regardless, the > > +caller of this > > + function must probe the port number returned to see if an ATA device > > +is actually > > + present at that location on the ATA controller. > > + > > + The GetNextPort() function retrieves the port number on an ATA > > + controller. If on input Port is 0xFFFF, then the port number of the > > + first port on the ATA controller is returned in Port and EFI_SUCCESS= is > > returned. > > + > > + If Port is a port number that was returned on a previous call to > > + GetNextPort(), then the port number of the next port on the ATA > > + controller is returned in Port, and EFI_SUCCESS is returned. If Port > > + is not 0xFFFF and Port was not returned on a previous call to > > GetNextPort(), then EFI_INVALID_PARAMETER is returned. > > + > > + If Port is the port number of the last port on the ATA controller, > > + then EFI_NOT_FOUND is returned. > > + > > + @param[in] This The PPI instance pointer. > > + @param[in,out] Port On input, a pointer to the port number on the= ATA > > controller. > > + On output, a pointer to the next port number = on the ATA > > + controller. An input value of 0xFFFF retrieve= s the first > > + port number on the ATA controller. > > + > > + @retval EFI_SUCCESS The next port number on the ATA con= troller > > was > > + returned in Port. > > + @retval EFI_NOT_FOUND There are no more ports on this ATA > > controller. > > + @retval EFI_INVALID_PARAMETER Port is not 0xFFFF and Port was not > > returned > > + on a previous call to GetNextPort()= . > > + > > +**/ > > +typedef > > +EFI_STATUS > > +(EFIAPI *EDKII_PEI_ATA_PASS_THRU_THRU_GET_NEXT_PORT) ( > > + IN EDKII_PEI_ATA_PASS_THRU_PPI *This, > > + IN OUT UINT16 *Port > > + ); > > + > > +/** > > + Used to retrieve the list of legal port multiplier port numbers for > > +ATA devices > > + on a port of an ATA controller. These can either be the list of port > > +multiplier > > + ports where ATA devices are actually present on port or the list of > > +legal port > > + multiplier ports on that port. Regardless, the caller of this > > +function must probe > > + the port number and port multiplier port number returned to see if a= n > > +ATA device > > + is actually present. > > + > > + The GetNextDevice() function retrieves the port multiplier port > > + number of an ATA device present on a port of an ATA controller. > > + > > + If PortMultiplierPort points to a port multiplier port number value > > + that was returned on a previous call to GetNextDevice(), then the > > + port multiplier port number of the next ATA device on the port of th= e > > + ATA controller is returned in PortMultiplierPort, and EFI_SUCCESS is > > returned. > > + > > + If PortMultiplierPort points to 0xFFFF, then the port multiplier por= t > > + number of the first ATA device on port of the ATA controller is > > + returned in PortMultiplierPort and EFI_SUCCESS is returned. > > + > > + If PortMultiplierPort is not 0xFFFF and the value pointed to by > > + PortMultiplierPort was not returned on a previous call to > > + GetNextDevice(), then EFI_INVALID_PARAMETER is returned. > > + > > + If PortMultiplierPort is the port multiplier port number of the last > > + ATA device on the port of the ATA controller, then EFI_NOT_FOUND is > > returned. > > + > > + @param[in] This The PPI instance pointer. > > + @param[in] Port The port number present on the = ATA > controller. > > + @param[in,out] PortMultiplierPort On input, a pointer to the port > > multiplier > > + port number of an ATA device pr= esent on the > > + ATA controller. If on input a P= ortMultiplierPort > > + of 0xFFFF is specified, then th= e port multiplier > > + port number of the first ATA de= vice is returned. > > + On output, a pointer to the por= t multiplier port > > + number of the next ATA device p= resent on an ATA > > + controller. > > + > > + @retval EFI_SUCCESS The port multiplier port number of = the next > > ATA > > + device on the port of the ATA contr= oller was > > + returned in PortMultiplierPort. > > + @retval EFI_NOT_FOUND There are no more ATA devices on th= is > > port of > > + the ATA controller. > > + @retval EFI_INVALID_PARAMETER PortMultiplierPort is not 0xFFFF, a= nd > > PortMultiplierPort > > + was not returned on a previous call= to GetNextDevice(). > > + > > +**/ > > +typedef > > +EFI_STATUS > > +(EFIAPI *EDKII_PEI_ATA_PASS_THRU_GET_NEXT_DEVICE) ( > > + IN EDKII_PEI_ATA_PASS_THRU_PPI *This, > > + IN UINT16 Port, > > + IN OUT UINT16 *PortMultiplierPort > > + ); > > + > > +/** > > + Gets the device path information of the underlying ATA host controll= er. > > + > > + @param[in] This The PPI instance pointer. > > + @param[out] DevicePathLength The length of the device path in byt= es > > specified > > + by DevicePath. > > + @param[out] DevicePath The device path of the underlying AT= A host > > controller. > > + This field re-uses EFI Device Path P= rotocol as > > + defined by Section 10.2 EFI Device P= ath Protocol > > + of UEFI 2.7 Specification. > > + > > + @retval EFI_SUCCESS The device path of the ATA host con= troller > has > > + been successfully returned. > > + @retval EFI_INVALID_PARAMETER DevicePathLength or DevicePath is > > NULL. > > + @retval EFI_OUT_OF_RESOURCES Not enough resource to return the > > device path. > > + > > +**/ > > +typedef > > +EFI_STATUS > > +(EFIAPI *EDKII_PEI_ATA_PASS_THRU_GET_DEVICE_PATH) ( > > + IN EDKII_PEI_ATA_PASS_THRU_PPI *This, > > + OUT UINTN *DevicePathLength, > > + OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath > > + ); > > + > > +// > > +// EDKII_PEI_ATA_PASS_THRU_PPI provides the services that are required > > +to send // ATA commands to an ATA device during PEI. > > +// > > +struct _EDKII_PEI_ATA_PASS_THRU_PPI { > > + UINT64 Revision; > > + EDKII_PEI_ATA_PASS_THRU_MODE *Mode; > > + EDKII_PEI_ATA_PASS_THRU_PASSTHRU PassThru; > > + EDKII_PEI_ATA_PASS_THRU_THRU_GET_NEXT_PORT GetNextPort; > > + EDKII_PEI_ATA_PASS_THRU_GET_NEXT_DEVICE GetNextDevice; > > + EDKII_PEI_ATA_PASS_THRU_GET_DEVICE_PATH GetDevicePath; > > +}; > > + > > +extern EFI_GUID gEdkiiPeiAtaPassThruPpiGuid; > > + > > +#endif > > -- > > 2.12.0.windows.1