MdeModulePkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
committed by
mergify[bot]
parent
7c7184e201
commit
1436aea4d5
@@ -32,11 +32,11 @@ EDKII_IOMMU_PPI *mIoMmu;
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuMap (
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -54,23 +54,25 @@ IoMmuMap (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
switch (Operation) {
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT(FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT (FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = mIoMmu->SetAttribute (
|
||||
mIoMmu,
|
||||
*Mapping,
|
||||
@@ -81,9 +83,10 @@ IoMmuMap (
|
||||
}
|
||||
} else {
|
||||
*DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -98,7 +101,7 @@ IoMmuMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuUnmap (
|
||||
IN VOID *Mapping
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -109,6 +112,7 @@ IoMmuUnmap (
|
||||
} else {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -142,7 +146,7 @@ IoMmuAllocateBuffer (
|
||||
UINTN NumberOfBytes;
|
||||
EFI_PHYSICAL_ADDRESS HostPhyAddress;
|
||||
|
||||
*HostAddress = NULL;
|
||||
*HostAddress = NULL;
|
||||
*DeviceAddress = 0;
|
||||
|
||||
if (mIoMmu != NULL) {
|
||||
@@ -157,18 +161,19 @@ IoMmuAllocateBuffer (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
NumberOfBytes = EFI_PAGES_TO_SIZE(Pages);
|
||||
Status = mIoMmu->Map (
|
||||
mIoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
NumberOfBytes = EFI_PAGES_TO_SIZE (Pages);
|
||||
Status = mIoMmu->Map (
|
||||
mIoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = mIoMmu->SetAttribute (
|
||||
mIoMmu,
|
||||
*Mapping,
|
||||
@@ -186,10 +191,12 @@ IoMmuAllocateBuffer (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
|
||||
|
||||
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
|
||||
*DeviceAddress = HostPhyAddress;
|
||||
*Mapping = NULL;
|
||||
*Mapping = NULL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -207,9 +214,9 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuFreeBuffer (
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -221,6 +228,7 @@ IoMmuFreeBuffer (
|
||||
} else {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -239,4 +247,3 @@ IoMmuInit (
|
||||
(VOID **)&mIoMmu
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -10,7 +10,7 @@
|
||||
//
|
||||
// Template for EMMC HC Slot Data.
|
||||
//
|
||||
EMMC_PEIM_HC_SLOT gEmmcHcSlotTemplate = {
|
||||
EMMC_PEIM_HC_SLOT gEmmcHcSlotTemplate = {
|
||||
EMMC_PEIM_SLOT_SIG, // Signature
|
||||
{ // Media
|
||||
{
|
||||
@@ -97,7 +97,7 @@ EMMC_PEIM_HC_SLOT gEmmcHcSlotTemplate = {
|
||||
0,
|
||||
},
|
||||
{ // ExtCsd
|
||||
{0},
|
||||
{ 0 },
|
||||
},
|
||||
TRUE, // SectorAddressing
|
||||
NULL // Private
|
||||
@@ -106,7 +106,7 @@ EMMC_PEIM_HC_SLOT gEmmcHcSlotTemplate = {
|
||||
//
|
||||
// Template for EMMC HC Private Data.
|
||||
//
|
||||
EMMC_PEIM_HC_PRIVATE_DATA gEmmcHcPrivateTemplate = {
|
||||
EMMC_PEIM_HC_PRIVATE_DATA gEmmcHcPrivateTemplate = {
|
||||
EMMC_PEIM_SIG, // Signature
|
||||
NULL, // Pool
|
||||
{ // BlkIoPpi
|
||||
@@ -158,6 +158,7 @@ EMMC_PEIM_HC_PRIVATE_DATA gEmmcHcPrivateTemplate = {
|
||||
0, // SlotNum
|
||||
0 // TotalBlkIoDevices
|
||||
};
|
||||
|
||||
/**
|
||||
Gets the count of block I/O devices that one specific block driver detects.
|
||||
|
||||
@@ -185,9 +186,9 @@ EmmcBlockIoPeimGetDeviceNo (
|
||||
OUT UINTN *NumberBlockDevices
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
*NumberBlockDevices = Private->TotalBlkIoDevices;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -242,11 +243,11 @@ EmmcBlockIoPeimGetMediaInfo (
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Location;
|
||||
BOOLEAN Found;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Location;
|
||||
BOOLEAN Found;
|
||||
|
||||
Found = FALSE;
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
@@ -259,12 +260,13 @@ EmmcBlockIoPeimGetMediaInfo (
|
||||
MediaNum = 0;
|
||||
for (SlotNum = 0; SlotNum < Private->SlotNum; SlotNum++) {
|
||||
for (MediaNum = 0; MediaNum < Private->Slot[SlotNum].MediaNum; MediaNum++) {
|
||||
Location ++;
|
||||
Location++;
|
||||
if (Location == DeviceIndex) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Found) {
|
||||
break;
|
||||
}
|
||||
@@ -323,17 +325,17 @@ EmmcBlockIoPeimReadBlocks (
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Location;
|
||||
UINT8 PartitionConfig;
|
||||
UINTN Remaining;
|
||||
UINT32 MaxBlock;
|
||||
BOOLEAN Found;
|
||||
EFI_STATUS Status;
|
||||
UINT32 BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Location;
|
||||
UINT8 PartitionConfig;
|
||||
UINTN Remaining;
|
||||
UINT32 MaxBlock;
|
||||
BOOLEAN Found;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Found = FALSE;
|
||||
@@ -358,12 +360,13 @@ EmmcBlockIoPeimReadBlocks (
|
||||
MediaNum = 0;
|
||||
for (SlotNum = 0; SlotNum < Private->SlotNum; SlotNum++) {
|
||||
for (MediaNum = 0; MediaNum < Private->Slot[SlotNum].MediaNum; MediaNum++) {
|
||||
Location ++;
|
||||
Location++;
|
||||
if (Location == DeviceIndex) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Found) {
|
||||
break;
|
||||
}
|
||||
@@ -385,20 +388,22 @@ EmmcBlockIoPeimReadBlocks (
|
||||
//
|
||||
PartitionConfig = Private->Slot[SlotNum].ExtCsd.PartitionConfig;
|
||||
if ((PartitionConfig & 0x7) != Private->Slot[SlotNum].PartitionType[MediaNum]) {
|
||||
PartitionConfig &= (UINT8)~0x7;
|
||||
PartitionConfig &= (UINT8) ~0x7;
|
||||
PartitionConfig |= Private->Slot[SlotNum].PartitionType[MediaNum];
|
||||
Status = EmmcPeimSwitch (
|
||||
&Private->Slot[SlotNum],
|
||||
0x3,
|
||||
OFFSET_OF (EMMC_EXT_CSD, PartitionConfig),
|
||||
PartitionConfig,
|
||||
0x0
|
||||
);
|
||||
Status = EmmcPeimSwitch (
|
||||
&Private->Slot[SlotNum],
|
||||
0x3,
|
||||
OFFSET_OF (EMMC_EXT_CSD, PartitionConfig),
|
||||
PartitionConfig,
|
||||
0x0
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Private->Slot[SlotNum].ExtCsd.PartitionConfig = PartitionConfig;
|
||||
}
|
||||
|
||||
//
|
||||
// Start to execute data transfer. The max block number in single cmd is 65535 blocks.
|
||||
//
|
||||
@@ -418,15 +423,16 @@ EmmcBlockIoPeimReadBlocks (
|
||||
}
|
||||
|
||||
BufferSize = NumberOfBlocks * BlockSize;
|
||||
Status = EmmcPeimRwMultiBlocks (&Private->Slot[SlotNum], StartLBA, BlockSize, Buffer, BufferSize, TRUE);
|
||||
Status = EmmcPeimRwMultiBlocks (&Private->Slot[SlotNum], StartLBA, BlockSize, Buffer, BufferSize, TRUE);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
StartLBA += NumberOfBlocks;
|
||||
Buffer = (UINT8*)Buffer + BufferSize;
|
||||
Buffer = (UINT8 *)Buffer + BufferSize;
|
||||
Remaining -= NumberOfBlocks;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -452,14 +458,14 @@ EmmcBlockIoPeimReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcBlockIoPeimGetDeviceNo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
*NumberBlockDevices = Private->TotalBlkIoDevices;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@@ -509,29 +515,29 @@ EmmcBlockIoPeimGetDeviceNo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcBlockIoPeimGetMediaInfo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EFI_PEI_BLOCK_IO_MEDIA Media;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Location;
|
||||
BOOLEAN Found;
|
||||
EFI_STATUS Status;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EFI_PEI_BLOCK_IO_MEDIA Media;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Location;
|
||||
BOOLEAN Found;
|
||||
|
||||
Found = FALSE;
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
|
||||
Status = EmmcBlockIoPeimGetMediaInfo (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
&Media
|
||||
);
|
||||
Status = EmmcBlockIoPeimGetMediaInfo (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
&Media
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@@ -540,12 +546,13 @@ EmmcBlockIoPeimGetMediaInfo2 (
|
||||
MediaNum = 0;
|
||||
for (SlotNum = 0; SlotNum < Private->SlotNum; SlotNum++) {
|
||||
for (MediaNum = 0; MediaNum < Private->Slot[SlotNum].MediaNum; MediaNum++) {
|
||||
Location ++;
|
||||
Location++;
|
||||
if (Location == DeviceIndex) {
|
||||
Found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Found) {
|
||||
break;
|
||||
}
|
||||
@@ -592,28 +599,28 @@ EmmcBlockIoPeimGetMediaInfo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcBlockIoPeimReadBlocks2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EFI_STATUS Status;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
Status = EFI_SUCCESS;
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
|
||||
Status = EmmcBlockIoPeimReadBlocks (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
StartLBA,
|
||||
BufferSize,
|
||||
Buffer
|
||||
);
|
||||
Status = EmmcBlockIoPeimReadBlocks (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
StartLBA,
|
||||
BufferSize,
|
||||
Buffer
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -636,7 +643,7 @@ EmmcBlockIoPeimEndOfPei (
|
||||
IN VOID *Ppi
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (NotifyDescriptor);
|
||||
|
||||
@@ -660,26 +667,26 @@ EmmcBlockIoPeimEndOfPei (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeEmmcBlockIoPeim (
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EDKII_SD_MMC_HOST_CONTROLLER_PPI *SdMmcHcPpi;
|
||||
UINT32 Index;
|
||||
UINT32 PartitionIndex;
|
||||
UINTN *MmioBase;
|
||||
UINT8 BarNum;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Controller;
|
||||
UINT64 Capacity;
|
||||
EMMC_EXT_CSD *ExtCsd;
|
||||
EMMC_HC_SLOT_CAP Capability;
|
||||
EMMC_PEIM_HC_SLOT *Slot;
|
||||
UINT32 SecCount;
|
||||
UINT32 GpSizeMult;
|
||||
EFI_STATUS Status;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EDKII_SD_MMC_HOST_CONTROLLER_PPI *SdMmcHcPpi;
|
||||
UINT32 Index;
|
||||
UINT32 PartitionIndex;
|
||||
UINTN *MmioBase;
|
||||
UINT8 BarNum;
|
||||
UINT8 SlotNum;
|
||||
UINT8 MediaNum;
|
||||
UINT8 Controller;
|
||||
UINT64 Capacity;
|
||||
EMMC_EXT_CSD *ExtCsd;
|
||||
EMMC_HC_SLOT_CAP Capability;
|
||||
EMMC_PEIM_HC_SLOT *Slot;
|
||||
UINT32 SecCount;
|
||||
UINT32 GpSizeMult;
|
||||
|
||||
//
|
||||
// Shadow this PEIM to run from memory
|
||||
@@ -695,7 +702,7 @@ InitializeEmmcBlockIoPeim (
|
||||
&gEdkiiPeiSdMmcHostControllerPpiGuid,
|
||||
0,
|
||||
NULL,
|
||||
(VOID **) &SdMmcHcPpi
|
||||
(VOID **)&SdMmcHcPpi
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
@@ -724,8 +731,9 @@ InitializeEmmcBlockIoPeim (
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
break;
|
||||
}
|
||||
Private->BlkIoPpiList.Ppi = (VOID*)&Private->BlkIoPpi;
|
||||
Private->BlkIo2PpiList.Ppi = (VOID*)&Private->BlkIo2Ppi;
|
||||
|
||||
Private->BlkIoPpiList.Ppi = (VOID *)&Private->BlkIoPpi;
|
||||
Private->BlkIo2PpiList.Ppi = (VOID *)&Private->BlkIo2Ppi;
|
||||
//
|
||||
// Initialize the memory pool which will be used in all transactions.
|
||||
//
|
||||
@@ -740,6 +748,7 @@ InitializeEmmcBlockIoPeim (
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Capability.SlotType != 0x1) {
|
||||
DEBUG ((DEBUG_INFO, "The slot at 0x%x is not embedded slot type\n", MmioBase[Index]));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
@@ -750,10 +759,12 @@ InitializeEmmcBlockIoPeim (
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = EmmcPeimHcCardDetect (MmioBase[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = EmmcPeimHcInitHost (MmioBase[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
@@ -777,6 +788,7 @@ InitializeEmmcBlockIoPeim (
|
||||
Status = EFI_UNSUPPORTED;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((ExtCsd->PartitioningSupport & BIT0) != BIT0) {
|
||||
DEBUG ((DEBUG_ERROR, "The EMMC device doesn't support Partition Feature!!!\n"));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
@@ -786,7 +798,7 @@ InitializeEmmcBlockIoPeim (
|
||||
for (PartitionIndex = 0; PartitionIndex < EMMC_PEIM_MAX_PARTITIONS; PartitionIndex++) {
|
||||
switch (PartitionIndex) {
|
||||
case EmmcPartitionUserData:
|
||||
SecCount = *(UINT32*)&ExtCsd->SecCount;
|
||||
SecCount = *(UINT32 *)&ExtCsd->SecCount;
|
||||
Capacity = MultU64x32 ((UINT64)SecCount, 0x200);
|
||||
break;
|
||||
case EmmcPartitionBoot1:
|
||||
@@ -798,19 +810,19 @@ InitializeEmmcBlockIoPeim (
|
||||
break;
|
||||
case EmmcPartitionGP1:
|
||||
GpSizeMult = (ExtCsd->GpSizeMult[0] | (ExtCsd->GpSizeMult[1] << 8) | (ExtCsd->GpSizeMult[2] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
case EmmcPartitionGP2:
|
||||
GpSizeMult = (ExtCsd->GpSizeMult[3] | (ExtCsd->GpSizeMult[4] << 8) | (ExtCsd->GpSizeMult[5] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
case EmmcPartitionGP3:
|
||||
GpSizeMult = (ExtCsd->GpSizeMult[6] | (ExtCsd->GpSizeMult[7] << 8) | (ExtCsd->GpSizeMult[8] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
case EmmcPartitionGP4:
|
||||
GpSizeMult = (ExtCsd->GpSizeMult[9] | (ExtCsd->GpSizeMult[10] << 8) | (ExtCsd->GpSizeMult[11] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
default:
|
||||
ASSERT (FALSE);
|
||||
@@ -820,13 +832,15 @@ InitializeEmmcBlockIoPeim (
|
||||
MediaNum = Slot->MediaNum;
|
||||
if (Capacity != 0) {
|
||||
Slot->Media[MediaNum].LastBlock = DivU64x32 (Capacity, Slot->Media[MediaNum].BlockSize) - 1;
|
||||
Slot->PartitionType[MediaNum] = PartitionIndex;
|
||||
Slot->PartitionType[MediaNum] = PartitionIndex;
|
||||
Private->TotalBlkIoDevices++;
|
||||
Slot->MediaNum++;
|
||||
}
|
||||
}
|
||||
|
||||
Private->SlotNum++;
|
||||
}
|
||||
|
||||
Controller++;
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
|
@@ -26,31 +26,31 @@
|
||||
|
||||
#include <IndustryStandard/Emmc.h>
|
||||
|
||||
typedef struct _EMMC_PEIM_HC_PRIVATE_DATA EMMC_PEIM_HC_PRIVATE_DATA;
|
||||
typedef struct _EMMC_PEIM_HC_SLOT EMMC_PEIM_HC_SLOT;
|
||||
typedef struct _EMMC_TRB EMMC_TRB;
|
||||
typedef struct _EMMC_PEIM_HC_PRIVATE_DATA EMMC_PEIM_HC_PRIVATE_DATA;
|
||||
typedef struct _EMMC_PEIM_HC_SLOT EMMC_PEIM_HC_SLOT;
|
||||
typedef struct _EMMC_TRB EMMC_TRB;
|
||||
|
||||
#include "EmmcHci.h"
|
||||
#include "EmmcHcMem.h"
|
||||
|
||||
#define EMMC_PEIM_SIG SIGNATURE_32 ('E', 'M', 'C', 'P')
|
||||
#define EMMC_PEIM_SLOT_SIG SIGNATURE_32 ('E', 'M', 'C', 'S')
|
||||
#define EMMC_PEIM_SIG SIGNATURE_32 ('E', 'M', 'C', 'P')
|
||||
#define EMMC_PEIM_SLOT_SIG SIGNATURE_32 ('E', 'M', 'C', 'S')
|
||||
|
||||
#define EMMC_PEIM_MAX_SLOTS 6
|
||||
#define EMMC_PEIM_MAX_PARTITIONS 8
|
||||
#define EMMC_PEIM_MAX_SLOTS 6
|
||||
#define EMMC_PEIM_MAX_PARTITIONS 8
|
||||
|
||||
struct _EMMC_PEIM_HC_SLOT {
|
||||
UINT32 Signature;
|
||||
EFI_PEI_BLOCK_IO2_MEDIA Media[EMMC_PEIM_MAX_PARTITIONS];
|
||||
UINT8 MediaNum;
|
||||
EMMC_PARTITION_TYPE PartitionType[EMMC_PEIM_MAX_PARTITIONS];
|
||||
UINT32 Signature;
|
||||
EFI_PEI_BLOCK_IO2_MEDIA Media[EMMC_PEIM_MAX_PARTITIONS];
|
||||
UINT8 MediaNum;
|
||||
EMMC_PARTITION_TYPE PartitionType[EMMC_PEIM_MAX_PARTITIONS];
|
||||
|
||||
UINTN EmmcHcBase;
|
||||
EMMC_HC_SLOT_CAP Capability;
|
||||
EMMC_CSD Csd;
|
||||
EMMC_EXT_CSD ExtCsd;
|
||||
BOOLEAN SectorAddressing;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINTN EmmcHcBase;
|
||||
EMMC_HC_SLOT_CAP Capability;
|
||||
EMMC_CSD Csd;
|
||||
EMMC_EXT_CSD ExtCsd;
|
||||
BOOLEAN SectorAddressing;
|
||||
EMMC_PEIM_HC_PRIVATE_DATA *Private;
|
||||
};
|
||||
|
||||
struct _EMMC_PEIM_HC_PRIVATE_DATA {
|
||||
@@ -71,27 +71,27 @@ struct _EMMC_PEIM_HC_PRIVATE_DATA {
|
||||
UINT8 TotalBlkIoDevices;
|
||||
};
|
||||
|
||||
#define EMMC_TIMEOUT MultU64x32((UINT64)(3), 1000000)
|
||||
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS(a) CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIoPpi, EMMC_PEIM_SIG)
|
||||
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2(a) CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, EMMC_PEIM_SIG)
|
||||
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a) CR (a, EMMC_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, EMMC_PEIM_SIG)
|
||||
#define EMMC_TIMEOUT MultU64x32((UINT64)(3), 1000000)
|
||||
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS(a) CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIoPpi, EMMC_PEIM_SIG)
|
||||
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS2(a) CR (a, EMMC_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, EMMC_PEIM_SIG)
|
||||
#define GET_EMMC_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a) CR (a, EMMC_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, EMMC_PEIM_SIG)
|
||||
|
||||
struct _EMMC_TRB {
|
||||
EMMC_PEIM_HC_SLOT *Slot;
|
||||
UINT16 BlockSize;
|
||||
EMMC_PEIM_HC_SLOT *Slot;
|
||||
UINT16 BlockSize;
|
||||
|
||||
EMMC_COMMAND_PACKET *Packet;
|
||||
VOID *Data;
|
||||
UINT32 DataLen;
|
||||
BOOLEAN Read;
|
||||
EFI_PHYSICAL_ADDRESS DataPhy;
|
||||
VOID *DataMap;
|
||||
EMMC_HC_TRANSFER_MODE Mode;
|
||||
EMMC_COMMAND_PACKET *Packet;
|
||||
VOID *Data;
|
||||
UINT32 DataLen;
|
||||
BOOLEAN Read;
|
||||
EFI_PHYSICAL_ADDRESS DataPhy;
|
||||
VOID *DataMap;
|
||||
EMMC_HC_TRANSFER_MODE Mode;
|
||||
|
||||
UINT64 Timeout;
|
||||
UINT64 Timeout;
|
||||
|
||||
EMMC_HC_ADMA_DESC_LINE *AdmaDesc;
|
||||
UINTN AdmaDescSize;
|
||||
EMMC_HC_ADMA_DESC_LINE *AdmaDesc;
|
||||
UINTN AdmaDescSize;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -238,9 +238,9 @@ EmmcBlockIoPeimReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcBlockIoPeimGetDeviceNo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -287,10 +287,10 @@ EmmcBlockIoPeimGetDeviceNo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcBlockIoPeimGetMediaInfo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -330,12 +330,12 @@ EmmcBlockIoPeimGetMediaInfo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcBlockIoPeimReadBlocks2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -349,7 +349,7 @@ EmmcBlockIoPeimReadBlocks2 (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimInitMemPool (
|
||||
IN EMMC_PEIM_HC_PRIVATE_DATA *Private
|
||||
IN EMMC_PEIM_HC_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -363,7 +363,7 @@ EmmcPeimInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimFreeMemPool (
|
||||
IN EMMC_PEIM_MEM_POOL *Pool
|
||||
IN EMMC_PEIM_MEM_POOL *Pool
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -378,8 +378,8 @@ EmmcPeimFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
EmmcPeimAllocateMem (
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -392,9 +392,9 @@ EmmcPeimAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
EmmcPeimFreeMem (
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -426,11 +426,11 @@ IoMmuInit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuMap (
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -444,7 +444,7 @@ IoMmuMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuUnmap (
|
||||
IN VOID *Mapping
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -487,9 +487,9 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuFreeBuffer (
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
|
@@ -18,25 +18,25 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
EMMC_PEIM_MEM_BLOCK *
|
||||
EmmcPeimAllocMemBlock (
|
||||
IN UINTN Pages
|
||||
IN UINTN Pages
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
|
||||
TempPtr = NULL;
|
||||
Block = NULL;
|
||||
|
||||
Status = PeiServicesAllocatePool (sizeof(EMMC_PEIM_MEM_BLOCK), &TempPtr);
|
||||
Status = PeiServicesAllocatePool (sizeof (EMMC_PEIM_MEM_BLOCK), &TempPtr);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)TempPtr, sizeof(EMMC_PEIM_MEM_BLOCK));
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, sizeof (EMMC_PEIM_MEM_BLOCK));
|
||||
|
||||
//
|
||||
// each bit in the bit array represents EMMC_PEIM_MEM_UNIT
|
||||
@@ -44,18 +44,18 @@ EmmcPeimAllocMemBlock (
|
||||
//
|
||||
ASSERT (EMMC_PEIM_MEM_UNIT * 8 <= EFI_PAGE_SIZE);
|
||||
|
||||
Block = (EMMC_PEIM_MEM_BLOCK*)(UINTN)TempPtr;
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (EMMC_PEIM_MEM_UNIT * 8);
|
||||
Block = (EMMC_PEIM_MEM_BLOCK *)(UINTN)TempPtr;
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (EMMC_PEIM_MEM_UNIT * 8);
|
||||
|
||||
Status = PeiServicesAllocatePool (Block->BitsLen, &TempPtr);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)TempPtr, Block->BitsLen);
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, Block->BitsLen);
|
||||
|
||||
Block->Bits = (UINT8*)(UINTN)TempPtr;
|
||||
Block->Bits = (UINT8 *)(UINTN)TempPtr;
|
||||
|
||||
Status = IoMmuAllocateBuffer (
|
||||
Pages,
|
||||
@@ -67,10 +67,10 @@ EmmcPeimAllocMemBlock (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)BufHost, EFI_PAGES_TO_SIZE (Pages));
|
||||
ZeroMem ((VOID *)(UINTN)BufHost, EFI_PAGES_TO_SIZE (Pages));
|
||||
|
||||
Block->BufHost = (UINT8 *) (UINTN) BufHost;
|
||||
Block->Buf = (UINT8 *) (UINTN) MappedAddr;
|
||||
Block->BufHost = (UINT8 *)(UINTN)BufHost;
|
||||
Block->Buf = (UINT8 *)(UINTN)MappedAddr;
|
||||
Block->Mapping = Mapping;
|
||||
Block->Next = NULL;
|
||||
|
||||
@@ -86,8 +86,8 @@ EmmcPeimAllocMemBlock (
|
||||
**/
|
||||
VOID
|
||||
EmmcPeimFreeMemBlock (
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
ASSERT ((Pool != NULL) && (Block != NULL));
|
||||
@@ -107,22 +107,22 @@ EmmcPeimFreeMemBlock (
|
||||
**/
|
||||
VOID *
|
||||
EmmcPeimAllocMemFromBlock (
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
)
|
||||
{
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
|
||||
ASSERT ((Block != 0) && (Units != 0));
|
||||
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
|
||||
for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) {
|
||||
//
|
||||
@@ -138,13 +138,12 @@ EmmcPeimAllocMemFromBlock (
|
||||
}
|
||||
|
||||
EMMC_PEIM_NEXT_BIT (Byte, Bit);
|
||||
|
||||
} else {
|
||||
EMMC_PEIM_NEXT_BIT (Byte, Bit);
|
||||
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,13 +154,13 @@ EmmcPeimAllocMemFromBlock (
|
||||
//
|
||||
// Mark the memory as allocated
|
||||
//
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
|
||||
for (Count = 0; Count < Units; Count++) {
|
||||
ASSERT (!EMMC_PEIM_MEM_BIT_IS_SET (Block->Bits[Byte], Bit));
|
||||
|
||||
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] | (UINT8) EMMC_PEIM_MEM_BIT (Bit));
|
||||
Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] | (UINT8)EMMC_PEIM_MEM_BIT (Bit));
|
||||
EMMC_PEIM_NEXT_BIT (Byte, Bit);
|
||||
}
|
||||
|
||||
@@ -177,8 +176,8 @@ EmmcPeimAllocMemFromBlock (
|
||||
**/
|
||||
VOID
|
||||
EmmcPeimInsertMemBlockToPool (
|
||||
IN EMMC_PEIM_MEM_BLOCK *Head,
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block
|
||||
IN EMMC_PEIM_MEM_BLOCK *Head,
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
ASSERT ((Head != NULL) && (Block != NULL));
|
||||
@@ -197,11 +196,10 @@ EmmcPeimInsertMemBlockToPool (
|
||||
**/
|
||||
BOOLEAN
|
||||
EmmcPeimIsMemBlockEmpty (
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block
|
||||
IN EMMC_PEIM_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < Block->BitsLen; Index++) {
|
||||
if (Block->Bits[Index] != 0) {
|
||||
@@ -212,8 +210,6 @@ EmmcPeimIsMemBlockEmpty (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize the memory management pool for the host controller.
|
||||
|
||||
@@ -228,9 +224,9 @@ EmmcPeimInitMemPool (
|
||||
IN EMMC_PEIM_HC_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_MEM_POOL *Pool;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
EMMC_PEIM_MEM_POOL *Pool;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
|
||||
TempPtr = NULL;
|
||||
Pool = NULL;
|
||||
@@ -240,7 +236,7 @@ EmmcPeimInitMemPool (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)TempPtr, sizeof (EMMC_PEIM_MEM_POOL));
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, sizeof (EMMC_PEIM_MEM_POOL));
|
||||
|
||||
Pool = (EMMC_PEIM_MEM_POOL *)((UINTN)TempPtr);
|
||||
|
||||
@@ -265,10 +261,10 @@ EmmcPeimInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimFreeMemPool (
|
||||
IN EMMC_PEIM_MEM_POOL *Pool
|
||||
IN EMMC_PEIM_MEM_POOL *Pool
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
|
||||
ASSERT (Pool->Head != NULL);
|
||||
|
||||
@@ -296,16 +292,16 @@ EmmcPeimFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
EmmcPeimAllocateMem (
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_MEM_BLOCK *Head;
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
EMMC_PEIM_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
EMMC_PEIM_MEM_BLOCK *Head;
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
EMMC_PEIM_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
|
||||
Mem = NULL;
|
||||
AllocSize = EMMC_PEIM_MEM_ROUND (Size);
|
||||
@@ -368,22 +364,22 @@ EmmcPeimAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
EmmcPeimFreeMem (
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN EMMC_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
EMMC_PEIM_MEM_BLOCK *Head;
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
EMMC_PEIM_MEM_BLOCK *Head;
|
||||
EMMC_PEIM_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
|
||||
Head = Pool->Head;
|
||||
AllocSize = EMMC_PEIM_MEM_ROUND (Size);
|
||||
ToFree = (UINT8 *) Mem;
|
||||
ToFree = (UINT8 *)Mem;
|
||||
|
||||
for (Block = Head; Block != NULL; Block = Block->Next) {
|
||||
//
|
||||
@@ -394,8 +390,8 @@ EmmcPeimFreeMem (
|
||||
//
|
||||
// compute the start byte and bit in the bit array
|
||||
//
|
||||
Byte = ((ToFree - Block->Buf) / EMMC_PEIM_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->Buf) / EMMC_PEIM_MEM_UNIT) % 8;
|
||||
Byte = ((ToFree - Block->Buf) / EMMC_PEIM_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->Buf) / EMMC_PEIM_MEM_UNIT) % 8;
|
||||
|
||||
//
|
||||
// reset associated bits in bit array
|
||||
@@ -403,7 +399,7 @@ EmmcPeimFreeMem (
|
||||
for (Count = 0; Count < (AllocSize / EMMC_PEIM_MEM_UNIT); Count++) {
|
||||
ASSERT (EMMC_PEIM_MEM_BIT_IS_SET (Block->Bits[Byte], Bit));
|
||||
|
||||
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] ^ EMMC_PEIM_MEM_BIT (Bit));
|
||||
Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] ^ EMMC_PEIM_MEM_BIT (Bit));
|
||||
EMMC_PEIM_NEXT_BIT (Byte, Bit);
|
||||
}
|
||||
|
||||
@@ -425,5 +421,5 @@ EmmcPeimFreeMem (
|
||||
EmmcPeimFreeMemBlock (Pool, Block);
|
||||
}
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
@@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _EMMC_PEIM_MEM_H_
|
||||
#define _EMMC_PEIM_MEM_H_
|
||||
|
||||
#define EMMC_PEIM_MEM_BIT(a) ((UINTN)(1 << (a)))
|
||||
#define EMMC_PEIM_MEM_BIT(a) ((UINTN)(1 << (a)))
|
||||
|
||||
#define EMMC_PEIM_MEM_BIT_IS_SET(Data, Bit) \
|
||||
((BOOLEAN)(((Data) & EMMC_PEIM_MEM_BIT(Bit)) == EMMC_PEIM_MEM_BIT(Bit)))
|
||||
@@ -17,28 +17,28 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
typedef struct _EMMC_PEIM_MEM_BLOCK EMMC_PEIM_MEM_BLOCK;
|
||||
|
||||
struct _EMMC_PEIM_MEM_BLOCK {
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
EMMC_PEIM_MEM_BLOCK *Next;
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
EMMC_PEIM_MEM_BLOCK *Next;
|
||||
};
|
||||
|
||||
typedef struct _EMMC_PEIM_MEM_POOL {
|
||||
EMMC_PEIM_MEM_BLOCK *Head;
|
||||
EMMC_PEIM_MEM_BLOCK *Head;
|
||||
} EMMC_PEIM_MEM_POOL;
|
||||
|
||||
//
|
||||
// Memory allocation unit, note that the value must meet EMMC spec alignment requirement.
|
||||
//
|
||||
#define EMMC_PEIM_MEM_UNIT 128
|
||||
#define EMMC_PEIM_MEM_UNIT 128
|
||||
|
||||
#define EMMC_PEIM_MEM_UNIT_MASK (EMMC_PEIM_MEM_UNIT - 1)
|
||||
#define EMMC_PEIM_MEM_DEFAULT_PAGES 16
|
||||
|
||||
#define EMMC_PEIM_MEM_ROUND(Len) (((Len) + EMMC_PEIM_MEM_UNIT_MASK) & (~EMMC_PEIM_MEM_UNIT_MASK))
|
||||
#define EMMC_PEIM_MEM_ROUND(Len) (((Len) + EMMC_PEIM_MEM_UNIT_MASK) & (~EMMC_PEIM_MEM_UNIT_MASK))
|
||||
|
||||
//
|
||||
// Advance the byte and bit to the next bit, adjust byte accordingly.
|
||||
@@ -53,4 +53,3 @@ typedef struct _EMMC_PEIM_MEM_POOL {
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -61,9 +61,9 @@ typedef enum {
|
||||
//
|
||||
// The maximum data length of each descriptor line
|
||||
//
|
||||
#define ADMA_MAX_DATA_PER_LINE 0x10000
|
||||
#define EMMC_SDMA_BOUNDARY 512 * 1024
|
||||
#define EMMC_SDMA_ROUND_UP(x, n) (((x) + n) & ~(n - 1))
|
||||
#define ADMA_MAX_DATA_PER_LINE 0x10000
|
||||
#define EMMC_SDMA_BOUNDARY 512 * 1024
|
||||
#define EMMC_SDMA_ROUND_UP(x, n) (((x) + n) & ~(n - 1))
|
||||
|
||||
typedef enum {
|
||||
EmmcCommandTypeBc, // Broadcast commands, no response
|
||||
@@ -85,76 +85,76 @@ typedef enum {
|
||||
} EMMC_RESPONSE_TYPE;
|
||||
|
||||
typedef struct _EMMC_COMMAND_BLOCK {
|
||||
UINT16 CommandIndex;
|
||||
UINT32 CommandArgument;
|
||||
UINT32 CommandType; // One of the EMMC_COMMAND_TYPE values
|
||||
UINT32 ResponseType; // One of the EMMC_RESPONSE_TYPE values
|
||||
UINT16 CommandIndex;
|
||||
UINT32 CommandArgument;
|
||||
UINT32 CommandType; // One of the EMMC_COMMAND_TYPE values
|
||||
UINT32 ResponseType; // One of the EMMC_RESPONSE_TYPE values
|
||||
} EMMC_COMMAND_BLOCK;
|
||||
|
||||
typedef struct _EMMC_STATUS_BLOCK {
|
||||
UINT32 Resp0;
|
||||
UINT32 Resp1;
|
||||
UINT32 Resp2;
|
||||
UINT32 Resp3;
|
||||
UINT32 Resp0;
|
||||
UINT32 Resp1;
|
||||
UINT32 Resp2;
|
||||
UINT32 Resp3;
|
||||
} EMMC_STATUS_BLOCK;
|
||||
|
||||
typedef struct _EMMC_COMMAND_PACKET {
|
||||
UINT64 Timeout;
|
||||
EMMC_COMMAND_BLOCK *EmmcCmdBlk;
|
||||
EMMC_STATUS_BLOCK *EmmcStatusBlk;
|
||||
VOID *InDataBuffer;
|
||||
VOID *OutDataBuffer;
|
||||
UINT32 InTransferLength;
|
||||
UINT32 OutTransferLength;
|
||||
UINT64 Timeout;
|
||||
EMMC_COMMAND_BLOCK *EmmcCmdBlk;
|
||||
EMMC_STATUS_BLOCK *EmmcStatusBlk;
|
||||
VOID *InDataBuffer;
|
||||
VOID *OutDataBuffer;
|
||||
UINT32 InTransferLength;
|
||||
UINT32 OutTransferLength;
|
||||
} EMMC_COMMAND_PACKET;
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct {
|
||||
UINT32 Valid:1;
|
||||
UINT32 End:1;
|
||||
UINT32 Int:1;
|
||||
UINT32 Reserved:1;
|
||||
UINT32 Act:2;
|
||||
UINT32 Reserved1:10;
|
||||
UINT32 Length:16;
|
||||
UINT32 Address;
|
||||
UINT32 Valid : 1;
|
||||
UINT32 End : 1;
|
||||
UINT32 Int : 1;
|
||||
UINT32 Reserved : 1;
|
||||
UINT32 Act : 2;
|
||||
UINT32 Reserved1 : 10;
|
||||
UINT32 Length : 16;
|
||||
UINT32 Address;
|
||||
} EMMC_HC_ADMA_DESC_LINE;
|
||||
|
||||
typedef struct {
|
||||
UINT32 TimeoutFreq:6; // bit 0:5
|
||||
UINT32 Reserved:1; // bit 6
|
||||
UINT32 TimeoutUnit:1; // bit 7
|
||||
UINT32 BaseClkFreq:8; // bit 8:15
|
||||
UINT32 MaxBlkLen:2; // bit 16:17
|
||||
UINT32 BusWidth8:1; // bit 18
|
||||
UINT32 Adma2:1; // bit 19
|
||||
UINT32 Reserved2:1; // bit 20
|
||||
UINT32 HighSpeed:1; // bit 21
|
||||
UINT32 Sdma:1; // bit 22
|
||||
UINT32 SuspRes:1; // bit 23
|
||||
UINT32 Voltage33:1; // bit 24
|
||||
UINT32 Voltage30:1; // bit 25
|
||||
UINT32 Voltage18:1; // bit 26
|
||||
UINT32 Reserved3:1; // bit 27
|
||||
UINT32 SysBus64:1; // bit 28
|
||||
UINT32 AsyncInt:1; // bit 29
|
||||
UINT32 SlotType:2; // bit 30:31
|
||||
UINT32 Sdr50:1; // bit 32
|
||||
UINT32 Sdr104:1; // bit 33
|
||||
UINT32 Ddr50:1; // bit 34
|
||||
UINT32 Reserved4:1; // bit 35
|
||||
UINT32 DriverTypeA:1; // bit 36
|
||||
UINT32 DriverTypeC:1; // bit 37
|
||||
UINT32 DriverTypeD:1; // bit 38
|
||||
UINT32 DriverType4:1; // bit 39
|
||||
UINT32 TimerCount:4; // bit 40:43
|
||||
UINT32 Reserved5:1; // bit 44
|
||||
UINT32 TuningSDR50:1; // bit 45
|
||||
UINT32 RetuningMod:2; // bit 46:47
|
||||
UINT32 ClkMultiplier:8; // bit 48:55
|
||||
UINT32 Reserved6:7; // bit 56:62
|
||||
UINT32 Hs400:1; // bit 63
|
||||
UINT32 TimeoutFreq : 6; // bit 0:5
|
||||
UINT32 Reserved : 1; // bit 6
|
||||
UINT32 TimeoutUnit : 1; // bit 7
|
||||
UINT32 BaseClkFreq : 8; // bit 8:15
|
||||
UINT32 MaxBlkLen : 2; // bit 16:17
|
||||
UINT32 BusWidth8 : 1; // bit 18
|
||||
UINT32 Adma2 : 1; // bit 19
|
||||
UINT32 Reserved2 : 1; // bit 20
|
||||
UINT32 HighSpeed : 1; // bit 21
|
||||
UINT32 Sdma : 1; // bit 22
|
||||
UINT32 SuspRes : 1; // bit 23
|
||||
UINT32 Voltage33 : 1; // bit 24
|
||||
UINT32 Voltage30 : 1; // bit 25
|
||||
UINT32 Voltage18 : 1; // bit 26
|
||||
UINT32 Reserved3 : 1; // bit 27
|
||||
UINT32 SysBus64 : 1; // bit 28
|
||||
UINT32 AsyncInt : 1; // bit 29
|
||||
UINT32 SlotType : 2; // bit 30:31
|
||||
UINT32 Sdr50 : 1; // bit 32
|
||||
UINT32 Sdr104 : 1; // bit 33
|
||||
UINT32 Ddr50 : 1; // bit 34
|
||||
UINT32 Reserved4 : 1; // bit 35
|
||||
UINT32 DriverTypeA : 1; // bit 36
|
||||
UINT32 DriverTypeC : 1; // bit 37
|
||||
UINT32 DriverTypeD : 1; // bit 38
|
||||
UINT32 DriverType4 : 1; // bit 39
|
||||
UINT32 TimerCount : 4; // bit 40:43
|
||||
UINT32 Reserved5 : 1; // bit 44
|
||||
UINT32 TuningSDR50 : 1; // bit 45
|
||||
UINT32 RetuningMod : 2; // bit 46:47
|
||||
UINT32 ClkMultiplier : 8; // bit 48:55
|
||||
UINT32 Reserved6 : 7; // bit 56:62
|
||||
UINT32 Hs400 : 1; // bit 63
|
||||
} EMMC_HC_SLOT_CAP;
|
||||
|
||||
#pragma pack()
|
||||
@@ -170,7 +170,7 @@ typedef struct {
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimHcReset (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -185,7 +185,7 @@ EmmcPeimHcReset (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimHcEnableInterrupt (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -200,8 +200,8 @@ EmmcPeimHcEnableInterrupt (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimHcGetCapability (
|
||||
IN UINTN Bar,
|
||||
OUT EMMC_HC_SLOT_CAP *Capability
|
||||
IN UINTN Bar,
|
||||
OUT EMMC_HC_SLOT_CAP *Capability
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -219,7 +219,7 @@ EmmcPeimHcGetCapability (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimHcCardDetect (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -234,7 +234,7 @@ EmmcPeimHcCardDetect (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimHcInitHost (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -255,11 +255,11 @@ EmmcPeimHcInitHost (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimSwitch (
|
||||
IN EMMC_PEIM_HC_SLOT *Slot,
|
||||
IN UINT8 Access,
|
||||
IN UINT8 Index,
|
||||
IN UINT8 Value,
|
||||
IN UINT8 CmdSet
|
||||
IN EMMC_PEIM_HC_SLOT *Slot,
|
||||
IN UINT8 Access,
|
||||
IN UINT8 Index,
|
||||
IN UINT8 Value,
|
||||
IN UINT8 CmdSet
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -277,8 +277,8 @@ EmmcPeimSwitch (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimSetBlkCount (
|
||||
IN EMMC_PEIM_HC_SLOT *Slot,
|
||||
IN UINT16 BlockCount
|
||||
IN EMMC_PEIM_HC_SLOT *Slot,
|
||||
IN UINT16 BlockCount
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -300,12 +300,12 @@ EmmcPeimSetBlkCount (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimRwMultiBlocks (
|
||||
IN EMMC_PEIM_HC_SLOT *Slot,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINT32 BlockSize,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead
|
||||
IN EMMC_PEIM_HC_SLOT *Slot,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINT32 BlockSize,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -321,7 +321,7 @@ EmmcPeimRwMultiBlocks (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcPeimIdentification (
|
||||
IN EMMC_PEIM_HC_SLOT *Slot
|
||||
IN EMMC_PEIM_HC_SLOT *Slot
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -332,8 +332,7 @@ EmmcPeimIdentification (
|
||||
**/
|
||||
VOID
|
||||
EmmcPeimFreeTrb (
|
||||
IN EMMC_TRB *Trb
|
||||
IN EMMC_TRB *Trb
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -11,17 +11,17 @@
|
||||
//
|
||||
// Driver name table
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmmcDxeDriverNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmmcDxeDriverNameTable[] = {
|
||||
{ "eng;en", L"Edkii Emmc Device Driver" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
// Controller name table
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmmcDxeControllerNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEmmcDxeControllerNameTable[] = {
|
||||
{ "eng;en", L"Edkii Emmc Host Controller" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
@@ -36,9 +36,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEmmcDxeComponentName
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmmcDxeComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EmmcDxeComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EmmcDxeComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmmcDxeComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EmmcDxeComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EmmcDxeComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
@@ -96,7 +96,6 @@ EmmcDxeComponentNameGetDriverName (
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gEmmcDxeComponentName)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -170,11 +169,11 @@ EmmcDxeComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -205,13 +204,14 @@ EmmcDxeComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the child context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
gEmmcDxeDriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -220,8 +220,8 @@ EmmcDxeComponentNameGetControllerName (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Partition = EMMC_PARTITION_DATA_FROM_BLKIO (BlockIo);
|
||||
Device = Partition->Device;
|
||||
Partition = EMMC_PARTITION_DATA_FROM_BLKIO (BlockIo);
|
||||
Device = Partition->Device;
|
||||
ControllerNameTable = Device->ControllerNameTable;
|
||||
}
|
||||
|
||||
@@ -233,4 +233,3 @@ EmmcDxeComponentNameGetControllerName (
|
||||
(BOOLEAN)(This == &gEmmcDxeComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -26,8 +26,8 @@
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -56,7 +56,7 @@ EmmcReadBlocks (
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -82,11 +82,11 @@ EmmcReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -102,7 +102,7 @@ EmmcWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -152,12 +152,12 @@ EmmcResetEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcReadBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -185,12 +185,12 @@ EmmcReadBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcWriteBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -287,15 +287,15 @@ EmmcFlushBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcSecurityProtocolInOut (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize,
|
||||
IN BOOLEAN IsRead
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize,
|
||||
IN BOOLEAN IsRead
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -373,14 +373,14 @@ EmmcSecurityProtocolInOut (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcSecurityProtocolIn (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -447,13 +447,13 @@ EmmcSecurityProtocolIn (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcSecurityProtocolOut (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -486,12 +486,11 @@ EmmcSecurityProtocolOut (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcEraseBlocks (
|
||||
IN EFI_ERASE_BLOCK_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_ERASE_BLOCK_TOKEN *Token,
|
||||
IN UINTN Size
|
||||
IN EFI_ERASE_BLOCK_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_ERASE_BLOCK_TOKEN *Token,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -32,9 +32,9 @@ EmmcDiskInfoInquiry (
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMMC_PARTITION *Partition;
|
||||
EMMC_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
EMMC_PARTITION *Partition;
|
||||
EMMC_DEVICE *Device;
|
||||
|
||||
Partition = EMMC_PARTITION_DATA_FROM_DISKINFO (This);
|
||||
Device = Partition->Device;
|
||||
|
@@ -14,7 +14,7 @@
|
||||
//
|
||||
// EmmcDxe Driver Binding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gEmmcDxeDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gEmmcDxeDriverBinding = {
|
||||
EmmcDxeDriverBindingSupported,
|
||||
EmmcDxeDriverBindingStart,
|
||||
EmmcDxeDriverBindingStop,
|
||||
@@ -26,7 +26,7 @@ EFI_DRIVER_BINDING_PROTOCOL gEmmcDxeDriverBinding = {
|
||||
//
|
||||
// Template for Emmc Partitions.
|
||||
//
|
||||
EMMC_PARTITION mEmmcPartitionTemplate = {
|
||||
EMMC_PARTITION mEmmcPartitionTemplate = {
|
||||
EMMC_PARTITION_SIGNATURE, // Signature
|
||||
FALSE, // Enable
|
||||
EmmcPartitionUnknown, // PartitionType
|
||||
@@ -93,39 +93,39 @@ DumpCsd (
|
||||
IN EMMC_CSD *Csd
|
||||
)
|
||||
{
|
||||
DEBUG((DEBUG_INFO, "== Dump Emmc Csd Register==\n"));
|
||||
DEBUG((DEBUG_INFO, " CSD structure 0x%x\n", Csd->CsdStructure));
|
||||
DEBUG((DEBUG_INFO, " System specification version 0x%x\n", Csd->SpecVers));
|
||||
DEBUG((DEBUG_INFO, " Data read access-time 1 0x%x\n", Csd->Taac));
|
||||
DEBUG((DEBUG_INFO, " Data read access-time 2 0x%x\n", Csd->Nsac));
|
||||
DEBUG((DEBUG_INFO, " Max. bus clock frequency 0x%x\n", Csd->TranSpeed));
|
||||
DEBUG((DEBUG_INFO, " Device command classes 0x%x\n", Csd->Ccc));
|
||||
DEBUG((DEBUG_INFO, " Max. read data block length 0x%x\n", Csd->ReadBlLen));
|
||||
DEBUG((DEBUG_INFO, " Partial blocks for read allowed 0x%x\n", Csd->ReadBlPartial));
|
||||
DEBUG((DEBUG_INFO, " Write block misalignment 0x%x\n", Csd->WriteBlkMisalign));
|
||||
DEBUG((DEBUG_INFO, " Read block misalignment 0x%x\n", Csd->ReadBlkMisalign));
|
||||
DEBUG((DEBUG_INFO, " DSR implemented 0x%x\n", Csd->DsrImp));
|
||||
DEBUG((DEBUG_INFO, " Device size 0x%x\n", Csd->CSizeLow | (Csd->CSizeHigh << 2)));
|
||||
DEBUG((DEBUG_INFO, " Max. read current @ VDD min 0x%x\n", Csd->VddRCurrMin));
|
||||
DEBUG((DEBUG_INFO, " Max. read current @ VDD max 0x%x\n", Csd->VddRCurrMax));
|
||||
DEBUG((DEBUG_INFO, " Max. write current @ VDD min 0x%x\n", Csd->VddWCurrMin));
|
||||
DEBUG((DEBUG_INFO, " Max. write current @ VDD max 0x%x\n", Csd->VddWCurrMax));
|
||||
DEBUG((DEBUG_INFO, " Device size multiplier 0x%x\n", Csd->CSizeMult));
|
||||
DEBUG((DEBUG_INFO, " Erase group size 0x%x\n", Csd->EraseGrpSize));
|
||||
DEBUG((DEBUG_INFO, " Erase group size multiplier 0x%x\n", Csd->EraseGrpMult));
|
||||
DEBUG((DEBUG_INFO, " Write protect group size 0x%x\n", Csd->WpGrpSize));
|
||||
DEBUG((DEBUG_INFO, " Write protect group enable 0x%x\n", Csd->WpGrpEnable));
|
||||
DEBUG((DEBUG_INFO, " Manufacturer default ECC 0x%x\n", Csd->DefaultEcc));
|
||||
DEBUG((DEBUG_INFO, " Write speed factor 0x%x\n", Csd->R2WFactor));
|
||||
DEBUG((DEBUG_INFO, " Max. write data block length 0x%x\n", Csd->WriteBlLen));
|
||||
DEBUG((DEBUG_INFO, " Partial blocks for write allowed 0x%x\n", Csd->WriteBlPartial));
|
||||
DEBUG((DEBUG_INFO, " Content protection application 0x%x\n", Csd->ContentProtApp));
|
||||
DEBUG((DEBUG_INFO, " File format group 0x%x\n", Csd->FileFormatGrp));
|
||||
DEBUG((DEBUG_INFO, " Copy flag (OTP) 0x%x\n", Csd->Copy));
|
||||
DEBUG((DEBUG_INFO, " Permanent write protection 0x%x\n", Csd->PermWriteProtect));
|
||||
DEBUG((DEBUG_INFO, " Temporary write protection 0x%x\n", Csd->TmpWriteProtect));
|
||||
DEBUG((DEBUG_INFO, " File format 0x%x\n", Csd->FileFormat));
|
||||
DEBUG((DEBUG_INFO, " ECC code 0x%x\n", Csd->Ecc));
|
||||
DEBUG ((DEBUG_INFO, "== Dump Emmc Csd Register==\n"));
|
||||
DEBUG ((DEBUG_INFO, " CSD structure 0x%x\n", Csd->CsdStructure));
|
||||
DEBUG ((DEBUG_INFO, " System specification version 0x%x\n", Csd->SpecVers));
|
||||
DEBUG ((DEBUG_INFO, " Data read access-time 1 0x%x\n", Csd->Taac));
|
||||
DEBUG ((DEBUG_INFO, " Data read access-time 2 0x%x\n", Csd->Nsac));
|
||||
DEBUG ((DEBUG_INFO, " Max. bus clock frequency 0x%x\n", Csd->TranSpeed));
|
||||
DEBUG ((DEBUG_INFO, " Device command classes 0x%x\n", Csd->Ccc));
|
||||
DEBUG ((DEBUG_INFO, " Max. read data block length 0x%x\n", Csd->ReadBlLen));
|
||||
DEBUG ((DEBUG_INFO, " Partial blocks for read allowed 0x%x\n", Csd->ReadBlPartial));
|
||||
DEBUG ((DEBUG_INFO, " Write block misalignment 0x%x\n", Csd->WriteBlkMisalign));
|
||||
DEBUG ((DEBUG_INFO, " Read block misalignment 0x%x\n", Csd->ReadBlkMisalign));
|
||||
DEBUG ((DEBUG_INFO, " DSR implemented 0x%x\n", Csd->DsrImp));
|
||||
DEBUG ((DEBUG_INFO, " Device size 0x%x\n", Csd->CSizeLow | (Csd->CSizeHigh << 2)));
|
||||
DEBUG ((DEBUG_INFO, " Max. read current @ VDD min 0x%x\n", Csd->VddRCurrMin));
|
||||
DEBUG ((DEBUG_INFO, " Max. read current @ VDD max 0x%x\n", Csd->VddRCurrMax));
|
||||
DEBUG ((DEBUG_INFO, " Max. write current @ VDD min 0x%x\n", Csd->VddWCurrMin));
|
||||
DEBUG ((DEBUG_INFO, " Max. write current @ VDD max 0x%x\n", Csd->VddWCurrMax));
|
||||
DEBUG ((DEBUG_INFO, " Device size multiplier 0x%x\n", Csd->CSizeMult));
|
||||
DEBUG ((DEBUG_INFO, " Erase group size 0x%x\n", Csd->EraseGrpSize));
|
||||
DEBUG ((DEBUG_INFO, " Erase group size multiplier 0x%x\n", Csd->EraseGrpMult));
|
||||
DEBUG ((DEBUG_INFO, " Write protect group size 0x%x\n", Csd->WpGrpSize));
|
||||
DEBUG ((DEBUG_INFO, " Write protect group enable 0x%x\n", Csd->WpGrpEnable));
|
||||
DEBUG ((DEBUG_INFO, " Manufacturer default ECC 0x%x\n", Csd->DefaultEcc));
|
||||
DEBUG ((DEBUG_INFO, " Write speed factor 0x%x\n", Csd->R2WFactor));
|
||||
DEBUG ((DEBUG_INFO, " Max. write data block length 0x%x\n", Csd->WriteBlLen));
|
||||
DEBUG ((DEBUG_INFO, " Partial blocks for write allowed 0x%x\n", Csd->WriteBlPartial));
|
||||
DEBUG ((DEBUG_INFO, " Content protection application 0x%x\n", Csd->ContentProtApp));
|
||||
DEBUG ((DEBUG_INFO, " File format group 0x%x\n", Csd->FileFormatGrp));
|
||||
DEBUG ((DEBUG_INFO, " Copy flag (OTP) 0x%x\n", Csd->Copy));
|
||||
DEBUG ((DEBUG_INFO, " Permanent write protection 0x%x\n", Csd->PermWriteProtect));
|
||||
DEBUG ((DEBUG_INFO, " Temporary write protection 0x%x\n", Csd->TmpWriteProtect));
|
||||
DEBUG ((DEBUG_INFO, " File format 0x%x\n", Csd->FileFormat));
|
||||
DEBUG ((DEBUG_INFO, " ECC code 0x%x\n", Csd->Ecc));
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -142,68 +142,98 @@ DumpExtCsd (
|
||||
IN EMMC_EXT_CSD *ExtCsd
|
||||
)
|
||||
{
|
||||
DEBUG((DEBUG_INFO, "==Dump Emmc ExtCsd Register==\n"));
|
||||
DEBUG((DEBUG_INFO, " Supported Command Sets 0x%x\n", ExtCsd->CmdSet));
|
||||
DEBUG((DEBUG_INFO, " HPI features 0x%x\n", ExtCsd->HpiFeatures));
|
||||
DEBUG((DEBUG_INFO, " Background operations support 0x%x\n", ExtCsd->BkOpsSupport));
|
||||
DEBUG((DEBUG_INFO, " Background operations status 0x%x\n", ExtCsd->BkopsStatus));
|
||||
DEBUG((DEBUG_INFO, " Number of correctly programmed sectors 0x%x\n", *((UINT32*)&ExtCsd->CorrectlyPrgSectorsNum[0])));
|
||||
DEBUG((DEBUG_INFO, " Initialization time after partitioning 0x%x\n", ExtCsd->IniTimeoutAp));
|
||||
DEBUG((DEBUG_INFO, " TRIM Multiplier 0x%x\n", ExtCsd->TrimMult));
|
||||
DEBUG((DEBUG_INFO, " Secure Feature support 0x%x\n", ExtCsd->SecFeatureSupport));
|
||||
DEBUG((DEBUG_INFO, " Secure Erase Multiplier 0x%x\n", ExtCsd->SecEraseMult));
|
||||
DEBUG((DEBUG_INFO, " Secure TRIM Multiplier 0x%x\n", ExtCsd->SecTrimMult));
|
||||
DEBUG((DEBUG_INFO, " Boot information 0x%x\n", ExtCsd->BootInfo));
|
||||
DEBUG((DEBUG_INFO, " Boot partition size 0x%x\n", ExtCsd->BootSizeMult));
|
||||
DEBUG((DEBUG_INFO, " Access size 0x%x\n", ExtCsd->AccSize));
|
||||
DEBUG((DEBUG_INFO, " High-capacity erase unit size 0x%x\n", ExtCsd->HcEraseGrpSize));
|
||||
DEBUG((DEBUG_INFO, " High-capacity erase timeout 0x%x\n", ExtCsd->EraseTimeoutMult));
|
||||
DEBUG((DEBUG_INFO, " Reliable write sector count 0x%x\n", ExtCsd->RelWrSecC));
|
||||
DEBUG((DEBUG_INFO, " High-capacity write protect group size 0x%x\n", ExtCsd->HcWpGrpSize));
|
||||
DEBUG((DEBUG_INFO, " Sleep/awake timeout 0x%x\n", ExtCsd->SATimeout));
|
||||
DEBUG((DEBUG_INFO, " Sector Count 0x%x\n", *((UINT32*)&ExtCsd->SecCount[0])));
|
||||
DEBUG((DEBUG_INFO, " Partition switching timing 0x%x\n", ExtCsd->PartitionSwitchTime));
|
||||
DEBUG((DEBUG_INFO, " Out-of-interrupt busy timing 0x%x\n", ExtCsd->OutOfInterruptTime));
|
||||
DEBUG((DEBUG_INFO, " I/O Driver Strength 0x%x\n", ExtCsd->DriverStrength));
|
||||
DEBUG((DEBUG_INFO, " Device type 0x%x\n", ExtCsd->DeviceType));
|
||||
DEBUG((DEBUG_INFO, " CSD STRUCTURE 0x%x\n", ExtCsd->CsdStructure));
|
||||
DEBUG((DEBUG_INFO, " Extended CSD revision 0x%x\n", ExtCsd->ExtCsdRev));
|
||||
DEBUG((DEBUG_INFO, " Command set 0x%x\n", ExtCsd->CmdSet));
|
||||
DEBUG((DEBUG_INFO, " Command set revision 0x%x\n", ExtCsd->CmdSetRev));
|
||||
DEBUG((DEBUG_INFO, " Power class 0x%x\n", ExtCsd->PowerClass));
|
||||
DEBUG((DEBUG_INFO, " High-speed interface timing 0x%x\n", ExtCsd->HsTiming));
|
||||
DEBUG((DEBUG_INFO, " Bus width mode 0x%x\n", ExtCsd->BusWidth));
|
||||
DEBUG((DEBUG_INFO, " Erased memory content 0x%x\n", ExtCsd->ErasedMemCont));
|
||||
DEBUG((DEBUG_INFO, " Partition configuration 0x%x\n", ExtCsd->PartitionConfig));
|
||||
DEBUG((DEBUG_INFO, " Boot config protection 0x%x\n", ExtCsd->BootConfigProt));
|
||||
DEBUG((DEBUG_INFO, " Boot bus Conditions 0x%x\n", ExtCsd->BootBusConditions));
|
||||
DEBUG((DEBUG_INFO, " High-density erase group definition 0x%x\n", ExtCsd->EraseGroupDef));
|
||||
DEBUG((DEBUG_INFO, " Boot write protection status register 0x%x\n", ExtCsd->BootWpStatus));
|
||||
DEBUG((DEBUG_INFO, " Boot area write protection register 0x%x\n", ExtCsd->BootWp));
|
||||
DEBUG((DEBUG_INFO, " User area write protection register 0x%x\n", ExtCsd->UserWp));
|
||||
DEBUG((DEBUG_INFO, " FW configuration 0x%x\n", ExtCsd->FwConfig));
|
||||
DEBUG((DEBUG_INFO, " RPMB Size 0x%x\n", ExtCsd->RpmbSizeMult));
|
||||
DEBUG((DEBUG_INFO, " H/W reset function 0x%x\n", ExtCsd->RstFunction));
|
||||
DEBUG((DEBUG_INFO, " Partitioning Support 0x%x\n", ExtCsd->PartitioningSupport));
|
||||
DEBUG((DEBUG_INFO, " Max Enhanced Area Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->MaxEnhSizeMult[2], ExtCsd->MaxEnhSizeMult[1], ExtCsd->MaxEnhSizeMult[0]));
|
||||
DEBUG((DEBUG_INFO, " Partitions attribute 0x%x\n", ExtCsd->PartitionsAttribute));
|
||||
DEBUG((DEBUG_INFO, " Partitioning Setting 0x%x\n", ExtCsd->PartitionSettingCompleted));
|
||||
DEBUG((DEBUG_INFO, " General Purpose Partition 1 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[2], ExtCsd->GpSizeMult[1], ExtCsd->GpSizeMult[0]));
|
||||
DEBUG((DEBUG_INFO, " General Purpose Partition 2 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[5], ExtCsd->GpSizeMult[4], ExtCsd->GpSizeMult[3]));
|
||||
DEBUG((DEBUG_INFO, " General Purpose Partition 3 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[8], ExtCsd->GpSizeMult[7], ExtCsd->GpSizeMult[6]));
|
||||
DEBUG((DEBUG_INFO, " General Purpose Partition 4 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[11], ExtCsd->GpSizeMult[10], ExtCsd->GpSizeMult[9]));
|
||||
DEBUG((DEBUG_INFO, " Enhanced User Data Area Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->EnhSizeMult[2], ExtCsd->EnhSizeMult[1], ExtCsd->EnhSizeMult[0]));
|
||||
DEBUG((DEBUG_INFO, " Enhanced User Data Start Address 0x%x\n", *((UINT32*)&ExtCsd->EnhStartAddr[0])));
|
||||
DEBUG((DEBUG_INFO, " Bad Block Management mode 0x%x\n", ExtCsd->SecBadBlkMgmnt));
|
||||
DEBUG((DEBUG_INFO, " Native sector size 0x%x\n", ExtCsd->NativeSectorSize));
|
||||
DEBUG((DEBUG_INFO, " Sector size emulation 0x%x\n", ExtCsd->UseNativeSector));
|
||||
DEBUG((DEBUG_INFO, " Sector size 0x%x\n", ExtCsd->DataSectorSize));
|
||||
DEBUG ((DEBUG_INFO, "==Dump Emmc ExtCsd Register==\n"));
|
||||
DEBUG ((DEBUG_INFO, " Supported Command Sets 0x%x\n", ExtCsd->CmdSet));
|
||||
DEBUG ((DEBUG_INFO, " HPI features 0x%x\n", ExtCsd->HpiFeatures));
|
||||
DEBUG ((DEBUG_INFO, " Background operations support 0x%x\n", ExtCsd->BkOpsSupport));
|
||||
DEBUG ((DEBUG_INFO, " Background operations status 0x%x\n", ExtCsd->BkopsStatus));
|
||||
DEBUG ((DEBUG_INFO, " Number of correctly programmed sectors 0x%x\n", *((UINT32 *)&ExtCsd->CorrectlyPrgSectorsNum[0])));
|
||||
DEBUG ((DEBUG_INFO, " Initialization time after partitioning 0x%x\n", ExtCsd->IniTimeoutAp));
|
||||
DEBUG ((DEBUG_INFO, " TRIM Multiplier 0x%x\n", ExtCsd->TrimMult));
|
||||
DEBUG ((DEBUG_INFO, " Secure Feature support 0x%x\n", ExtCsd->SecFeatureSupport));
|
||||
DEBUG ((DEBUG_INFO, " Secure Erase Multiplier 0x%x\n", ExtCsd->SecEraseMult));
|
||||
DEBUG ((DEBUG_INFO, " Secure TRIM Multiplier 0x%x\n", ExtCsd->SecTrimMult));
|
||||
DEBUG ((DEBUG_INFO, " Boot information 0x%x\n", ExtCsd->BootInfo));
|
||||
DEBUG ((DEBUG_INFO, " Boot partition size 0x%x\n", ExtCsd->BootSizeMult));
|
||||
DEBUG ((DEBUG_INFO, " Access size 0x%x\n", ExtCsd->AccSize));
|
||||
DEBUG ((DEBUG_INFO, " High-capacity erase unit size 0x%x\n", ExtCsd->HcEraseGrpSize));
|
||||
DEBUG ((DEBUG_INFO, " High-capacity erase timeout 0x%x\n", ExtCsd->EraseTimeoutMult));
|
||||
DEBUG ((DEBUG_INFO, " Reliable write sector count 0x%x\n", ExtCsd->RelWrSecC));
|
||||
DEBUG ((DEBUG_INFO, " High-capacity write protect group size 0x%x\n", ExtCsd->HcWpGrpSize));
|
||||
DEBUG ((DEBUG_INFO, " Sleep/awake timeout 0x%x\n", ExtCsd->SATimeout));
|
||||
DEBUG ((DEBUG_INFO, " Sector Count 0x%x\n", *((UINT32 *)&ExtCsd->SecCount[0])));
|
||||
DEBUG ((DEBUG_INFO, " Partition switching timing 0x%x\n", ExtCsd->PartitionSwitchTime));
|
||||
DEBUG ((DEBUG_INFO, " Out-of-interrupt busy timing 0x%x\n", ExtCsd->OutOfInterruptTime));
|
||||
DEBUG ((DEBUG_INFO, " I/O Driver Strength 0x%x\n", ExtCsd->DriverStrength));
|
||||
DEBUG ((DEBUG_INFO, " Device type 0x%x\n", ExtCsd->DeviceType));
|
||||
DEBUG ((DEBUG_INFO, " CSD STRUCTURE 0x%x\n", ExtCsd->CsdStructure));
|
||||
DEBUG ((DEBUG_INFO, " Extended CSD revision 0x%x\n", ExtCsd->ExtCsdRev));
|
||||
DEBUG ((DEBUG_INFO, " Command set 0x%x\n", ExtCsd->CmdSet));
|
||||
DEBUG ((DEBUG_INFO, " Command set revision 0x%x\n", ExtCsd->CmdSetRev));
|
||||
DEBUG ((DEBUG_INFO, " Power class 0x%x\n", ExtCsd->PowerClass));
|
||||
DEBUG ((DEBUG_INFO, " High-speed interface timing 0x%x\n", ExtCsd->HsTiming));
|
||||
DEBUG ((DEBUG_INFO, " Bus width mode 0x%x\n", ExtCsd->BusWidth));
|
||||
DEBUG ((DEBUG_INFO, " Erased memory content 0x%x\n", ExtCsd->ErasedMemCont));
|
||||
DEBUG ((DEBUG_INFO, " Partition configuration 0x%x\n", ExtCsd->PartitionConfig));
|
||||
DEBUG ((DEBUG_INFO, " Boot config protection 0x%x\n", ExtCsd->BootConfigProt));
|
||||
DEBUG ((DEBUG_INFO, " Boot bus Conditions 0x%x\n", ExtCsd->BootBusConditions));
|
||||
DEBUG ((DEBUG_INFO, " High-density erase group definition 0x%x\n", ExtCsd->EraseGroupDef));
|
||||
DEBUG ((DEBUG_INFO, " Boot write protection status register 0x%x\n", ExtCsd->BootWpStatus));
|
||||
DEBUG ((DEBUG_INFO, " Boot area write protection register 0x%x\n", ExtCsd->BootWp));
|
||||
DEBUG ((DEBUG_INFO, " User area write protection register 0x%x\n", ExtCsd->UserWp));
|
||||
DEBUG ((DEBUG_INFO, " FW configuration 0x%x\n", ExtCsd->FwConfig));
|
||||
DEBUG ((DEBUG_INFO, " RPMB Size 0x%x\n", ExtCsd->RpmbSizeMult));
|
||||
DEBUG ((DEBUG_INFO, " H/W reset function 0x%x\n", ExtCsd->RstFunction));
|
||||
DEBUG ((DEBUG_INFO, " Partitioning Support 0x%x\n", ExtCsd->PartitioningSupport));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" Max Enhanced Area Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->MaxEnhSizeMult[2],
|
||||
ExtCsd->MaxEnhSizeMult[1],
|
||||
ExtCsd->MaxEnhSizeMult[0]
|
||||
));
|
||||
DEBUG ((DEBUG_INFO, " Partitions attribute 0x%x\n", ExtCsd->PartitionsAttribute));
|
||||
DEBUG ((DEBUG_INFO, " Partitioning Setting 0x%x\n", ExtCsd->PartitionSettingCompleted));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" General Purpose Partition 1 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[2],
|
||||
ExtCsd->GpSizeMult[1],
|
||||
ExtCsd->GpSizeMult[0]
|
||||
));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" General Purpose Partition 2 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[5],
|
||||
ExtCsd->GpSizeMult[4],
|
||||
ExtCsd->GpSizeMult[3]
|
||||
));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" General Purpose Partition 3 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[8],
|
||||
ExtCsd->GpSizeMult[7],
|
||||
ExtCsd->GpSizeMult[6]
|
||||
));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" General Purpose Partition 4 Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->GpSizeMult[11],
|
||||
ExtCsd->GpSizeMult[10],
|
||||
ExtCsd->GpSizeMult[9]
|
||||
));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
" Enhanced User Data Area Size 0x%02x%02x%02x\n", \
|
||||
ExtCsd->EnhSizeMult[2],
|
||||
ExtCsd->EnhSizeMult[1],
|
||||
ExtCsd->EnhSizeMult[0]
|
||||
));
|
||||
DEBUG ((DEBUG_INFO, " Enhanced User Data Start Address 0x%x\n", *((UINT32 *)&ExtCsd->EnhStartAddr[0])));
|
||||
DEBUG ((DEBUG_INFO, " Bad Block Management mode 0x%x\n", ExtCsd->SecBadBlkMgmnt));
|
||||
DEBUG ((DEBUG_INFO, " Native sector size 0x%x\n", ExtCsd->NativeSectorSize));
|
||||
DEBUG ((DEBUG_INFO, " Sector size emulation 0x%x\n", ExtCsd->UseNativeSector));
|
||||
DEBUG ((DEBUG_INFO, " Sector size 0x%x\n", ExtCsd->DataSectorSize));
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -219,8 +249,8 @@ DumpExtCsd (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetEmmcModelName (
|
||||
IN OUT EMMC_DEVICE *Device,
|
||||
IN EMMC_CID *Cid
|
||||
IN OUT EMMC_DEVICE *Device,
|
||||
IN EMMC_CID *Cid
|
||||
)
|
||||
{
|
||||
CHAR8 String[EMMC_MODEL_NAME_MAX_LEN];
|
||||
@@ -248,27 +278,28 @@ GetEmmcModelName (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DiscoverAllPartitions (
|
||||
IN EMMC_DEVICE *Device
|
||||
IN EMMC_DEVICE *Device
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMMC_PARTITION *Partition;
|
||||
EMMC_CSD *Csd;
|
||||
EMMC_CID *Cid;
|
||||
EMMC_EXT_CSD *ExtCsd;
|
||||
UINT8 Slot;
|
||||
UINT64 Capacity;
|
||||
UINT32 DevStatus;
|
||||
UINT8 Index;
|
||||
UINT32 SecCount;
|
||||
UINT32 GpSizeMult;
|
||||
EFI_STATUS Status;
|
||||
EMMC_PARTITION *Partition;
|
||||
EMMC_CSD *Csd;
|
||||
EMMC_CID *Cid;
|
||||
EMMC_EXT_CSD *ExtCsd;
|
||||
UINT8 Slot;
|
||||
UINT64 Capacity;
|
||||
UINT32 DevStatus;
|
||||
UINT8 Index;
|
||||
UINT32 SecCount;
|
||||
UINT32 GpSizeMult;
|
||||
|
||||
Slot = Device->Slot;
|
||||
Slot = Device->Slot;
|
||||
|
||||
Status = EmmcSendStatus (Device, Slot + 1, &DevStatus);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Deselect the device to force it enter stby mode before getting CSD
|
||||
// register content.
|
||||
@@ -287,6 +318,7 @@ DiscoverAllPartitions (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
DumpCsd (Csd);
|
||||
|
||||
if ((Csd->CSizeLow | Csd->CSizeHigh << 2) == 0xFFF) {
|
||||
@@ -311,6 +343,7 @@ DiscoverAllPartitions (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
DumpExtCsd (ExtCsd);
|
||||
|
||||
if (ExtCsd->ExtCsdRev < 5) {
|
||||
@@ -326,22 +359,22 @@ DiscoverAllPartitions (
|
||||
for (Index = 0; Index < EMMC_MAX_PARTITIONS; Index++) {
|
||||
Partition = &Device->Partition[Index];
|
||||
CopyMem (Partition, &mEmmcPartitionTemplate, sizeof (EMMC_PARTITION));
|
||||
Partition->Device = Device;
|
||||
Partition->Device = Device;
|
||||
InitializeListHead (&Partition->Queue);
|
||||
Partition->BlockIo.Media = &Partition->BlockMedia;
|
||||
Partition->BlockIo2.Media = &Partition->BlockMedia;
|
||||
Partition->PartitionType = Index;
|
||||
Partition->BlockMedia.IoAlign = Device->Private->PassThru->IoAlign;
|
||||
Partition->BlockMedia.BlockSize = 0x200;
|
||||
Partition->BlockMedia.LastBlock = 0x00;
|
||||
Partition->BlockMedia.RemovableMedia = FALSE;
|
||||
Partition->BlockIo.Media = &Partition->BlockMedia;
|
||||
Partition->BlockIo2.Media = &Partition->BlockMedia;
|
||||
Partition->PartitionType = Index;
|
||||
Partition->BlockMedia.IoAlign = Device->Private->PassThru->IoAlign;
|
||||
Partition->BlockMedia.BlockSize = 0x200;
|
||||
Partition->BlockMedia.LastBlock = 0x00;
|
||||
Partition->BlockMedia.RemovableMedia = FALSE;
|
||||
Partition->BlockMedia.MediaPresent = TRUE;
|
||||
Partition->BlockMedia.LogicalPartition = FALSE;
|
||||
|
||||
switch (Index) {
|
||||
case EmmcPartitionUserData:
|
||||
SecCount = *(UINT32*)&ExtCsd->SecCount;
|
||||
Capacity = MultU64x32 ((UINT64) SecCount, 0x200);
|
||||
SecCount = *(UINT32 *)&ExtCsd->SecCount;
|
||||
Capacity = MultU64x32 ((UINT64)SecCount, 0x200);
|
||||
break;
|
||||
case EmmcPartitionBoot1:
|
||||
case EmmcPartitionBoot2:
|
||||
@@ -352,19 +385,19 @@ DiscoverAllPartitions (
|
||||
break;
|
||||
case EmmcPartitionGP1:
|
||||
GpSizeMult = (UINT32)(ExtCsd->GpSizeMult[0] | (ExtCsd->GpSizeMult[1] << 8) | (ExtCsd->GpSizeMult[2] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
case EmmcPartitionGP2:
|
||||
GpSizeMult = (UINT32)(ExtCsd->GpSizeMult[3] | (ExtCsd->GpSizeMult[4] << 8) | (ExtCsd->GpSizeMult[5] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
case EmmcPartitionGP3:
|
||||
GpSizeMult = (UINT32)(ExtCsd->GpSizeMult[6] | (ExtCsd->GpSizeMult[7] << 8) | (ExtCsd->GpSizeMult[8] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
case EmmcPartitionGP4:
|
||||
GpSizeMult = (UINT32)(ExtCsd->GpSizeMult[9] | (ExtCsd->GpSizeMult[10] << 8) | (ExtCsd->GpSizeMult[11] << 16));
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
Capacity = MultU64x32 (MultU64x32 (MultU64x32 ((UINT64)GpSizeMult, ExtCsd->HcWpGrpSize), ExtCsd->HcEraseGrpSize), SIZE_512KB);
|
||||
break;
|
||||
default:
|
||||
ASSERT (FALSE);
|
||||
@@ -372,7 +405,7 @@ DiscoverAllPartitions (
|
||||
}
|
||||
|
||||
if (Capacity != 0) {
|
||||
Partition->Enable = TRUE;
|
||||
Partition->Enable = TRUE;
|
||||
Partition->BlockMedia.LastBlock = DivU64x32 (Capacity, Partition->BlockMedia.BlockSize) - 1;
|
||||
}
|
||||
|
||||
@@ -402,17 +435,17 @@ DiscoverAllPartitions (
|
||||
**/
|
||||
EFI_STATUS
|
||||
InstallProtocolOnPartition (
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT8 Index
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT8 Index
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMMC_PARTITION *Partition;
|
||||
CONTROLLER_DEVICE_PATH ControlNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_STATUS Status;
|
||||
EMMC_PARTITION *Partition;
|
||||
CONTROLLER_DEVICE_PATH ControlNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
|
||||
//
|
||||
// Build device path
|
||||
@@ -424,21 +457,21 @@ InstallProtocolOnPartition (
|
||||
SetDevicePathNodeLength (&ControlNode.Header, sizeof (CONTROLLER_DEVICE_PATH));
|
||||
ControlNode.ControllerNumber = Index;
|
||||
|
||||
DevicePath = AppendDevicePathNode (ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL*)&ControlNode);
|
||||
DevicePath = AppendDevicePathNode (ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&ControlNode);
|
||||
if (DevicePath == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Error;
|
||||
}
|
||||
|
||||
DeviceHandle = NULL;
|
||||
DeviceHandle = NULL;
|
||||
RemainingDevicePath = DevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) {
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd (RemainingDevicePath)) {
|
||||
Status = EFI_ALREADY_STARTED;
|
||||
goto Error;
|
||||
}
|
||||
|
||||
Partition = &Device->Partition[Index];
|
||||
Partition = &Device->Partition[Index];
|
||||
Partition->DevicePath = DevicePath;
|
||||
if (Partition->Enable) {
|
||||
//
|
||||
@@ -464,9 +497,10 @@ InstallProtocolOnPartition (
|
||||
}
|
||||
|
||||
if (((Partition->PartitionType == EmmcPartitionUserData) ||
|
||||
(Partition->PartitionType == EmmcPartitionBoot1) ||
|
||||
(Partition->PartitionType == EmmcPartitionBoot2)) &&
|
||||
((Device->Csd.Ccc & BIT10) != 0)) {
|
||||
(Partition->PartitionType == EmmcPartitionBoot1) ||
|
||||
(Partition->PartitionType == EmmcPartitionBoot2)) &&
|
||||
((Device->Csd.Ccc & BIT10) != 0))
|
||||
{
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
&Partition->Handle,
|
||||
&gEfiStorageSecurityCommandProtocolGuid,
|
||||
@@ -495,13 +529,12 @@ InstallProtocolOnPartition (
|
||||
gBS->OpenProtocol (
|
||||
Device->Private->Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **) &(Device->Private->PassThru),
|
||||
(VOID **)&(Device->Private->PassThru),
|
||||
Device->Private->DriverBindingHandle,
|
||||
Partition->Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
}
|
||||
|
||||
} else {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@@ -532,27 +565,27 @@ Error:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
DiscoverEmmcDevice (
|
||||
IN EMMC_DRIVER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Slot,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EMMC_DRIVER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Slot,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EMMC_DEVICE *Device;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingEmmcDevPath;
|
||||
EFI_DEV_PATH *Node;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
UINT8 Index;
|
||||
EFI_STATUS Status;
|
||||
EMMC_DEVICE *Device;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingEmmcDevPath;
|
||||
EFI_DEV_PATH *Node;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
UINT8 Index;
|
||||
|
||||
Device = NULL;
|
||||
DevicePath = NULL;
|
||||
NewDevicePath = NULL;
|
||||
RemainingDevicePath = NULL;
|
||||
PassThru = Private->PassThru;
|
||||
Device = &Private->Device[Slot];
|
||||
PassThru = Private->PassThru;
|
||||
Device = &Private->Device[Slot];
|
||||
|
||||
//
|
||||
// Build Device Path to check if the EMMC device present at the slot.
|
||||
@@ -562,7 +595,7 @@ DiscoverEmmcDevice (
|
||||
Slot,
|
||||
&DevicePath
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -582,7 +615,7 @@ DiscoverEmmcDevice (
|
||||
|
||||
DeviceHandle = NULL;
|
||||
RemainingEmmcDevPath = NewDevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingEmmcDevPath, &DeviceHandle);
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingEmmcDevPath, &DeviceHandle);
|
||||
//
|
||||
// The device path to the EMMC device doesn't exist. It means the corresponding device private data hasn't been initialized.
|
||||
//
|
||||
@@ -594,7 +627,7 @@ DiscoverEmmcDevice (
|
||||
// Expose user area in the Sd memory card to upper layer.
|
||||
//
|
||||
Status = DiscoverAllPartitions (Device);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (NewDevicePath);
|
||||
goto Error;
|
||||
}
|
||||
@@ -605,7 +638,7 @@ DiscoverEmmcDevice (
|
||||
EFI_NATIVE_INTERFACE,
|
||||
Device->DevicePath
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (NewDevicePath);
|
||||
goto Error;
|
||||
}
|
||||
@@ -639,10 +672,11 @@ DiscoverEmmcDevice (
|
||||
//
|
||||
// Enumerate the specified partition
|
||||
//
|
||||
Node = (EFI_DEV_PATH *) RemainingDevicePath;
|
||||
Node = (EFI_DEV_PATH *)RemainingDevicePath;
|
||||
if ((DevicePathType (&Node->DevPath) != HARDWARE_DEVICE_PATH) ||
|
||||
(DevicePathSubType (&Node->DevPath) != HW_CONTROLLER_DP) ||
|
||||
(DevicePathNodeLength (&Node->DevPath) != sizeof (CONTROLLER_DEVICE_PATH))) {
|
||||
(DevicePathNodeLength (&Node->DevPath) != sizeof (CONTROLLER_DEVICE_PATH)))
|
||||
{
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
goto Error;
|
||||
}
|
||||
@@ -707,15 +741,15 @@ Error:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
UINT8 Slot;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
UINT8 Slot;
|
||||
|
||||
//
|
||||
// Test EFI_SD_MMC_PASS_THRU_PROTOCOL on the controller handle.
|
||||
@@ -723,7 +757,7 @@ EmmcDxeDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID**) &PassThru,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -772,7 +806,7 @@ EmmcDxeDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -818,27 +852,27 @@ EmmcDxeDriverBindingSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EMMC_DRIVER_PRIVATE_DATA *Private;
|
||||
UINT8 Slot;
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EMMC_DRIVER_PRIVATE_DATA *Private;
|
||||
UINT8 Slot;
|
||||
|
||||
Private = NULL;
|
||||
PassThru = NULL;
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **) &PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if ((EFI_ERROR (Status)) && (Status != EFI_ALREADY_STARTED)) {
|
||||
return Status;
|
||||
}
|
||||
@@ -856,7 +890,7 @@ EmmcDxeDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -880,7 +914,7 @@ EmmcDxeDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &Private,
|
||||
(VOID **)&Private,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -933,6 +967,7 @@ Error:
|
||||
FreePool (Private);
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -965,10 +1000,10 @@ Error:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -991,7 +1026,7 @@ EmmcDxeDriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &Private,
|
||||
(VOID **)&Private,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1005,7 +1040,7 @@ EmmcDxeDriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
Device->Handle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &DevicePath,
|
||||
(VOID **)&DevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1013,6 +1048,7 @@ EmmcDxeDriverBindingStop (
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ASSERT (DevicePath == Device->DevicePath);
|
||||
gBS->UninstallProtocolInterface (
|
||||
Device->Handle,
|
||||
@@ -1023,16 +1059,16 @@ EmmcDxeDriverBindingStop (
|
||||
}
|
||||
|
||||
gBS->UninstallProtocolInterface (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
Private
|
||||
);
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
Private
|
||||
);
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
FreePool (Private);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@@ -1044,7 +1080,7 @@ EmmcDxeDriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1053,7 +1089,7 @@ EmmcDxeDriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiBlockIo2ProtocolGuid,
|
||||
(VOID **) &BlockIo2,
|
||||
(VOID **)&BlockIo2,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1073,7 +1109,8 @@ EmmcDxeDriverBindingStop (
|
||||
|
||||
for (Link = GetFirstNode (&Partition->Queue);
|
||||
!IsNull (&Partition->Queue, Link);
|
||||
Link = NextLink) {
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Partition->Queue, Link);
|
||||
|
||||
RemoveEntryList (Link);
|
||||
@@ -1132,7 +1169,7 @@ EmmcDxeDriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiStorageSecurityCommandProtocolGuid,
|
||||
(VOID **) &StorageSecurity,
|
||||
(VOID **)&StorageSecurity,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -1146,13 +1183,13 @@ EmmcDxeDriverBindingStop (
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **) &Partition->Device->Private->PassThru,
|
||||
This->DriverBindingHandle,
|
||||
ChildHandleBuffer[Index],
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **)&Partition->Device->Private->PassThru,
|
||||
This->DriverBindingHandle,
|
||||
ChildHandleBuffer[Index],
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
AllChildrenStopped = FALSE;
|
||||
continue;
|
||||
}
|
||||
@@ -1181,11 +1218,11 @@ EmmcDxeDriverBindingStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeEmmcDxe (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
|
@@ -40,11 +40,11 @@
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmmcDxeDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmmcDxeComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmmcDxeComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gEmmcDxeDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gEmmcDxeComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEmmcDxeComponentName2;
|
||||
|
||||
#define EMMC_PARTITION_SIGNATURE SIGNATURE_32 ('E', 'm', 'm', 'P')
|
||||
#define EMMC_PARTITION_SIGNATURE SIGNATURE_32 ('E', 'm', 'm', 'P')
|
||||
|
||||
#define EMMC_PARTITION_DATA_FROM_BLKIO(a) \
|
||||
CR(a, EMMC_PARTITION, BlockIo, EMMC_PARTITION_SIGNATURE)
|
||||
@@ -64,72 +64,72 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gEmmcDxeComponentName2;
|
||||
//
|
||||
// Take 2.5 seconds as generic time out value, 1 microsecond as unit.
|
||||
//
|
||||
#define EMMC_GENERIC_TIMEOUT 2500 * 1000
|
||||
#define EMMC_GENERIC_TIMEOUT 2500 * 1000
|
||||
|
||||
#define EMMC_REQUEST_SIGNATURE SIGNATURE_32 ('E', 'm', 'R', 'e')
|
||||
#define EMMC_REQUEST_SIGNATURE SIGNATURE_32 ('E', 'm', 'R', 'e')
|
||||
|
||||
typedef struct _EMMC_DEVICE EMMC_DEVICE;
|
||||
typedef struct _EMMC_DRIVER_PRIVATE_DATA EMMC_DRIVER_PRIVATE_DATA;
|
||||
typedef struct _EMMC_DEVICE EMMC_DEVICE;
|
||||
typedef struct _EMMC_DRIVER_PRIVATE_DATA EMMC_DRIVER_PRIVATE_DATA;
|
||||
|
||||
//
|
||||
// Asynchronous I/O request.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
|
||||
EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
|
||||
EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
|
||||
EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
|
||||
EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
|
||||
EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
|
||||
|
||||
BOOLEAN IsEnd;
|
||||
BOOLEAN IsEnd;
|
||||
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
EFI_EVENT Event;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
EFI_EVENT Event;
|
||||
} EMMC_REQUEST;
|
||||
|
||||
#define EMMC_REQUEST_FROM_LINK(a) \
|
||||
CR(a, EMMC_REQUEST, Link, EMMC_REQUEST_SIGNATURE)
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
BOOLEAN Enable;
|
||||
EMMC_PARTITION_TYPE PartitionType;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_BLOCK_IO_PROTOCOL BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL BlockIo2;
|
||||
EFI_BLOCK_IO_MEDIA BlockMedia;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL StorageSecurity;
|
||||
EFI_ERASE_BLOCK_PROTOCOL EraseBlock;
|
||||
EFI_DISK_INFO_PROTOCOL DiskInfo;
|
||||
UINT32 Signature;
|
||||
BOOLEAN Enable;
|
||||
EMMC_PARTITION_TYPE PartitionType;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_BLOCK_IO_PROTOCOL BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL BlockIo2;
|
||||
EFI_BLOCK_IO_MEDIA BlockMedia;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL StorageSecurity;
|
||||
EFI_ERASE_BLOCK_PROTOCOL EraseBlock;
|
||||
EFI_DISK_INFO_PROTOCOL DiskInfo;
|
||||
|
||||
LIST_ENTRY Queue;
|
||||
LIST_ENTRY Queue;
|
||||
|
||||
EMMC_DEVICE *Device;
|
||||
EMMC_DEVICE *Device;
|
||||
} EMMC_PARTITION;
|
||||
|
||||
//
|
||||
// Up to 6 slots per EMMC PCI host controller
|
||||
//
|
||||
#define EMMC_MAX_DEVICES 6
|
||||
#define EMMC_MAX_DEVICES 6
|
||||
//
|
||||
// Up to 8 partitions per EMMC device.
|
||||
//
|
||||
#define EMMC_MAX_PARTITIONS 8
|
||||
#define EMMC_MODEL_NAME_MAX_LEN 32
|
||||
#define EMMC_MAX_PARTITIONS 8
|
||||
#define EMMC_MODEL_NAME_MAX_LEN 32
|
||||
|
||||
struct _EMMC_DEVICE {
|
||||
EFI_HANDLE Handle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT8 Slot;
|
||||
BOOLEAN SectorAddressing;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT8 Slot;
|
||||
BOOLEAN SectorAddressing;
|
||||
|
||||
EMMC_PARTITION Partition[EMMC_MAX_PARTITIONS];
|
||||
EMMC_CSD Csd;
|
||||
EMMC_CID Cid;
|
||||
EMMC_EXT_CSD ExtCsd;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
EMMC_PARTITION Partition[EMMC_MAX_PARTITIONS];
|
||||
EMMC_CSD Csd;
|
||||
EMMC_CID Cid;
|
||||
EMMC_EXT_CSD ExtCsd;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
//
|
||||
// The model name consists of three fields in CID register
|
||||
// 1) OEM/Application ID (2 bytes)
|
||||
@@ -137,21 +137,21 @@ struct _EMMC_DEVICE {
|
||||
// 3) Product Serial Number (4 bytes)
|
||||
// The delimiters of these fields are whitespace.
|
||||
//
|
||||
CHAR16 ModelName[EMMC_MODEL_NAME_MAX_LEN];
|
||||
EMMC_DRIVER_PRIVATE_DATA *Private;
|
||||
} ;
|
||||
CHAR16 ModelName[EMMC_MODEL_NAME_MAX_LEN];
|
||||
EMMC_DRIVER_PRIVATE_DATA *Private;
|
||||
};
|
||||
|
||||
//
|
||||
// EMMC DXE driver private data structure
|
||||
//
|
||||
struct _EMMC_DRIVER_PRIVATE_DATA {
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
|
||||
EMMC_DEVICE Device[EMMC_MAX_DEVICES];
|
||||
} ;
|
||||
EMMC_DEVICE Device[EMMC_MAX_DEVICES];
|
||||
};
|
||||
|
||||
/**
|
||||
Tests to see if this driver supports a given controller. If a child device is provided,
|
||||
@@ -198,9 +198,9 @@ struct _EMMC_DRIVER_PRIVATE_DATA {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -241,9 +241,9 @@ EmmcDxeDriverBindingSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -275,10 +275,10 @@ EmmcDxeDriverBindingStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -399,11 +399,11 @@ EmmcDxeComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EmmcDxeComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -419,8 +419,8 @@ EmmcDxeComponentNameGetControllerName (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcSelect (
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -437,9 +437,9 @@ EmmcSelect (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcSendStatus (
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT UINT32 *DevStatus
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT UINT32 *DevStatus
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -456,9 +456,9 @@ EmmcSendStatus (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcGetCsd (
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT EMMC_CSD *Csd
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT EMMC_CSD *Csd
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -475,9 +475,9 @@ EmmcGetCsd (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcGetCid (
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT EMMC_CID *Cid
|
||||
IN EMMC_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT EMMC_CID *Cid
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -493,9 +493,8 @@ EmmcGetCid (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EmmcGetExtCsd (
|
||||
IN EMMC_DEVICE *Device,
|
||||
OUT EMMC_EXT_CSD *ExtCsd
|
||||
IN EMMC_DEVICE *Device,
|
||||
OUT EMMC_EXT_CSD *ExtCsd
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -32,11 +32,11 @@ EDKII_IOMMU_PPI *mIoMmu;
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuMap (
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -54,23 +54,25 @@ IoMmuMap (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
switch (Operation) {
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT(FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT (FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = mIoMmu->SetAttribute (
|
||||
mIoMmu,
|
||||
*Mapping,
|
||||
@@ -81,9 +83,10 @@ IoMmuMap (
|
||||
}
|
||||
} else {
|
||||
*DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -98,7 +101,7 @@ IoMmuMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuUnmap (
|
||||
IN VOID *Mapping
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -109,6 +112,7 @@ IoMmuUnmap (
|
||||
} else {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -142,7 +146,7 @@ IoMmuAllocateBuffer (
|
||||
UINTN NumberOfBytes;
|
||||
EFI_PHYSICAL_ADDRESS HostPhyAddress;
|
||||
|
||||
*HostAddress = NULL;
|
||||
*HostAddress = NULL;
|
||||
*DeviceAddress = 0;
|
||||
|
||||
if (mIoMmu != NULL) {
|
||||
@@ -157,18 +161,19 @@ IoMmuAllocateBuffer (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
NumberOfBytes = EFI_PAGES_TO_SIZE(Pages);
|
||||
Status = mIoMmu->Map (
|
||||
mIoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
NumberOfBytes = EFI_PAGES_TO_SIZE (Pages);
|
||||
Status = mIoMmu->Map (
|
||||
mIoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = mIoMmu->SetAttribute (
|
||||
mIoMmu,
|
||||
*Mapping,
|
||||
@@ -186,10 +191,12 @@ IoMmuAllocateBuffer (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
|
||||
|
||||
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
|
||||
*DeviceAddress = HostPhyAddress;
|
||||
*Mapping = NULL;
|
||||
*Mapping = NULL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -207,9 +214,9 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuFreeBuffer (
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -221,6 +228,7 @@ IoMmuFreeBuffer (
|
||||
} else {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -239,4 +247,3 @@ IoMmuInit (
|
||||
(VOID **)&mIoMmu
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -10,7 +10,7 @@
|
||||
//
|
||||
// Template for SD HC Slot Data.
|
||||
//
|
||||
SD_PEIM_HC_SLOT gSdHcSlotTemplate = {
|
||||
SD_PEIM_HC_SLOT gSdHcSlotTemplate = {
|
||||
SD_PEIM_SLOT_SIG, // Signature
|
||||
{ // Media
|
||||
MSG_SD_DP,
|
||||
@@ -34,7 +34,7 @@ SD_PEIM_HC_SLOT gSdHcSlotTemplate = {
|
||||
//
|
||||
// Template for SD HC Private Data.
|
||||
//
|
||||
SD_PEIM_HC_PRIVATE_DATA gSdHcPrivateTemplate = {
|
||||
SD_PEIM_HC_PRIVATE_DATA gSdHcPrivateTemplate = {
|
||||
SD_PEIM_SIG, // Signature
|
||||
NULL, // Pool
|
||||
{ // BlkIoPpi
|
||||
@@ -86,6 +86,7 @@ SD_PEIM_HC_PRIVATE_DATA gSdHcPrivateTemplate = {
|
||||
0, // SlotNum
|
||||
0 // TotalBlkIoDevices
|
||||
};
|
||||
|
||||
/**
|
||||
Gets the count of block I/O devices that one specific block driver detects.
|
||||
|
||||
@@ -113,9 +114,9 @@ SdBlockIoPeimGetDeviceNo (
|
||||
OUT UINTN *NumberBlockDevices
|
||||
)
|
||||
{
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
*NumberBlockDevices = Private->TotalBlkIoDevices;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -170,9 +171,9 @@ SdBlockIoPeimGetMediaInfo (
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo
|
||||
)
|
||||
{
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
if ((DeviceIndex == 0) || (DeviceIndex > Private->TotalBlkIoDevices) || (DeviceIndex > SD_PEIM_MAX_SLOTS)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@@ -231,12 +232,12 @@ SdBlockIoPeimReadBlocks (
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINTN Remaining;
|
||||
UINT32 MaxBlock;
|
||||
EFI_STATUS Status;
|
||||
UINT32 BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINTN Remaining;
|
||||
UINT32 MaxBlock;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);
|
||||
@@ -286,14 +287,16 @@ SdBlockIoPeimReadBlocks (
|
||||
} else {
|
||||
Status = SdPeimRwSingleBlock (&Private->Slot[DeviceIndex - 1], StartLBA, BlockSize, Buffer, BufferSize, TRUE);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
StartLBA += NumberOfBlocks;
|
||||
Buffer = (UINT8*)Buffer + BufferSize;
|
||||
Buffer = (UINT8 *)Buffer + BufferSize;
|
||||
Remaining -= NumberOfBlocks;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -319,14 +322,14 @@ SdBlockIoPeimReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdBlockIoPeimGetDeviceNo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
)
|
||||
{
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
*NumberBlockDevices = Private->TotalBlkIoDevices;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@@ -376,24 +379,24 @@ SdBlockIoPeimGetDeviceNo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdBlockIoPeimGetMediaInfo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EFI_PEI_BLOCK_IO_MEDIA Media;
|
||||
EFI_STATUS Status;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EFI_PEI_BLOCK_IO_MEDIA Media;
|
||||
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
|
||||
Status = SdBlockIoPeimGetMediaInfo (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
&Media
|
||||
);
|
||||
Status = SdBlockIoPeimGetMediaInfo (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
&Media
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@@ -439,28 +442,28 @@ SdBlockIoPeimGetMediaInfo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdBlockIoPeimReadBlocks2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EFI_STATUS Status;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
Status = EFI_SUCCESS;
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);
|
||||
|
||||
Status = SdBlockIoPeimReadBlocks (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
StartLBA,
|
||||
BufferSize,
|
||||
Buffer
|
||||
);
|
||||
Status = SdBlockIoPeimReadBlocks (
|
||||
PeiServices,
|
||||
&Private->BlkIoPpi,
|
||||
DeviceIndex,
|
||||
StartLBA,
|
||||
BufferSize,
|
||||
Buffer
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -483,7 +486,7 @@ SdBlockIoPeimEndOfPei (
|
||||
IN VOID *Ppi
|
||||
)
|
||||
{
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
|
||||
Private = GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (NotifyDescriptor);
|
||||
|
||||
@@ -507,26 +510,26 @@ SdBlockIoPeimEndOfPei (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeSdBlockIoPeim (
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EDKII_SD_MMC_HOST_CONTROLLER_PPI *SdMmcHcPpi;
|
||||
UINT32 Index;
|
||||
UINTN *MmioBase;
|
||||
UINT8 BarNum;
|
||||
UINT8 SlotNum;
|
||||
UINT8 Controller;
|
||||
UINT64 Capacity;
|
||||
SD_HC_SLOT_CAP Capability;
|
||||
SD_PEIM_HC_SLOT *Slot;
|
||||
SD_CSD *Csd;
|
||||
SD_CSD2 *Csd2;
|
||||
UINT32 CSize;
|
||||
UINT32 CSizeMul;
|
||||
UINT32 ReadBlLen;
|
||||
EFI_STATUS Status;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
EDKII_SD_MMC_HOST_CONTROLLER_PPI *SdMmcHcPpi;
|
||||
UINT32 Index;
|
||||
UINTN *MmioBase;
|
||||
UINT8 BarNum;
|
||||
UINT8 SlotNum;
|
||||
UINT8 Controller;
|
||||
UINT64 Capacity;
|
||||
SD_HC_SLOT_CAP Capability;
|
||||
SD_PEIM_HC_SLOT *Slot;
|
||||
SD_CSD *Csd;
|
||||
SD_CSD2 *Csd2;
|
||||
UINT32 CSize;
|
||||
UINT32 CSizeMul;
|
||||
UINT32 ReadBlLen;
|
||||
|
||||
//
|
||||
// Shadow this PEIM to run from memory
|
||||
@@ -542,7 +545,7 @@ InitializeSdBlockIoPeim (
|
||||
&gEdkiiPeiSdMmcHostControllerPpiGuid,
|
||||
0,
|
||||
NULL,
|
||||
(VOID **) &SdMmcHcPpi
|
||||
(VOID **)&SdMmcHcPpi
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
@@ -571,8 +574,9 @@ InitializeSdBlockIoPeim (
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
break;
|
||||
}
|
||||
Private->BlkIoPpiList.Ppi = (VOID*)&Private->BlkIoPpi;
|
||||
Private->BlkIo2PpiList.Ppi = (VOID*)&Private->BlkIo2Ppi;
|
||||
|
||||
Private->BlkIoPpiList.Ppi = (VOID *)&Private->BlkIoPpi;
|
||||
Private->BlkIo2PpiList.Ppi = (VOID *)&Private->BlkIo2Ppi;
|
||||
//
|
||||
// Initialize the memory pool which will be used in all transactions.
|
||||
//
|
||||
@@ -587,6 +591,7 @@ InitializeSdBlockIoPeim (
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Capability.SlotType != 0x1) {
|
||||
DEBUG ((DEBUG_INFO, "The slot at 0x%x is not embedded slot type\n", MmioBase[Index]));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
@@ -597,10 +602,12 @@ InitializeSdBlockIoPeim (
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = SdPeimHcCardDetect (MmioBase[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = SdPeimHcInitHost (MmioBase[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
@@ -621,15 +628,15 @@ InitializeSdBlockIoPeim (
|
||||
Csd = &Slot->Csd;
|
||||
if (Csd->CsdStructure == 0) {
|
||||
Slot->SectorAddressing = FALSE;
|
||||
CSize = (Csd->CSizeHigh << 2 | Csd->CSizeLow) + 1;
|
||||
CSizeMul = (1 << (Csd->CSizeMul + 2));
|
||||
ReadBlLen = (1 << (Csd->ReadBlLen));
|
||||
Capacity = MultU64x32 (MultU64x32 ((UINT64)CSize, CSizeMul), ReadBlLen);
|
||||
CSize = (Csd->CSizeHigh << 2 | Csd->CSizeLow) + 1;
|
||||
CSizeMul = (1 << (Csd->CSizeMul + 2));
|
||||
ReadBlLen = (1 << (Csd->ReadBlLen));
|
||||
Capacity = MultU64x32 (MultU64x32 ((UINT64)CSize, CSizeMul), ReadBlLen);
|
||||
} else {
|
||||
Slot->SectorAddressing = TRUE;
|
||||
Csd2 = (SD_CSD2*)(VOID*)Csd;
|
||||
CSize = (Csd2->CSizeHigh << 16 | Csd2->CSizeLow) + 1;
|
||||
Capacity = MultU64x32 ((UINT64)CSize, SIZE_512KB);
|
||||
Csd2 = (SD_CSD2 *)(VOID *)Csd;
|
||||
CSize = (Csd2->CSizeHigh << 16 | Csd2->CSizeLow) + 1;
|
||||
Capacity = MultU64x32 ((UINT64)CSize, SIZE_512KB);
|
||||
}
|
||||
|
||||
Slot->Media.LastBlock = DivU64x32 (Capacity, Slot->Media.BlockSize) - 1;
|
||||
|
@@ -26,27 +26,27 @@
|
||||
|
||||
#include <IndustryStandard/Sd.h>
|
||||
|
||||
typedef struct _SD_PEIM_HC_PRIVATE_DATA SD_PEIM_HC_PRIVATE_DATA;
|
||||
typedef struct _SD_PEIM_HC_SLOT SD_PEIM_HC_SLOT;
|
||||
typedef struct _SD_TRB SD_TRB;
|
||||
typedef struct _SD_PEIM_HC_PRIVATE_DATA SD_PEIM_HC_PRIVATE_DATA;
|
||||
typedef struct _SD_PEIM_HC_SLOT SD_PEIM_HC_SLOT;
|
||||
typedef struct _SD_TRB SD_TRB;
|
||||
|
||||
#include "SdHci.h"
|
||||
#include "SdHcMem.h"
|
||||
|
||||
#define SD_PEIM_SIG SIGNATURE_32 ('S', 'D', 'C', 'P')
|
||||
#define SD_PEIM_SLOT_SIG SIGNATURE_32 ('S', 'D', 'C', 'S')
|
||||
#define SD_PEIM_SIG SIGNATURE_32 ('S', 'D', 'C', 'P')
|
||||
#define SD_PEIM_SLOT_SIG SIGNATURE_32 ('S', 'D', 'C', 'S')
|
||||
|
||||
#define SD_PEIM_MAX_SLOTS 6
|
||||
#define SD_PEIM_MAX_SLOTS 6
|
||||
|
||||
struct _SD_PEIM_HC_SLOT {
|
||||
UINT32 Signature;
|
||||
EFI_PEI_BLOCK_IO2_MEDIA Media;
|
||||
UINT32 Signature;
|
||||
EFI_PEI_BLOCK_IO2_MEDIA Media;
|
||||
|
||||
UINTN SdHcBase;
|
||||
SD_HC_SLOT_CAP Capability;
|
||||
SD_CSD Csd;
|
||||
BOOLEAN SectorAddressing;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
UINTN SdHcBase;
|
||||
SD_HC_SLOT_CAP Capability;
|
||||
SD_CSD Csd;
|
||||
BOOLEAN SectorAddressing;
|
||||
SD_PEIM_HC_PRIVATE_DATA *Private;
|
||||
};
|
||||
|
||||
struct _SD_PEIM_HC_PRIVATE_DATA {
|
||||
@@ -67,27 +67,27 @@ struct _SD_PEIM_HC_PRIVATE_DATA {
|
||||
UINT8 TotalBlkIoDevices;
|
||||
};
|
||||
|
||||
#define SD_TIMEOUT MultU64x32((UINT64)(3), 1000000)
|
||||
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS(a) CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIoPpi, SD_PEIM_SIG)
|
||||
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2(a) CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, SD_PEIM_SIG)
|
||||
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a) CR (a, SD_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, SD_PEIM_SIG)
|
||||
#define SD_TIMEOUT MultU64x32((UINT64)(3), 1000000)
|
||||
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS(a) CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIoPpi, SD_PEIM_SIG)
|
||||
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS2(a) CR (a, SD_PEIM_HC_PRIVATE_DATA, BlkIo2Ppi, SD_PEIM_SIG)
|
||||
#define GET_SD_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY(a) CR (a, SD_PEIM_HC_PRIVATE_DATA, EndOfPeiNotifyList, SD_PEIM_SIG)
|
||||
|
||||
struct _SD_TRB {
|
||||
SD_PEIM_HC_SLOT *Slot;
|
||||
UINT16 BlockSize;
|
||||
SD_PEIM_HC_SLOT *Slot;
|
||||
UINT16 BlockSize;
|
||||
|
||||
SD_COMMAND_PACKET *Packet;
|
||||
VOID *Data;
|
||||
UINT32 DataLen;
|
||||
BOOLEAN Read;
|
||||
EFI_PHYSICAL_ADDRESS DataPhy;
|
||||
VOID *DataMap;
|
||||
SD_HC_TRANSFER_MODE Mode;
|
||||
SD_COMMAND_PACKET *Packet;
|
||||
VOID *Data;
|
||||
UINT32 DataLen;
|
||||
BOOLEAN Read;
|
||||
EFI_PHYSICAL_ADDRESS DataPhy;
|
||||
VOID *DataMap;
|
||||
SD_HC_TRANSFER_MODE Mode;
|
||||
|
||||
UINT64 Timeout;
|
||||
UINT64 Timeout;
|
||||
|
||||
SD_HC_ADMA_DESC_LINE *AdmaDesc;
|
||||
UINTN AdmaDescSize;
|
||||
SD_HC_ADMA_DESC_LINE *AdmaDesc;
|
||||
UINTN AdmaDescSize;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -234,9 +234,9 @@ SdBlockIoPeimReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdBlockIoPeimGetDeviceNo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -283,10 +283,10 @@ SdBlockIoPeimGetDeviceNo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdBlockIoPeimGetMediaInfo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -326,12 +326,12 @@ SdBlockIoPeimGetMediaInfo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdBlockIoPeimReadBlocks2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -345,7 +345,7 @@ SdBlockIoPeimReadBlocks2 (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimInitMemPool (
|
||||
IN SD_PEIM_HC_PRIVATE_DATA *Private
|
||||
IN SD_PEIM_HC_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -359,7 +359,7 @@ SdPeimInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimFreeMemPool (
|
||||
IN SD_PEIM_MEM_POOL *Pool
|
||||
IN SD_PEIM_MEM_POOL *Pool
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -374,8 +374,8 @@ SdPeimFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
SdPeimAllocateMem (
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -388,9 +388,9 @@ SdPeimAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
SdPeimFreeMem (
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -422,11 +422,11 @@ IoMmuInit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuMap (
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -440,7 +440,7 @@ IoMmuMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuUnmap (
|
||||
IN VOID *Mapping
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -483,9 +483,9 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuFreeBuffer (
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
|
@@ -18,25 +18,25 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
SD_PEIM_MEM_BLOCK *
|
||||
SdPeimAllocMemBlock (
|
||||
IN UINTN Pages
|
||||
IN UINTN Pages
|
||||
)
|
||||
{
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
|
||||
TempPtr = NULL;
|
||||
Block = NULL;
|
||||
|
||||
Status = PeiServicesAllocatePool (sizeof(SD_PEIM_MEM_BLOCK), &TempPtr);
|
||||
Status = PeiServicesAllocatePool (sizeof (SD_PEIM_MEM_BLOCK), &TempPtr);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)TempPtr, sizeof(SD_PEIM_MEM_BLOCK));
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, sizeof (SD_PEIM_MEM_BLOCK));
|
||||
|
||||
//
|
||||
// each bit in the bit array represents SD_PEIM_MEM_UNIT
|
||||
@@ -44,18 +44,18 @@ SdPeimAllocMemBlock (
|
||||
//
|
||||
ASSERT (SD_PEIM_MEM_UNIT * 8 <= EFI_PAGE_SIZE);
|
||||
|
||||
Block = (SD_PEIM_MEM_BLOCK*)(UINTN)TempPtr;
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (SD_PEIM_MEM_UNIT * 8);
|
||||
Block = (SD_PEIM_MEM_BLOCK *)(UINTN)TempPtr;
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (SD_PEIM_MEM_UNIT * 8);
|
||||
|
||||
Status = PeiServicesAllocatePool (Block->BitsLen, &TempPtr);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)TempPtr, Block->BitsLen);
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, Block->BitsLen);
|
||||
|
||||
Block->Bits = (UINT8*)(UINTN)TempPtr;
|
||||
Block->Bits = (UINT8 *)(UINTN)TempPtr;
|
||||
|
||||
Status = IoMmuAllocateBuffer (
|
||||
Pages,
|
||||
@@ -67,10 +67,10 @@ SdPeimAllocMemBlock (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)BufHost, EFI_PAGES_TO_SIZE (Pages));
|
||||
ZeroMem ((VOID *)(UINTN)BufHost, EFI_PAGES_TO_SIZE (Pages));
|
||||
|
||||
Block->BufHost = (UINT8 *) (UINTN) BufHost;
|
||||
Block->Buf = (UINT8 *) (UINTN) MappedAddr;
|
||||
Block->BufHost = (UINT8 *)(UINTN)BufHost;
|
||||
Block->Buf = (UINT8 *)(UINTN)MappedAddr;
|
||||
Block->Mapping = Mapping;
|
||||
Block->Next = NULL;
|
||||
|
||||
@@ -86,8 +86,8 @@ SdPeimAllocMemBlock (
|
||||
**/
|
||||
VOID
|
||||
SdPeimFreeMemBlock (
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN SD_PEIM_MEM_BLOCK *Block
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN SD_PEIM_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
ASSERT ((Pool != NULL) && (Block != NULL));
|
||||
@@ -107,22 +107,22 @@ SdPeimFreeMemBlock (
|
||||
**/
|
||||
VOID *
|
||||
SdPeimAllocMemFromBlock (
|
||||
IN SD_PEIM_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
IN SD_PEIM_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
)
|
||||
{
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
|
||||
ASSERT ((Block != 0) && (Units != 0));
|
||||
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
|
||||
for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) {
|
||||
//
|
||||
@@ -138,13 +138,12 @@ SdPeimAllocMemFromBlock (
|
||||
}
|
||||
|
||||
SD_PEIM_NEXT_BIT (Byte, Bit);
|
||||
|
||||
} else {
|
||||
SD_PEIM_NEXT_BIT (Byte, Bit);
|
||||
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,13 +154,13 @@ SdPeimAllocMemFromBlock (
|
||||
//
|
||||
// Mark the memory as allocated
|
||||
//
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
|
||||
for (Count = 0; Count < Units; Count++) {
|
||||
ASSERT (!SD_PEIM_MEM_BIT_IS_SET (Block->Bits[Byte], Bit));
|
||||
|
||||
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] | (UINT8) SD_PEIM_MEM_BIT (Bit));
|
||||
Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] | (UINT8)SD_PEIM_MEM_BIT (Bit));
|
||||
SD_PEIM_NEXT_BIT (Byte, Bit);
|
||||
}
|
||||
|
||||
@@ -177,8 +176,8 @@ SdPeimAllocMemFromBlock (
|
||||
**/
|
||||
VOID
|
||||
SdPeimInsertMemBlockToPool (
|
||||
IN SD_PEIM_MEM_BLOCK *Head,
|
||||
IN SD_PEIM_MEM_BLOCK *Block
|
||||
IN SD_PEIM_MEM_BLOCK *Head,
|
||||
IN SD_PEIM_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
ASSERT ((Head != NULL) && (Block != NULL));
|
||||
@@ -197,11 +196,10 @@ SdPeimInsertMemBlockToPool (
|
||||
**/
|
||||
BOOLEAN
|
||||
SdPeimIsMemBlockEmpty (
|
||||
IN SD_PEIM_MEM_BLOCK *Block
|
||||
IN SD_PEIM_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < Block->BitsLen; Index++) {
|
||||
if (Block->Bits[Index] != 0) {
|
||||
@@ -212,8 +210,6 @@ SdPeimIsMemBlockEmpty (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize the memory management pool for the host controller.
|
||||
|
||||
@@ -228,9 +224,9 @@ SdPeimInitMemPool (
|
||||
IN SD_PEIM_HC_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
SD_PEIM_MEM_POOL *Pool;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
SD_PEIM_MEM_POOL *Pool;
|
||||
EFI_STATUS Status;
|
||||
VOID *TempPtr;
|
||||
|
||||
TempPtr = NULL;
|
||||
Pool = NULL;
|
||||
@@ -240,7 +236,7 @@ SdPeimInitMemPool (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID*)(UINTN)TempPtr, sizeof (SD_PEIM_MEM_POOL));
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, sizeof (SD_PEIM_MEM_POOL));
|
||||
|
||||
Pool = (SD_PEIM_MEM_POOL *)((UINTN)TempPtr);
|
||||
|
||||
@@ -265,10 +261,10 @@ SdPeimInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimFreeMemPool (
|
||||
IN SD_PEIM_MEM_POOL *Pool
|
||||
IN SD_PEIM_MEM_POOL *Pool
|
||||
)
|
||||
{
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
|
||||
ASSERT (Pool->Head != NULL);
|
||||
|
||||
@@ -296,16 +292,16 @@ SdPeimFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
SdPeimAllocateMem (
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
SD_PEIM_MEM_BLOCK *Head;
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
SD_PEIM_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
SD_PEIM_MEM_BLOCK *Head;
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
SD_PEIM_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
|
||||
Mem = NULL;
|
||||
AllocSize = SD_PEIM_MEM_ROUND (Size);
|
||||
@@ -368,22 +364,22 @@ SdPeimAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
SdPeimFreeMem (
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN SD_PEIM_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
SD_PEIM_MEM_BLOCK *Head;
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
SD_PEIM_MEM_BLOCK *Head;
|
||||
SD_PEIM_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
|
||||
Head = Pool->Head;
|
||||
AllocSize = SD_PEIM_MEM_ROUND (Size);
|
||||
ToFree = (UINT8 *) Mem;
|
||||
ToFree = (UINT8 *)Mem;
|
||||
|
||||
for (Block = Head; Block != NULL; Block = Block->Next) {
|
||||
//
|
||||
@@ -394,8 +390,8 @@ SdPeimFreeMem (
|
||||
//
|
||||
// compute the start byte and bit in the bit array
|
||||
//
|
||||
Byte = ((ToFree - Block->Buf) / SD_PEIM_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->Buf) / SD_PEIM_MEM_UNIT) % 8;
|
||||
Byte = ((ToFree - Block->Buf) / SD_PEIM_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->Buf) / SD_PEIM_MEM_UNIT) % 8;
|
||||
|
||||
//
|
||||
// reset associated bits in bit array
|
||||
@@ -403,7 +399,7 @@ SdPeimFreeMem (
|
||||
for (Count = 0; Count < (AllocSize / SD_PEIM_MEM_UNIT); Count++) {
|
||||
ASSERT (SD_PEIM_MEM_BIT_IS_SET (Block->Bits[Byte], Bit));
|
||||
|
||||
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] ^ SD_PEIM_MEM_BIT (Bit));
|
||||
Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] ^ SD_PEIM_MEM_BIT (Bit));
|
||||
SD_PEIM_NEXT_BIT (Byte, Bit);
|
||||
}
|
||||
|
||||
@@ -425,5 +421,5 @@ SdPeimFreeMem (
|
||||
SdPeimFreeMemBlock (Pool, Block);
|
||||
}
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
@@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _SD_PEIM_MEM_H_
|
||||
#define _SD_PEIM_MEM_H_
|
||||
|
||||
#define SD_PEIM_MEM_BIT(a) ((UINTN)(1 << (a)))
|
||||
#define SD_PEIM_MEM_BIT(a) ((UINTN)(1 << (a)))
|
||||
|
||||
#define SD_PEIM_MEM_BIT_IS_SET(Data, Bit) \
|
||||
((BOOLEAN)(((Data) & SD_PEIM_MEM_BIT(Bit)) == SD_PEIM_MEM_BIT(Bit)))
|
||||
@@ -17,28 +17,28 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
typedef struct _SD_PEIM_MEM_BLOCK SD_PEIM_MEM_BLOCK;
|
||||
|
||||
struct _SD_PEIM_MEM_BLOCK {
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
SD_PEIM_MEM_BLOCK *Next;
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
SD_PEIM_MEM_BLOCK *Next;
|
||||
};
|
||||
|
||||
typedef struct _SD_PEIM_MEM_POOL {
|
||||
SD_PEIM_MEM_BLOCK *Head;
|
||||
SD_PEIM_MEM_BLOCK *Head;
|
||||
} SD_PEIM_MEM_POOL;
|
||||
|
||||
//
|
||||
// Memory allocation unit, note that the value must meet SD spec alignment requirement.
|
||||
//
|
||||
#define SD_PEIM_MEM_UNIT 128
|
||||
#define SD_PEIM_MEM_UNIT 128
|
||||
|
||||
#define SD_PEIM_MEM_UNIT_MASK (SD_PEIM_MEM_UNIT - 1)
|
||||
#define SD_PEIM_MEM_DEFAULT_PAGES 16
|
||||
|
||||
#define SD_PEIM_MEM_ROUND(Len) (((Len) + SD_PEIM_MEM_UNIT_MASK) & (~SD_PEIM_MEM_UNIT_MASK))
|
||||
#define SD_PEIM_MEM_ROUND(Len) (((Len) + SD_PEIM_MEM_UNIT_MASK) & (~SD_PEIM_MEM_UNIT_MASK))
|
||||
|
||||
//
|
||||
// Advance the byte and bit to the next bit, adjust byte accordingly.
|
||||
@@ -53,4 +53,3 @@ typedef struct _SD_PEIM_MEM_POOL {
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -61,9 +61,9 @@ typedef enum {
|
||||
//
|
||||
// The maximum data length of each descriptor line
|
||||
//
|
||||
#define ADMA_MAX_DATA_PER_LINE 0x10000
|
||||
#define SD_SDMA_BOUNDARY 512 * 1024
|
||||
#define SD_SDMA_ROUND_UP(x, n) (((x) + n) & ~(n - 1))
|
||||
#define ADMA_MAX_DATA_PER_LINE 0x10000
|
||||
#define SD_SDMA_BOUNDARY 512 * 1024
|
||||
#define SD_SDMA_ROUND_UP(x, n) (((x) + n) & ~(n - 1))
|
||||
|
||||
typedef enum {
|
||||
SdCommandTypeBc, // Broadcast commands, no response
|
||||
@@ -85,76 +85,76 @@ typedef enum {
|
||||
} SD_RESPONSE_TYPE;
|
||||
|
||||
typedef struct _SD_COMMAND_BLOCK {
|
||||
UINT16 CommandIndex;
|
||||
UINT32 CommandArgument;
|
||||
UINT32 CommandType; // One of the SD_COMMAND_TYPE values
|
||||
UINT32 ResponseType; // One of the SD_RESPONSE_TYPE values
|
||||
UINT16 CommandIndex;
|
||||
UINT32 CommandArgument;
|
||||
UINT32 CommandType; // One of the SD_COMMAND_TYPE values
|
||||
UINT32 ResponseType; // One of the SD_RESPONSE_TYPE values
|
||||
} SD_COMMAND_BLOCK;
|
||||
|
||||
typedef struct _SD_STATUS_BLOCK {
|
||||
UINT32 Resp0;
|
||||
UINT32 Resp1;
|
||||
UINT32 Resp2;
|
||||
UINT32 Resp3;
|
||||
UINT32 Resp0;
|
||||
UINT32 Resp1;
|
||||
UINT32 Resp2;
|
||||
UINT32 Resp3;
|
||||
} SD_STATUS_BLOCK;
|
||||
|
||||
typedef struct _SD_COMMAND_PACKET {
|
||||
UINT64 Timeout;
|
||||
SD_COMMAND_BLOCK *SdCmdBlk;
|
||||
SD_STATUS_BLOCK *SdStatusBlk;
|
||||
VOID *InDataBuffer;
|
||||
VOID *OutDataBuffer;
|
||||
UINT32 InTransferLength;
|
||||
UINT32 OutTransferLength;
|
||||
UINT64 Timeout;
|
||||
SD_COMMAND_BLOCK *SdCmdBlk;
|
||||
SD_STATUS_BLOCK *SdStatusBlk;
|
||||
VOID *InDataBuffer;
|
||||
VOID *OutDataBuffer;
|
||||
UINT32 InTransferLength;
|
||||
UINT32 OutTransferLength;
|
||||
} SD_COMMAND_PACKET;
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct {
|
||||
UINT32 Valid:1;
|
||||
UINT32 End:1;
|
||||
UINT32 Int:1;
|
||||
UINT32 Reserved:1;
|
||||
UINT32 Act:2;
|
||||
UINT32 Reserved1:10;
|
||||
UINT32 Length:16;
|
||||
UINT32 Address;
|
||||
UINT32 Valid : 1;
|
||||
UINT32 End : 1;
|
||||
UINT32 Int : 1;
|
||||
UINT32 Reserved : 1;
|
||||
UINT32 Act : 2;
|
||||
UINT32 Reserved1 : 10;
|
||||
UINT32 Length : 16;
|
||||
UINT32 Address;
|
||||
} SD_HC_ADMA_DESC_LINE;
|
||||
|
||||
typedef struct {
|
||||
UINT32 TimeoutFreq:6; // bit 0:5
|
||||
UINT32 Reserved:1; // bit 6
|
||||
UINT32 TimeoutUnit:1; // bit 7
|
||||
UINT32 BaseClkFreq:8; // bit 8:15
|
||||
UINT32 MaxBlkLen:2; // bit 16:17
|
||||
UINT32 BusWidth8:1; // bit 18
|
||||
UINT32 Adma2:1; // bit 19
|
||||
UINT32 Reserved2:1; // bit 20
|
||||
UINT32 HighSpeed:1; // bit 21
|
||||
UINT32 Sdma:1; // bit 22
|
||||
UINT32 SuspRes:1; // bit 23
|
||||
UINT32 Voltage33:1; // bit 24
|
||||
UINT32 Voltage30:1; // bit 25
|
||||
UINT32 Voltage18:1; // bit 26
|
||||
UINT32 Reserved3:1; // bit 27
|
||||
UINT32 SysBus64:1; // bit 28
|
||||
UINT32 AsyncInt:1; // bit 29
|
||||
UINT32 SlotType:2; // bit 30:31
|
||||
UINT32 Sdr50:1; // bit 32
|
||||
UINT32 Sdr104:1; // bit 33
|
||||
UINT32 Ddr50:1; // bit 34
|
||||
UINT32 Reserved4:1; // bit 35
|
||||
UINT32 DriverTypeA:1; // bit 36
|
||||
UINT32 DriverTypeC:1; // bit 37
|
||||
UINT32 DriverTypeD:1; // bit 38
|
||||
UINT32 DriverType4:1; // bit 39
|
||||
UINT32 TimerCount:4; // bit 40:43
|
||||
UINT32 Reserved5:1; // bit 44
|
||||
UINT32 TuningSDR50:1; // bit 45
|
||||
UINT32 RetuningMod:2; // bit 46:47
|
||||
UINT32 ClkMultiplier:8; // bit 48:55
|
||||
UINT32 Reserved6:7; // bit 56:62
|
||||
UINT32 Hs400:1; // bit 63
|
||||
UINT32 TimeoutFreq : 6; // bit 0:5
|
||||
UINT32 Reserved : 1; // bit 6
|
||||
UINT32 TimeoutUnit : 1; // bit 7
|
||||
UINT32 BaseClkFreq : 8; // bit 8:15
|
||||
UINT32 MaxBlkLen : 2; // bit 16:17
|
||||
UINT32 BusWidth8 : 1; // bit 18
|
||||
UINT32 Adma2 : 1; // bit 19
|
||||
UINT32 Reserved2 : 1; // bit 20
|
||||
UINT32 HighSpeed : 1; // bit 21
|
||||
UINT32 Sdma : 1; // bit 22
|
||||
UINT32 SuspRes : 1; // bit 23
|
||||
UINT32 Voltage33 : 1; // bit 24
|
||||
UINT32 Voltage30 : 1; // bit 25
|
||||
UINT32 Voltage18 : 1; // bit 26
|
||||
UINT32 Reserved3 : 1; // bit 27
|
||||
UINT32 SysBus64 : 1; // bit 28
|
||||
UINT32 AsyncInt : 1; // bit 29
|
||||
UINT32 SlotType : 2; // bit 30:31
|
||||
UINT32 Sdr50 : 1; // bit 32
|
||||
UINT32 Sdr104 : 1; // bit 33
|
||||
UINT32 Ddr50 : 1; // bit 34
|
||||
UINT32 Reserved4 : 1; // bit 35
|
||||
UINT32 DriverTypeA : 1; // bit 36
|
||||
UINT32 DriverTypeC : 1; // bit 37
|
||||
UINT32 DriverTypeD : 1; // bit 38
|
||||
UINT32 DriverType4 : 1; // bit 39
|
||||
UINT32 TimerCount : 4; // bit 40:43
|
||||
UINT32 Reserved5 : 1; // bit 44
|
||||
UINT32 TuningSDR50 : 1; // bit 45
|
||||
UINT32 RetuningMod : 2; // bit 46:47
|
||||
UINT32 ClkMultiplier : 8; // bit 48:55
|
||||
UINT32 Reserved6 : 7; // bit 56:62
|
||||
UINT32 Hs400 : 1; // bit 63
|
||||
} SD_HC_SLOT_CAP;
|
||||
|
||||
#pragma pack()
|
||||
@@ -170,7 +170,7 @@ typedef struct {
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimHcReset (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -185,7 +185,7 @@ SdPeimHcReset (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimHcEnableInterrupt (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -200,8 +200,8 @@ SdPeimHcEnableInterrupt (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimHcGetCapability (
|
||||
IN UINTN Bar,
|
||||
OUT SD_HC_SLOT_CAP *Capability
|
||||
IN UINTN Bar,
|
||||
OUT SD_HC_SLOT_CAP *Capability
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -219,7 +219,7 @@ SdPeimHcGetCapability (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimHcCardDetect (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -234,7 +234,7 @@ SdPeimHcCardDetect (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimHcInitHost (
|
||||
IN UINTN Bar
|
||||
IN UINTN Bar
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -256,13 +256,13 @@ SdPeimHcInitHost (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimSwitch (
|
||||
IN SD_PEIM_HC_SLOT *Slot,
|
||||
IN UINT8 AccessMode,
|
||||
IN UINT8 CommandSystem,
|
||||
IN UINT8 DriveStrength,
|
||||
IN UINT8 PowerLimit,
|
||||
IN BOOLEAN Mode,
|
||||
OUT UINT8 *SwitchResp
|
||||
IN SD_PEIM_HC_SLOT *Slot,
|
||||
IN UINT8 AccessMode,
|
||||
IN UINT8 CommandSystem,
|
||||
IN UINT8 DriveStrength,
|
||||
IN UINT8 PowerLimit,
|
||||
IN BOOLEAN Mode,
|
||||
OUT UINT8 *SwitchResp
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -284,12 +284,12 @@ SdPeimSwitch (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimRwSingleBlock (
|
||||
IN SD_PEIM_HC_SLOT *Slot,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINT32 BlockSize,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead
|
||||
IN SD_PEIM_HC_SLOT *Slot,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINT32 BlockSize,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -311,12 +311,12 @@ SdPeimRwSingleBlock (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimRwMultiBlocks (
|
||||
IN SD_PEIM_HC_SLOT *Slot,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINT32 BlockSize,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead
|
||||
IN SD_PEIM_HC_SLOT *Slot,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINT32 BlockSize,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -332,7 +332,7 @@ SdPeimRwMultiBlocks (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdPeimIdentification (
|
||||
IN SD_PEIM_HC_SLOT *Slot
|
||||
IN SD_PEIM_HC_SLOT *Slot
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -343,8 +343,7 @@ SdPeimIdentification (
|
||||
**/
|
||||
VOID
|
||||
SdPeimFreeTrb (
|
||||
IN SD_TRB *Trb
|
||||
IN SD_TRB *Trb
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -11,17 +11,17 @@
|
||||
//
|
||||
// Driver name table
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSdDxeDriverNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSdDxeDriverNameTable[] = {
|
||||
{ "eng;en", L"Edkii Sd Memory Card Device Driver" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
// Controller name table
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSdDxeControllerNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSdDxeControllerNameTable[] = {
|
||||
{ "eng;en", L"Edkii Sd Host Controller" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
@@ -36,9 +36,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gSdDxeComponentName =
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gSdDxeComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) SdDxeComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) SdDxeComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gSdDxeComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)SdDxeComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)SdDxeComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
@@ -96,7 +96,6 @@ SdDxeComponentNameGetDriverName (
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gSdDxeComponentName)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -170,11 +169,11 @@ SdDxeComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -204,13 +203,14 @@ SdDxeComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the child context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
gSdDxeDriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -219,7 +219,7 @@ SdDxeComponentNameGetControllerName (
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO (BlockIo);
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO (BlockIo);
|
||||
ControllerNameTable = Device->ControllerNameTable;
|
||||
}
|
||||
|
||||
@@ -231,4 +231,3 @@ SdDxeComponentNameGetControllerName (
|
||||
(BOOLEAN)(This == &gSdDxeComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -19,20 +19,24 @@
|
||||
VOID
|
||||
EFIAPI
|
||||
AsyncIoCallback (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
SD_REQUEST *Request;
|
||||
SD_REQUEST *Request;
|
||||
|
||||
gBS->CloseEvent (Event);
|
||||
|
||||
Request = (SD_REQUEST *) Context;
|
||||
Request = (SD_REQUEST *)Context;
|
||||
|
||||
DEBUG_CODE_BEGIN ();
|
||||
DEBUG ((DEBUG_INFO, "Sd Async Request: CmdIndex[%d] Arg[%08x] %r\n",
|
||||
Request->SdMmcCmdBlk.CommandIndex, Request->SdMmcCmdBlk.CommandArgument,
|
||||
Request->Packet.TransactionStatus));
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"Sd Async Request: CmdIndex[%d] Arg[%08x] %r\n",
|
||||
Request->SdMmcCmdBlk.CommandIndex,
|
||||
Request->SdMmcCmdBlk.CommandArgument,
|
||||
Request->Packet.TransactionStatus
|
||||
));
|
||||
DEBUG_CODE_END ();
|
||||
|
||||
if (EFI_ERROR (Request->Packet.TransactionStatus)) {
|
||||
@@ -61,8 +65,8 @@ AsyncIoCallback (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdSetRca (
|
||||
IN SD_DEVICE *Device,
|
||||
OUT UINT16 *Rca
|
||||
IN SD_DEVICE *Device,
|
||||
OUT UINT16 *Rca
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -106,8 +110,8 @@ SdSetRca (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdSelect (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -130,6 +134,7 @@ SdSelect (
|
||||
if (Rca != 0) {
|
||||
SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1b;
|
||||
}
|
||||
|
||||
SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
|
||||
|
||||
Status = PassThru->PassThru (PassThru, Device->Slot, &Packet, NULL);
|
||||
@@ -151,9 +156,9 @@ SdSelect (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdSendStatus (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT UINT32 *DevStatus
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT UINT32 *DevStatus
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -171,15 +176,16 @@ SdSendStatus (
|
||||
Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
|
||||
Packet.Timeout = SD_GENERIC_TIMEOUT;
|
||||
|
||||
SdMmcCmdBlk.CommandIndex = SD_SEND_STATUS;
|
||||
SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
|
||||
SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;
|
||||
SdMmcCmdBlk.CommandIndex = SD_SEND_STATUS;
|
||||
SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
|
||||
SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;
|
||||
SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
|
||||
|
||||
Status = PassThru->PassThru (PassThru, Device->Slot, &Packet, NULL);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
CopyMem (DevStatus, &SdMmcStatusBlk.Resp0, sizeof (UINT32));
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -197,9 +203,9 @@ SdSendStatus (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdGetCsd (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CSD *Csd
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CSD *Csd
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -219,9 +225,9 @@ SdGetCsd (
|
||||
Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
|
||||
Packet.Timeout = SD_GENERIC_TIMEOUT;
|
||||
|
||||
SdMmcCmdBlk.CommandIndex = SD_SEND_CSD;
|
||||
SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
|
||||
SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2;
|
||||
SdMmcCmdBlk.CommandIndex = SD_SEND_CSD;
|
||||
SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
|
||||
SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2;
|
||||
SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
|
||||
|
||||
Status = PassThru->PassThru (PassThru, Device->Slot, &Packet, NULL);
|
||||
@@ -230,7 +236,7 @@ SdGetCsd (
|
||||
//
|
||||
// For details, refer to SD Host Controller Simplified Spec 3.0 Table 2-12.
|
||||
//
|
||||
CopyMem (((UINT8*)Csd) + 1, &SdMmcStatusBlk.Resp0, sizeof (SD_CSD) - 1);
|
||||
CopyMem (((UINT8 *)Csd) + 1, &SdMmcStatusBlk.Resp0, sizeof (SD_CSD) - 1);
|
||||
}
|
||||
|
||||
return Status;
|
||||
@@ -250,9 +256,9 @@ SdGetCsd (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdGetCid (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CID *Cid
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CID *Cid
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@@ -272,9 +278,9 @@ SdGetCid (
|
||||
Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
|
||||
Packet.Timeout = SD_GENERIC_TIMEOUT;
|
||||
|
||||
SdMmcCmdBlk.CommandIndex = SD_SEND_CID;
|
||||
SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
|
||||
SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2;
|
||||
SdMmcCmdBlk.CommandIndex = SD_SEND_CID;
|
||||
SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
|
||||
SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2;
|
||||
SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
|
||||
|
||||
Status = PassThru->PassThru (PassThru, Device->Slot, &Packet, NULL);
|
||||
@@ -283,7 +289,7 @@ SdGetCid (
|
||||
//
|
||||
// For details, refer to SD Host Controller Simplified Spec 3.0 Table 2-12.
|
||||
//
|
||||
CopyMem (((UINT8*)Cid) + 1, &SdMmcStatusBlk.Resp0, sizeof (SD_CID) - 1);
|
||||
CopyMem (((UINT8 *)Cid) + 1, &SdMmcStatusBlk.Resp0, sizeof (SD_CID) - 1);
|
||||
}
|
||||
|
||||
return Status;
|
||||
@@ -310,19 +316,19 @@ SdGetCid (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdRwSingleBlock (
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA Lba,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA Lba,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *RwSingleBlkReq;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *RwSingleBlkReq;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
RwSingleBlkReq = NULL;
|
||||
PassThru = Device->Private->PassThru;
|
||||
@@ -334,7 +340,7 @@ SdRwSingleBlock (
|
||||
}
|
||||
|
||||
RwSingleBlkReq->Signature = SD_REQUEST_SIGNATURE;
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
InsertTailList (&Device->Queue, &RwSingleBlkReq->Link);
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
RwSingleBlkReq->Packet.SdMmcCmdBlk = &RwSingleBlkReq->SdMmcCmdBlk;
|
||||
@@ -403,6 +409,7 @@ Error:
|
||||
if (RwSingleBlkReq->Event != NULL) {
|
||||
gBS->CloseEvent (RwSingleBlkReq->Event);
|
||||
}
|
||||
|
||||
FreePool (RwSingleBlkReq);
|
||||
}
|
||||
} else {
|
||||
@@ -441,19 +448,19 @@ Error:
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdRwMultiBlocks (
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA Lba,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA Lba,
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_REQUEST *RwMultiBlkReq;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
SD_REQUEST *RwMultiBlkReq;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
RwMultiBlkReq = NULL;
|
||||
|
||||
@@ -466,7 +473,7 @@ SdRwMultiBlocks (
|
||||
}
|
||||
|
||||
RwMultiBlkReq->Signature = SD_REQUEST_SIGNATURE;
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
InsertTailList (&Device->Queue, &RwMultiBlkReq->Link);
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
RwMultiBlkReq->Packet.SdMmcCmdBlk = &RwMultiBlkReq->SdMmcCmdBlk;
|
||||
@@ -535,6 +542,7 @@ Error:
|
||||
if (RwMultiBlkReq->Event != NULL) {
|
||||
gBS->CloseEvent (RwMultiBlkReq->Event);
|
||||
}
|
||||
|
||||
FreePool (RwMultiBlkReq);
|
||||
}
|
||||
} else {
|
||||
@@ -577,23 +585,23 @@ Error:
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdReadWrite (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINTN BufferSize,
|
||||
IN BOOLEAN IsRead,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
UINTN BlockSize;
|
||||
UINTN BlockNum;
|
||||
UINTN IoAlign;
|
||||
UINTN Remaining;
|
||||
UINT32 MaxBlock;
|
||||
BOOLEAN LastRw;
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
UINTN BlockSize;
|
||||
UINTN BlockNum;
|
||||
UINTN IoAlign;
|
||||
UINTN Remaining;
|
||||
UINT32 MaxBlock;
|
||||
BOOLEAN LastRw;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Media = &Device->BlockMedia;
|
||||
@@ -619,6 +627,7 @@ SdReadWrite (
|
||||
Token->TransactionStatus = EFI_SUCCESS;
|
||||
gBS->SignalEvent (Token->Event);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -627,13 +636,13 @@ SdReadWrite (
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
BlockNum = BufferSize / BlockSize;
|
||||
BlockNum = BufferSize / BlockSize;
|
||||
if ((Lba + BlockNum - 1) > Media->LastBlock) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
IoAlign = Media->IoAlign;
|
||||
if (IoAlign > 0 && (((UINTN) Buffer & (IoAlign - 1)) != 0)) {
|
||||
if ((IoAlign > 0) && (((UINTN)Buffer & (IoAlign - 1)) != 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -661,14 +670,22 @@ SdReadWrite (
|
||||
} else {
|
||||
Status = SdRwMultiBlocks (Device, Lba, Buffer, BufferSize, IsRead, Token, LastRw);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
DEBUG ((DEBUG_BLKIO, "Sd%a(): Lba 0x%x BlkNo 0x%x Event %p with %r\n",
|
||||
IsRead ? "Read" : "Write", Lba, BlockNum,
|
||||
(Token != NULL) ? Token->Event : NULL, Status));
|
||||
Lba += BlockNum;
|
||||
Buffer = (UINT8*)Buffer + BufferSize;
|
||||
|
||||
DEBUG ((
|
||||
DEBUG_BLKIO,
|
||||
"Sd%a(): Lba 0x%x BlkNo 0x%x Event %p with %r\n",
|
||||
IsRead ? "Read" : "Write",
|
||||
Lba,
|
||||
BlockNum,
|
||||
(Token != NULL) ? Token->Event : NULL,
|
||||
Status
|
||||
));
|
||||
Lba += BlockNum;
|
||||
Buffer = (UINT8 *)Buffer + BufferSize;
|
||||
Remaining -= BlockNum;
|
||||
}
|
||||
|
||||
@@ -689,13 +706,13 @@ SdReadWrite (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO (This);
|
||||
|
||||
@@ -734,11 +751,11 @@ SdReadBlocks (
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO (This);
|
||||
|
||||
@@ -769,15 +786,15 @@ SdReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO (This);
|
||||
|
||||
@@ -798,7 +815,7 @@ SdWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -825,18 +842,19 @@ SdResetEx (
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
SD_DEVICE *Device;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
SD_REQUEST *Request;
|
||||
EFI_TPL OldTpl;
|
||||
SD_DEVICE *Device;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
SD_REQUEST *Request;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO2 (This);
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
for (Link = GetFirstNode (&Device->Queue);
|
||||
!IsNull (&Device->Queue, Link);
|
||||
Link = NextLink) {
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Device->Queue, Link);
|
||||
RemoveEntryList (Link);
|
||||
|
||||
@@ -851,6 +869,7 @@ SdResetEx (
|
||||
|
||||
FreePool (Request);
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@@ -885,16 +904,16 @@ SdResetEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdReadBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO2 (This);
|
||||
|
||||
@@ -927,16 +946,16 @@ SdReadBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdWriteBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_BLKIO2 (This);
|
||||
|
||||
@@ -965,7 +984,7 @@ SdFlushBlocksEx (
|
||||
//
|
||||
// Signal event and return directly.
|
||||
//
|
||||
if (Token != NULL && Token->Event != NULL) {
|
||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||
Token->TransactionStatus = EFI_SUCCESS;
|
||||
gBS->SignalEvent (Token->Event);
|
||||
}
|
||||
@@ -989,16 +1008,16 @@ SdFlushBlocksEx (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdEraseBlockStart (
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA StartLba,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA StartLba,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *EraseBlockStart;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *EraseBlockStart;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
EraseBlockStart = NULL;
|
||||
PassThru = Device->Private->PassThru;
|
||||
@@ -1010,7 +1029,7 @@ SdEraseBlockStart (
|
||||
}
|
||||
|
||||
EraseBlockStart->Signature = SD_REQUEST_SIGNATURE;
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
InsertTailList (&Device->Queue, &EraseBlockStart->Link);
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
EraseBlockStart->Packet.SdMmcCmdBlk = &EraseBlockStart->SdMmcCmdBlk;
|
||||
@@ -1060,6 +1079,7 @@ Error:
|
||||
if (EraseBlockStart->Event != NULL) {
|
||||
gBS->CloseEvent (EraseBlockStart->Event);
|
||||
}
|
||||
|
||||
FreePool (EraseBlockStart);
|
||||
}
|
||||
} else {
|
||||
@@ -1093,16 +1113,16 @@ Error:
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdEraseBlockEnd (
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA EndLba,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_LBA EndLba,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *EraseBlockEnd;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *EraseBlockEnd;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
EraseBlockEnd = NULL;
|
||||
PassThru = Device->Private->PassThru;
|
||||
@@ -1114,7 +1134,7 @@ SdEraseBlockEnd (
|
||||
}
|
||||
|
||||
EraseBlockEnd->Signature = SD_REQUEST_SIGNATURE;
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
InsertTailList (&Device->Queue, &EraseBlockEnd->Link);
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
EraseBlockEnd->Packet.SdMmcCmdBlk = &EraseBlockEnd->SdMmcCmdBlk;
|
||||
@@ -1164,6 +1184,7 @@ Error:
|
||||
if (EraseBlockEnd->Event != NULL) {
|
||||
gBS->CloseEvent (EraseBlockEnd->Event);
|
||||
}
|
||||
|
||||
FreePool (EraseBlockEnd);
|
||||
}
|
||||
} else {
|
||||
@@ -1196,15 +1217,15 @@ Error:
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdEraseBlock (
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
IN SD_DEVICE *Device,
|
||||
IN EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN BOOLEAN IsEnd
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *EraseBlock;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
SD_REQUEST *EraseBlock;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
EraseBlock = NULL;
|
||||
PassThru = Device->Private->PassThru;
|
||||
@@ -1216,7 +1237,7 @@ SdEraseBlock (
|
||||
}
|
||||
|
||||
EraseBlock->Signature = SD_REQUEST_SIGNATURE;
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
InsertTailList (&Device->Queue, &EraseBlock->Link);
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
EraseBlock->Packet.SdMmcCmdBlk = &EraseBlock->SdMmcCmdBlk;
|
||||
@@ -1260,6 +1281,7 @@ Error:
|
||||
if (EraseBlock->Event != NULL) {
|
||||
gBS->CloseEvent (EraseBlock->Event);
|
||||
}
|
||||
|
||||
FreePool (EraseBlock);
|
||||
}
|
||||
} else {
|
||||
@@ -1307,19 +1329,19 @@ Error:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdEraseBlocks (
|
||||
IN EFI_ERASE_BLOCK_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_ERASE_BLOCK_TOKEN *Token,
|
||||
IN UINTN Size
|
||||
IN EFI_ERASE_BLOCK_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_ERASE_BLOCK_TOKEN *Token,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
UINTN BlockSize;
|
||||
UINTN BlockNum;
|
||||
EFI_LBA LastLba;
|
||||
SD_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
UINTN BlockSize;
|
||||
UINTN BlockNum;
|
||||
EFI_LBA LastLba;
|
||||
SD_DEVICE *Device;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Device = SD_DEVICE_DATA_FROM_ERASEBLK (This);
|
||||
@@ -1341,7 +1363,7 @@ SdEraseBlocks (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
BlockNum = Size / BlockSize;
|
||||
BlockNum = Size / BlockSize;
|
||||
if ((Lba + BlockNum - 1) > Media->LastBlock) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@@ -1352,17 +1374,17 @@ SdEraseBlocks (
|
||||
|
||||
LastLba = Lba + BlockNum - 1;
|
||||
|
||||
Status = SdEraseBlockStart (Device, Lba, (EFI_BLOCK_IO2_TOKEN*)Token, FALSE);
|
||||
Status = SdEraseBlockStart (Device, Lba, (EFI_BLOCK_IO2_TOKEN *)Token, FALSE);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = SdEraseBlockEnd (Device, LastLba, (EFI_BLOCK_IO2_TOKEN*)Token, FALSE);
|
||||
Status = SdEraseBlockEnd (Device, LastLba, (EFI_BLOCK_IO2_TOKEN *)Token, FALSE);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = SdEraseBlock (Device, (EFI_BLOCK_IO2_TOKEN*)Token, TRUE);
|
||||
Status = SdEraseBlock (Device, (EFI_BLOCK_IO2_TOKEN *)Token, TRUE);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
@@ -26,8 +26,8 @@
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -56,7 +56,7 @@ SdReadBlocks (
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -82,11 +82,11 @@ SdReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -102,7 +102,7 @@ SdWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -152,12 +152,12 @@ SdResetEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdReadBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -185,12 +185,12 @@ SdReadBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdWriteBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -241,12 +241,11 @@ SdFlushBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdEraseBlocks (
|
||||
IN EFI_ERASE_BLOCK_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_ERASE_BLOCK_TOKEN *Token,
|
||||
IN UINTN Size
|
||||
IN EFI_ERASE_BLOCK_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_ERASE_BLOCK_TOKEN *Token,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -32,8 +32,8 @@ SdDiskInfoInquiry (
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
|
||||
Device = SD_DEVICE_DATA_FROM_DISKINFO (This);
|
||||
|
||||
|
@@ -14,7 +14,7 @@
|
||||
//
|
||||
// SdDxe Driver Binding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gSdDxeDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gSdDxeDriverBinding = {
|
||||
SdDxeDriverBindingSupported,
|
||||
SdDxeDriverBindingStart,
|
||||
SdDxeDriverBindingStop,
|
||||
@@ -26,7 +26,7 @@ EFI_DRIVER_BINDING_PROTOCOL gSdDxeDriverBinding = {
|
||||
//
|
||||
// Template for SD_DEVICE data structure.
|
||||
//
|
||||
SD_DEVICE mSdDeviceTemplate = {
|
||||
SD_DEVICE mSdDeviceTemplate = {
|
||||
SD_DEVICE_SIGNATURE, // Signature
|
||||
NULL, // Handle
|
||||
NULL, // DevicePath
|
||||
@@ -99,41 +99,42 @@ DumpCsd (
|
||||
IN SD_CSD *Csd
|
||||
)
|
||||
{
|
||||
SD_CSD2 *Csd2;
|
||||
SD_CSD2 *Csd2;
|
||||
|
||||
DEBUG((DEBUG_INFO, "== Dump Sd Csd Register==\n"));
|
||||
DEBUG((DEBUG_INFO, " CSD structure 0x%x\n", Csd->CsdStructure));
|
||||
DEBUG((DEBUG_INFO, " Data read access-time 1 0x%x\n", Csd->Taac));
|
||||
DEBUG((DEBUG_INFO, " Data read access-time 2 0x%x\n", Csd->Nsac));
|
||||
DEBUG((DEBUG_INFO, " Max. bus clock frequency 0x%x\n", Csd->TranSpeed));
|
||||
DEBUG((DEBUG_INFO, " Device command classes 0x%x\n", Csd->Ccc));
|
||||
DEBUG((DEBUG_INFO, " Max. read data block length 0x%x\n", Csd->ReadBlLen));
|
||||
DEBUG((DEBUG_INFO, " Partial blocks for read allowed 0x%x\n", Csd->ReadBlPartial));
|
||||
DEBUG((DEBUG_INFO, " Write block misalignment 0x%x\n", Csd->WriteBlkMisalign));
|
||||
DEBUG((DEBUG_INFO, " Read block misalignment 0x%x\n", Csd->ReadBlkMisalign));
|
||||
DEBUG((DEBUG_INFO, " DSR implemented 0x%x\n", Csd->DsrImp));
|
||||
DEBUG ((DEBUG_INFO, "== Dump Sd Csd Register==\n"));
|
||||
DEBUG ((DEBUG_INFO, " CSD structure 0x%x\n", Csd->CsdStructure));
|
||||
DEBUG ((DEBUG_INFO, " Data read access-time 1 0x%x\n", Csd->Taac));
|
||||
DEBUG ((DEBUG_INFO, " Data read access-time 2 0x%x\n", Csd->Nsac));
|
||||
DEBUG ((DEBUG_INFO, " Max. bus clock frequency 0x%x\n", Csd->TranSpeed));
|
||||
DEBUG ((DEBUG_INFO, " Device command classes 0x%x\n", Csd->Ccc));
|
||||
DEBUG ((DEBUG_INFO, " Max. read data block length 0x%x\n", Csd->ReadBlLen));
|
||||
DEBUG ((DEBUG_INFO, " Partial blocks for read allowed 0x%x\n", Csd->ReadBlPartial));
|
||||
DEBUG ((DEBUG_INFO, " Write block misalignment 0x%x\n", Csd->WriteBlkMisalign));
|
||||
DEBUG ((DEBUG_INFO, " Read block misalignment 0x%x\n", Csd->ReadBlkMisalign));
|
||||
DEBUG ((DEBUG_INFO, " DSR implemented 0x%x\n", Csd->DsrImp));
|
||||
if (Csd->CsdStructure == 0) {
|
||||
DEBUG((DEBUG_INFO, " Device size 0x%x\n", Csd->CSizeLow | (Csd->CSizeHigh << 2)));
|
||||
DEBUG((DEBUG_INFO, " Max. read current @ VDD min 0x%x\n", Csd->VddRCurrMin));
|
||||
DEBUG((DEBUG_INFO, " Max. read current @ VDD max 0x%x\n", Csd->VddRCurrMax));
|
||||
DEBUG((DEBUG_INFO, " Max. write current @ VDD min 0x%x\n", Csd->VddWCurrMin));
|
||||
DEBUG((DEBUG_INFO, " Max. write current @ VDD max 0x%x\n", Csd->VddWCurrMax));
|
||||
DEBUG ((DEBUG_INFO, " Device size 0x%x\n", Csd->CSizeLow | (Csd->CSizeHigh << 2)));
|
||||
DEBUG ((DEBUG_INFO, " Max. read current @ VDD min 0x%x\n", Csd->VddRCurrMin));
|
||||
DEBUG ((DEBUG_INFO, " Max. read current @ VDD max 0x%x\n", Csd->VddRCurrMax));
|
||||
DEBUG ((DEBUG_INFO, " Max. write current @ VDD min 0x%x\n", Csd->VddWCurrMin));
|
||||
DEBUG ((DEBUG_INFO, " Max. write current @ VDD max 0x%x\n", Csd->VddWCurrMax));
|
||||
} else {
|
||||
Csd2 = (SD_CSD2*)(VOID*)Csd;
|
||||
DEBUG((DEBUG_INFO, " Device size 0x%x\n", Csd2->CSizeLow | (Csd->CSizeHigh << 16)));
|
||||
Csd2 = (SD_CSD2 *)(VOID *)Csd;
|
||||
DEBUG ((DEBUG_INFO, " Device size 0x%x\n", Csd2->CSizeLow | (Csd->CSizeHigh << 16)));
|
||||
}
|
||||
DEBUG((DEBUG_INFO, " Erase sector size 0x%x\n", Csd->SectorSize));
|
||||
DEBUG((DEBUG_INFO, " Erase single block enable 0x%x\n", Csd->EraseBlkEn));
|
||||
DEBUG((DEBUG_INFO, " Write protect group size 0x%x\n", Csd->WpGrpSize));
|
||||
DEBUG((DEBUG_INFO, " Write protect group enable 0x%x\n", Csd->WpGrpEnable));
|
||||
DEBUG((DEBUG_INFO, " Write speed factor 0x%x\n", Csd->R2WFactor));
|
||||
DEBUG((DEBUG_INFO, " Max. write data block length 0x%x\n", Csd->WriteBlLen));
|
||||
DEBUG((DEBUG_INFO, " Partial blocks for write allowed 0x%x\n", Csd->WriteBlPartial));
|
||||
DEBUG((DEBUG_INFO, " File format group 0x%x\n", Csd->FileFormatGrp));
|
||||
DEBUG((DEBUG_INFO, " Copy flag (OTP) 0x%x\n", Csd->Copy));
|
||||
DEBUG((DEBUG_INFO, " Permanent write protection 0x%x\n", Csd->PermWriteProtect));
|
||||
DEBUG((DEBUG_INFO, " Temporary write protection 0x%x\n", Csd->TmpWriteProtect));
|
||||
DEBUG((DEBUG_INFO, " File format 0x%x\n", Csd->FileFormat));
|
||||
|
||||
DEBUG ((DEBUG_INFO, " Erase sector size 0x%x\n", Csd->SectorSize));
|
||||
DEBUG ((DEBUG_INFO, " Erase single block enable 0x%x\n", Csd->EraseBlkEn));
|
||||
DEBUG ((DEBUG_INFO, " Write protect group size 0x%x\n", Csd->WpGrpSize));
|
||||
DEBUG ((DEBUG_INFO, " Write protect group enable 0x%x\n", Csd->WpGrpEnable));
|
||||
DEBUG ((DEBUG_INFO, " Write speed factor 0x%x\n", Csd->R2WFactor));
|
||||
DEBUG ((DEBUG_INFO, " Max. write data block length 0x%x\n", Csd->WriteBlLen));
|
||||
DEBUG ((DEBUG_INFO, " Partial blocks for write allowed 0x%x\n", Csd->WriteBlPartial));
|
||||
DEBUG ((DEBUG_INFO, " File format group 0x%x\n", Csd->FileFormatGrp));
|
||||
DEBUG ((DEBUG_INFO, " Copy flag (OTP) 0x%x\n", Csd->Copy));
|
||||
DEBUG ((DEBUG_INFO, " Permanent write protection 0x%x\n", Csd->PermWriteProtect));
|
||||
DEBUG ((DEBUG_INFO, " Temporary write protection 0x%x\n", Csd->TmpWriteProtect));
|
||||
DEBUG ((DEBUG_INFO, " File format 0x%x\n", Csd->FileFormat));
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -149,8 +150,8 @@ DumpCsd (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetSdModelName (
|
||||
IN OUT SD_DEVICE *Device,
|
||||
IN SD_CID *Cid
|
||||
IN OUT SD_DEVICE *Device,
|
||||
IN SD_CID *Cid
|
||||
)
|
||||
{
|
||||
CHAR8 String[SD_MODEL_NAME_MAX_LEN];
|
||||
@@ -178,19 +179,19 @@ GetSdModelName (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DiscoverUserArea (
|
||||
IN SD_DEVICE *Device
|
||||
IN SD_DEVICE *Device
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_CSD *Csd;
|
||||
SD_CSD2 *Csd2;
|
||||
SD_CID *Cid;
|
||||
UINT64 Capacity;
|
||||
UINT32 DevStatus;
|
||||
UINT16 Rca;
|
||||
UINT32 CSize;
|
||||
UINT32 CSizeMul;
|
||||
UINT32 ReadBlLen;
|
||||
EFI_STATUS Status;
|
||||
SD_CSD *Csd;
|
||||
SD_CSD2 *Csd2;
|
||||
SD_CID *Cid;
|
||||
UINT64 Capacity;
|
||||
UINT32 DevStatus;
|
||||
UINT16 Rca;
|
||||
UINT32 CSize;
|
||||
UINT32 CSizeMul;
|
||||
UINT32 ReadBlLen;
|
||||
|
||||
//
|
||||
// Deselect the device to force it enter stby mode.
|
||||
@@ -210,6 +211,7 @@ DiscoverUserArea (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
DumpCsd (Csd);
|
||||
|
||||
Cid = &Device->Cid;
|
||||
@@ -217,6 +219,7 @@ DiscoverUserArea (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
GetSdModelName (Device, Cid);
|
||||
|
||||
Status = SdSelect (Device, Rca);
|
||||
@@ -232,15 +235,15 @@ DiscoverUserArea (
|
||||
|
||||
if (Csd->CsdStructure == 0) {
|
||||
Device->SectorAddressing = FALSE;
|
||||
CSize = (Csd->CSizeHigh << 2 | Csd->CSizeLow) + 1;
|
||||
CSizeMul = (1 << (Csd->CSizeMul + 2));
|
||||
ReadBlLen = (1 << (Csd->ReadBlLen));
|
||||
Capacity = MultU64x32 (MultU64x32 ((UINT64)CSize, CSizeMul), ReadBlLen);
|
||||
CSize = (Csd->CSizeHigh << 2 | Csd->CSizeLow) + 1;
|
||||
CSizeMul = (1 << (Csd->CSizeMul + 2));
|
||||
ReadBlLen = (1 << (Csd->ReadBlLen));
|
||||
Capacity = MultU64x32 (MultU64x32 ((UINT64)CSize, CSizeMul), ReadBlLen);
|
||||
} else {
|
||||
Device->SectorAddressing = TRUE;
|
||||
Csd2 = (SD_CSD2*)(VOID*)Csd;
|
||||
CSize = (Csd2->CSizeHigh << 16 | Csd2->CSizeLow) + 1;
|
||||
Capacity = MultU64x32 ((UINT64)CSize, SIZE_512KB);
|
||||
Csd2 = (SD_CSD2 *)(VOID *)Csd;
|
||||
CSize = (Csd2->CSizeHigh << 16 | Csd2->CSizeLow) + 1;
|
||||
Capacity = MultU64x32 ((UINT64)CSize, SIZE_512KB);
|
||||
}
|
||||
|
||||
Device->BlockIo.Media = &Device->BlockMedia;
|
||||
@@ -279,23 +282,23 @@ DiscoverUserArea (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
DiscoverSdDevice (
|
||||
IN SD_DRIVER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Slot
|
||||
IN SD_DRIVER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Slot
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_STATUS Status;
|
||||
SD_DEVICE *Device;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
|
||||
Device = NULL;
|
||||
DevicePath = NULL;
|
||||
NewDevicePath = NULL;
|
||||
RemainingDevicePath = NULL;
|
||||
PassThru = Private->PassThru;
|
||||
PassThru = Private->PassThru;
|
||||
|
||||
//
|
||||
// Build Device Path
|
||||
@@ -305,7 +308,7 @@ DiscoverSdDevice (
|
||||
Slot,
|
||||
&DevicePath
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -324,10 +327,10 @@ DiscoverSdDevice (
|
||||
goto Error;
|
||||
}
|
||||
|
||||
DeviceHandle = NULL;
|
||||
DeviceHandle = NULL;
|
||||
RemainingDevicePath = NewDevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) {
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd (RemainingDevicePath)) {
|
||||
//
|
||||
// The device has been started, directly return to fast boot.
|
||||
//
|
||||
@@ -353,7 +356,7 @@ DiscoverSdDevice (
|
||||
// Expose user area in the Sd memory card to upper layer.
|
||||
//
|
||||
Status = DiscoverUserArea (Device);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
@@ -392,7 +395,7 @@ DiscoverSdDevice (
|
||||
gBS->OpenProtocol (
|
||||
Private->Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **) &(Private->PassThru),
|
||||
(VOID **)&(Private->PassThru),
|
||||
Private->DriverBindingHandle,
|
||||
Device->Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@@ -458,15 +461,15 @@ Error:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
UINT8 Slot;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
UINT8 Slot;
|
||||
|
||||
//
|
||||
// Test EFI_SD_MMC_PASS_THRU_PROTOCOL on the controller handle.
|
||||
@@ -474,7 +477,7 @@ SdDxeDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID**) &PassThru,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@@ -523,7 +526,7 @@ SdDxeDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -569,27 +572,27 @@ SdDxeDriverBindingSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
SD_DRIVER_PRIVATE_DATA *Private;
|
||||
UINT8 Slot;
|
||||
EFI_STATUS Status;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
SD_DRIVER_PRIVATE_DATA *Private;
|
||||
UINT8 Slot;
|
||||
|
||||
Private = NULL;
|
||||
PassThru = NULL;
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **) &PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if ((EFI_ERROR (Status)) && (Status != EFI_ALREADY_STARTED)) {
|
||||
return Status;
|
||||
}
|
||||
@@ -607,7 +610,7 @@ SdDxeDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -631,7 +634,7 @@ SdDxeDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &Private,
|
||||
(VOID **)&Private,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -676,14 +679,15 @@ Error:
|
||||
|
||||
if (Private != NULL) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
Private,
|
||||
NULL
|
||||
);
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
Private,
|
||||
NULL
|
||||
);
|
||||
FreePool (Private);
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -716,30 +720,30 @@ Error:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
UINTN Index;
|
||||
SD_DRIVER_PRIVATE_DATA *Private;
|
||||
SD_DEVICE *Device;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_BLOCK_IO2_PROTOCOL *BlockIo2;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
SD_REQUEST *Request;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
UINTN Index;
|
||||
SD_DRIVER_PRIVATE_DATA *Private;
|
||||
SD_DEVICE *Device;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_BLOCK_IO2_PROTOCOL *BlockIo2;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
SD_REQUEST *Request;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (NumberOfChildren == 0) {
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &Private,
|
||||
(VOID **)&Private,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -749,16 +753,16 @@ SdDxeDriverBindingStop (
|
||||
}
|
||||
|
||||
gBS->UninstallProtocolInterface (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
Private
|
||||
);
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
Private
|
||||
);
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
FreePool (Private);
|
||||
|
||||
@@ -770,19 +774,19 @@ SdDxeDriverBindingStop (
|
||||
for (Index = 0; Index < NumberOfChildren; Index++) {
|
||||
BlockIo = NULL;
|
||||
BlockIo2 = NULL;
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **)&BlockIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiBlockIo2ProtocolGuid,
|
||||
(VOID **) &BlockIo2,
|
||||
(VOID **)&BlockIo2,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@@ -806,7 +810,8 @@ SdDxeDriverBindingStop (
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
for (Link = GetFirstNode (&Device->Queue);
|
||||
!IsNull (&Device->Queue, Link);
|
||||
Link = NextLink) {
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Device->Queue, Link);
|
||||
RemoveEntryList (Link);
|
||||
|
||||
@@ -821,6 +826,7 @@ SdDxeDriverBindingStop (
|
||||
|
||||
FreePool (Request);
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
//
|
||||
@@ -849,14 +855,14 @@ SdDxeDriverBindingStop (
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
AllChildrenStopped = FALSE;
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
ChildHandleBuffer[Index],
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSdMmcPassThruProtocolGuid,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
ChildHandleBuffer[Index],
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
} else {
|
||||
FreePool (Device->DevicePath);
|
||||
FreeUnicodeStringTable (Device->ControllerNameTable);
|
||||
@@ -884,11 +890,11 @@ SdDxeDriverBindingStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeSdDxe (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
|
@@ -39,11 +39,11 @@
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gSdDxeDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gSdDxeComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gSdDxeComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gSdDxeDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gSdDxeComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gSdDxeComponentName2;
|
||||
|
||||
#define SD_DEVICE_SIGNATURE SIGNATURE_32 ('S', 'D', 't', 'f')
|
||||
#define SD_DEVICE_SIGNATURE SIGNATURE_32 ('S', 'D', 't', 'f')
|
||||
|
||||
#define SD_DEVICE_DATA_FROM_BLKIO(a) \
|
||||
CR(a, SD_DEVICE, BlockIo, SD_DEVICE_SIGNATURE)
|
||||
@@ -60,11 +60,11 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gSdDxeComponentName2;
|
||||
//
|
||||
// Take 2.5 seconds as generic time out value, 1 microsecond as unit.
|
||||
//
|
||||
#define SD_GENERIC_TIMEOUT 2500 * 1000
|
||||
#define SD_GENERIC_TIMEOUT 2500 * 1000
|
||||
|
||||
#define SD_REQUEST_SIGNATURE SIGNATURE_32 ('S', 'D', 'R', 'E')
|
||||
#define SD_REQUEST_SIGNATURE SIGNATURE_32 ('S', 'D', 'R', 'E')
|
||||
|
||||
#define SD_MODEL_NAME_MAX_LEN 32
|
||||
#define SD_MODEL_NAME_MAX_LEN 32
|
||||
|
||||
typedef struct _SD_DEVICE SD_DEVICE;
|
||||
typedef struct _SD_DRIVER_PRIVATE_DATA SD_DRIVER_PRIVATE_DATA;
|
||||
@@ -73,40 +73,40 @@ typedef struct _SD_DRIVER_PRIVATE_DATA SD_DRIVER_PRIVATE_DATA;
|
||||
// Asynchronous I/O request.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
|
||||
EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
|
||||
EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
|
||||
EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
|
||||
EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
|
||||
EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
|
||||
|
||||
BOOLEAN IsEnd;
|
||||
BOOLEAN IsEnd;
|
||||
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
|
||||
EFI_EVENT Event;
|
||||
EFI_EVENT Event;
|
||||
} SD_REQUEST;
|
||||
|
||||
#define SD_REQUEST_FROM_LINK(a) \
|
||||
CR(a, SD_REQUEST, Link, SD_REQUEST_SIGNATURE)
|
||||
|
||||
struct _SD_DEVICE {
|
||||
UINT32 Signature;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT8 Slot;
|
||||
BOOLEAN SectorAddressing;
|
||||
EFI_BLOCK_IO_PROTOCOL BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL BlockIo2;
|
||||
EFI_BLOCK_IO_MEDIA BlockMedia;
|
||||
EFI_ERASE_BLOCK_PROTOCOL EraseBlock;
|
||||
EFI_DISK_INFO_PROTOCOL DiskInfo;
|
||||
UINT32 Signature;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT8 Slot;
|
||||
BOOLEAN SectorAddressing;
|
||||
EFI_BLOCK_IO_PROTOCOL BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL BlockIo2;
|
||||
EFI_BLOCK_IO_MEDIA BlockMedia;
|
||||
EFI_ERASE_BLOCK_PROTOCOL EraseBlock;
|
||||
EFI_DISK_INFO_PROTOCOL DiskInfo;
|
||||
|
||||
LIST_ENTRY Queue;
|
||||
LIST_ENTRY Queue;
|
||||
|
||||
SD_CSD Csd;
|
||||
SD_CID Cid;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
SD_CSD Csd;
|
||||
SD_CID Cid;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
//
|
||||
// The model name consists of three fields in CID register
|
||||
// 1) OEM/Application ID (2 bytes)
|
||||
@@ -114,19 +114,19 @@ struct _SD_DEVICE {
|
||||
// 3) Product Serial Number (4 bytes)
|
||||
// The delimiters of these fields are whitespace.
|
||||
//
|
||||
CHAR16 ModelName[SD_MODEL_NAME_MAX_LEN];
|
||||
SD_DRIVER_PRIVATE_DATA *Private;
|
||||
} ;
|
||||
CHAR16 ModelName[SD_MODEL_NAME_MAX_LEN];
|
||||
SD_DRIVER_PRIVATE_DATA *Private;
|
||||
};
|
||||
|
||||
//
|
||||
// SD DXE driver private data structure
|
||||
//
|
||||
struct _SD_DRIVER_PRIVATE_DATA {
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
} ;
|
||||
EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
};
|
||||
|
||||
/**
|
||||
Tests to see if this driver supports a given controller. If a child device is provided,
|
||||
@@ -173,9 +173,9 @@ struct _SD_DRIVER_PRIVATE_DATA {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -216,9 +216,9 @@ SdDxeDriverBindingSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -250,10 +250,10 @@ SdDxeDriverBindingStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -374,11 +374,11 @@ SdDxeComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SdDxeComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -394,8 +394,8 @@ SdDxeComponentNameGetControllerName (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdSetRca (
|
||||
IN SD_DEVICE *Device,
|
||||
OUT UINT16 *Rca
|
||||
IN SD_DEVICE *Device,
|
||||
OUT UINT16 *Rca
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -411,8 +411,8 @@ SdSetRca (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdSelect (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -428,9 +428,9 @@ SdSelect (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdSendStatus (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT UINT32 *DevStatus
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT UINT32 *DevStatus
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -447,9 +447,9 @@ SdSendStatus (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdGetCsd (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CSD *Csd
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CSD *Csd
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -466,10 +466,9 @@ SdGetCsd (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SdGetCid (
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CID *Cid
|
||||
IN SD_DEVICE *Device,
|
||||
IN UINT16 Rca,
|
||||
OUT SD_CID *Cid
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user