/********************************************************************************
 * 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.
 ******************************************************************************/

/*
*
* Public C file to initialise the MPCore Interrupt Distributor.
* This file contains one function.
*
* Description:
* This code sets up the primary interrupt controller (GIC) in the MPCore
* to generate an IRQ to CPU 0 or 1
*
* Implementation:
* After the MPCore GIC is initialised with enableMPGIC(), you can use
* setEnableMPGIC() and clearEnableMPGIC() to set and clear interrupt
* sources in the ARM11 MPCore.
*
* Inputs:
* None.
*
* Outputs:
* MPCore Interrupt Distributor registers.
*
* Return Value:
* None.
*/
#include "Galois_memmap.h"
#include "soc.h"
#include "apbRegBase.h"
#include "sdio_ctrl/sdmmc_api.h"
#include "gicDiag.h"
#include "pic.h"
#include "sdio_ctrl/util.h"
#include "lgpl_printf.h"

#ifdef	EMMC_DEBUG
#define	printf lgpl_printf
#else
#define	dbg_printf lgpl_printf
#define	printf lgpl_printf
#endif


/*
 * Macro to remove unused variable warning for function args not used for
 * specific platform.
 */
#define UNUSED(var) do { (void)(var); } while(0)

#define MASTER_MP_CORE 0

void writeEnableMPGIC(unsigned int id, unsigned int offset)
{
    unsigned int register_number;   // which GIC register: 0 = register for IDs 0-31, 1 = register for IDs 32-63
    unsigned int bit_position;      // bit position in that register: 0 = least significant bit (D0)
    
    register_number = id / GIC_INTERRUPTS_PER_WORD;       // compiler will optimise divide by a power of 2 into shift right
    bit_position = id - register_number * GIC_INTERRUPTS_PER_WORD;
    offset = offset + register_number * GIC_BYTES_PER_WORD;
    GIC_REGISTER(offset) = 1 << bit_position;
}


//enable an interrupt: 0 to 63
void setEnableMPGIC(unsigned int id)
{
    writeEnableMPGIC(id, GIC_SetEnable0_31_offset);
}


//disable an interrupt: 0 to 63
void clearEnableMPGIC(unsigned int id)
{
    writeEnableMPGIC(id, GIC_ClearEnable0_31_offset);
}

//this function turns an interrupt on or off for a particular CPU 
//by routing the interrupt to that CPU at distributor interface
//this is only useful for intId >=32, 
//for intId <= 32, Int target regs are read-only

int diag_GICSetInt(int MPid, int intId, int enable)
{
	unsigned int reg_num;
	unsigned int bit_pos;
	unsigned int temp;
	
	if(intId<32)
	{
		//dbg_printf(PRN_RES, "Cannot set interrupt target for interrupt id%d(less than 32)\n", intId);
		return 1;
	}
	
	reg_num = intId / GIC_CPU_TARGETS_PER_WORD;
	bit_pos = (intId % GIC_CPU_TARGETS_PER_WORD)*8;
	
	//get current value
	temp = GIC_REGISTER(GIC_CPUTarget0_3_offset+reg_num*GIC_BYTES_PER_WORD);
	
	if(enable)
	{
		//set the bit
		temp |= 1<<(bit_pos+MPid);
	
		if((temp&(0x3<<bit_pos))==0x3) 
			dbg_printf("Warning: intr %d is sent to both CPUs\n", intId);
	}
	else
	{
		//clear the bit
		temp &= ~(1<<(bit_pos+MPid));
	}
	
	GIC_REGISTER(GIC_CPUTarget0_3_offset+reg_num*GIC_BYTES_PER_WORD)=temp;
	return 0;
}

//this function initialize interrupt 0 to 63
//1. Distributor Interface
//   a) Enable All interrupts.
//   b) Do not route any interrupt to CPU0 and CPU1, use this as the control to turn on interrupt at CPU0 or CPU1
//   c) All level-sensitive and 1-N (only one CPU will handle the interrupt)
//   d) All interrupts have highest priority
//2. CPU Interface
//   a) Priority Mask is lowest
//	 b) Pre-empty All interrupts

