/** @file
  Memory status code worker in PEI.

  Copyright (c) 2006, Intel Corporation                                                         
  All rights reserved. This program and the accompanying materials                          
  are licensed and made available under the terms and conditions of the BSD License         
  which accompanies this distribution.  The full text of the license may be found at        
  http://opensource.org/licenses/bsd-license.php                                            
                                                                                            
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

  Module Name:  MemoryStatusCodeWorker.c

**/

#include "PeiStatusCode.h"

/**
  Create one memory status code GUID'ed HOB, use PacketIndex 
  to identify the packet.

  @param   PacketIndex    Index of records packet. 
 
  @return                 Always return pointer of memory status code packet.

**/
STATIC
MEMORY_STATUSCODE_PACKET_HEADER *
CreateMemoryStatusCodePacket (
  UINT16 PacketIndex
  )
{
  MEMORY_STATUSCODE_PACKET_HEADER *PacketHeader;

  //
  // Build GUID'ed HOB with PCD defined size.
  //
  PacketHeader =
    (MEMORY_STATUSCODE_PACKET_HEADER *) BuildGuidHob (
                                          &gMemoryStatusCodeRecordGuid, 
                                          PcdGet16 (PcdStatusCodeMemorySize) * 
                                          1024 +
                                          sizeof (MEMORY_STATUSCODE_PACKET_HEADER)
                                          );
  ASSERT (PacketHeader != NULL);

  PacketHeader->MaxRecordsNumber = (PcdGet16 (PcdStatusCodeMemorySize) * 1024)/ sizeof (MEMORY_STATUSCODE_RECORD);
  PacketHeader->PacketIndex      = PacketIndex;
  PacketHeader->RecordIndex      = 0;

  return PacketHeader;
}



/**
  Initialize memory status code.
  Create one GUID'ed HOB with PCD defined size. If create required size 
  GUID'ed HOB failed, then ASSERT().
 
  @return           The function always return EFI_SUCCESS

**/
EFI_STATUS
MemoryStatusCodeInitializeWorker (
  VOID
  )
{
  //
  // Create first memory status code GUID'ed HOB.
  //
  CreateMemoryStatusCodePacket (0);

  return EFI_SUCCESS;
}


/**
  Report status code into GUID'ed HOB..
 
  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below.
 
  @param  Value         Describes the current status of a hardware or software entity.  
                        This included information about the class and subclass that is used to classify the entity 
                        as well as an operation.  For progress codes, the operation is the current activity. 
                        For error codes, it is the exception.  For debug codes, it is not defined at this time. 
                        Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.  
                        Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification.
 
  @param  Instance      The enumeration of a hardware or software entity within the system.  
                        A system may contain multiple entities that match a class/subclass pairing. 
                        The instance differentiates between them.  An instance of 0 indicates that instance information is unavailable, 
                        not meaningful, or not relevant.  Valid instance numbers start with 1.
 
  @return               The function always return EFI_SUCCESS.

**/
EFI_STATUS
MemoryStatusCodeReportWorker (
  IN EFI_STATUS_CODE_TYPE     CodeType,
  IN EFI_STATUS_CODE_VALUE    Value,
  IN UINT32                   Instance
  )
{

  EFI_PEI_HOB_POINTERS              Hob;
  MEMORY_STATUSCODE_PACKET_HEADER   *PacketHeader;
  MEMORY_STATUSCODE_RECORD          *Record     = NULL;
  UINT16                            PacketIndex = 0;;

  //
  // Journal GUID'ed HOBs to find empty record entry, if found, then save status code in it.
  // otherwise, create a new GUID'ed HOB.
  //
  Hob.Raw = GetFirstGuidHob (&gMemoryStatusCodeRecordGuid);
  while (Hob.Raw != NULL) {
    PacketHeader = (MEMORY_STATUSCODE_PACKET_HEADER *) GET_GUID_HOB_DATA (Hob.Guid);

    //
    // Check whether pccket is full or not.
    //
    if (PacketHeader->RecordIndex < PacketHeader->MaxRecordsNumber) {
      Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1);
      Record = &Record[PacketHeader->RecordIndex++];
      break;
    }
    //
    // Cache number of found packet in PacketIndex.
    //
    PacketIndex++;

    Hob.Raw = GetNextGuidHob (&gMemoryStatusCodeRecordGuid, Hob.Raw);
  }

  if (NULL == Record) {
    //
    // In order to save status code , create new packet. 
    //
    PacketHeader = CreateMemoryStatusCodePacket (PacketIndex);

    Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1); 
    Record = &Record[PacketHeader->RecordIndex++];
  }

  Record->CodeType = CodeType;
  Record->Instance = Instance;
  Record->Value    = Value;

  return EFI_SUCCESS;
}
