From 83d77fa311435bafd68076ba2f960ce607643971 Mon Sep 17 00:00:00 2001 From: Nickle Wang Date: Mon, 10 Apr 2023 21:18:42 +0800 Subject: RedfishPkg: Helper library of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL This is the helper library for using EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL. Signed-off-by: Nickle Wang Cc: Abner Chang Cc: Igor Kulchytskyy Cc: Nick Ramirez Reviewed-by: Abner Chang Reviewed-by: Igor Kulchytskyy --- .../Include/Library/RedfishPlatformConfigLib.h | 143 ++++++++++ .../RedfishPlatformConfigInternal.h | 35 +++ .../RedfishPlatformConfigLib.c | 310 +++++++++++++++++++++ .../RedfishPlatformConfigLib.inf | 41 +++ RedfishPkg/RedfishPkg.dec | 5 + 5 files changed, 534 insertions(+) create mode 100644 RedfishPkg/Include/Library/RedfishPlatformConfigLib.h create mode 100644 RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h create mode 100644 RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c create mode 100644 RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf (limited to 'RedfishPkg') diff --git a/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h b/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h new file mode 100644 index 0000000..51a1861 --- /dev/null +++ b/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h @@ -0,0 +1,143 @@ +/** @file + Definitions of RedfishPlatformConfigLib + + (C) Copyright 2021 Hewlett Packard Enterprise Development LP
+ Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef REDFISH_PLATFORM_CONFIG_LIB_H_ +#define REDFISH_PLATFORM_CONFIG_LIB_H_ + +#include + +/** + 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] ConfigureLangList 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. + + @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 ( + OUT CHAR8 **SupportedSchema + ); + +/** + Get Redfish attribute 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] AttributeValue The attribute value. + + @retval EFI_SUCCESS Value is returned successfully. + @retval Others Some error happened. + +**/ +EFI_STATUS +RedfishPlatformConfigGetAttribute ( + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + OUT EDKII_REDFISH_ATTRIBUTE *AttributeValue + ); + +/** + Get Redfish default 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] DefaultClass The UEFI defined default class. + Please refer to UEFI spec. 33.2.5.8 "defaults" for details. + @param[out] Value The returned value. + + @retval EFI_SUCCESS Value is returned successfully. + @retval Others Some error happened. + +**/ +EFI_STATUS +RedfishPlatformConfigGetDefaultValue ( + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN UINT16 DefaultClass, + OUT EDKII_REDFISH_VALUE *Value + ); + +#endif diff --git a/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h new file mode 100644 index 0000000..061e7f4 --- /dev/null +++ b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigInternal.h @@ -0,0 +1,35 @@ +/** @file + Internal function header for Redfish Platform Config Library. + + (C) Copyright 2021 Hewlett Packard Enterprise Development LP
+ Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef REDFISH_PLATFORM_CONFIG_H_ +#define REDFISH_PLATFORM_CONFIG_H_ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +/// +/// Definition of REDFISH_PLATFORM_CONFIG_LIB_PRIVATE +/// +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 0000000..3500b6a --- /dev/null +++ b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c @@ -0,0 +1,310 @@ +/** @file + Wrapper function to support Redfish Platform Config protocol. + + (C) Copyright 2021 Hewlett Packard Enterprise Development LP
+ Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + + 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 + ); +} + +/** + Get Redfish attribute 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] AttributeValue The attribute value. + + @retval EFI_SUCCESS Value is returned successfully. + @retval Others Some error happened. + +**/ +EFI_STATUS +RedfishPlatformConfigGetAttribute ( + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + OUT EDKII_REDFISH_ATTRIBUTE *AttributeValue + ) +{ + if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishPlatformConfigLibPrivate.Protocol->GetAttribute ( + mRedfishPlatformConfigLibPrivate.Protocol, + Schema, + Version, + ConfigureLang, + AttributeValue + ); +} + +/** + Get Redfish default 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] DefaultClass The UEFI defined default class. + Please refer to UEFI spec. 33.2.5.8 "defaults" for details. + @param[out] Value The returned value. + + @retval EFI_SUCCESS Value is returned successfully. + @retval Others Some error happened. + +**/ +EFI_STATUS +RedfishPlatformConfigGetDefaultValue ( + IN CHAR8 *Schema, + IN CHAR8 *Version, + IN EFI_STRING ConfigureLang, + IN UINT16 DefaultClass, + OUT EDKII_REDFISH_VALUE *Value + ) +{ + if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishPlatformConfigLibPrivate.Protocol->GetDefaultValue ( + mRedfishPlatformConfigLibPrivate.Protocol, + Schema, + Version, + ConfigureLang, + DefaultClass, + 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] ConfigureLangList 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 platform configuration. + + @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 ( + OUT CHAR8 **SupportedSchema + ) +{ + if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishPlatformConfigLibPrivate.Protocol->GetSupportedSchema ( + mRedfishPlatformConfigLibPrivate.Protocol, + 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", __func__, Status)); + return; + } + + gBS->CloseEvent (Event); + mRedfishPlatformConfigLibPrivate.ProtocolEvent = NULL; +} + +/** + + Create protocol listener and wait for Redfish Platform Config protocol. + + @param ImageHandle The image handle. + @param SystemTable The system table. + + @retval EFI_SUCCESS 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", __func__)); + } + + 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; +} diff --git a/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf new file mode 100644 index 0000000..2258609 --- /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
+# 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/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec index e2892ce..cdb1528 100644 --- a/RedfishPkg/RedfishPkg.dec +++ b/RedfishPkg/RedfishPkg.dec @@ -64,6 +64,11 @@ # HiiUtilityLib|Include/Library/HiiUtilityLib.h + ## @libraryclass Provides the library functions to access Redfish Platform + # Config protocol. + # + RedfishPlatformConfigLib|Include/Library/RedfishPlatformConfigLib.h + [LibraryClasses.Common.Private] ## @libraryclass Provides the private C runtime library functions. # CRT library is currently used by edk2 JsonLib (open source -- cgit v1.1