/** @file

  This PRM Module demonstrates how to define an ACPI parameter buffer that is used by a PRM handler.

  Copyright (c) Microsoft Corporation
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <PrmModule.h>

#include <Library/BaseLib.h>
#include <Library/UefiLib.h>

// TEMP
#include <Library/DebugLib.h>

#define PARAM_BUFFER_TEST_SIGNATURE  SIGNATURE_32('T','E','S','T')

//
// PRM Handler GUIDs
//

// {2e4f2d13-6240-4ed0-a401-c723fbdc34e8}
#define CHECK_PARAM_BUFFER_PRM_HANDLER_GUID  {0x2e4f2d13, 0x6240, 0x4ed0, {0xa4, 0x01, 0xc7, 0x23, 0xfb, 0xdc, 0x34, 0xe8}}

/**
  A sample Platform Runtime Mechanism (PRM) handler.

  This sample handler checks if a parameter buffer is provided with the data signature
  ('T', 'E', 'S', 'T') at the beginning of the buffer.

  The contents are expected to be updated by ACPI code at OS runtime.

  @param[in]  ParameterBuffer     A pointer to the PRM handler parameter buffer
  @param[in]  ContextBUffer       A pointer to the PRM handler context buffer

  @retval EFI_STATUS              The PRM handler executed successfully.
  @retval Others                  An error occurred in the PRM handler.

**/
PRM_HANDLER_EXPORT (CheckParamBufferPrmHandler) {
  if (ParameterBuffer == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  if (*((UINT32 *)ParameterBuffer) == PARAM_BUFFER_TEST_SIGNATURE) {
    return EFI_SUCCESS;
  }

  return EFI_NOT_FOUND;
}

//
// Register the PRM export information for this PRM Module
//
PRM_MODULE_EXPORT (
  PRM_HANDLER_EXPORT_ENTRY (CHECK_PARAM_BUFFER_PRM_HANDLER_GUID, CheckParamBufferPrmHandler)
  );

/**
  Module entry point.

  @param[in]   ImageHandle     The image handle.
  @param[in]   SystemTable     A pointer to the system table.

  @retval  EFI_SUCCESS         This function always returns success.

**/
EFI_STATUS
EFIAPI
PrmSampleAcpiParameterBufferModuleInit (
  IN  EFI_HANDLE        ImageHandle,
  IN  EFI_SYSTEM_TABLE  *SystemTable
  )
{
  return EFI_SUCCESS;
}
