[PATCH] edk2-staging/RedfishPkg: Helper library of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL


Abner Chang
 

This is the helper library for using EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL.

Signed-off-by: Nickle Wang <nickle.wang@hpe.com>
Cc: Abner Chang <abner.chang@hpe.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
---
RedfishPkg/RedfishPkg.dec | 5 +
.../RedfishPlatformConfigLib.inf | 41 +++
.../Library/RedfishPlatformConfigLib.h | 101 ++++++++
.../RedfishPlatformConfigInternal.h | 31 +++
.../RedfishPlatformConfigLib.c | 243 ++++++++++++++++++
5 files changed, 421 insertions(+)
create mode 100644 RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf
create mode 100644 RedfishPkg/Include/Library/RedfishPlatformConfigLib.h
create mode 100644 RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h
create mode 100644 RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c

diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec
index eac219ccbb9..71f99066962 100644
--- a/RedfishPkg/RedfishPkg.dec
+++ b/RedfishPkg/RedfishPkg.dec
@@ -55,6 +55,11 @@
#
RedfishContentCodingLib|Include/Library/RedfishContentCodingLib.h

+ ## @libraryclass Provides the library functions to access Redfish Platform
+ # Config protocol.
+ #
+ RedfishPlatformConfigLib|Include/Library/RedfishPlatformConfigLib.h
+
## @libraryclass Provides the library functions to parse IFR binary data.
#
HiiUtilityLib|Include/Library/HiiUtilityLib.h
diff --git a/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf
new file mode 100644
index 00000000000..5ad8d22087d
--- /dev/null
+++ b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf
@@ -0,0 +1,41 @@
+## @file
+# Library for Redfish Platform Config Protocol
+#
+# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010006
+ BASE_NAME = RedfishPlatformConfigLib
+ FILE_GUID = C920FD62-21AC-4638-B9F5-9612942290F6
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = RedfishPlatformConfigLib| DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION UEFI_DRIVER
+ CONSTRUCTOR = RedfishPlatformConfigLibConstructor
+ DESTRUCTOR = RedfishPlatformConfigLibDestructor
+
+#
+# VALID_ARCHITECTURES = IA32 X64 EBC RISCV64
+#
+
+[Sources]
+ RedfishPlatformConfigLib.c
+ RedfishPlatformConfigInternal.h
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ RedfishPkg/RedfishPkg.dec
+
+[LibraryClasses]
+ BaseLib
+ BaseMemoryLib
+ DebugLib
+ MemoryAllocationLib
+ UefiBootServicesTableLib
+ UefiLib
+
+[Protocols]
+ gEdkIIRedfishPlatformConfigProtocolGuid
diff --git a/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h b/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h
new file mode 100644
index 00000000000..ebe2329fd9a
--- /dev/null
+++ b/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h
@@ -0,0 +1,101 @@
+/** @file
+ Definitinos of RedfishPlatformConfigLib
+
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#ifndef REDFISH_PLATFORM_CONFIG_LIB_H_
+#define REDFISH_PLATFORM_CONFIG_LIB_H_
+
+#include <Protocol/EdkIIRedfishPlatformConfig.h>
+
+/**
+ Get Redfish value with the given Schema and Configure Language.
+
+ @param[in] Schema The Redfish schema to query.
+ @param[in] Version The Redfish version to query.
+ @param[in] ConfigureLang The target value which match this configure Language.
+ @param[out] Value The returned value.
+
+ @retval EFI_SUCCESS Value is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+RedfishPlatformConfigGetValue (
+ IN CHAR8 *Schema,
+ IN CHAR8 *Version,
+ IN EFI_STRING ConfigureLang,
+ OUT EDKII_REDFISH_VALUE *Value
+ );
+
+/**
+ Set Redfish value with the given Schema and Configure Language.
+
+ @param[in] Schema The Redfish schema to query.
+ @param[in] Version The Redfish version to query.
+ @param[in] ConfigureLang The target value which match this configure Language.
+ @param[in] Value The value to set.
+
+ @retval EFI_SUCCESS Value is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+RedfishPlatformConfigSetValue (
+ IN CHAR8 *Schema,
+ IN CHAR8 *Version,
+ IN EFI_STRING ConfigureLang,
+ IN EDKII_REDFISH_VALUE Value
+ );
+
+/**
+ Get the list of Configure Language from platform configuration by the given Schema and Pattern.
+
+ @param[in] Schema The Redfish schema to query.
+ @param[in] Version The Redfish version to query.
+ @param[in] Pattern The target Configure Language pattern.
+ @param[out] RedpathList The list of Configure Language.
+ @param[out] Count The number of Configure Language in ConfigureLangList.
+
+ @retval EFI_SUCCESS ConfigureLangList is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+RedfishPlatformConfigGetConfigureLang (
+ IN CHAR8 *Schema,
+ IN CHAR8 *Version,
+ IN EFI_STRING Pattern,
+ OUT EFI_STRING **ConfigureLangList,
+ OUT UINTN *Count
+ );
+
+/**
+ Get the list of supported Redfish schema from platform configuration on the give HII handle.
+
+ @param[in] HiiHandle The target handle to search. If handle is NULL,
+ this function return all schema from HII database.
+ @param[out] SupportedSchema The supported schema list which is separated by ';'.
+ For example: "x-uefi-redfish-Memory.v1_7_1;x-uefi-redfish-Boot.v1_0_1"
+ The SupportedSchema is allocated by the callee. It's caller's
+ responsibility to free this buffer using FreePool().
+
+ @retval EFI_SUCCESS Schema is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+EFIAPI
+RedfishPlatformConfigGetSupportedSchema (
+ IN EFI_HII_HANDLE HiiHandle, OPTIONAL
+ OUT CHAR8 **SupportedSchema
+ );
+
+#endif
diff --git a/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h
new file mode 100644
index 00000000000..8745faa0327
--- /dev/null
+++ b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h
@@ -0,0 +1,31 @@
+/** @file
+ Internal function header for Redfish Platform Config Library.
+
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef REDFISH_PLATFORM_CONFIG_H_
+#define REDFISH_PLATFORM_CONFIG_H_
+
+#include <Uefi.h>
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/RedfishPlatformConfigLib.h>
+#include <Library/UefiLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#include <Protocol/EdkIIRedfishPlatformConfig.h>
+
+typedef struct {
+ EFI_EVENT ProtocolEvent; // Protocol notification event.
+ VOID *Registration; // Protocol notification registration.
+ EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL *Protocol;
+} REDFISH_PLATFORM_CONFIG_LIB_PRIVATE;
+
+#endif
diff --git a/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c
new file mode 100644
index 00000000000..eb2c64b0e60
--- /dev/null
+++ b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c
@@ -0,0 +1,243 @@
+/** @file
+ Wrapper function to support Redfish Platform Config protocol.
+
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "RedfishPlatformConfigInternal.h"
+
+REDFISH_PLATFORM_CONFIG_LIB_PRIVATE mRedfishPlatformConfigLibPrivate;
+
+
+/**
+ Get Redfish value with the given Schema and Configure Language.
+
+ @param[in] Schema The Redfish schema to query.
+ @param[in] Version The Redfish version to query.
+ @param[in] ConfigureLang The target value which match this configure Language.
+ @param[out] Value The returned value.
+
+ @retval EFI_SUCCESS Value is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+RedfishPlatformConfigGetValue (
+ IN CHAR8 *Schema,
+ IN CHAR8 *Version,
+ IN EFI_STRING ConfigureLang,
+ OUT EDKII_REDFISH_VALUE *Value
+ )
+{
+ if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ return mRedfishPlatformConfigLibPrivate.Protocol->GetValue (
+ mRedfishPlatformConfigLibPrivate.Protocol,
+ Schema,
+ Version,
+ ConfigureLang,
+ Value
+ );
+}
+
+/**
+ Set Redfish value with the given Schema and Configure Language.
+
+ @param[in] Schema The Redfish schema to query.
+ @param[in] Version The Redfish version to query.
+ @param[in] ConfigureLang The target value which match this configure Language.
+ @param[in] Value The value to set.
+
+ @retval EFI_SUCCESS Value is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+RedfishPlatformConfigSetValue (
+ IN CHAR8 *Schema,
+ IN CHAR8 *Version,
+ IN EFI_STRING ConfigureLang,
+ IN EDKII_REDFISH_VALUE Value
+ )
+{
+ if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ return mRedfishPlatformConfigLibPrivate.Protocol->SetValue (
+ mRedfishPlatformConfigLibPrivate.Protocol,
+ Schema,
+ Version,
+ ConfigureLang,
+ Value
+ );
+}
+
+/**
+ Get the list of Configure Language from platform configuration by the given Schema and Pattern.
+
+ @param[in] Schema The Redfish schema to query.
+ @param[in] Version The Redfish version to query.
+ @param[in] Pattern The target Configure Language pattern.
+ @param[out] RedpathList The list of Configure Language.
+ @param[out] Count The number of Configure Language in ConfigureLangList.
+
+ @retval EFI_SUCCESS ConfigureLangList is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+RedfishPlatformConfigGetConfigureLang (
+ IN CHAR8 *Schema,
+ IN CHAR8 *Version,
+ IN EFI_STRING Pattern,
+ OUT EFI_STRING **ConfigureLangList,
+ OUT UINTN *Count
+ )
+{
+ if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ return mRedfishPlatformConfigLibPrivate.Protocol->GetConfigureLang (
+ mRedfishPlatformConfigLibPrivate.Protocol,
+ Schema,
+ Version,
+ Pattern,
+ ConfigureLangList,
+ Count
+ );
+}
+
+/**
+ Get the list of supported Redfish schema from paltform configuration on give HII handle.
+
+ @param[in] HiiHandle The target handle to search. If handle is NULL,
+ this function return all schema from HII database.
+ @param[out] SupportedSchema The supported schema list which is separated by ';'.
+ The SupportedSchema is allocated by the callee. It's caller's
+ responsibility to free this buffer using FreePool().
+
+ @retval EFI_SUCCESS Schema is returned successfully.
+ @retval EFI_NOT_READY Redfish Platform Config protocol is not ready.
+ @retval Others Some error happened.
+
+**/
+EFI_STATUS
+EFIAPI
+RedfishPlatformConfigGetSupportedSchema (
+ IN EFI_HII_HANDLE HiiHandle OPTIONAL,
+ OUT CHAR8 **SupportedSchema
+ )
+{
+ if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ return mRedfishPlatformConfigLibPrivate.Protocol->GetSupportedSchema (
+ mRedfishPlatformConfigLibPrivate.Protocol,
+ HiiHandle,
+ SupportedSchema
+ );
+}
+
+/**
+ This is a EFI_REDFISH_PLATFORM_CONFIG_PROTOCOL notification event handler.
+
+ Install HII package notification.
+
+ @param[in] Event Event whose notification function is being invoked.
+ @param[in] Context Pointer to the notification function's context.
+
+**/
+VOID
+EFIAPI
+RedfishPlatformConfigProtocolInstalled (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+
+ //
+ // Locate EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL.
+ //
+ Status = gBS->LocateProtocol (
+ &gEdkIIRedfishPlatformConfigProtocolGuid,
+ NULL,
+ (VOID **)&mRedfishPlatformConfigLibPrivate.Protocol
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "%a, locate EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL failure: %r\n", __FUNCTION__, Status));
+ return;
+ }
+
+ gBS->CloseEvent (Event);
+ mRedfishPlatformConfigLibPrivate.ProtocolEvent = NULL;
+}
+
+/**
+
+ Create prottocol listener and wait for Redfish Platform Config protocol.
+
+ @param ImageHandle The image handle.
+ @param SystemTable The system table.
+
+ @retval EFI_SUCEESS Protocol listener is registered successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+RedfishPlatformConfigLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ ZeroMem (&mRedfishPlatformConfigLibPrivate, sizeof (REDFISH_PLATFORM_CONFIG_LIB_PRIVATE));
+ mRedfishPlatformConfigLibPrivate.ProtocolEvent = EfiCreateProtocolNotifyEvent (
+ &gEdkIIRedfishPlatformConfigProtocolGuid,
+ TPL_CALLBACK,
+ RedfishPlatformConfigProtocolInstalled,
+ NULL,
+ &mRedfishPlatformConfigLibPrivate.Registration
+ );
+ if (mRedfishPlatformConfigLibPrivate.ProtocolEvent == NULL) {
+ DEBUG ((DEBUG_ERROR, "%a, failed to create protocol notify event\n", __FUNCTION__));
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Unloads the application and its installed protocol.
+
+ @param ImageHandle Handle that identifies the image to be unloaded.
+ @param SystemTable The system table.
+
+ @retval EFI_SUCCESS The image has been unloaded.
+
+**/
+EFI_STATUS
+EFIAPI
+RedfishPlatformConfigLibDestructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ if (mRedfishPlatformConfigLibPrivate.ProtocolEvent != NULL) {
+ gBS->CloseEvent (mRedfishPlatformConfigLibPrivate.ProtocolEvent);
+ mRedfishPlatformConfigLibPrivate.ProtocolEvent = NULL;
+ }
+
+ mRedfishPlatformConfigLibPrivate.Protocol = NULL;
+
+ return EFI_SUCCESS;
+}
\ No newline at end of file
--
2.21.0.windows.1