/*******************************************************************************
* Copyright (C) 2017 - 2022 Xilinx, Inc.  All rights reserved.
* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc.  All rights reserved.
* SPDX-License-Identifier: MIT
*******************************************************************************/

/******************************************************************************/
/**
 *
 * @file xavbuf.h
 *
 * This file implements all the functions related to the Video Pipeline of the
 * DisplayPort Subsystem.
 *
 * Features supported by this driver
 *	- Live Video and Graphics input.
 *	- Non-Live Video Graphics input.
 *	- Output Formats Supported - RGB, YUV444, YUV4222.
 *
 *
 * <pre>
 * MODIFICATION HISTORY:
 *
 * Ver   Who  Date     Changes
 * ----- ---- -------- -----------------------------------------------
 * 1.0   aad  06/24/17 Initial release.
 * 2.0   aad  10/07/17 Added Enums for Video and Audio sources.
 * </pre>
 *
*******************************************************************************/
#ifndef XAVBUF_H_
/* Prevent circular inclusions by using protection macros. */
#define XAVBUF_H_

#ifdef __cplusplus
extern "C" {
#endif

/******************************* Include Files ********************************/
#include "xavbuf_hw.h"
#include "sleep.h"
/****************************** Type Definitions ******************************/
/**
 * This typedef describes all the Video Formats supported by the driver
 */
typedef enum {
	//Non-Live Video Formats
	CbY0CrY1,
	CrY0CbY1,
	Y0CrY1Cb,
	Y0CbY1Cr,
	YV16,
	YV24,
	YV16Ci,
	MONOCHROME,
	YV16Ci2,
	YUV444,
	RGB888,
	RGBA8880,
	RGB888_10BPC,
	YUV444_10BPC,
	YV16Ci2_10BPC,
	YV16Ci_10BPC,
	YV16_10BPC,
	YV24_10BPC,
	MONOCHROME_10BPC,
	YV16_420,
	YV16Ci_420,
	YV16Ci2_420,
	YV16_420_10BPC,
	YV16Ci_420_10BPC,
	YV16Ci2_420_10BPC,

	// Non-Live Graphics formats
	RGBA8888,
	ABGR8888,
	RGB888_GFX,
	BGR888,
	RGBA5551,
	RGBA4444,
	RGB565,
	BPP8,
	BPP4,
	BPP2,
	BPP1,
	YUV422,
	YOnly,

	//Live Input/Output Video/Graphics Formats
	RGB_6BPC,
	RGB_8BPC,
	RGB_10BPC,
	RGB_12BPC,
	YCbCr444_6BPC,
	YCbCr444_8BPC,
	YCbCr444_10BPC,
	YCbCr444_12BPC,
	YCbCr422_8BPC,
	YCbCr422_10BPC,
	YCbCr422_12BPC,
	YOnly_8BPC,
	YOnly_10BPC,
	YOnly_12BPC,
} XAVBuf_VideoFormat;

/**
 * This data structure describes video planes.
 */
typedef enum {
	Interleaved,
	SemiPlanar,
	Planar
} XAVBuf_VideoModes;

/**
 * This typedef describes the video source list
 */
typedef enum {
	XAVBUF_VIDSTREAM1_LIVE,
	XAVBUF_VIDSTREAM1_NONLIVE,
	XAVBUF_VIDSTREAM1_TPG,
	XAVBUF_VIDSTREAM1_NONE,
} XAVBuf_VideoStream;

/**
 * This typedef describes the graphics source list
 */
typedef enum {
	XAVBUF_VIDSTREAM2_DISABLEGFX = 0x0,
	XAVBUF_VIDSTREAM2_NONLIVE_GFX = 0x4,
	XAVBUF_VIDSTREAM2_LIVE_GFX = 0x8,
	XAVBUF_VIDSTREAM2_NONE = 0xC0,
} XAVBuf_GfxStream;

/**
 * This typedef describes the audio stream 1 source list
 */
typedef enum {
	XAVBUF_AUDSTREAM1_LIVE = 0x00,
	XAVBUF_AUDSTREAM1_NONLIVE = 0x10,
	XAVBUF_AUDSTREAM1_TPG = 0x20,
	XAVBUF_AUDSTREAM1_NO_AUDIO = 0x30,
} XAVBuf_AudioStream1;

/**
 * This typedef describes the audio stream 2 source list
 */
typedef enum {
	XAVBUF_AUDSTREAM2_NO_AUDIO = 0X00,
	XAVBUF_AUDSTREAM2_AUDIOGFX = 0X40,
} XAVBuf_AudioStream2;

/**
 * This typedef describes the attributes associated with the video formats.
 */
typedef struct {
	XAVBuf_VideoFormat VideoFormat;
	u8 Value;
	XAVBuf_VideoModes Mode;
	u32 SF[3];
	u8 SamplingEn;
	u8 IsRGB;
	u8 Swap;
	u8 BPP;
} XAVBuf_VideoAttribute;

/**
 * This typedef stores the attributes of an audio stream
 */
typedef struct {
	u32 Volume;
	u8 SwapLR;
} XAVBuf_AudioAttribute;

/**
 * This typedef stores the data associated with the Audio Video input modes.
 */
typedef struct {
	XAVBuf_VideoAttribute *NonLiveVideo, *NonLiveGraphics;
	XAVBuf_VideoAttribute *LiveVideo, *LiveGraphics;
	XAVBuf_AudioAttribute *Audio, *GraphicsAudio;
	XAVBuf_VideoStream VideoSrc;
        XAVBuf_GfxStream GraphicsSrc;
	XAVBuf_AudioStream1 AudioSrc1;
	XAVBuf_AudioStream2 AudioSrc2;
	u8 AudioClk, VideoClk;
} XAVBuf_AVModes;

/**
 * This structure stores the background color information.
 */
typedef struct {
	u16 RCr;
	u16 GY;
	u16 BCb;
} XAVBuf_BlenderBgClr;

/**
 * This typedef stores the AVBuf Configuration information.
 */
typedef struct {
#ifndef SDT
	u16 DeviceId;
#else
	char *Name;
#endif
	u32 BaseAddr;
#ifdef SDT
    u32 IntrId;     /** Bits[11:0] Interrupt-id Bits[15:12]
                   * trigger type and level flags */
    UINTPTR IntrParent;     /** Bit[0] Interrupt parent type Bit[64/32:1]
                   * Parent base address */
#endif
} XAVBuf_Config;

/**
 * This typedef stores all the attributes associated to the Blender block of the
 * DisplayPort Subsystem
 */
typedef struct {
	u8 GlobalAlphaEn;
	u8 Alpha;
	XAVBuf_VideoAttribute *OutputVideo;
} XAVBuf_Blender;

/**
 * The XAVBuf driver instance data. The user is required to allocate a variable
 * of this type for every XAVBUF instance in the system. A pointer to this type
 * is then passed to the driver API functions
 */
typedef struct {
	XAVBuf_Config Config;
	XAVBuf_AVModes AVMode;
	XAVBuf_Blender Blender;
} XAVBuf;


/**************************** Function Prototypes *****************************/

/* xavbuf.c: Setup and initialization functions. */
#ifndef SDT
void XAVBuf_CfgInitialize(XAVBuf *InstancePtr, u32 BaseAddr, u16 DeviceId);
#else
void XAVBuf_CfgInitialize(XAVBuf *InstancePtr, u32 BaseAddr);
#endif

/* xavbuf.c: Functions to setup the Input Video and Audio sources */
void XAVBuf_InputVideoSelect(XAVBuf *InstancePtr, XAVBuf_VideoStream VidStream,
			      XAVBuf_GfxStream GfxStream);
void XAVBuf_InputAudioSelect(XAVBuf *InstancePtr, XAVBuf_AudioStream1 AudStream,
				XAVBuf_AudioStream2 AudioStream2);

/* xavbuf.c: Functions to setup the Video Format attributes */
int XAVBuf_SetInputNonLiveVideoFormat(XAVBuf *InstancePtr,
				       XAVBuf_VideoFormat Format);
int XAVBuf_SetInputNonLiveGraphicsFormat(XAVBuf *InstancePtr,
				       XAVBuf_VideoFormat Format);
int XAVBuf_SetInputLiveVideoFormat(XAVBuf *InstancePtr,
				       XAVBuf_VideoFormat Format);
int XAVBuf_SetInputLiveGraphicsFormat(XAVBuf *InstancePtr,
				       XAVBuf_VideoFormat Format);
int XAVBuf_SetOutputVideoFormat(XAVBuf *InstancePtr, XAVBuf_VideoFormat Format);
XAVBuf_VideoAttribute *XAVBuf_GetLiveVideoAttribute(XAVBuf_VideoFormat Format);
XAVBuf_VideoAttribute *XAVBuf_GetNLiveVideoAttribute(XAVBuf_VideoFormat Format);
XAVBuf_VideoAttribute *XAVBuf_GetNLGraphicsAttribute(XAVBuf_VideoFormat Format);

/* xavbuf.c: Functions to setup the clock sources for video and audio */
void XAVBuf_SetAudioVideoClkSrc(XAVBuf *InstancePtr, u8 VideoClk, u8 AudioClk);

/* xavbuf.c: Functions that setup Video and Graphics pipeline depending on the
 * sources and format selected.
 */
void XAVBuf_ConfigureVideoPipeline(XAVBuf *InstancePtr);
void XAVBuf_ConfigureGraphicsPipeline(XAVBuf *InstancePtr);

/* Functions to setup Blender Properties */
void XAVBuf_BlendSetBgColor(XAVBuf *InstancePtr, XAVBuf_BlenderBgClr *Color);
void XAVBuf_SetBlenderAlpha(XAVBuf *InstancePtr, u8 Alpha, u8 Enable);
void XAVBuf_SoftReset(XAVBuf *InstancePtr);
void XABuf_LineResetDisable(XAVBuf *InstancePtr, u8 Disable);
void XAVBuf_ConfigureOutputVideo(XAVBuf *InstancePtr);

/* Audio Configuration functions */
void XAVBuf_AudioSoftReset(XAVBuf *InstancePtr);
void XAVBuf_AudioMixerVolumeControl(XAVBuf *InstancePtr, u8 Channel0Volume,
					u8 Channel1Volume);

/* DPDMA Interface functions */
void XAVBuf_EnableGraphicsBuffers(XAVBuf *InstancePtr, u8 Enable);
void XAVBuf_EnableVideoBuffers(XAVBuf *InstancePtr, u8 Enable);
void XAVBuf_EnableAudio0Buffers(XAVBuf *InstancePtr, u8 Enable);
void XAVBuf_EnableAudio1Buffers(XAVBuf *InstancePtr, u8 Enable);

#ifdef __cplusplus
}
#endif

#endif //XAVBUF_H_
