]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Protocol/NvmExpressPassthru.h
MdePkg/Include/Protocol/Tls.h: pack structures from the TLS RFC
[mirror_edk2.git] / MdePkg / Include / Protocol / NvmExpressPassthru.h
index 20e40b0ca0928290c2012097badce51dc6fde0c8..7a90c633ec7ea89012907bc187470bee1384168a 100644 (file)
-/** @file
-  This protocol provides services that allow NVM Express commands to be sent to an
-  NVM Express controller or to a specific namespace in a NVM Express controller.
-  This protocol interface is optimized for storage.
-
-  Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
-  This 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 _UEFI_NVM_EXPRESS_PASS_THRU_H_
-#define _UEFI_NVM_EXPRESS_PASS_THRU_H_
-
-#define EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL_GUID \
-  { \
-    0x52c78312, 0x8edc, 0x4233, { 0x98, 0xf2, 0x1a, 0x1a, 0xa5, 0xe3, 0x88, 0xa5 } \
-  }
-
-typedef struct _EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL;
-
-typedef struct {
-  UINT32          Attributes;
-  UINT32          IoAlign;
-  UINT32          NvmeVersion;
-} EFI_NVM_EXPRESS_PASS_THRU_MODE;
-
-//
-// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface is
-// for directly addressable namespaces.
-//
-#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL        0x0001
-//
-// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface is
-// for a single volume logical namespace comprised of multiple namespaces.
-//
-#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL         0x0002
-//
-// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface
-// supports non-blocking I/O.
-//
-#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_NONBLOCKIO      0x0004
-//
-// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface
-// supports NVM command set.
-//
-#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM     0x0008
-
-//
-// FusedOperation
-//
-#define NORMAL_CMD                  0x00
-#define FUSED_FIRST_CMD             0x01
-#define FUSED_SECOND_CMD            0x02
-
-typedef struct {
-  UINT32                            Opcode:8;
-  UINT32                            FusedOperation:2;
-  UINT32                            Reserved:22;
-} NVME_CDW0;
-
-//
-// Flags
-//
-#define CDW2_VALID                  0x01
-#define CDW3_VALID                  0x02
-#define CDW10_VALID                 0x04
-#define CDW11_VALID                 0x08
-#define CDW12_VALID                 0x10
-#define CDW13_VALID                 0x20
-#define CDW14_VALID                 0x40
-#define CDW15_VALID                 0x80
-
-//
-// Queue Type
-//
-#define NVME_ADMIN_QUEUE            0x00
-#define NVME_IO_QUEUE               0x01
-
-typedef struct {
-  NVME_CDW0                         Cdw0;
-  UINT8                             Flags;
-  UINT32                            Nsid;
-  UINT32                            Cdw2;
-  UINT32                            Cdw3;
-  UINT32                            Cdw10;
-  UINT32                            Cdw11;
-  UINT32                            Cdw12;
-  UINT32                            Cdw13;
-  UINT32                            Cdw14;
-  UINT32                            Cdw15;
-} EFI_NVM_EXPRESS_COMMAND;
-
-typedef struct {
-  UINT32                            DW0;
-  UINT32                            DW1;
-  UINT32                            DW2;
-  UINT32                            DW3;
-} EFI_NVM_EXPRESS_COMPLETION;
-
-typedef struct {
-  UINT64                            CommandTimeout;
-  VOID                              *TransferBuffer;
-  UINT32                            TransferLength;
-  VOID                              *MetadataBuffer;
-  UINT32                            MetadataLength;
-  UINT8                             QueueType;
-  EFI_NVM_EXPRESS_COMMAND           *NvmeCmd;
-  EFI_NVM_EXPRESS_COMPLETION        *NvmeCompletion;
-} EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;
-
-//
-// Protocol funtion prototypes
-//
-/**
-  Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function supports
-  both blocking I/O and non-blocking I/O. The blocking I/O functionality is required, and the non-blocking
-  I/O functionality is optional.
-
-
-  @param[in]     This                A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.
-  @param[in]     NamespaceId         A 32 bit namespace ID as defined in the NVMe specification to which the NVM Express Command
-                                     Packet will be sent.  A value of 0 denotes the NVM Express controller, a value of all 0xFF's
-                                     (all bytes are 0xFF) in the namespace ID specifies that the command packet should be sent to
-                                     all valid namespaces.
-  @param[in,out] Packet              A pointer to the NVM Express Command Packet.
-  @param[in]     Event               If non-blocking I/O is not supported then Event is ignored, and blocking I/O is performed.
-                                     If Event is NULL, then blocking I/O is performed. If Event is not NULL and non-blocking I/O
-                                     is supported, then non-blocking I/O is performed, and Event will be signaled when the NVM
-                                     Express Command Packet completes. 
-
-  @retval EFI_SUCCESS                The NVM Express Command Packet was sent by the host. TransferLength bytes were transferred
-                                     to, or from DataBuffer.
-  @retval EFI_BAD_BUFFER_SIZE        The NVM Express Command Packet was not executed. The number of bytes that could be transferred
-                                     is returned in TransferLength.
-  @retval EFI_NOT_READY              The NVM Express Command Packet could not be sent because the controller is not ready. The caller
-                                     may retry again later.
-  @retval EFI_DEVICE_ERROR           A device error occurred while attempting to send the NVM Express Command Packet.
-  @retval EFI_INVALID_PARAMETER      NamespaceId or the contents of EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET are invalid. The NVM
-                                     Express Command Packet was not sent, so no additional status information is available.
-  @retval EFI_UNSUPPORTED            The command described by the NVM Express Command Packet is not supported by the NVM Express
-                                     controller. The NVM Express Command Packet was not sent so no additional status information
-                                     is available.
-  @retval EFI_TIMEOUT                A timeout occurred while waiting for the NVM Express Command Packet to execute.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_PASSTHRU)(
-  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,
-  IN     UINT32                                      NamespaceId,
-  IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET    *Packet,
-  IN     EFI_EVENT                                   Event OPTIONAL
-  );
-
-/**
-  Used to retrieve the next namespace ID for this NVM Express controller.
-
-  The EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL.GetNextNamespace() function retrieves the next valid
-  namespace ID on this NVM Express controller. 
-
-  If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the first valid namespace
-  ID defined on the NVM Express controller is returned in the location pointed to by NamespaceId
-  and a status of EFI_SUCCESS is returned.
-
-  If on input the value pointed to by NamespaceId is an invalid namespace ID other than 0xFFFFFFFF,
-  then EFI_INVALID_PARAMETER is returned.
-
-  If on input the value pointed to by NamespaceId is a valid namespace ID, then the next valid
-  namespace ID on the NVM Express controller is returned in the location pointed to by NamespaceId,
-  and EFI_SUCCESS is returned.
-
-  If the value pointed to by NamespaceId is the namespace ID of the last namespace on the NVM
-  Express controller, then EFI_NOT_FOUND is returned.
-
-  @param[in]     This           A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.
-  @param[in,out] NamespaceId    On input, a pointer to a legal NamespaceId for an NVM Express
-                                namespace present on the NVM Express controller. On output, a
-                                pointer to the next NamespaceId of an NVM Express namespace on
-                                an NVM Express controller. An input value of 0xFFFFFFFF retrieves
-                                the first NamespaceId for an NVM Express namespace present on an
-                                NVM Express controller.
-
-  @retval EFI_SUCCESS           The Namespace ID of the next Namespace was returned.
-  @retval EFI_NOT_FOUND         There are no more namespaces defined on this controller.
-  @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other than 0xFFFFFFFF.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_GET_NEXT_NAMESPACE)(
-  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,
-  IN OUT UINT32                                      *NamespaceId
-  );
-
-/**
-  Used to allocate and build a device path node for an NVM Express namespace on an NVM Express controller.
-
-  The EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL.BuildDevicePath() function allocates and builds a single device
-  path node for the NVM Express namespace specified by NamespaceId.
-
-  If the NamespaceId is not valid, then EFI_NOT_FOUND is returned.
-
-  If DevicePath is NULL, then EFI_INVALID_PARAMETER is returned. 
-
-  If there are not enough resources to allocate the device path node, then EFI_OUT_OF_RESOURCES is returned.
-
-  Otherwise, DevicePath is allocated with the boot service AllocatePool(), the contents of DevicePath are
-  initialized to describe the NVM Express namespace specified by NamespaceId, and EFI_SUCCESS is returned.
-
-  @param[in]     This                A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.
-  @param[in]     NamespaceId         The NVM Express namespace ID  for which a device path node is to be
-                                     allocated and built. Caller must set the NamespaceId to zero if the
-                                     device path node will contain a valid UUID.
-  @param[in,out] DevicePath          A pointer to a single device path node that describes the NVM Express
-                                     namespace specified by NamespaceId. This function is responsible for
-                                     allocating the buffer DevicePath with the boot service AllocatePool().
-                                     It is the caller's responsibility to free DevicePath when the caller
-                                     is finished with DevicePath.
-  @retval EFI_SUCCESS                The device path node that describes the NVM Express namespace specified
-                                     by NamespaceId was allocated and returned in DevicePath.
-  @retval EFI_NOT_FOUND              The NamespaceId is not valid.
-  @retval EFI_INVALID_PARAMETER      DevicePath is NULL.
-  @retval EFI_OUT_OF_RESOURCES       There are not enough resources to allocate the DevicePath node.
-
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_BUILD_DEVICE_PATH)(
-  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,
-  IN     UINT32                                      NamespaceId,
-  IN OUT EFI_DEVICE_PATH_PROTOCOL                    **DevicePath
-  );
-
-/**
-  Used to translate a device path node to a namespace ID.
-
-  The EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL.GetNamespace() function determines the namespace ID associated with the
-  namespace described by DevicePath.
-
-  If DevicePath is a device path node type that the NVM Express Pass Thru driver supports, then the NVM Express
-  Pass Thru driver will attempt to translate the contents DevicePath into a namespace ID.
-
-  If this translation is successful, then that namespace ID is returned in NamespaceId, and EFI_SUCCESS is returned
-
-  @param[in]  This                A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.
-  @param[in]  DevicePath          A pointer to the device path node that describes an NVM Express namespace on
-                                  the NVM Express controller.
-  @param[out] NamespaceId         The NVM Express namespace ID contained in the device path node.
-
-  @retval EFI_SUCCESS             DevicePath was successfully translated to NamespaceId.
-  @retval EFI_INVALID_PARAMETER   If DevicePath or NamespaceId are NULL, then EFI_INVALID_PARAMETER is returned.
-  @retval EFI_UNSUPPORTED         If DevicePath is not a device path node type that the NVM Express Pass Thru driver
-                                  supports, then EFI_UNSUPPORTED is returned.
-  @retval EFI_NOT_FOUND           If DevicePath is a device path node type that the NVM Express Pass Thru driver
-                                  supports, but there is not a valid translation from DevicePath to a namespace ID,
-                                  then EFI_NOT_FOUND is returned.
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_GET_NAMESPACE)(
-  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,
-  IN     EFI_DEVICE_PATH_PROTOCOL                    *DevicePath,
-     OUT UINT32                                      *NamespaceId
-  );
-
-//
-// Protocol Interface Structure
-//
-struct _EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL {
-  EFI_NVM_EXPRESS_PASS_THRU_MODE                     *Mode;
-  EFI_NVM_EXPRESS_PASS_THRU_PASSTHRU                 PassThru;
-  EFI_NVM_EXPRESS_PASS_THRU_GET_NEXT_NAMESPACE       GetNextNamespace;
-  EFI_NVM_EXPRESS_PASS_THRU_BUILD_DEVICE_PATH        BuildDevicePath;
-  EFI_NVM_EXPRESS_PASS_THRU_GET_NAMESPACE            GetNamespace;
-};
-
-extern EFI_GUID gEfiNvmExpressPassThruProtocolGuid;
-
-#endif
-
+/** @file\r
+  This protocol provides services that allow NVM Express commands to be sent to an\r
+  NVM Express controller or to a specific namespace in a NVM Express controller.\r
+  This protocol interface is optimized for storage.\r
+\r
+  Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _UEFI_NVM_EXPRESS_PASS_THRU_H_\r
+#define _UEFI_NVM_EXPRESS_PASS_THRU_H_\r
+\r
+#define EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL_GUID \\r
+  { \\r
+    0x52c78312, 0x8edc, 0x4233, { 0x98, 0xf2, 0x1a, 0x1a, 0xa5, 0xe3, 0x88, 0xa5 } \\r
+  }\r
+\r
+typedef struct _EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL;\r
+\r
+typedef struct {\r
+  UINT32          Attributes;\r
+  UINT32          IoAlign;\r
+  UINT32          NvmeVersion;\r
+} EFI_NVM_EXPRESS_PASS_THRU_MODE;\r
+\r
+//\r
+// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface is\r
+// for directly addressable namespaces.\r
+//\r
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL        0x0001\r
+//\r
+// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface is\r
+// for a single volume logical namespace comprised of multiple namespaces.\r
+//\r
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL         0x0002\r
+//\r
+// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface\r
+// supports non-blocking I/O.\r
+//\r
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_NONBLOCKIO      0x0004\r
+//\r
+// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface\r
+// supports NVM command set.\r
+//\r
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM     0x0008\r
+\r
+//\r
+// FusedOperation\r
+//\r
+#define NORMAL_CMD                  0x00\r
+#define FUSED_FIRST_CMD             0x01\r
+#define FUSED_SECOND_CMD            0x02\r
+\r
+typedef struct {\r
+  UINT32                            Opcode:8;\r
+  UINT32                            FusedOperation:2;\r
+  UINT32                            Reserved:22;\r
+} NVME_CDW0;\r
+\r
+//\r
+// Flags\r
+//\r
+#define CDW2_VALID                  0x01\r
+#define CDW3_VALID                  0x02\r
+#define CDW10_VALID                 0x04\r
+#define CDW11_VALID                 0x08\r
+#define CDW12_VALID                 0x10\r
+#define CDW13_VALID                 0x20\r
+#define CDW14_VALID                 0x40\r
+#define CDW15_VALID                 0x80\r
+\r
+//\r
+// Queue Type\r
+//\r
+#define NVME_ADMIN_QUEUE            0x00\r
+#define NVME_IO_QUEUE               0x01\r
+\r
+typedef struct {\r
+  NVME_CDW0                         Cdw0;\r
+  UINT8                             Flags;\r
+  UINT32                            Nsid;\r
+  UINT32                            Cdw2;\r
+  UINT32                            Cdw3;\r
+  UINT32                            Cdw10;\r
+  UINT32                            Cdw11;\r
+  UINT32                            Cdw12;\r
+  UINT32                            Cdw13;\r
+  UINT32                            Cdw14;\r
+  UINT32                            Cdw15;\r
+} EFI_NVM_EXPRESS_COMMAND;\r
+\r
+typedef struct {\r
+  UINT32                            DW0;\r
+  UINT32                            DW1;\r
+  UINT32                            DW2;\r
+  UINT32                            DW3;\r
+} EFI_NVM_EXPRESS_COMPLETION;\r
+\r
+typedef struct {\r
+  UINT64                            CommandTimeout;\r
+  VOID                              *TransferBuffer;\r
+  UINT32                            TransferLength;\r
+  VOID                              *MetadataBuffer;\r
+  UINT32                            MetadataLength;\r
+  UINT8                             QueueType;\r
+  EFI_NVM_EXPRESS_COMMAND           *NvmeCmd;\r
+  EFI_NVM_EXPRESS_COMPLETION        *NvmeCompletion;\r
+} EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;\r
+\r
+//\r
+// Protocol function prototypes\r
+//\r
+/**\r
+  Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function supports\r
+  both blocking I/O and non-blocking I/O. The blocking I/O functionality is required, and the non-blocking\r
+  I/O functionality is optional.\r
+\r
+\r
+  @param[in]     This                A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.\r
+  @param[in]     NamespaceId         A 32 bit namespace ID as defined in the NVMe specification to which the NVM Express Command\r
+                                     Packet will be sent.  A value of 0 denotes the NVM Express controller, a value of all 0xFF's\r
+                                     (all bytes are 0xFF) in the namespace ID specifies that the command packet should be sent to\r
+                                     all valid namespaces.\r
+  @param[in,out] Packet              A pointer to the NVM Express Command Packet.\r
+  @param[in]     Event               If non-blocking I/O is not supported then Event is ignored, and blocking I/O is performed.\r
+                                     If Event is NULL, then blocking I/O is performed. If Event is not NULL and non-blocking I/O\r
+                                     is supported, then non-blocking I/O is performed, and Event will be signaled when the NVM\r
+                                     Express Command Packet completes. \r
+\r
+  @retval EFI_SUCCESS                The NVM Express Command Packet was sent by the host. TransferLength bytes were transferred\r
+                                     to, or from DataBuffer.\r
+  @retval EFI_BAD_BUFFER_SIZE        The NVM Express Command Packet was not executed. The number of bytes that could be transferred\r
+                                     is returned in TransferLength.\r
+  @retval EFI_NOT_READY              The NVM Express Command Packet could not be sent because the controller is not ready. The caller\r
+                                     may retry again later.\r
+  @retval EFI_DEVICE_ERROR           A device error occurred while attempting to send the NVM Express Command Packet.\r
+  @retval EFI_INVALID_PARAMETER      NamespaceId or the contents of EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET are invalid. The NVM\r
+                                     Express Command Packet was not sent, so no additional status information is available.\r
+  @retval EFI_UNSUPPORTED            The command described by the NVM Express Command Packet is not supported by the NVM Express\r
+                                     controller. The NVM Express Command Packet was not sent so no additional status information\r
+                                     is available.\r
+  @retval EFI_TIMEOUT                A timeout occurred while waiting for the NVM Express Command Packet to execute.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_PASSTHRU)(\r
+  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,\r
+  IN     UINT32                                      NamespaceId,\r
+  IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET    *Packet,\r
+  IN     EFI_EVENT                                   Event OPTIONAL\r
+  );\r
+\r
+/**\r
+  Used to retrieve the next namespace ID for this NVM Express controller.\r
+\r
+  The EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL.GetNextNamespace() function retrieves the next valid\r
+  namespace ID on this NVM Express controller. \r
+\r
+  If on input the value pointed to by NamespaceId is 0xFFFFFFFF, then the first valid namespace\r
+  ID defined on the NVM Express controller is returned in the location pointed to by NamespaceId\r
+  and a status of EFI_SUCCESS is returned.\r
+\r
+  If on input the value pointed to by NamespaceId is an invalid namespace ID other than 0xFFFFFFFF,\r
+  then EFI_INVALID_PARAMETER is returned.\r
+\r
+  If on input the value pointed to by NamespaceId is a valid namespace ID, then the next valid\r
+  namespace ID on the NVM Express controller is returned in the location pointed to by NamespaceId,\r
+  and EFI_SUCCESS is returned.\r
+\r
+  If the value pointed to by NamespaceId is the namespace ID of the last namespace on the NVM\r
+  Express controller, then EFI_NOT_FOUND is returned.\r
+\r
+  @param[in]     This           A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.\r
+  @param[in,out] NamespaceId    On input, a pointer to a legal NamespaceId for an NVM Express\r
+                                namespace present on the NVM Express controller. On output, a\r
+                                pointer to the next NamespaceId of an NVM Express namespace on\r
+                                an NVM Express controller. An input value of 0xFFFFFFFF retrieves\r
+                                the first NamespaceId for an NVM Express namespace present on an\r
+                                NVM Express controller.\r
+\r
+  @retval EFI_SUCCESS           The Namespace ID of the next Namespace was returned.\r
+  @retval EFI_NOT_FOUND         There are no more namespaces defined on this controller.\r
+  @retval EFI_INVALID_PARAMETER NamespaceId is an invalid value other than 0xFFFFFFFF.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_GET_NEXT_NAMESPACE)(\r
+  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,\r
+  IN OUT UINT32                                      *NamespaceId\r
+  );\r
+\r
+/**\r
+  Used to allocate and build a device path node for an NVM Express namespace on an NVM Express controller.\r
+\r
+  The EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL.BuildDevicePath() function allocates and builds a single device\r
+  path node for the NVM Express namespace specified by NamespaceId.\r
+\r
+  If the NamespaceId is not valid, then EFI_NOT_FOUND is returned.\r
+\r
+  If DevicePath is NULL, then EFI_INVALID_PARAMETER is returned. \r
+\r
+  If there are not enough resources to allocate the device path node, then EFI_OUT_OF_RESOURCES is returned.\r
+\r
+  Otherwise, DevicePath is allocated with the boot service AllocatePool(), the contents of DevicePath are\r
+  initialized to describe the NVM Express namespace specified by NamespaceId, and EFI_SUCCESS is returned.\r
+\r
+  @param[in]     This                A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.\r
+  @param[in]     NamespaceId         The NVM Express namespace ID  for which a device path node is to be\r
+                                     allocated and built. Caller must set the NamespaceId to zero if the\r
+                                     device path node will contain a valid UUID.\r
+  @param[in,out] DevicePath          A pointer to a single device path node that describes the NVM Express\r
+                                     namespace specified by NamespaceId. This function is responsible for\r
+                                     allocating the buffer DevicePath with the boot service AllocatePool().\r
+                                     It is the caller's responsibility to free DevicePath when the caller\r
+                                     is finished with DevicePath.\r
+  @retval EFI_SUCCESS                The device path node that describes the NVM Express namespace specified\r
+                                     by NamespaceId was allocated and returned in DevicePath.\r
+  @retval EFI_NOT_FOUND              The NamespaceId is not valid.\r
+  @retval EFI_INVALID_PARAMETER      DevicePath is NULL.\r
+  @retval EFI_OUT_OF_RESOURCES       There are not enough resources to allocate the DevicePath node.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_BUILD_DEVICE_PATH)(\r
+  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,\r
+  IN     UINT32                                      NamespaceId,\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL                    **DevicePath\r
+  );\r
+\r
+/**\r
+  Used to translate a device path node to a namespace ID.\r
+\r
+  The EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL.GetNamespace() function determines the namespace ID associated with the\r
+  namespace described by DevicePath.\r
+\r
+  If DevicePath is a device path node type that the NVM Express Pass Thru driver supports, then the NVM Express\r
+  Pass Thru driver will attempt to translate the contents DevicePath into a namespace ID.\r
+\r
+  If this translation is successful, then that namespace ID is returned in NamespaceId, and EFI_SUCCESS is returned\r
+\r
+  @param[in]  This                A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance.\r
+  @param[in]  DevicePath          A pointer to the device path node that describes an NVM Express namespace on\r
+                                  the NVM Express controller.\r
+  @param[out] NamespaceId         The NVM Express namespace ID contained in the device path node.\r
+\r
+  @retval EFI_SUCCESS             DevicePath was successfully translated to NamespaceId.\r
+  @retval EFI_INVALID_PARAMETER   If DevicePath or NamespaceId are NULL, then EFI_INVALID_PARAMETER is returned.\r
+  @retval EFI_UNSUPPORTED         If DevicePath is not a device path node type that the NVM Express Pass Thru driver\r
+                                  supports, then EFI_UNSUPPORTED is returned.\r
+  @retval EFI_NOT_FOUND           If DevicePath is a device path node type that the NVM Express Pass Thru driver\r
+                                  supports, but there is not a valid translation from DevicePath to a namespace ID,\r
+                                  then EFI_NOT_FOUND is returned.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_GET_NAMESPACE)(\r
+  IN     EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL          *This,\r
+  IN     EFI_DEVICE_PATH_PROTOCOL                    *DevicePath,\r
+     OUT UINT32                                      *NamespaceId\r
+  );\r
+\r
+//\r
+// Protocol Interface Structure\r
+//\r
+struct _EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL {\r
+  EFI_NVM_EXPRESS_PASS_THRU_MODE                     *Mode;\r
+  EFI_NVM_EXPRESS_PASS_THRU_PASSTHRU                 PassThru;\r
+  EFI_NVM_EXPRESS_PASS_THRU_GET_NEXT_NAMESPACE       GetNextNamespace;\r
+  EFI_NVM_EXPRESS_PASS_THRU_BUILD_DEVICE_PATH        BuildDevicePath;\r
+  EFI_NVM_EXPRESS_PASS_THRU_GET_NAMESPACE            GetNamespace;\r
+};\r
+\r
+extern EFI_GUID gEfiNvmExpressPassThruProtocolGuid;\r
+\r
+#endif\r
+\r