#include <command.h>

#define MV_SW_RST_CONTROL_REG_CORE0     0x0020800
#define MV_FABRIC_RST_CONTROL_REG       0x0020840
#define MV_FABRIC_CONTROL_REG           0x0020200
#define MV_FABRIC_CONFIG_REG            0x0020204
#define MV_CLOCK_GATING_CONTROL         0x0018220

/*Gbe0, Gbe1, Gbe2, Gbe3 Port RX Queue Configuration*/
unsigned int MV_GBEx_PORT_RXQ_CONFIG_REG[4] = {0x0071400, 0x0075400, 0x0031400, 0x0035400 };

//#define MV_MEMIO32_WRITE(addr, data) printf("mw 0x%X 0x%X\n", (addr), (data))
#define MV_MEMIO32_WRITE(addr, data) ((*((volatile unsigned int*)(addr))) = ((unsigned int)(data)))
#define MV_MEMIO32_READ(addr)        ((*((volatile unsigned int*)(addr))))

int do_warmRst(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int i, gbe, gatingReg;
	unsigned int base = simple_strtoul( argv[1], NULL, 16 );
    /*Set all 4 cores in reset*/
    for ( i=0; i<=3; i++){
        MV_MEMIO32_WRITE((base | (MV_SW_RST_CONTROL_REG_CORE0 + 8*i)), (0x101));
    }

    /*Fix only used GBE default value in RX queue control registers*/
    gatingReg = MV_MEMIO32_READ(MV_CLOCK_GATING_CONTROL);
    for( gbe=0; gbe <=3; gbe++){
        /*If Gbe powered down(bits 1,2,3,4) - skip.*/
        if( (gatingReg>>(gbe+1) & 0x1) ){
            continue;
        }
        for ( i=0; i<=7; i++){
            MV_MEMIO32_WRITE((base | ( MV_GBEx_PORT_RXQ_CONFIG_REG[gbe] + 4*i)), (0x40));
        }
    }
    /*Reset all units in Fabric*/
    MV_MEMIO32_WRITE((base | (MV_FABRIC_RST_CONTROL_REG)), (0xFFFFFFFF));

    /*Set Fabric control and config to defaults*/
    MV_MEMIO32_WRITE((base | (MV_FABRIC_CONTROL_REG)), (0x2));
    MV_MEMIO32_WRITE((base | (MV_FABRIC_CONFIG_REG)), (0x3));

    /*Kick in Fabric units*/
    MV_MEMIO32_WRITE((base | (MV_FABRIC_RST_CONTROL_REG)), (0x0));

    /*Kick in Core0 to start boot process*/
    MV_MEMIO32_WRITE((base | (MV_SW_RST_CONTROL_REG_CORE0)), (0x0));    

    return 1;
}

U_BOOT_CMD(
		   warmRst,      2,     1,      do_warmRst,
	 "warmRst	- Warn Reset AXP card over PEX.\n",
  " PEX base address of AXP internal registers \n"
		  "\tWarm reset of AXP card connected via PEX, requeres previously configured PEX base address.\n"
		  );

