/** @file
  This code supports a the private implementation 
  of the Data Hub protocol
  
Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
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.             

**/

#ifndef _DATA_HUB_H_
#define _DATA_HUB_H_


#include <FrameworkDxe.h>

#include <Protocol/DataHub.h>

#include <Library/DebugLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>

#define DATA_HUB_INSTANCE_SIGNATURE SIGNATURE_32 ('D', 'H', 'u', 'b')
typedef struct {
  UINT32                Signature;

  EFI_HANDLE            Handle;

  //
  // Produced protocol(s)
  //
  EFI_DATA_HUB_PROTOCOL DataHub;

  //
  // Private Data
  //
  //
  // Updates to GlobalMonotonicCount, LogListHead, and FilterDriverListHead
  //  must be locked.
  //
  EFI_LOCK              DataLock;

  //
  // Runing Monotonic Count to use for each error record.
  //  Increment AFTER use in an error record.
  //
  UINT64                GlobalMonotonicCount;

  //
  // List of EFI_DATA_ENTRY structures. This is the data log! The list
  //  must be in assending order of LogMonotonicCount.
  //
  LIST_ENTRY            DataListHead;

  //
  // List of EFI_DATA_HUB_FILTER_DRIVER structures. Represents all
  //  the registered filter drivers.
  //
  LIST_ENTRY            FilterDriverListHead;

} DATA_HUB_INSTANCE;

#define DATA_HUB_INSTANCE_FROM_THIS(this) CR (this, DATA_HUB_INSTANCE, DataHub, DATA_HUB_INSTANCE_SIGNATURE)

//
// Private data structure to contain the data log. One record per
//  structure. Head pointer to the list is the Log member of
//  EFI_DATA_ENTRY. Record is a copy of the data passed in.
//
#define EFI_DATA_ENTRY_SIGNATURE  SIGNATURE_32 ('D', 'r', 'e', 'c')
typedef struct {
  UINT32                  Signature;
  LIST_ENTRY              Link;

  EFI_DATA_RECORD_HEADER  *Record;

  UINTN                   RecordSize;

} EFI_DATA_ENTRY;

#define DATA_ENTRY_FROM_LINK(link)  CR (link, EFI_DATA_ENTRY, Link, EFI_DATA_ENTRY_SIGNATURE)

//
// Private data to contain the filter driver Event and it's
//  associated EFI_TPL.
//
#define EFI_DATA_HUB_FILTER_DRIVER_SIGNATURE  SIGNATURE_32 ('D', 'h', 'F', 'd')

typedef struct {
  UINT32          Signature;
  LIST_ENTRY      Link;

  //
  // Store Filter Driver Event and Tpl level it can be Signaled at.
  //
  EFI_EVENT       Event;
  EFI_TPL         Tpl;

  //
  // Monotonic count on the get next operation for Event.
  //  Zero indicates get next has not been called for this event yet.
  //
  UINT64          GetNextMonotonicCount;

  //
  // Filter driver will register what class filter should be used.
  //
  UINT64          ClassFilter;

  //
  // Filter driver will register what record guid filter should be used.
  //
  EFI_GUID        FilterDataRecordGuid;

} DATA_HUB_FILTER_DRIVER;

#define FILTER_ENTRY_FROM_LINK(link)  CR (link, DATA_HUB_FILTER_DRIVER, Link, EFI_DATA_HUB_FILTER_DRIVER_SIGNATURE)

#endif
