/*******************************************************************************
* Copyright (C) Marvell International Ltd. and its affiliates
*
* Marvell GPL License Option
*
* If you received this File from Marvell, you may opt to use, redistribute and/or
* modify this File in accordance with the terms and conditions of the General
* Public License Version 2, June 1991 (the "GPL License"), a copy of which is
* available along with the File in the license.txt file or by writing to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
* on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
* WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
* DISCLAIMED.  The GPL License provides additional details about this warranty
* disclaimer.
********************************************************************************/

#include "fastlogo.h"

#include "galois_io.h"
#include "api_dhub.h"
#include "api_avio_dhub.h"
#include "Galois_memmap.h"
#include "gicDiag.h"
#include "pic.h"

#include "thinvpp.h"
#include "util.h"
#include "error_logo_data.h"
#include "normal_logo_data.h"
#include "avpll.h"

#ifndef bTST
#define bTST(x, b) (((x) >> (b)) & 1)
#endif

#ifndef BFM_HOST_Bus_Write32
#define BFM_HOST_Bus_Write32 GA_REG_WORD32_WRITE
#endif

volatile unsigned logo_isr_count;

#define printf(fmt...)

#ifndef  EMMC_BOOT
extern void  IRQ_Handler(void);
static void InstallHighHandler(unsigned int handlerAddr, unsigned int vector)
{
	//load PC with content at current PC + 0x38,
	//since current PC is vector+0x8, the handler should be at vector+0x40
	BFM_HOST_Bus_Write32(vector, 0xE59FF038);
	BFM_HOST_Bus_Write32(vector+0x40, handlerAddr);
}

static void EnableIRQ(void)
{
	__asm__
	__volatile__(
		"MRS		r0, CPSR"	   "\n\t"
		"BIC		r0, r0, #0x80"  "\n\t"
		"MSR		CPSR, r0"	   "\n\t"
		:
		:
		:"r0"
	);
}
#endif

static void showlogo_init_irq(void)
{
	unsigned cpu_id=0;

	#ifdef  EMMC_BOOT
	//bootloader.c should have called do_emmcinit() to setup the irq
	#else
	//printf("%s, InstallHighHandler\n", __FUNCTION__) ;
	InstallHighHandler((unsigned int)IRQ_Handler, MEMMAP_HIGH_EXCEPT_IRQ_REG);

	//GIC distribution interface is only needed to be initialized once
	//but the CPU interface needs to be initalized by both CPU cores
	//CPU interface registers are banked (same address)
	//So we will have both first and second CPU to call the same funtion
	//printf("%s, initMPGIC\n", __FUNCTION__) ;
	initMPGIC();

	//printf("%s, EnableIRQ\n", __FUNCTION__) ;
	EnableIRQ();
	#endif

	printf("[showlogo] Enable IRQ_dHubIntrAvio0(0x%x) for cpu %u\n", MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0), cpu_id);
	diag_GICSetInt(cpu_id, MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0), INT_ENABLE);
}


static VBUF_INFO vbuf;
int showlogo_start(int error)
{
	VPP_WIN_ATTR showlogo_attr;
	VPP_WIN showlogo_win;
	int yuv_logo_width, yuv_logo_height, yuv_logo_stride;
	void *yuv_logo;

	if (error) {
		yuv_logo_width = error_yuv_logo_width;
		yuv_logo_height = error_yuv_logo_height;
		yuv_logo = error_yuv_logo;
	} else {
		yuv_logo_width = normal_yuv_logo_width;
		yuv_logo_height = normal_yuv_logo_height;
		yuv_logo = normal_yuv_logo;
	}
	yuv_logo_stride = yuv_logo_width * 2;

	printf("[showlogo] start\n");
	logo_isr_count = 0;
	showlogo_init_irq();

	vbuf.m_disp_offset	= 0;
	vbuf.m_active_left	= (720 - yuv_logo_width)/2; // at center
	vbuf.m_active_top	= (480 - yuv_logo_height)/2; // at center

	// adjust the following three fields to reflect the actual logo dimensions
	vbuf.m_buf_stride	= yuv_logo_stride;
	vbuf.m_active_width	= yuv_logo_width;
	vbuf.m_active_height	= yuv_logo_height;

	vbuf.alpha   = 255;
	vbuf.bgcolor = 0x00800080; // black
	vbuf.m_pbuf_start	= (void *) yuv_logo;
	printf("[showlogo] frame start at 0x%x\n", vbuf.m_pbuf_start) ;
	MV_THINVPP_SetMainDisplayFrame(&vbuf);

	showlogo_win.x = 0;
	showlogo_win.y = 0;
	showlogo_win.width  = 720;
	showlogo_win.height = 480;
	showlogo_attr.bgcolor = vbuf.bgcolor;
	showlogo_attr.alpha   = vbuf.alpha;
	MV_THINVPP_OpenDispWindow(PLANE_MAIN, &showlogo_win, &showlogo_attr);
	return 0;
}

int showlogo_stop()
{
	printf("[showlogo] isr_count=%u\n", logo_isr_count) ;

	MV_THINVPP_CloseDispWindow();
	MV_THINVPP_Stop();
	MV_THINVPP_Destroy();

	MV_THINVPP_Create(MEMMAP_VPP_REG_BASE, THINVPP_OPTION_DEFAULT);
	MV_THINVPP_Reset();
	MV_THINVPP_Config();
	MV_THINVPP_SetCPCBOutputResolution(CPCB_1, RES_525P5994, OUTPUT_BIT_DEPTH_8BIT);

	printf("[showlogo] stopped\n");
	return 0;
}

void showlogo_isr(void)
{
	int instat;
	HDL_semaphore *pSemHandle;

	++logo_isr_count;

	/* VPP interrupt handling  */
	pSemHandle = dhub_semaphore(&VPP_dhubHandle.dhub);
	instat = semaphore_chk_full(pSemHandle, -1);

	if (bTST(instat, avioDhubSemMap_vpp_vppCPCB0_intr))
	{
		semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr, 1);
		semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr);
		THINVPP_CPCB_ISR_service(thinvpp_obj, CPCB_1);
	}
}

void fastlogo_init(void)
{
	printf("[fastlogo] init.");

	AVPLL_Enable();

	DhubInitialization(0, VPP_DHUB_BASE, VPP_HBO_SRAM_BASE,
		&VPP_dhubHandle, VPP_config, VPP_NUM_OF_CHANNELS);
	DhubInitialization(0, AG_DHUB_BASE, AG_HBO_SRAM_BASE,
		&AG_dhubHandle, AG_config, AG_NUM_OF_CHANNELS);

	MV_THINVPP_Create(MEMMAP_VPP_REG_BASE, THINVPP_OPTION_SHOWLOGO);
	MV_THINVPP_Reset();
	MV_THINVPP_Config();
	MV_THINVPP_SetCPCBOutputResolution(CPCB_1, RES_525P5994, OUTPUT_BIT_DEPTH_8BIT);

	printf("[fastlogo] started.\n");
}
