/** @file
  Hob guid for Information about the graphics mode.

  Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This HOB is introduced in in PI Version 1.4.

**/

#ifndef _GRAPHICS_INFO_HOB_GUID_H_
#define _GRAPHICS_INFO_HOB_GUID_H_

#include <Protocol/GraphicsOutput.h>

#define EFI_PEI_GRAPHICS_INFO_HOB_GUID \
  { \
    0x39f62cce, 0x6825, 0x4669, { 0xbb, 0x56, 0x54, 0x1a, 0xba, 0x75, 0x3a, 0x07 } \
  }

#define EFI_PEI_GRAPHICS_DEVICE_INFO_HOB_GUID \
  { \
    0xe5cb2ac9, 0xd35d, 0x4430, { 0x93, 0x6e, 0x1d, 0xe3, 0x32, 0x47, 0x8d, 0xe7 } \
  }

typedef struct {
  EFI_PHYSICAL_ADDRESS                    FrameBufferBase;
  UINT32                                  FrameBufferSize;
  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION    GraphicsMode;
} EFI_PEI_GRAPHICS_INFO_HOB;

typedef struct {
  UINT16    VendorId;                                       ///< Ignore if the value is 0xFFFF.
  UINT16    DeviceId;                                       ///< Ignore if the value is 0xFFFF.
  UINT16    SubsystemVendorId;                              ///< Ignore if the value is 0xFFFF.
  UINT16    SubsystemId;                                    ///< Ignore if the value is 0xFFFF.
  UINT8     RevisionId;                                     ///< Ignore if the value is 0xFF.
  UINT8     BarIndex;                                       ///< Ignore if the value is 0xFF.
} EFI_PEI_GRAPHICS_DEVICE_INFO_HOB;

extern EFI_GUID  gEfiGraphicsInfoHobGuid;
extern EFI_GUID  gEfiGraphicsDeviceInfoHobGuid;

#endif
