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
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
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
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
//\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
\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
);\r
AddUnicodeString2 (\r
"en",\r
- gEmmcDxeComponentName.SupportedLanguages,\r
+ gEmmcDxeComponentName2.SupportedLanguages,\r
&Device->ControllerNameTable,\r
Device->ModelName,\r
FALSE\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