This is the helper library for using EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL. Signed-off-by: Nickle Wang <nicklew@nvidia.com> Cc: Abner Chang <abner.chang@amd.com> Cc: Igor Kulchytskyy <igork@ami.com> Cc: Nick Ramirez <nramirez@nvidia.com> Reviewed-by: Abner Chang <abner.chang@amd.com> Reviewed-by: Igor Kulchytskyy <igork @ami.com>
		
			
				
	
	
		
			311 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Wrapper function to support Redfish Platform Config protocol.
 | 
						|
 | 
						|
  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
 | 
						|
  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;
 | 
						|
}
 |