/** @file

 Copyright (c) 2011-2020, Arm Limited. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent

 **/

#pragma once

#include <Protocol/GraphicsOutput.h>

#define LCD_VRAM_SIZE  SIZE_8MB

// Modes definitions
#define VGA    0
#define SVGA   1
#define XGA    2
#define SXGA   3
#define WSXGA  4
#define UXGA   5
#define HD     6
#define WVGA   7
#define QHD    8
#define WSVGA  9
#define HD720  10
#define WXGA   11

// VGA Mode: 640 x 480
#define VGA_H_RES_PIXELS   640
#define VGA_V_RES_PIXELS   480
#define VGA_OSC_FREQUENCY  23750000                 /* 0x016A6570 */

#define VGA_H_SYNC         ( 80 - 1)
#define VGA_H_FRONT_PORCH  ( 16 - 1)
#define VGA_H_BACK_PORCH   ( 64 - 1)

#define VGA_V_SYNC         (  4 - 1)
#define VGA_V_FRONT_PORCH  (  3 - 1)
#define VGA_V_BACK_PORCH   ( 13 - 1)

// SVGA Mode: 800 x 600
#define SVGA_H_RES_PIXELS   800
#define SVGA_V_RES_PIXELS   600
#define SVGA_OSC_FREQUENCY  38250000                /* 0x0247A610 */

#define SVGA_H_SYNC         ( 80 - 1)
#define SVGA_H_FRONT_PORCH  ( 32 - 1)
#define SVGA_H_BACK_PORCH   (112 - 1)

#define SVGA_V_SYNC         (  4 - 1)
#define SVGA_V_FRONT_PORCH  (  3 - 1)
#define SVGA_V_BACK_PORCH   ( 17 - 1)

// XGA Mode: 1024 x 768
#define XGA_H_RES_PIXELS   1024
#define XGA_V_RES_PIXELS   768
#define XGA_OSC_FREQUENCY  63500000                 /* 0x03C8EEE0 */

#define XGA_H_SYNC         (104 - 1)
#define XGA_H_FRONT_PORCH  ( 48 - 1)
#define XGA_H_BACK_PORCH   (152 - 1)

#define XGA_V_SYNC         (  4 - 1)
#define XGA_V_FRONT_PORCH  (  3 - 1)
#define XGA_V_BACK_PORCH   ( 23 - 1)

// SXGA Mode: 1280 x 1024
#define SXGA_H_RES_PIXELS   1280
#define SXGA_V_RES_PIXELS   1024
#define SXGA_OSC_FREQUENCY  109000000                /* 0x067F3540 */

#define SXGA_H_SYNC         (136 - 1)
#define SXGA_H_FRONT_PORCH  ( 80 - 1)
#define SXGA_H_BACK_PORCH   (216 - 1)

#define SXGA_V_SYNC         (  7 - 1)
#define SXGA_V_FRONT_PORCH  (  3 - 1)
#define SXGA_V_BACK_PORCH   ( 29 - 1)

// WSXGA+ Mode: 1680 x 1050
#define WSXGA_H_RES_PIXELS   1680
#define WSXGA_V_RES_PIXELS   1050
#define WSXGA_OSC_FREQUENCY  147000000               /* 0x08C30AC0 */

#define WSXGA_H_SYNC         (170 - 1)
#define WSXGA_H_FRONT_PORCH  (104 - 1)
#define WSXGA_H_BACK_PORCH   (274 - 1)

#define WSXGA_V_SYNC         (  5 - 1)
#define WSXGA_V_FRONT_PORCH  (  4 - 1)
#define WSXGA_V_BACK_PORCH   ( 41 - 1)

// UXGA Mode: 1600 x 1200
#define UXGA_H_RES_PIXELS   1600
#define UXGA_V_RES_PIXELS   1200
#define UXGA_OSC_FREQUENCY  161000000                /* 0x0998AA40 */

#define UXGA_H_SYNC         (168 - 1)
#define UXGA_H_FRONT_PORCH  (112 - 1)
#define UXGA_H_BACK_PORCH   (280 - 1)

#define UXGA_V_SYNC         (  4 - 1)
#define UXGA_V_FRONT_PORCH  (  3 - 1)
#define UXGA_V_BACK_PORCH   ( 38 - 1)

// HD Mode: 1920 x 1080
#define HD_H_RES_PIXELS   1920
#define HD_V_RES_PIXELS   1080
#define HD_OSC_FREQUENCY  165000000                  /* 0x09D5B340 */

