/** @file
  This file declares Graphics PPI.
  This PPI is the main interface exposed by the Graphics PEIM to be used by the
  other firmware modules.

  Copyright (c) 2015, 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.

  @par Revision Reference:
  This PPI is introduced in PI Version 1.4.

**/

#ifndef __PEI_GRAPHICS_PPI_H__
#define __PEI_GRAPHICS_PPI_H__

#include <Protocol/GraphicsOutput.h>

#define EFI_PEI_GRAPHICS_PPI_GUID \
  { \
    0x6ecd1463, 0x4a4a, 0x461b, { 0xaf, 0x5f, 0x5a, 0x33, 0xe3, 0xb2, 0x16, 0x2b } \
  }

typedef struct _EFI_PEI_GRAPHICS_PPI EFI_PEI_GRAPHICS_PPI;

/**
  The GraphicsPpiInit initializes the graphics subsystem in phases.

  @param[in] GraphicsPolicyPtr    GraphicsPolicyPtr points to a configuration data
                                  block of policy settings required by Graphics PEIM.

  @retval EFI_SUCCESS             The invocation was successful.
  @retval EFI_INVALID_PARAMETER   The phase parameter is not valid.
  @retval EFI_NOT_ABORTED         The stages was not called in the proper order.
  @retval EFI_NOT_FOUND           The PeiGraphicsPlatformPolicyPpi is not located.
  @retval EFI_DEVICE_ERROR        The initialization failed due to device error.
  @retval EFI_NOT_READY           The previous init stage is still in progress and not
                                  ready for the current initialization phase yet. The
                                  platform code should call this again sometime later.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_GRAPHICS_INIT) (
  IN VOID                            *GraphicsPolicyPtr
  );

/**
  The GraphicsPpiGetMode returns the mode information supported by the Graphics PEI
  Module.

  @param[in, out] Mode            Pointer to EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE data.

  @retval EFI_SUCCESS             Valid mode information was returned.
  @retval EFI_INVALID_PARAMETER   The Mode parameter is not valid.
  @retval EFI_DEVICE_ERROR        A hardware error occurred trying to retrieve the video
                                  mode.
  @retval EFI_NOT_READY           The Graphics Initialization is not competed and Mode
                                  information is not yet available.The platform code
                                  should call this again after the Graphics
                                  initialization is done.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_GRAPHICS_GET_MODE) (
  IN OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE  *Mode
  );

///
/// This PPI is the main interface exposed by the Graphics PEIM to be used by the other
/// firmware modules.
///
struct _EFI_PEI_GRAPHICS_PPI {
  EFI_PEI_GRAPHICS_INIT              GraphicsPpiInit;
  EFI_PEI_GRAPHICS_GET_MODE          GraphicsPpiGetMode;
};

extern EFI_GUID gEfiPeiGraphicsPpiGuid;

#endif
