In BaseConfigBlockLib add function to get next config block from config blocks table in order to iterate over blocks of the same type.
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3700
Signed-off-by: Jakub Fedorowicz mailto:jakub.fedorowicz@...
Cc: Ray Ni mailto:ray.ni@...
Cc: Rangasai V Chaganty mailto:rangasai.v.chaganty@...
---
.../Include/Library/ConfigBlockLib.h | 20 ++++++++
.../BaseConfigBlockLib/BaseConfigBlockLib.c | 50 +++++++++++++++++++
2 files changed, 70 insertions(+)
diff --git a/Silicon/Intel/IntelSiliconPkg/Include/Library/ConfigBlockLib.h b/Silicon/Intel/IntelSiliconPkg/Include/Library/ConfigBlockLib.h
index 37a39681..77eff21b 100644
--- a/Silicon/Intel/IntelSiliconPkg/Include/Library/ConfigBlockLib.h
+++ b/Silicon/Intel/IntelSiliconPkg/Include/Library/ConfigBlockLib.h
@@ -45,6 +45,7 @@ AddConfigBlock (
/**
Retrieve a specific Config Block data by GUID.
+ If there is more than one Config Block with given GUID, return the first found with given GUID.
@param[in] ConfigBlockTableAddress - A pointer to the beginning of Config Block Table Address
@param[in] ConfigBlockGuid - A pointer to the GUID uses to search specific Config Block
@@ -61,4 +62,23 @@ GetConfigBlock (
OUT VOID **ConfigBlockAddress
);
+/**
+ Search through ConfigBlockTable blocks to find following Config Block of the same GUID.
+ If there is no following Config Block found until the end of the table, return EFI_NOT_FOUND.
+
+ @param[in] ConfigBlockTableAddress - A pointer to the beginning of Config Block Table
+ @param[in] ConfigBlockAddress - A pointer to the Config Block, against which the search begins
+ @param[out] NextConfigBlockAddress - On return, points to a pointer to the found Config Block
+
+ @retval EFI_NOT_FOUND - Could not find the following Config Block
+ @retval EFI_SUCCESS - Config Block found and return
+**/
+EFI_STATUS
+EFIAPI
+GetNextConfigBlock (
+ IN VOID *ConfigBlockTableAddress,
+ IN VOID *ConfigBlockAddress,
+ OUT VOID **NextConfigBlockAddress
+ );
+
#endif // _CONFIG_BLOCK_LIB_H_
diff --git a/Silicon/Intel/IntelSiliconPkg/Library/BaseConfigBlockLib/BaseConfigBlockLib.c b/Silicon/Intel/IntelSiliconPkg/Library/BaseConfigBlockLib/BaseConfigBlockLib.c
index c89699ea..f026ac0b 100644
--- a/Silicon/Intel/IntelSiliconPkg/Library/BaseConfigBlockLib/BaseConfigBlockLib.c
+++ b/Silicon/Intel/IntelSiliconPkg/Library/BaseConfigBlockLib/BaseConfi
+++ gBlockLib.c
@@ -95,6 +95,7 @@ AddConfigBlock (
/**
Retrieve a specific Config Block data by GUID.
+ If there is more than one Config Block with given GUID, return the first found with given GUID.
@param[in] ConfigBlockTableAddress - A pointer to the beginning of Config Block Table Address
@param[in] ConfigBlockGuid - A pointer to the GUID uses to search specific Config Block
@@ -137,3 +138,52 @@ GetConfigBlock (
return EFI_NOT_FOUND;
}
+
+/**
+ Search through ConfigBlockTable blocks to find following Config Block of the same GUID.
+ If there is no following Config Block found until the end of the table, return EFI_NOT_FOUND.
+
+ @param[in] ConfigBlockTableAddress - A pointer to the beginning of Config Block Table
+ @param[in] ConfigBlockAddress - A pointer to the Config Block, against which the search begins
+ @param[out] NextConfigBlockAddress - On return, points to a pointer to the found Config Block
+
+ @retval EFI_NOT_FOUND - Could not find the following Config Block
+ @retval EFI_SUCCESS - Config Block found and return
+**/
+EFI_STATUS
+EFIAPI
+GetNextConfigBlock (
+ IN VOID *ConfigBlockTableAddress,
+ IN VOID *ConfigBlockAddress,
+ OUT VOID **NextConfigBlockAddress
+ )
+{
+ CONFIG_BLOCK_TABLE_HEADER *ConfigBlkTblHdrPtr;
+ UINTN ConfigBlkTblEndAddr;
+ UINTN ConfigBlkOffset;
+ CONFIG_BLOCK *TempConfigBlk;
+ EFI_GUID *TargetGuid;
+
+ ConfigBlkTblHdrPtr = (CONFIG_BLOCK_TABLE_HEADER *)
+ ConfigBlockTableAddress; ConfigBlkTblEndAddr = (UINTN)
+ ConfigBlockTableAddress + (UINTN)
+ ConfigBlkTblHdrPtr->Header.GuidHob.Header.HobLength;
+
+ TempConfigBlk = (CONFIG_BLOCK *) ConfigBlockAddress; TargetGuid =
+ &(TempConfigBlk->Header.GuidHob.Name);
+ ConfigBlkOffset = (UINTN) ConfigBlockAddress + (UINTN)
+ TempConfigBlk->Header.GuidHob.Header.HobLength;
+
+ //
+ // Loop until exceeding ConfigBlockTable range // while
+ (ConfigBlkOffset < ConfigBlkTblEndAddr) {
+ TempConfigBlk = (CONFIG_BLOCK *) ConfigBlkOffset;
+
+ if (CompareGuid (TargetGuid, &(TempConfigBlk->Header.GuidHob.Name))) {
+ *NextConfigBlockAddress = (VOID *) TempConfigBlk;
+ return EFI_SUCCESS;
+ }
+
+ ConfigBlkOffset += (UINTN)
+ TempConfigBlk->Header.GuidHob.Header.HobLength;
+ }
+
+ return EFI_NOT_FOUND;
+}
--
2.30.0.windows.2