#define HD_H_SYNC         ( 79 - 1)
#define HD_H_FRONT_PORCH  (128 - 1)
#define HD_H_BACK_PORCH   (328 - 1)

#define HD_V_SYNC         (  5 - 1)
#define HD_V_FRONT_PORCH  (  3 - 1)
#define HD_V_BACK_PORCH   ( 32 - 1)

// WVGA Mode: 800 x 480
#define WVGA_H_RES_PIXELS   800
#define WVGA_V_RES_PIXELS   480
#define WVGA_OSC_FREQUENCY  29500000                 /* 0x01C22260 */
#define WVGA_H_SYNC         ( 72 - 1)
#define WVGA_H_FRONT_PORCH  ( 24 - 1)
#define WVGA_H_BACK_PORCH   ( 96 - 1)
#define WVGA_V_SYNC         (  7 - 1)
#define WVGA_V_FRONT_PORCH  (  3 - 1)
#define WVGA_V_BACK_PORCH   ( 10 - 1)

// QHD Mode: 960 x 540
#define QHD_H_RES_PIXELS   960
#define QHD_V_RES_PIXELS   540
#define QHD_OSC_FREQUENCY  40750000                  /* 0x026DCBB0 */
#define QHD_H_SYNC         ( 96 - 1)
#define QHD_H_FRONT_PORCH  ( 32 - 1)
#define QHD_H_BACK_PORCH   (128 - 1)
#define QHD_V_SYNC         (  5 - 1)
#define QHD_V_FRONT_PORCH  (  3 - 1)
#define QHD_V_BACK_PORCH   ( 14 - 1)

// WSVGA Mode: 1024 x 600
#define WSVGA_H_RES_PIXELS   1024
#define WSVGA_V_RES_PIXELS   600
#define WSVGA_OSC_FREQUENCY  49000000                /* 0x02EBAE40 */
#define WSVGA_H_SYNC         (104 - 1)
#define WSVGA_H_FRONT_PORCH  ( 40 - 1)
#define WSVGA_H_BACK_PORCH   (144 - 1)
#define WSVGA_V_SYNC         ( 10 - 1)
#define WSVGA_V_FRONT_PORCH  (  3 - 1)
#define WSVGA_V_BACK_PORCH   ( 11 - 1)

// HD720 Mode: 1280 x 720
#define HD720_H_RES_PIXELS   1280
#define HD720_V_RES_PIXELS   720
#define HD720_OSC_FREQUENCY  74500000                 /* 0x0470C7A0 */
#define HD720_H_SYNC         (128 - 1)
#define HD720_H_FRONT_PORCH  ( 64 - 1)
#define HD720_H_BACK_PORCH   (192 - 1)
#define HD720_V_SYNC         (  5 - 1)
#define HD720_V_FRONT_PORCH  (  3 - 1)
#define HD720_V_BACK_PORCH   ( 20 - 1)

// WXGA Mode: 1280 x 800
#define WXGA_H_RES_PIXELS   1280
#define WXGA_V_RES_PIXELS   800
#define WXGA_OSC_FREQUENCY  83500000                 /* 0x04FA1BE0 */
#define WXGA_H_SYNC         (128 - 1)
#define WXGA_H_FRONT_PORCH  ( 72 - 1)
#define WXGA_H_BACK_PORCH   (200 - 1)
#define WXGA_V_SYNC         (  6 - 1)
#define WXGA_V_FRONT_PORCH  (  3 - 1)
#define WXGA_V_BACK_PORCH   ( 22 - 1)

// Colour Masks
#define LCD_24BPP_RED_MASK       0x00FF0000
#define LCD_24BPP_GREEN_MASK     0x0000FF00
#define LCD_24BPP_BLUE_MASK      0x000000FF
#define LCD_24BPP_RESERVED_MASK  0xFF000000

#define LCD_16BPP_555_RED_MASK       0x00007C00
#define LCD_16BPP_555_GREEN_MASK     0x000003E0
#define LCD_16BPP_555_BLUE_MASK      0x0000001F
#define LCD_16BPP_555_RESERVED_MASK  0x00000000

#define LCD_16BPP_565_RED_MASK       0x0000F800
#define LCD_16BPP_565_GREEN_MASK     0x000007E0
#define LCD_16BPP_565_BLUE_MASK      0x0000001F
#define LCD_16BPP_565_RESERVED_MASK  0x00008000

