]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.c
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Bus / Sd / EmmcDxe / EmmcDxe.c
index b88d55d96162c6f8188b8be6f9039f17c29ce71c..2ed4d2e781ad7cea43717366c70e1386987d4ec8 100644 (file)
@@ -4,7 +4,7 @@
   It produces BlockIo, BlockIo2 and StorageSecurity protocols to allow upper layer\r
   access the EMMC device.\r
 \r
-  Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2015 - 2018, 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
@@ -68,6 +68,18 @@ EMMC_PARTITION mEmmcPartitionTemplate = {
     EmmcSecurityProtocolIn,\r
     EmmcSecurityProtocolOut\r
   },\r
+  {                            // EraseBlock\r
+    EFI_ERASE_BLOCK_PROTOCOL_REVISION,\r
+    1,\r
+    EmmcEraseBlocks\r
+  },\r
+  {                            // DiskInfo\r
+    EFI_DISK_INFO_SD_MMC_INTERFACE_GUID,\r
+    EmmcDiskInfoInquiry,\r
+    EmmcDiskInfoIdentify,\r
+    EmmcDiskInfoSenseData,\r
+    EmmcDiskInfoWhichIde\r
+  },\r
   {\r
     NULL,\r
     NULL\r
@@ -226,7 +238,7 @@ GetEmmcModelName (
   String[sizeof (Cid->OemId) + sizeof (Cid->ProductName)] = ' ';\r
   CopyMem (String + sizeof (Cid->OemId) + sizeof (Cid->ProductName) + 1, Cid->ProductSerialNumber, sizeof (Cid->ProductSerialNumber));\r
 \r
-  AsciiStrToUnicodeStr (String, Device->ModelName);\r
+  AsciiStrToUnicodeStrS (String, Device->ModelName, sizeof (Device->ModelName) / sizeof (Device->ModelName[0]));\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -369,6 +381,16 @@ DiscoverAllPartitions (
       Partition->Enable = TRUE;\r
       Partition->BlockMedia.LastBlock = DivU64x32 (Capacity, Partition->BlockMedia.BlockSize) - 1;\r
     }\r
+\r
+    if ((ExtCsd->EraseGroupDef & BIT0) == 0) {\r
+      if (Csd->WriteBlLen < 9) {\r
+        Partition->EraseBlock.EraseLengthGranularity = 1;\r
+      } else {\r
+        Partition->EraseBlock.EraseLengthGranularity = (Csd->EraseGrpMult + 1) * (Csd->EraseGrpSize + 1) * (1 << (Csd->WriteBlLen - 9));\r
+      }\r
+    } else {\r
+      Partition->EraseBlock.EraseLengthGranularity = 1024 * ExtCsd->HcEraseGrpSize;\r
+    }\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -428,53 +450,64 @@ InstallProtocolOnPartition (
     //\r
     // Install BlkIo/BlkIo2/Ssp for the specified partition\r
     //\r
-    Status = gBS->InstallMultipleProtocolInterfaces (\r
-                    &Partition->Handle,\r
-                    &gEfiDevicePathProtocolGuid,\r
-                    Partition->DevicePath,\r
-                    &gEfiBlockIoProtocolGuid,\r
-                    &Partition->BlockIo,\r
-                    &gEfiBlockIo2ProtocolGuid,\r
-                    &Partition->BlockIo2,\r
-                    NULL\r
-                    );\r
-   if (EFI_ERROR (Status)) {\r
-      goto Error;\r
-    }\r
-\r
-    if (((Partition->PartitionType == EmmcPartitionUserData) ||\r
-        (Partition->PartitionType == EmmcPartitionBoot1) ||\r
-        (Partition->PartitionType == EmmcPartitionBoot2)) &&\r
-        ((Device->Csd.Ccc & BIT10) != 0)) {\r
-      Status = gBS->InstallProtocolInterface (\r
+    if (Partition->PartitionType != EmmcPartitionRPMB) {\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
                       &Partition->Handle,\r
-                      &gEfiStorageSecurityCommandProtocolGuid,\r
-                      EFI_NATIVE_INTERFACE,\r
-                      &Partition->StorageSecurity\r
+                      &gEfiDevicePathProtocolGuid,\r
+                      Partition->DevicePath,\r
+                      &gEfiBlockIoProtocolGuid,\r
+                      &Partition->BlockIo,\r
+                      &gEfiBlockIo2ProtocolGuid,\r
+                      &Partition->BlockIo2,\r
+                      &gEfiEraseBlockProtocolGuid,\r
+                      &Partition->EraseBlock,\r
+                      &gEfiDiskInfoProtocolGuid,\r
+                      &Partition->DiskInfo,\r
+                      NULL\r
                       );\r
       if (EFI_ERROR (Status)) {\r
-        gBS->UninstallMultipleProtocolInterfaces (\r
-               &Partition->Handle,\r
-               &gEfiDevicePathProtocolGuid,\r
-               Partition->DevicePath,\r
-               &gEfiBlockIoProtocolGuid,\r
-               &Partition->BlockIo,\r
-               &gEfiBlockIo2ProtocolGuid,\r
-               &Partition->BlockIo2,\r
-               NULL\r
-               );\r
         goto Error;\r
       }\r
+\r
+      if (((Partition->PartitionType == EmmcPartitionUserData) ||\r
+          (Partition->PartitionType == EmmcPartitionBoot1) ||\r
+          (Partition->PartitionType == EmmcPartitionBoot2)) &&\r
+          ((Device->Csd.Ccc & BIT10) != 0)) {\r
+        Status = gBS->InstallProtocolInterface (\r
+                        &Partition->Handle,\r
+                        &gEfiStorageSecurityCommandProtocolGuid,\r
+                        EFI_NATIVE_INTERFACE,\r
+                        &Partition->StorageSecurity\r
+                        );\r
+        if (EFI_ERROR (Status)) {\r
+          gBS->UninstallMultipleProtocolInterfaces (\r
+                 &Partition->Handle,\r
+                 &gEfiDevicePathProtocolGuid,\r
+                 Partition->DevicePath,\r
+                 &gEfiBlockIoProtocolGuid,\r
+                 &Partition->BlockIo,\r
+                 &gEfiBlockIo2ProtocolGuid,\r
+                 &Partition->BlockIo2,\r
+                 &gEfiEraseBlockProtocolGuid,\r
+                 &Partition->EraseBlock,\r
+                 &gEfiDiskInfoProtocolGuid,\r
+                 &Partition->DiskInfo,\r
+                 NULL\r
+                 );\r
+          goto Error;\r
+        }\r
+      }\r
+\r
+      gBS->OpenProtocol (\r
+             Device->Private->Controller,\r
+             &gEfiSdMmcPassThruProtocolGuid,\r
+             (VOID **) &(Device->Private->PassThru),\r
+             Device->Private->DriverBindingHandle,\r
+             Partition->Handle,\r
+             EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+             );\r
     }\r
 \r
-    gBS->OpenProtocol (\r
-           Device->Private->Controller,\r
-           &gEfiSdMmcPassThruProtocolGuid,\r
-           (VOID **) &(Device->Private->PassThru),\r
-           Device->Private->DriverBindingHandle,\r
-           Partition->Handle,\r
-           EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
-           );\r
   } else {\r
     Status = EFI_INVALID_PARAMETER;\r
   }\r
@@ -492,6 +525,7 @@ Error:
 \r
   @param[in]  Private             The EMMC driver private data structure.\r
   @param[in]  Slot                The slot number to check device present.\r
+  @param[in]  RemainingDevicePath The pointer to the remaining device path.\r
 \r
   @retval EFI_SUCCESS             Successfully to discover the device and attach\r
                                   SdMmcIoProtocol to it.\r
@@ -1079,6 +1113,10 @@ EmmcDxeDriverBindingStop (
                     &Partition->BlockIo,\r
                     &gEfiBlockIo2ProtocolGuid,\r
                     &Partition->BlockIo2,\r
+                    &gEfiEraseBlockProtocolGuid,\r
+                    &Partition->EraseBlock,\r
+                    &gEfiDiskInfoProtocolGuid,\r
+                    &Partition->DiskInfo,\r
                     NULL\r
                     );\r
     if (EFI_ERROR (Status)) {\r