]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Sd / EmmcDxe / EmmcDxe.c
index b88d55d96162c6f8188b8be6f9039f17c29ce71c..62f18d1878bd5a69de4b4c024204679f1e9939eb 100644 (file)
@@ -4,14 +4,8 @@
   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
-  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
+  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -68,6 +62,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 +232,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 +375,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 +444,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 +519,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
@@ -593,7 +621,7 @@ DiscoverEmmcDevice (
       );\r
     AddUnicodeString2 (\r
       "en",\r
-      gEmmcDxeComponentName.SupportedLanguages,\r
+      gEmmcDxeComponentName2.SupportedLanguages,\r
       &Device->ControllerNameTable,\r
       Device->ModelName,\r
       FALSE\r
@@ -1079,6 +1107,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