#define LCD_12BPP_444_RED_MASK       0x00000F00
#define LCD_12BPP_444_GREEN_MASK     0x000000F0
#define LCD_12BPP_444_BLUE_MASK      0x0000000F
#define LCD_12BPP_444_RESERVED_MASK  0x0000F000

/** The enumeration maps the PL111 LcdBpp values used in the LCD Control
  Register
**/
typedef enum {
  LcdBitsPerPixel_1 = 0,
  LcdBitsPerPixel_2,
  LcdBitsPerPixel_4,
  LcdBitsPerPixel_8,
  LcdBitsPerPixel_16_555,
  LcdBitsPerPixel_24,
  LcdBitsPerPixel_16_565,
  LcdBitsPerPixel_12_444,
  LcdBitsPerPixel_Max
} LCD_BPP;

// Display timing settings.
typedef struct {
  UINT32    Resolution;
  UINT32    Sync;
  UINT32    BackPorch;
  UINT32    FrontPorch;
} SCAN_TIMINGS;

/** Platform related initialization function.

  @param[in] Handle              Handle to the LCD device instance.

  @retval EFI_SUCCESS            Platform library initialized successfully.
  @retval !(EFI_SUCCESS)         Other errors.
**/
EFI_STATUS
LcdPlatformInitializeDisplay (
  IN EFI_HANDLE  Handle
  );

/** Allocate VRAM memory in DRAM for the framebuffer
  (unless it is reserved already).

  The allocated address can be used to set the framebuffer.

  @param[out] VramBaseAddress      A pointer to the framebuffer address.
  @param[out] VramSize             A pointer to the size of the frame
                                   buffer in bytes

  @retval EFI_SUCCESS              Frame buffer memory allocated successfully.
  @retval !(EFI_SUCCESS)           Other errors.
**/
EFI_STATUS
LcdPlatformGetVram (
  OUT EFI_PHYSICAL_ADDRESS  *VramBaseAddress,
  OUT UINTN                 *VramSize
  );

/** Return total number of modes supported.

  Note: Valid mode numbers are 0 to MaxMode - 1
  See Section 12.9 of the UEFI Specification 2.7

  @retval UINT32             Mode Number.
**/
UINT32
LcdPlatformGetMaxMode (
  VOID
  );

/** Set the requested display mode.

  @param[in] ModeNumber            Mode Number.

  @retval  EFI_SUCCESS             Mode set successfully.
  @retval  EFI_INVALID_PARAMETER   Requested mode not found.
  @retval  !(EFI_SUCCESS)          Other errors.
**/
EFI_STATUS
LcdPlatformSetMode (
  IN UINT32  ModeNumber
  );

/** Return information for the requested mode number.

  @param[in]  ModeNumber         Mode Number.
  @param[out] Info               Pointer for returned mode information
                                 (on success).

  @retval EFI_SUCCESS             Mode information for the requested mode
                                  returned successfully.
  @retval EFI_INVALID_PARAMETER   Requested mode not found.
**/
EFI_STATUS
LcdPlatformQueryMode (
  IN  UINT32                                ModeNumber,
  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info
  );

/** Return display timing information for the requested mode number.

  @param[in]  ModeNumber          Mode Number.

  @param[out] Horizontal          Pointer to horizontal timing parameters.
                                  (Resolution, Sync, Back porch, Front porch)
  @param[out] Vertical            Pointer to vertical timing parameters.
                                  (Resolution, Sync, Back porch, Front porch)


  @retval EFI_SUCCESS             Display timing information for the requested
                                  mode returned successfully.
  @retval EFI_INVALID_PARAMETER   Requested mode not found.
**/
EFI_STATUS
LcdPlatformGetTimings (
  IN  UINT32        ModeNumber,
  OUT SCAN_TIMINGS  **Horizontal,
  OUT SCAN_TIMINGS  **Vertical
  );

/** Return bits per pixel information for a mode number.

  @param[in]  ModeNumber          Mode Number.

  @param[out] Bpp                 Pointer to value bits per pixel information.

  @retval EFI_SUCCESS             Bit per pixel information for the requested
                                  mode returned successfully.
  @retval EFI_INVALID_PARAMETER   Requested mode not found.
**/
EFI_STATUS
LcdPlatformGetBpp (
  IN  UINT32   ModeNumber,
  OUT LCD_BPP  *Bpp
  );
