/** @file
  This is definition for service binding for Hash driver.

Copyright (c) 2015 - 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 that 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 _HASH2_DRIVER_H_
#define _HASH2_DRIVER_H_

#include <Uefi.h>

#include <Protocol/ServiceBinding.h>
#include <Protocol/Hash2.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/DevicePathLib.h>
#include <Library/UefiLib.h>

#define HASH2_SERVICE_DATA_SIGNATURE  SIGNATURE_32 ('H', 'S', '2', 'S')

typedef struct {
  UINT32                        Signature;
  EFI_HANDLE                    ServiceHandle;
  EFI_SERVICE_BINDING_PROTOCOL  ServiceBinding;

  LIST_ENTRY                    ChildrenList;
} HASH2_SERVICE_DATA;

#define HASH2_SERVICE_DATA_FROM_THIS(a) \
  CR ( \
  (a), \
  HASH2_SERVICE_DATA, \
  ServiceBinding, \
  HASH2_SERVICE_DATA_SIGNATURE \
  )

#define HASH2_INSTANCE_DATA_SIGNATURE   SIGNATURE_32 ('H', 's', '2', 'I')

typedef struct {
  UINT32                           Signature;
  HASH2_SERVICE_DATA               *Hash2ServiceData;
  EFI_HANDLE                       Handle;
  LIST_ENTRY                       InstEntry;
  EFI_HASH2_PROTOCOL               Hash2Protocol;
  VOID                             *HashContext;
  VOID                             *HashInfoContext;
  BOOLEAN                          Updated;
} HASH2_INSTANCE_DATA;

#define HASH2_INSTANCE_DATA_FROM_THIS(a) \
  CR ( \
  (a), \
  HASH2_INSTANCE_DATA, \
  Hash2Protocol, \
  HASH2_INSTANCE_DATA_SIGNATURE \
  )

#define HASH2_INSTANCE_DATA_FROM_LINK(a) \
  CR ( \
  (a), \
  HASH2_INSTANCE_DATA, \
  InstEntry, \
  HASH2_INSTANCE_DATA_SIGNATURE \
  )

/**
  Creates a child handle with a set of I/O services.

  @param[in]       This              Protocol instance pointer.
  @param[in, out]  ChildHandle       Pointer to the handle of the child to create. If
                                     it is NULL, then a new handle is created. If
                                     it is not NULL, then the I/O services are added
                                     to the existing child handle.

  @retval EFI_SUCCES                 The protocol was added to ChildHandle.
  @retval EFI_INVALID_PARAMETER      ChildHandle is NULL.
  @retval EFI_OUT_OF_RESOURCES       There are not enough resources available to
                                     create the child.
  @retval Others                     The child handle was not created.

**/
EFI_STATUS
EFIAPI
Hash2ServiceBindingCreateChild (
  IN     EFI_SERVICE_BINDING_PROTOCOL    *This,
  IN OUT EFI_HANDLE                      *ChildHandle
  );

/**
  Destroys a child handle with a set of I/O services.

  The DestroyChild() function does the opposite of CreateChild(). It removes a
  protocol that was installed by CreateChild() from ChildHandle. If the removed
  protocol is the last protocol on ChildHandle, then ChildHandle is destroyed.

  @param[in]  This               Pointer to the EFI_SERVICE_BINDING_PROTOCOL
                                 instance.
  @param[in]  ChildHandle        Handle of the child to destroy.

  @retval EFI_SUCCES             The protocol was removed from ChildHandle.
  @retval EFI_UNSUPPORTED        ChildHandle does not support the protocol that
                                 is being removed.
  @retval EFI_INVALID_PARAMETER  ChildHandle is NULL.
  @retval EFI_ACCESS_DENIED      The protocol could not be removed from the
                                 ChildHandle because its services are being
                                 used.
  @retval Others                 The child handle was not destroyed.

**/
EFI_STATUS
EFIAPI
Hash2ServiceBindingDestroyChild (
  IN EFI_SERVICE_BINDING_PROTOCOL    *This,
  IN EFI_HANDLE                      ChildHandle
  );

extern EFI_HASH2_PROTOCOL mHash2Protocol;

#endif
