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
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
)\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
UINT32 SecCount;\r
UINT32 GpSizeMult;\r
\r
- PassThru = Device->Private->PassThru;\r
Slot = Device->Slot;\r
\r
Status = EmmcSendStatus (Device, Slot + 1, &DevStatus);\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
&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