From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-002e3701.pphosted.com (mx0a-002e3701.pphosted.com [148.163.147.86]) by mx.groups.io with SMTP id smtpd.web10.5120.1635382916388413401 for ; Wed, 27 Oct 2021 18:02:08 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@hpe.com header.s=pps0720 header.b=SkvqKrMc; spf=temperror, err=temporary DNS error (domain: hpe.com, ip: 148.163.147.86, mailfrom: prvs=09357d8486=abner.chang@hpe.com) Received: from pps.filterd (m0150242.ppops.net [127.0.0.1]) by mx0a-002e3701.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 19RLtK0f031886; Thu, 28 Oct 2021 01:00:31 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hpe.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding; s=pps0720; bh=KZlFVrygp8hPgQvRoXIWBHvtt0Rs6BRdzKdxJse6BO4=; b=SkvqKrMcpM617PODgUZ1BAuW9Dl5yJKd5vrVwIa8xQ0kQ6AU5LgHdDK///Tvr9Tv1A0Q dZipESPiTFZ9v9yspuedXGWuBlPS531kON0hK5I0Nqm33IXmiKfIG4mNt/Yg29ABbblS m6DrG67H2svVL9nvi8ptumKUbimxiUgUsSR0nEa8bFmtR3zK7iz2foYtkUn46Q+Hw645 WWG6RIl5Y2GwbPmTe5Mow3QaWM5VL8odG9T3kXFKWAtAFwBnJ53jLEDkTHphaR/BoKuD oBDA5vF8PnrLzvB/3sbdedWqsuNnsgVJxM5Gg1cdK3XxsR1IyGeysNJT425psfwZ2qqq FQ== Received: from g4t3425.houston.hpe.com (g4t3425.houston.hpe.com [15.241.140.78]) by mx0a-002e3701.pphosted.com with ESMTP id 3by7cud2d8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 28 Oct 2021 01:00:31 +0000 Received: from g9t2301.houston.hpecorp.net (g9t2301.houston.hpecorp.net [16.220.97.129]) by g4t3425.houston.hpe.com (Postfix) with ESMTP id E26E0B8; Thu, 28 Oct 2021 01:00:30 +0000 (UTC) Received: from SAC2XFT1JT.asiapacific.hpqcorp.net (unknown [10.43.62.133]) by g9t2301.houston.hpecorp.net (Postfix) with ESMTP id ABFD34C; Thu, 28 Oct 2021 01:00:29 +0000 (UTC) From: "Abner Chang" To: devel@edk2.groups.io Cc: nickle.wang@hpe.com, Liming Gao Subject: [PATCH] edk2-staging/RedfishPkg: Helper library of EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL Date: Thu, 28 Oct 2021 09:00:27 +0800 Message-Id: <20211028010028.36020-1-abner.chang@hpe.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: CVjYbC_0bfX7fK-h5QIrLKgjzGp0q1td X-Proofpoint-GUID: CVjYbC_0bfX7fK-h5QIrLKgjzGp0q1td X-HPE-SCL: -1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.0.607.475 definitions=2021-10-27_07,2021-10-26_01,2020-04-07_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 spamscore=0 clxscore=1015 impostorscore=0 mlxscore=0 phishscore=0 mlxlogscore=999 lowpriorityscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2110280004 Content-Transfer-Encoding: 8bit This is the helper library for using EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL. Signed-off-by: Nickle Wang Cc: Abner Chang Cc: Liming Gao --- 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
+# 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
+ + 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] 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
+ + 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 + +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
+ + 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