/*
 * (C) Copyright 2001
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */
/*******************************************************************************
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.

*******************************************************************************/
 
 /*
 * Dink_command.c - driver for special Marvell coammnds taken from Dink.
 */
 
#include <config.h>
#include <common.h>
#include <command.h>

#include "mvSysHwConfig.h"
#if defined(MV_INCLUDE_MONT_EXT)

#include "mvTypes.h"
#include "mvCtrlEnvLib.h"
#include "mvCpuIf.h"
#include "cpu/mvCpu.h"
#include "mv_fs.h"

#if defined(MV_INCLUDE_MONT_MMU)
extern void pageTableInit(void);
#endif
#if defined(MV_INCLUDE_MONT_MPU)
extern void MPU_Init(void);
#endif
/* global */

int g_stack_cachable = 0;


#if defined(MV_INCLUDE_MONT_MMU)

/***********************************************************************************/
/* hook function that is called after CPU detection and Serial init and before     */
/* initializing of the DRAM.							   */
/***********************************************************************************/

int PTexist(void)
{
	char *env;
#ifdef MV_PT
	env = getenv("enaPT");
#ifdef CONFIG_MV_LE
	/* if LE page table disable is the default. ( MIPS - unstable, PPC need to change the page settings) */
	if( ( (strcmp(env,"yes") == 0) || (strcmp(env,"Yes") == 0) ) ){	
#else
	/* if BE page table enable is the default. */
	if(!env || ( (strcmp(env,"yes") == 0) || (strcmp(env,"Yes") == 0) ) ){
#endif
		return 1;
	}
#endif
	return 0;
}
#endif
/***********************************************************************************/
/* hook function that is called after rellocating to the DRAM, Flash Init, PCI init*/
/* and malloc init are done, and before Gig port init.				   */
/***********************************************************************************/
void mon_extension_after_relloc(void)
{
#if defined(MV_INCLUDE_MONT_FFS)
	unsigned int status;	
#endif
	
#if defined(MV_INCLUDE_MONT_MMU)
	if ((mvOsCpuPartGet() == CPU_PART_ARM926) ||
		(mvOsCpuPartGet() == CPU_PART_MRVL131))
	{
		/* Page Table */
		if(PTexist() )
		{
			pageTableInit();

			/* set the stack to be cachable */
			__asm__ __volatile__ ( " orr  sp, sp, #0x80000000 " :  );
            g_stack_cachable = 1;
			setenv("enaPT","yes");
		}
		else
			setenv("enaPT","no");
	}
#endif /* MV_INCLUDE_MONT_MMU */

#if defined(MV_INCLUDE_MONT_MPU)
	else if (mvOsCpuPartGet() == CPU_PART_ARM946)
	{
		char *env;
		env = getenv("enaMPU");

        	if ((!env)||( (strcmp(env,"yes") == 0) || (strcmp(env,"Yes") == 0) ))
		{
				setenv("enaMPU","yes");
				MPU_Init();
		}
	}
#endif /* MV_INCLUDE_MONT_MPU */

#if defined(CONFIG_CMD_BSP)
#if defined(MV_INCLUDE_MONT_FFS)
    	if (whoAmI() == MASTER_CPU)
	{
		status = mvFSInit(FS_NO_CACHE);


		if(!(status == FS_NO_VALID_FAT_STRING || status == FS_OFFSET_OUT_OF_RANGE))
		{
			printf("File system present and initialized on the main Flash Memory\n");	
		}
		else
		{
			printf("No File system on the main Flash Memory\n");	
		}
	}
#endif /* MV_INCLUDE_MONT_FFS */
#endif
    	return;
}
#endif /* #if defined(MV_INCLUDE_MONT_EXT) */

