#include "common.h"
#include "hardware.h"
#include "csl_chip.h"
#include "csl_cache.h"
#include "csl_cacheAux.h"

#pragma DATA_SECTION(CPBInfo, ".device_info")
#pragma DATA_ALIGN(CPBInfo, 8)
TCPBInfo CPBInfo;		// write from host

volatile int volatileDummy;

int Lamp1_Status, Lamp2_Status;

unsigned short ReadBoardID()
{
	return *((unsigned short *)0x300);
}

int cacheInvaliDate_ddr3(char *srcAddr, int nSize)
{
	// 내 것을 무효화하고 다른 코어가 쓴 데이타를 가져옴 (읽기)
	int i;
	int div;

	div = nSize / (1024 * 128);
	if(div == 0)
		CACHE_invL2((void *)srcAddr, nSize, CACHE_WAIT);

	else
	{
		for( i = 0; i < div; i ++)
			CACHE_invL2((void *)(srcAddr + i * (1024 * 128)), (1024 * 128), CACHE_NOWAIT);

		if((1024 * 128) * div < nSize)
			CACHE_invL2((void *)(srcAddr + i * (1024 * 128)), nSize - (i * (1024 * 128)), CACHE_NOWAIT);

		CACHE_invL2Wait(); // 위의 처리를 병렬 처리로 바꿔주는 대신에 여기서 기다리도록 함.
	}


	return 0;
}

int cacheWriteBack_ddr3(char *srcAddr, int nSize)
{
	// 다른 코어가 읽을 수 있도록 내 데이타를 씀 (쓰기)
	// srcAddr 에는 정상적인 값이 올라와있음

	int i;
	int div;

	div = nSize / (1024 * 128);
	if(div == 0)
		CACHE_wbL2(srcAddr, nSize, CACHE_WAIT);

	else
	{
		for( i = 0; i < div; i ++)
			CACHE_wbL2((void *)(srcAddr + i * (1024 * 128)), (1024 * 128), CACHE_NOWAIT);

		if((1024 * 128) * div < nSize)
			CACHE_wbL2((void *)(srcAddr + i * (1024 * 128)), nSize - (i * (1024 * 128)), CACHE_NOWAIT);

		CACHE_invL2Wait(); // 위의 처리를 병렬 처리로 바꿔주는 대신에 여기서 기다리도록 함.
	}


	return 0;
}

/*
void HardwareInit()
{
    unsigned int status = 0;

    //Enable L2
    *(unsigned int *)(0x01846008) = 0x1; //enable EDC
    status = *(unsigned int *)(0x01846004);

    unsigned int status = 0;

    *(unsigned int *)(L1PEDCMD) = 0x1;  //Set EN(bit0)=1

    //Check the status
    status = *(unsigned int *)(L1PEDSTAT);


}
*/
