-
Notifications
You must be signed in to change notification settings - Fork 511
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
IntelSiliconPkg: Add MM SPI FVB services
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3307 Adds a Traditional MM and Standalone MM SPI FVB Service driver to IntelSiliconPkg. These drivers produce the firmware volume block protocol for SPI flash devices compliant with the Intel Serial Flash Interface Compatibility Specification. Cc: Ray Ni <[email protected]> Cc: Rangasai V Chaganty <[email protected]> Signed-off-by: Michael Kubacki <[email protected]> Reviewed-by: Nate DeSimone <[email protected]>
- Loading branch information
1 parent
3c91c43
commit 9b6cce0
Showing
10 changed files
with
1,658 additions
and
0 deletions.
There are no files selected for viewing
94 changes: 94 additions & 0 deletions
94
Silicon/Intel/IntelSiliconPkg/Feature/Flash/SpiFvbService/FvbInfo.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
/**@file | ||
Defines data structure that is the volume header found. | ||
These data is intent to decouple FVB driver with FV header. | ||
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> | ||
SPDX-License-Identifier: BSD-2-Clause-Patent | ||
**/ | ||
|
||
#include "SpiFvbServiceCommon.h" | ||
|
||
#define FIRMWARE_BLOCK_SIZE 0x10000 | ||
#define FVB_MEDIA_BLOCK_SIZE FIRMWARE_BLOCK_SIZE | ||
|
||
#define NV_STORAGE_BASE_ADDRESS FixedPcdGet32(PcdFlashNvStorageVariableBase) | ||
#define SYSTEM_NV_BLOCK_NUM ((FixedPcdGet32(PcdFlashNvStorageVariableSize)+ FixedPcdGet32(PcdFlashNvStorageFtwWorkingSize) + FixedPcdGet32(PcdFlashNvStorageFtwSpareSize))/ FVB_MEDIA_BLOCK_SIZE) | ||
|
||
typedef struct { | ||
EFI_PHYSICAL_ADDRESS BaseAddress; | ||
EFI_FIRMWARE_VOLUME_HEADER FvbInfo; | ||
EFI_FV_BLOCK_MAP_ENTRY End[1]; | ||
} EFI_FVB2_MEDIA_INFO; | ||
|
||
// | ||
// This data structure contains a template of all correct FV headers, which is used to restore | ||
// Fv header if it's corrupted. | ||
// | ||
EFI_FVB2_MEDIA_INFO mPlatformFvbMediaInfo[] = { | ||
// | ||
// Systen NvStorage FVB | ||
// | ||
{ | ||
NV_STORAGE_BASE_ADDRESS, | ||
{ | ||
{0,}, //ZeroVector[16] | ||
EFI_SYSTEM_NV_DATA_FV_GUID, | ||
FVB_MEDIA_BLOCK_SIZE * SYSTEM_NV_BLOCK_NUM, | ||
EFI_FVH_SIGNATURE, | ||
0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2 | ||
sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY), | ||
0, //CheckSum which will be calucated dynamically. | ||
0, //ExtHeaderOffset | ||
{0,}, //Reserved[1] | ||
2, //Revision | ||
{ | ||
{ | ||
SYSTEM_NV_BLOCK_NUM, | ||
FVB_MEDIA_BLOCK_SIZE, | ||
} | ||
} | ||
}, | ||
{ | ||
{ | ||
0, | ||
0 | ||
} | ||
} | ||
} | ||
}; | ||
|
||
EFI_STATUS | ||
GetFvbInfo ( | ||
IN EFI_PHYSICAL_ADDRESS FvBaseAddress, | ||
OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo | ||
) | ||
{ | ||
UINTN Index; | ||
EFI_FIRMWARE_VOLUME_HEADER *FvHeader; | ||
|
||
for (Index = 0; Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB2_MEDIA_INFO); Index++) { | ||
if (mPlatformFvbMediaInfo[Index].BaseAddress == FvBaseAddress) { | ||
FvHeader = &mPlatformFvbMediaInfo[Index].FvbInfo; | ||
|
||
// | ||
// Update the checksum value of FV header. | ||
// | ||
FvHeader->Checksum = CalculateCheckSum16 ( (UINT16 *) FvHeader, FvHeader->HeaderLength); | ||
|
||
*FvbInfo = FvHeader; | ||
|
||
DEBUG ((DEBUG_INFO, "BaseAddr: 0x%lx \n", FvBaseAddress)); | ||
DEBUG ((DEBUG_INFO, "FvLength: 0x%lx \n", (*FvbInfo)->FvLength)); | ||
DEBUG ((DEBUG_INFO, "HeaderLength: 0x%x \n", (*FvbInfo)->HeaderLength)); | ||
DEBUG ((DEBUG_INFO, "Header Checksum: 0x%X\n", (*FvbInfo)->Checksum)); | ||
DEBUG ((DEBUG_INFO, "FvBlockMap[0].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[0].NumBlocks)); | ||
DEBUG ((DEBUG_INFO, "FvBlockMap[0].BlockLength: 0x%x \n", (*FvbInfo)->BlockMap[0].Length)); | ||
DEBUG ((DEBUG_INFO, "FvBlockMap[1].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[1].NumBlocks)); | ||
DEBUG ((DEBUG_INFO, "FvBlockMap[1].BlockLength: 0x%x \n\n", (*FvbInfo)->BlockMap[1].Length)); | ||
|
||
return EFI_SUCCESS; | ||
} | ||
} | ||
return EFI_NOT_FOUND; | ||
} |
Oops, something went wrong.