]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c
MdeModulePkg: Convert all .uni files to utf-8
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / NvmExpressDxe / NvmExpress.c
index 7d6d798e1f629de055c01c9a6b8d6d7655d8110b..9938bf45417e32f16d52fd0f13b12bc43a26ab04 100644 (file)
@@ -35,6 +35,15 @@ EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion =
   0                                                   // Version number to be filled at start up.\r
 };\r
 \r
+//\r
+// Template for NVM Express Pass Thru Mode data structure.\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassThruMode = {\r
+  EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL | EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVM,\r
+  sizeof (UINTN),\r
+  0x10100\r
+};\r
+\r
 /**\r
   Check if the specified Nvm Express device namespace is active, and create child handles\r
   for them with BlockIo and DiskInfo protocol instances.\r
@@ -43,8 +52,6 @@ EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion =
   @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] NamespaceUuid   The NVM Express namespace UUID for which a device path node is to be\r
-                             allocated and built. UUID will only be valid of the Namespace ID is zero.\r
 \r
   @retval EFI_SUCCESS        All the namespaces in the device are successfully enumerated.\r
   @return Others             Some error occurs when enumerating the namespaces.\r
@@ -53,8 +60,7 @@ EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion =
 EFI_STATUS\r
 EnumerateNvmeDevNamespace (\r
   IN NVME_CONTROLLER_PRIVATE_DATA       *Private,\r
-  UINT32                                NamespaceId,\r
-  UINT64                                NamespaceUuid\r
+  UINT32                                NamespaceId\r
   )\r
 {\r
   NVME_ADMIN_NAMESPACE_DATA             *NamespaceData;\r
@@ -148,6 +154,12 @@ EnumerateNvmeDevNamespace (
     Device->BlockIo.WriteBlocks  = NvmeBlockIoWriteBlocks;\r
     Device->BlockIo.FlushBlocks  = NvmeBlockIoFlushBlocks;\r
 \r
+    //\r
+    // Create StorageSecurityProtocol Instance\r
+    //\r
+    Device->StorageSecurity.ReceiveData = NvmeStorageSecurityReceiveData;\r
+    Device->StorageSecurity.SendData    = NvmeStorageSecuritySendData;\r
+\r
     //\r
     // Create DiskInfo Protocol instance\r
     //\r
@@ -159,7 +171,6 @@ EnumerateNvmeDevNamespace (
     Status = Private->Passthru.BuildDevicePath (\r
                                  &Private->Passthru,\r
                                  Device->NamespaceId,\r
-                                 Device->NamespaceUuid,\r
                                  &NewDevicePathNode\r
                                  );\r
 \r
@@ -206,10 +217,36 @@ EnumerateNvmeDevNamespace (
     if(EFI_ERROR(Status)) {\r
       goto Exit;\r
     }\r
+\r
+    //\r
+    // Check if the NVMe controller supports the Security Send and Security Receive commands\r
+    //\r
+    if ((Private->ControllerData->Oacs & SECURITY_SEND_RECEIVE_SUPPORTED) != 0) {\r
+      Status = gBS->InstallProtocolInterface (\r
+                      &Device->DeviceHandle,\r
+                      &gEfiStorageSecurityCommandProtocolGuid,\r
+                      EFI_NATIVE_INTERFACE,\r
+                      &Device->StorageSecurity\r
+                      );\r
+      if(EFI_ERROR(Status)) {\r
+        gBS->UninstallMultipleProtocolInterfaces (\r
+               &Device->DeviceHandle,\r
+               &gEfiDevicePathProtocolGuid,\r
+               Device->DevicePath,\r
+               &gEfiBlockIoProtocolGuid,\r
+               &Device->BlockIo,\r
+               &gEfiDiskInfoProtocolGuid,\r
+               &Device->DiskInfo,\r
+               NULL\r
+               );\r
+        goto Exit;\r
+      }\r
+    }\r
+\r
     gBS->OpenProtocol (\r
            Private->ControllerHandle,\r
-           &gEfiPciIoProtocolGuid,\r
-           (VOID **) &Private->PciIo,\r
+           &gEfiNvmExpressPassThruProtocolGuid,\r
+           (VOID **) &Private->Passthru,\r
            Private->DriverBindingHandle,\r
            Device->DeviceHandle,\r
            EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
@@ -281,18 +318,15 @@ DiscoverAllNamespaces (
 {\r
   EFI_STATUS                            Status;\r
   UINT32                                NamespaceId;\r
-  UINT64                                NamespaceUuid;\r
-  NVM_EXPRESS_PASS_THRU_PROTOCOL        *Passthru;\r
+  EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL    *Passthru;\r
 \r
   NamespaceId   = 0xFFFFFFFF;\r
-  NamespaceUuid = 0;\r
   Passthru      = &Private->Passthru;\r
 \r
   while (TRUE) {\r
     Status = Passthru->GetNextNamespace (\r
                          Passthru,\r
-                         (UINT32 *)&NamespaceId,\r
-                         (UINT64 *)&NamespaceUuid\r
+                         (UINT32 *)&NamespaceId\r
                          );\r
 \r
     if (EFI_ERROR (Status)) {\r
@@ -301,8 +335,7 @@ DiscoverAllNamespaces (
 \r
     Status = EnumerateNvmeDevNamespace (\r
                Private,\r
-               NamespaceId,\r
-               NamespaceUuid\r
+               NamespaceId\r
                );\r
 \r
     if (EFI_ERROR(Status)) {\r
@@ -335,9 +368,10 @@ UnregisterNvmeNamespace (
   )\r
 {\r
   EFI_STATUS                               Status;\r
-  EFI_PCI_IO_PROTOCOL                      *PciIo;\r
   EFI_BLOCK_IO_PROTOCOL                    *BlockIo;\r
   NVME_DEVICE_PRIVATE_DATA                 *Device;\r
+  NVME_CONTROLLER_PRIVATE_DATA             *Private;\r
+  EFI_STORAGE_SECURITY_COMMAND_PROTOCOL    *StorageSecurity;\r
 \r
   BlockIo = NULL;\r
 \r
@@ -353,14 +387,15 @@ UnregisterNvmeNamespace (
     return Status;\r
   }\r
 \r
-  Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);\r
+  Device  = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);\r
+  Private = Device->Controller;\r
 \r
   //\r
   // Close the child handle\r
   //\r
   gBS->CloseProtocol (\r
          Controller,\r
-         &gEfiPciIoProtocolGuid,\r
+         &gEfiNvmExpressPassThruProtocolGuid,\r
          This->DriverBindingHandle,\r
          Handle\r
          );\r
@@ -383,8 +418,8 @@ UnregisterNvmeNamespace (
   if (EFI_ERROR (Status)) {\r
     gBS->OpenProtocol (\r
            Controller,\r
-           &gEfiPciIoProtocolGuid,\r
-           (VOID **) &PciIo,\r
+           &gEfiNvmExpressPassThruProtocolGuid,\r
+           (VOID **) &Private->Passthru,\r
            This->DriverBindingHandle,\r
            Handle,\r
            EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
@@ -392,6 +427,37 @@ UnregisterNvmeNamespace (
     return Status;\r
   }\r
 \r
+  //\r
+  // If Storage Security Command Protocol is installed, then uninstall this protocol.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Handle,\r
+                  &gEfiStorageSecurityCommandProtocolGuid,\r
+                  (VOID **) &StorageSecurity,\r
+                  This->DriverBindingHandle,\r
+                  Controller,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = gBS->UninstallProtocolInterface (\r
+                    Handle,\r
+                    &gEfiStorageSecurityCommandProtocolGuid,\r
+                    &Device->StorageSecurity\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      gBS->OpenProtocol (\r
+        Controller,\r
+        &gEfiNvmExpressPassThruProtocolGuid,\r
+        (VOID **) &Private->Passthru,\r
+        This->DriverBindingHandle,\r
+        Handle,\r
+        EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+        );\r
+      return Status;\r
+    }\r
+  }\r
+\r
   if(Device->DevicePath != NULL) {\r
     FreePool (Device->DevicePath);\r
   }\r
@@ -478,8 +544,8 @@ NvmExpressDriverBindingSupported (
 \r
       if ((DevicePathNode.DevPath->Type    != MESSAGING_DEVICE_PATH) ||\r
           (DevicePathNode.DevPath->SubType != MSG_NVME_NAMESPACE_DP) ||\r
-           DevicePathNodeLength(DevicePathNode.DevPath) != sizeof(NVME_NAMESPACE_DEVICE_PATH)) {\r
-        return EFI_UNSUPPORTED;\r
+          (DevicePathNodeLength(DevicePathNode.DevPath) != sizeof(NVME_NAMESPACE_DEVICE_PATH))) {\r
+         return EFI_UNSUPPORTED;\r
       }\r
     }\r
   }\r
@@ -609,18 +675,19 @@ NvmExpressDriverBindingStart (
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 {\r
-  EFI_STATUS                        Status;\r
-  EFI_PCI_IO_PROTOCOL               *PciIo;\r
-  NVME_CONTROLLER_PRIVATE_DATA      *Private;\r
-  EFI_DEVICE_PATH_PROTOCOL          *ParentDevicePath;\r
-  UINT32                            NamespaceId;\r
-  UINT64                            NamespaceUuid;\r
-  EFI_PHYSICAL_ADDRESS              MappedAddr;\r
-  UINTN                             Bytes;\r
+  EFI_STATUS                          Status;\r
+  EFI_PCI_IO_PROTOCOL                 *PciIo;\r
+  NVME_CONTROLLER_PRIVATE_DATA        *Private;\r
+  EFI_DEVICE_PATH_PROTOCOL            *ParentDevicePath;\r
+  UINT32                              NamespaceId;\r
+  EFI_PHYSICAL_ADDRESS                MappedAddr;\r
+  UINTN                               Bytes;\r
+  EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL  *Passthru;\r
 \r
   DEBUG ((EFI_D_INFO, "NvmExpressDriverBindingStart: start\n"));\r
 \r
-  Private = NULL;\r
+  Private          = NULL;\r
+  Passthru         = NULL;\r
   ParentDevicePath = NULL;\r
 \r
   Status = gBS->OpenProtocol (\r
@@ -657,7 +724,7 @@ NvmExpressDriverBindingStart (
     if (Private == NULL) {\r
       DEBUG ((EFI_D_ERROR, "NvmExpressDriverBindingStart: allocating pool for Nvme Private Data failed!\n"));\r
       Status = EFI_OUT_OF_RESOURCES;\r
-      goto Exit2;\r
+      goto Exit;\r
     }\r
 \r
     //\r
@@ -678,7 +745,7 @@ NvmExpressDriverBindingStart (
                       0\r
                       );\r
     if (EFI_ERROR (Status)) {\r
-      goto Exit2;\r
+      goto Exit;\r
     }\r
 \r
     Bytes = EFI_PAGES_TO_SIZE (4);\r
@@ -692,7 +759,7 @@ NvmExpressDriverBindingStart (
                       );\r
 \r
     if (EFI_ERROR (Status) || (Bytes != EFI_PAGES_TO_SIZE (4))) {\r
-      goto Exit2;\r
+      goto Exit;\r
     }\r
 \r
     Private->BufferPciAddr = (UINT8 *)(UINTN)MappedAddr;\r
@@ -709,36 +776,36 @@ NvmExpressDriverBindingStart (
     Private->Passthru.GetNextNamespace = NvmExpressGetNextNamespace;\r
     Private->Passthru.BuildDevicePath  = NvmExpressBuildDevicePath;\r
     Private->Passthru.GetNamespace     = NvmExpressGetNamespace;\r
-    Private->PassThruMode.Attributes   = NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL;\r
+    CopyMem (&Private->PassThruMode, &gEfiNvmExpressPassThruMode, sizeof (EFI_NVM_EXPRESS_PASS_THRU_MODE));\r
 \r
     Status = NvmeControllerInit (Private);\r
-\r
     if (EFI_ERROR(Status)) {\r
-      goto Exit2;\r
+      goto Exit;\r
     }\r
 \r
     Status = gBS->InstallMultipleProtocolInterfaces (\r
                     &Controller,\r
-                    &gEfiCallerIdGuid,\r
-                    Private,\r
+                    &gEfiNvmExpressPassThruProtocolGuid,\r
+                    &Private->Passthru,\r
                     NULL\r
                     );\r
     if (EFI_ERROR (Status)) {\r
-      goto Exit2;\r
+      goto Exit;\r
     }\r
   } else {\r
     Status = gBS->OpenProtocol (\r
                     Controller,\r
-                    &gEfiCallerIdGuid,\r
-                    (VOID **) &Private,\r
+                    &gEfiNvmExpressPassThruProtocolGuid,\r
+                    (VOID **) &Passthru,\r
                     This->DriverBindingHandle,\r
                     Controller,\r
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                     );\r
     if (EFI_ERROR (Status)) {\r
-      Private = NULL;\r
-      goto Exit1;\r
+      goto Exit;\r
     }\r
+\r
+    Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (Passthru);\r
   }\r
 \r
   if (RemainingDevicePath == NULL) {\r
@@ -756,30 +823,21 @@ NvmExpressDriverBindingStart (
     Status = Private->Passthru.GetNamespace (\r
                                  &Private->Passthru,\r
                                  RemainingDevicePath,\r
-                                 &NamespaceId,\r
-                                 &NamespaceUuid\r
+                                 &NamespaceId\r
                                  );\r
 \r
     if (!EFI_ERROR (Status)) {\r
-        Status = EnumerateNvmeDevNamespace (\r
-                   Private,\r
-                   NamespaceId,\r
-                   NamespaceUuid\r
-                   );\r
+      Status = EnumerateNvmeDevNamespace (\r
+                 Private,\r
+                 NamespaceId\r
+                 );\r
     }\r
   }\r
 \r
   DEBUG ((EFI_D_INFO, "NvmExpressDriverBindingStart: end successfully\n"));\r
   return EFI_SUCCESS;\r
 \r
-Exit1:\r
-  gBS->UninstallMultipleProtocolInterfaces (\r
-         Controller,\r
-         &gEfiCallerIdGuid,\r
-         Private,\r
-         NULL\r
-         );\r
-Exit2:\r
+Exit:\r
   if ((Private != NULL) && (Private->Mapping != NULL)) {\r
     PciIo->Unmap (PciIo, Private->Mapping);\r
   }\r
@@ -851,22 +909,24 @@ NvmExpressDriverBindingStop (
   BOOLEAN                             AllChildrenStopped;\r
   UINTN                               Index;\r
   NVME_CONTROLLER_PRIVATE_DATA        *Private;\r
+  EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL  *PassThru;\r
 \r
   if (NumberOfChildren == 0) {\r
     Status = gBS->OpenProtocol (\r
                     Controller,\r
-                    &gEfiCallerIdGuid,\r
-                    (VOID **) &Private,\r
+                    &gEfiNvmExpressPassThruProtocolGuid,\r
+                    (VOID **) &PassThru,\r
                     This->DriverBindingHandle,\r
                     Controller,\r
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                     );\r
 \r
     if (!EFI_ERROR (Status)) {\r
+      Private = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (PassThru);\r
       gBS->UninstallMultipleProtocolInterfaces (\r
             Controller,\r
-            &gEfiCallerIdGuid,\r
-            Private,\r
+            &gEfiNvmExpressPassThruProtocolGuid,\r
+            PassThru,\r
             NULL\r
             );\r
 \r
@@ -947,7 +1007,7 @@ NvmExpressUnload (
   DeviceHandleBuffer = NULL;\r
   Status = gBS->LocateHandleBuffer (\r
                   ByProtocol,\r
-                  &gEfiCallerIdGuid,\r
+                  &gEfiNvmExpressPassThruProtocolGuid,\r
                   NULL,\r
                   &DeviceHandleCount,\r
                   &DeviceHandleBuffer\r