/** @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; }