void initMPGIC(void)
{
   
        unsigned int temp;
  	unsigned int MPid=0;
        UNUSED(temp);
  	
  	GIC_CPUControl = GIC_CPU_CONTROL_DISABLE;       // Disable interrupts in GIC CPU Interface
    
	if(MPid==MASTER_MP_CORE)
	{
    
    	GIC_Control    = GIC_CONTROL_DISABLE;           // Disable interrupts in GIC Distributor

    	GIC_ClearEnable0_31  = GIC_CLEAR_ENABLE_ALL;    // Disable all interrupt sources
    	GIC_ClearEnable32_63 = GIC_CLEAR_ENABLE_ALL;
    	GIC_ClearEnable64_95 = GIC_CLEAR_ENABLE_ALL;
    	GIC_ClearEnable96_127 = GIC_CLEAR_ENABLE_ALL;
    
    	GIC_ClearPending0_31  = GIC_CLEAR_PENDING_ALL;  // Clear all pending interrupts
    	GIC_ClearPending32_63 = GIC_CLEAR_PENDING_ALL;
    	GIC_ClearPending64_95 = GIC_CLEAR_PENDING_ALL;
    	GIC_ClearPending96_127 = GIC_CLEAR_PENDING_ALL;
    	
	}
	
	//Note that SetEnable0_31 is banked for each core
   	GIC_SetEnable0_31  = GIC_SET_ENABLE_ALL;    	// Enable all interrupt sources
    if( MPid==MASTER_MP_CORE)
    {
    	GIC_SetEnable32_63 = GIC_SET_ENABLE_ALL;
    	GIC_SetEnable64_95 = GIC_SET_ENABLE_ALL;
    	GIC_SetEnable96_127 = GIC_SET_ENABLE_ALL;
	}

#if 0  //don't need this 	
	GIC_Security0_31 = 0xFFFFFFFF; //all NS interrupts, will generate IRQ
	if(MPid==MASTER_MP_CORE)
    {
		//please check which is IRQ_dHubIntrAvio0 and set it to NS and highest priority
    	GIC_Security32_63 = 0xFFFFFFFF; //all NS interrupts, will generate IRQ
    	GIC_Security64_95 = 0xFFFFFFFF; //all NS interrupts, will generate IRQ
    	GIC_Security96_127 = 0xFFFFFFFF; //all NS interrupts, will generate IRQ

#if 0    	
    	//make IRQ_dHubIntrAvio0 Secure
    	if(MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0)<=63)
    	{
    		GIC_Security32_63 &= ~(1<<IRQ_dHubIntrAvio0);
    	}
    	else if(MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0)<=95)
    	{
    		GIC_Security64_95 &= ~(1<<(IRQ_dHubIntrAvio0&0x1f));
    	}
    	else if(MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0)<=127)
    	{
    		GIC_Security96_127 &= ~(1<<(IRQ_dHubIntrAvio0&0x1f));
    	}
#endif
    	
	}

	if(MPid==MASTER_MP_CORE)
	{
   	  // Set all interrupt priorities to high. 
    	for (temp = GIC_Priority0_3_offset; temp <= GIC_Priority124_127_offset; temp += GIC_PRIORITIES_PER_WORD)
    	{
        	GIC_REGISTER(temp) = GIC_PRIORITY_HIGH_ALL;
    	}
   // 	GIC_REGISTER(GIC_Priority64_67_offset) &= 0xFFFF00FF; //make SPI 65 (IRQ_dHubIntrAvio0-33) highest priority

    	//set interrupt goes to none of the CPU0, will be turned on later
    	for (temp = GIC_CPUTarget0_3_offset; temp <= GIC_CPUTarget124_127_offset; temp += GIC_CPU_TARGETS_PER_WORD)  
    	{
        	GIC_REGISTER(temp) = GIC_CPU_TARGETS_NONE;
    	}

    	// Set all interrupt sources to be level-sensitive and 1-N software model
    	// 1-N/N-N bit may be obsolete
    	for (temp = GIC_Configuration32_47_offset; temp <= GIC_Configuration112_127_offset; temp += 4 )
    	{
    		GIC_REGISTER(temp) = GIC_CONFIG_ALL_LEVEL_1N;
    	}

	}

	// These CPU interface registers are banked for each core
    // Enable all interrupt priorities (apart from the lowest priority, 0xF)
    // Note that bits [3:0] of this register are not implemented but could be in future
    GIC_PriorityMask = GIC_PRIORITY_MASK_LOWEST;
    
    GIC_BinaryPoint = GIC_PREEMPT_ALL;          // Enable pre-emption on all interrupts
#endif
    //have both Secure and NS interrupt to CPU
    //CPU will ack both S and NS interruts
    //S interrupts will generate FIQ
    GIC_CPUControl = (GIC_CPU_CONTROL_ENABLE 
    				| GIC_CPU_CONTROL_ENABLE_NS
    				| GIC_CPU_CONTROL_ACKCTL
    				| GIC_CPU_CONTROL_FIQEN);    // Enable interrupts in GIC CPU interface
    
	if(MPid==MASTER_MP_CORE)
	{
    	GIC_Control    = (GIC_CONTROL_ENABLE | GIC_CONTROL_ENABLE_NS);        // Enable NS and S interrupts in GIC Distributor
	}
}

//__irq void GIC_IRQ_Handler(void)

void GIC_IRQ_Handler(void)
{
    unsigned int MPCoreInterruptID;

    //GIC_Acknowledge is GIC_REGISTER(0x010C)
    //GIC_Acknowledge is effectively banked.
    //that is for CPU0 and CPU1, they are really different registers even with same address
    MPCoreInterruptID = GIC_Acknowledge; // reading ID from Acknowledge register changes the interrupt from Pending to Active
    //dbg_printf(" Gic IRQ received, MPCoreInterruptID = %d\n", MPCoreInterruptID);
    //printf(" %s: MPCoreInterruptID = 0x%x\n",__FUNCTION__, MPCoreInterruptID);
    switch ((MPCoreInterruptID & GIC_INT_ACK_MASK))
    {
#if BOOTLOADER_SHOWLOGO
    	case MP_BERLIN_INTR_ID(IRQ_dHubIntrAvio0):
        {
			extern void showlogo_isr();
			showlogo_isr();
            break;
        }
#endif
#ifdef  EMMC_BOOT
    	case MP_BERLIN_INTR_ID(IRQ_emmc_int):
			MM4_ISR(2);
            break;
#endif
        default:
            break;
    }


    // writing ID to End of Interrupt register changes the interrupt from Active to Inactive
    GIC_EndInterrupt = MPCoreInterruptID;
}



