]> 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 f07540fd3667281c9104aca0a045173c426f2e07..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, 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
@@ -246,7 +258,6 @@ DiscoverAllPartitions (
   )\r
 {\r
   EFI_STATUS                        Status;\r
-  EFI_SD_MMC_PASS_THRU_PROTOCOL     *PassThru;\r
   EMMC_PARTITION                    *Partition;\r
   EMMC_CSD                          *Csd;\r
   EMMC_CID                          *Cid;\r
@@ -258,7 +269,6 @@ DiscoverAllPartitions (
   UINT32                            SecCount;\r
   UINT32                            GpSizeMult;\r
 \r
-  PassThru = Device->Private->PassThru;\r
   Slot     = Device->Slot;\r
 \r
   Status = EmmcSendStatus (Device, Slot + 1, &DevStatus);\r
@@ -371,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
@@ -430,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
@@ -494,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
@@ -1081,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