/** @file

  The boot services environment configuration library for the ACPI Parameter Buffer Sample PRM module.

  Copyright (c) Microsoft Corporation
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/PrmConfig.h>

STATIC EFI_HANDLE  mPrmConfigProtocolHandle;

// {dc2a58a6-5927-4776-b995-d118a27335a2}
STATIC CONST EFI_GUID  mPrmModuleGuid = {
  0xdc2a58a6, 0x5927, 0x4776, { 0xb9, 0x95, 0xd1, 0x18, 0xa2, 0x73, 0x35, 0xa2 }
};

// {2e4f2d13-6240-4ed0-a401-c723fbdc34e8}
STATIC CONST EFI_GUID  mCheckParamBufferPrmHandlerGuid = {
  0x2e4f2d13, 0x6240, 0x4ed0, { 0xa4, 0x01, 0xc7, 0x23, 0xfb, 0xdc, 0x34, 0xe8 }
};

/**
  Constructor of the PRM configuration library.

  @param[in] ImageHandle        The image handle of the driver.
  @param[in] SystemTable        The EFI System Table pointer.

  @retval EFI_SUCCESS           The shell command handlers were installed successfully.
  @retval EFI_UNSUPPORTED       The shell level required was not found.
**/
EFI_STATUS
EFIAPI
AcpiParameterBufferModuleConfigLibConstructor (
  IN  EFI_HANDLE        ImageHandle,
  IN  EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS                        Status;
  VOID                              *AcpiParameterBuffer;
  ACPI_PARAMETER_BUFFER_DESCRIPTOR  *AcpiParamBufferDescriptor;
  PRM_CONFIG_PROTOCOL               *PrmConfigProtocol;

  AcpiParameterBuffer       = NULL;
  AcpiParamBufferDescriptor = NULL;
  PrmConfigProtocol         = NULL;

  /*
    In this sample PRM module, the protocol describing this sample module's resources is simply
    installed in the constructor.

    However, if some data is not available until later, this constructor could register a callback
    on the dependency for the data to be available (e.g. ability to communicate with some device)
    and then install the protocol. The requirement is that the protocol is installed before end of DXE.
  */

  // Allocate the ACPI parameter buffer

  // A parameter buffer is arbitrary data that is handler specific. This handler buffer is specified
  // to consist of a UINT32 that represents the test data signature ('T', 'E', 'S', 'T').
  AcpiParameterBuffer = AllocateRuntimeZeroPool (sizeof (UINT32));
  ASSERT (AcpiParameterBuffer != NULL);
  if (AcpiParameterBuffer == NULL) {
    Status = EFI_OUT_OF_RESOURCES;
    goto Done;
  }

  // Allocate the ACPI Parameter Buffer Descriptor structure for a single PRM handler
  AcpiParamBufferDescriptor = AllocateZeroPool (sizeof (*AcpiParamBufferDescriptor));
  ASSERT (AcpiParamBufferDescriptor != NULL);
  if (AcpiParamBufferDescriptor == NULL) {
    Status = EFI_OUT_OF_RESOURCES;
    goto Done;
  }

  // Allocate the PRM Configuration protocol structure for this PRM module
  PrmConfigProtocol = AllocateZeroPool (sizeof (*PrmConfigProtocol));
  ASSERT (PrmConfigProtocol != NULL);
  if (PrmConfigProtocol == NULL) {
    Status = EFI_OUT_OF_RESOURCES;
    goto Done;
  }

  CopyGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, &mPrmModuleGuid);

  // Populate the ACPI Parameter Buffer Descriptor structure
  CopyGuid (&AcpiParamBufferDescriptor->HandlerGuid, &mCheckParamBufferPrmHandlerGuid);
  AcpiParamBufferDescriptor->AcpiParameterBufferAddress = (UINT64)(UINTN)AcpiParameterBuffer;

  // Populate the PRM Module Context Buffers structure
  PrmConfigProtocol->ModuleContextBuffers.AcpiParameterBufferDescriptorCount = 1;
  PrmConfigProtocol->ModuleContextBuffers.AcpiParameterBufferDescriptors     = AcpiParamBufferDescriptor;

  //
  // Install the PRM Configuration Protocol for this module. This indicates the configuration
  // library has completed resource initialization for the PRM module.
  //
  Status = gBS->InstallProtocolInterface (
                  &mPrmConfigProtocolHandle,
                  &gPrmConfigProtocolGuid,
                  EFI_NATIVE_INTERFACE,
                  (VOID *)PrmConfigProtocol
                  );

Done:
  if (EFI_ERROR (Status)) {
    if (AcpiParameterBuffer != NULL) {
      FreePool (AcpiParameterBuffer);
    }

    if (AcpiParamBufferDescriptor != NULL) {
      FreePool (AcpiParamBufferDescriptor);
    }

    if (PrmConfigProtocol != NULL) {
      FreePool (PrmConfigProtocol);
    }
  }

  return Status;
}
