blob: 7d8c805c46c1d85eafd7b53bb5d81cfa97380793 [file] [log] [blame]
diff --git a/arch/arm/cpu/arm926ejs/aspeed/COMMINF.H b/arch/arm/cpu/arm926ejs/aspeed/COMMINF.H
new file mode 100644
index 0000000..44b7540
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/COMMINF.H
@@ -0,0 +1,641 @@
+/*
+ * 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
+ */
+#ifndef COMMINF_H
+#define COMMINF_H
+
+#include "SWFUNC.H"
+
+#if defined(LinuxAP)
+#endif
+#ifdef SLT_UBOOT
+#endif
+#ifdef SLT_DOS
+ #include <stdio.h>
+ #include <time.h>
+ #include <dos.h> // For delay()
+#endif
+
+#include "TYPEDEF.H"
+#include "LIB.H"
+
+//---------------------------------------------------------
+// Print Message
+//---------------------------------------------------------
+// for function
+#define FP_LOG 0
+#define FP_IO 1
+#define STD_OUT 2
+
+#ifdef SLT_UBOOT
+ #define PRINT printf
+ #define OUT_OBJ
+ #define FILE_VAR
+
+ #define GET_OBJ( i ) \
+ do { \
+ if ( i != STD_OUT ) \
+ return; \
+ } while ( 0 );
+
+#else
+ #define PRINT fprintf
+ #define OUT_OBJ fp,
+ #define FILE_VAR FILE *fp;
+
+ #define GET_OBJ( i ) \
+ switch( i ) { \
+ case FP_LOG: \
+ fp = fp_log; \
+ break; \
+ case FP_IO: \
+ fp = fp_io; \
+ break; \
+ case STD_OUT: \
+ fp = stdout; \
+ break; \
+ default : break; \
+ }
+#endif
+
+//---------------------------------------------------------
+// Function
+//---------------------------------------------------------
+#ifdef SLT_UBOOT
+ #define DELAY( x ) udelay( x * 1000 ) // For Uboot, the unit of udelay() is us.
+ #define GET_CAHR getc
+#endif
+#ifdef SLT_DOS
+ #define DELAY( x ) delay( x ) // For DOS, the unit of delay() is ms.
+ #define GET_CAHR getchar
+#endif
+
+//---------------------------------------------------------
+// Default argument
+//---------------------------------------------------------
+#define DEF_USER_DEF_PACKET_VAL 0x66666666 //0xff00ff00, 0xf0f0f0f0, 0xcccccccc, 0x55aa55aa, 0x5a5a5a5a, 0x66666666
+#define DEF_IOTIMINGBUND 5 //0/1/3/5/7
+#define DEF_PHY_ADR 0
+#define DEF_TESTMODE 0 //[0]0: no burst mode, 1: 0xff, 2: 0x55, 3: random, 4: ARP, 5: ARP, 6: IO timing, 7: IO timing+IO Strength
+#define DEF_LOOP_MAX 1
+#define DEF_MAC_LOOP_BACK 0 //GCtrl bit6
+#define DEF_SKIP_CHECK_PHY 0 //GCtrl bit4
+#define DEF_INIT_PHY 1 //GCtrl bit3
+
+#define SET_1GBPS 0 // 1G bps
+#define SET_100MBPS 1 // 100M bps
+#define SET_10MBPS 2 // 10M bps
+#define SET_1G_100M_10MBPS 3 // 1G and 100M and 10M bps
+#define DEF_SPEED SET_1G_100M_10MBPS
+#define DEF_ARPNUMCNT 0
+
+//---------------------------------------------------------
+// MAC information
+//---------------------------------------------------------
+#if ( AST1010_IOMAP == 1 )
+ // AST1010 only has a MAC
+ #define MAC_BASE1 AST_MAC1_BASE
+ #define MAC_BASE2 AST_MAC1_BASE
+ #define MAC_BASE3 AST_MAC1_BASE
+ #define MAC_BASE4 AST_MAC1_BASE
+#endif
+
+#if ( AST1010_IOMAP == 2 )
+ // AST1010 only has a MAC
+ #define MAC_BASE1 0x0830000
+ #define MAC_BASE2 0x0830000
+ #define MAC_BASE3 0x0830000
+ #define MAC_BASE4 0x0830000
+#endif
+
+#ifndef AST1010_IOMAP
+ #define MAC_BASE1 0x1e660000
+ #define MAC_BASE2 0x1e680000
+ #define MAC_BASE3 0x1e670000
+ #define MAC_BASE4 0x1e690000
+#endif
+
+#define MDC_Thres 0x3f
+#define MAC_PHYWr 0x08000000
+#define MAC_PHYRd 0x04000000
+
+#define MAC_PHYWr_New 0x00009400
+#define MAC_PHYRd_New 0x00009800
+#define MAC_PHYBusy_New 0x00008000
+
+//#define MAC_30h 0x00001010
+//#define MAC_34h 0x00000000
+//#define MAC_38h 0x00d22f00 //default 0x22f00
+//#define MAC_38h 0x00022f00 //default 0x22f00
+
+#define MAC_40h 0x40000000
+
+#ifdef Enable_BufMerge
+ #define MAC_48h 0x007702F1 //default 0xf1
+#else
+ #ifdef AST1010_IOMAP
+ #define MAC_48h 0x000002F1 //default 0xf1
+ #else
+ #define MAC_48h 0x000001F1 //default 0xf1
+ #endif
+#endif
+
+//---------------------------------------------------------
+// Data information
+//---------------------------------------------------------
+#ifdef SelectSimpleBoundary
+ #define ZeroCopy_OFFSET 0
+#else
+ #define ZeroCopy_OFFSET ( (BurstEnable) ? 0 : 2 )
+#endif
+
+// --------------------------------- DRAM_MapAdr = TDES_BASE1
+// | TX descriptor ring #1 |
+// ------------------------- DRAM_MapAdr + 0x040000 = RDES_BASE1
+// | RX descriptor ring #1 |
+// ------------------------- DRAM_MapAdr + 0x080000 = TDES_BASE2
+// | TX descriptor ring #2 |
+// ------------------------- DRAM_MapAdr + 0x0C0000 = RDES_BASE2
+// | RX descriptor ring #2 |
+// --------------------------------- DRAM_MapAdr + 0x100000 = DMA_BASE -------------------------
+// | #1 | \ | #1 Tx |
+// DMA buffer | | DMA_BufSize | LOOP = 0 |
+// ( Tx/Rx ) ------------------------- / --------------------------------------------------
+// | #2 | | #2 Rx | #2 Tx |
+// | | | LOOP = 0 | LOOP = 1 |
+// ------------------------- --------------------------------------------------
+// | #3 | | #3 Rx |
+// | | | LOOP = 1 |
+// ------------------------- -------------------------
+// | #4 | ..........
+// | |
+// -------------------------
+// | #5 |
+// | |
+// -------------------------
+// | #6 |
+// | |
+// -------------------------
+// .
+// .
+// -------------------------
+// | #n, n = DMA_BufNum |
+// | |
+// ---------------------------------
+
+#if ( AST1010_IOMAP == 1 )
+ #define DRAM_MapAdr ( CONFIG_DRAM_SWAP_BASE + 0x00200000 ) // We use 0xA00000 to 0xEFFFFF
+ #define CPU_BUS_ADDR_SDRAM_OFFSET 0x01000000 // In ReMapping function, MAC engine need Bus address
+ // But Coldfire need CPU address, so need to do offset
+#endif
+
+#if ( AST1010_IOMAP == 2 )
+ #define DRAM_MapAdr 0x0A00000 // We use 0xA00000 to 0xEFFFFF
+ #define CPU_BUS_ADDR_SDRAM_OFFSET 0
+#endif
+
+#ifndef AST1010_IOMAP
+ #ifdef AST3200_IOMAP
+ #define DRAM_MapAdr 0x80000000
+ #else
+ #define DRAM_MapAdr 0x44000000
+ #endif
+
+ #define CPU_BUS_ADDR_SDRAM_OFFSET 0
+#endif
+
+ #define TDES_BASE1 ( 0x00000000 + DRAM_MapAdr )
+ #define RDES_BASE1 ( 0x00040000 + DRAM_MapAdr )
+ #define TDES_BASE2 ( 0x00080000 + DRAM_MapAdr )
+ #define RDES_BASE2 ( 0x000C0000 + DRAM_MapAdr )
+
+ #define TDES_IniVal ( 0xb0000000 + FRAME_LEN_Cur )
+ #define RDES_IniVal ( 0x00000fff )
+ #define EOR_IniVal ( 0x40008000 )
+ #define HWOwnTx(dat) ( (dat) & 0x80000000 )
+ #define HWOwnRx(dat) ( !((dat) & 0x80000000) )
+ #define HWEOR(dat) ( dat & 0x40000000 )
+
+//---------------------------------------------------------
+// Error Flag Bits
+//---------------------------------------------------------
+#define Err_MACMode ( 1 << 0 ) // MAC interface mode mismatch
+#define Err_PHY_Type ( 1 << 1 ) // Unidentifiable PHY
+#define Err_MALLOC_FrmSize ( 1 << 2 ) // Malloc fail at frame size buffer
+#define Err_MALLOC_LastWP ( 1 << 3 ) // Malloc fail at last WP buffer
+#define Err_Check_Buf_Data ( 1 << 4 ) // Received data mismatch
+#define Err_Check_Des ( 1 << 5 ) // Descriptor error
+#define Err_NCSI_LinkFail ( 1 << 6 ) // NCSI packet retry number over flows
+#define Err_NCSI_Check_TxOwnTimeOut ( 1 << 7 ) // Time out of checking Tx owner bit in NCSI packet
+#define Err_NCSI_Check_RxOwnTimeOut ( 1 << 8 ) // Time out of checking Rx owner bit in NCSI packet
+#define Err_NCSI_Check_ARPOwnTimeOut ( 1 << 9 ) // Time out of checking ARP owner bit in NCSI packet
+#define Err_NCSI_No_PHY ( 1 << 10 ) // Can not find NCSI PHY
+#define Err_NCSI_Channel_Num ( 1 << 11 ) // NCSI Channel Number Mismatch
+#define Err_NCSI_Package_Num ( 1 << 12 ) // NCSI Package Number Mismatch
+#define Err_PHY_TimeOut ( 1 << 13 ) // Time out of read/write/reset PHY register
+#define Err_RXBUF_UNAVA ( 1 << 14 ) // MAC00h[2]:Receiving buffer unavailable
+#define Err_RPKT_LOST ( 1 << 15 ) // MAC00h[3]:Received packet lost due to RX FIFO full
+#define Err_NPTXBUF_UNAVA ( 1 << 16 ) // MAC00h[6]:Normal priority transmit buffer unavailable
+#define Err_TPKT_LOST ( 1 << 17 ) // MAC00h[7]:Packets transmitted to Ethernet lost
+#define Err_DMABufNum ( 1 << 18 ) // DMA Buffer is not enough
+#define Err_IOMargin ( 1 << 19 ) // IO timing margin is not enough
+#define Err_IOMarginOUF ( 1 << 20 ) // IO timing testing out of boundary
+#define Err_MHCLK_Ratio ( 1 << 21 ) // Error setting of MAC AHB bus clock (SCU08[18:16])
+
+#define Check_Des_TxOwnTimeOut ( 1 << 0 ) // Time out of checking Tx owner bit
+#define Check_Des_RxOwnTimeOut ( 1 << 1 ) // Time out of checking Rx owner bit
+#define Check_Des_RxErr ( 1 << 2 ) // Input signal RxErr
+#define Check_Des_OddNibble ( 1 << 3 ) // Nibble bit happen
+#define Check_Des_CRC ( 1 << 4 ) // CRC error of frame
+#define Check_Des_RxFIFOFull ( 1 << 5 ) // Rx FIFO full
+#define Check_Des_FrameLen ( 1 << 6 ) // Frame length mismatch
+
+#define NCSI_LinkFail_Get_Version_ID ( 1 << 0 ) // Time out when Get Version ID
+#define NCSI_LinkFail_Get_Capabilities ( 1 << 1 ) // Time out when Get Capabilities
+#define NCSI_LinkFail_Select_Active_Package ( 1 << 2 ) // Time out when Select Active Package
+#define NCSI_LinkFail_Enable_Set_MAC_Address ( 1 << 3 ) // Time out when Enable Set MAC Address
+#define NCSI_LinkFail_Enable_Broadcast_Filter ( 1 << 4 ) // Time out when Enable Broadcast Filter
+#define NCSI_LinkFail_Enable_Network_TX ( 1 << 5 ) // Time out when Enable Network TX
+#define NCSI_LinkFail_Enable_Channel ( 1 << 6 ) // Time out when Enable Channel
+#define NCSI_LinkFail_Disable_Network_TX ( 1 << 7 ) // Time out when Disable Network TX
+#define NCSI_LinkFail_Disable_Channel ( 1 << 8 ) // Time out when Disable Channel
+
+//---------------------------------------------------------
+// SCU information
+//---------------------------------------------------------
+#if ( AST1010_IOMAP == 1 )
+ #define SCU_BASE AST_SCU_BASE
+#endif
+#if ( AST1010_IOMAP == 2 )
+ #define SCU_BASE 0x0841000
+#endif
+
+#ifndef AST1010_IOMAP
+ #define SCU_BASE 0x1e6e2000
+#endif
+
+#define SCU_48h_AST1010 0x00000200
+#define SCU_48h_AST2300 0x00222255
+
+//#ifdef SLT_DOS
+// #define SCU_80h 0x00000000
+// #define SCU_88h 0x00000000
+// #define SCU_90h 0x00000000
+// #define SCU_74h 0x00000000
+//#else
+// #define SCU_80h 0x0000000f //AST2300[3:0]MAC1~4 PHYLINK
+// #define SCU_88h 0xc0000000 //AST2300[31]MAC1 MDIO, [30]MAC1 MDC
+// #define SCU_90h 0x00000004 //AST2300[2 ]MAC2 MDC/MDIO
+// #define SCU_74h 0x06300000 //AST3000[20]MAC2 MDC/MDIO, [21]MAC2 MII, [25]MAC1 PHYLINK, [26]MAC2 PHYLINK
+//#endif
+
+//---------------------------------------------------------
+// DMA Buffer information
+//---------------------------------------------------------
+#ifdef FPGA
+ #define DRAM_KByteSize ( 56 * 1024 )
+#else
+ #ifdef AST1010_IOMAP
+ #define DRAM_KByteSize ( 3 * 1024 ) // DATA buffer only use 0xB00000 to 0xE00000
+ #else
+ #define DRAM_KByteSize ( 18 * 1024 )
+ #endif
+#endif
+
+#define DMA_BASE ( 0x00100000 + DRAM_MapAdr )
+
+#ifdef Enable_Jumbo
+ #define DMA_PakSize ( 10 * 1024 )
+#else
+ #define DMA_PakSize ( 2 * 1024 ) // The size of one LAN packet
+#endif
+
+#ifdef SelectSimpleBoundary
+ #define DMA_BufSize ( ( ( ( ( DES_NUMBER + 15 ) * DMA_PakSize ) >> 2 ) << 2 ) ) //vary by DES_NUMBER
+#else
+ #define DMA_BufSize (4 + ( ( ( ( DES_NUMBER + 15 ) * DMA_PakSize ) >> 2 ) << 2 ) ) //vary by DES_NUMBER
+#endif
+
+#define DMA_BufNum ( ( DRAM_KByteSize * 1024 ) / ( DMA_BufSize ) ) //vary by DES_NUMBER
+#define GET_DMA_BASE_SETUP ( DMA_BASE )
+#define GET_DMA_BASE(x) ( DMA_BASE + ( ( ( ( x ) % DMA_BufNum ) + 1 ) * DMA_BufSize ) )//vary by DES_NUMBER
+
+#define SEED_START 8
+#define DATA_SEED(seed) ( ( seed ) | (( seed + 1 ) << 16 ) )
+#define DATA_IncVal 0x00020001
+//#define DATA_IncVal 0x01000001 //fail
+//#define DATA_IncVal 0x10000001 //fail
+//#define DATA_IncVal 0x10000000 //fail
+//#define DATA_IncVal 0x80000000 //fail
+//#define DATA_IncVal 0x00000001 //ok
+//#define DATA_IncVal 0x01000100 //ok
+//#define DATA_IncVal 0x01010000 //ok
+//#define DATA_IncVal 0x01010101 //ok
+//#define DATA_IncVal 0x00000101 //ok
+//#define DATA_IncVal 0x00001111 //fail
+//#define DATA_IncVal 0x00000011 //fail
+//#define DATA_IncVal 0x10100101 //fail
+//#define DATA_IncVal 0xfeff0201
+//#define DATA_IncVal 0x00010001
+#define PktByteSize ( ( ( ( ZeroCopy_OFFSET + FRAME_LEN_Cur - 1 ) >> 2 ) + 1) << 2 )
+
+//---------------------------------------------------------
+// Delay (ms)
+//---------------------------------------------------------
+//#define Delay_DesGap 1000 //off
+//#define Delay_DesGap 700 //off
+
+//#define Delay_ChkRxOwn 10
+//#define Delay_ChkTxOwn 10
+#define Delay_CntMax 100000000
+//#define Delay_CntMax 1000
+//#define Delay_CntMax 8465
+//#define Delay_CntMaxIncVal 50000
+#define Delay_CntMaxIncVal 47500
+
+#define Delay_PHYRst 100
+#define Delay_PHYRd 5
+
+#define Delay_SCU 11
+#define Delay_MACRst 1
+#define Delay_MACDump 100
+
+//#define Delay_DES 1
+
+//---------------------------------------------------------
+// Time Out
+//---------------------------------------------------------
+#define TIME_OUT_Des 10000
+#define TIME_OUT_PHY_RW 10000
+#define TIME_OUT_PHY_Rst 10000
+
+//#define TIME_OUT_NCSI 300000
+#define TIME_OUT_NCSI 30000
+
+
+
+//---------------------------------------------------------
+// Chip memory MAP
+//---------------------------------------------------------
+#define LITTLE_ENDIAN_ADDRESS 0
+#define BIG_ENDIAN_ADDRESS 1
+
+typedef struct {
+ ULONG StartAddr;
+ ULONG EndAddr;
+} LittleEndian_Area;
+
+#if ( AST1010_IOMAP == 1 )
+ static const LittleEndian_Area LittleEndianArea[] = {
+ { AST_IO_BASE, (AST_IO_BASE + 0x000FFFFF) },
+ { 0xFFFFFFFF, 0xFFFFFFFF } // End
+ };
+#else
+ static const LittleEndian_Area LittleEndianArea[] = {
+ { 0xFFFFFFFF, 0xFFFFFFFF } // End
+ };
+#endif
+
+// ========================================================
+// For ncsi.c
+
+#define DEF_PACKAGE2NUM 1 // Default value
+#define DEF_CHANNEL2NUM 2 // Default value
+
+typedef struct {
+ unsigned char Package_ID;
+ unsigned char Channel_ID;
+ unsigned long Capabilities_Flags;
+ unsigned long Broadcast_Packet_Filter_Capabilities;
+ unsigned long Multicast_Packet_Filter_Capabilities;
+ unsigned long Buffering_Capabilities;
+ unsigned long AEN_Control_Support;
+ unsigned long PCI_DID_VID;
+ unsigned long ManufacturerID;
+} NCSI_Capability;
+
+#undef GLOBAL
+#ifdef NCSI_C
+#define GLOBAL
+#else
+#define GLOBAL extern
+#endif
+
+GLOBAL NCSI_Capability NCSI_Cap_SLT;
+GLOBAL BYTE number_chl;
+
+GLOBAL char phy_ncsi (void);
+
+// ========================================================
+// For mactest
+
+#undef GLOBAL
+#ifdef MACTEST_C
+#define GLOBAL
+#else
+#define GLOBAL extern
+#endif
+
+GLOBAL ULONG NCSI_DiSChannel;
+
+//
+#ifdef SLT_UBOOT
+#else
+// SLT_DOS
+GLOBAL FILE *fp_log;
+GLOBAL FILE *fp_io;
+#endif
+
+GLOBAL CHAR dlymap[16][16];
+GLOBAL CHAR PrintNCSIEn;
+GLOBAL ULONG ARPNumCnt;
+GLOBAL CHAR FileNameMain[256];
+GLOBAL CHAR FileName[256];
+GLOBAL CHAR ASTChipName[256];
+GLOBAL CHAR LOOP_Str[256];
+GLOBAL BYTE IOTimingBund;
+GLOBAL BYTE ChannelTolNum;
+GLOBAL BYTE PackageTolNum;
+GLOBAL ULONG IOdly_out_reg;
+GLOBAL BYTE IOdly_out_reg_idx;
+GLOBAL ULONG Dat_ULONG;
+GLOBAL ULONG IOdly_incval;
+GLOBAL ULONG IOdly_in_reg;
+GLOBAL BYTE IOdly_in_reg_idx;
+GLOBAL ULONG *wp_lst;
+GLOBAL ULONG *FRAME_LEN;
+GLOBAL ULONG DES_NUMBER;
+GLOBAL ULONG DES_NUMBER_Org;
+GLOBAL int LOOP_MAX;
+GLOBAL ULONG LOOP_CheckNum;
+GLOBAL int Loop;
+GLOBAL ULONG CheckBuf_MBSize;
+GLOBAL ULONG Err_Flag;
+GLOBAL ULONG SCU_f0h_old;
+#ifdef AST1010_IOMAP
+ GLOBAL ULONG SCU_11Ch_old;
+#endif
+GLOBAL ULONG SCU_04h;
+GLOBAL ULONG SCU_90h_old;
+GLOBAL ULONG SCU_7ch_old;
+GLOBAL ULONG MAC_50h;
+GLOBAL ULONG SCU_ach_old;
+GLOBAL ULONG SCU_70h_old;
+GLOBAL ULONG MAC_50h_Speed;
+GLOBAL ULONG SCU_48h_old;
+GLOBAL ULONG SCU_48h_mix;
+GLOBAL ULONG MAC_08h_old;
+GLOBAL ULONG MAC_0ch_old;
+GLOBAL ULONG MAC_40h_old;
+GLOBAL ULONG SCU_08h_old;
+GLOBAL ULONG MAC_PHYBASE;
+GLOBAL ULONG LOOP_MAX_arg;
+GLOBAL BYTE GRun_Mode;
+GLOBAL ULONG GSpeed_idx;
+GLOBAL CHAR GSpeed_sel[3];
+GLOBAL CHAR PHY_ADR;
+GLOBAL CHAR PHY_ADR_arg;
+GLOBAL CHAR PHYName[256];
+GLOBAL ULONG PHY_ID3;
+GLOBAL ULONG PHY_ID2;
+GLOBAL BYTE number_pak;
+GLOBAL BYTE TestMode;
+GLOBAL ULONG IOStr_i;
+GLOBAL BYTE IOTimingBund_arg;
+GLOBAL BYTE GSpeed;
+GLOBAL BYTE GCtrl;
+GLOBAL ULONG UserDVal;
+GLOBAL ULONG H_MAC_BASE;
+GLOBAL ULONG H_TDES_BASE;
+GLOBAL ULONG H_RDES_BASE;
+GLOBAL CHAR Loop_rl[3];
+GLOBAL CHAR IOTiming;
+GLOBAL CHAR LOOP_INFINI;
+GLOBAL CHAR SelectMAC;
+GLOBAL CHAR Enable_SkipChkPHY;
+GLOBAL CHAR Enable_MAC34;
+GLOBAL CHAR IOStrength;
+GLOBAL CHAR DataDelay;
+GLOBAL CHAR SA[6];
+GLOBAL CHAR RxDataEnable;
+GLOBAL CHAR IEEETesting;
+GLOBAL CHAR BurstEnable;
+GLOBAL CHAR MAC_Mode;
+GLOBAL CHAR Enable_MACLoopback;
+GLOBAL CHAR Enable_InitPHY;
+GLOBAL CHAR MAC1_1GEn;
+GLOBAL CHAR MAC2_RMII;
+GLOBAL CHAR Enable_RMII;
+GLOBAL CHAR MAC2_1GEn;
+GLOBAL CHAR TxDataEnable;
+GLOBAL CHAR AST2300_NewMDIO;
+GLOBAL CHAR ASTChipType;
+GLOBAL CHAR Err_Flag_PrintEn;
+GLOBAL CHAR AST2400;
+GLOBAL CHAR AST2300;
+GLOBAL CHAR AST1100;//Different in phy & dram initiation & dram size & RMII
+GLOBAL CHAR AST3200;
+GLOBAL CHAR AST1010;
+GLOBAL SCHAR IOdly_i_min;
+GLOBAL SCHAR IOdly_j_min;
+GLOBAL SCHAR IOdly_i_max;
+GLOBAL SCHAR IOdly_j_max;
+GLOBAL BYTE IOdly_i;
+GLOBAL BYTE IOdly_j;
+GLOBAL BYTE IOdly_in;
+GLOBAL BYTE IOdly_out;
+GLOBAL SCHAR IOdly_in_str;
+GLOBAL BYTE IOdly_in_end;
+GLOBAL BYTE IOdly_out_end;
+GLOBAL BYTE IOdly_out_shf;
+GLOBAL BYTE IOdly_in_shf;
+GLOBAL SCHAR IOdly_out_str;
+GLOBAL BYTE valary[16];
+
+#define MODE_DEDICATED 0x01
+#define MODE_NSCI 0x02
+GLOBAL CHAR ModeSwitch;
+
+#ifdef SLT_UBOOT
+#else
+ GLOBAL time_t timestart;
+#endif
+
+#ifdef SPI_BUS
+ GLOBAL ULONG mmiobase;
+#else
+ // ( USE_P2A | USE_LPC )
+ GLOBAL UCHAR *mmiobase;
+ GLOBAL ULONG ulPCIBaseAddress;
+ GLOBAL ULONG ulMMIOBaseAddress;
+#endif
+
+
+// ========================================================
+// For mac.c
+#undef GLOBAL
+#ifdef MAC_C
+#define GLOBAL
+#else
+#define GLOBAL extern
+#endif
+
+GLOBAL ULONG ARP_data[16];
+GLOBAL ULONG NCSI_LinkFail_Val;
+static const char version_name[] = VER_NAME;
+
+GLOBAL void Debug_delay (void);
+GLOBAL void read_scu (void);
+GLOBAL void Setting_scu (void);
+GLOBAL void PrintMode (void);
+GLOBAL void PrintPakNUm (void);
+GLOBAL void PrintChlNUm (void);
+GLOBAL void PrintTest (void);
+GLOBAL void PrintIOTimingBund (void);
+GLOBAL void PrintSpeed (void);
+GLOBAL void PrintCtrl (void);
+GLOBAL void PrintLoop (void);
+GLOBAL void PrintPHYAdr (void);
+GLOBAL void Finish_Close (void);
+GLOBAL void Calculate_LOOP_CheckNum (void);
+GLOBAL char Finish_Check (int value);
+GLOBAL void init_scu1 (void);
+GLOBAL void init_scu_macrst (void);
+GLOBAL void setup_arp (void);
+GLOBAL void TestingSetup (void);
+GLOBAL void init_scu2 (void);
+GLOBAL void init_scu3 (void);
+GLOBAL void init_mac (ULONG base, ULONG tdexbase, ULONG rdexbase);
+GLOBAL char TestingLoop (ULONG loop_checknum);
+GLOBAL void PrintIO_Line_LOG (void);
+GLOBAL void init_phy (int loop_phy);
+GLOBAL void recov_phy (int loop_phy);
+GLOBAL int FindErr (int value);
+GLOBAL int FindErr_Des (int value);
+GLOBAL void PrintIO_Header (BYTE option);
+GLOBAL void Print_Header (BYTE option);
+GLOBAL void PrintIO_LineS (BYTE option);
+GLOBAL void PrintIO_Line (BYTE option);
+GLOBAL void FPri_ErrFlag (BYTE option);
+
+#ifdef SUPPORT_PHY_LAN9303
+// ========================================================
+// For LAN9303.c
+#undef GLOBAL
+#ifdef LAN9303_C
+#define GLOBAL
+#else
+#define GLOBAL extern
+#endif
+
+GLOBAL void LAN9303(int num, int phy_adr, int speed, int int_loopback);
+#endif // SUPPORT_PHY_LAN9303
+#endif // End COMMINF_H
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/DEF_SPI.H b/arch/arm/cpu/arm926ejs/aspeed/DEF_SPI.H
new file mode 100644
index 0000000..02353e7
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/DEF_SPI.H
@@ -0,0 +1,35 @@
+/*
+ * 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
+ */
+#ifndef DEF_SPI_H
+#define DEF_SPI_H
+
+#include "TYPEDEF.H"
+#include "SWFUNC.H"
+
+typedef struct _DEVICE_PCI_INFO
+{
+ USHORT usVendorID;
+ USHORT usDeviceID;
+ ULONG ulPCIConfigurationBaseAddress;
+ ULONG ulPhysicalBaseAddress;
+ ULONG ulMMIOBaseAddress;
+ USHORT usRelocateIO;
+} DEVICE_PCI_INFO;
+
+//VIDEO Engine Info
+typedef struct _VIDEO_ENGINE_INFO {
+ USHORT iEngVersion;
+ DEVICE_PCI_INFO VGAPCIInfo;
+} VIDEO_ENGINE_INFO;
+
+BOOLEAN GetDevicePCIInfo (VIDEO_ENGINE_INFO *VideoEngineInfo);
+
+#endif // DEF_SPI_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/DRAM_SPI.c b/arch/arm/cpu/arm926ejs/aspeed/DRAM_SPI.c
new file mode 100644
index 0000000..fe2b5cf
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/DRAM_SPI.c
@@ -0,0 +1,78 @@
+/*
+ * 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
+ */
+#define DRAM_SPI_C
+static const char ThisFile[] = "DRAM_SPI.c";
+
+#include "SWFUNC.H"
+
+#ifdef SPI_BUS
+#include <stdio.h>
+#include "DEF_SPI.H"
+#include "LIB_SPI.H"
+
+VOID Set_MMIO_Base(ULONG PCI_BASE, ULONG addr)
+{
+ static ULONG MMIO_BASE = -1;
+
+ if(MMIO_BASE != (addr & 0xffff0000)){
+ if(MMIO_BASE == -1){
+ *(ULONG *)(PCI_BASE + 0xF000) = 1;
+ }
+ *(ULONG *)(PCI_BASE + 0xF004) = addr;
+ MMIO_BASE = addr & 0xffff0000;
+ }
+}
+
+VOID MOutbm(ULONG PCI_BASE, ULONG Offset, BYTE Data)
+{
+ Set_MMIO_Base(PCI_BASE, Offset);
+ *(BYTE *)(PCI_BASE + 0x10000 + (Offset & 0xffff)) = Data;
+}
+
+VOID MOutwm(ULONG PCI_BASE, ULONG Offset, USHORT Data)
+{
+ Set_MMIO_Base(PCI_BASE, Offset);
+ *(USHORT *)(PCI_BASE + 0x10000 + (Offset & 0xffff)) = Data;
+}
+
+VOID MOutdwm(ULONG PCI_BASE, ULONG Offset, ULONG Data)
+{
+ Set_MMIO_Base(PCI_BASE, Offset);
+ *(ULONG *)(PCI_BASE + 0x10000 + (Offset & 0xffff)) = Data;
+}
+
+BYTE MInbm(ULONG PCI_BASE, ULONG Offset)
+{
+ BYTE jData;
+
+ Set_MMIO_Base(PCI_BASE, Offset);
+ jData = *(BYTE *)(PCI_BASE + 0x10000 + (Offset & 0xffff));
+ return(jData);
+}
+
+USHORT MInwm(ULONG PCI_BASE, ULONG Offset)
+{
+ USHORT usData;
+
+ Set_MMIO_Base(PCI_BASE, Offset);
+ usData = *(USHORT *)(PCI_BASE + 0x10000 + (Offset & 0xffff));
+ return(usData);
+}
+
+ULONG MIndwm(ULONG PCI_BASE, ULONG Offset)
+{
+ ULONG ulData;
+
+ Set_MMIO_Base(PCI_BASE, Offset);
+ ulData = *(ULONG *)(PCI_BASE + 0x10000 + (Offset & 0xffff));
+ return(ulData);
+}
+#endif // End SPI_BUS
diff --git a/arch/arm/cpu/arm926ejs/aspeed/IO.H b/arch/arm/cpu/arm926ejs/aspeed/IO.H
new file mode 100644
index 0000000..5fe03f0
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/IO.H
@@ -0,0 +1,36 @@
+/*
+ * 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
+ */
+#ifndef IO_H
+#define IO_H
+
+#include "SWFUNC.H"
+
+//
+// Macro
+//
+#if defined(LinuxAP)
+ #define delay(val) usleep(val*1000)
+ #define ob(p,d) outb(d,p)
+ #define ib(p) inb(p)
+#else
+ #define ob(p,d) outp(p,d)
+ #define ib(p) inp(p)
+#endif
+
+#ifdef USE_LPC
+void open_aspeed_sio_password(void);
+void enable_aspeed_LDU(BYTE jldu_number);
+int findlpcport(BYTE jldu_number);
+#endif
+
+void WriteSOC_DD(ULONG addr, ULONG data);
+ULONG ReadSOC_DD(ULONG addr);
+#endif
diff --git a/arch/arm/cpu/arm926ejs/aspeed/IO.c b/arch/arm/cpu/arm926ejs/aspeed/IO.c
new file mode 100644
index 0000000..86e9918
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/IO.c
@@ -0,0 +1,356 @@
+/*
+ * 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
+ */
+#define IO_C
+static const char ThisFile[] = "IO.c";
+
+#include "SWFUNC.H"
+
+#if defined(LinuxAP)
+ #include <stdio.h>
+ #include <string.h>
+ #include <stdlib.h>
+ #include <stdarg.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <fcntl.h>
+ #include <pthread.h>
+ #include <sys/mman.h>
+ #include <sys/io.h>
+#endif
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+ #include <post.h>
+ #include <malloc.h>
+ #include <net.h>
+ #include <COMMINF.H>
+#endif
+#ifdef SLT_DOS
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include <conio.h>
+ #include <dos.h>
+ #include <mem.h>
+ #include "TYPEDEF.H"
+ #include "LIB.H"
+ #include "COMMINF.H"
+#endif
+
+#include "TYPEDEF.H"
+#include "IO.H"
+#include "LIB_SPI.H"
+
+#ifdef SPI_BUS
+#endif
+#ifdef USE_LPC
+ USHORT usLPCPort;
+#endif
+#ifdef USE_P2A
+#endif
+
+#ifdef USE_LPC
+//------------------------------------------------------------
+// LPC access
+//------------------------------------------------------------
+void open_aspeed_sio_password(void)
+{
+ ob (usLPCPort, 0xaa);
+
+ ob (usLPCPort, 0xa5);
+ ob (usLPCPort, 0xa5);
+}
+
+//------------------------------------------------------------
+void close_aspeed_sio_password(void)
+{
+ ob (usLPCPort, 0xaa);
+}
+
+//------------------------------------------------------------
+void enable_aspeed_LDU(BYTE jldu_number)
+{
+ ob (usLPCPort, 0x07);
+ ob ((usLPCPort + 1), jldu_number);
+ ob (usLPCPort, 0x30);
+ ob ((usLPCPort + 1), 0x01);
+}
+
+//------------------------------------------------------------
+void disable_aspeed_LDU(BYTE jldu_number)
+{
+ ob (usLPCPort, 0x07);
+ ob ((usLPCPort + 1), jldu_number);
+ ob (usLPCPort, 0x30);
+ ob ((usLPCPort + 1), 0x00);
+}
+
+//------------------------------------------------------------
+/*
+ulAddress = AHB address
+jmode = 0: byte mode
+ 1: word mode
+ 2: dword mode
+*/
+static ULONG lpc_read (ULONG ulAddress, BYTE jmode)
+{
+ ULONG uldata = 0;
+ ULONG ultemp = 0;
+ BYTE jtemp;
+
+ //Write Address
+ ob ( usLPCPort, 0xf0);
+ ob ( (usLPCPort + 1 ), ((ulAddress & 0xff000000) >> 24));
+ ob ( usLPCPort, 0xf1);
+ ob ( (usLPCPort + 1) , ((ulAddress & 0x00ff0000) >> 16));
+ ob ( usLPCPort, 0xf2);
+ ob ( (usLPCPort + 1), ((ulAddress & 0x0000ff00) >> 8));
+ ob ( usLPCPort, 0xf3);
+ ob ( (usLPCPort + 1), ulAddress & 0xff);
+
+ //Write Mode
+ ob (usLPCPort, 0xf8);
+ jtemp = ib ((usLPCPort + 1));
+ ob ((usLPCPort + 1), ((jtemp & 0xfc) | jmode));
+
+ //Fire
+ ob (usLPCPort, 0xfe);
+ jtemp = ib ((usLPCPort + 1));
+
+ //Get Data
+ switch ( jmode )
+ {
+ case 0:
+ ob (usLPCPort, 0xf7);
+ ultemp = ib ((usLPCPort + 1));
+ uldata |= (ultemp);
+ break;
+
+ case 1:
+ ob (usLPCPort, 0xf6);
+ ultemp = ib ((usLPCPort + 1));
+ uldata |= (ultemp << 8);
+ ob (usLPCPort, 0xf7);
+ ultemp = ib ((usLPCPort + 1));
+ uldata |= (ultemp << 0);
+ break;
+
+ case 2:
+ ob (usLPCPort, 0xf4);
+ ultemp = ib ((usLPCPort + 1));
+ uldata |= (ultemp << 24);
+ ob (usLPCPort, 0xf5);
+ ultemp = ib ((usLPCPort + 1));
+ uldata |= (ultemp << 16);
+ ob (usLPCPort, 0xf6);
+ ultemp = ib ((usLPCPort + 1));
+ uldata |= (ultemp << 8);
+ ob (usLPCPort, 0xf7);
+ ultemp = ib ((usLPCPort + 1));
+ uldata |= ultemp;
+ break;
+ } // End switch ( jmode )
+
+ return uldata;
+} // End static ULONG lpc_read (ULONG ulAddress, BYTE jmode)
+
+//------------------------------------------------------------
+static void lpc_write (ULONG ulAddress, ULONG uldata, BYTE jmode)
+{
+ BYTE jtemp;
+
+ //Write Address
+ ob ( usLPCPort, 0xf0);
+ ob ((usLPCPort + 1), ((ulAddress & 0xff000000) >> 24));
+ ob ( usLPCPort, 0xf1);
+ ob ((usLPCPort + 1), ((ulAddress & 0x00ff0000) >> 16));
+ ob ( usLPCPort, 0xf2);
+ ob ((usLPCPort + 1), ((ulAddress & 0x0000ff00) >> 8));
+ ob ( usLPCPort, 0xf3);
+ ob ((usLPCPort + 1), ulAddress & 0xff);
+
+ //Write Data
+ switch ( jmode )
+ {
+ case 0:
+ ob ( usLPCPort, 0xf7);
+ ob ((usLPCPort + 1), (uldata & 0xff));
+ break;
+ case 1:
+ ob ( usLPCPort, 0xf6);
+ ob ((usLPCPort + 1), ((uldata & 0xff00) >> 8));
+ ob ( usLPCPort, 0xf7);
+ ob ((usLPCPort + 1), (uldata & 0x00ff));
+ break;
+ case 2:
+ ob ( usLPCPort, 0xf4);
+ ob ((usLPCPort + 1), ((uldata & 0xff000000) >> 24));
+ ob ( usLPCPort, 0xf5);
+ ob ((usLPCPort + 1), ((uldata & 0x00ff0000) >> 16));
+ ob ( usLPCPort, 0xf6);
+ ob ((usLPCPort + 1), ((uldata & 0x0000ff00) >> 8));
+ ob ( usLPCPort, 0xf7);
+ ob ((usLPCPort + 1), uldata & 0xff);
+ break;
+ } // End switch ( jmode )
+
+ //Write Mode
+ ob (usLPCPort, 0xf8);
+ jtemp = ib ((usLPCPort + 1));
+ ob ((usLPCPort + 1), ((jtemp & 0xfc) | jmode));
+
+ //Fire
+ ob (usLPCPort, 0xfe);
+ ob ((usLPCPort + 1), 0xcf);
+
+} // End static void lpc_write (ULONG ulAddress, ULONG uldata, BYTE jmode)
+
+//------------------------------------------------------------
+static USHORT usLPCPortList[] = {0x2e, 0x4e, 0xff};
+int findlpcport(BYTE jldu_number)
+{
+ USHORT *jLPCPortPtr;
+ ULONG ulData;
+
+ jLPCPortPtr = usLPCPortList;
+ while (*(USHORT *)(jLPCPortPtr) != 0xff )
+ {
+ usLPCPort = *(USHORT *)(jLPCPortPtr++);
+
+ open_aspeed_sio_password();
+ enable_aspeed_LDU(0x0d);
+
+ ulData = lpc_read(0x1e6e207c, 2);
+
+ if ( (ulData != 0x00000000) &&
+ (ulData != 0xFFFFFFFF) )
+ {
+ printf("Find LPC IO port at 0x%2x \n", usLPCPort);
+ return 1;
+ }
+
+ disable_aspeed_LDU(0x0d);
+ close_aspeed_sio_password();
+ }
+
+ //printf("[Error] Fail to find proper LPC IO Port \n");
+ return 0;
+}
+#endif // End ifdef USE_LPC
+
+#ifdef USE_P2A
+//------------------------------------------------------------
+// A2P Access
+//------------------------------------------------------------
+void mm_write (ULONG addr, ULONG data, BYTE jmode)
+{
+ *(ULONG *) (mmiobase + 0xF004) = (ULONG) ((addr) & 0xFFFF0000);
+ *(ULONG *) (mmiobase + 0xF000) = (ULONG) 0x00000001;
+
+ switch ( jmode )
+ {
+ case 0:
+ *(BYTE *) (mmiobase + 0x10000 + ((addr) & 0x0000FFFF)) = (BYTE) data;
+ break;
+ case 1:
+ *(USHORT *) (mmiobase + 0x10000 + ((addr) & 0x0000FFFF)) = (USHORT) data;
+ break;
+ case 2:
+ default:
+ *(ULONG *) (mmiobase + 0x10000 + ((addr) & 0x0000FFFF)) = data;
+ break;
+ } //switch
+}
+
+//------------------------------------------------------------
+ULONG mm_read (ULONG addr, BYTE jmode)
+{
+ *(ULONG *) (mmiobase + 0xF004) = (ULONG) ((addr) & 0xFFFF0000);
+ *(ULONG *) (mmiobase + 0xF000) = (ULONG) 0x00000001;
+ switch (jmode)
+ {
+ case 0:
+ return ( *(BYTE *) (mmiobase + 0x10000 + ((addr) & 0x0000FFFF)) );
+ break;
+ case 1:
+ return ( *(USHORT *) (mmiobase + 0x10000 + ((addr) & 0x0000FFFF)) );
+ break;
+ default:
+ case 2:
+ return ( *(ULONG *) (mmiobase + 0x10000 + ((addr) & 0x0000FFFF)) );
+ break;
+ } //switch
+
+ return 0;
+}
+#endif // End ifdef USE_P2A
+
+//------------------------------------------------------------
+// General Access API
+//------------------------------------------------------------
+#ifdef SLT_UBOOT
+BYTE Check_BEorLN ( ULONG chkaddr )
+{
+ BYTE ret = BIG_ENDIAN_ADDRESS;
+ BYTE i = 0;
+
+ do {
+ if ( LittleEndianArea[i].StartAddr == LittleEndianArea[i].EndAddr )
+ break;
+
+ if ( ( LittleEndianArea[i].StartAddr <= chkaddr ) &&
+ ( LittleEndianArea[i].EndAddr >= chkaddr ) ) {
+ ret = LITTLE_ENDIAN_ADDRESS;
+ break;
+ }
+ i++;
+ } while ( 1 );
+
+ return ret;
+}
+#endif
+
+void WriteSOC_DD(ULONG addr, ULONG data)
+{
+#ifdef SLT_UBOOT
+ if ( Check_BEorLN( addr ) == BIG_ENDIAN_ADDRESS )
+ *(volatile unsigned long *)(addr) = cpu_to_le32(data);
+ else
+ *(volatile unsigned long *)(addr) = data;
+#else
+ #ifdef USE_LPC
+ lpc_write(addr, data, 2);
+ #endif
+ #ifdef USE_P2A
+ mm_write(addr, data, 2);
+ #endif
+#endif
+}
+
+//------------------------------------------------------------
+ULONG ReadSOC_DD(ULONG addr)
+{
+#ifdef SLT_UBOOT
+ if ( Check_BEorLN( addr ) == BIG_ENDIAN_ADDRESS )
+ return le32_to_cpu(*(volatile unsigned long *) (addr));
+ else
+ return (*(volatile unsigned long *) (addr));
+#else
+ #ifdef USE_LPC
+ return (lpc_read(addr, 2));
+ #endif
+ #ifdef USE_P2A
+ return (mm_read(addr, 2));
+ #endif
+#endif
+ return 0;
+}
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/LAN9303.c b/arch/arm/cpu/arm926ejs/aspeed/LAN9303.c
new file mode 100644
index 0000000..498d4fd
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/LAN9303.c
@@ -0,0 +1,525 @@
+/*
+ * 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
+ */
+#define LAN9303_C
+static const char ThisFile[] = "LAN9303.c";
+
+#include "SWFUNC.H"
+#ifdef SLT_UBOOT
+ #include <COMMINF.H>
+ #include <MAC.H>
+ #include <IO.H>
+#endif
+
+#ifdef SLT_DOS
+ #include "COMMINF.H"
+ #include <stdlib.h>
+ #include "IO.H"
+#endif
+
+#ifdef SUPPORT_PHY_LAN9303
+//#define LAN9303M
+#define I2C_Debug 0
+#define Print_DWRW 0
+#define Print_PHYRW 0
+#define I2C_TIMEOUT 10000000
+
+ULONG devbase;
+ULONG busnum;
+ULONG byte;
+ULONG data_rd;
+
+//------------------------------------------------------------
+// Basic
+//------------------------------------------------------------
+void actime(ULONG ac1, ULONG ac2, ULONG *fact, ULONG *ckh, ULONG *ckl)
+{
+ static int divcnt;
+
+ ac1 = ac1 * 50 + 1;
+ ac2 = ac2 * 50 + 1;
+
+ divcnt = 0;
+ while (ac1 > 8 || ac2 > 8) {
+ divcnt++;
+ ac1 >>= 1;
+ ac2 >>= 1;
+ }
+
+ if (ac1 < 2 ) ac1 = 2;
+ if (ac2 < 2 ) ac2 = 2;
+ if (ac1 > ac2) ac2 = 1;
+ else ac1 += 1;
+
+#ifdef PRINT_MSG
+ printf("Divcnt = %d, ckdiv = %d, ckh = %d, ckl = %d\n",(1<<divcnt)*(ac1+ac2),divcnt,ac1-1,ac2-1);
+ printf("CKH = %d us, CKL = %d us\n",(1<<divcnt)*ac1/50,(1<<divcnt)*ac2/50);
+#endif
+
+ *fact = divcnt;
+ *ckh = ac1 - 1;
+ *ckl = ac2 - 1;
+}
+
+//------------------------------------------------------------
+ULONG PollStatus()
+{
+ static ULONG status;
+ static ULONG cnt = 0;
+
+ do {
+ status = ReadSOC_DD( devbase + 0x14 ) & 0xff;
+
+ if ( ++cnt > I2C_TIMEOUT ) {
+ printf("\nWait1 Timeout at bus %d!\n", busnum);
+ printf("Status 14 = %08x\n", ReadSOC_DD(devbase + 0x14));
+ exit(0);
+ }
+ } while (status != 0);
+
+ cnt = 0;
+ do {
+ status = ReadSOC_DD( devbase + 0x10 );
+ if ( ++cnt > I2C_TIMEOUT ) {
+ printf("\nWait2 Timeout at bus %d!\n", busnum);
+ printf("Status 14 = %08x\n", ReadSOC_DD(devbase + 0x14));
+ exit(0);
+ }
+ } while (status == 0);
+
+ WriteSOC_DD( devbase + 0x10, status );
+
+ return(status);
+}
+
+
+//------------------------------------------------------------
+ULONG writeb(ULONG start, ULONG data, ULONG stop)
+{
+ WriteSOC_DD( devbase + 0x20, data);
+ WriteSOC_DD( devbase + 0x14, 0x02 | start | (stop << 5) );
+ return(PollStatus());
+}
+
+//------------------------------------------------------------
+ULONG readb(ULONG last, ULONG stop)
+{
+ static ULONG data;
+
+ WriteSOC_DD( devbase + 0x14, 0x08 | (last << 4) | (stop << 5) );
+ data = PollStatus();
+
+ if (data & 0x4) {
+ data = ReadSOC_DD( devbase + 0x20 );
+ return(data >> 8);
+ }
+ else {
+ return(-1);
+ }
+}
+
+//------------------------------------------------------------
+void Initial(ULONG base, ULONG ckh, ULONG ckl)
+{
+ static ULONG ackh;
+ static ULONG ackl;
+ static ULONG divx;
+
+ actime(ckh, ckl, &divx, &ackh, &ackl);
+ WriteSOC_DD(base + 0x00, 0x1);
+ if (ReadSOC_DD(base + 0x00) != 0x1) {
+ printf("Controller initial fail : %x\n",base);
+ exit(0);
+ }
+ WriteSOC_DD(base + 0x04, 0x77700360 | (ackh << 16) | (ackl << 12) | divx);
+ WriteSOC_DD(base + 0x08, 0x0);
+ WriteSOC_DD(base + 0x0c, 0x0);
+ WriteSOC_DD(base + 0x10, 0xffffffff);
+ WriteSOC_DD(base + 0x14, 0x00);
+ WriteSOC_DD(base + 0x1C, 0xff0000);
+ WriteSOC_DD(base + 0x20, 0x00);
+}
+
+//------------------------------------------------------------
+void print_status(ULONG status)
+{
+ if ( status & 0x02 ) printf( "Device NAK\n" );
+ if ( status & 0x08 ) printf( "Arbitration Loss\n" );
+ if ( status & 0x10 ) printf( "STOP\n" );
+ if ( status & 0x20 ) printf( "Abnormal STOP\n" );
+ if ( status & 0x40 ) printf( "SCL Low timeout\n" );
+}
+
+//------------------------------------------------------------
+void readme()
+{
+ printf("\nVersion:%s\n", version_name);
+#ifdef LAN9303M
+ printf("LAN9303M [bus] [vir_PHY_adr] [speed] [func]\n");
+#else
+ printf("LAN9303 [bus] [vir_PHY_adr] [speed] [func]\n" );
+#endif
+ printf("[bus] | 1~14: I2C bus number\n" );
+ printf("[vir_PHY_adr] | 0~1: virtual PHY address\n" );
+ printf("[speed] | 1: 100M\n" );
+ printf(" | 2: 10 M\n" );
+ printf("[func] | 0: external loopback\n" );
+ printf(" | 1: internal loopback\n" );
+}
+
+//------------------------------------------------------------
+void quit()
+{
+ WriteSOC_DD( devbase + 0x14, 0x20 );
+ PollStatus();
+ readme();
+}
+
+//------------------------------------------------------------
+// Double-Word Read/Write
+//------------------------------------------------------------
+ULONG I2C_DWRead(ULONG adr)
+{
+ static ULONG status;
+ int i;
+
+ Initial(devbase, 10, 10);
+
+ if ( Print_DWRW )
+ printf("RAdr %02x: ", adr);
+
+ status = writeb( 1, LAN9303_I2C_ADR, 0 );
+ if ( I2C_Debug )
+ printf("R1W[%02x]%02x ", status, LAN9303_I2C_ADR);
+
+ if ( status != 0x1 ) {
+ print_status(status);
+ quit();
+ exit(0);
+ }
+
+ status = writeb(0, adr, 0);
+ if ( I2C_Debug )
+ printf("R2W[%02x]%02x ", status, adr);
+ if ( !(status & 0x1) ) {
+ print_status(status);
+ quit();
+ exit(0);
+ }
+
+ status = writeb(1, LAN9303_I2C_ADR | 0x1, 0);
+ if ( I2C_Debug )
+ printf("R3W[%02x]%02x ", status, LAN9303_I2C_ADR | 0x1);
+ if ( status != 0x1 ) {
+ print_status(status);
+ quit();
+ exit(0);
+ }
+
+ if ( I2C_Debug )
+ printf("R4");
+
+ data_rd = 0;
+ for (i = 24; i >= 0; i-=8) {
+ if (i == 0) byte = readb(1, 1);
+ else byte = readb(0, 0);
+
+ if ( I2C_Debug )
+ printf("%02x ", byte);
+ data_rd = data_rd | (byte << i);
+ }
+
+ if ( Print_DWRW )
+ printf("%08x\n", data_rd);
+
+ return (data_rd);
+} // End ULONG I2C_DWRead(ULONG adr)
+
+//------------------------------------------------------------
+void I2C_DWWrite(ULONG adr, ULONG dwdata)
+{
+ static ULONG status;
+ int i;
+ ULONG endx;
+
+ Initial(devbase, 10, 10);
+ if (Print_DWRW)
+ printf("WAdr %02x: ", adr);
+
+ status = writeb(1, LAN9303_I2C_ADR, 0);
+ if ( I2C_Debug )
+ printf("W1[%02x]%02x ", status, LAN9303_I2C_ADR);
+ if ( status != 0x1 ) {
+ print_status(status);
+ quit();
+ exit(0);
+ }
+ status = writeb(0, adr, 0);
+ if ( I2C_Debug )
+ printf("W2[%02x]%02x ", status, adr);
+ if ( !(status & 0x1) ) {
+ print_status(status);
+ quit();
+ exit(0);
+ }
+
+ if (I2C_Debug)
+ printf("W3");
+ endx = 0;
+ for (i = 24; i >= 0; i-=8) {
+ if (i == 0)
+ endx = 1;
+ byte = (dwdata >> i) & 0xff;
+ status = writeb(0, byte, endx);
+
+ if (I2C_Debug)
+ printf("[%02x]%02x ", status, byte);
+ if (!(status & 0x1)) {
+ print_status(status);
+ quit();
+ exit(0);
+ }
+ }
+
+ if (Print_DWRW) printf("%08x\n", dwdata);
+} // End void I2C_DWWrite(ULONG adr, ULONG dwdata)
+
+//------------------------------------------------------------
+// PHY Read/Write
+//------------------------------------------------------------
+ULONG LAN9303_PHY_Read(ULONG phy_adr, ULONG reg_adr)
+{
+ static ULONG data_rd;
+
+ I2C_DWWrite(0x2a, ((phy_adr & 0x1f) << 11) | ((reg_adr & 0x1f) << 6));//[0A8h]PMI_ACCESS
+ do {
+ data_rd = I2C_DWRead (0x2a);
+ } while(data_rd & 0x00000001);//[0A8h]PMI_ACCESS
+
+ data_rd = I2C_DWRead (0x29);//[0A4h]PMI_DATA
+ if (Print_PHYRW)
+ printf("PHY:%2d, Reg:%2d, Data:%08x\n", phy_adr, reg_adr, data_rd);
+
+ return(data_rd);
+}
+
+//------------------------------------------------------------
+void LAN9303_PHY_Write(ULONG phy_adr, ULONG reg_adr, ULONG data_wr)
+{
+ static ULONG data_rd;
+
+ I2C_DWWrite(0x29, data_wr);//[0A4h]PMI_DATA
+
+ I2C_DWWrite(0x2a, ((phy_adr & 0x1f) << 11) | ((reg_adr & 0x1f) << 6) | 0x2);//[0A8h]PMI_ACCESS
+ do {
+ data_rd = I2C_DWRead (0x2a);
+ } while(data_rd & 0x00000001);//[0A8h]PMI_ACCESS
+}
+
+//------------------------------------------------------------
+ULONG LAN9303_PHY_Read_WD(ULONG data_ctl)
+{
+ static ULONG data_rd;
+
+ I2C_DWWrite(0x2a, data_ctl);//[0A8h]PMI_ACCESS
+ do {
+ data_rd = I2C_DWRead (0x2a);
+ } while(data_rd & 0x00000001);//[0A8h]PMI_ACCESS
+
+ data_rd = I2C_DWRead (0x29);//[0A4h]PMI_DATA
+ if (Print_PHYRW)
+ printf("WD Data:%08x\n", data_ctl);
+
+ return(data_rd);
+}
+
+//------------------------------------------------------------
+void LAN9303_PHY_Write_WD(ULONG data_ctl, ULONG data_wr)
+{
+ static ULONG data_rd;
+
+ I2C_DWWrite( 0x29, data_wr ); //[0A4h]PMI_DATA
+ I2C_DWWrite( 0x2a, data_ctl ); //[0A8h]PMI_ACCESS
+ do {
+ data_rd = I2C_DWRead (0x2a);
+ } while(data_rd & 0x00000001); //[0A8h]PMI_ACCESS
+}
+
+//------------------------------------------------------------
+// Virtual PHY Read/Write
+//------------------------------------------------------------
+ULONG LAN9303_VirPHY_Read(ULONG reg_adr)
+{
+ static ULONG data_rd;
+
+ data_rd = I2C_DWRead (0x70+reg_adr);//[1C0h]
+ if ( Print_PHYRW )
+ printf("VirPHY Reg:%2d, Data:%08x\n", reg_adr, data_rd);
+
+ return(data_rd);
+}
+
+//------------------------------------------------------------
+void LAN9303_VirPHY_Write(ULONG reg_adr, ULONG data_wr)
+{
+ I2C_DWWrite(0x70+reg_adr, data_wr);//[1C0h]
+}
+
+//------------------------------------------------------------
+void LAN9303_VirPHY_RW(ULONG reg_adr, ULONG data_clr, ULONG data_set)
+{
+ I2C_DWWrite(0x70+reg_adr, (LAN9303_VirPHY_Read(reg_adr) & (~data_clr)) | data_set);//[1C0h]
+}
+
+//------------------------------------------------------------
+// PHY Read/Write
+//------------------------------------------------------------
+ULONG LAN9303_Read(ULONG adr)
+{
+ static ULONG data_rd;
+
+ I2C_DWWrite(0x6c, 0xc00f0000 | adr & 0xffff);//[1B0h]SWITCH_CSR_CMD
+ do {
+ data_rd = I2C_DWRead (0x6c);
+ } while(data_rd & 0x80000000);//[1B0h]SWITCH_CSR_CMD
+
+ return(I2C_DWRead (0x6b));//[1ACh]SWITCH_CSR_DATA
+}
+
+//------------------------------------------------------------
+void LAN9303_Write(ULONG adr, ULONG data)
+{
+ static ULONG data_rd;
+
+ I2C_DWWrite(0x6b, data);//[1ACh]SWITCH_CSR_DATA
+ I2C_DWWrite(0x6c, 0x800f0000 | adr & 0xffff);//[1B0h]SWITCH_CSR_CMD
+
+ do {
+ data_rd = I2C_DWRead (0x6c);
+ } while(data_rd & 0x80000000);//[1B0h]SWITCH_CSR_CMD
+}
+
+//------------------------------------------------------------
+void LAN9303(int num, int phy_adr, int speed, int int_loopback)
+{
+ static ULONG data_rd;
+
+ //------------------------------------------------------------
+ // I2C Initial
+ //------------------------------------------------------------
+ busnum = num;
+ if (busnum <= 7) devbase = 0x1E78A000 + ( busnum * 0x40);
+ else devbase = 0x1E78A300 + ((busnum-8) * 0x40);
+ Initial(devbase, 10, 10);
+
+ //------------------------------------------------------------
+ // LAN9303 Register Setting
+ //------------------------------------------------------------
+ printf("----> Start\n");
+ if (int_loopback == 0) {
+ //Force Speed & external loopback
+ if (speed == 1) { //100M
+ LAN9303_VirPHY_RW( 0, 0xffff, 0x2300 ); //adr clr set //VPHY_BASIC_CTRL
+ LAN9303_VirPHY_RW( 11, 0xffff, 0x2300 ); //adr clr set //P1_MII_BASIC_CONTROL
+ LAN9303_PHY_Write( phy_adr + 1, 0, 0x2300 );
+ LAN9303_PHY_Write( phy_adr + 2, 0, 0x2300 );
+ }
+ else {
+ LAN9303_VirPHY_RW( 0, 0xffff, 0x0100 ); //adr clr set //VPHY_BASIC_CTRL
+ LAN9303_VirPHY_RW( 11, 0xffff, 0x0100 ); //adr clr set //P1_MII_BASIC_CONTROL
+ LAN9303_PHY_Write( phy_adr + 1, 0, 0x0100);
+ LAN9303_PHY_Write( phy_adr + 2, 0, 0x0100);
+ }
+
+ LAN9303_Write( 0x180c, 0x00000001 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000010 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+
+ LAN9303_Write( 0x180c, 0x00000002 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000011 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+
+ LAN9303_Write( 0x180c, 0x00000003 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000012 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+
+#ifdef LAN9303M
+ LAN9303_Write( 0x180c, 0x00022001 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000000 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+
+ LAN9303_Write( 0x180c, 0x00024002 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000001 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+
+ LAN9303_Write( 0x180c, 0x0002a003 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000002 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+#else
+ LAN9303_Write( 0x180c, 0x0002a001 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000000 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+
+ LAN9303_Write( 0x180c, 0x0000a002 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000001 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+
+ LAN9303_Write( 0x180c, 0x00022003 ); // SWE_VLAN_WR_DATA
+ LAN9303_Write( 0x180b, 0x00000002 ); // SWE_VLAN_CMD
+ do {data_rd = LAN9303_Read (0x1810);} while(data_rd & 0x1);
+#endif
+ LAN9303_Write( 0x1840, 0x00000007);
+ }
+ else if ( int_loopback == 1 ) {
+ //Force Speed & internal loopback
+ if ( speed == 1 ) {
+ //100M
+ LAN9303_VirPHY_RW( 0, 0xffff, 0x6300 ); // adr clr set //VPHY_BASIC_CTRL
+ LAN9303_VirPHY_RW( 11, 0xffff, 0x6300 ); // adr clr set //P1_MII_BASIC_CONTROL
+ LAN9303_PHY_Write( phy_adr + 1, 0, 0x6300 );
+ LAN9303_PHY_Write( phy_adr + 2, 0, 0x6300 );
+ }
+ else {
+ LAN9303_VirPHY_RW( 0, 0xffff, 0x4100 ); // adr clr set //VPHY_BASIC_CTRL
+ LAN9303_VirPHY_RW( 11, 0xffff, 0x4100 ); // adr clr set //P1_MII_BASIC_CONTROL
+ LAN9303_PHY_Write( phy_adr + 1, 0, 0x4100 );
+ LAN9303_PHY_Write( phy_adr + 2, 0, 0x4100 );
+ }
+ }
+ else {
+ //Force Speed
+ if (speed == 1) {
+ //100M
+ LAN9303_VirPHY_RW( 0, 0xffff, 0x2300 ); // adr clr set //VPHY_BASIC_CTRL
+ LAN9303_VirPHY_RW( 11, 0xffff, 0x2300 ); // adr clr set //P1_MII_BASIC_CONTROL
+ LAN9303_PHY_Write( phy_adr + 1, 0, 0x2300 );
+ LAN9303_PHY_Write( phy_adr + 2, 0, 0x2300 );
+ }
+ else {
+ LAN9303_VirPHY_RW( 0, 0xffff, 0x0100 ); // adr clr set //VPHY_BASIC_CTRL
+ LAN9303_VirPHY_RW( 11, 0xffff, 0x0100 ); // adr clr set //P1_MII_BASIC_CONTROL
+ LAN9303_PHY_Write( phy_adr + 1, 0, 0x0100 );
+ LAN9303_PHY_Write( phy_adr + 2, 0, 0x0100 );
+ }
+#ifdef LAN9303M
+#else
+ if (int_loopback == 3) {
+ //[LAN9303]IEEE measurement
+ data_rd = LAN9303_PHY_Read(phy_adr+1, 27);//PHY_SPECIAL_CONTROL_STAT_IND_x
+ LAN9303_PHY_Write(phy_adr+1, 27, (data_rd & 0x9fff) | 0x8000);//PHY_SPECIAL_CONTROL_STAT_IND_x
+
+ data_rd = LAN9303_PHY_Read(phy_adr+2, 27);//PHY_SPECIAL_CONTROL_STAT_IND_x
+ LAN9303_PHY_Write(phy_adr+2, 27, (data_rd & 0x9fff) | 0x8000);//PHY_SPECIAL_CONTROL_STAT_IND_x
+ }
+#endif
+ } // End if (int_loopback == 0)
+} // End void LAN9303(int num, int phy_adr, int speed, int int_loopback)
+#endif // SUPPORT_PHY_LAN9303
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/LIB.H b/arch/arm/cpu/arm926ejs/aspeed/LIB.H
new file mode 100644
index 0000000..a7c61dd
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/LIB.H
@@ -0,0 +1,37 @@
+/*
+ * 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
+ */
+#ifndef LIB_H
+#define LIB_H
+
+#include "TYPEDEF.H"
+
+//
+// Macro
+//
+#define INTFUNC int386
+
+#define OUTDWPORT outpd
+#define INDWPORT inpd
+#define OUTPUT outp
+#define INPUT inp
+
+//
+// PCI
+//
+ULONG ReadPCIReg (ULONG ulPCIConfigAddress, BYTE jOffest, ULONG ulMask);
+ULONG FindPCIDevice (USHORT usVendorID, USHORT usDeviceID, USHORT usBusType);
+VOID WritePCIReg (ULONG ulPCIConfigAddress, BYTE jOffest, ULONG ulMask, ULONG ulData);
+
+//
+// Map Resource
+//
+ULONG MapPhysicalToLinear (ULONG ulBaseAddress, ULONG ulSize);
+#endif
diff --git a/arch/arm/cpu/arm926ejs/aspeed/LIB.c b/arch/arm/cpu/arm926ejs/aspeed/LIB.c
new file mode 100644
index 0000000..f2a0c54
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/LIB.c
@@ -0,0 +1,184 @@
+/*
+ * 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
+ */
+#define LIB_C
+static const char ThisFile[] = "LIB.c";
+
+#include "SWFUNC.H"
+
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+#endif
+#ifdef SLT_DOS
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <conio.h>
+#include <dos.h>
+#include <mem.h>
+#endif
+
+#include "LIB.H"
+#include "TYPEDEF.H"
+
+#ifdef USE_P2A
+//------------------------------------------------------------
+// PCI
+//------------------------------------------------------------
+ULONG ReadPCIReg (ULONG ulPCIConfigAddress, BYTE jOffest, ULONG ulMask)
+{
+#ifndef Windows
+ OUTDWPORT(0xcf8, ulPCIConfigAddress + jOffest);
+
+ return (((ULONG)INDWPORT(0xcfc)) & ulMask);
+#else
+ WRITE_PORT_ULONG((PULONG)0xcf8, ulPCIConfigAddress + jOffest);
+
+ return (READ_PORT_ULONG((PULONG)0xcfc) & ulMask);
+#endif
+}
+
+//------------------------------------------------------------
+VOID WritePCIReg (ULONG ulPCIConfigAddress, BYTE jOffest, ULONG ulMask, ULONG ulData)
+{
+#ifndef Windows
+ OUTDWPORT(0xcf8, ulPCIConfigAddress + jOffest);
+ OUTDWPORT(0xcfc, (INDWPORT(0xcfc) & ulMask | ulData));
+#else
+ WRITE_PORT_ULONG((PULONG)0xcf8, ulPCIConfigAddress + jOffest);
+ WRITE_PORT_ULONG((PULONG)0xcfc, (READ_PORT_ULONG((PULONG)0xcfc) & ulMask | ulData));
+#endif
+}
+
+//------------------------------------------------------------
+ULONG FindPCIDevice (USHORT usVendorID, USHORT usDeviceID, USHORT usBusType)
+{
+//Return: ulPCIConfigAddress
+//usBusType: ACTIVE/PCI/AGP/PCI-E
+
+ ULONG Base[256];
+ ULONG ebx;
+ USHORT i;
+ USHORT j;
+
+ for (i = 0; i < 256; i++) {
+ Base[i] = 0x80000000 + 0x10000 * i;
+ }
+
+ if (usBusType == PCI)
+ {
+ ebx = 0x80000000;
+ }
+ else if (usBusType == PCIE)
+ {
+ ebx = 0x80020000;
+ }
+ else // AGP and ACTIVE
+ {
+ ebx = 0x80010000;
+ }
+
+ if ( usBusType != ACTIVE ) //AGP, PCI, PCIE
+ {
+ for (i = 0; i < 32; i++)
+ {
+ ebx = ebx + (0x800);
+ if (((USHORT)ReadPCIReg(ebx, 0, 0xffff) == usVendorID) && ((USHORT)(ReadPCIReg(ebx, 0, 0xffff0000) >> 16) == usDeviceID))
+ {
+ return ebx;
+ }
+ }
+ return 0;
+ }
+ else //ACTIVE
+ {
+ for (j = 0; j < 256; j++)
+ {
+ ebx = Base[j];
+ for (i = 0; i < 32; i++)
+ {
+ ebx = ebx + (0x800);
+ if (((USHORT)ReadPCIReg(ebx, 0, 0xffff) == usVendorID) && ((USHORT)(ReadPCIReg(ebx, 0, 0xffff0000) >> 16) == usDeviceID))
+ {
+ return ebx;
+ }
+ }
+ }
+ return 0;
+ }
+} // End ULONG FindPCIDevice (USHORT usVendorID, USHORT usDeviceID, USHORT usBusType)
+#endif
+//------------------------------------------------------------
+// Allocate Resource
+//------------------------------------------------------------
+#ifdef SLT_DOS
+ULONG InitDOS32()
+{
+ union REGS regs ;
+
+ regs.w.ax = 0xee00;
+ INTFUNC(0x31, &regs, &regs) ;
+
+ if(regs.w.ax >= 0x301) // DOS32 version >= 3.01 ?
+ return 1;
+ else
+ return 0;
+}
+
+//------------------------------------------------------------
+USHORT CheckDOS()
+{
+ union REGS regs;
+
+ regs.w.ax = 0xeeff;
+ int386(0x31, &regs, &regs);
+ if (regs.x.eax == 0x504d4457)
+ {
+ return 0;
+ } else {
+ printf("PMODEW Init. fail\n");
+ return 1;
+ }
+}
+
+//------------------------------------------------------------
+ULONG MapPhysicalToLinear (ULONG ulBaseAddress, ULONG ulSize)
+{
+ union REGS regs;
+
+ regs.w.ax = 0x0800; // map physcial memory
+ regs.w.bx = ulBaseAddress >> 16; // bx:cx = physical address
+ regs.w.cx = ulBaseAddress;
+ regs.w.si = ulSize >> 16; // si:di = mapped memory block size
+ regs.w.di = ulSize;
+ INTFUNC(0x31, &regs, &regs); // int386(0x31, &regs, &regs);
+ if (regs.w.cflag == 0)
+ return (ULONG) (regs.w.bx << 16 + regs.w.cx); // Linear Addr = bx:cx
+ else
+ return 0;
+}
+
+//------------------------------------------------------------
+USHORT FreePhysicalMapping(ULONG udwLinAddress)
+{
+ union REGS regs;
+
+ regs.w.ax = 0x0801;
+ regs.w.bx = udwLinAddress >> 16;
+ regs.w.cx = udwLinAddress & 0xFFFF;
+ int386(0x31, &regs, &regs);
+
+ if (regs.x.cflag)
+ return ((USHORT) 0);
+ else return ((USHORT) 1);
+}
+#endif
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/LIB_SPI.H b/arch/arm/cpu/arm926ejs/aspeed/LIB_SPI.H
new file mode 100644
index 0000000..78c8f1e
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/LIB_SPI.H
@@ -0,0 +1,23 @@
+/*
+ * 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
+ */
+#ifndef LIB_SPI_H
+#define LIB_SPI_H
+
+#ifdef SPI_BUS
+ // MMIO Functions
+ VOID MOutwm (ULONG, ULONG, USHORT);
+ VOID MOutdwm (ULONG, ULONG, ULONG);
+ ULONG MIndwm (ULONG, ULONG);
+
+ void spim_init(int cs);
+#endif
+
+#endif // LIB_SPI_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/MAC.H b/arch/arm/cpu/arm926ejs/aspeed/MAC.H
new file mode 100644
index 0000000..6732117
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/MAC.H
@@ -0,0 +1,157 @@
+/*
+ * 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
+ */
+#ifndef MAC_H
+#define MAC_H
+
+#ifdef SPI_BUS
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <time.h>
+ #define SPI_CS 1
+#endif
+// ( USE_P2A | USE_LPC )
+
+#if defined(LinuxAP)
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include <stdarg.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <fcntl.h>
+ #include <pthread.h>
+ #include <sys/mman.h>
+ #include <sys/io.h>
+#endif
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+#endif
+#ifdef SLT_DOS
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <time.h>
+ #include <conio.h>
+ #include <dos.h>
+ #include <mem.h>
+#endif
+
+#include "NCSI.H"
+#include "IO.H"
+
+// --------------------------------------------------------------
+// Define
+// --------------------------------------------------------------
+
+//#define Force_Enable_MAC34 //[ON][SLT:off] (Force enable mac34)
+//#define Force_Enable_NewMDIO //[off][SLT:off] (Force enable new MDC/MDIO)
+//#define Enable_Fast_SCU //[off]
+//#define Enable_Old_Style //[off]
+#define ENABLE_DASA //[ON]
+//#define Enable_AST2300_Int125MHz //[off]
+//#define ENABLE_ARP_2_WOL //[off]
+//#define Enable_MAC_SWRst //[off]
+
+#define Enable_Runt
+//#define Enable_Jumbo
+//#define Enable_BufMerge
+//#define Disable_VGA
+
+//#define SelectSimpleBoundary //[off] Using in debug
+//#define SelectSimpleData //[off] Using in debug
+//#define SelectSimpleLength 1512 //[off] 60(0x3c) ~ 1514(0x5ea); 1512(0x5e8)
+//#define SelectDesNumber 8 //[off] 1 ~
+//#define SelectSimpleDA //[off] Using in debug
+//#define SelectSimpleDes //[off]
+//#define SelectLengthInc //[off] Using in debug
+
+#define SimpleData_Fix //[ON] Using in debug
+#define SimpleData_FixNum 12
+#define SimpleData_FixVal00 0x00000000 //[0]no SelectSimpleDA: (60: 0412 8908)(1512: e20d e9da)
+#define SimpleData_FixVal01 0xffffffff //[0]no SelectSimpleDA: (60: f48c f14d)(1512: af05 260c)
+#define SimpleData_FixVal02 0x55555555 //[0]no SelectSimpleDA: (60: 5467 5ecb)(1512: d90a 5368)
+#define SimpleData_FixVal03 0xaaaaaaaa //[0]no SelectSimpleDA: (60: a4f9 268e)(1512: 9402 9cbe)
+#define SimpleData_FixVal04 0x5a5a5a5a //[1]no SelectSimpleDA: (60: 7f01 e22d)(1512: 4fd3 8012)
+#define SimpleData_FixVal05 0xc3c3c3c3 //[1]no SelectSimpleDA: (60: 5916 02d5)(1512: 99f1 6127)
+#define SimpleData_FixVal06 0x96969696 //[1]no SelectSimpleDA: (60: 0963 d516)(1512: a2f6 db95)
+#define SimpleData_FixVal07 0xf0f0f0f0 //[1]no SelectSimpleDA: (60: dfea 4dab)(1512: 39dc f576)
+#define SimpleData_FixVal08 0x5555aaaa //[2]no SelectSimpleDA: (60: b61b 5777)(1512: 4652 ddb0)
+#define SimpleData_FixVal09 0xffff0000 //[2]no SelectSimpleDA: (60: 16f0 f8f1)(1512: 305d a8d4)
+#define SimpleData_FixVal10 0x5a5aa5a5 //[2]no SelectSimpleDA: (60: 9d7d eb91)(1512: d08b 0eca)
+#define SimpleData_FixVal11 0xc3c33c3c //[2]no SelectSimpleDA: (60: bb6a 0b69)(1512: 06a9 efff)
+
+#define SelectSimpleDA_Dat0 0x67052301
+#define SelectSimpleDA_Dat1 0xe0cda089
+#define SelectSimpleDA_Dat2 0x98badcfe
+
+#define SelectWOLDA_DatH 0x206a
+#define SelectWOLDA_DatL 0x8a374d9b
+
+#define MOVE_DATA_MB_SEC 800 // MByte per second to move data
+
+//---------------------------------------------------------
+// Frame size
+//---------------------------------------------------------
+#define ENABLE_RAND_SIZE 0
+#define Rand_Sed 0xffccd
+#define FRAME_Rand_Simple 0
+#define MIN_FRAME_RAND_SIZE 60
+#define MAX_FRAME_RAND_SIZE 1514
+
+#define FRAME_SELH_PERD 7
+#ifdef Enable_Jumbo
+// #define FRAME_LENH 9212 //max:9212
+// #define FRAME_LENL 9211 //max:9212
+ #define FRAME_LENH 9212 //max:9212
+ #define FRAME_LENL 9212 //max:9212
+// #define FRAME_LENH 8120
+// #define FRAME_LENL 8119
+// #define FRAME_LENH 7000
+// #define FRAME_LENL 6999
+// #define FRAME_LENH 4095
+// #define FRAME_LENL 4094
+// #define FRAME_LENH 2040
+// #define FRAME_LENL 2039
+#else
+ #ifdef SelectSimpleLength
+// #define FRAME_LENH ( SelectSimpleLength + 1 )
+// #define FRAME_LENL ( SelectSimpleLength )
+ #define FRAME_LENH SelectSimpleLength
+ #define FRAME_LENL SelectSimpleLength
+ #else
+// #define FRAME_LENH 1514 //max:1514
+// #define FRAME_LENL 1513 //max:1514
+ #define FRAME_LENH 1514 //max:1514
+ #define FRAME_LENL 1514 //max:1514
+ #endif
+#endif
+
+const ULONG ARP_org_data[16] = {
+ 0xffffffff,
+ 0x0000ffff, // SA:00 00
+ 0x12345678, // SA:12 34 56 78
+ 0x01000608, // ARP(0x0806)
+ 0x04060008,
+ 0x00000100, // sender MAC Address: 00 00
+ 0x12345678, // sender MAC Address: 12 34 56 78
+ 0xeb00a8c0, // sender IP Address: 192.168.0.235
+ 0x00000000, // target MAC Address: 00 00 00 00
+ 0xa8c00000, // target MAC Address: 00 00, sender IP Address:192.168
+ 0x00000100, // sender IP Address: 0.1
+// 0x0000de00, // sender IP Address: 0.222
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0xc68e2bd5
+};
+
+#endif // MAC_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/MAC.c b/arch/arm/cpu/arm926ejs/aspeed/MAC.c
new file mode 100644
index 0000000..829da92
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/MAC.c
@@ -0,0 +1,2085 @@
+/*
+ * 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
+ */
+#define MAC_C
+static const char ThisFile[] = "MAC.c";
+
+#include "SWFUNC.H"
+
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+ #include <COMMINF.H>
+ #include "STDUBOOT.H"
+#endif
+#ifdef SLT_DOS
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <conio.h>
+ #include <string.h>
+ #include "COMMINF.H"
+#endif
+
+#include "MAC.H"
+
+double Avg_frame_len;
+ULONG Check_Des_Val;
+ULONG wp_fir;
+ULONG wp;
+ULONG FRAME_LEN_Cur;
+ULONG gdata;
+ULONG CheckDesFail_DesNum;
+ULONG VGAMode;
+ULONG SCU_1ch_old;
+ULONG SCU_0ch_old;
+ULONG SCU_48h_default;
+ULONG SCU_2ch_old;
+ULONG SCU_80h_old;
+ULONG SCU_74h_old;
+ULONG SCU_a4h_old;
+ULONG SCU_88h_old;
+ULONG WDT_0ch_old;
+ULONG SCU_04h_mix;
+ULONG SCU_04h_old;
+ULONG WDT_2ch_old;
+char SCU_oldvld = 0;
+
+#ifdef SLT_UBOOT
+#else
+ static double timeused;
+#endif
+// -------------------------------------------------------------
+
+void Debug_delay (void) {
+ #ifdef DbgPrn_Enable_Debug_delay
+ GET_CAHR();
+ #endif
+}
+
+
+
+
+void dump_mac_ROreg (void) {
+ DELAY(Delay_MACDump);
+ printf("\n");
+ printf("[MAC-H] ROReg A0h~ACh: %08lx %08lx %08lx %08lx\n", ReadSOC_DD(H_MAC_BASE+0xA0), ReadSOC_DD(H_MAC_BASE+0xA4), ReadSOC_DD(H_MAC_BASE+0xA8), ReadSOC_DD(H_MAC_BASE+0xAC));
+ printf("[MAC-H] ROReg B0h~BCh: %08lx %08lx %08lx %08lx\n", ReadSOC_DD(H_MAC_BASE+0xB0), ReadSOC_DD(H_MAC_BASE+0xB4), ReadSOC_DD(H_MAC_BASE+0xB8), ReadSOC_DD(H_MAC_BASE+0xBC));
+ printf("[MAC-H] ROReg C0h~C8h: %08lx %08lx %08lx \n", ReadSOC_DD(H_MAC_BASE+0xC0), ReadSOC_DD(H_MAC_BASE+0xC4), ReadSOC_DD(H_MAC_BASE+0xC8));
+}
+
+//------------------------------------------------------------
+// SCU
+//------------------------------------------------------------
+void recov_scu (void) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("recov_scu\n");
+ Debug_delay();
+ #endif
+
+ //MAC
+ WriteSOC_DD( H_MAC_BASE + 0x08, MAC_08h_old );
+ WriteSOC_DD( H_MAC_BASE + 0x0c, MAC_0ch_old );
+ WriteSOC_DD( H_MAC_BASE + 0x40, MAC_40h_old );
+
+ //SCU
+ WriteSOC_DD( SCU_BASE + 0x04, SCU_04h_old );
+ WriteSOC_DD( SCU_BASE + 0x08, SCU_08h_old );
+ WriteSOC_DD( SCU_BASE + 0x0c, SCU_0ch_old );
+ WriteSOC_DD( SCU_BASE + 0x1c, SCU_1ch_old );
+ WriteSOC_DD( SCU_BASE + 0x2c, SCU_2ch_old );
+ WriteSOC_DD( SCU_BASE + 0x48, SCU_48h_old );
+// WriteSOC_DD( SCU_BASE + 0x70, SCU_70h_old );
+ WriteSOC_DD( SCU_BASE + 0x74, SCU_74h_old );
+ WriteSOC_DD( SCU_BASE + 0x7c, SCU_7ch_old );
+ WriteSOC_DD( SCU_BASE + 0x80, SCU_80h_old );
+ WriteSOC_DD( SCU_BASE + 0x88, SCU_88h_old );
+ WriteSOC_DD( SCU_BASE + 0x90, SCU_90h_old );
+ WriteSOC_DD( SCU_BASE + 0xa4, SCU_a4h_old );
+ WriteSOC_DD( SCU_BASE + 0xac, SCU_ach_old );
+ #ifdef AST1010_IOMAP
+ WriteSOC_DD( SCU_BASE + 0x11C, SCU_11Ch_old );
+ #endif
+
+ //WDT
+ #ifdef AST1010_IOMAP
+ #else
+ // WriteSOC_DD(0x1e78500c, WDT_0ch_old);
+ // WriteSOC_DD(0x1e78502c, WDT_2ch_old);
+ #endif
+
+ if ( ASTChipType == 3 ) {
+ if ( SCU_f0h_old & 0x01 ) WriteSOC_DD( SCU_BASE + 0xf0, 0xAEED0001 ); //Enable MAC34
+ if ( SCU_f0h_old & 0x02 ) WriteSOC_DD( SCU_BASE + 0xf0, 0x2000DEEA ); //Enable Decode
+ if ( SCU_f0h_old & 0x04 ) WriteSOC_DD( SCU_BASE + 0xf0, 0xA0E0E0D3 ); //Enable I2S
+ if ( SCU_f0h_old & 0x08 ) WriteSOC_DD( SCU_BASE + 0xf0, 0x4D0E0E0A ); //Enable PCI Host
+ if ( SCU_f0h_old & 0x10 ) WriteSOC_DD( SCU_BASE + 0xf0, 0x10ADDEED ); //Enable IR
+ if ( SCU_f0h_old & 0x20 ) WriteSOC_DD( SCU_BASE + 0xf0, 0x66559959 ); //Enabel Buffer Merge
+ if ( SCU_f0h_old & 0x40 ) WriteSOC_DD( SCU_BASE + 0xf0, 0x68961A33 ); //Enable PS2 IO
+ if ( SCU_f0h_old & 0x80 ) WriteSOC_DD( SCU_BASE + 0xf0, 0x68971A33 ); //Enable PS2 IO
+ }
+} // End void recov_scu (void)
+
+void read_scu (void) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("read_scu\n");
+ Debug_delay();
+ #endif
+
+ if (!SCU_oldvld) {
+ //SCU
+ SCU_04h_old = ReadSOC_DD( SCU_BASE + 0x04 );
+ SCU_08h_old = ReadSOC_DD( SCU_BASE + 0x08 );
+ SCU_0ch_old = ReadSOC_DD( SCU_BASE + 0x0c );
+ SCU_1ch_old = ReadSOC_DD( SCU_BASE + 0x1c );
+ SCU_2ch_old = ReadSOC_DD( SCU_BASE + 0x2c );
+ SCU_48h_old = ReadSOC_DD( SCU_BASE + 0x48 );
+ SCU_70h_old = ReadSOC_DD( SCU_BASE + 0x70 );
+ SCU_74h_old = ReadSOC_DD( SCU_BASE + 0x74 );
+ SCU_7ch_old = ReadSOC_DD( SCU_BASE + 0x7c );
+ SCU_80h_old = ReadSOC_DD( SCU_BASE + 0x80 );
+ SCU_88h_old = ReadSOC_DD( SCU_BASE + 0x88 );
+ SCU_90h_old = ReadSOC_DD( SCU_BASE + 0x90 );
+ SCU_a4h_old = ReadSOC_DD( SCU_BASE + 0xa4 );
+ SCU_ach_old = ReadSOC_DD( SCU_BASE + 0xac );
+ SCU_f0h_old = ReadSOC_DD( SCU_BASE + 0xf0 );
+ #ifdef AST1010_IOMAP
+ SCU_11Ch_old = ReadSOC_DD( SCU_BASE + 0x11C );
+ #endif
+
+ //WDT
+ #ifdef AST1010_IOMAP
+ #else
+ WDT_0ch_old = ReadSOC_DD( 0x1e78500c );
+ WDT_2ch_old = ReadSOC_DD( 0x1e78502c );
+ #endif
+
+ SCU_oldvld = 1;
+ } // End if (!SCU_oldvld)
+} // End read_scu()
+
+void Setting_scu (void)
+{
+ //SCU
+ if (AST1010) {
+ do {
+ WriteSOC_DD( SCU_BASE + 0x00 , 0x1688a8a8);
+ #ifndef SLT_UBOOT
+ WriteSOC_DD( SCU_BASE + 0x70 , SCU_70h_old & 0xfffffffe); // Disable CPU
+ #endif
+ } while ( ReadSOC_DD( SCU_BASE + 0x00 ) != 0x1 );
+
+ #if( AST1010_IOMAP == 1)
+ WriteSOC_DD( SCU_BASE + 0x11C, 0x00000000); // Disable Cache functionn
+ #endif
+ }
+ else {
+ do {
+ WriteSOC_DD( SCU_BASE + 0x00, 0x1688a8a8);
+ #ifndef SLT_UBOOT
+ WriteSOC_DD( SCU_BASE + 0x70, SCU_70h_old | 0x3 ); // Disable CPU
+ #endif
+ } while ( ReadSOC_DD( SCU_BASE + 0x00 ) != 0x1 );
+ } // End if (AST1010)
+
+ //WDT
+ #ifdef AST1010_IOMAP
+ #else
+ WriteSOC_DD( 0x1e78500c, WDT_0ch_old & 0xfffffffc );
+ WriteSOC_DD( 0x1e78502c, WDT_2ch_old & 0xfffffffc );
+ #endif
+}
+
+//------------------------------------------------------------
+void init_scu1 (void) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("init_scu1\n");
+ Debug_delay();
+ #endif
+
+ if (AST3200) {
+ WriteSOC_DD( SCU_BASE + 0x0c, (SCU_0ch_old & 0xffefffff) );//Clock Stop Control
+ }
+ else if (AST1010) {
+ WriteSOC_DD( SCU_BASE + 0x0c, ( SCU_0ch_old & 0xffffffbf ) );//Clock Stop Control
+ WriteSOC_DD( SCU_BASE + 0x88, ((SCU_88h_old & 0x003fffff ) | 0xffc00000) );//Multi-function Pin Control
+ }
+ else if (AST2300) {
+#ifdef Enable_BufMerge
+ WriteSOC_DD( SCU_BASE + 0xf0, 0x66559959 );//MAC buffer merge
+#endif
+
+#ifdef Enable_AST2300_Int125MHz
+ SCU_48h_mix = (SCU_48h_old & 0xf0000000) | 0x80000000;
+// WriteSOC_DD( SCU_BASE + 0xf0, 0xa0e0e0d3 );//Enable I2S
+// WriteSOC_DD( SCU_BASE + 0x04, SCU_04h_old & 0xfffdffff );//Rst(Enable I2S)
+//
+//// WriteSOC_DD( 0x1e6e5020, ReadSOC_DD(0x1e6e5020) | 0x00010000 );//P_I2SPLLAdjEnable
+// WriteSOC_DD( 0x1e6e5020, ReadSOC_DD(0x1e6e5020) | 0x00000000 );//P_I2SPLLAdjEnable
+// WriteSOC_DD( 0x1e6e5024, 0x00000175 );//P_I2SPLLAdjCnt
+
+// WriteSOC_DD( SCU_BASE + 0x1c, 0x0000a51a );//124800000(24MHz)
+// WriteSOC_DD( SCU_BASE + 0x1c, 0x0000a92f );//125333333(24MHz)
+// WriteSOC_DD( SCU_BASE + 0x1c, 0x0000587d );//125000000(24MHz)
+ WriteSOC_DD( SCU_BASE + 0x1c, 0x00006c7d );//125000000(24MHz)
+ WriteSOC_DD( SCU_BASE + 0x2c, 0x00300000 | (SCU_2ch_old & 0xffcfffef) );//D-PLL assigned to VGA, D2-PLL assigned to I2S.
+ WriteSOC_DD( SCU_BASE + 0x48, 0x80000000 | SCU_48h_old );//125MHz come from I2SPLL
+#else
+ SCU_48h_mix = (SCU_48h_old & 0xf0000000);
+#endif
+ switch (SelectMAC) {
+ case 0 :
+ WriteSOC_DD( SCU_BASE + 0x88, (SCU_88h_old & 0x3fffffff) | 0xc0000000 );//[31]MAC1 MDIO, [30]MAC1 MDC
+ break;
+ case 1 :
+ WriteSOC_DD( SCU_BASE + 0x90, (SCU_90h_old & 0xfffffffb) | 0x00000004 );//[2 ]MAC2 MDC/MDIO
+ break;
+ case 2 :
+ case 3 :
+ default : break;
+ }
+
+ WriteSOC_DD(SCU_BASE+0x0c, (SCU_0ch_old & 0xff0fffff) );//Clock Stop Control
+// WriteSOC_DD(SCU_BASE+0x80, (SCU_80h_old & 0xfffffff0) | 0x0000000f);//MAC1LINK/MAC2LINK
+ }
+ else {
+ switch (SelectMAC) {
+ case 0 :
+// WriteSOC_DD(SCU_BASE+0x74, (SCU_74h_old & 0xfdffffff) | 0x02000000);//[25]MAC1 PHYLINK
+ break;
+ case 1 :
+ if (MAC2_RMII) {
+// WriteSOC_DD(SCU_BASE+0x74, (SCU_74h_old & 0xfbefffff) | 0x04100000);//[26]MAC2 PHYLINK, [21]MAC2 MII, [20]MAC2 MDC/MDIO
+ WriteSOC_DD(SCU_BASE+0x74, (SCU_74h_old & 0xffefffff) | 0x00100000);//[26]MAC2 PHYLINK, [21]MAC2 MII, [20]MAC2 MDC/MDIO
+ } else {
+// WriteSOC_DD(SCU_BASE+0x74, (SCU_74h_old & 0xfbcfffff) | 0x04300000);//[26]MAC2 PHYLINK, [21]MAC2 MII, [20]MAC2 MDC/MDIO
+ WriteSOC_DD(SCU_BASE+0x74, (SCU_74h_old & 0xffcfffff) | 0x00300000);//[26]MAC2 PHYLINK, [21]MAC2 MII, [20]MAC2 MDC/MDIO
+ }
+ break;
+ default : break;
+ } // End switch (SelectMAC)
+ } // End if (AST3200)
+} // End void init_scu1 (void)
+
+//------------------------------------------------------------
+void init_scu_macrst (void) {
+
+#ifdef Enable_AST2300_Int125MHz
+ if (ASTChipType == 3) {
+ SCU_04h_mix = SCU_04h_old & 0xfffdffff;
+ } else {
+ SCU_04h_mix = SCU_04h_old;
+ }
+#else
+ SCU_04h_mix = SCU_04h_old;
+#endif
+
+ WriteSOC_DD ( SCU_BASE + 0x04, (SCU_04h_mix & ~SCU_04h) | SCU_04h);//Rst
+ DELAY(Delay_SCU);
+ WriteSOC_DD ( SCU_BASE + 0x04, (SCU_04h_mix & ~SCU_04h) );//Enable Engine
+// DELAY(Delay_SCU);
+} // End void init_scu_macrst (void)
+
+//------------------------------------------------------------
+void init_scu2 (void) {
+
+#ifdef SCU_74h
+ #ifdef DbgPrn_FuncHeader
+ printf ("init_scu2\n");
+ Debug_delay();
+ #endif
+
+ WriteSOC_DD( SCU_BASE + 0x74, SCU_74h_old | SCU_74h );//PinMux
+ delay(Delay_SCU);
+#endif
+
+} // End void init_scu2 (void)
+
+//------------------------------------------------------------
+void init_scu3 (void) {
+
+#ifdef SCU_74h
+ #ifdef DbgPrn_FuncHeader
+ printf ("init_scu3\n");
+ Debug_delay();
+ #endif
+
+ WriteSOC_DD( SCU_BASE + 0x74, SCU_74h_old | (SCU_74h & 0xffefffff) );//PinMux
+ delay(Delay_SCU);
+#endif
+
+} // End void init_scu3 (void)
+
+//------------------------------------------------------------
+// MAC
+//------------------------------------------------------------
+void init_mac (ULONG base, ULONG tdexbase, ULONG rdexbase) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("init_mac\n");
+ Debug_delay();
+ #endif
+
+#ifdef Enable_MAC_SWRst
+ WriteSOC_DD( base + 0x50, 0x80000000 | MAC_50h | MAC_50h_Speed);
+// WriteSOC_DD( base + 0x50, 0x80000000);
+
+ while (0x80000000 & ReadSOC_DD(base+0x50)) {
+//printf(".");
+ DELAY(Delay_MACRst);
+ }
+ DELAY(Delay_MACRst);
+#endif
+
+ WriteSOC_DD( base + 0x20, (tdexbase + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ WriteSOC_DD( base + 0x24, (rdexbase + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+
+#ifdef MAC_30h
+ WriteSOC_DD( base + 0x30, MAC_30h);//Int Thr/Cnt
+#endif
+
+#ifdef MAC_34h
+ WriteSOC_DD( base + 0x34, MAC_34h);//Poll Cnt
+#endif
+
+#ifdef MAC_38h
+ WriteSOC_DD( base + 0x38, MAC_38h);
+#endif
+
+#ifdef MAC_40h
+ if (Enable_MACLoopback) {
+ if (AST2300_NewMDIO) WriteSOC_DD( base + 0x40, MAC_40h | 0x80000000);
+ else WriteSOC_DD( base + 0x40, MAC_40h);
+ }
+#endif
+
+#ifdef MAC_48h
+ WriteSOC_DD( base + 0x48, MAC_48h);
+#endif
+
+ if ( ModeSwitch == MODE_NSCI )
+ WriteSOC_DD( base + 0x4c, NCSI_RxDMA_PakSize);
+ else
+ WriteSOC_DD( base + 0x4c, DMA_PakSize);
+
+ WriteSOC_DD( base + 0x50, MAC_50h | MAC_50h_Speed | 0xf);
+ DELAY(Delay_MACRst);
+} // End void init_mac (ULONG base, ULONG tdexbase, ULONG rdexbase)
+
+//------------------------------------------------------------
+// Basic
+//------------------------------------------------------------
+void FPri_RegValue (BYTE option) {
+
+#ifdef SLT_UBOOT
+#else
+ time_t timecur;
+#endif
+
+ FILE_VAR
+
+ GET_OBJ( option )
+
+ PRINT(OUT_OBJ "[SCU] 04:%08lx 08:%08lx 0c:%08lx 48:%08lx\n", SCU_04h_old, SCU_08h_old, SCU_0ch_old, SCU_48h_old);
+ PRINT(OUT_OBJ "[SCU] 70:%08lx 74:%08lx 7c:%08lx\n", SCU_70h_old, SCU_74h_old, SCU_7ch_old);
+ PRINT(OUT_OBJ "[SCU] 80:%08lx 88:%08lx 90:%08lx f0:%08lx\n", SCU_80h_old, SCU_88h_old, SCU_90h_old, SCU_f0h_old);
+ PRINT(OUT_OBJ "[SCU] a4:%08lx ac:%08lx\n", SCU_a4h_old, SCU_ach_old);
+ PRINT(OUT_OBJ "[WDT] 0c:%08lx 2c:%08lx\n", WDT_0ch_old, WDT_2ch_old);
+ PRINT(OUT_OBJ "[MAC] 08:%08lx 0c:%08lx\n", MAC_08h_old, MAC_0ch_old);
+ PRINT(OUT_OBJ "[MAC] A0|%08lx %08lx %08lx %08lx\n", ReadSOC_DD( MAC_PHYBASE + 0xa0), ReadSOC_DD( MAC_PHYBASE + 0xa4 ), ReadSOC_DD( MAC_PHYBASE + 0xa8 ), ReadSOC_DD(MAC_PHYBASE + 0xac ) );
+ PRINT(OUT_OBJ "[MAC] B0|%08lx %08lx %08lx %08lx\n", ReadSOC_DD( MAC_PHYBASE + 0xb0), ReadSOC_DD( MAC_PHYBASE + 0xb4 ), ReadSOC_DD( MAC_PHYBASE + 0xb8 ), ReadSOC_DD(MAC_PHYBASE + 0xbc ) );
+ PRINT(OUT_OBJ "[MAC] C0|%08lx %08lx %08lx\n", ReadSOC_DD( MAC_PHYBASE + 0xc0), ReadSOC_DD( MAC_PHYBASE + 0xc4 ), ReadSOC_DD( MAC_PHYBASE + 0xc8 ));
+
+#ifdef SLT_UBOOT
+#else
+ fprintf(fp, "Time: %s", ctime(&timestart));
+ time(&timecur);
+ fprintf(fp, "----> %s", ctime(&timecur));
+#endif
+} // End void FPri_RegValue (BYTE *fp)
+
+//------------------------------------------------------------
+void FPri_End (BYTE option) {
+
+ FILE_VAR
+
+ GET_OBJ( option )
+
+ if ( !RxDataEnable ) {
+ }
+ else if ( Err_Flag ) {
+ PRINT(OUT_OBJ " \n----> fail !!!\n");
+ } else {
+ PRINT(OUT_OBJ " \n----> All Pass !!!\n");
+ }
+
+ if ( ModeSwitch == MODE_DEDICATED ) {
+ if (PHY_ADR_arg != PHY_ADR)
+ PRINT(OUT_OBJ "\n[Warning] PHY Address change from %d to %d !!!\n", PHY_ADR_arg, PHY_ADR);
+ }
+
+ if ( AST1010 ) {
+ Dat_ULONG = (SCU_ach_old >> 12) & 0xf;
+ if (Dat_ULONG) {
+ PRINT(OUT_OBJ "\n[Warning] SCUAC[15:12] == 0x%02lx is not the suggestion value 0.\n", Dat_ULONG);
+ PRINT(OUT_OBJ " This change at this platform must been proven again by the ASPEED.\n");
+ }
+
+ SCU_48h_default = SCU_48h_AST1010 & 0x01000f00;
+ if ((SCU_48h_old != SCU_48h_default)) {
+ PRINT(OUT_OBJ "\n[Warning] SCU48 == 0x%08lx is not the suggestion value 0x%08lx.\n", SCU_48h_old, SCU_48h_default);
+ PRINT(OUT_OBJ " This change at this platform must been proven again by the ASPEED.\n");
+ }
+ }
+ else if ( AST2300 ) {
+ if ( AST2400 ) {
+ Dat_ULONG = (SCU_90h_old >> 8) & 0xf;
+ if (Dat_ULONG) {
+ PRINT(OUT_OBJ "\n[Warning] SCU90[11: 8] == 0x%02lx is not the suggestion value 0.\n", Dat_ULONG);
+ PRINT(OUT_OBJ " This change at this platform must been proven again by the ASPEED.\n");
+ }
+ }
+ else {
+ Dat_ULONG = (SCU_90h_old >> 8) & 0xff;
+ if (Dat_ULONG) {
+ PRINT(OUT_OBJ "\n[Warning] SCU90[15: 8] == 0x%02lx is not the suggestion value 0.\n", Dat_ULONG);
+ PRINT(OUT_OBJ " This change at this platform must been proven again by the ASPEED.\n");
+ }
+ }
+
+ if (Enable_MAC34) SCU_48h_default = SCU_48h_AST2300;
+ else SCU_48h_default = SCU_48h_AST2300 & 0x0300ffff;
+
+ if ((SCU_48h_old != SCU_48h_default)) {
+ PRINT(OUT_OBJ "\n[Warning] SCU48 == 0x%08lx is not the suggestion value 0x%08lx.\n", SCU_48h_old, SCU_48h_default);
+ PRINT(OUT_OBJ " This change at this platform must been proven again by the ASPEED.\n");
+ }
+ } // End if ( AST1010 )
+
+ if ( ModeSwitch == MODE_NSCI ) {
+ PRINT(OUT_OBJ "\n[Arg] %d %d %d %d %d %ld (%s)\n", GRun_Mode, PackageTolNum, ChannelTolNum, TestMode, IOTimingBund, (ARPNumCnt| (ULONG)PrintNCSIEn), ASTChipName);
+
+ switch (NCSI_Cap_SLT.PCI_DID_VID) {
+ case PCI_DID_VID_Intel_82574L : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82574L \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82575_10d6 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82575 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82575_10a7 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82575 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82575_10a9 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82575 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_10c9 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_10e6 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_10e7 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_10e8 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_1518 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_1526 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_150a : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82576_150d : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82576 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82599_10fb : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82599 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_82599_1557 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel 82599 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_I350_1521 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel I350 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_I350_1523 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel I350 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_I210 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel I210 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Intel_X540 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel X540 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Broadcom_BCM5718 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Broadcom BCM5718 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Broadcom_BCM5720 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Broadcom BCM5720 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Broadcom_BCM5725 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Broadcom BCM5725 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+// case PCI_DID_VID_Broadcom_BCM57810 : PRINT( OUT_OBJ "[NC]%08x %08x: Broadcom BCM57810 \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case PCI_DID_VID_Mellanox_ConnectX_3 : PRINT( OUT_OBJ "[NC]%08lx %08lx: Mellanox ConnectX-3\n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ default :
+ switch (NCSI_Cap_SLT.ManufacturerID) {
+ case ManufacturerID_Intel : PRINT( OUT_OBJ "[NC]%08lx %08lx: Intel \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case ManufacturerID_Broadcom : PRINT( OUT_OBJ "[NC]%08lx %08lx: Broadcom\n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ case ManufacturerID_Mellanox : PRINT( OUT_OBJ "[NC]%08lx %08lx: Mellanox\n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID ); break;
+ default : PRINT(OUT_OBJ "[NC]%08lx %08lx \n", NCSI_Cap_SLT.ManufacturerID, NCSI_Cap_SLT.PCI_DID_VID); break;
+ } // End switch (NCSI_Cap_SLT.ManufacturerID)
+ } // End switch (NCSI_Cap_SLT.PCI_DID_VID)
+ }
+ else {
+ if (LOOP_INFINI) PRINT(OUT_OBJ "\n[Arg] %d %d %d # %d %d %d %lx (%s)[%d %d %d]\n" , GRun_Mode, GSpeed, GCtrl, TestMode, PHY_ADR_arg, IOTimingBund, UserDVal, ASTChipName, Loop_rl[0], Loop_rl[1], Loop_rl[2]);
+ else PRINT(OUT_OBJ "\n[Arg] %d %d %d %ld %d %d %d %lx (%s)[%d %d %d]\n", GRun_Mode, GSpeed, GCtrl, LOOP_MAX_arg, TestMode, PHY_ADR_arg, IOTimingBund, UserDVal, ASTChipName, Loop_rl[0], Loop_rl[1], Loop_rl[2]);
+
+ PRINT(OUT_OBJ "[PHY] Adr:%d ID2:%04lx ID3:%04lx (%s)\n", PHY_ADR, PHY_ID2, PHY_ID3, PHYName);
+ } // End if ( ModeSwitch == MODE_NSCI )
+
+#ifdef SUPPORT_PHY_LAN9303
+ PRINT(OUT_OBJ "[Ver II] %s (for LAN9303 with I2C%d)\n", version_name, LAN9303_I2C_BUSNUM);
+#else
+ PRINT(OUT_OBJ "[Ver II] %s\n", version_name);
+#endif
+} // End void FPri_End (BYTE option)
+
+//------------------------------------------------------------
+void FPri_ErrFlag (BYTE option) {
+
+ FILE_VAR
+
+ GET_OBJ( option )
+
+ if (Err_Flag && Err_Flag_PrintEn) {
+ PRINT(OUT_OBJ "\n\n");
+//fprintf(fp, "Err_Flag: %x\n\n", Err_Flag);
+
+ if ( Err_Flag & Err_PHY_Type ) PRINT( OUT_OBJ "[Err] Unidentifiable PHY \n" );
+ if ( Err_Flag & Err_MALLOC_FrmSize ) PRINT( OUT_OBJ "[Err] Malloc fail at frame size buffer \n" );
+ if ( Err_Flag & Err_MALLOC_LastWP ) PRINT( OUT_OBJ "[Err] Malloc fail at last WP buffer \n" );
+ if ( Err_Flag & Err_Check_Buf_Data ) PRINT( OUT_OBJ "[Err] Received data mismatch \n" );
+ if ( Err_Flag & Err_NCSI_Check_TxOwnTimeOut ) PRINT( OUT_OBJ "[Err] Time out of checking Tx owner bit in NCSI packet \n" );
+ if ( Err_Flag & Err_NCSI_Check_RxOwnTimeOut ) PRINT( OUT_OBJ "[Err] Time out of checking Rx owner bit in NCSI packet \n" );
+ if ( Err_Flag & Err_NCSI_Check_ARPOwnTimeOut) PRINT( OUT_OBJ "[Err] Time out of checking ARP owner bit in NCSI packet \n" );
+ if ( Err_Flag & Err_NCSI_No_PHY ) PRINT( OUT_OBJ "[Err] Can not find NCSI PHY \n" );
+ if ( Err_Flag & Err_NCSI_Channel_Num ) PRINT( OUT_OBJ "[Err] NCSI Channel Number Mismatch \n" );
+ if ( Err_Flag & Err_NCSI_Package_Num ) PRINT( OUT_OBJ "[Err] NCSI Package Number Mismatch \n" );
+ if ( Err_Flag & Err_PHY_TimeOut ) PRINT( OUT_OBJ "[Err] Time out of read/write/reset PHY register \n" );
+ if ( Err_Flag & Err_RXBUF_UNAVA ) PRINT( OUT_OBJ "[Err] MAC00h[2]:Receiving buffer unavailable \n" );
+ if ( Err_Flag & Err_RPKT_LOST ) PRINT( OUT_OBJ "[Err] MAC00h[3]:Received packet lost due to RX FIFO full \n" );
+ if ( Err_Flag & Err_NPTXBUF_UNAVA ) PRINT( OUT_OBJ "[Err] MAC00h[6]:Normal priority transmit buffer unavailable \n" );
+ if ( Err_Flag & Err_TPKT_LOST ) PRINT( OUT_OBJ "[Err] MAC00h[7]:Packets transmitted to Ethernet lost \n" );
+ if ( Err_Flag & Err_DMABufNum ) PRINT( OUT_OBJ "[Err] DMA Buffer is not enough \n" );
+ if ( Err_Flag & Err_IOMargin ) PRINT( OUT_OBJ "[Err] IO timing margin is not enough \n" );
+
+ if ( Err_Flag & Err_MHCLK_Ratio ) {
+ if ( AST1010 ) {
+ PRINT(OUT_OBJ "[Err] Error setting of MAC AHB bus clock (SCU08[13:12]) \n");
+ Dat_ULONG = (SCU_08h_old >> 12) & 0x3;
+ PRINT(OUT_OBJ " SCU08[13:12] == 0x%01lx is not the suggestion value 0.\n", Dat_ULONG);
+ }
+ else {
+ PRINT(OUT_OBJ "[Err] Error setting of MAC AHB bus clock (SCU08[18:16]) \n");
+ Dat_ULONG = (SCU_08h_old >> 16) & 0x7;
+
+ if (MAC1_1GEn | MAC2_1GEn) {
+ PRINT(OUT_OBJ " SCU08[18:16] == 0x%01lx is not the suggestion value 2.\n", Dat_ULONG);
+ }
+ else {
+ PRINT(OUT_OBJ " SCU08[18:16] == 0x%01lx is not the suggestion value 4.\n", Dat_ULONG);
+ }
+ } // end if ( AST1010 )
+ } // End if ( Err_Flag & Err_MHCLK_Ratio )
+
+ if (Err_Flag & Err_IOMarginOUF ) {
+ PRINT(OUT_OBJ "[Err] IO timing testing range out of boundary\n");
+ if (Enable_RMII) {
+#ifdef Enable_Old_Style
+ PRINT(OUT_OBJ " (%d,%d): 1x%d [%d]x[%d:%d]\n", IOdly_out_reg_idx, IOdly_in_reg_idx, IOTimingBund, IOdly_out_reg_idx, IOdly_in_reg_idx - (IOTimingBund>>1), IOdly_in_reg_idx + (IOTimingBund>>1));
+#else
+ PRINT(OUT_OBJ " (%d,%d): %dx1 [%d:%d]x[%d]\n", IOdly_in_reg_idx, IOdly_out_reg_idx, IOTimingBund, IOdly_in_reg_idx - (IOTimingBund>>1), IOdly_in_reg_idx + (IOTimingBund>>1), IOdly_out_reg_idx);
+#endif
+ } else {
+#ifdef Enable_Old_Style
+ PRINT(OUT_OBJ " (%d,%d): %dx%d [%d:%d]x[%d:%d]\n", IOdly_out_reg_idx, IOdly_in_reg_idx, IOTimingBund, IOTimingBund, IOdly_out_reg_idx - (IOTimingBund>>1), IOdly_out_reg_idx + (IOTimingBund>>1), IOdly_in_reg_idx - (IOTimingBund>>1), IOdly_in_reg_idx + (IOTimingBund>>1));
+#else
+ PRINT(OUT_OBJ " (%d,%d): %dx%d [%d:%d]x[%d:%d]\n", IOdly_in_reg_idx, IOdly_out_reg_idx, IOTimingBund, IOTimingBund, IOdly_in_reg_idx - (IOTimingBund>>1), IOdly_in_reg_idx + (IOTimingBund>>1), IOdly_out_reg_idx - (IOTimingBund>>1), IOdly_out_reg_idx + (IOTimingBund>>1));
+#endif
+ }
+ } // End if (Err_Flag & Err_IOMarginOUF )
+
+ if (Err_Flag & Err_Check_Des ) {
+ PRINT(OUT_OBJ "[Err] Descriptor error\n");
+ if ( Check_Des_Val & Check_Des_TxOwnTimeOut ) PRINT( OUT_OBJ "[Des] Time out of checking Tx owner bit\n" );
+ if ( Check_Des_Val & Check_Des_RxOwnTimeOut ) PRINT( OUT_OBJ "[Des] Time out of checking Rx owner bit\n" );
+ if ( Check_Des_Val & Check_Des_RxErr ) PRINT( OUT_OBJ "[Des] Input signal RxErr \n" );
+ if ( Check_Des_Val & Check_Des_OddNibble ) PRINT( OUT_OBJ "[Des] Nibble bit happen \n" );
+ if ( Check_Des_Val & Check_Des_CRC ) PRINT( OUT_OBJ "[Des] CRC error of frame \n" );
+ if ( Check_Des_Val & Check_Des_RxFIFOFull ) PRINT( OUT_OBJ "[Des] Rx FIFO full \n" );
+ if ( Check_Des_Val & Check_Des_FrameLen ) PRINT( OUT_OBJ "[Des] Frame length mismatch \n" );
+ } // End if (Err_Flag & Err_Check_Des )
+
+ if (Err_Flag & Err_MACMode ) {
+ PRINT(OUT_OBJ "[Err] MAC interface mode mismatch\n");
+ if ( AST1010 ) {
+ }
+ else if (AST2300) {
+ switch (MAC_Mode) {
+ case 0 : PRINT( OUT_OBJ " SCU70h[7:6] == 0: [MAC#1] RMII [MAC#2] RMII \n" ); break;
+ case 1 : PRINT( OUT_OBJ " SCU70h[7:6] == 1: [MAC#1] RGMII [MAC#2] RMII \n" ); break;
+ case 2 : PRINT( OUT_OBJ " SCU70h[7:6] == 2: [MAC#1] RMII [MAC#2] RGMII\n" ); break;
+ case 3 : PRINT( OUT_OBJ " SCU70h[7:6] == 3: [MAC#1] RGMII [MAC#2] RGMII\n" ); break;
+ }
+ }
+ else {
+ switch (MAC_Mode) {
+ case 0 : PRINT( OUT_OBJ " SCU70h[8:6] == 000: [MAC#1] GMII \n" ); break;
+ case 1 : PRINT( OUT_OBJ " SCU70h[8:6] == 001: [MAC#1] MII [MAC#2] MII \n" ); break;
+ case 2 : PRINT( OUT_OBJ " SCU70h[8:6] == 010: [MAC#1] RMII [MAC#2] MII \n" ); break;
+ case 3 : PRINT( OUT_OBJ " SCU70h[8:6] == 011: [MAC#1] MII \n" ); break;
+ case 4 : PRINT( OUT_OBJ " SCU70h[8:6] == 100: [MAC#1] RMII \n" ); break;
+ case 5 : PRINT( OUT_OBJ " SCU70h[8:6] == 101: Reserved \n" ); break;
+ case 6 : PRINT( OUT_OBJ " SCU70h[8:6] == 110: [MAC#1] RMII [MAC#2] RMII\n" ); break;
+ case 7 : PRINT( OUT_OBJ " SCU70h[8:6] == 111: Disable MAC \n" ); break;
+ }
+ } // End if ( AST1010 )
+ } // End if (Err_Flag & Err_MACMode )
+
+ if ( ModeSwitch == MODE_NSCI ) {
+ if (Err_Flag & Err_NCSI_LinkFail ) {
+ PRINT(OUT_OBJ "[Err] NCSI packet retry number over flows when find channel\n");
+
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Get_Version_ID ) PRINT(OUT_OBJ "[NCSI] Time out when Get Version ID \n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Get_Capabilities ) PRINT(OUT_OBJ "[NCSI] Time out when Get Capabilities \n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Select_Active_Package ) PRINT(OUT_OBJ "[NCSI] Time out when Select Active Package \n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Enable_Set_MAC_Address ) PRINT(OUT_OBJ "[NCSI] Time out when Enable Set MAC Address \n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Enable_Broadcast_Filter) PRINT(OUT_OBJ "[NCSI] Time out when Enable Broadcast Filter\n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Enable_Network_TX ) PRINT(OUT_OBJ "[NCSI] Time out when Enable Network TX \n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Enable_Channel ) PRINT(OUT_OBJ "[NCSI] Time out when Enable Channel \n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Disable_Network_TX ) PRINT(OUT_OBJ "[NCSI] Time out when Disable Network TX \n");
+ if (NCSI_LinkFail_Val & NCSI_LinkFail_Disable_Channel ) PRINT(OUT_OBJ "[NCSI] Time out when Disable Channel \n");
+ }
+
+ if (Err_Flag & Err_NCSI_Channel_Num ) PRINT(OUT_OBJ "[NCSI] Channel number expected: %d, real: %d\n", ChannelTolNum, number_chl);
+ if (Err_Flag & Err_NCSI_Package_Num ) PRINT(OUT_OBJ "[NCSI] Peckage number expected: %d, real: %d\n", PackageTolNum, number_pak);
+ } // End if ( ModeSwitch == MODE_NSCI )
+ } // End if (Err_Flag && Err_Flag_PrintEn)
+} // End void FPri_ErrFlag (BYTE option)
+
+//------------------------------------------------------------
+void Finish_Close (void) {
+
+ if (SCU_oldvld)
+ recov_scu();
+
+#ifdef SLT_DOS
+ if (fp_io && IOTiming)
+ fclose(fp_io);
+
+ if (fp_log)
+ fclose(fp_log);
+#endif
+} // End void Finish_Close (void)
+
+//------------------------------------------------------------
+char Finish_Check (int value) {
+ ULONG temp;
+ CHAR i = 0;
+
+#ifdef Disable_VGA
+ if (VGAModeVld) {
+ outp(0x3d4, 0x17);
+ outp(0x3d5, VGAMode);
+ }
+#endif
+ #ifdef DbgPrn_FuncHeader
+ printf ("Finish_Check\n");
+ Debug_delay();
+ #endif
+
+ if ( FRAME_LEN )
+ free(FRAME_LEN);
+
+ if ( wp_lst )
+ free(wp_lst );
+
+ Err_Flag = Err_Flag | value;
+
+ if ( DbgPrn_ErrFlg )
+ printf ("\nErr_Flag: [%08lx]\n", Err_Flag);
+
+ if ( !BurstEnable )
+ FPri_ErrFlag( FP_LOG );
+
+ if ( IOTiming )
+ FPri_ErrFlag( FP_IO );
+
+ FPri_ErrFlag( STD_OUT );
+
+ if ( !BurstEnable )
+ FPri_End( FP_LOG );
+
+ if ( IOTiming )
+ FPri_End( FP_IO );
+
+ FPri_End( STD_OUT );
+
+
+ if ( !BurstEnable ) FPri_RegValue( FP_LOG );
+ if ( IOTiming ) FPri_RegValue( FP_IO );
+
+ Finish_Close();
+
+ // 20140325
+ temp = ReadSOC_DD( 0x1e6e2040 );
+ if ( ModeSwitch == MODE_NSCI )
+ {
+ if ( SelectMAC == 0 )
+ i = 17;
+ else
+ i = 16;
+ }
+ else
+ {
+ if ( SelectMAC == 0 )
+ i = 19;
+ else
+ i = 18;
+ }
+ WriteSOC_DD( 0x1e6e2040, (temp | (1 << i)) );
+
+
+ if ( Err_Flag )
+ {
+ // Fail
+ return( 1 );
+ }
+ else
+ {
+ // Pass
+ return( 0 );
+ }
+} // End char Finish_Check (int value)
+
+//------------------------------------------------------------
+int FindErr (int value) {
+ Err_Flag = Err_Flag | value;
+
+ if ( DbgPrn_ErrFlg )
+ printf ("\nErr_Flag: [%08lx]\n", Err_Flag);
+
+ return(1);
+}
+
+//------------------------------------------------------------
+int FindErr_Des (int value) {
+ Check_Des_Val = Check_Des_Val | value;
+ Err_Flag = Err_Flag | Err_Check_Des;
+ if ( DbgPrn_ErrFlg )
+ printf ("\nErr_Flag: [%08lx] Check_Des_Val: [%08lx]\n", Err_Flag, Check_Des_Val);
+
+ return(1);
+}
+
+//------------------------------------------------------------
+// Get and Check status of Interrupt
+//------------------------------------------------------------
+int check_int ( char *type ) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("check_int : %d\n", Loop);
+ Debug_delay();
+ #endif
+
+ Dat_ULONG = ReadSOC_DD( H_MAC_BASE + 0x00 );//Interrupt Status
+#ifdef SLT_DOS
+#ifdef CheckRxbufUNAVA
+ if ( Dat_ULONG & 0x00000004 ) {
+ fprintf(fp_log, "[%sIntStatus] Receiving buffer unavailable : %08lx [loop:%d]\n", type, Dat_ULONG, Loop);
+ FindErr( Err_RXBUF_UNAVA );
+ }
+#endif
+
+#ifdef CheckRPktLost
+ if ( Dat_ULONG & 0x00000008 ) {
+ fprintf(fp_log, "[%sIntStatus] Received packet lost due to RX FIFO full : %08lx [loop:%d]\n", type, Dat_ULONG, Loop);
+ FindErr( Err_RPKT_LOST );
+ }
+#endif
+
+#ifdef CheckNPTxbufUNAVA
+ if ( Dat_ULONG & 0x00000040 ) {
+ fprintf(fp_log, "[%sIntStatus] Normal priority transmit buffer unavailable: %08lx [loop:%d]\n", type, Dat_ULONG, Loop);
+ FindErr( Err_NPTXBUF_UNAVA );
+ }
+#endif
+
+#ifdef CheckTPktLost
+ if ( Dat_ULONG & 0x00000080 ) {
+ fprintf(fp_log, "[%sIntStatus] Packets transmitted to Ethernet lost : %08lx [loop:%d]\n", type, Dat_ULONG, Loop);
+ FindErr( Err_TPKT_LOST );
+ }
+#endif
+#endif
+ if (Err_Flag)
+ return(1);
+ else
+ return(0);
+} // End int check_int (char *type)
+
+
+//------------------------------------------------------------
+// Buffer
+//------------------------------------------------------------
+void setup_framesize (void) {
+ int i;
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("setup_framesize\n");
+ Debug_delay();
+ #endif
+
+ //------------------------------------------------------------
+ // Fill Frame Size out descriptor area
+ //------------------------------------------------------------
+ #ifdef SLT_UBOOT
+ if (0)
+ #else
+ if ( ENABLE_RAND_SIZE )
+ #endif
+ {
+ for (i = 0; i < DES_NUMBER; i++) {
+ if ( FRAME_Rand_Simple ) {
+ switch(rand() % 5) {
+ case 0 : FRAME_LEN[i] = 0x4e ; break;
+ case 1 : FRAME_LEN[i] = 0x4ba; break;
+ default: FRAME_LEN[i] = 0x5ea; break;
+ }
+ }
+ else {
+ FRAME_LEN_Cur = rand() % (MAX_FRAME_RAND_SIZE + 1);
+
+ if (FRAME_LEN_Cur < MIN_FRAME_RAND_SIZE)
+ FRAME_LEN_Cur = MIN_FRAME_RAND_SIZE;
+
+ FRAME_LEN[i] = FRAME_LEN_Cur;
+ }
+#ifdef SLT_DOS
+ if (DbgPrn_FRAME_LEN)
+ fprintf(fp_log, "[setup_framesize] FRAME_LEN_Cur:%08lx[Des:%d][loop:%d]\n", FRAME_LEN[i], i, Loop);
+#endif
+ }
+ }
+ else {
+ for (i = 0; i < DES_NUMBER; i++) {
+ #ifdef SelectSimpleLength
+ if (i % FRAME_SELH_PERD)
+ FRAME_LEN[i] = FRAME_LENH;
+ else
+ FRAME_LEN[i] = FRAME_LENL;
+ #else
+ if ( BurstEnable ) {
+ if (IEEETesting) {
+ FRAME_LEN[i] = 1514;
+ }
+ else {
+ #ifdef ENABLE_ARP_2_WOL
+ FRAME_LEN[i] = 164;
+ #else
+ FRAME_LEN[i] = 60;
+ #endif
+ }
+ }
+ else {
+ #ifdef SelectLengthInc
+// FRAME_LEN[i] = (i%1455)+60;
+ FRAME_LEN[i] = 1514-( i % 1455 );
+ #else
+ if (i % FRAME_SELH_PERD)
+ FRAME_LEN[i] = FRAME_LENH;
+ else
+ FRAME_LEN[i] = FRAME_LENL;
+ #endif
+ } // End if (BurstEnable)
+ #endif
+/*
+ switch(i % 20) {
+ case 0 : FRAME_LEN[i] = FRAME_LENH; break;
+ case 1 : FRAME_LEN[i] = FRAME_LENH; break;
+ case 2 : FRAME_LEN[i] = FRAME_LENH; break;
+ default: FRAME_LEN[i] = FRAME_LENL; break;
+ }
+*/
+#ifdef SLT_DOS
+ if (DbgPrn_FRAME_LEN)
+ fprintf(fp_log, "[setup_framesize] FRAME_LEN_Cur:%08lx[Des:%d][loop:%d]\n", FRAME_LEN[i], i, Loop);
+#endif
+ } // End for (i = 0; i < DES_NUMBER; i++)
+ } // End if ( ENABLE_RAND_SIZE )
+
+ // Calculate average of frame size
+ Avg_frame_len = 0;
+
+ for ( i = 0; i < DES_NUMBER; i++ ) {
+ Avg_frame_len += FRAME_LEN[i];
+ }
+
+ Avg_frame_len = Avg_frame_len / (double)DES_NUMBER;
+
+ //------------------------------------------------------------
+ // Write Plane
+ //------------------------------------------------------------
+ switch( ZeroCopy_OFFSET & 0x3 ) {
+ case 0: wp_fir = 0xffffffff; break;
+ case 1: wp_fir = 0xffffff00; break;
+ case 2: wp_fir = 0xffff0000; break;
+ case 3: wp_fir = 0xff000000; break;
+ }
+
+ for ( i = 0; i < DES_NUMBER; i++ ) {
+ switch( ( ZeroCopy_OFFSET + FRAME_LEN[i] - 1 ) & 0x3 ) {
+ case 0: wp_lst[i] = 0x000000ff; break;
+ case 1: wp_lst[i] = 0x0000ffff; break;
+ case 2: wp_lst[i] = 0x00ffffff; break;
+ case 3: wp_lst[i] = 0xffffffff; break;
+ }
+ } // End for ( i = 0; i < DES_NUMBER; i++ )
+} // End void setup_framesize (void)
+
+//------------------------------------------------------------
+void setup_arp (void) {
+ int i;
+ for (i = 0; i < 16; i++ )
+ ARP_data[i] = ARP_org_data[i];
+
+ ARP_data[1] = 0x0000ffff | ( SA[0] << 16 )
+ | ( SA[1] << 24 );
+
+ ARP_data[2] = ( SA[2] )
+ | ( SA[3] << 8 )
+ | ( SA[4] << 16 )
+ | ( SA[5] << 24 );
+
+ ARP_data[5] = 0x00000100 | ( SA[0] << 16 )
+ | ( SA[1] << 24 );
+
+ ARP_data[6] = ( SA[2] )
+ | ( SA[3] << 8 )
+ | ( SA[4] << 16 )
+ | ( SA[5] << 24 );
+} // End void setup_arp (void)
+
+//------------------------------------------------------------
+void setup_buf (void) {
+ int i;
+ int j;
+ ULONG adr;
+ ULONG adr_srt;
+ ULONG adr_end;
+ ULONG len;
+ #ifdef SelectSimpleDA
+ int cnt;
+ ULONG Current_framelen;
+ #endif
+
+ #ifdef ENABLE_ARP_2_WOL
+ int DA[3];
+
+ DA[0] = ( ( SelectWOLDA_DatH >> 8 ) & 0x00ff ) |
+ ( ( SelectWOLDA_DatH << 8 ) & 0xff00 );
+
+ DA[1] = ( ( SelectWOLDA_DatL >> 24 ) & 0x00ff ) |
+ ( ( SelectWOLDA_DatL >> 8 ) & 0xff00 );
+
+ DA[2] = ( ( SelectWOLDA_DatL >> 8 ) & 0x00ff ) |
+ ( ( SelectWOLDA_DatL << 8 ) & 0xff00 );
+ #endif
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("setup_buf : %d\n", Loop);
+ Debug_delay();
+ #endif
+
+ // It need be multiple of 4
+ adr_srt = GET_DMA_BASE_SETUP & 0xfffffffc;
+
+ for (j = 0; j < DES_NUMBER; j++) {
+ if ( DbgPrn_BufAdr )
+ printf("[loop:%4d][des:%4d][setup_buf ] %08lx\n", Loop, j, adr_srt);
+
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ #ifdef ENABLE_DASA
+ WriteSOC_DD( adr_srt , 0xffffffff );
+ WriteSOC_DD( adr_srt + 4, ARP_data[1] );
+ WriteSOC_DD( adr_srt + 8, ARP_data[2] );
+
+ for (adr = (adr_srt + 12); adr < (adr_srt + DMA_PakSize); adr += 4 )
+ #else
+ for (adr = adr_srt; adr < (adr_srt + DMA_PakSize); adr += 4 )
+ #endif
+ {
+ switch( TestMode ) {
+ case 1: gdata = 0xffffffff; break;
+ case 2: gdata = 0x55555555; break;
+ case 3: gdata = rand() | (rand() << 16); break;
+ case 5: gdata = UserDVal; break;
+ }
+ WriteSOC_DD(adr, gdata);
+ } // End for()
+ }
+ else {
+ for (i = 0; i < 16; i++) {
+ WriteSOC_DD( adr_srt + ( i << 2 ), ARP_data[i] );
+ }
+
+ #ifdef ENABLE_ARP_2_WOL
+ for (i = 16; i < 40; i += 3) {
+ WriteSOC_DD( adr_srt + ( i << 2 ), ( DA[1] << 16 ) | DA[0] );
+ WriteSOC_DD( adr_srt + ( i << 2 ) + 4, ( DA[0] << 16 ) | DA[2] );
+ WriteSOC_DD( adr_srt + ( i << 2 ) + 8, ( DA[2] << 16 ) | DA[1] );
+ }
+ #endif
+ } // End if ( IEEETesting )
+ }
+ else {
+ // --------------------------------------------
+ #ifdef SelectSimpleData
+ #ifdef SimpleData_Fix
+ switch( j % SimpleData_FixNum ) {
+ case 0 : gdata = SimpleData_FixVal00; break;
+ case 1 : gdata = SimpleData_FixVal01; break;
+ case 2 : gdata = SimpleData_FixVal02; break;
+ case 3 : gdata = SimpleData_FixVal03; break;
+ case 4 : gdata = SimpleData_FixVal04; break;
+ case 5 : gdata = SimpleData_FixVal05; break;
+ case 6 : gdata = SimpleData_FixVal06; break;
+ case 7 : gdata = SimpleData_FixVal07; break;
+ case 8 : gdata = SimpleData_FixVal08; break;
+ case 9 : gdata = SimpleData_FixVal09; break;
+ case 10 : gdata = SimpleData_FixVal10; break;
+ default : gdata = SimpleData_FixVal11; break;
+ }
+ #else
+ gdata = 0x11111111 * ((j + SEED_START) % 256);
+ #endif
+
+ adr_end = adr_srt + DMA_PakSize;
+ for ( adr = adr_srt; adr < adr_end; adr += 4 ) {
+ WriteSOC_DD( adr, gdata );
+ }
+ // --------------------------------------------
+ #elif SelectSimpleDA
+
+ gdata = DATA_SEED(j + SEED_START);
+ Current_framelen = FRAME_LEN[j];
+
+ if ( DbgPrn_FRAME_LEN )
+ fprintf(fp_log, "[setup_buf ] Current_framelen:%08lx[Des:%d][loop:%d]\n", Current_framelen, j, Loop);
+
+ cnt = 0;
+ len = ( ( ( Current_framelen - 14 ) & 0xff ) << 8) |
+ ( ( Current_framelen - 14 ) >> 8 );
+
+ adr_end = adr_srt + DMA_PakSize;
+ for ( adr = adr_srt; adr < adr_end; adr += 4 ) {
+ cnt++;
+ if (cnt == 1 ) WriteSOC_DD( adr, SelectSimpleDA_Dat0 );
+ else if (cnt == 2 ) WriteSOC_DD( adr, SelectSimpleDA_Dat1 );
+ else if (cnt == 3 ) WriteSOC_DD( adr, SelectSimpleDA_Dat2 );
+ else if (cnt == 4 ) WriteSOC_DD( adr, len | (len << 16) );
+ else
+ WriteSOC_DD( adr, gdata );
+
+ gdata += DATA_IncVal;
+ }
+ // --------------------------------------------
+ #else
+
+ gdata = DATA_SEED(j + SEED_START);
+ adr_end = adr_srt + DMA_PakSize;
+ for ( adr = adr_srt; adr < adr_end; adr += 4 ) {
+ WriteSOC_DD( adr, gdata );
+
+ gdata += DATA_IncVal;
+ }
+
+ #endif
+
+ } // End if ( BurstEnable )
+
+ adr_srt += DMA_PakSize;
+ } // End for (j = 0; j < DES_NUMBER; j++)
+} // End void setup_buf (void)
+
+//------------------------------------------------------------
+// Check data of one packet
+//------------------------------------------------------------
+char check_Data (ULONG desadr, LONG number) {
+ int index;
+ int cnt;
+ ULONG rdata;
+ ULONG wp_lst_cur;
+ ULONG adr_las;
+ ULONG adr;
+ ULONG adr_srt;
+ ULONG adr_end;
+ ULONG len;
+ #ifdef SelectSimpleDA
+ ULONG gdata_bak;
+ #endif
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("check_Data : %d\n", Loop);
+ Debug_delay();
+ #endif
+ //printf("[Des:%d][loop:%d]Desadr:%08x\n", number, Loop, desadr);
+
+ wp_lst_cur = wp_lst[number];
+ FRAME_LEN_Cur = FRAME_LEN[number];
+#ifdef SLT_DOS
+ if ( DbgPrn_FRAME_LEN )
+ fprintf(fp_log, "[check_Data ] FRAME_LEN_Cur:%08lx[Des:%d][loop:%d]\n", FRAME_LEN_Cur, number, Loop);
+#endif
+ adr_srt = ReadSOC_DD(desadr) & 0xfffffffc;
+ adr_end = adr_srt + PktByteSize;
+
+ #ifdef SelectSimpleData
+ #ifdef SimpleData_Fix
+ switch( number % SimpleData_FixNum ) {
+ case 0 : gdata = SimpleData_FixVal00; break;
+ case 1 : gdata = SimpleData_FixVal01; break;
+ case 2 : gdata = SimpleData_FixVal02; break;
+ case 3 : gdata = SimpleData_FixVal03; break;
+ case 4 : gdata = SimpleData_FixVal04; break;
+ case 5 : gdata = SimpleData_FixVal05; break;
+ case 6 : gdata = SimpleData_FixVal06; break;
+ case 7 : gdata = SimpleData_FixVal07; break;
+ case 8 : gdata = SimpleData_FixVal08; break;
+ case 9 : gdata = SimpleData_FixVal09; break;
+ case 10 : gdata = SimpleData_FixVal10; break;
+ default : gdata = SimpleData_FixVal11; break;
+ }
+ #else
+ gdata = 0x11111111 * ((number + SEED_START) % 256);
+ #endif
+ #else
+ gdata = DATA_SEED(number + SEED_START);
+ #endif
+
+ wp = wp_fir;
+ adr_las = adr_end - 4;
+
+ cnt = 0;
+ len = (((FRAME_LEN_Cur-14) & 0xff) << 8) | ((FRAME_LEN_Cur-14) >> 8);
+#ifdef SLT_DOS
+ if (DbgPrn_Bufdat)
+ fprintf(fp_log, " Inf:%08lx ~ %08lx(%08lx) %08lx [Des:%d][loop:%d]\n", adr_srt, adr_end, adr_las, gdata, number, Loop);
+#endif
+ for (adr = adr_srt; adr < adr_end; adr+=4) {
+
+ #ifdef SelectSimpleDA
+ cnt++;
+ if ( cnt == 1 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat0; }
+ else if ( cnt == 2 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat1; }
+ else if ( cnt == 3 ) { gdata_bak = gdata; gdata = SelectSimpleDA_Dat2; }
+ else if ( cnt == 4 ) { gdata_bak = gdata; gdata = len | (len << 16); }
+ #endif
+ rdata = ReadSOC_DD(adr);
+ if (adr == adr_las)
+ wp = wp & wp_lst_cur;
+
+ if ( (rdata & wp) != (gdata & wp) ) {
+#ifdef SLT_DOS
+ fprintf(fp_log, "\nError: Adr:%08lx[%3d] (%08lx) (%08lx:%08lx) [Des:%d][loop:%d]\n", adr, (adr - adr_srt) / 4, rdata, gdata, wp, number, Loop);
+#endif
+ for (index = 0; index < 6; index++) {
+ rdata = ReadSOC_DD(adr);
+#ifdef SLT_DOS
+ fprintf(fp_log, "Rep : Adr:%08lx (%08lx) (%08lx:%08lx) [Des:%d][loop:%d]\n", adr, rdata, gdata, wp, number, Loop);
+#endif
+ }
+
+ if ( DbgPrn_DumpMACCnt )
+ dump_mac_ROreg();
+
+ return( FindErr( Err_Check_Buf_Data ) );
+ } // End if ( (rdata & wp) != (gdata & wp) )
+#ifdef SLT_DOS
+ if ( DbgPrn_BufdatDetail )
+ fprintf(fp_log, " Adr:%08lx[%3d] (%08lx) (%08lx:%08lx) [Des:%d][loop:%d]\n", adr, (adr - adr_srt) / 4, rdata, gdata, wp, number, Loop);
+#endif
+ #ifdef SelectSimpleDA
+ if ( cnt <= 4 )
+ gdata = gdata_bak;
+ #endif
+
+ #ifdef SelectSimpleData
+ #else
+ gdata += DATA_IncVal;
+ #endif
+
+ wp = 0xffffffff;
+ }
+ return(0);
+} // End char check_Data (ULONG desadr, LONG number)
+
+//------------------------------------------------------------
+char check_buf (int loopcnt) {
+ int count;
+ ULONG desadr;
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("check_buf : %d\n", Loop);
+ Debug_delay();
+ #endif
+
+ for ( count = DES_NUMBER - 1; count >= 0; count-- ) {
+ desadr = H_RDES_BASE + ( 16 * count ) + 12;
+ //printf("%d:%08x\n", count, desadr);
+ if (check_Data(desadr, count)) {
+ check_int ("");
+
+ return(1);
+ }
+ }
+ if ( check_int ("") )
+ return(1);
+
+ return(0);
+} // End char check_buf (int loopcnt)
+
+//------------------------------------------------------------
+// Descriptor
+//------------------------------------------------------------
+void setup_txdes (ULONG desadr, ULONG bufbase) {
+ ULONG bufadr;
+ ULONG desval;
+ int count;
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("setup_txdes: %d\n", Loop);
+ Debug_delay();
+ #endif
+
+ bufadr = bufbase + ZeroCopy_OFFSET;
+
+ if (TxDataEnable) {
+ for (count = 0; count < DES_NUMBER; count++) {
+ FRAME_LEN_Cur = FRAME_LEN[count];
+ desval = TDES_IniVal;
+ #ifdef SLT_DOS
+ if (DbgPrn_FRAME_LEN)
+ fprintf(fp_log, "[setup_txdes ] FRAME_LEN_Cur:%08lx[Des:%d][loop:%d]\n", FRAME_LEN_Cur, count, Loop);
+ #endif
+ if (DbgPrn_BufAdr)
+ printf("[loop:%4d][des:%4d][setup_txdes] %08lx\n", Loop, count, bufadr);
+
+ WriteSOC_DD( desadr + 0x04, 0 );
+ WriteSOC_DD( desadr + 0x08, 0 );
+ WriteSOC_DD( desadr + 0x0C, (bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ if ( count == ( DES_NUMBER - 1 ) )
+ WriteSOC_DD( desadr , desval | EOR_IniVal);
+ else
+ WriteSOC_DD( desadr , desval );
+
+ bufadr += DMA_PakSize;
+ desadr += 16;
+ }
+ }
+ else {
+ WriteSOC_DD( desadr , 0);
+ }
+} // End void setup_txdes (ULONG desadr, ULONG bufbase)
+
+//------------------------------------------------------------
+void setup_rxdes (ULONG desadr, ULONG bufbase) {
+ ULONG bufadr;
+ ULONG desval;
+ int count;
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("setup_rxdes: %d\n", Loop);
+ Debug_delay();
+ #endif
+
+ bufadr = bufbase+ZeroCopy_OFFSET;
+ desval = RDES_IniVal;
+
+ if ( RxDataEnable ) {
+ for (count = 0; count < DES_NUMBER; count++) {
+ if (DbgPrn_BufAdr)
+ printf("[loop:%4d][des:%4d][setup_rxdes] %08lx\n", Loop, count, bufadr);
+ WriteSOC_DD( desadr + 0x04, 0 );
+ WriteSOC_DD( desadr + 0x08, 0 );
+ WriteSOC_DD( desadr + 0x0C, ( bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ if ( count == ( DES_NUMBER - 1 ) )
+ WriteSOC_DD( desadr , desval | EOR_IniVal );
+ else
+ WriteSOC_DD( desadr , desval );
+
+ desadr += 16;
+ bufadr += DMA_PakSize;
+ }
+ }
+ else {
+ WriteSOC_DD( desadr , 0x80000000 );
+ } // End if ( RxDataEnable )
+} // End void setup_rxdes (ULONG desadr, ULONG bufbase)
+
+//------------------------------------------------------------
+// First setting TX and RX information
+//------------------------------------------------------------
+void setup_des (ULONG bufnum) {
+
+ if ( DbgPrn_BufAdr ) {
+ printf ("setup_rxdes: %ld\n", bufnum);
+ Debug_delay();
+ }
+
+ setup_txdes( H_TDES_BASE, GET_DMA_BASE_SETUP );
+ setup_rxdes( H_RDES_BASE, GET_DMA_BASE(0) );
+
+} // End void setup_des (ULONG bufnum)
+
+//------------------------------------------------------------
+// Move buffer point of TX and RX descriptor to next DMA buffer
+//------------------------------------------------------------
+void setup_des_loop (ULONG bufnum) {
+ int count;
+ ULONG H_rx_desadr;
+ ULONG H_tx_desadr;
+ ULONG H_tx_bufadr;
+ ULONG H_rx_bufadr;
+
+ if ( DbgPrn_BufAdr ) {
+ printf ("setup_rxdes_loop: %ld\n", bufnum);
+ Debug_delay();
+ }
+
+ if (RxDataEnable) {
+ H_rx_bufadr = GET_DMA_BASE( bufnum + 1 ) + ZeroCopy_OFFSET;
+ H_rx_desadr = H_RDES_BASE;
+//printf (" =====>setup_rxdes_loop: %ld [%lX]\n", bufnum, H_rx_bufadr);
+ for (count = 0; count < DES_NUMBER; count++) {
+ WriteSOC_DD(H_rx_desadr + 0x0C, (H_rx_bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+
+ if (count == (DES_NUMBER - 1)) {
+ WriteSOC_DD( H_rx_desadr, RDES_IniVal | EOR_IniVal );
+ }
+ else {
+ WriteSOC_DD( H_rx_desadr, RDES_IniVal );
+ }
+ H_rx_bufadr += DMA_PakSize;
+ H_rx_desadr += 16;
+ }
+ }
+
+ if (TxDataEnable) {
+ if (RxDataEnable) {
+ H_tx_bufadr = GET_DMA_BASE( bufnum ) + ZeroCopy_OFFSET;
+ }
+ else {
+ H_tx_bufadr = GET_DMA_BASE( 0 ) + ZeroCopy_OFFSET;
+ }
+ H_tx_desadr = H_TDES_BASE;
+//printf (" =====>setup_Txdes_loop: %ld [%lX]\n", bufnum, H_tx_bufadr);
+ for (count = 0; count < DES_NUMBER; count++) {
+ FRAME_LEN_Cur = FRAME_LEN[count];
+ WriteSOC_DD( H_tx_desadr + 0x0C, ( H_tx_bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ if (count == (DES_NUMBER - 1)) {
+ WriteSOC_DD( H_tx_desadr, TDES_IniVal | EOR_IniVal );
+ }
+ else {
+ WriteSOC_DD( H_tx_desadr, TDES_IniVal );
+ }
+ H_tx_bufadr += DMA_PakSize;
+ H_tx_desadr += 16;
+ }
+ }
+
+ WriteSOC_DD( H_MAC_BASE + 0x18, 0x00000000 ); // Tx Poll
+ WriteSOC_DD( H_MAC_BASE + 0x1c, 0x00000000 ); // Rx Poll
+} // End void setup_des_loop (ULONG bufnum)
+
+//------------------------------------------------------------
+char check_des_header_Tx (char *type, ULONG adr, LONG desnum) {
+ int timeout = 0;
+ ULONG dat;
+
+ dat = ReadSOC_DD(adr);
+
+ while ( HWOwnTx(dat) ) {
+ // we will run again, if transfer has not been completed.
+ if ( RxDataEnable && (++timeout > TIME_OUT_Des) ) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[%sTxDesOwn] Address %08lx = %08lx [Des:%d][loop:%d]\n", type, adr, dat, desnum, Loop);
+ #endif
+ return(FindErr_Des(Check_Des_TxOwnTimeOut));
+ }
+ WriteSOC_DD(H_MAC_BASE + 0x18, 0x00000000);//Tx Poll
+ WriteSOC_DD(H_MAC_BASE + 0x1c, 0x00000000);//Rx Poll
+
+ #ifdef Delay_ChkTxOwn
+ delay(Delay_ChkTxOwn);
+ #endif
+ dat = ReadSOC_DD(adr);
+ }
+
+ return(0);
+} // End char check_des_header_Tx (char *type, ULONG adr, LONG desnum)
+
+//------------------------------------------------------------
+char check_des_header_Rx (char *type, ULONG adr, LONG desnum) {
+ #ifdef CheckRxOwn
+ int timeout = 0;
+ ULONG dat;
+
+ dat = ReadSOC_DD(adr);
+
+ while ( HWOwnRx( dat ) ) {
+ // we will run again, if transfer has not been completed.
+ if (TxDataEnable && (++timeout > TIME_OUT_Des)) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[%sRxDesOwn] Address %08lx = %08lx [Des:%d][loop:%d]\n", type, adr, dat, desnum, Loop);
+ #endif
+ return(FindErr_Des(Check_Des_RxOwnTimeOut));
+ }
+
+ WriteSOC_DD(H_MAC_BASE + 0x18, 0x00000000);//Tx Poll
+ WriteSOC_DD(H_MAC_BASE + 0x1c, 0x00000000);//Rx Poll
+
+ #ifdef Delay_ChkRxOwn
+ delay(Delay_ChkRxOwn);
+ #endif
+ dat = ReadSOC_DD(adr);
+ };
+
+ Dat_ULONG = ReadSOC_DD( adr + 12 );
+
+ #ifdef CheckRxLen
+ #ifdef SLT_DOS
+ if ( DbgPrn_FRAME_LEN )
+ fprintf(fp_log, "[%sRxDes ] FRAME_LEN_Cur:%08lx[Des:%d][loop:%d]\n", type, (FRAME_LEN_Cur + 4), desnum, Loop);
+ #endif
+
+ if ((dat & 0x3fff) != (FRAME_LEN_Cur + 4)) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[%sRxDes] Error Frame Length %08lx:%08lx %08lx(%4d/%4d) [Des:%d][loop:%d]\n", type, adr, dat, Dat_ULONG, (dat & 0x3fff), (FRAME_LEN_Cur + 4), desnum, Loop);
+ #endif
+ FindErr_Des(Check_Des_FrameLen);
+ }
+ #endif // End CheckRxLen
+
+ #ifdef CheckRxErr
+ if (dat & 0x00040000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[%sRxDes] Error RxErr %08lx:%08lx %08lx [Des:%d][loop:%d]\n", type, adr, dat, Dat_ULONG, desnum, Loop);
+ #endif
+ FindErr_Des(Check_Des_RxErr);
+ }
+ #endif // End CheckRxErr
+
+ #ifdef CheckOddNibble
+ if (dat & 0x00400000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[%sRxDes] Odd Nibble %08lx:%08lx %08lx [Des:%d][loop:%d]\n", type, adr, dat, Dat_ULONG, desnum, Loop);
+ #endif
+ FindErr_Des(Check_Des_OddNibble);
+ }
+ #endif // End CheckOddNibble
+
+ #ifdef CheckCRC
+ if (dat & 0x00080000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[%sRxDes] Error CRC %08lx:%08lx %08lx [Des:%d][loop:%d]\n", type, adr, dat, Dat_ULONG, desnum, Loop);
+ #endif
+ FindErr_Des(Check_Des_CRC);
+ }
+ #endif // End CheckCRC
+
+ #ifdef CheckRxFIFOFull
+ if (dat & 0x00800000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[%sRxDes] Error Rx FIFO Full %08lx:%08lx %08lx [Des:%d][loop:%d]\n", type, adr, dat, Dat_ULONG, desnum, Loop);
+ #endif
+ FindErr_Des(Check_Des_RxFIFOFull);
+ }
+ #endif // End CheckRxFIFOFull
+
+ // if (check_int ("")) {return(1);}
+ #endif // End CheckRxOwn
+
+ if (Err_Flag)
+ return(1);
+ else
+ return(0);
+} // End char check_des_header_Rx (char *type, ULONG adr, LONG desnum)
+
+//------------------------------------------------------------
+char check_des (ULONG bufnum, int checkpoint) {
+ int desnum;
+ ULONG H_rx_desadr;
+ ULONG H_tx_desadr;
+ ULONG H_tx_bufadr;
+ ULONG H_rx_bufadr;
+
+ #ifdef Delay_DesGap
+ ULONG dly_cnt = 0;
+ ULONG dly_max = Delay_CntMaxIncVal;
+ #endif
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("check_des : %d(%d)\n", Loop, checkpoint);
+ Debug_delay();
+ #endif
+
+ // Fire the engine to send and recvice
+ WriteSOC_DD( H_MAC_BASE + 0x18, 0x00000000 );//Tx Poll
+ WriteSOC_DD( H_MAC_BASE + 0x1c, 0x00000000 );//Rx Poll
+
+ #ifdef SelectSimpleDes
+ #else
+ if ( IEEETesting == 1 ) {
+ // IEEE test mode, there is the same data in every lan packet
+ H_tx_bufadr = GET_DMA_BASE_SETUP;
+ H_rx_bufadr = GET_DMA_BASE(0);
+ }
+ else {
+ H_rx_bufadr = GET_DMA_BASE( bufnum + 1 ) + ZeroCopy_OFFSET;
+
+ if (RxDataEnable) {
+ H_tx_bufadr = GET_DMA_BASE(bufnum ) + ZeroCopy_OFFSET;
+ }
+ else {
+ H_tx_bufadr = GET_DMA_BASE( 0 ) + ZeroCopy_OFFSET;
+ }
+ }
+ #endif
+
+ H_rx_desadr = H_RDES_BASE;
+ H_tx_desadr = H_TDES_BASE;
+
+ #ifdef Delay_DES
+ delay(Delay_DES);
+ #endif
+
+ for (desnum = 0; desnum < DES_NUMBER; desnum++) {
+ if ( DbgPrn_BufAdr )
+ printf( "[loop:%4d][des:%4d][check_des ] %08lx %08lx [%08lx] [%08lx]\n", Loop, desnum, ( H_tx_desadr ), ( H_rx_desadr ), ReadSOC_DD( H_tx_desadr + 12 ), ReadSOC_DD( H_rx_desadr + 12 ) );
+
+ //[Delay]--------------------
+ #ifdef Delay_DesGap
+ if ( dly_cnt++ > 3 ) {
+ switch ( rand() % 12 ) {
+ case 1 : dly_max = 00000; break;
+ case 3 : dly_max = 20000; break;
+ case 5 : dly_max = 40000; break;
+ case 7 : dly_max = 60000; break;
+ defaule: dly_max = 70000; break;
+ }
+
+ dly_max += ( rand() % 4 ) * 14321;
+
+ while (dly_cnt < dly_max) {
+ dly_cnt++;
+ }
+
+ dly_cnt = 0;
+ }
+ else {
+// timeout = 0;
+// while (timeout < 50000) {timeout++;};
+ }
+ #endif // End Delay_DesGap
+
+ //[Check Owner Bit]--------------------
+ FRAME_LEN_Cur = FRAME_LEN[desnum];
+#ifdef SLT_DOS
+ if ( DbgPrn_FRAME_LEN )
+ fprintf(fp_log, "[check_des ] FRAME_LEN_Cur:%08lx[Des:%d][loop:%d]%d\n", FRAME_LEN_Cur, desnum, Loop, checkpoint);
+#endif
+// if (BurstEnable) {
+// if (check_des_header_Tx("", H_tx_desadr, desnum)) {CheckDesFail_DesNum = desnum; return(1);}
+// } else {
+// if (check_des_header_Rx("", H_rx_desadr, desnum)) {CheckDesFail_DesNum = desnum; return(1);}
+// if (check_des_header_Tx("", H_tx_desadr, desnum)) {CheckDesFail_DesNum = desnum; return(1);}
+// }
+
+ // Check the description of Tx and Rx
+ if ( RxDataEnable && check_des_header_Rx("", H_rx_desadr, desnum) ) {
+ CheckDesFail_DesNum = desnum;
+
+ return(1);
+ }
+ if ( TxDataEnable && check_des_header_Tx("", H_tx_desadr, desnum) ) {
+ CheckDesFail_DesNum = desnum;
+
+ return(1);
+ }
+// else {
+// printf(" %d \r", desnum);
+// }
+
+ #ifdef SelectSimpleDes
+ #else
+ if ( !checkpoint ) {
+ // Setting buffer address to description of Tx and Rx on next stage
+
+// if (!BurstEnable) {
+// WriteSOC_DD( H_rx_desadr + 0x0C, (H_rx_bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) );
+// WriteSOC_DD( H_tx_desadr + 0x0C, (H_tx_bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) );
+// }
+//
+// if ( desnum == (DES_NUMBER - 1) ) {
+// WriteSOC_DD( H_rx_desadr, RDES_IniVal | EOR_IniVal );
+// WriteSOC_DD( H_tx_desadr, TDES_IniVal | EOR_IniVal );
+// }
+// else {
+// WriteSOC_DD( H_rx_desadr, RDES_IniVal );
+// WriteSOC_DD( H_tx_desadr, TDES_IniVal );
+// }
+// WriteSOC_DD( H_MAC_BASE+0x18, 0x00000000 ); //Tx Poll
+// WriteSOC_DD( H_MAC_BASE+0x1c, 0x00000000 ); //Rx Poll
+
+ if ( RxDataEnable ) {
+ WriteSOC_DD( H_rx_desadr + 0x0C, (H_rx_bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+
+ if ( desnum == (DES_NUMBER - 1) ) {
+ WriteSOC_DD( H_rx_desadr, RDES_IniVal | EOR_IniVal );
+ } else {
+ WriteSOC_DD( H_rx_desadr, RDES_IniVal );
+ }
+ }
+ if ( TxDataEnable ) {
+ WriteSOC_DD( H_tx_desadr + 0x0C, (H_tx_bufadr + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ if ( desnum == (DES_NUMBER - 1) ) {
+ WriteSOC_DD( H_tx_desadr, TDES_IniVal | EOR_IniVal );
+ }
+ else {
+ WriteSOC_DD( H_tx_desadr, TDES_IniVal );
+ }
+ }
+ WriteSOC_DD( H_MAC_BASE + 0x18, 0x00000000 ); //Tx Poll
+ WriteSOC_DD( H_MAC_BASE + 0x1c, 0x00000000 ); //Rx Poll
+ }
+ H_rx_bufadr += DMA_PakSize;
+ H_tx_bufadr += DMA_PakSize;
+ #endif // End SelectSimpleDes
+
+ H_rx_desadr += 16;
+ H_tx_desadr += 16;
+ } // End for (desnum = 0; desnum < DES_NUMBER; desnum++)
+
+ return(0);
+} // End char check_des (ULONG bufnum, int checkpoint)
+//#endif
+
+//------------------------------------------------------------
+// Print
+//------------------------------------------------------------
+void PrintMode (void) {
+ if (Enable_MAC34) printf ("run_mode[dec] | 0->MAC1 1->MAC2 2->MAC3 3->MAC4\n");
+ else printf ("run_mode[dec] | 0->MAC1 1->MAC2\n");
+}
+
+//------------------------------------------------------------
+void PrintSpeed (void) {
+ printf ("speed[dec] | 0->1G 1->100M 2->10M 3->all speed (default:%3d)\n", DEF_SPEED);
+}
+
+//------------------------------------------------------------
+void PrintCtrl (void) {
+ printf ("ctrl[dec] | bit0~2: Reserved\n");
+ printf ("(default:%3d) | bit3 : 1->Enable PHY init 0->Disable PHY init\n", GCtrl);
+ printf (" | bit4 : 1->Enable PHY int-loop 0->Disable PHY int-loop\n");
+ printf (" | bit5 : 1->Ignore PHY ID 0->Check PHY ID\n");
+ if (AST2400) {
+ printf (" | bit6 : 1->Enable MAC int-loop 0->Disable MAC int-loop\n");
+ }
+}
+
+//------------------------------------------------------------
+void PrintLoop (void) {
+ printf ("loop_max[dec] | 1G : 20 will run 1 sec (default:%3d)\n", DEF_LOOP_MAX * 20);
+ printf (" | 100M: 2 will run 1 sec (default:%3d)\n", DEF_LOOP_MAX * 2);
+ printf (" | 10M : 1 will run 1 sec (default:%3d)\n", DEF_LOOP_MAX);
+}
+
+//------------------------------------------------------------
+void PrintTest (void) {
+ if ( ModeSwitch == MODE_NSCI ) {
+ printf ("test_mode[dec] | 0: NCSI configuration with Disable_Channel request\n");
+ printf ("(default:%3d) | 1: NCSI configuration without Disable_Channel request\n", DEF_TESTMODE);
+ }
+ else {
+ printf ("test_mode[dec] | 0: Tx/Rx frame checking\n");
+ printf ("(default:%3d) | 1: Tx output 0xff frame\n", DEF_TESTMODE);
+ printf (" | 2: Tx output 0x55 frame\n");
+ printf (" | 3: Tx output random frame\n");
+ printf (" | 4: Tx output ARP frame\n");
+ printf (" | 5: Tx output user defined value frame (default:0x%8x)\n", DEF_USER_DEF_PACKET_VAL);
+ } // End if ( ModeSwitch == MODE_NSCI )
+
+ if (AST2300) {
+ printf (" | 6: IO timing testing\n");
+ printf (" | 7: IO timing/strength testing\n");
+ }
+}
+
+//------------------------------------------------------------
+void PrintPHYAdr (void) {
+ printf ("phy_adr[dec] | 0~31: PHY Address (default:%d)\n", DEF_PHY_ADR);
+}
+
+//------------------------------------------------------------
+void PrintIOTimingBund (void) {
+ printf ("IO margin[dec] | 0/1/3/5 (default:%d)\n", DEF_IOTIMINGBUND);
+}
+
+//------------------------------------------------------------
+void PrintPakNUm (void) {
+ printf ("package_num[dec] | 1~ 8: Total Number of NCSI Package (default:%d)\n", DEF_PACKAGE2NUM);
+}
+
+//------------------------------------------------------------
+void PrintChlNUm (void) {
+ printf ("channel_num[dec] | 1~32: Total Number of NCSI Channel (default:%d)\n", DEF_CHANNEL2NUM);
+}
+
+//------------------------------------------------------------
+
+void Print_Header (BYTE option) {
+
+ FILE_VAR
+
+ GET_OBJ( option )
+
+ if (GSpeed_sel[0]) PRINT(OUT_OBJ " 1G ");
+ else if (GSpeed_sel[1]) PRINT(OUT_OBJ " 100M ");
+ else PRINT(OUT_OBJ " 10M ");
+
+ switch (TestMode) {
+ case 0 : PRINT(OUT_OBJ "Tx/Rx frame checking \n" ); break;
+ case 1 : PRINT(OUT_OBJ "Tx output 0xff frame \n" ); break;
+ case 2 : PRINT(OUT_OBJ "Tx output 0x55 frame \n" ); break;
+ case 3 : PRINT(OUT_OBJ "Tx output random frame \n" ); break;
+ case 4 : PRINT(OUT_OBJ "Tx output ARP frame \n" ); break;
+ case 5 : PRINT(OUT_OBJ "Tx output 0x%08lx frame \n", UserDVal); break;
+ case 6 : PRINT(OUT_OBJ "IO delay testing \n" ); break;
+ case 7 : PRINT(OUT_OBJ "IO delay testing(Strength) \n" ); break;
+ case 8 : PRINT(OUT_OBJ "Tx frame \n" ); break;
+ case 9 : PRINT(OUT_OBJ "Rx frame checking \n" ); break;
+ }
+}
+
+//------------------------------------------------------------
+void PrintIO_Header (BYTE option) {
+
+ FILE_VAR
+
+ GET_OBJ( option )
+
+ if ( IOStrength ) {
+ if (GSpeed_sel[0]) PRINT(OUT_OBJ "[Strength %ld][1G ]========================================\n", IOStr_i);
+ else if (GSpeed_sel[1]) PRINT(OUT_OBJ "[Strength %ld][100M]========================================\n", IOStr_i);
+ else PRINT(OUT_OBJ "[Strength %ld][10M ]========================================\n", IOStr_i);
+ } else {
+ if (GSpeed_sel[0]) PRINT(OUT_OBJ "[1G ]========================================\n");
+ else if (GSpeed_sel[1]) PRINT(OUT_OBJ "[100M]========================================\n");
+ else PRINT(OUT_OBJ "[10M ]========================================\n");
+ }
+
+#ifdef Enable_Old_Style
+ if (Enable_RMII) PRINT(OUT_OBJ "Tx:SCU48[ %2d]= ", IOdly_out_shf);
+ else PRINT(OUT_OBJ "Tx:SCU48[%2d:%2d]= ", IOdly_out_shf+3, IOdly_out_shf);
+
+ for (IOdly_j = IOdly_out_str; IOdly_j <= IOdly_out_end; IOdly_j+=IOdly_incval) {
+ IOdly_out = valary[IOdly_j];
+ PRINT(OUT_OBJ "%2x", IOdly_out);
+ }
+
+ PRINT(OUT_OBJ "\n ");
+ for (IOdly_j = IOdly_out_str; IOdly_j <= IOdly_out_end; IOdly_j+=IOdly_incval) {
+ if (IOdly_out_reg_idx == IOdly_j) PRINT(OUT_OBJ " |");
+ else PRINT(OUT_OBJ " ");
+ }
+#else
+ PRINT(OUT_OBJ "Rx:SCU48[%2d:%2d]= ", IOdly_in_shf+3, IOdly_in_shf);
+
+ for (IOdly_i = IOdly_in_str; IOdly_i <= IOdly_in_end; IOdly_i+=IOdly_incval) {
+ IOdly_in = valary[IOdly_i];
+ PRINT(OUT_OBJ "%2x", IOdly_in);
+ }
+
+ PRINT(OUT_OBJ "\n ");
+ for (IOdly_i = IOdly_in_str; IOdly_i <= IOdly_in_end; IOdly_i+=IOdly_incval) {
+ if (IOdly_in_reg_idx == IOdly_i) PRINT(OUT_OBJ " |");
+ else PRINT(OUT_OBJ " ");
+ }
+#endif
+
+ PRINT(OUT_OBJ "\n");
+} // End void PrintIO_Header (BYTE option)
+
+//------------------------------------------------------------
+void PrintIO_LineS (BYTE option) {
+
+ FILE_VAR
+
+ GET_OBJ( option )
+
+
+#ifdef Enable_Old_Style
+ if (IOdly_in_reg == IOdly_in) {
+ PRINT(OUT_OBJ "Rx:SCU48[%2d:%2d]=%01x:-", IOdly_in_shf+3, IOdly_in_shf, IOdly_in);
+ }
+ else {
+ PRINT(OUT_OBJ "Rx:SCU48[%2d:%2d]=%01x: ", IOdly_in_shf+3, IOdly_in_shf, IOdly_in);
+ }
+#else
+ if (Enable_RMII) {
+ if (IOdly_out_reg == IOdly_out) {
+ PRINT(OUT_OBJ "Tx:SCU48[ %2d]=%01x:-", IOdly_out_shf, IOdly_out);
+ }
+ else {
+ PRINT(OUT_OBJ "Tx:SCU48[ %2d]=%01x: ", IOdly_out_shf, IOdly_out);
+ }
+ } else {
+ if (IOdly_out_reg == IOdly_out) {
+ PRINT(OUT_OBJ "Tx:SCU48[%2d:%2d]=%01x:-", IOdly_out_shf+3, IOdly_out_shf, IOdly_out);
+ }
+ else {
+ PRINT(OUT_OBJ "Tx:SCU48[%2d:%2d]=%01x: ", IOdly_out_shf+3, IOdly_out_shf, IOdly_out);
+ }
+ }
+#endif
+} // void PrintIO_LineS (BYTE option)
+
+//------------------------------------------------------------
+void PrintIO_Line (BYTE option) {
+
+ FILE_VAR
+
+ GET_OBJ( option )
+
+ if ( ( IOdly_in_reg == IOdly_in ) && ( IOdly_out_reg == IOdly_out ) ) {
+ if (dlymap[IOdly_i][IOdly_j]) PRINT(OUT_OBJ " X");
+ else PRINT(OUT_OBJ " O");
+ }
+ else {
+ if (dlymap[IOdly_i][IOdly_j]) PRINT(OUT_OBJ " x");
+ else PRINT(OUT_OBJ " o");
+ }
+} // End void PrintIO_Line (BYTE option)
+
+//------------------------------------------------------------
+void PrintIO_Line_LOG (void) {
+#ifndef SLT_UBOOT
+#ifdef Enable_Old_Style
+ if (Enable_RMII) fprintf(fp_log, "\nTx:SCU48[ %2d]=%2x, ", IOdly_out_shf, IOdly_out);
+ else fprintf(fp_log, "\nTx:SCU48[%2d:%2d]=%2x, ", IOdly_out_shf+3, IOdly_out_shf, IOdly_out);
+
+ fprintf(fp_log, "Rx:SCU48[%2d:%2d]=%01x: ", IOdly_in_shf+3, IOdly_in_shf, IOdly_in);
+
+ if (dlymap[IOdly_i][IOdly_j]) fprintf(fp_log, " X\n");
+ else fprintf(fp_log, " O\n");
+#else
+ fprintf(fp_log, "\nRx:SCU48[%2d:%2d]=%2x, ", IOdly_in_shf+3, IOdly_in_shf, IOdly_in);
+
+ if (Enable_RMII) fprintf(fp_log, "Tx:SCU48[ %2d]=%01x: ", IOdly_out_shf, IOdly_out);
+ else fprintf(fp_log, "Tx:SCU48[%2d:%2d]=%01x: ", IOdly_out_shf+3, IOdly_out_shf, IOdly_out);
+
+ if (dlymap[IOdly_i][IOdly_j]) fprintf(fp_log, " X\n");
+ else fprintf(fp_log, " O\n");
+#endif
+#endif
+}
+
+//------------------------------------------------------------
+// main
+//------------------------------------------------------------
+void Calculate_LOOP_CheckNum (void) {
+
+#define ONE_MBYTE 1048576
+
+ #ifdef CheckDataEveryTime
+ LOOP_CheckNum = 1;
+ #else
+ if (IOTiming || IOTimingBund || (GSpeed == SET_1G_100M_10MBPS)) {
+ LOOP_CheckNum = LOOP_MAX;
+ }
+ else {
+ switch ( GSpeed ) {
+ case SET_1GBPS : CheckBuf_MBSize = MOVE_DATA_MB_SEC ; break; // 1G
+ case SET_100MBPS : CheckBuf_MBSize = (MOVE_DATA_MB_SEC >> 3); break; // 100M ~ 1G / 8
+ case SET_10MBPS : CheckBuf_MBSize = (MOVE_DATA_MB_SEC >> 6); break; // 10M ~ 1G / 64
+ }
+ LOOP_CheckNum = ( CheckBuf_MBSize / ( ((DES_NUMBER * DMA_PakSize) / ONE_MBYTE ) + 1) );
+ }
+ #endif
+}
+
+//------------------------------------------------------------
+void TestingSetup (void) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("TestingSetup\n");
+ Debug_delay();
+ #endif
+
+ #ifdef SLT_UBOOT
+ #else
+ #ifdef Rand_Sed
+ srand((unsigned) Rand_Sed);
+ #else
+ srand((unsigned) timestart);
+ #endif
+ #endif
+
+ //[Disable VGA]--------------------
+ #ifdef Disable_VGA
+ if ( LOOP_INFINI & ~(BurstEnable || IOTiming) ) {
+ VGAModeVld = 1;
+ outp(0x3d4, 0x17);
+ VGAMode = inp(0x3d5);
+ outp(0x3d4, 0x17);
+ outp(0x3d5, 0);
+ }
+ #endif
+
+ //[Setup]--------------------
+ setup_framesize();
+ setup_buf();
+}
+
+//------------------------------------------------------------
+// Return 1 ==> fail
+// Return 0 ==> PASS
+//------------------------------------------------------------
+char TestingLoop (ULONG loop_checknum) {
+ char checkprd;
+ char looplast;
+ char checken;
+
+ #ifdef SLT_UBOOT
+ #else
+ clock_t timeold;
+ #endif
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("TestingLoop: %d\n", Loop);
+ Debug_delay();
+ #endif
+
+ if ( DbgPrn_DumpMACCnt )
+ dump_mac_ROreg();
+
+ //[Setup]--------------------
+ Loop = 0;
+ checkprd = 0;
+ checken = 0;
+ looplast = 0;
+
+ setup_des( 0 );
+
+ #ifdef SLT_UBOOT
+ #else
+ timeold = clock();
+ #endif
+
+ while ( (Loop < LOOP_MAX) || LOOP_INFINI ) {
+ looplast = !LOOP_INFINI && (Loop == LOOP_MAX - 1);
+
+ #ifdef CheckRxBuf
+ if (!BurstEnable) {
+ checkprd = ((Loop % loop_checknum) == (loop_checknum - 1));
+ }
+ checken = looplast | checkprd;
+ #endif
+
+ if ( DataDelay & ( Loop == 0 ) ) {
+ printf ("Press any key to start...\n");
+ GET_CAHR();
+ }
+
+#ifdef DbgPrn_FuncHeader
+ if ( DbgPrn_BufAdr ) {
+ printf ("for start ======> %d/%d(%d) looplast:%d checkprd:%d checken:%d\n", Loop, LOOP_MAX, LOOP_INFINI, looplast, checkprd, checken);
+ Debug_delay();
+ }
+#endif
+
+ //[Check DES]--------------------
+ if ( check_des(Loop, checken) ) {
+ //descriptor error
+ #ifdef CheckRxBuf
+ DES_NUMBER = CheckDesFail_DesNum + 1;
+ if ( checkprd ) {
+ check_buf(loop_checknum);
+ }
+ else {
+ check_buf((LOOP_MAX % loop_checknum));
+ }
+ DES_NUMBER = DES_NUMBER_Org;
+ #endif
+
+ if (DbgPrn_DumpMACCnt)
+ dump_mac_ROreg();
+
+ return(1);
+ }
+
+ //[Check Buf]--------------------
+ if ( RxDataEnable && checken ) {
+ #ifdef SLT_UBOOT
+ #else
+ timeused = (clock() - timeold) / (double) CLK_TCK;
+ #endif
+
+ if ( checkprd ) {
+ #ifdef SLT_DOS
+ #else
+ #ifdef SLT_UBOOT
+ #else
+ printf("[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", loop_checknum, ((double)loop_checknum * (double)DES_NUMBER * Avg_frame_len * 8.0) / ((double)timeused * 1000000.0), timeused);
+ fprintf(fp_log, "[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", loop_checknum, ((double)loop_checknum * (double)DES_NUMBER * Avg_frame_len * 8.0) / ((double)timeused * 1000000.0), timeused);
+ #endif
+ #endif
+
+ #ifdef CheckRxBuf
+ if ( check_buf( loop_checknum ) )
+ return(1);
+ #endif
+ }
+ else {
+ #ifdef SLT_DOS
+ #else
+ #ifdef SLT_UBOOT
+ #else
+ printf("[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", (LOOP_MAX % loop_checknum), ((double)(LOOP_MAX % loop_checknum) * (double)DES_NUMBER * Avg_frame_len * 8.0) / ((double)timeused * 1000000.0), timeused);
+ fprintf(fp_log, "[run loop:%3d] BandWidth: %7.2f Mbps, %6.2f sec\n", (LOOP_MAX % loop_checknum), ((double)(LOOP_MAX % loop_checknum) * (double)DES_NUMBER * Avg_frame_len * 8.0) / ((double)timeused * 1000000.0), timeused);
+ #endif
+ #endif
+
+ #ifdef CheckRxBuf
+ if ( check_buf( ( LOOP_MAX % loop_checknum ) ) )
+ return(1);
+ #endif
+ } // End if ( checkprd )
+
+ #ifdef SelectSimpleDes
+ #else
+ if ( !looplast )
+ setup_des_loop( Loop );
+ #endif
+
+ #ifdef SLT_DOS
+ #else
+ #ifdef SLT_UBOOT
+ #else
+ timeold = clock();
+ #endif
+ #endif
+
+ } // End if ( RxDataEnable && checken )
+
+ #ifdef SelectSimpleDes
+ if ( !looplast )
+ setup_des_loop( Loop );
+ #endif
+
+ if ( LOOP_INFINI ) {
+ printf("===============> Loop: %d \r", Loop);
+ }
+ else if (TestMode == 0) {
+ if (!(DbgPrn_BufAdr || IOTimingBund))
+ printf(" %d \r", Loop);
+// switch (Loop % 4) {
+// case 0x00: printf("| %d \r", Loop); break;
+// case 0x01: printf("/ %d \r", Loop); break;
+// case 0x02: printf("- %d \r", Loop); break;
+// default : printf("\ %d \r", Loop); break;
+// }
+ }
+
+ if ( DbgPrn_BufAdr ) {
+ printf ("for end ======> %d/%d(%d)\n", Loop, LOOP_MAX, LOOP_INFINI);
+ Debug_delay();
+ }
+
+ Loop++;
+ } // End while ((Loop < LOOP_MAX) || LOOP_INFINI)
+
+ Loop_rl[GSpeed_idx] = Loop;
+
+ return(0);
+} // End char TestingLoop (ULONG loop_checknum)
+
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/Makefile b/arch/arm/cpu/arm926ejs/aspeed/Makefile
new file mode 100644
index 0000000..378745e
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/Makefile
@@ -0,0 +1,53 @@
+# 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
+#
+
+include $(TOPDIR)/config.mk
+
+LIB = $(obj)lib$(SOC).a
+
+COBJS = timer.o
+COBJS += reset.o
+COBJS += mactest.o
+COBJS += DRAM_SPI.o
+COBJS += IO.o
+COBJS += LIB.o
+COBJS += MAC.o
+COBJS += NCSI.o
+COBJS += PCI_SPI.o
+COBJS += PHY.o
+COBJS += SPIM.o
+COBJS += STDUBOOT.o
+COBJS += PLLTESTU.o
+COBJS += TRAPTEST.o
+COBJS += STRESS.o
+
+SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS))
+START := $(addprefix $(obj),$(START))
+
+all: $(obj).depend $(LIB)
+
+$(LIB): $(OBJS)
+ $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/arch/arm/cpu/arm926ejs/aspeed/NCSI.H b/arch/arm/cpu/arm926ejs/aspeed/NCSI.H
new file mode 100644
index 0000000..a0e448b
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/NCSI.H
@@ -0,0 +1,189 @@
+/*
+ * 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
+ */
+#ifndef NCSI_H
+#define NCSI_H
+
+#include "TYPEDEF.H"
+
+//---------------------------------------------------------
+// Define
+//---------------------------------------------------------
+#define MAX_PACKAGE_NUM 8 // 1 ~ 8
+#define MAX_CHANNEL_NUM 4 // 1 ~ 32
+//#define Enable_NCSI_LOOP_INFINI //[off]
+
+//---------------------------------------------------------
+// Function
+//---------------------------------------------------------
+#define SENT_RETRY_COUNT 1
+#define NCSI_RxDESNum 50
+
+//#define NCSI_Skip_Phase1_DeSelectPackage
+//#define NCSI_Skip_DeSelectPackage
+//#define NCSI_Skip_DiSChannel
+//#define NCSI_EnableDelay_DeSelectPackage
+//#define NCSI_EnableDelay_GetLinkStatus
+//#define NCSI_EnableDelay_EachPackage
+//#define Print_Version_ID
+//#define Print_PackageName
+
+//---------------------------------------------------------
+// PCI DID/VID & Manufacturer ID
+//---------------------------------------------------------
+#define ManufacturerID_Intel 0x00000157 //343
+#define ManufacturerID_Broadcom 0x0000113d //4413
+#define ManufacturerID_Mellanox 0x000002c9 //713
+
+//PCI VID: [163c]intel
+//PCI VID: [8086]Intel Corporation
+//PCI VID: [8087]Intel
+//PCI VID: [14e4]Broadcom Corporation
+//PCI VID: [15b3]Mellanox
+#define PCI_DID_VID_Intel_82574L 0x10d38086 // IntelR 82574L Gigabit Ethernet Controller
+#define PCI_DID_VID_Intel_82575_10d6 0x10d68086 // 82566 DM-2-gigabyte
+#define PCI_DID_VID_Intel_82575_10a7 0x10a78086 // 82575EB Gigabit Network Connection
+#define PCI_DID_VID_Intel_82575_10a9 0x10a98086 // 82575EB Gigabit Network Connection
+#define PCI_DID_VID_Intel_82576_10c9 0x10c98086 //*82576 Gigabit ET Dual Port Server Adapter
+#define PCI_DID_VID_Intel_82576_10e6 0x10e68086 // 82576 Gigabit Network Connection
+#define PCI_DID_VID_Intel_82576_10e7 0x10e78086 // 82576 Gigabit Network Connection
+#define PCI_DID_VID_Intel_82576_10e8 0x10e88086 // E64750-xxx Intel Gigabit ET Quad Port Server Adapter
+#define PCI_DID_VID_Intel_82576_1518 0x15188086 // 82576NS SerDes Gigabit Network Connectio
+#define PCI_DID_VID_Intel_82576_1526 0x15268086 // Intel Gigabit ET2 Quad Port Server Adapter
+#define PCI_DID_VID_Intel_82576_150a 0x150a8086 // 82576NS Gigabit Ethernet Controller
+#define PCI_DID_VID_Intel_82576_150d 0x150d8086 // 82576 Gigabit Backplane Connection
+#define PCI_DID_VID_Intel_82599_10fb 0x10fb8086 // 10 Gb Ethernet controller
+#define PCI_DID_VID_Intel_82599_1557 0x15578086 //
+#define PCI_DID_VID_Intel_I350_1521 0x15218086 //
+#define PCI_DID_VID_Intel_I350_1523 0x15238086 //
+#define PCI_DID_VID_Intel_I210 0x15338086 //
+#define PCI_DID_VID_Intel_X540 0x15288086 //
+#define PCI_DID_VID_Broadcom_BCM5718 0x165614e4 //
+#define PCI_DID_VID_Broadcom_BCM5720 0x165f14e4 //
+#define PCI_DID_VID_Broadcom_BCM5725 0x164314e4 //
+#define PCI_DID_VID_Mellanox_ConnectX_3 0x100315b3 //*
+
+//---------------------------------------------------------
+// Delay (ms)
+//---------------------------------------------------------
+#define Delay_EachPackage 1000
+#define Delay_DeSelectPackage 50
+#define Delay_GetLinkStatus 50
+
+//---------------------------------------------------------
+// NCSI Parameter
+//---------------------------------------------------------
+//Command and Response Type
+#define CLEAR_INITIAL_STATE 0x00 //M
+#define SELECT_PACKAGE 0x01 //M
+#define DESELECT_PACKAGE 0x02 //M
+#define ENABLE_CHANNEL 0x03 //M
+#define DISABLE_CHANNEL 0x04 //M
+#define RESET_CHANNEL 0x05 //M
+#define ENABLE_CHANNEL_NETWORK_TX 0x06 //M
+#define DISABLE_CHANNEL_NETWORK_TX 0x07 //M
+#define AEN_ENABLE 0x08
+#define SET_LINK 0x09 //M
+#define GET_LINK_STATUS 0x0A //M
+#define SET_VLAN_FILTER 0x0B //M
+#define ENABLE_VLAN 0x0C //M
+#define DISABLE_VLAN 0x0D //M
+#define SET_MAC_ADDRESS 0x0E //M
+#define ENABLE_BROADCAST_FILTERING 0x10 //M
+#define DISABLE_BROADCAST_FILTERING 0x11 //M
+#define ENABLE_GLOBAL_MULTICAST_FILTERING 0x12
+#define DISABLE_GLOBAL_MULTICAST_FILTERING 0x13
+#define SET_NCSI_FLOW_CONTROL 0x14
+#define GET_VERSION_ID 0x15 //M
+#define GET_CAPABILITIES 0x16 //M
+#define GET_PARAMETERS 0x17 //M
+#define GET_CONTROLLER_PACKET_STATISTICS 0x18
+#define GET_NCSI_STATISTICS 0x19
+#define GET_NCSI_PASS_THROUGH_STATISTICS 0x1A
+
+//Standard Response Code
+#define COMMAND_COMPLETED 0x00
+#define COMMAND_FAILED 0x01
+#define COMMAND_UNAVAILABLE 0x02
+#define COMMAND_UNSUPPORTED 0x03
+
+//Standard Reason Code
+#define NO_ERROR 0x0000
+#define INTERFACE_INITIALIZATION_REQUIRED 0x0001
+#define PARAMETER_IS_INVALID 0x0002
+#define CHANNEL_NOT_READY 0x0003
+#define PACKAGE_NOT_READY 0x0004
+#define INVALID_PAYLOAD_LENGTH 0x0005
+#define UNKNOWN_COMMAND_TYPE 0x7FFF
+
+//SET_MAC_ADDRESS
+#define UNICAST ( 0x00 << 5 )
+#define MULTICAST ( 0x01 << 5 )
+#define DISABLE_MAC_ADDRESS_FILTER 0x00
+#define ENABLE_MAC_ADDRESS_FILTER 0x01
+
+//GET_LINK_STATUS
+#define LINK_DOWN 0
+#define LINK_UP 1
+
+#define NCSI_RxDMA_PakSize 2048
+#define NCSI_RxDMA_BASE (DMA_BASE+0x00100000)
+
+//---------------------------------------------------------
+// Variable
+//---------------------------------------------------------
+//NC-SI Command Packet
+typedef struct {
+//Ethernet Header
+ unsigned char DA[6]; // Destination Address
+ unsigned char SA[6]; // Source Address
+ unsigned short EtherType; // DMTF NC-SI, it should be 0x88F8
+//NC-SI Control Packet
+ unsigned char MC_ID; // Management Controller should set this field to 0x00
+ unsigned char Header_Revision; // For NC-SI 1.0 spec, this field has to set 0x01
+ unsigned char Reserved_1; // Reserved has to set to 0x00
+ unsigned char IID; // Instance ID
+ unsigned char Command;
+ unsigned char Channel_ID;
+ unsigned short Payload_Length; // Payload Length = 12 bits, 4 bits are reserved
+ unsigned long Reserved_2;
+ unsigned long Reserved_3;
+
+ unsigned short Reserved_4;
+ unsigned short Reserved_5;
+ unsigned short Response_Code;
+ unsigned short Reason_Code;
+ unsigned char Payload_Data[64];
+} NCSI_Command_Packet;
+
+//NC-SI Response Packet
+typedef struct {
+ unsigned char DA[6];
+ unsigned char SA[6];
+ unsigned short EtherType; //DMTF NC-SI
+//NC-SI Control Packet
+ unsigned char MC_ID; //Management Controller should set this field to 0x00
+ unsigned char Header_Revision; //For NC-SI 1.0 spec, this field has to set 0x01
+ unsigned char Reserved_1; //Reserved has to set to 0x00
+ unsigned char IID; //Instance ID
+ unsigned char Command;
+ unsigned char Channel_ID;
+ unsigned short Payload_Length; //Payload Length = 12 bits, 4 bits are reserved
+ unsigned short Reserved_2;
+ unsigned short Reserved_3;
+ unsigned short Reserved_4;
+ unsigned short Reserved_5;
+
+ unsigned short Response_Code;
+ unsigned short Reason_Code;
+ unsigned char Payload_Data[64];
+} NCSI_Response_Packet;
+
+#endif // NCSI_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/NCSI.c b/arch/arm/cpu/arm926ejs/aspeed/NCSI.c
new file mode 100644
index 0000000..7de06c3
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/NCSI.c
@@ -0,0 +1,934 @@
+/*
+ * 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
+ */
+#define NCSI_C
+static const char ThisFile[] = "NCSI.c";
+
+#include "SWFUNC.H"
+
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+ #include <COMMINF.H>
+ #include <NCSI.H>
+ #include <IO.H>
+#endif
+#ifdef SLT_DOS
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <conio.h>
+ #include <string.h>
+ #include "COMMINF.H"
+ #include "NCSI.H"
+ #include "IO.H"
+#endif
+
+NCSI_Command_Packet NCSI_Request_SLT;
+NCSI_Response_Packet NCSI_Respond_SLT;
+int InstanceID;
+int NCSI_RxTimeOutScale;
+ULONG NCSI_RxDesBase;
+ULONG NCSI_TxDWBUF[512];
+ULONG NCSI_RxDWBUF[512];
+char NCSI_CommandStr[512];
+unsigned char *NCSI_TxByteBUF;
+unsigned char *NCSI_RxByteBUF;
+unsigned char NCSI_Payload_Data[16];
+unsigned long Payload_Checksum_NCSI = 0x00000000;
+ULONG select_flag[MAX_PACKAGE_NUM];
+
+ULONG DWSwap_SLT (ULONG in) {
+ return( ((in & 0xff000000) >> 24)
+ | ((in & 0x00ff0000) >> 8)
+ | ((in & 0x0000ff00) << 8)
+ | ((in & 0x000000ff) << 24)
+ );
+}
+USHORT WDSwap_SLT (USHORT in) {
+ return( ((in & 0xff00) >> 8)
+ | ((in & 0x00ff) << 8)
+ );
+}
+
+//------------------------------------------------------------
+int FindErr_NCSI (int value) {
+ NCSI_LinkFail_Val = NCSI_LinkFail_Val | value;
+ Err_Flag = Err_Flag | Err_NCSI_LinkFail;
+ if ( DbgPrn_ErrFlg )
+ printf ("\nErr_Flag: [%08lx] NCSI_LinkFail_Val: [%08lx]\n", Err_Flag, NCSI_LinkFail_Val);
+
+ return(1);
+}
+
+//------------------------------------------------------------
+// PHY IC(NC-SI)
+//------------------------------------------------------------
+void ncsi_respdump ( NCSI_Response_Packet *in ) {
+ printf ("DA : %02x %02x %02x %02x %02x %02x\n", in->DA[5], in->DA[4], in->DA[3], in->DA[2], in->DA[1], in->DA[0]);
+ printf ("SA : %02x %02x %02x %02x %02x %02x\n", in->SA[5], in->SA[4], in->SA[3], in->SA[2], in->SA[1], in->SA[0]);
+ printf ("EtherType : %04x\n", in->EtherType );//DMTF NC-SI
+ printf ("MC_ID : %02x\n", in->MC_ID );//Management Controller should set this field to 0x00
+ printf ("Header_Revision: %02x\n", in->Header_Revision );//For NC-SI 1.0 spec, this field has to set 0x01
+// printf ("Reserved_1 : %02x\n", in->Reserved_1 ); //Reserved has to set to 0x00
+ printf ("IID : %02x\n", in->IID );//Instance ID
+ printf ("Command : %02x\n", in->Command );
+ printf ("Channel_ID : %02x\n", in->Channel_ID );
+ printf ("Payload_Length : %04x\n", in->Payload_Length );//Payload Length = 12 bits, 4 bits are reserved
+// printf ("Reserved_2 : %04x\n", in->Reserved_2 );
+// printf ("Reserved_3 : %04x\n", in->Reserved_3 );
+// printf ("Reserved_4 : %04x\n", in->Reserved_4 );
+// printf ("Reserved_5 : %04x\n", in->Reserved_5 );
+ printf ("Response_Code : %04x\n", in->Response_Code );
+ printf ("Reason_Code : %04x\n", in->Reason_Code );
+ printf ("Payload_Data : %02x%02x%02x%02x\n", in->Payload_Data[ 3], in->Payload_Data[ 2], in->Payload_Data[ 1], in->Payload_Data[ 0]);
+// printf ("Payload_Data : %02x%02x%02x%02x\n", in->Payload_Data[ 7], in->Payload_Data[ 6], in->Payload_Data[ 5], in->Payload_Data[ 4]);
+// printf ("Payload_Data : %02x%02x%02x%02x\n", in->Payload_Data[11], in->Payload_Data[10], in->Payload_Data[ 9], in->Payload_Data[ 8]);
+// printf ("Payload_Data : %02x%02x%02x%02x\n", in->Payload_Data[15], in->Payload_Data[14], in->Payload_Data[13], in->Payload_Data[12]);
+// printf ("Payload_Data : %02x%02x%02x%02x\n", in->Payload_Data[19], in->Payload_Data[18], in->Payload_Data[17], in->Payload_Data[16]);
+// printf ("Payload_Data : %02x%02x%02x%02x\n", in->Payload_Data[23], in->Payload_Data[22], in->Payload_Data[21], in->Payload_Data[20]);
+}
+
+//------------------------------------------------------------
+void NCSI_Struct_Initialize_SLT (void) {
+ int i;
+
+ ULONG NCSI_RxDatBase;
+
+ InstanceID = 0;
+ NCSI_RxTimeOutScale = 1;
+
+ for (i = 0; i < 6; i++) {
+ NCSI_Request_SLT.DA[i] = 0xFF;
+ }
+
+ for (i = 0; i < 6; i++) {
+// NCSI_Request.SA[i] = i<<2;
+ NCSI_Request_SLT.SA[i] = SA[i];
+ }
+
+ NCSI_Request_SLT.EtherType = WDSwap_SLT(0x88F8); // EtherType = 0x88F8 (DMTF NC-SI) page 50, table 8, NC-SI spec. version 1.0.0
+ NCSI_Request_SLT.MC_ID = 0;
+ NCSI_Request_SLT.Header_Revision = 0x01;
+ NCSI_Request_SLT.Reserved_1 = 0;
+ NCSI_Request_SLT.Reserved_2 = 0;
+ NCSI_Request_SLT.Reserved_3 = 0;
+
+ NCSI_TxByteBUF = (unsigned char *) &NCSI_TxDWBUF[0];
+ NCSI_RxByteBUF = (unsigned char *) &NCSI_RxDWBUF[0];
+
+ NCSI_RxDesBase = H_RDES_BASE;
+ NCSI_RxDatBase = NCSI_RxDMA_BASE;
+
+ for (i = 0; i < NCSI_RxDESNum - 1; i++) {
+ WriteSOC_DD( ( NCSI_RxDesBase + 0 ), 0x00000000 );
+ WriteSOC_DD( ( NCSI_RxDesBase + 4 ), 0x00000000 );
+ WriteSOC_DD( ( NCSI_RxDesBase + 8 ), 0x00000000 );
+ WriteSOC_DD( ( NCSI_RxDesBase + 0x0C ), (NCSI_RxDatBase + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ NCSI_RxDesBase += 16;
+ NCSI_RxDatBase += NCSI_RxDMA_PakSize;
+ }
+ WriteSOC_DD( ( NCSI_RxDesBase + 0 ), EOR_IniVal );
+ WriteSOC_DD( ( NCSI_RxDesBase + 4 ), 0x00000000 );
+ WriteSOC_DD( ( NCSI_RxDesBase + 8 ), 0x00000000 );
+ WriteSOC_DD( ( NCSI_RxDesBase + 0x0C ), (NCSI_RxDatBase + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+
+ NCSI_RxDesBase = H_RDES_BASE;
+}
+
+//------------------------------------------------------------
+void Calculate_Checksum_NCSI (unsigned char *buffer_base, int Length) {
+ ULONG CheckSum = 0;
+ ULONG Data;
+ ULONG Data1;
+ int i;
+
+ // Calculate checksum is from byte 14 of ethernet Haeder and Control packet header
+ // Page 50, NC-SI spec. ver. 1.0.0 form DMTF
+ for (i = 14; i < Length; i += 2 ) {
+ Data = buffer_base[i];
+ Data1 = buffer_base[i + 1];
+ CheckSum += ((Data << 8) + Data1);
+ }
+ Payload_Checksum_NCSI = DWSwap_SLT(~(CheckSum) + 1); //2's complement
+}
+
+//------------------------------------------------------------
+// return 0: it is PASS
+// return 1: it is FAIL
+//------------------------------------------------------------
+char NCSI_Rx_SLT (unsigned char command) {
+
+#define NCSI_RX_RETRY_TIME 2
+ int timeout = 0;
+ int bytesize;
+ int dwsize;
+ int i;
+ int retry = 0;
+ char ret = 1;
+
+ ULONG NCSI_RxDatBase;
+ ULONG NCSI_RxDesDat;
+ ULONG NCSI_RxData;
+
+
+ do {
+ WriteSOC_DD( ( H_MAC_BASE + 0x1C ), 0x00000000 );//Rx Poll
+
+ do {
+ NCSI_RxDesDat = ReadSOC_DD(NCSI_RxDesBase);
+ if ( ++timeout > TIME_OUT_NCSI * NCSI_RxTimeOutScale ) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[Cmd:%02X][NCSI-RxDesOwn] %08lX \n", command, NCSI_RxDesDat );
+ #endif
+ return( FindErr(Err_NCSI_Check_RxOwnTimeOut) );
+ }
+ } while( HWOwnRx(NCSI_RxDesDat) );
+
+ #ifdef CheckRxErr
+ if (NCSI_RxDesDat & 0x00040000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[RxDes] Error RxErr %08lx\n", NCSI_RxDesDat);
+ #endif
+ FindErr_Des(Check_Des_RxErr);
+ }
+ #endif
+
+ #ifdef CheckOddNibble
+ if (NCSI_RxDesDat & 0x00400000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[RxDes] Odd Nibble %08lx\n", NCSI_RxDesDat);
+ #endif
+ FindErr_Des(Check_Des_OddNibble);
+ }
+ #endif
+
+ #ifdef CheckCRC
+ if (NCSI_RxDesDat & 0x00080000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[RxDes] Error CRC %08lx\n", NCSI_RxDesDat);
+ #endif
+ FindErr_Des(Check_Des_CRC);
+ }
+ #endif
+
+ #ifdef CheckRxFIFOFull
+ if (NCSI_RxDesDat & 0x00800000) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[RxDes] Error Rx FIFO Full %08lx\n", NCSI_RxDesDat);
+ #endif
+ FindErr_Des(Check_Des_RxFIFOFull);
+ }
+ #endif
+
+ // Get point of RX DMA buffer
+ NCSI_RxDatBase = ReadSOC_DD( NCSI_RxDesBase + 0x0C );
+ NCSI_RxData = ReadSOC_DD( NCSI_RxDatBase + 0x0C );
+
+ if ( HWEOR( NCSI_RxDesDat ) ) {
+ // it is last the descriptor in the receive Ring
+ WriteSOC_DD( NCSI_RxDesBase , EOR_IniVal );
+ NCSI_RxDesBase = H_RDES_BASE;
+ }
+ else {
+ WriteSOC_DD( NCSI_RxDesBase , 0x00000000 );
+ NCSI_RxDesBase += 16;
+ }
+
+ // Get RX valid data in offset 00h of RXDS#0
+ bytesize = (NCSI_RxDesDat & 0x3fff);
+
+ // Fill up to multiple of 4
+ if ( ( bytesize % 4 ) != 0 )
+ dwsize = ( bytesize >> 2 ) + 1;
+ else
+ dwsize = bytesize >> 2;
+
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log ,"[Rx] %d bytes(%xh)\n", bytesize, bytesize);
+ #endif
+
+ for (i = 0; i < dwsize; i++) {
+ NCSI_RxDWBUF[i] = ReadSOC_DD(NCSI_RxDatBase + ( i << 2 ));
+ if ( PrintNCSIEn ) {
+ if ( i == ( dwsize - 1 ) ) {
+ switch (bytesize % 4) {
+ case 0 : NCSI_RxDWBUF[i] = NCSI_RxDWBUF[i] & 0xffffffff; break;
+ case 3 : NCSI_RxDWBUF[i] = NCSI_RxDWBUF[i] & 0xffffff ; break;
+ case 2 : NCSI_RxDWBUF[i] = NCSI_RxDWBUF[i] & 0xffff ; break;
+ case 1 : NCSI_RxDWBUF[i] = NCSI_RxDWBUF[i] & 0xff ; break;
+ }
+ #ifdef SLT_DOS
+ switch (bytesize % 4) {
+ case 0 : fprintf(fp_log ,"[Rx%02d]%08lx %08lx\n", i, NCSI_RxDWBUF[i], DWSwap_SLT(NCSI_RxDWBUF[i]) ); break;
+ case 3 : fprintf(fp_log ,"[Rx%02d]--%06lx %06lx--\n", i, NCSI_RxDWBUF[i], DWSwap_SLT(NCSI_RxDWBUF[i]) >> 8 ); break;
+ case 2 : fprintf(fp_log ,"[Rx%02d]----%04lx %04lx----\n", i, NCSI_RxDWBUF[i], DWSwap_SLT(NCSI_RxDWBUF[i]) >> 16 ); break;
+ case 1 : fprintf(fp_log ,"[Rx%02d]------%02lx %02lx------\n", i, NCSI_RxDWBUF[i], DWSwap_SLT(NCSI_RxDWBUF[i]) >> 24 ); break;
+ default : fprintf(fp_log ,"[Rx%02d]error", i); break;
+ }
+ #endif
+ }
+ else {
+ #ifdef SLT_DOS
+ fprintf(fp_log ,"[Rx%02d]%08lx %08lx\n", i, NCSI_RxDWBUF[i], DWSwap_SLT(NCSI_RxDWBUF[i]));
+ #endif
+ }
+ }
+ } // End for (i = 0; i < dwsize; i++)
+
+ // EtherType field of the response packet should be 0x88F8
+ if ((NCSI_RxData & 0xffff) == 0xf888) {
+ memcpy (&NCSI_Respond_SLT, NCSI_RxByteBUF, bytesize);
+
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log ,"[Rx IID:%2d]\n", NCSI_Respond_SLT.IID);
+ #endif
+
+ NCSI_Respond_SLT.EtherType = WDSwap_SLT( NCSI_Respond_SLT.EtherType );
+ NCSI_Respond_SLT.Payload_Length = WDSwap_SLT( NCSI_Respond_SLT.Payload_Length );
+ NCSI_Respond_SLT.Response_Code = WDSwap_SLT( NCSI_Respond_SLT.Response_Code );
+ NCSI_Respond_SLT.Reason_Code = WDSwap_SLT( NCSI_Respond_SLT.Reason_Code );
+
+ ret = 0;
+ break;
+ }
+ else {
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log, "[Skip] Not NCSI Response: %08lx\n", NCSI_RxData);
+ #endif
+
+ retry++;
+ }
+ } while ( retry < NCSI_RX_RETRY_TIME );
+
+ return( ret );
+} // End char NCSI_Rx_SLT (void)
+
+//------------------------------------------------------------
+char NCSI_Tx (void) {
+ int bytesize;
+ int dwsize;
+ int i;
+ int timeout = 0;
+ ULONG NCSI_TxDesDat;
+
+ // Header of NC-SI command format is 34 bytes. page 58, NC-SI spec. ver 1.0.0 from DMTF
+ // The minimum size of a NC-SI package is 64 bytes.
+ bytesize = 34 + WDSwap_SLT(NCSI_Request_SLT.Payload_Length);
+ if ( bytesize < 64 ) {
+ memset (NCSI_TxByteBUF + bytesize, 0, 60 - bytesize);
+ bytesize = 64;
+ }
+
+ // Fill up to multiple of 4
+// dwsize = (bytesize + 3) >> 2;
+ if ( ( bytesize % 4 ) != 0 )
+ dwsize = ( bytesize >> 2 ) + 1;
+ else
+ dwsize = bytesize >> 2;
+
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log ,"[Tx IID:%2d] %d bytes(%xh)\n", NCSI_Request_SLT.IID, bytesize, bytesize);
+ #endif
+
+ // Copy data to DMA buffer
+ for (i = 0; i < dwsize; i++) {
+ WriteSOC_DD( DMA_BASE + (i << 2), NCSI_TxDWBUF[i] );
+ if ( PrintNCSIEn ) {
+ if (i == (dwsize - 1)) {
+ switch (bytesize % 4) {
+ case 0 : NCSI_TxDWBUF[i] = NCSI_TxDWBUF[i] & 0xffffffff; break;
+ case 3 : NCSI_TxDWBUF[i] = NCSI_TxDWBUF[i] & 0x00ffffff; break;
+ case 2 : NCSI_TxDWBUF[i] = NCSI_TxDWBUF[i] & 0x0000ffff; break;
+ case 1 : NCSI_TxDWBUF[i] = NCSI_TxDWBUF[i] & 0x000000ff; break;
+ }
+ #ifdef SLT_DOS
+ switch (bytesize % 4) {
+ case 0 : fprintf(fp_log ,"[Tx%02d]%08x %08x\n", i, NCSI_TxDWBUF[i], DWSwap_SLT( NCSI_TxDWBUF[i]) ); break;
+ case 3 : fprintf(fp_log ,"[Tx%02d]--%06x %06x--\n", i, NCSI_TxDWBUF[i], DWSwap_SLT( NCSI_TxDWBUF[i]) >> 8 ); break;
+ case 2 : fprintf(fp_log ,"[Tx%02d]----%04x %04x----\n", i, NCSI_TxDWBUF[i], DWSwap_SLT( NCSI_TxDWBUF[i]) >> 16 ); break;
+ case 1 : fprintf(fp_log ,"[Tx%02d]------%02x %02x------\n", i, NCSI_TxDWBUF[i], DWSwap_SLT( NCSI_TxDWBUF[i]) >> 24 ); break;
+ default : fprintf(fp_log ,"[Tx%02d]error", i); break;
+ }
+ #endif
+ }
+ else {
+ #ifdef SLT_DOS
+ fprintf( fp_log , "[Tx%02d]%08x %08x\n", i, NCSI_TxDWBUF[i], DWSwap_SLT(NCSI_TxDWBUF[i]) );
+ #endif
+ }
+ }
+ } // End for (i = 0; i < dwsize; i++)
+
+ // Setting one TX descriptor
+ WriteSOC_DD( H_TDES_BASE + 0x04, 0 );
+ WriteSOC_DD( H_TDES_BASE + 0x08, 0 );
+ WriteSOC_DD( H_TDES_BASE + 0x0C, (DMA_BASE + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ WriteSOC_DD( H_TDES_BASE , 0xf0008000 + bytesize );
+ // Fire
+ WriteSOC_DD( H_MAC_BASE + 0x18, 0x00000000 );//Tx Poll
+
+ do {
+ NCSI_TxDesDat = ReadSOC_DD(H_TDES_BASE);
+ if ( ++timeout > TIME_OUT_NCSI ) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[NCSI-TxDesOwn] %08lx\n", NCSI_TxDesDat);
+ #endif
+
+ return(FindErr(Err_NCSI_Check_TxOwnTimeOut));
+ }
+ } while ( HWOwnTx(NCSI_TxDesDat) );
+
+ return(0);
+} // End char NCSI_Tx (void)
+
+//------------------------------------------------------------
+char NCSI_ARP (void) {
+ int i;
+ int timeout = 0;
+ ULONG NCSI_TxDesDat;
+
+ if ( ARPNumCnt ) {
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log ,"[ARP] 60 bytes x%d\n", ARPNumCnt);
+ #endif
+
+ for (i = 0; i < 15; i++) {
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log ,"[Tx%02d] %08x %08x\n", i, ARP_data[i], DWSwap_SLT(ARP_data[i]));
+ #endif
+ WriteSOC_DD( DMA_BASE + ( i << 2 ), ARP_data[i] );
+ }
+ WriteSOC_DD( H_TDES_BASE + 0x04, 0 );
+ WriteSOC_DD( H_TDES_BASE + 0x08, 0 );
+ WriteSOC_DD( H_TDES_BASE + 0x0C, (DMA_BASE + CPU_BUS_ADDR_SDRAM_OFFSET) ); // 20130730
+ WriteSOC_DD( H_TDES_BASE , 0xf0008000 + 60 );
+
+ for (i = 0; i < ARPNumCnt; i++) {
+ WriteSOC_DD( H_TDES_BASE , 0xf0008000 + 60);
+
+ WriteSOC_DD( H_MAC_BASE + 0x18, 0x00000000 );//Tx Poll
+
+ timeout = 0;
+ do {
+ NCSI_TxDesDat = ReadSOC_DD(H_TDES_BASE);
+
+ if (++timeout > TIME_OUT_NCSI) {
+ #ifdef SLT_DOS
+ fprintf(fp_log, "[ARP-TxDesOwn] %08lx\n", NCSI_TxDesDat);
+ #endif
+
+ return(FindErr(Err_NCSI_Check_ARPOwnTimeOut));
+ }
+ } while (HWOwnTx(NCSI_TxDesDat));
+ }
+ }
+ return(0);
+} // End char NCSI_ARP (void)
+
+//------------------------------------------------------------
+void WrRequest (unsigned char command, unsigned char id, unsigned short length) {
+
+ NCSI_Request_SLT.IID = InstanceID;
+ NCSI_Request_SLT.Command = command;
+ NCSI_Request_SLT.Channel_ID = id;
+ NCSI_Request_SLT.Payload_Length = WDSwap_SLT(length);
+
+ memcpy ( NCSI_TxByteBUF , &NCSI_Request_SLT , 30 );
+ memcpy ((NCSI_TxByteBUF + 30 ), &NCSI_Payload_Data , length);
+ Calculate_Checksum_NCSI(NCSI_TxByteBUF, 30 + length);
+ memcpy ((NCSI_TxByteBUF + 30 + length), &Payload_Checksum_NCSI, 4 );
+}
+
+//------------------------------------------------------------
+void NCSI_PrintCommandStr (unsigned char command, unsigned iid) {
+ switch (command & 0x80) {
+ case 0x80 : sprintf(NCSI_CommandStr, "IID:%3d [%02x][Respond]", iid, command); break;
+ default : sprintf(NCSI_CommandStr, "IID:%3d [%02x][Request]", iid, command); break;
+ }
+ switch (command & 0x7f) {
+ case 0x00 : sprintf(NCSI_CommandStr, "%s[CLEAR_INITIAL_STATE ]", NCSI_CommandStr); break;
+ case 0x01 : sprintf(NCSI_CommandStr, "%s[SELECT_PACKAGE ]", NCSI_CommandStr); break;
+ case 0x02 : sprintf(NCSI_CommandStr, "%s[DESELECT_PACKAGE ]", NCSI_CommandStr); break;
+ case 0x03 : sprintf(NCSI_CommandStr, "%s[ENABLE_CHANNEL ]", NCSI_CommandStr); break;
+ case 0x04 : sprintf(NCSI_CommandStr, "%s[DISABLE_CHANNEL ]", NCSI_CommandStr); break;
+ case 0x05 : sprintf(NCSI_CommandStr, "%s[RESET_CHANNEL ]", NCSI_CommandStr); break;
+ case 0x06 : sprintf(NCSI_CommandStr, "%s[ENABLE_CHANNEL_NETWORK_TX ]", NCSI_CommandStr); break;
+ case 0x07 : sprintf(NCSI_CommandStr, "%s[DISABLE_CHANNEL_NETWORK_TX ]", NCSI_CommandStr); break;
+ case 0x08 : sprintf(NCSI_CommandStr, "%s[AEN_ENABLE ]", NCSI_CommandStr); break;
+ case 0x09 : sprintf(NCSI_CommandStr, "%s[SET_LINK ]", NCSI_CommandStr); break;
+ case 0x0A : sprintf(NCSI_CommandStr, "%s[GET_LINK_STATUS ]", NCSI_CommandStr); break;
+ case 0x0B : sprintf(NCSI_CommandStr, "%s[SET_VLAN_FILTER ]", NCSI_CommandStr); break;
+ case 0x0C : sprintf(NCSI_CommandStr, "%s[ENABLE_VLAN ]", NCSI_CommandStr); break;
+ case 0x0D : sprintf(NCSI_CommandStr, "%s[DISABLE_VLAN ]", NCSI_CommandStr); break;
+ case 0x0E : sprintf(NCSI_CommandStr, "%s[SET_MAC_ADDRESS ]", NCSI_CommandStr); break;
+ case 0x10 : sprintf(NCSI_CommandStr, "%s[ENABLE_BROADCAST_FILTERING ]", NCSI_CommandStr); break;
+ case 0x11 : sprintf(NCSI_CommandStr, "%s[DISABLE_BROADCAST_FILTERING ]", NCSI_CommandStr); break;
+ case 0x12 : sprintf(NCSI_CommandStr, "%s[ENABLE_GLOBAL_MULTICAST_FILTERING ]", NCSI_CommandStr); break;
+ case 0x13 : sprintf(NCSI_CommandStr, "%s[DISABLE_GLOBAL_MULTICAST_FILTERING ]", NCSI_CommandStr); break;
+ case 0x14 : sprintf(NCSI_CommandStr, "%s[SET_NCSI_FLOW_CONTROL ]", NCSI_CommandStr); break;
+ case 0x15 : sprintf(NCSI_CommandStr, "%s[GET_VERSION_ID ]", NCSI_CommandStr); break;
+ case 0x16 : sprintf(NCSI_CommandStr, "%s[GET_CAPABILITIES ]", NCSI_CommandStr); break;
+ case 0x17 : sprintf(NCSI_CommandStr, "%s[GET_PARAMETERS ]", NCSI_CommandStr); break;
+ case 0x18 : sprintf(NCSI_CommandStr, "%s[GET_CONTROLLER_PACKET_STATISTICS ]", NCSI_CommandStr); break;
+ case 0x19 : sprintf(NCSI_CommandStr, "%s[GET_NCSI_STATISTICS ]", NCSI_CommandStr); break;
+ case 0x1A : sprintf(NCSI_CommandStr, "%s[GET_NCSI_PASS_THROUGH_STATISTICS ]", NCSI_CommandStr); break;
+ case 0x50 : sprintf(NCSI_CommandStr, "%s[OEM_COMMAND ]", NCSI_CommandStr); break;
+ default : sprintf(NCSI_CommandStr, "%s Not Support Command", NCSI_CommandStr); break ;
+ }
+} // End void NCSI_PrintCommandStr (unsigned char command, unsigned iid)
+
+//------------------------------------------------------------
+void NCSI_PrintCommandType (unsigned char command, unsigned iid) {
+ NCSI_PrintCommandStr(command, iid);
+ printf ("%s\n", NCSI_CommandStr);
+}
+
+//------------------------------------------------------------
+void NCSI_PrintCommandType2File (unsigned char command, unsigned iid) {
+ NCSI_PrintCommandStr(command, iid);
+ #ifdef SLT_DOS
+ fprintf(fp_log, "%s\n", NCSI_CommandStr);
+ #endif
+}
+
+//------------------------------------------------------------
+char NCSI_SentWaitPacket (unsigned char command, unsigned char id, unsigned short length) {
+ int Retry = 0;
+ char ret;
+
+ do {
+ InstanceID++;
+ WrRequest(command, id, length);
+
+ ret = NCSI_Tx(); if ( ret != 0 )
+ {
+ // printf("======> NCSI_Tx return code = %X\n", ret );
+ return(1);
+ }
+#ifdef Print_PackageName
+ NCSI_PrintCommandType(command, InstanceID);
+#endif
+
+#ifdef NCSI_EnableDelay_EachPackage
+ delay(Delay_EachPackage);
+#endif
+ if ( NCSI_Rx_SLT( command ) )
+ return(2);
+
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log, "[Request] ETyp:%04x MC_ID:%02x HeadVer:%02x IID:%02x Comm:%02x ChlID:%02x PayLen:%04x\n", WDSwap_SLT(NCSI_Request_SLT.EtherType),
+ NCSI_Request_SLT.MC_ID,
+ NCSI_Request_SLT.Header_Revision,
+ NCSI_Request_SLT.IID,
+ NCSI_Request_SLT.Command,
+ NCSI_Request_SLT.Channel_ID,
+ WDSwap_SLT(NCSI_Request_SLT.Payload_Length) );
+ if ( PrintNCSIEn )
+ fprintf(fp_log, "[Respond] ETyp:%04x MC_ID:%02x HeadVer:%02x IID:%02x Comm:%02x ChlID:%02x PayLen:%04x ResCd:%02x ReaCd:%02x\n",
+ NCSI_Respond_SLT.EtherType,
+ NCSI_Respond_SLT.MC_ID,
+ NCSI_Respond_SLT.Header_Revision,
+ NCSI_Respond_SLT.IID,
+ NCSI_Respond_SLT.Command,
+ NCSI_Respond_SLT.Channel_ID,
+ NCSI_Respond_SLT.Payload_Length,
+ NCSI_Respond_SLT.Response_Code,
+ NCSI_Respond_SLT.Reason_Code);
+ #endif
+
+ if ( (NCSI_Respond_SLT.IID != InstanceID) ||
+ (NCSI_Respond_SLT.Command != (command | 0x80)) ||
+ (NCSI_Respond_SLT.Response_Code != COMMAND_COMPLETED) ) {
+ #ifdef SLT_DOS
+ if ( PrintNCSIEn )
+ fprintf(fp_log, "Retry: Command = %x, Response_Code = %x\n", NCSI_Request_SLT.Command, NCSI_Respond_SLT.Response_Code);
+
+ #endif
+ Retry++;
+ }
+ else {
+ if ( PrintNCSIEn )
+ NCSI_PrintCommandType2File(command, InstanceID);
+
+ return(0);
+ }
+ } while (Retry <= SENT_RETRY_COUNT);
+
+ return( 3 );
+} // End char NCSI_SentWaitPacket (unsigned char command, unsigned char id, unsigned short length)
+
+//------------------------------------------------------------
+char Clear_Initial_State_SLT (int Channel_ID) {//Command:0x00
+ return(NCSI_SentWaitPacket(CLEAR_INITIAL_STATE, (NCSI_Cap_SLT.Package_ID << 5) + Channel_ID, 0));//Internal Channel ID = 0
+}
+
+//------------------------------------------------------------
+char Select_Package_SLT (int Package_ID) {//Command:0x01
+ memset ((void *)NCSI_Payload_Data, 0, 4);
+ NCSI_Payload_Data[3] = 1; //Arbitration Disable
+
+ return(NCSI_SentWaitPacket(SELECT_PACKAGE, (Package_ID << 5) + 0x1F, 4));//Internal Channel ID = 0x1F, 0x1F means all channel
+}
+
+//------------------------------------------------------------
+void Select_Active_Package_SLT (void) {//Command:0x01
+ memset ((void *)NCSI_Payload_Data, 0, 4);
+ NCSI_Payload_Data[3] = 1; //Arbitration Disable
+
+ if (NCSI_SentWaitPacket(SELECT_PACKAGE, (NCSI_Cap_SLT.Package_ID << 5) + 0x1F, 4)) {//Internal Channel ID = 0x1F
+ FindErr_NCSI(NCSI_LinkFail_Select_Active_Package);
+ }
+}
+
+//------------------------------------------------------------
+void DeSelect_Package_SLT (int Package_ID) {//Command:0x02
+ NCSI_SentWaitPacket(DESELECT_PACKAGE, (Package_ID << 5) + 0x1F, 0);//Internal Channel ID = 0x1F, 0x1F means all channel
+
+#ifdef NCSI_EnableDelay_DeSelectPackage
+ delay(Delay_DeSelectPackage);
+#endif
+}
+
+//------------------------------------------------------------
+void Enable_Channel_SLT (void) {//Command:0x03
+ if ( NCSI_SentWaitPacket(ENABLE_CHANNEL, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 0) ) {
+ FindErr_NCSI(NCSI_LinkFail_Enable_Channel);
+ }
+}
+
+//------------------------------------------------------------
+void Disable_Channel_SLT (void) {//Command:0x04
+ memset ((void *)NCSI_Payload_Data, 0, 4);
+ NCSI_Payload_Data[3] = 0x1; //ALD
+
+ if (NCSI_SentWaitPacket(DISABLE_CHANNEL, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 4)) {
+ FindErr_NCSI(NCSI_LinkFail_Disable_Channel);
+ }
+}
+void Enable_Network_TX_SLT (void) {//Command:0x06
+ if ( NCSI_SentWaitPacket(ENABLE_CHANNEL_NETWORK_TX, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 0) ) {
+ FindErr_NCSI(NCSI_LinkFail_Enable_Network_TX);
+ }
+}
+
+//------------------------------------------------------------
+void Disable_Network_TX_SLT (void) {//Command:0x07
+ if ( NCSI_SentWaitPacket(DISABLE_CHANNEL_NETWORK_TX, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 0) ) {
+ FindErr_NCSI(NCSI_LinkFail_Disable_Network_TX);
+ }
+}
+
+//------------------------------------------------------------
+void Set_Link_SLT (void) {//Command:0x09
+ memset ((void *)NCSI_Payload_Data, 0, 8);
+ NCSI_Payload_Data[2] = 0x02; //full duplex
+// NCSI_Payload_Data[3] = 0x04; //100M, auto-disable
+ NCSI_Payload_Data[3] = 0x05; //100M, auto-enable
+
+ NCSI_SentWaitPacket(SET_LINK, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 8);
+}
+
+//------------------------------------------------------------
+char Get_Link_Status_SLT (void) {//Command:0x0a
+
+ if (NCSI_SentWaitPacket(GET_LINK_STATUS, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 0)) {
+ return(0);
+ }
+ else {
+ if (NCSI_Respond_SLT.Payload_Data[3] & 0x20) {
+ if (NCSI_Respond_SLT.Payload_Data[3] & 0x40) {
+ if (NCSI_Respond_SLT.Payload_Data[3] & 0x01)
+ return(1); //Link Up or Not
+ else
+ return(0);
+ } else
+ return(0); //Auto Negotiate did not finish
+ } else {
+ if (NCSI_Respond_SLT.Payload_Data[3] & 0x01)
+ return(1); //Link Up or Not
+ else
+ return(0);
+ }
+ }
+} // End char Get_Link_Status_SLT (void)
+
+//------------------------------------------------------------
+void Enable_Set_MAC_Address_SLT (void) {//Command:0x0e
+ int i;
+
+ for ( i = 0; i < 6; i++ ) {
+ NCSI_Payload_Data[i] = NCSI_Request_SLT.SA[i];
+ }
+ NCSI_Payload_Data[6] = 1; //MAC Address Num = 1 --> address filter 1, fixed in sample code
+ NCSI_Payload_Data[7] = UNICAST + 0 + ENABLE_MAC_ADDRESS_FILTER; //AT + Reserved + E
+
+ if ( NCSI_SentWaitPacket(SET_MAC_ADDRESS, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 8) ) {
+ FindErr_NCSI(NCSI_LinkFail_Enable_Set_MAC_Address);
+ }
+}
+
+//------------------------------------------------------------
+void Enable_Broadcast_Filter_SLT (void) {//Command:0x10
+ memset ((void *)NCSI_Payload_Data, 0, 4);
+ NCSI_Payload_Data[3] = 0xF; //ARP, DHCP, NetBIOS
+
+ if (NCSI_SentWaitPacket(ENABLE_BROADCAST_FILTERING, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 4) ) {
+ FindErr_NCSI(NCSI_LinkFail_Enable_Broadcast_Filter);
+ }
+}
+
+//------------------------------------------------------------
+void Get_Version_ID_SLT (void) {//Command:0x15
+
+ if (NCSI_SentWaitPacket(GET_VERSION_ID, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 0) ) {
+ FindErr_NCSI(NCSI_LinkFail_Get_Version_ID);
+ }
+ else {
+#ifdef Print_Version_ID
+ printf ("NCSI Version : %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[ 0], NCSI_Respond_SLT.Payload_Data[ 1], NCSI_Respond_SLT.Payload_Data[ 2], NCSI_Respond_SLT.Payload_Data[ 3]);
+ printf ("NCSI Version : %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[ 4], NCSI_Respond_SLT.Payload_Data[ 5], NCSI_Respond_SLT.Payload_Data[ 6], NCSI_Respond_SLT.Payload_Data[ 7]);
+ printf ("Firmware Name String: %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[ 8], NCSI_Respond_SLT.Payload_Data[ 9], NCSI_Respond_SLT.Payload_Data[10], NCSI_Respond_SLT.Payload_Data[11]);
+ printf ("Firmware Name String: %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[12], NCSI_Respond_SLT.Payload_Data[13], NCSI_Respond_SLT.Payload_Data[14], NCSI_Respond_SLT.Payload_Data[15]);
+ printf ("Firmware Name String: %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[16], NCSI_Respond_SLT.Payload_Data[17], NCSI_Respond_SLT.Payload_Data[18], NCSI_Respond_SLT.Payload_Data[19]);
+ printf ("Firmware Version : %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[20], NCSI_Respond_SLT.Payload_Data[21], NCSI_Respond_SLT.Payload_Data[22], NCSI_Respond_SLT.Payload_Data[23]);
+ printf ("PCI DID/VID : %02x %02x/%02x %02x\n", NCSI_Respond_SLT.Payload_Data[24], NCSI_Respond_SLT.Payload_Data[25], NCSI_Respond_SLT.Payload_Data[26], NCSI_Respond_SLT.Payload_Data[27]);
+ printf ("PCI SSID/SVID : %02x %02x/%02x %02x\n", NCSI_Respond_SLT.Payload_Data[28], NCSI_Respond_SLT.Payload_Data[29], NCSI_Respond_SLT.Payload_Data[30], NCSI_Respond_SLT.Payload_Data[31]);
+ printf ("Manufacturer ID : %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[32], NCSI_Respond_SLT.Payload_Data[33], NCSI_Respond_SLT.Payload_Data[34], NCSI_Respond_SLT.Payload_Data[35]);
+ printf ("Checksum : %02x %02x %02x %02x\n", NCSI_Respond_SLT.Payload_Data[36], NCSI_Respond_SLT.Payload_Data[37], NCSI_Respond_SLT.Payload_Data[38], NCSI_Respond_SLT.Payload_Data[39]);
+#endif
+ NCSI_Cap_SLT.PCI_DID_VID = (NCSI_Respond_SLT.Payload_Data[24]<<24)
+ | (NCSI_Respond_SLT.Payload_Data[25]<<16)
+ | (NCSI_Respond_SLT.Payload_Data[26]<< 8)
+ | (NCSI_Respond_SLT.Payload_Data[27] );
+ NCSI_Cap_SLT.ManufacturerID = (NCSI_Respond_SLT.Payload_Data[32]<<24)
+ | (NCSI_Respond_SLT.Payload_Data[33]<<16)
+ | (NCSI_Respond_SLT.Payload_Data[34]<< 8)
+ | (NCSI_Respond_SLT.Payload_Data[35] );
+ }
+} // End void Get_Version_ID_SLT (void)
+
+//------------------------------------------------------------
+void Get_Capabilities_SLT (void) {//Command:0x16
+
+ if (NCSI_SentWaitPacket(GET_CAPABILITIES, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 0)) {
+ FindErr_NCSI(NCSI_LinkFail_Get_Capabilities);
+ }
+ else {
+ NCSI_Cap_SLT.Capabilities_Flags = NCSI_Respond_SLT.Payload_Data[0];
+ NCSI_Cap_SLT.Broadcast_Packet_Filter_Capabilities = NCSI_Respond_SLT.Payload_Data[1];
+ NCSI_Cap_SLT.Multicast_Packet_Filter_Capabilities = NCSI_Respond_SLT.Payload_Data[2];
+ NCSI_Cap_SLT.Buffering_Capabilities = NCSI_Respond_SLT.Payload_Data[3];
+ NCSI_Cap_SLT.AEN_Control_Support = NCSI_Respond_SLT.Payload_Data[4];
+ }
+}
+
+//------------------------------------------------------------
+void Get_Controller_Packet_Statistics (void) {//Command:0x18
+
+ NCSI_SentWaitPacket(GET_CONTROLLER_PACKET_STATISTICS, (NCSI_Cap_SLT.Package_ID << 5) + NCSI_Cap_SLT.Channel_ID, 0);
+}
+
+//------------------------------------------------------------
+char phy_ncsi (void) {
+ ULONG Channel_Found = 0;
+ ULONG Package_Found = 0;
+ ULONG Re_Send;
+ ULONG Err_Flag_bak;
+ ULONG pkg_idx;
+ ULONG chl_idx;
+ ULONG Link_Status;
+ ULONG NCSI_LinkFail_Val_bak;
+
+ number_chl = 0;
+ number_pak = 0;
+
+ NCSI_LinkFail_Val = 0;
+ #ifdef SLT_DOS
+ fprintf(fp_log, "\n\n======> Start:\n" );
+ #endif
+ NCSI_Struct_Initialize_SLT();
+
+ #ifdef NCSI_Skip_Phase1_DeSelectPackage
+ #else
+
+ //NCSI Start
+ //Disable Channel then DeSelect Package
+ for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++) {
+ // Ignore error flag in the NCSI command
+ Err_Flag_bak = Err_Flag;
+ NCSI_LinkFail_Val_bak = NCSI_LinkFail_Val;
+ select_flag[pkg_idx] = Select_Package_SLT (pkg_idx); // Command:0x01
+ Err_Flag = Err_Flag_bak;
+ NCSI_LinkFail_Val = NCSI_LinkFail_Val_bak;
+
+ if ( select_flag[pkg_idx] == 0 ) {
+ NCSI_Cap_SLT.Package_ID = pkg_idx;
+
+ for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ ) {
+ NCSI_Cap_SLT.Channel_ID = chl_idx;
+ // Ignore error flag in the NCSI command
+ Err_Flag_bak = Err_Flag;
+ NCSI_LinkFail_Val_bak = NCSI_LinkFail_Val;
+ Disable_Channel_SLT(); // Command: 0x04
+ Err_Flag = Err_Flag_bak;
+ NCSI_LinkFail_Val = NCSI_LinkFail_Val_bak;
+ }
+ #ifdef NCSI_Skip_DeSelectPackage
+ #else
+ DeSelect_Package_SLT (pkg_idx); // Command:0x02
+ #endif
+ } // End if ( select_flag[pkg_idx] == 0 )
+ } // End for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++)
+ #endif
+
+ //Select Package
+ for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++) {
+ #ifdef NCSI_Skip_Phase1_DeSelectPackage
+ // Ignore error flag in the NCSI command
+ Err_Flag_bak = Err_Flag;
+ NCSI_LinkFail_Val_bak = NCSI_LinkFail_Val;
+ select_flag[pkg_idx] = Select_Package_SLT (pkg_idx);//Command:0x01
+ Err_Flag = Err_Flag_bak;
+ NCSI_LinkFail_Val = NCSI_LinkFail_Val_bak;
+ #endif
+
+ if (select_flag[pkg_idx] == 0) {
+ //NCSI_RxTimeOutScale = 1000;
+ NCSI_RxTimeOutScale = 10;
+ number_pak++;
+ Package_Found = 1;
+ NCSI_Cap_SLT.Package_ID = pkg_idx;
+
+ if ( !(IOTiming||IOTimingBund) )
+ printf ("====Find Package ID: %d\n", NCSI_Cap_SLT.Package_ID);
+ #ifdef SLT_DOS
+ fprintf(fp_log, "====Find Package ID: %d\n", NCSI_Cap_SLT.Package_ID);
+ #endif
+
+ #ifdef NCSI_Skip_Phase1_DeSelectPackage
+ #else
+ Select_Package_SLT (pkg_idx);//Command:0x01
+ #endif
+
+ // Scan all channel in the package
+ for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ ) {
+ // backup error flag
+ Err_Flag_bak = Err_Flag;
+ NCSI_LinkFail_Val_bak = NCSI_LinkFail_Val;
+ if (Clear_Initial_State_SLT(chl_idx) == 0) { //Command:0x00
+ number_chl++;
+ Channel_Found = 1;
+ NCSI_Cap_SLT.Channel_ID = chl_idx;
+
+ if ( !(IOTiming || IOTimingBund) )
+ printf ("--------Find Channel ID: %d\n", NCSI_Cap_SLT.Channel_ID);
+
+ #ifdef SLT_DOS
+ fprintf(fp_log, "--------Find Channel ID: %d\n", NCSI_Cap_SLT.Channel_ID);
+ #endif
+ // Get Version and Capabilities
+ Get_Version_ID_SLT(); //Command:0x15
+ Get_Capabilities_SLT(); //Command:0x16
+ Select_Active_Package_SLT(); //Command:0x01
+ Enable_Set_MAC_Address_SLT(); //Command:0x0e
+ Enable_Broadcast_Filter_SLT(); //Command:0x10
+
+ // Enable TX
+ Enable_Network_TX_SLT(); //Command:0x06
+
+ // Enable Channel
+ Enable_Channel_SLT(); //Command:0x03
+
+ // Get Link Status
+ Re_Send = 0;
+ do {
+ #ifdef NCSI_EnableDelay_GetLinkStatus
+ if ( Re_Send >= 2 )
+ delay(Delay_GetLinkStatus);
+ #endif
+
+ Link_Status = Get_Link_Status_SLT();//Command:0x0a
+
+ if ( Link_Status == LINK_UP ) {
+ if (!(IOTiming||IOTimingBund))
+ printf (" This Channel is LINK_UP\n");
+
+ #ifdef SLT_DOS
+ fprintf(fp_log, " This Channel is LINK_UP\n");
+ #endif
+
+ NCSI_ARP ();
+
+ break;
+ }
+ else if ( Link_Status == LINK_DOWN ) {
+ if ( Re_Send >= 2 ) {
+ if ( !(IOTiming || IOTimingBund) )
+ printf (" This Channel is LINK_DOWN\n");
+
+ #ifdef SLT_DOS
+ fprintf(fp_log, " This Channel is LINK_DOWN\n");
+ #endif
+
+ break;
+ }
+ } // End if ( Link_Status == LINK_UP )
+ } while ( Re_Send++ <= 2 );
+
+ #ifdef NCSI_Skip_DiSChannel
+ #else
+ if ( NCSI_DiSChannel ) {
+ // Disable TX
+ Disable_Network_TX_SLT(); //Command:0x07
+ // Disable Channel
+ Disable_Channel_SLT(); //Command:0x04
+ }
+ #endif
+ }
+ else {
+ Err_Flag = Err_Flag_bak;
+ NCSI_LinkFail_Val = NCSI_LinkFail_Val_bak;
+ }
+ } // End for ( chl_idx = 0; chl_idx < MAX_CHANNEL_NUM; chl_idx++ )
+
+ #ifdef NCSI_Skip_DeSelectPackage
+ #else
+ DeSelect_Package_SLT (pkg_idx);//Command:0x02
+ #endif
+ NCSI_RxTimeOutScale = 1;
+ }
+ else {
+ if (!(IOTiming||IOTimingBund)) {
+ printf ("====Absence of Package ID: %ld\n", pkg_idx);
+ #ifdef SLT_DOS
+ fprintf(fp_log, "====Absence of Package ID: %ld\n", pkg_idx);
+ #endif
+ }
+ } // End if (select_flag[pkg_idx] == 0)
+ } // End for (pkg_idx = 0; pkg_idx < MAX_PACKAGE_NUM; pkg_idx++)
+
+ if ( !Package_Found ) FindErr( Err_NCSI_No_PHY );
+ if ( ChannelTolNum != number_chl ) FindErr( Err_NCSI_Channel_Num );
+ if ( PackageTolNum != number_pak ) FindErr( Err_NCSI_Package_Num );
+// if ( !Channel_Found) FindErr();
+
+ if ( Err_Flag )
+ return(1);
+ else
+ return(0);
+}
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/PCI_SPI.c b/arch/arm/cpu/arm926ejs/aspeed/PCI_SPI.c
new file mode 100644
index 0000000..77aac47
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/PCI_SPI.c
@@ -0,0 +1,83 @@
+/*
+ * 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
+ */
+#define PCI_SPI_C
+static const char ThisFile[] = "PCI_SPI.c";
+
+#include "SWFUNC.H"
+
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+#endif
+#ifdef SLT_DOS
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <conio.h>
+ #include <string.h>
+ #include <dos.h>
+#endif
+
+#include "DEF_SPI.H"
+#include "LIB.H"
+#include "TYPEDEF.H"
+
+#ifdef SPI_BUS
+ULONG GetPCIInfo (DEVICE_PCI_INFO *VGAPCIInfo)
+{
+ ULONG ulPCIBaseAddress, MMIOBaseAddress, LinearAddressBase, busnum, data;
+
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x2000, ACTIVE);
+ busnum = 0;
+ while (ulPCIBaseAddress == 0 && busnum < 256) {
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x2000, busnum);
+ if (ulPCIBaseAddress == 0) {
+ ulPCIBaseAddress = FindPCIDevice (0x1688, 0x2000, busnum);
+ }
+ if (ulPCIBaseAddress == 0) {
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x1160, busnum);
+ }
+ if (ulPCIBaseAddress == 0) {
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x1180, busnum);
+ }
+ busnum++;
+ }
+ printf ("ulPCIBaseAddress = %lx\n", ulPCIBaseAddress);
+ if (ulPCIBaseAddress != 0) {
+ VGAPCIInfo->ulPCIConfigurationBaseAddress = ulPCIBaseAddress;
+ VGAPCIInfo->usVendorID = ReadPCIReg(ulPCIBaseAddress, 0, 0xFFFF);
+ VGAPCIInfo->usDeviceID = ReadPCIReg(ulPCIBaseAddress, 0, 0xFFFF0000) >> 16;
+ LinearAddressBase = ReadPCIReg (ulPCIBaseAddress, 0x10, 0xFFFFFFF0);
+ VGAPCIInfo->ulPhysicalBaseAddress = MapPhysicalToLinear (LinearAddressBase, 64 * 1024 * 1024 + 0x200000);
+ MMIOBaseAddress = ReadPCIReg (ulPCIBaseAddress, 0x14, 0xFFFF0000);
+ VGAPCIInfo->ulMMIOBaseAddress = MapPhysicalToLinear (MMIOBaseAddress, 64 * 1024 * 1024);
+ VGAPCIInfo->usRelocateIO = ReadPCIReg (ulPCIBaseAddress, 0x18, 0x0000FF80);
+ OUTDWPORT(0xcf8, ulPCIBaseAddress + 0x4);
+ data = INDWPORT(0xcfc);
+ OUTDWPORT(0xcfc, data | 0x3);
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+} // End ULONG GetPCIInfo (DEVICE_PCI_INFO *VGAPCIInfo)
+
+BOOLEAN GetDevicePCIInfo (VIDEO_ENGINE_INFO *VideoEngineInfo)
+{
+ if (GetPCIInfo (&VideoEngineInfo->VGAPCIInfo) == TRUE) {
+ return TRUE;
+ }
+ else {
+ printf("Can not find PCI device!\n");
+ exit(0);
+ return FALSE;
+ }
+} // End
+#endif // End ifdef SPI_BUS
diff --git a/arch/arm/cpu/arm926ejs/aspeed/PHY.H b/arch/arm/cpu/arm926ejs/aspeed/PHY.H
new file mode 100644
index 0000000..81d9470
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/PHY.H
@@ -0,0 +1,56 @@
+/*
+ * 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
+ */
+#ifndef PHY_H
+#define PHY_H
+
+//
+// Define
+//
+#define Enable_SearchPHYID //[ON] (Search vlid PHY ID)
+#define Enable_CheckZeroPHYID //[ON] (Check PHY ID with value 0)
+
+#ifdef Enable_CheckZeroPHYID
+ #define PHY_IS_VALID( dat ) ( ( (dat & 0xffff) != 0xffff ) && ( ( dat & 0xffff ) != 0x0 ) )
+#else
+ #define PHY_IS_VALID( dat ) ( ( dat & 0xffff) != 0xffff )
+#endif
+
+// Define PHY basic register
+#define PHY_REG_BMCR 0x00 // Basic Mode Control Register
+#define PHY_REG_BMSR 0x01 // Basic Mode Status Register
+#define PHY_REG_ID_1 0x02
+#define PHY_REG_ID_2 0x03
+#define PHY_ANER 0x06 // Auto-negotiation Expansion Register
+#define PHY_GBCR 0x09 // 1000Base-T Control Register
+#define PHY_SR 0x11 // PHY Specific Status Register
+#define PHY_INER 0x12 // Interrupt Enable Register
+
+#define TIME_OUT_PHY_RW 10000
+#define TIME_OUT_PHY_Rst 10000
+
+#define PHYID3_Mask 0xfc00 //0xffc0
+
+/* --- Note for SettingPHY chip ---
+void phy_xxxx (int loop_phy) {
+
+ if ( BurstEnable ) {
+ // IEEE test
+ }
+ else if (loop_phy) {
+ // Internal loop back
+ }
+ else {
+ // external loop back
+ }
+}
+----------------------------------- */
+
+#endif // PHY_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/PHY.c b/arch/arm/cpu/arm926ejs/aspeed/PHY.c
new file mode 100644
index 0000000..6afed9d
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/PHY.c
@@ -0,0 +1,1541 @@
+/*
+ * 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
+ */
+#define PHY_C
+static const char ThisFile[] = "PHY.c";
+
+#include "SWFUNC.H"
+
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+ #include <COMMINF.H>
+ #include "STDUBOOT.H"
+#endif
+#ifdef SLT_DOS
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <conio.h>
+ #include <string.h>
+ #include "COMMINF.H"
+#endif
+
+#include "PHY.H"
+#include "TYPEDEF.H"
+#include "IO.H"
+
+ULONG PHY_09h;
+ULONG PHY_18h;
+ULONG PHY_1fh;
+ULONG PHY_06hA[7];
+ULONG PHY_11h;
+ULONG PHY_12h;
+ULONG PHY_15h;
+ULONG PHY_06h;
+char PHYID[256];
+ULONG PHY_00h;
+
+//------------------------------------------------------------
+// PHY R/W basic
+//------------------------------------------------------------
+void phy_write (int adr, ULONG data) {
+ int timeout = 0;
+
+ if (AST2300_NewMDIO) {
+ WriteSOC_DD( MAC_PHYBASE + 0x60, ( data << 16 ) | MAC_PHYWr_New | (PHY_ADR<<5) | (adr & 0x1f));
+
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYBusy_New ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+ if (!BurstEnable)
+#ifdef SLT_DOS
+ fprintf(fp_log, "[PHY-Write] Time out: %08lx\n", ReadSOC_DD( MAC_PHYBASE + 0x60 ) );
+#endif
+ FindErr( Err_PHY_TimeOut );
+ break;
+ }
+ }
+ }
+ else {
+ WriteSOC_DD( MAC_PHYBASE + 0x64, data );
+
+ WriteSOC_DD( MAC_PHYBASE + 0x60, MDC_Thres | MAC_PHYWr | (PHY_ADR<<16) | ((adr & 0x1f) << 21));
+
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYWr ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+#ifdef SLT_DOS
+ if (!BurstEnable)
+ fprintf(fp_log, "[PHY-Write] Time out: %08lx\n", ReadSOC_DD( MAC_PHYBASE + 0x60 ) );
+#endif
+ FindErr( Err_PHY_TimeOut );
+ break;
+ }
+ }
+ } // End if (AST2300_NewMDIO)
+
+ if ( DbgPrn_PHYRW )
+ printf ("[Wr ]%02d: %04lx\n", adr, data);
+} // End void phy_write (int adr, ULONG data)
+
+//------------------------------------------------------------
+ULONG phy_read (int adr) {
+ int timeout = 0;
+
+ if ( AST2300_NewMDIO ) {
+ WriteSOC_DD( MAC_PHYBASE + 0x60, MAC_PHYRd_New | (PHY_ADR << 5) | ( adr & 0x1f ) );
+
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYBusy_New ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+ if ( !BurstEnable )
+#ifdef SLT_DOS
+ fprintf(fp_log, "[PHY-Read] Time out: %08lx\n", ReadSOC_DD( MAC_PHYBASE + 0x60 ));
+#endif
+ FindErr( Err_PHY_TimeOut );
+ break;
+ }
+ }
+
+ DELAY(Delay_PHYRd);
+ Dat_ULONG = ReadSOC_DD( MAC_PHYBASE + 0x64 ) & 0xffff;
+ }
+ else {
+ WriteSOC_DD( MAC_PHYBASE + 0x60, MDC_Thres | MAC_PHYRd | (PHY_ADR << 16) | ((adr & 0x1f) << 21) );
+
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYRd ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+#ifdef SLT_DOS
+ if ( !BurstEnable )
+ fprintf( fp_log, "[PHY-Read] Time out: %08lx\n", ReadSOC_DD( MAC_PHYBASE + 0x60 ) );
+#endif
+ FindErr( Err_PHY_TimeOut );
+ break;
+ }
+ }
+
+ DELAY( Delay_PHYRd );
+ Dat_ULONG = ReadSOC_DD( MAC_PHYBASE + 0x64 ) >> 16;
+ }
+
+ if ( DbgPrn_PHYRW )
+ printf ("[Rd ]%02d: %04lx\n", adr, Dat_ULONG );
+
+ return( Dat_ULONG );
+} // End ULONG phy_read (int adr)
+
+//------------------------------------------------------------
+void phy_Read_Write (int adr, ULONG clr_mask, ULONG set_mask) {
+ if ( DbgPrn_PHYRW )
+ printf ("[RW ]%02d: clr:%04lx: set:%04lx\n", adr, clr_mask, set_mask);
+ phy_write(adr, ((phy_read(adr) & (~clr_mask)) | set_mask));
+}
+
+//------------------------------------------------------------
+void phy_out ( int adr ) {
+ printf ("%02d: %04lx\n", adr, phy_read(adr));
+}
+
+//------------------------------------------------------------
+//void phy_outchg ( int adr ) {
+// ULONG PHY_valold = 0;
+// ULONG PHY_val;
+//
+// while (1) {
+// PHY_val = phy_read(adr);
+// if (PHY_valold != PHY_val) {
+// printf ("%02d: %04lx\n", adr, PHY_val);
+// PHY_valold = PHY_val;
+// }
+// }
+//}
+
+//------------------------------------------------------------
+void phy_dump (char *name) {
+ int index;
+
+ printf ("[%s][%d]----------------\n", name, PHY_ADR);
+ for (index = 0; index < 32; index++) {
+ printf ("%02d: %04lx ", index, phy_read(index));
+
+ if ((index % 8) == 7)
+ printf ("\n");
+ }
+}
+
+//------------------------------------------------------------
+void phy_id (BYTE option) {
+
+ ULONG reg_adr;
+ CHAR PHY_ADR_org;
+ FILE_VAR
+
+ GET_OBJ( option )
+
+ PHY_ADR_org = PHY_ADR;
+ for (PHY_ADR = 0; PHY_ADR < 32; PHY_ADR++) {
+
+ PRINT(OUT_OBJ "[%02d] ", PHY_ADR);
+
+ for (reg_adr = 2; reg_adr <= 3; reg_adr++)
+ PRINT(OUT_OBJ "%ld:%04lx ", reg_adr, phy_read(reg_adr));
+
+ if ((PHY_ADR % 4) == 3)
+ PRINT(OUT_OBJ "\n");
+ }
+ PHY_ADR = PHY_ADR_org;
+}
+
+
+//------------------------------------------------------------
+void phy_delay (int dt) {
+ DELAY( dt );
+}
+
+//------------------------------------------------------------
+// PHY IC
+//------------------------------------------------------------
+void phy_basic_setting (int loop_phy) {
+ phy_Read_Write(0, 0x7140, PHY_00h); //clr set
+ if ( DbgPrn_PHYRW )
+ printf ("[Set]00: %04lx\n", phy_read( PHY_REG_BMCR ));
+}
+
+//------------------------------------------------------------
+void phy_Wait_Reset_Done (void) {
+ int timeout = 0;
+
+ while ( phy_read( PHY_REG_BMCR ) & 0x8000 ) {
+ if (DbgPrn_PHYRW)
+ printf ("00: %04lx\n", phy_read( PHY_REG_BMCR ));
+
+ if (++timeout > TIME_OUT_PHY_Rst) {
+#ifdef SLT_DOS
+ if (!BurstEnable) fprintf(fp_log, "[PHY-Reset] Time out: %08lx\n", ReadSOC_DD(MAC_PHYBASE+0x60));
+#endif
+ FindErr(Err_PHY_TimeOut);
+ break;
+ }
+ }//wait Rst Done
+
+ if (DbgPrn_PHYRW) printf ("[Clr]00: %04lx\n", phy_read( PHY_REG_BMCR ));
+ DELAY(Delay_PHYRst);
+}
+
+//------------------------------------------------------------
+void phy_Reset (int loop_phy) {
+ phy_basic_setting(loop_phy);
+
+ phy_Read_Write(0, 0x0000, 0x8000 | PHY_00h);//clr set//Rst PHY
+ phy_Wait_Reset_Done();
+
+ phy_basic_setting(loop_phy);
+ DELAY(Delay_PHYRst);
+}
+
+//------------------------------------------------------------
+void recov_phy_marvell (int loop_phy) {//88E1111
+ if ( BurstEnable ) {
+ }
+ else if ( loop_phy ) {
+ }
+ else {
+ if (GSpeed_sel[0]) {
+ phy_write(9, PHY_09h);
+
+ phy_Reset(loop_phy);
+
+ phy_write(29, 0x0007);
+ phy_Read_Write(30, 0x0008, 0x0000);//clr set
+ phy_write(29, 0x0010);
+ phy_Read_Write(30, 0x0002, 0x0000);//clr set
+ phy_write(29, 0x0012);
+ phy_Read_Write(30, 0x0001, 0x0000);//clr set
+
+ phy_write(18, PHY_12h);
+ }
+ }
+}
+
+//------------------------------------------------------------
+void phy_marvell (int loop_phy) {//88E1111
+ int Retry;
+
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Marvell] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ if ( BurstEnable ) {
+ phy_Reset(loop_phy);
+ }
+ else if ( loop_phy ) {
+ phy_Reset(loop_phy);
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ PHY_09h = phy_read( PHY_GBCR );
+ PHY_12h = phy_read( PHY_INER );
+ phy_write ( 18, 0x0000 );
+ phy_Read_Write( 9, 0x0000, 0x1800 );//clr set
+ }
+
+ phy_Reset(loop_phy);
+
+ if (GSpeed_sel[0]) {
+ phy_write ( 29, 0x0007 );
+ phy_Read_Write( 30, 0x0000, 0x0008 );//clr set
+ phy_write ( 29, 0x0010 );
+ phy_Read_Write( 30, 0x0000, 0x0002 );//clr set
+ phy_write ( 29, 0x0012 );
+ phy_Read_Write( 30, 0x0000, 0x0001 );//clr set
+ }
+ }
+
+ Retry = 0;
+ do {
+ PHY_11h = phy_read( PHY_SR );
+ } while ( !( ( PHY_11h & 0x0400 ) | loop_phy | ( Retry++ > 20 ) ) );
+}
+
+//------------------------------------------------------------
+void recov_phy_marvell0 (int loop_phy) {//88E1310
+ if (BurstEnable) {
+ } else if (loop_phy) {
+ } else {
+ if (GSpeed_sel[0]) {
+ phy_write(22, 0x0006);
+ phy_Read_Write(16, 0x0020, 0x0000);//clr set
+ phy_write(22, 0x0000);
+ }
+ }
+}
+
+//------------------------------------------------------------
+void phy_marvell0 (int loop_phy) {//88E1310
+ int Retry;
+
+ if (DbgPrn_PHYName)
+ printf ("--->(%04lx %04lx)[Marvell] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_write( 22, 0x0002 );
+
+ PHY_15h = phy_read(21);
+ if (PHY_15h & 0x0030) {
+ printf ("\n\n[Warning] Page2, Register 21, bit 4~5 must be 0 [Reg15_2:%04lx]\n\n", PHY_15h);
+#ifdef SLT_DOS
+ if ( IOTiming )
+ fprintf (fp_io, "\n\n[Warning] Page2, Register 21, bit 4~5 must be 0 [Reg15_2:%04lx]\n\n", PHY_15h);
+ if ( !BurstEnable)
+ fprintf (fp_log, "\n\n[Warning] Page2, Register 21, bit 4~5 must be 0 [Reg15_2:%04lx]\n\n", PHY_15h);
+#endif
+// phy_Read_Write(21, 0x0030, 0x0000);//clr set//[5]Rx Dly, [4]Tx Dly
+ phy_write(21, PHY_15h & 0xffcf); // Set [5]Rx Dly, [4]Tx Dly to 0
+ }
+ phy_write(22, 0x0000);
+
+ if ( BurstEnable ) {
+ phy_Reset(loop_phy);
+ }
+ else if ( loop_phy ) {
+ phy_write( 22, 0x0002 );
+
+ if ( GSpeed_sel[0] ) {
+ phy_Read_Write( 21, 0x6040, 0x0040 );//clr set
+ }
+ else if ( GSpeed_sel[1] ) {
+ phy_Read_Write( 21, 0x6040, 0x2000 );//clr set
+ }
+ else {
+ phy_Read_Write( 21, 0x6040, 0x0000 );//clr set
+ }
+ phy_write( 22, 0x0000 );
+ phy_Reset( loop_phy );
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 22, 0x0006 );
+ phy_Read_Write( 16, 0x0000, 0x0020 );//clr set
+ phy_write( 22, 0x0000 );
+ }
+
+ phy_Reset(loop_phy);
+ }
+
+ Retry = 0;
+ do {
+ PHY_11h = phy_read( PHY_SR );
+ } while (!((PHY_11h & 0x0400) | loop_phy | (Retry++ > 20)));
+}
+
+//------------------------------------------------------------
+void recov_phy_marvell1 (int loop_phy) {//88E6176
+ CHAR PHY_ADR_org;
+
+ PHY_ADR_org = PHY_ADR;
+ for ( PHY_ADR = 16; PHY_ADR <= 22; PHY_ADR++ ) {
+ if ( BurstEnable ) {
+ }
+ else {
+ phy_write(6, PHY_06hA[PHY_ADR-16]);//06h[5]P5 loopback, 06h[6]P6 loopback
+ }
+ }
+ for ( PHY_ADR = 21; PHY_ADR <= 22; PHY_ADR++ ) {
+ phy_write(1, 0x3); //01h[1:0]00 = 10 Mbps, 01 = 100 Mbps, 10 = 1000 Mbps, 11 = Speed is not forced.
+ }
+ PHY_ADR = PHY_ADR_org;
+}
+
+//------------------------------------------------------------
+void phy_marvell1 (int loop_phy) {//88E6176
+// ULONG PHY_01h;
+ CHAR PHY_ADR_org;
+
+ if (DbgPrn_PHYName)
+ printf ("--->(%04lx %04lx)[Marvell] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ //The 88E6176 is switch with 7 Port(P0~P6) and the PHYAdr will be fixed at 0x10~0x16, and only P5/P6 can be connected to the MAC.
+ //Therefor, the 88E6176 only can run the internal loopback.
+ PHY_ADR_org = PHY_ADR;
+ for ( PHY_ADR = 16; PHY_ADR <= 20; PHY_ADR++ ) {
+ if ( BurstEnable ) {
+ }
+ else {
+ PHY_06hA[PHY_ADR-16] = phy_read( PHY_ANER );
+ phy_write(6, 0x00);//06h[5]P5 loopback, 06h[6]P6 loopback
+ }
+ }
+
+ for ( PHY_ADR = 21; PHY_ADR <= 22; PHY_ADR++ ) {
+// PHY_01h = phy_read( PHY_REG_BMSR );
+// if (GSpeed_sel[0]) phy_write(1, (PHY_01h & 0xfffc) | 0x2);//[1:0]00 = 10 Mbps, 01 = 100 Mbps, 10 = 1000 Mbps, 11 = Speed is not forced.
+// else if (GSpeed_sel[1]) phy_write(1, (PHY_01h & 0xfffc) | 0x1);//[1:0]00 = 10 Mbps, 01 = 100 Mbps, 10 = 1000 Mbps, 11 = Speed is not forced.
+// else phy_write(1, (PHY_01h & 0xfffc) );//[1:0]00 = 10 Mbps, 01 = 100 Mbps, 10 = 1000 Mbps, 11 = Speed is not forced.
+ if (GSpeed_sel[0]) phy_write(1, 0x2);//01h[1:0]00 = 10 Mbps, 01 = 100 Mbps, 10 = 1000 Mbps, 11 = Speed is not forced.
+ else if (GSpeed_sel[1]) phy_write(1, 0x1);//01h[1:0]00 = 10 Mbps, 01 = 100 Mbps, 10 = 1000 Mbps, 11 = Speed is not forced.
+ else phy_write(1, 0x0);//01h[1:0]00 = 10 Mbps, 01 = 100 Mbps, 10 = 1000 Mbps, 11 = Speed is not forced.
+
+ if (BurstEnable) {
+ }
+ else {
+ PHY_06hA[PHY_ADR-16] = phy_read( PHY_ANER );
+ if (PHY_ADR == 21) phy_write(6, 0x20);//06h[5]P5 loopback, 06h[6]P6 loopback
+ else phy_write(6, 0x40);//06h[5]P5 loopback, 06h[6]P6 loopback
+ }
+ }
+ PHY_ADR = PHY_ADR_org;
+}
+
+//------------------------------------------------------------
+void recov_phy_marvell2 (int loop_phy) {//88E1512
+ if (BurstEnable) {
+ }
+ else if (loop_phy) {
+ }
+ else {
+ if (GSpeed_sel[0]) {
+ phy_write(22, 0x0006);
+ phy_Read_Write(18, 0x0008, 0x0000);//clr set
+ phy_write(22, 0x0000);
+ }
+ }
+}
+
+//------------------------------------------------------------
+void phy_marvell2 (int loop_phy) {//88E1512
+ int Retry = 0;
+ ULONG temp_reg;
+
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Marvell] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_write(22, 0x0002);
+ PHY_15h = phy_read(21);
+
+ if ( PHY_15h & 0x0030 ) {
+ printf ("\n\n[Warning] Page2, Register 21, bit 4~5 must be 0 [Reg15h_2:%04lx]\n\n", PHY_15h);
+#ifdef SLT_DOS
+ if (IOTiming ) fprintf (fp_io, "\n\n[Warning] Page2, Register 21, bit 4~5 must be 0 [Reg15h_2:%04lx]\n\n", PHY_15h);
+ if (!BurstEnable) fprintf (fp_log, "\n\n[Warning] Page2, Register 21, bit 4~5 must be 0 [Reg15h_2:%04lx]\n\n", PHY_15h);
+#endif
+ // phy_Read_Write(21, 0x0030, 0x0000);//clr set//[5]Rx Dly, [4]Tx Dly
+// phy_write(21, PHY_15h & 0xffcf);
+ }
+ phy_write(22, 0x0000);
+
+ if ( BurstEnable ) {
+ phy_Reset(loop_phy);
+ }
+ else if (loop_phy) {
+ // Internal loopback funciton only support in copper mode
+ // switch page 18
+ phy_write(22, 0x0012);
+ // Change mode to Copper mode
+ phy_write(20, 0x8210);
+ // do software reset
+ do {
+ temp_reg = phy_read( 20 );
+ } while ( ( (temp_reg & 0x8000) == 0x8000 ) & (Retry++ < 20) );
+
+ // switch page 2
+ phy_write(22, 0x0002);
+ if (GSpeed_sel[0]) {
+ phy_Read_Write(21, 0x2040, 0x0040);//clr set
+ }
+ else if (GSpeed_sel[1]) {
+ phy_Read_Write(21, 0x2040, 0x2000);//clr set
+ }
+ else {
+ phy_Read_Write(21, 0x2040, 0x0000);//clr set
+ }
+ phy_write(22, 0x0000);
+
+ phy_Reset(loop_phy);
+ }
+ else {
+ if (GSpeed_sel[0]) {
+ phy_write(22, 0x0006);
+ phy_Read_Write(18, 0x0000, 0x0008);//clr set
+ phy_write(22, 0x0000);
+ }
+
+ phy_Reset(loop_phy);
+ }
+
+ Retry = 0;
+ do {
+ PHY_11h = phy_read( PHY_SR );
+ } while (!((PHY_11h & 0x0400) | loop_phy | (Retry++ > 20)));
+}
+
+//------------------------------------------------------------
+void phy_broadcom (int loop_phy) {//BCM5221
+ if (DbgPrn_PHYName)
+ printf ("--->(%04lx %04lx)[Broadcom] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_Reset(loop_phy);
+
+ if (IEEETesting) {
+ if (IOTimingBund_arg == 0) {
+ phy_write(25, 0x1f01);//Force MDI //Measuring from channel A
+ }
+ else {
+ phy_Read_Write(24, 0x0000, 0x4000);//clr set//Force Link
+// phy_write( 0, PHY_00h);
+// phy_write(30, 0x1000);
+ }
+ }
+}
+
+//------------------------------------------------------------
+void recov_phy_broadcom0 (int loop_phy) {//BCM54612
+
+ // Need to do it for AST2400
+ phy_write(0x1C, 0x8C00); // Disable GTXCLK Clock Delay Enable
+ phy_write(0x18, 0xF0E7); // Disable RGMII RXD to RXC Skew
+
+ if (BurstEnable) {
+ }
+ else if (loop_phy) {
+ phy_write( 0, PHY_00h);
+ }
+ else {
+ phy_write(0x00, PHY_00h);
+ phy_write(0x09, PHY_09h);
+ phy_write(0x18, PHY_18h);
+ }
+}
+
+//------------------------------------------------------------
+void phy_broadcom0 (int loop_phy) {//BCM54612
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Broadcom] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ // Need to do it for AST2400
+ phy_write(0x1C, 0x8C00); // Disable GTXCLK Clock Delay Enable
+ phy_write(0x18, 0xF0E7); // Disable RGMII RXD to RXC Skew
+
+ // Backup org value
+ // read reg 18H, Page 103, BCM54612EB1KMLG_Spec.pdf
+ phy_write(0x18, 0x7007);
+ PHY_18h = phy_read(0x18);
+
+ PHY_00h = phy_read( PHY_REG_BMCR );
+ PHY_09h = phy_read( PHY_GBCR );
+
+ if ( BurstEnable ) {
+ phy_basic_setting(loop_phy);
+ }
+ else if (loop_phy) {
+ phy_basic_setting(loop_phy);
+
+ // Enable Internal Loopback mode
+ // Page 58, BCM54612EB1KMLG_Spec.pdf
+ phy_write(0x0, 0x5140);
+ DELAY(Delay_PHYRst);
+ /* Only 1G Test is PASS, 100M and 10M is false @20130619 */
+
+// Waiting for BCM FAE's response
+// if (GSpeed_sel[0]) {
+// // Speed 1G
+// // Enable Internal Loopback mode
+// // Page 58, BCM54612EB1KMLG_Spec.pdf
+// phy_write(0x0, 0x5140);
+// }
+// else if (GSpeed_sel[1]) {
+// // Speed 100M
+// // Enable Internal Loopback mode
+// // Page 58, BCM54612EB1KMLG_Spec.pdf
+// phy_write(0x0, 0x7100);
+// phy_write(0x1E, 0x1000);
+// }
+// else if (GSpeed_sel[2]) {
+// // Speed 10M
+// // Enable Internal Loopback mode
+// // Page 58, BCM54612EB1KMLG_Spec.pdf
+// phy_write(0x0, 0x5100);
+// phy_write(0x1E, 0x1000);
+// }
+//
+// DELAY(Delay_PHYRst);
+ }
+ else {
+
+ if (GSpeed_sel[0]) {
+ // Page 60, BCM54612EB1KMLG_Spec.pdf
+ // need to insert loopback plug
+ phy_write( 9, 0x1800);
+ phy_write( 0, 0x0140);
+ phy_write( 0x18, 0x8400); // Enable Transmit test mode
+ } else if (GSpeed_sel[1]) {
+ // Page 60, BCM54612EB1KMLG_Spec.pdf
+ // need to insert loopback plug
+ phy_write( 0, 0x2100);
+ phy_write( 0x18, 0x8400); // Enable Transmit test mode
+ } else {
+ // Page 60, BCM54612EB1KMLG_Spec.pdf
+ // need to insert loopback plug
+ phy_write( 0, 0x0100);
+ phy_write( 0x18, 0x8400); // Enable Transmit test mode
+ }
+ }
+}
+
+//------------------------------------------------------------
+void phy_realtek (int loop_phy) {//RTL8201N
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Realtek] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_Reset(loop_phy);
+}
+
+//------------------------------------------------------------
+//internal loop 100M: Don't support
+//internal loop 10M : no loopback stub
+void phy_realtek0 (int loop_phy) {//RTL8201E
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Realtek] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_Reset(loop_phy);
+
+// phy_Read_Write(25, 0x2800, 0x0000);//clr set
+// printf("Enable phy output RMII clock\n");
+ if (IEEETesting) {
+ phy_write(31, 0x0001);
+ if (IOTimingBund_arg == 0) {
+ phy_write(25, 0x1f01);//Force MDI //Measuring from channel A
+ }
+ else {
+ phy_write(25, 0x1f00);//Force MDIX //Measuring from channel B
+ }
+ phy_write(31, 0x0000);
+ }
+}
+
+//------------------------------------------------------------
+void recov_phy_realtek1 (int loop_phy) {//RTL8211D
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ if ( GSpeed_sel[0] ) {
+ if (IOTimingBund_arg == 0) {
+ //Test Mode 1
+ phy_write( 31, 0x0002 );
+ phy_write( 2, 0xc203 );
+ phy_write( 31, 0x0000 );
+ phy_write( 9, 0x0000 );
+ }
+ else {
+ //Test Mode 4
+ phy_write( 31, 0x0000 );
+ phy_write( 9, 0x0000 );
+ }
+
+ phy_write( 31, 0x0000 );
+ }
+ else if ( GSpeed_sel[1] ) {
+ phy_write( 23, 0x2100 );
+ phy_write( 16, 0x016e );
+ }
+ else {
+// phy_write( 31, 0x0006 );
+// phy_write( 0, 0x5a00 );
+// phy_write( 31, 0x0000 );
+ }
+ } // End if ( IEEETesting )
+ }
+ else if (loop_phy) {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 31, 0x0000 ); // new in Rev. 1.6
+ phy_write( 0, 0x1140 ); // new in Rev. 1.6
+ phy_write( 20, 0x8040 ); // new in Rev. 1.6
+ }
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 31, 0x0001 );
+ phy_write( 3, 0xdf41 );
+ phy_write( 2, 0xdf20 );
+ phy_write( 1, 0x0140 );
+ phy_write( 0, 0x00bb );
+ phy_write( 4, 0xb800 );
+ phy_write( 4, 0xb000 );
+
+ phy_write( 31, 0x0000 );
+// phy_write( 26, 0x0020 ); // Rev. 1.2
+ phy_write( 26, 0x0040 ); // new in Rev. 1.6
+ phy_write( 0, 0x1140 );
+// phy_write( 21, 0x0006 ); // Rev. 1.2
+ phy_write( 21, 0x1006 ); // new in Rev. 1.6
+ phy_write( 23, 0x2100 );
+// } else if ( GSpeed_sel[1] ) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0200 );
+// phy_write( 0, 0x1200 );
+// } else if ( GSpeed_sel[2] ) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0200 );
+// phy_write( 4, 0x05e1 );
+// phy_write( 0, 0x1200 );
+ }
+ } // End if ( BurstEnable )
+} // End void recov_phy_realtek1 (int loop_phy)
+
+//------------------------------------------------------------
+//internal loop 1G : no loopback stub
+//internal loop 100M: no loopback stub
+//internal loop 10M : no loopback stub
+void phy_realtek1 (int loop_phy) {//RTL8211D
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Realtek] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ if ( GSpeed_sel[0] ) {
+ if (IOTimingBund_arg == 0) {
+ //Test Mode 1
+ phy_write( 31, 0x0002 );
+ phy_write( 2, 0xc22b );
+ phy_write( 31, 0x0000 );
+ phy_write( 9, 0x2000 );
+ }
+ else {
+ //Test Mode 4
+ phy_write( 31, 0x0000 );
+ phy_write( 9, 0x8000 );
+ }
+ phy_write( 31, 0x0000 );
+ }
+ else if ( GSpeed_sel[1] ) {
+ if ( IOTimingBund_arg == 0 ) {
+ //From Channel A
+ phy_write( 23, 0xa102 );
+ phy_write( 16, 0x01ae );//MDI
+ }
+ else {
+ //From Channel B
+ phy_Read_Write( 17, 0x0008, 0x0000 ); // clr set
+ phy_write( 23, 0xa102 ); // MDI
+ phy_write( 16, 0x010e );
+ }
+ } else {
+// if ( IOTimingBund_arg == 0 ) {//Pseudo-random pattern
+// phy_write( 31, 0x0006 );
+// phy_write( 0, 0x5a21 );
+// phy_write( 31, 0x0000 );
+// }
+// else if ( IOTimingBund_arg == 1 ) {//¡§FF¡¨ pattern
+// phy_write( 31, 0x0006 );
+// phy_write( 2, 0x05ee );
+// phy_write( 0, 0xff21 );
+// phy_write( 31, 0x0000 );
+// } else {//¡§00¡¨ pattern
+// phy_write( 31, 0x0006 );
+// phy_write( 2, 0x05ee );
+// phy_write( 0, 0x0021 );
+// phy_write( 31, 0x0000 );
+// }
+ }
+ }
+ else {
+ phy_Reset(loop_phy);
+ }
+ }
+ else if ( loop_phy ) {
+ phy_Reset(loop_phy);
+
+ if ( GSpeed_sel[0] ) {
+ phy_write(20, 0x0042);//new in Rev. 1.6
+ }
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 31, 0x0001 );
+ phy_write( 3, 0xff41 );
+ phy_write( 2, 0xd720 );
+ phy_write( 1, 0x0140 );
+ phy_write( 0, 0x00bb );
+ phy_write( 4, 0xb800 );
+ phy_write( 4, 0xb000 );
+
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x0040 );
+ phy_write( 24, 0x0008 );
+
+ phy_write( 31, 0x0000 );
+ phy_write( 9, 0x0300 );
+ phy_write( 26, 0x0020 );
+ phy_write( 0, 0x0140 );
+ phy_write( 23, 0xa101 );
+ phy_write( 21, 0x0200 );
+ phy_write( 23, 0xa121 );
+ phy_write( 23, 0xa161 );
+ phy_write( 0, 0x8000 );
+ phy_Wait_Reset_Done();
+ phy_delay(200); // new in Rev. 1.6
+// }
+// else if ( GSpeed_sel[1] ) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0000 );
+// phy_write( 4, 0x0061 );
+// phy_write( 0, 0x1200 );
+// phy_delay(5000);
+// }
+// else if (GSpeed_sel[2]) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0000 );
+// phy_write( 4, 0x05e1 );
+// phy_write( 0, 0x1200 );
+// phy_delay(5000);
+ }
+ else {
+ phy_Reset(loop_phy);
+ }
+ }
+} // End void phy_realtek1 (int loop_phy)
+
+//------------------------------------------------------------
+void recov_phy_realtek2 (int loop_phy) {//RTL8211E
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ phy_write( 31, 0x0005 );
+ phy_write( 5, 0x8b86 );
+ phy_write( 6, 0xe201 );
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x0020 );
+ phy_write( 21, 0x1108 );
+ phy_write( 31, 0x0000 );
+
+ if ( GSpeed_sel[0] ) {
+ phy_write( 31, 0x0000 );
+ phy_write( 9, 0x0000 );
+ }
+ else if ( GSpeed_sel[1] ) {
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x002f );
+ phy_write( 23, 0xd88f );
+ phy_write( 30, 0x002d );
+ phy_write( 24, 0xf050 );
+ phy_write( 31, 0x0000 );
+ phy_write( 16, 0x006e );
+ }
+ else {
+ }
+ }
+ else {
+ }
+ }
+ else if (loop_phy) {
+ }
+ else {
+ if (GSpeed_sel[0]) {
+ //Rev 1.5 //not stable
+// phy_write( 31, 0x0000 );
+// phy_write( 0, 0x8000 );
+// phy_Wait_Reset_Done();
+// phy_delay(30);
+// phy_write( 23, 0x2160 );
+// phy_write( 31, 0x0007 );
+// phy_write( 30, 0x0040 );
+// phy_write( 24, 0x0004 );
+// phy_write( 24, 0x1a24 );
+// phy_write( 25, 0xfd00 );
+// phy_write( 24, 0x0000 );
+// phy_write( 31, 0x0000 );
+// phy_write( 0, 0x1140 );
+// phy_write( 26, 0x0040 );
+// phy_write( 31, 0x0007 );
+// phy_write( 30, 0x002f );
+// phy_write( 23, 0xd88f );
+// phy_write( 30, 0x0023 );
+// phy_write( 22, 0x0300 );
+// phy_write( 31, 0x0000 );
+// phy_write( 21, 0x1006 );
+// phy_write( 23, 0x2100 );
+/**/
+ //Rev 1.6
+ phy_write( 31, 0x0000 );
+ phy_write( 0, 0x8000 );
+ phy_Wait_Reset_Done();
+ phy_delay(30);
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x0042 );
+ phy_write( 21, 0x0500 );
+ phy_write( 31, 0x0000 );
+ phy_write( 0, 0x1140 );
+ phy_write( 26, 0x0040 );
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x002f );
+ phy_write( 23, 0xd88f );
+ phy_write( 30, 0x0023 );
+ phy_write( 22, 0x0300 );
+ phy_write( 31, 0x0000 );
+ phy_write( 21, 0x1006 );
+ phy_write( 23, 0x2100 );
+/**/
+// } else if (GSpeed_sel[1]) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0200 );
+// phy_write( 0, 0x1200 );
+// } else if (GSpeed_sel[2]) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0200 );
+// phy_write( 4, 0x05e1 );
+// phy_write( 0, 0x1200 );
+ }
+ }
+} // End void recov_phy_realtek2 (int loop_phy)
+
+//------------------------------------------------------------
+//internal loop 1G : no loopback stub
+//internal loop 100M: no loopback stub
+//internal loop 10M : no loopback stub
+void phy_realtek2 (int loop_phy) {//RTL8211E
+
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Realtek] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_Read_Write( 0, 0x0000, 0x8000 | PHY_00h ); // clr set // Rst PHY
+ phy_Wait_Reset_Done();
+ phy_delay(30);
+
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ phy_write( 31, 0x0005 );
+ phy_write( 5, 0x8b86 );
+ phy_write( 6, 0xe200 );
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x0020 );
+ phy_write( 21, 0x0108 );
+ phy_write( 31, 0x0000 );
+
+ if ( GSpeed_sel[0] ) {
+ phy_write( 31, 0x0000 );
+
+ if ( IOTimingBund_arg == 0 ) {
+ phy_write( 9, 0x2000);//Test Mode 1
+ }
+ else {
+ phy_write( 9, 0x8000);//Test Mode 4
+ }
+ }
+ else if ( GSpeed_sel[1] ) {
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x002f );
+ phy_write( 23, 0xd818 );
+ phy_write( 30, 0x002d );
+ phy_write( 24, 0xf060 );
+ phy_write( 31, 0x0000 );
+
+ if ( IOTimingBund_arg == 0 ) {
+ phy_write(16, 0x00ae);//From Channel A
+ }
+ else {
+ phy_write(16, 0x008e);//From Channel B
+ }
+ }
+ else {
+ }
+ }
+ else {
+ phy_basic_setting(loop_phy);
+ phy_delay(30);
+ }
+ }
+ else if (loop_phy) {
+ phy_basic_setting(loop_phy);
+
+ phy_Read_Write(0, 0x0000, 0x8000 | PHY_00h);//clr set//Rst PHY
+ phy_Wait_Reset_Done();
+ phy_delay(30);
+
+ phy_basic_setting(loop_phy);
+ phy_delay(30);
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ //Rev 1.5 //not stable
+// phy_write( 23, 0x2160 );
+// phy_write( 31, 0x0007 );
+// phy_write( 30, 0x0040 );
+// phy_write( 24, 0x0004 );
+// phy_write( 24, 0x1a24 );
+// phy_write( 25, 0x7d00 );
+// phy_write( 31, 0x0000 );
+// phy_write( 23, 0x2100 );
+// phy_write( 31, 0x0007 );
+// phy_write( 30, 0x0040 );
+// phy_write( 24, 0x0000 );
+// phy_write( 30, 0x0023 );
+// phy_write( 22, 0x0006 );
+// phy_write( 31, 0x0000 );
+// phy_write( 0, 0x0140 );
+// phy_write( 26, 0x0060 );
+// phy_write( 31, 0x0007 );
+// phy_write( 30, 0x002f );
+// phy_write( 23, 0xd820 );
+// phy_write( 31, 0x0000 );
+// phy_write( 21, 0x0206 );
+// phy_write( 23, 0x2120 );
+// phy_write( 23, 0x2160 );
+/**/
+ //Rev 1.6
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x0042 );
+ phy_write( 21, 0x2500 );
+ phy_write( 30, 0x0023 );
+ phy_write( 22, 0x0006 );
+ phy_write( 31, 0x0000 );
+ phy_write( 0, 0x0140 );
+ phy_write( 26, 0x0060 );
+ phy_write( 31, 0x0007 );
+ phy_write( 30, 0x002f );
+ phy_write( 23, 0xd820 );
+ phy_write( 31, 0x0000 );
+ phy_write( 21, 0x0206 );
+ phy_write( 23, 0x2120 );
+ phy_write( 23, 0x2160 );
+ phy_delay(300);
+/**/
+// }
+// else if ( GSpeed_sel[1] ) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0000 );
+// phy_write( 4, 0x0061 );
+// phy_write( 0, 0x1200 );
+// phy_delay(5000);
+// }
+// else if ( GSpeed_sel[2] ) {//option
+// phy_write( 31, 0x0000 );
+// phy_write( 9, 0x0000 );
+// phy_write( 4, 0x05e1 );
+// phy_write( 0, 0x1200 );
+// phy_delay(5000);
+ }
+ else {
+ phy_basic_setting(loop_phy);
+ phy_delay(150);
+ }
+ }
+} // End void phy_realtek2 (int loop_phy)
+
+//------------------------------------------------------------
+void recov_phy_realtek3 (int loop_phy) {//RTL8211C
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 9, 0x0000 );
+ }
+ else if ( GSpeed_sel[1] ) {
+ phy_write( 17, PHY_11h );
+ phy_write( 14, 0x0000 );
+ phy_write( 16, 0x00a0 );
+ }
+ else {
+// phy_write( 31, 0x0006 );
+// phy_write( 0, 0x5a00 );
+// phy_write( 31, 0x0000 );
+ }
+ }
+ else {
+ }
+ }
+ else if (loop_phy) {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 11, 0x0000 );
+ }
+ phy_write( 12, 0x1006 );
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 31, 0x0001 );
+ phy_write( 4, 0xb000 );
+ phy_write( 3, 0xff41 );
+ phy_write( 2, 0xdf20 );
+ phy_write( 1, 0x0140 );
+ phy_write( 0, 0x00bb );
+ phy_write( 4, 0xb800 );
+ phy_write( 4, 0xb000 );
+
+ phy_write( 31, 0x0000 );
+ phy_write( 25, 0x8c00 );
+ phy_write( 26, 0x0040 );
+ phy_write( 0, 0x1140 );
+ phy_write( 14, 0x0000 );
+ phy_write( 12, 0x1006 );
+ phy_write( 23, 0x2109 );
+ }
+ }
+}
+
+//------------------------------------------------------------
+void phy_realtek3 (int loop_phy) {//RTL8211C
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Realtek] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ if ( GSpeed_sel[0] ) {
+ if ( IOTimingBund_arg == 0 ) { //Test Mode 1
+ phy_write( 9, 0x2000);
+ }
+ else if (IOTimingBund_arg == 1) {//Test Mode 2
+ phy_write( 9, 0x4000);
+ }
+ else if (IOTimingBund_arg == 2) {//Test Mode 3
+ phy_write( 9, 0x6000);
+ }
+ else { //Test Mode 4
+ phy_write( 9, 0x8000);
+ }
+ }
+ else if ( GSpeed_sel[1] ) {
+ PHY_11h = phy_read( PHY_SR );
+ phy_write( 17, PHY_11h & 0xfff7 );
+ phy_write( 14, 0x0660 );
+
+ if ( IOTimingBund_arg == 0 ) {
+ phy_write( 16, 0x00a0 );//MDI //From Channel A
+ }
+ else {
+ phy_write( 16, 0x0080 );//MDIX //From Channel B
+ }
+ }
+ else {
+// if (IOTimingBund_arg == 0) {//Pseudo-random pattern
+// phy_write( 31, 0x0006 );
+// phy_write( 0, 0x5a21 );
+// phy_write( 31, 0x0000 );
+// }
+// else if (IOTimingBund_arg == 1) {//¡§FF¡¨ pattern
+// phy_write( 31, 0x0006 );
+// phy_write( 2, 0x05ee );
+// phy_write( 0, 0xff21 );
+// phy_write( 31, 0x0000 );
+// }
+// else {//¡§00¡¨ pattern
+// phy_write( 31, 0x0006 );
+// phy_write( 2, 0x05ee );
+// phy_write( 0, 0x0021 );
+// phy_write( 31, 0x0000 );
+// }
+ }
+ }
+ else {
+ phy_Reset(loop_phy);
+ }
+ }
+ else if (loop_phy) {
+ phy_write( 0, 0x9200);
+ phy_Wait_Reset_Done();
+ phy_delay(30);
+
+ phy_write( 17, 0x401c );
+ phy_write( 12, 0x0006 );
+
+ if ( GSpeed_sel[0] ) {
+ phy_write(11, 0x0002);
+ }
+ else {
+ phy_basic_setting(loop_phy);
+ }
+ }
+ else {
+ if (GSpeed_sel[0]) {
+ phy_write( 31, 0x0001 );
+ phy_write( 4, 0xb000 );
+ phy_write( 3, 0xff41 );
+ phy_write( 2, 0xd720 );
+ phy_write( 1, 0x0140 );
+ phy_write( 0, 0x00bb );
+ phy_write( 4, 0xb800 );
+ phy_write( 4, 0xb000 );
+
+ phy_write( 31, 0x0000 );
+ phy_write( 25, 0x8400 );
+ phy_write( 26, 0x0020 );
+ phy_write( 0, 0x0140 );
+ phy_write( 14, 0x0210 );
+ phy_write( 12, 0x0200 );
+ phy_write( 23, 0x2109 );
+ phy_write( 23, 0x2139 );
+ }
+ else {
+ phy_Reset(loop_phy);
+ }
+ }
+} // End void phy_realtek3 (int loop_phy)
+
+//------------------------------------------------------------
+void phy_realtek4 (int loop_phy) {//RTL8201F
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Realtek] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ phy_write( 31, 0x0004 );
+ phy_write( 16, 0x4077 );
+ phy_write( 21, 0xc5a0 );
+ phy_write( 31, 0x0000 );
+
+ if ( GSpeed_sel[1] ) {
+ phy_write( 0, 0x8000 ); // Reset PHY
+ phy_write( 24, 0x0310 ); // Disable ALDPS
+
+ if ( IOTimingBund_arg == 0 ) {
+ phy_write( 28, 0x40c2 ); //Force MDI //From Channel A (RJ45 pair 1, 2)
+ }
+ else {
+ phy_write( 28, 0x40c0 ); //Force MDIX//From Channel B (RJ45 pair 3, 6)
+ }
+ phy_write( 0, 0x2100); //Force 100M/Full Duplex)
+ }
+ } else {
+ phy_Reset(loop_phy);
+ }
+ }
+ else {
+ phy_Reset(loop_phy);
+ }
+}
+
+//------------------------------------------------------------
+void phy_smsc (int loop_phy) {//LAN8700
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[SMSC] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_Reset(loop_phy);
+}
+
+//------------------------------------------------------------
+void phy_micrel (int loop_phy) {//KSZ8041
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[Micrel] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_Reset(loop_phy);
+
+// phy_write(24, 0x0600);
+}
+
+//------------------------------------------------------------
+void phy_micrel0 (int loop_phy) {//KSZ8031/KSZ8051
+ if ( DbgPrn_PHYName ) printf ("--->(%04lx %04lx)[Micrel] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ //For KSZ8051RNL only
+ //Reg1Fh[7] = 0(default): 25MHz Mode, XI, XO(pin 9, 8) is 25MHz(crystal/oscilator).
+ //Reg1Fh[7] = 1 : 50MHz Mode, XI(pin 9) is 50MHz(oscilator).
+ PHY_1fh = phy_read(31);
+ if (PHY_1fh & 0x0080) sprintf(PHYName, "%s-50MHz Mode", PHYName);
+ else sprintf(PHYName, "%s-25MHz Mode", PHYName);
+
+ if (IEEETesting) {
+ phy_Read_Write( 0, 0x0000, 0x8000 | PHY_00h );//clr set//Rst PHY
+ phy_Wait_Reset_Done();
+
+ phy_Read_Write( 31, 0x0000, 0x2000 );//clr set//1Fh[13] = 1: Disable auto MDI/MDI-X
+ phy_basic_setting(loop_phy);
+ phy_Read_Write( 31, 0x0000, 0x0800 );//clr set//1Fh[11] = 1: Force link pass
+
+// phy_delay(2500);//2.5 sec
+ }
+ else {
+ phy_Reset(loop_phy);
+
+ //Reg16h[6] = 1 : RMII B-to-B override
+ //Reg16h[1] = 1(default): RMII override
+ phy_Read_Write( 22, 0x0000, 0x0042 );//clr set
+ }
+
+ if ( PHY_1fh & 0x0080 )
+ phy_Read_Write( 31, 0x0000, 0x0080 );//clr set//Reset PHY will clear Reg1Fh[7]
+}
+
+//------------------------------------------------------------
+void recov_phy_vitesse (int loop_phy) {//VSC8601
+ if ( BurstEnable ) {
+// if (IEEETesting) {
+// } else {
+// }
+ }
+ else if ( loop_phy ) {
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ phy_write( 24, PHY_18h );
+ phy_write( 18, PHY_12h );
+ }
+ }
+}
+
+//------------------------------------------------------------
+void phy_vitesse (int loop_phy) {//VSC8601
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)[VITESSE] %s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ if ( BurstEnable ) {
+ if ( IEEETesting ) {
+ phy_Reset(loop_phy);
+ }
+ else {
+ phy_Reset(loop_phy);
+ }
+ }
+ else if ( loop_phy ) {
+ phy_Reset(loop_phy);
+ }
+ else {
+ if ( GSpeed_sel[0] ) {
+ PHY_18h = phy_read( 24 );
+ PHY_12h = phy_read( PHY_INER );
+
+ phy_Reset(loop_phy);
+
+ phy_write( 24, PHY_18h | 0x0001 );
+ phy_write( 18, PHY_12h | 0x0020 );
+ }
+ else {
+ phy_Reset(loop_phy);
+ }
+ }
+}
+
+//------------------------------------------------------------
+void phy_default (int loop_phy) {
+ if ( DbgPrn_PHYName )
+ printf ("--->(%04lx %04lx)%s\n", PHY_ID2, PHY_ID3, PHYName);
+
+ phy_Reset(loop_phy);
+}
+
+//------------------------------------------------------------
+// PHY Init
+//------------------------------------------------------------
+BOOLEAN find_phyadr (void) {
+ ULONG PHY_val;
+ BOOLEAN ret = FALSE;
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("find_phyadr\n");
+ Debug_delay();
+ #endif
+
+ do {
+ // Check current PHY address by user setting
+ PHY_val = phy_read( PHY_REG_ID_1 );
+ if ( PHY_IS_VALID(PHY_val) ) {
+ ret = TRUE;
+ break;
+ }
+
+ if ( Enable_SkipChkPHY ) {
+ PHY_val = phy_read( PHY_REG_BMCR );
+
+ if ((PHY_val & 0x8000) & Enable_InitPHY) {
+ // PHY is reseting and need to inital PHY
+ #ifndef Enable_SearchPHYID
+ break;
+ #endif
+ }
+ else {
+ ret = TRUE;
+ break;
+ }
+ }
+
+ #ifdef Enable_SearchPHYID
+ // Scan PHY address from 0 to 31
+ printf("Search PHY address\n");
+ for ( PHY_ADR = 0; PHY_ADR < 32; PHY_ADR++ ) {
+ PHY_val = phy_read( PHY_REG_ID_1 );
+ if ( PHY_IS_VALID(PHY_val) ) {
+ ret = TRUE;
+ break;
+ }
+ }
+ // Don't find PHY address
+ PHY_ADR = PHY_ADR_arg;
+ #endif
+ } while ( 0 );
+
+ if ( ret == TRUE ) {
+ if ( PHY_ADR_arg != PHY_ADR ) {
+
+ if ( !BurstEnable )
+ phy_id( FP_LOG );
+
+ phy_id( STD_OUT );
+ }
+ }
+ else {
+
+ if ( !BurstEnable )
+ phy_id( FP_LOG );
+
+ phy_id( STD_OUT );
+ FindErr( Err_PHY_Type );
+ }
+
+ return ret;
+} // End BOOLEAN find_phyadr (void)
+
+//------------------------------------------------------------
+char phy_chk (ULONG id2, ULONG id3, ULONG id3_mask) {
+ if ((PHY_ID2 == id2) && ((PHY_ID3 & id3_mask) == (id3 & id3_mask)))
+ return(1);
+ else
+ return(0);
+}
+
+//------------------------------------------------------------
+void phy_set00h (int loop_phy) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("phy_set00h\n");
+ Debug_delay();
+ #endif
+
+ if (BurstEnable) {
+ if (IEEETesting) {
+ if (GSpeed_sel[0]) PHY_00h = 0x0140;
+ else if (GSpeed_sel[1]) PHY_00h = 0x2100;
+ else PHY_00h = 0x0100;
+ }
+ else {
+ if (GSpeed_sel[0]) PHY_00h = 0x1140;
+ else if (GSpeed_sel[1]) PHY_00h = 0x3100;
+ else PHY_00h = 0x1100;
+ }
+ }
+ else if (loop_phy) {
+ if (GSpeed_sel[0]) PHY_00h = 0x4140;
+ else if (GSpeed_sel[1]) PHY_00h = 0x6100;
+ else PHY_00h = 0x4100;
+ }
+ else {
+ if (GSpeed_sel[0]) PHY_00h = 0x0140;
+ else if (GSpeed_sel[1]) PHY_00h = 0x2100;
+ else PHY_00h = 0x0100;
+ }
+}
+
+//------------------------------------------------------------
+void phy_sel (int loop_phy) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("phy_sel\n");
+ Debug_delay();
+ #endif
+
+ PHY_ID2 = phy_read( PHY_REG_ID_1 );
+ PHY_ID3 = phy_read( PHY_REG_ID_2 );
+ phy_set00h(loop_phy);
+
+ if ((PHY_ID2 == 0xffff) && (PHY_ID3 == 0xffff) && !Enable_SkipChkPHY) {
+ sprintf(PHYName, "--");
+ FindErr(Err_PHY_Type);
+ }
+#ifdef Enable_CheckZeroPHYID
+ else if ((PHY_ID2 == 0x0000) && (PHY_ID3 == 0x0000) && !Enable_SkipChkPHY) {
+ sprintf(PHYName, "--"); FindErr(Err_PHY_Type);
+ }
+#endif
+
+ if (phy_chk(0x0362, 0x5e6a, 0xfff0 )) {sprintf(PHYName, "BCM54612" ); if (Enable_InitPHY) phy_broadcom0(loop_phy);}//BCM54612 1G/100/10M RGMII
+ else if (phy_chk(0x0362, 0x5d10, 0xfff0 )) {sprintf(PHYName, "BCM54616S" ); if (Enable_InitPHY) phy_broadcom0(loop_phy);}//BCM54616A 1G/100/10M RGMII
+ else if (phy_chk(0x0040, 0x61e0, PHYID3_Mask)) {sprintf(PHYName, "BCM5221" ); if (Enable_InitPHY) phy_broadcom (loop_phy);}//BCM5221 100/10M MII, RMII
+ else if (phy_chk(0x0141, 0x0dd0, 0xfff0 )) {sprintf(PHYName, "88E1512" ); if (Enable_InitPHY) phy_marvell2 (loop_phy);}//88E1512 1G/100/10M RGMII
+ else if (phy_chk(0xff00, 0x1761, 0xffff )) {sprintf(PHYName, "88E6176(IntLoop)"); if (Enable_InitPHY) phy_marvell1 (loop_phy);}//88E6176 1G/100/10M 2 RGMII Switch
+ else if (phy_chk(0x0141, 0x0e90, 0xfff0 )) {sprintf(PHYName, "88E1310" ); if (Enable_InitPHY) phy_marvell0 (loop_phy);}//88E1310 1G/100/10M RGMII
+ else if (phy_chk(0x0141, 0x0cc0, PHYID3_Mask)) {sprintf(PHYName, "88E1111" ); if (Enable_InitPHY) phy_marvell (loop_phy);}//88E1111 1G/100/10M GMII, MII, RGMII
+ else if (phy_chk(0x001c, 0xc816, 0xffff )) {sprintf(PHYName, "RTL8201F" ); if (Enable_InitPHY) phy_realtek4 (loop_phy);}//RTL8201F 100/10M MII, RMII
+ else if (phy_chk(0x001c, 0xc815, 0xfff0 )) {sprintf(PHYName, "RTL8201E" ); if (Enable_InitPHY) phy_realtek0 (loop_phy);}//RTL8201E 100/10M MII, RMII(RTL8201E(L)-VC only)
+ else if (phy_chk(0x001c, 0xc912, 0xffff )) {sprintf(PHYName, "RTL8211C" ); if (Enable_InitPHY) phy_realtek3 (loop_phy);}//RTL8211C 1G/100/10M RGMII
+ else if (phy_chk(0x001c, 0xc914, 0xffff )) {sprintf(PHYName, "RTL8211D" ); if (Enable_InitPHY) phy_realtek1 (loop_phy);}//RTL8211D 1G/100/10M GMII(RTL8211DN/RTL8211DG only), MII(RTL8211DN/RTL8211DG only), RGMII
+ else if (phy_chk(0x001c, 0xc915, 0xffff )) {sprintf(PHYName, "RTL8211E" ); if (Enable_InitPHY) phy_realtek2 (loop_phy);}//RTL8211E 1G/100/10M GMII(RTL8211EG only), RGMII
+ else if (phy_chk(0x0000, 0x8201, PHYID3_Mask)) {sprintf(PHYName, "RTL8201N" ); if (Enable_InitPHY) phy_realtek (loop_phy);}//RTL8201N 100/10M MII, RMII
+ else if (phy_chk(0x0007, 0xc0c4, PHYID3_Mask)) {sprintf(PHYName, "LAN8700" ); if (Enable_InitPHY) phy_smsc (loop_phy);}//LAN8700 100/10M MII, RMII
+ else if (phy_chk(0x0022, 0x1555, 0xfff0 )) {sprintf(PHYName, "KSZ8031/KSZ8051" ); if (Enable_InitPHY) phy_micrel0 (loop_phy);}//KSZ8051/KSZ8031 100/10M RMII
+ else if (phy_chk(0x0022, 0x1560, 0xfff0 )) {sprintf(PHYName, "KSZ8081" ); if (Enable_InitPHY) phy_micrel0 (loop_phy);}//KSZ8081 100/10M RMII
+ else if (phy_chk(0x0022, 0x1512, 0xfff0 )) {sprintf(PHYName, "KSZ8041" ); if (Enable_InitPHY) phy_micrel (loop_phy);}//KSZ8041 100/10M RMII
+ else if (phy_chk(0x0007, 0x0421, 0xfff0 )) {sprintf(PHYName, "VSC8601" ); if (Enable_InitPHY) phy_vitesse (loop_phy);}//VSC8601 1G/100/10M RGMII
+ else {sprintf(PHYName, "default" ); if (Enable_InitPHY) phy_default (loop_phy);}//
+}
+
+//------------------------------------------------------------
+void recov_phy (int loop_phy) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("recov_phy\n");
+ Debug_delay();
+ #endif
+
+ if (phy_chk(0x0362, 0x5e6a, 0xfff0 )) recov_phy_broadcom0(loop_phy);//BCM54612 1G/100/10M RGMII
+ else if (phy_chk(0x0362, 0x5d10, 0xfff0 )) recov_phy_broadcom0(loop_phy);//BCM54616A 1G/100/10M RGMII
+ else if (phy_chk(0x0141, 0x0dd0, 0xfff0 )) recov_phy_marvell2 (loop_phy);//88E1512 1G/100/10M RGMII
+ else if (phy_chk(0xff00, 0x1761, 0xffff )) recov_phy_marvell1 (loop_phy);//88E6176 1G/100/10M 2 RGMII Switch
+ else if (phy_chk(0x0141, 0x0e90, 0xfff0 )) recov_phy_marvell0 (loop_phy);//88E1310 1G/100/10M RGMII
+ else if (phy_chk(0x0141, 0x0cc0, PHYID3_Mask)) recov_phy_marvell (loop_phy);//88E1111 1G/100/10M GMII, MII, RGMII
+ else if (phy_chk(0x001c, 0xc914, 0xffff )) recov_phy_realtek1 (loop_phy);//RTL8211D 1G/100/10M GMII(RTL8211DN/RTL8211DG only), MII(RTL8211DN/RTL8211DG only), RGMII
+ else if (phy_chk(0x001c, 0xc915, 0xffff )) recov_phy_realtek2 (loop_phy);//RTL8211E 1G/100/10M GMII(RTL8211EG only), RGMII
+ else if (phy_chk(0x001c, 0xc912, 0xffff )) recov_phy_realtek3 (loop_phy);//RTL8211C 1G/100/10M RGMII
+ else if (phy_chk(0x0007, 0x0421, 0xfff0 )) recov_phy_vitesse (loop_phy);//VSC8601 1G/100/10M RGMII
+}
+
+//------------------------------------------------------------
+void init_phy (int loop_phy) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("init_phy\n");
+ Debug_delay();
+ #endif
+
+ sprintf( PHYID, "PHY%d", SelectMAC + 1 );
+
+ if ( DbgPrn_PHYInit )
+ phy_dump( PHYID );
+
+ if ( find_phyadr() == TRUE )
+ phy_sel( loop_phy );
+
+ if ( DbgPrn_PHYInit )
+ phy_dump( PHYID );
+}
+
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/PLLTESTU.H b/arch/arm/cpu/arm926ejs/aspeed/PLLTESTU.H
new file mode 100644
index 0000000..6fa96e6
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/PLLTESTU.H
@@ -0,0 +1,50 @@
+/*
+ * 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
+ */
+#ifndef PLLTESTU_H
+#define PLLTESTU_H
+
+//PLL Mode Definition
+#define NAND_PLLMODE 0x00
+#define DELAY_PLLMODE 0x04
+#define PCI_PLLMODE 0x08
+#define DPLL_PLLMODE 0x2c
+#define MPLL_PLLMODE 0x10
+#define HPLL_PLLMODE 0x14
+#define LPC_PLLMODE 0x18
+#define VIDEOA_PLLMODE 0x1c
+#define D2PLL_PLLMODE 0x0c
+#define VIDEOB_PLLMODE 0x3c
+
+#define PCI_PLLMODE_AST1160 0x10
+#define MPLL_PLLMODE_AST1160 0x14
+#define HPLL_PLLMODE_AST1160 0x14
+#define DPLL_PLLMODE_AST1160 0x1c
+
+#define PCI_PLLMODE_AST2300 0x2c
+#define MPLL_PLLMODE_AST2300 0x10
+#define HPLL_PLLMODE_AST2300 0x30
+#define DPLL_PLLMODE_AST2300 0x08
+#define DEL0_PLLMODE_AST2300 0x00
+
+#define ERR_FATAL 0x00000001
+
+typedef struct _VGAINFO {
+ USHORT usDeviceID;
+ UCHAR jRevision;
+
+ ULONG ulMCLK;
+ ULONG ulDRAMBusWidth;
+
+ ULONG ulCPUCLK;
+ ULONG ulAHBCLK;
+} _VGAInfo;
+
+#endif // End PLLTESTU_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/PLLTESTU.c b/arch/arm/cpu/arm926ejs/aspeed/PLLTESTU.c
new file mode 100644
index 0000000..95958b0
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/PLLTESTU.c
@@ -0,0 +1,411 @@
+/*
+ * 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
+ */
+#define PLLTEST_C
+static const char ThisFile[] = "PLLTEST.c";
+
+#include "SWFUNC.H"
+
+#include <COMMINF.H>
+#include <STDUBOOT.H>
+#include <TYPEDEF.H>
+#include <IO.H>
+#include <PLLTESTU.H>
+
+/*
+ * static
+ */
+static UCHAR jVersion[] = "v.0.57.00";
+
+void print_usage( void )
+{
+ printf(" PLLTest [pll mode] [err rate]\n");
+ printf(" [pll mode] h-pll: ARM CPU Clock PLL\n");
+ printf(" m-pll: Memory Clock PLL\n");
+ printf(" [err rate] Error Rate: unit %\n");
+ printf(" default is 1%\n");
+}
+
+BOOL CompareToRing(_VGAInfo *VGAInfo, ULONG ulPLLMode, ULONG ulDCLK, ULONG ulErrRate)
+{
+ ULONG ulCounter, ulLowLimit, ulHighLimit;
+ ULONG ulData, ulValue, ulDiv;
+ ULONG ulSCUBase;
+ double del0;
+ ULONG uldel0;
+
+ if ((VGAInfo->usDeviceID == 0x1160) || (VGAInfo->usDeviceID == 0x1180))
+ ulSCUBase = 0x80fc8200;
+ else
+ ulSCUBase = 0x1e6e2000;
+
+ //Fixed AST2300 H-PLL can't Get Correct Value in VGA only mode, ycchen@081711
+ if ( (VGAInfo->jRevision >= 0x20) && (ulPLLMode == HPLL_PLLMODE_AST2300) )
+ {
+ WriteSOC_DD(ulSCUBase, 0x1688a8a8);
+ ulData = ReadSOC_DD(ulSCUBase + 0x08);
+ WriteSOC_DD(ulSCUBase + 0x08, ulData & 0xFFFFFF00);
+ }
+
+ ulCounter = (ulDCLK/1000) * 512 / 24000 - 1;
+ ulLowLimit = ulCounter * (100 - ulErrRate) / 100;
+ ulHighLimit = ulCounter * (100 + ulErrRate) / 100;
+
+ DELAY(10);
+ WriteSOC_DD(ulSCUBase, 0x1688a8a8);
+ WriteSOC_DD(ulSCUBase + 0x28, (ulHighLimit << 16) | ulLowLimit);
+ WriteSOC_DD(ulSCUBase + 0x10, ulPLLMode);
+ WriteSOC_DD(ulSCUBase + 0x10, ulPLLMode | 0x03);
+ DELAY(1);
+ do {
+ ulData = ReadSOC_DD(ulSCUBase + 0x10);
+ } while (!(ulData & 0x40));
+ ulValue = ReadSOC_DD(ulSCUBase + 0x14);
+
+ //Patch for AST1160/1180 DCLK calculate
+ if ( ((VGAInfo->usDeviceID == 0x1160) || (VGAInfo->usDeviceID == 0x1180)) && (ulPLLMode == DPLL_PLLMODE_AST1160) )
+ {
+ ulData = ReadSOC_DD(0x80fc906c);
+ ulDiv = ulData & 0x000c0000;
+ ulDiv >>= 18;
+ ulDiv++;
+ ulValue /= ulDiv;
+ }
+
+ if ( (VGAInfo->jRevision >= 0x20) && (ulPLLMode == DEL0_PLLMODE_AST2300) )
+ {
+ del0 = (double)(24.0 * (ulValue + 1) / 512.0);
+ del0 = 1000/del0/16/8;
+ uldel0 = (ULONG) (del0 * 1000000);
+ if (uldel0 < ulDCLK)
+ {
+ printf( "[PASS][DEL0] Actual DEL0:%f ns, Max. DEL0:%f ns \n", del0, (double)ulDCLK/1000000);
+ ulData |= 0x80;
+ }
+ else
+ {
+ printf( "[ERROR][DEL0] Actual DEL0:%f ns, Max. DEL0:%f ns \n", del0, (double)ulDCLK/1000000);
+ ulData == 0x00;
+ }
+ }
+ else
+ {
+ printf( "[INFO] PLL Predict Count = %x, Actual Count = %x \n", ulCounter, ulValue);
+ }
+
+ WriteSOC_DD(ulSCUBase + 0x10, 0x2C); //disable ring
+
+ if (ulData & 0x80)
+ return (TRUE);
+ else
+ return(FALSE);
+} /* CompareToRing */
+
+VOID GetDRAMInfo(_VGAInfo *VGAInfo)
+{
+ ULONG ulData, ulData2;
+ ULONG ulRefPLL, ulDeNumerator, ulNumerator, ulDivider, ulOD;
+
+ if (VGAInfo->jRevision >= 0x10)
+ {
+ WriteSOC_DD(0x1e6e2000, 0x1688A8A8);
+
+ //Get DRAM Bus Width
+ ulData = ReadSOC_DD(0x1e6e0004);
+ if (ulData & 0x40)
+ VGAInfo->ulDRAMBusWidth = 16;
+ else
+ VGAInfo->ulDRAMBusWidth = 32;
+
+ ulRefPLL = 24000;
+ if (VGAInfo->jRevision >= 0x30) //AST2400
+ {
+ ulData = ReadSOC_DD(0x1e6e2070);
+ if (ulData & 0x00800000) //D[23] = 1
+ ulRefPLL = 25000;
+ }
+
+ ulData = ReadSOC_DD(0x1e6e2020);
+ ulDeNumerator = ulData & 0x0F;
+ ulNumerator = (ulData & 0x07E0) >> 5;
+ ulOD = (ulData & 0x10) ? 1:2;
+
+ ulData = (ulData & 0x7000) >> 12;
+ switch (ulData)
+ {
+ case 0x07:
+ ulDivider = 16;
+ break;
+ case 0x06:
+ ulDivider = 8;
+ break;
+ case 0x05:
+ ulDivider = 4;
+ break;
+ case 0x04:
+ ulDivider = 2;
+ break;
+ default:
+ ulDivider = 0x01;
+ }
+
+ VGAInfo->ulMCLK = ulRefPLL * ulOD * (ulNumerator + 2) / ((ulDeNumerator + 1) * ulDivider * 1000);
+ }
+} // GetDRAMInfo
+
+VOID GetCLKInfo( _VGAInfo *VGAInfo)
+{
+ ULONG ulData, ulCPUTrap, ulAHBTrap;
+ ULONG ulRefPLL, ulDeNumerator, ulNumerator, ulDivider, ulOD;
+
+ if (VGAInfo->jRevision >= 0x30)
+ {
+ WriteSOC_DD(0x1e6e2000, 0x1688a8a8);
+ ulData = ReadSOC_DD(0x1e6e2024);
+ if (ulData & 0x40000) //from H-PLL
+ {
+ ulRefPLL = 24000;
+ ulData = ReadSOC_DD(0x1e6e2070);
+ if (ulData & 0x00800000) //D[23] = 1
+ ulRefPLL = 25000;
+
+ ulData = ReadSOC_DD(0x1e6e2024);
+
+ ulDeNumerator = ulData & 0x0F;
+ ulNumerator = (ulData & 0x07E0) >> 5;
+ ulOD = (ulData & 0x10) ? 1:2;
+
+ VGAInfo->ulCPUCLK = ulRefPLL * ulOD * (ulNumerator + 2) / ((ulDeNumerator + 1) * 1000);
+
+ }
+ else //from trapping
+ {
+ ulRefPLL = 24;
+ ulData = ReadSOC_DD(0x1e6e2070);
+ if (ulData & 0x00800000) //D[23] = 1
+ ulRefPLL = 25;
+
+ ulCPUTrap = ulData & 0x0300;
+ ulCPUTrap >>= 8;
+
+ switch (ulCPUTrap)
+ {
+ case 0x00:
+ VGAInfo->ulCPUCLK = ulRefPLL * 16;
+ break;
+ case 0x01:
+ VGAInfo->ulCPUCLK = ulRefPLL * 15;
+ break;
+ case 0x02:
+ VGAInfo->ulCPUCLK = ulRefPLL * 14;
+ break;
+ case 0x03:
+ VGAInfo->ulCPUCLK = ulRefPLL * 17;
+ break;
+ }
+
+ }
+
+ ulData = ReadSOC_DD(0x1e6e2070);
+ ulAHBTrap = ulData & 0x0c00;
+ ulAHBTrap >>= 10;
+ switch (ulAHBTrap)
+ {
+ case 0x00:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK;
+ break;
+ case 0x01:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK / 2;
+ break;
+ case 0x02:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK / 4;
+ break;
+ case 0x03:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK / 3;
+ break;
+ }
+
+ } //AST2400
+ else if (VGAInfo->jRevision >= 0x20)
+ {
+ WriteSOC_DD(0x1e6e2000, 0x1688a8a8);
+ ulData = ReadSOC_DD(0x1e6e2024);
+ if (ulData & 0x40000) //from H-PLL
+ {
+ ulRefPLL = 24000;
+
+ ulData = ReadSOC_DD(0x1e6e2024);
+
+ ulDeNumerator = ulData & 0x0F;
+ ulNumerator = (ulData & 0x07E0) >> 5;
+ ulOD = (ulData & 0x10) ? 1:2;
+
+ VGAInfo->ulCPUCLK = ulRefPLL * ulOD * (ulNumerator + 2) / ((ulDeNumerator + 1) * 1000);
+
+ }
+ else //from trapping
+ {
+ ulData = ReadSOC_DD(0x1e6e2070);
+ ulCPUTrap = ulData & 0x0300;
+ ulCPUTrap >>= 8;
+
+ switch (ulCPUTrap)
+ {
+ case 0x00:
+ VGAInfo->ulCPUCLK = 384;
+ break;
+ case 0x01:
+ VGAInfo->ulCPUCLK = 360;
+ break;
+ case 0x02:
+ VGAInfo->ulCPUCLK = 336;
+ break;
+ case 0x03:
+ VGAInfo->ulCPUCLK = 408;
+ break;
+ }
+
+ }
+
+ ulData = ReadSOC_DD(0x1e6e2070);
+ ulAHBTrap = ulData & 0x0c00;
+ ulAHBTrap >>= 10;
+ switch (ulAHBTrap)
+ {
+ case 0x00:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK;
+ break;
+ case 0x01:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK / 2;
+ break;
+ case 0x02:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK / 4;
+ break;
+ case 0x03:
+ VGAInfo->ulAHBCLK = VGAInfo->ulCPUCLK / 3;
+ break;
+ }
+
+ } //AST2300
+} // GetCLKInfo
+
+int pll_function(int argc, char *argv[])
+{
+ _VGAInfo *pVGAInfo;
+ ULONG ulErrRate = 1;
+ ULONG PLLMode;
+ ULONG RefClk;
+ CHAR *stop_at;
+ CHAR i;
+
+ printf("**************************************************** \n");
+ printf("*** ASPEED Graphics PLL Test %s Log *** \n", jVersion);
+ printf("*** for u-boot *** \n");
+ printf("**************************************************** \n");
+ printf("\n");
+
+ // Check chip type
+ switch ( ReadSOC_DD( 0x1e6e2000 + 0x7c ) ) {
+ case 0x02010303 :
+ case 0x02000303 :
+ printf("The chip is AST2400\n" );
+ pVGAInfo->usDeviceID = 0x2400;
+ pVGAInfo->jRevision = 0x30;
+ break;
+
+ case 0x02010103 :
+ case 0x02000003 :
+ printf("The chip is AST1400\n" );
+ pVGAInfo->usDeviceID = 0x1400;
+ pVGAInfo->jRevision = 0x30;
+ break;
+
+ case 0x01010303 :
+ case 0x01000003 :
+ printf("The chip is AST2300\n" );
+ pVGAInfo->usDeviceID = 0x2300;
+ pVGAInfo->jRevision = 0x20;
+ break;
+
+ case 0x01010203 :
+ printf("The chip is AST1050\n" );
+ pVGAInfo->usDeviceID = 0x1050;
+ pVGAInfo->jRevision = 0x20;
+ break;
+
+ default :
+ printf ("Error Silicon Revision ID(SCU7C) %08lx!!!\n", ReadSOC_DD( 0x1e6e2000 + 0x7c ) );
+ return(1);
+ }
+
+
+ GetDRAMInfo( pVGAInfo );
+ GetCLKInfo( pVGAInfo );
+
+ if ( ( argc <= 1 ) || ( argc >= 4 ) ){
+ print_usage();
+ return (ERR_FATAL);
+ }
+ else {
+ for ( i = 1; i < argc; i++ ) {
+ switch ( i ) {
+ case 1:
+ if (!strcmp(argv[i], "m-pll"))
+ {
+ if (pVGAInfo->jRevision >= 0x20)
+ PLLMode = MPLL_PLLMODE_AST2300;
+ else
+ PLLMode = MPLL_PLLMODE;
+
+ RefClk = pVGAInfo->ulMCLK * 1000000;
+ if (pVGAInfo->jRevision >= 0x20) //dual-edge
+ RefClk /= 2;
+ }
+ else if (!strcmp(argv[i], "h-pll"))
+ {
+ if (pVGAInfo->jRevision >= 0x20)
+ PLLMode = HPLL_PLLMODE_AST2300;
+ else
+ PLLMode = HPLL_PLLMODE;
+
+ //AST2300 only has HCLK ring test mode, ycchen@040512
+ RefClk = pVGAInfo->ulCPUCLK * 1000000; //Other : H-PLL
+ if (pVGAInfo->jRevision >= 0x20) //AST2300: HCLK
+ RefClk = pVGAInfo->ulAHBCLK * 1000000;
+ }
+ else {
+ print_usage();
+ return (ERR_FATAL);
+ }
+ break;
+ case 2:
+ ulErrRate = (ULONG) strtoul(argv[i], &stop_at, 10);
+
+ break;
+ default:
+ break;
+ } // End switch()
+ } // End for
+ }
+
+ /* Compare ring */
+ if (CompareToRing(pVGAInfo, PLLMode, RefClk, ulErrRate ) == TRUE)
+ {
+ printf("[PASS] %s PLL Check Pass!! \n", argv[1]);
+ return 0;
+ }
+ else
+ {
+ printf("[ERROR] %s PLL Check Failed!! \n", argv[1]);
+ return (ERR_FATAL);
+ }
+}
+
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/SPIM.c b/arch/arm/cpu/arm926ejs/aspeed/SPIM.c
new file mode 100644
index 0000000..e1bdd07
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/SPIM.c
@@ -0,0 +1,63 @@
+/*
+ * 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
+ */
+#define SPIM_C
+static const char ThisFile[] = "SPIM.c";
+
+#include "SWFUNC.H"
+
+#ifdef SPI_BUS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <conio.h>
+#include <string.h>
+#include "TYPEDEF.H"
+#include "LIB_SPI.H"
+
+#define SPIM_CMD_WHA 0x01
+#define SPIM_CMD_RD 0x0B
+#define SPIM_CMD_DRD 0xBB
+#define SPIM_CMD_WR 0x02
+#define SPIM_CMD_DWR 0xD2
+#define SPIM_CMD_STA 0x05
+#define SPIM_CMD_ENBYTE 0x06
+#define SPIM_CMD_DISBYTE 0x04
+
+ULONG spim_cs;
+ULONG spim_base;
+ULONG spim_hadr;
+
+void spim_end()
+{
+ ULONG data;
+
+ data = MIndwm((ULONG)mmiobase, 0x1E620010 + (spim_cs << 2));
+ MOutdwm( (ULONG)mmiobase, 0x1E620010 + (spim_cs << 2), data | 0x4);
+ MOutdwm( (ULONG)mmiobase, 0x1E620010 + (spim_cs << 2), data);
+}
+
+//------------------------------------------------------------
+void spim_init(int cs)
+{
+ ULONG data;
+
+ spim_cs = cs;
+ MOutdwm( (ULONG)mmiobase, 0x1E620000, (0x2 << (cs << 1)) | (0x10000 << cs));
+ MOutdwm( (ULONG)mmiobase, 0x1E620010 + (cs << 2), 0x00000007);
+ MOutdwm( (ULONG)mmiobase, 0x1E620010 + (cs << 2), 0x00002003);
+ MOutdwm( (ULONG)mmiobase, 0x1E620004, 0x100 << cs);
+ data = MIndwm((ULONG)mmiobase, 0x1E620030 + (cs << 2));
+ spim_base = 0x20000000 | ((data & 0x007f0000) << 7);
+ MOutwm ( (ULONG)mmiobase, spim_base, SPIM_CMD_WHA);
+ spim_end();
+ spim_hadr = 0;
+}
+#endif // End SPI_BUS
diff --git a/arch/arm/cpu/arm926ejs/aspeed/STDUBOOT.H b/arch/arm/cpu/arm926ejs/aspeed/STDUBOOT.H
new file mode 100644
index 0000000..7fbf590
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/STDUBOOT.H
@@ -0,0 +1,18 @@
+/*
+ * 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
+ */
+#ifndef STDUBOOT_H
+#define STDUBOOT_H
+
+unsigned long int strtoul(char *string, char **endPtr, int base);
+int atoi( char s[] );
+int rand(void);
+
+#endif // End STDUBOOT_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/STDUBOOT.c b/arch/arm/cpu/arm926ejs/aspeed/STDUBOOT.c
new file mode 100644
index 0000000..90e2997
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/STDUBOOT.c
@@ -0,0 +1,235 @@
+/*
+ * 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
+ */
+#define STDUBOOT_C
+static const char ThisFile[] = "STDUBOOT.c";
+
+#include "SWFUNC.H"
+
+#ifdef SLT_UBOOT
+
+int isspace ( char c )
+{
+ if ( ( c == ' ' ) || ( c == 9 ) || ( c == 13 ) )
+ return 1;
+
+ return 0;
+}
+
+/*
+ * strtoul.c --
+ *
+ * Source code for the "strtoul" library procedure.
+ *
+ * Copyright 1988 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies. The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without
+ * express or implied warranty.
+ */
+
+//#include <ctype.h>
+
+/*
+ * The table below is used to convert from ASCII digits to a
+ * numerical equivalent. It maps from '0' through 'z' to integers
+ * (100 for non-digit characters).
+ */
+
+static char cvtIn[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* '0' - '9' */
+ 100, 100, 100, 100, 100, 100, 100, /* punctuation */
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'A' - 'Z' */
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35,
+ 100, 100, 100, 100, 100, 100, /* punctuation */
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, /* 'a' - 'z' */
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35};
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * strtoul --
+ *
+ * Convert an ASCII string into an integer.
+ *
+ * Results:
+ * The return value is the integer equivalent of string. If endPtr
+ * is non-NULL, then *endPtr is filled in with the character
+ * after the last one that was part of the integer. If string
+ * doesn't contain a valid integer value, then zero is returned
+ * and *endPtr is set to string.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+unsigned long int
+strtoul(char *string, char **endPtr, int base)
+ /* string; String of ASCII digits, possibly
+ * preceded by white space. For bases
+ * greater than 10, either lower- or
+ * upper-case digits may be used.
+ */
+ /* **endPtr; Where to store address of terminating
+ * character, or NULL. */
+ /* base; Base for conversion. Must be less
+ * than 37. If 0, then the base is chosen
+ * from the leading characters of string:
+ * "0x" means hex, "0" means octal, anything
+ * else means decimal.
+ */
+{
+ register char *p;
+ register unsigned long int result = 0;
+ register unsigned digit;
+ int anyDigits = 0;
+
+ /*
+ * Skip any leading blanks.
+ */
+
+ p = string;
+ while (isspace(*p)) {
+ p += 1;
+ }
+
+ /*
+ * If no base was provided, pick one from the leading characters
+ * of the string.
+ */
+
+ if (base == 0)
+ {
+ if (*p == '0') {
+ p += 1;
+ if (*p == 'x') {
+ p += 1;
+ base = 16;
+ } else {
+
+ /*
+ * Must set anyDigits here, otherwise "0" produces a
+ * "no digits" error.
+ */
+
+ anyDigits = 1;
+ base = 8;
+ }
+ }
+ else base = 10;
+ } else if (base == 16) {
+
+ /*
+ * Skip a leading "0x" from hex numbers.
+ */
+
+ if ((p[0] == '0') && (p[1] == 'x')) {
+ p += 2;
+ }
+ }
+
+ /*
+ * Sorry this code is so messy, but speed seems important. Do
+ * different things for base 8, 10, 16, and other.
+ */
+
+ if (base == 8) {
+ for ( ; ; p += 1) {
+ digit = *p - '0';
+ if (digit > 7) {
+ break;
+ }
+ result = (result << 3) + digit;
+ anyDigits = 1;
+ }
+ } else if (base == 10) {
+ for ( ; ; p += 1) {
+ digit = *p - '0';
+ if (digit > 9) {
+ break;
+ }
+ result = (10*result) + digit;
+ anyDigits = 1;
+ }
+ } else if (base == 16) {
+ for ( ; ; p += 1) {
+ digit = *p - '0';
+ if (digit > ('z' - '0')) {
+ break;
+ }
+ digit = cvtIn[digit];
+ if (digit > 15) {
+ break;
+ }
+ result = (result << 4) + digit;
+ anyDigits = 1;
+ }
+ } else {
+ for ( ; ; p += 1) {
+ digit = *p - '0';
+ if (digit > ('z' - '0')) {
+ break;
+ }
+ digit = cvtIn[digit];
+ if (digit >= base) {
+ break;
+ }
+ result = result*base + digit;
+ anyDigits = 1;
+ }
+ }
+
+ /*
+ * See if there were any digits at all.
+ */
+
+ if (!anyDigits) {
+ p = string;
+ }
+
+ if (endPtr != 0) {
+ *endPtr = p;
+ }
+
+ return result;
+}
+
+// -----------------------------------------------------------------------------
+int atoi( char s[] )
+{
+
+ int i;
+ int ans = 0;
+
+ for( i = 0; s[i] >= '0' && s[i] <= '9'; ++i )
+ ans = ( 10 * ans ) + ( s[i] - '0' );
+
+ return ans;
+}
+
+// -----------------------------------------------------------------------------
+/* rand:return pseudo-random integer on 0...32767 */
+int rand(void)
+{
+ static unsigned long int next = 1;
+
+ next = next * 1103515245 + 12345;
+
+ return (unsigned int) ( next / 65536 ) % 32768;
+}
+
+#endif // End SLT_UBOOT
diff --git a/arch/arm/cpu/arm926ejs/aspeed/STRESS.c b/arch/arm/cpu/arm926ejs/aspeed/STRESS.c
new file mode 100644
index 0000000..dffd64f
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/STRESS.c
@@ -0,0 +1,145 @@
+/*
+ * 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
+ */
+#define STRESS_C
+static const char ThisFile[] = "STRESS.c";
+
+#include "SWFUNC.H"
+#include <COMMINF.H>
+#include <IO.H>
+
+#define TIMEOUT_DRAM 5000000
+
+/* ------------------------------------------------------------------------- */
+int MMCTestBurst(unsigned int datagen)
+{
+ unsigned int data;
+ unsigned int timeout = 0;
+
+ WriteSOC_DD( 0x1E6E0070, 0x00000000 );
+ WriteSOC_DD( 0x1E6E0070, (0x000000C1 | (datagen << 3)) );
+
+ do {
+ data = ReadSOC_DD( 0x1E6E0070 ) & 0x3000;
+
+ if( data & 0x2000 )
+ return(0);
+
+ if( ++timeout > TIMEOUT_DRAM ) {
+ printf("Timeout!!\n");
+ WriteSOC_DD( 0x1E6E0070, 0x00000000 );
+
+ return(0);
+ }
+ } while( !data );
+ WriteSOC_DD( 0x1E6E0070, 0x00000000 );
+
+ return(1);
+}
+
+/* ------------------------------------------------------------------------- */
+int MMCTestSingle(unsigned int datagen)
+{
+ unsigned int data;
+ unsigned int timeout = 0;
+
+ WriteSOC_DD( 0x1E6E0070, 0x00000000 );
+ WriteSOC_DD( 0x1E6E0070, (0x00000085 | (datagen << 3)) );
+
+ do {
+ data = ReadSOC_DD( 0x1E6E0070 ) & 0x3000;
+
+ if( data & 0x2000 )
+ return(0);
+
+ if( ++timeout > TIMEOUT_DRAM ){
+ printf("Timeout!!\n");
+ WriteSOC_DD( 0x1E6E0070, 0x00000000 );
+
+ return(0);
+ }
+ } while ( !data );
+ WriteSOC_DD( 0x1E6E0070, 0x00000000 );
+
+ return(1);
+}
+
+/* ------------------------------------------------------------------------- */
+int MMCTest()
+{
+ unsigned int pattern;
+
+ pattern = ReadSOC_DD( 0x1E6E2078 );
+ printf("Pattern = %08X : ",pattern);
+
+ WriteSOC_DD(0x1E6E0074, (DRAM_MapAdr | 0x7fffff) );
+ WriteSOC_DD(0x1E6E007C, pattern );
+
+ if(!MMCTestBurst(0)) return(0);
+ if(!MMCTestBurst(1)) return(0);
+ if(!MMCTestBurst(2)) return(0);
+ if(!MMCTestBurst(3)) return(0);
+ if(!MMCTestBurst(4)) return(0);
+ if(!MMCTestBurst(5)) return(0);
+ if(!MMCTestBurst(6)) return(0);
+ if(!MMCTestBurst(7)) return(0);
+ if(!MMCTestSingle(0)) return(0);
+ if(!MMCTestSingle(1)) return(0);
+ if(!MMCTestSingle(2)) return(0);
+ if(!MMCTestSingle(3)) return(0);
+ if(!MMCTestSingle(4)) return(0);
+ if(!MMCTestSingle(5)) return(0);
+ if(!MMCTestSingle(6)) return(0);
+ if(!MMCTestSingle(7)) return(0);
+
+ return(1);
+}
+
+/* ------------------------------------------------------------------------- */
+int dram_stress_function(int argc, char *argv[])
+{
+ unsigned int Pass;
+ unsigned int PassCnt = 0;
+ unsigned int Testcounter = 0;
+ int ret = 1;
+ char *stop_at;
+
+ printf("**************************************************** \n");
+ printf("*** ASPEED Stress DRAM *** \n");
+ printf("*** 20131107 for u-boot *** \n");
+ printf("**************************************************** \n");
+ printf("\n");
+
+ if ( argc != 2 ){
+ ret = 0;
+ return ( ret );
+ }
+ else {
+ Testcounter = (unsigned int) strtoul(argv[1], &stop_at, 10);
+ }
+
+ WriteSOC_DD(0x1E6E0000, 0xFC600309);
+
+ while( ( Testcounter > PassCnt ) || ( Testcounter == 0 ) ){
+ if( !MMCTest() ) {
+ printf("FAIL...%d/%d\n", PassCnt, Testcounter);
+ ret = 0;
+
+ break;
+ }
+ else {
+ PassCnt++;
+ printf("Pass %d/%d\n", PassCnt, Testcounter);
+ }
+ } // End while()
+
+ return( ret );
+}
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/SWFUNC.H b/arch/arm/cpu/arm926ejs/aspeed/SWFUNC.H
new file mode 100644
index 0000000..0a03654
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/SWFUNC.H
@@ -0,0 +1,137 @@
+/*
+ * 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
+ */
+#ifndef SWFUNC_H
+#define SWFUNC_H
+
+
+//---------------------------------------------------------
+// Program information
+//---------------------------------------------------------
+#define VER_NAME "Ver 0.34 version @2014/03/25 0932"
+
+/* == Step 1: ====== Support OS system =================== */
+// LinuxAP
+// #define Windows
+#define SLT_UBOOT
+//#define SLT_DOS
+
+/* == Step 2:======== Support interface ================== */
+/* Choose One */
+//#define SPI_BUS
+//#define USE_LPC
+//#define USE_P2A // PCI or PCIe bus to AHB bus
+
+/* == Step 3:========== Support Chip ================== */
+//#define AST1010_CHIP
+//#define AST3200_IOMAP
+//#define FPGA
+
+#ifdef AST1010_CHIP
+ #ifdef SLT_UBOOT
+ #define AST1010_IOMAP 1
+ #endif
+ #ifdef SLT_DOS
+ #define AST1010_IOMAP 2
+
+ // AST1010 only has LPC interface
+ #undef USE_P2A
+ #undef SPI_BUS
+ #define USE_LPC
+ #endif
+#endif
+
+/* == Step 4:========== Select PHY ================== */
+//#define SUPPORT_PHY_LAN9303 // Initial PHY via I2C bus
+#define LAN9303_I2C_BUSNUM 6 // 1-based
+#define LAN9303_I2C_ADR 0x14
+
+/* ====================== Program ======================== */
+// The "PHY_NCSI" option is only for DOS compiler
+#if defined (PHY_NCSI)
+ #ifdef SLT_UBOOT
+ #error Wrong setting......
+ #endif
+#endif
+
+#if defined (PHY_NCSI)
+ #ifdef SUPPORT_PHY_LAN9303
+ #error Wrong setting (Can't support LAN9303)......
+ #endif
+#endif
+
+/* ================= Check setting ===================== */
+#ifdef SLT_UBOOT
+ #ifdef SLT_DOS
+ #error Can NOT support two OS
+ #endif
+#endif
+#ifdef SLT_DOS
+ #ifdef SLT_UBOOT
+ #error Can NOT support two OS
+ #endif
+#endif
+
+#ifdef USE_P2A
+ #ifdef SLT_UBOOT
+ #error Can NOT be set PCI bus in Uboot
+ #endif
+#endif
+#ifdef USE_LPC
+ #ifdef SLT_UBOOT
+ #error Can NOT be set LPC bus in Uboot
+ #endif
+#endif
+#ifdef SPI_BUS
+ #ifdef SLT_UBOOT
+ #error Can NOT be set SPI bus in Uboot
+ #endif
+#endif
+
+/* ======================== Program flow control ======================== */
+#define RUN_STEP 5
+// 0: read_scu
+// 1: parameter setup
+// 2: init_scu1,
+// 3: init_scu_macrst
+// 4: Data Initial
+// 5: ALL
+
+/* ====================== Switch print debug message ====================== */
+#define DbgPrn_Enable_Debug_delay 0
+//#define DbgPrn_FuncHeader 0 //1
+#define DbgPrn_ErrFlg 0
+#define DbgPrn_BufAdr 0 //1
+#define DbgPrn_Bufdat 0
+#define DbgPrn_BufdatDetail 0
+#define DbgPrn_PHYRW 0
+#define DbgPrn_PHYInit 0
+#define DbgPrn_PHYName 0
+#define DbgPrn_DumpMACCnt 0
+#define DbgPrn_Info 0 //1
+#define DbgPrn_FRAME_LEN 0
+
+
+/* ============ Enable or Disable Check item of the descriptor ============ */
+#define CheckRxOwn
+#define CheckRxErr
+//#define CheckOddNibble
+#define CheckCRC
+#define CheckRxFIFOFull
+#define CheckRxLen
+//#define CheckDataEveryTime
+
+//#define CheckRxbufUNAVA
+#define CheckRPktLost
+//#define CheckNPTxbufUNAVA
+#define CheckTPktLost
+#define CheckRxBuf
+
+#endif // SWFUNC_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/TRAPTEST.c b/arch/arm/cpu/arm926ejs/aspeed/TRAPTEST.c
new file mode 100644
index 0000000..72936c0
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/TRAPTEST.c
@@ -0,0 +1,151 @@
+/*
+ * 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
+ */
+#define PLLTEST_C
+static const char ThisFile[] = "PLLTEST.c";
+
+#include "SWFUNC.H"
+
+#include <COMMINF.H>
+#include <TYPEDEF.H>
+#include <IO.H>
+
+#define ASTCHIP_2400 0
+#define ASTCHIP_2300 1
+#define ASTCHIP_1400 2
+#define ASTCHIP_1300 3
+#define ASTCHIP_1050 4
+
+const UCHAR jVersion[] = "v.0.60.06";
+
+typedef struct _TRAPINFO {
+ USHORT CPU_clk;
+ UCHAR CPU_AHB_ratio;
+} _TrapInfo;
+
+const _TrapInfo AST_default_trap_setting[] = {
+ // CPU_clk, CPU_AHB_ratio
+ { 384, 2 }, // AST2400 or AST1250 ( ASTCHIP_2400 )
+ { 384, 2 }, // AST2300 ( ASTCHIP_2300 )
+ { 384, 0xFF }, // AST1400 ( ASTCHIP_1400 )
+ { 384, 0xFF }, // AST1300 ( ASTCHIP_1300 )
+ { 384, 2 } // AST1050 ( ASTCHIP_1050 )
+};
+
+int trap_function(int argc, char *argv[])
+{
+ UCHAR chiptype;
+ ULONG ulData, ulTemp;
+ UCHAR status = TRUE;
+ USHORT val_trap;
+
+ printf("**************************************************** \n");
+ printf("*** ASPEED Trap Test %s Log *** \n", jVersion);
+ printf("*** for u-boot *** \n");
+ printf("**************************************************** \n");
+ printf("\n");
+
+ // Check chip type
+ switch ( ReadSOC_DD( 0x1e6e2000 + 0x7c ) ) {
+ case 0x02010303 :
+ case 0x02000303 :
+ printf("The chip is AST2400 or AST1250\n" );
+ chiptype = ASTCHIP_2400;
+ break;
+
+ case 0x02010103 :
+ case 0x02000003 :
+ printf("The chip is AST1400\n" );
+ chiptype = ASTCHIP_1400;
+ break;
+
+ case 0x01010303 :
+ case 0x01000003 :
+ printf("The chip is AST2300\n" );
+ chiptype = ASTCHIP_2300;
+ break;
+
+ case 0x01010203 :
+ printf("The chip is AST1050\n" );
+ chiptype = ASTCHIP_1050;
+ break;
+
+ case 0x01010003 :
+ printf("The chip is AST1300\n" );
+ chiptype = ASTCHIP_1300;
+ break;
+
+ default :
+ printf ("Error Silicon Revision ID(SCU7C) %08lx!!!\n", ReadSOC_DD( 0x1e6e2000 + 0x7c ) );
+ return(1);
+ }
+
+ WriteSOC_DD(0x1e6e2000, 0x1688A8A8);
+ ulData = ReadSOC_DD(0x1e6e2070);
+
+ // Check CPU clock
+ ulTemp = ulData;
+ ulTemp &= 0x0300;
+ ulTemp >>= 8;
+
+ switch (ulTemp)
+ {
+ case 0x00:
+ val_trap = 384;
+ break;
+ case 0x01:
+ val_trap = 360;
+ break;
+ case 0x02:
+ val_trap = 336;
+ break;
+ case 0x03:
+ val_trap = 408;
+ break;
+ }
+
+ if (AST_default_trap_setting[chiptype].CPU_clk != val_trap)
+ {
+ printf("[ERROR] CPU CLK: Correct is %d; Real is %d \n", AST_default_trap_setting[chiptype].CPU_clk, val_trap);
+ status = FALSE;
+ }
+
+ // Check cpu_ahb_ratio
+ ulTemp = ulData;
+ ulTemp &= 0x0c00;
+ ulTemp >>= 10;
+
+ switch (ulTemp)
+ {
+ case 0x00:
+ val_trap = 1;
+ break;
+ case 0x01:
+ val_trap = 2;
+ break;
+ case 0x02:
+ val_trap = 4;
+ break;
+ case 0x03:
+ val_trap = 3;
+ break;
+ }
+
+ if (AST_default_trap_setting[chiptype].CPU_AHB_ratio != val_trap)
+ {
+ printf("[ERROR] CPU:AHB: Correct is %x:1; Real is %x:1 \n", AST_default_trap_setting[chiptype].CPU_AHB_ratio, val_trap);
+ status = FALSE;
+ }
+
+ if ( status == TRUE )
+ printf("[PASS] hardware trap for CPU clock and CPU\\AHB ratio.\n");
+
+ return status;
+}
diff --git a/arch/arm/cpu/arm926ejs/aspeed/TYPEDEF.H b/arch/arm/cpu/arm926ejs/aspeed/TYPEDEF.H
new file mode 100644
index 0000000..3053ad7
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/TYPEDEF.H
@@ -0,0 +1,74 @@
+/*
+ * 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
+ */
+#ifndef TYPEDEF_H
+#define TYPEDEF_H
+
+#include "SWFUNC.H"
+
+//
+// Define
+//
+#define PCI 1
+#define PCIE 2
+#define AGP 3
+#define ACTIVE 4
+
+#if defined(LinuxAP)
+ #ifndef FLONG
+ #define FLONG unsigned long
+ #endif
+ #ifndef ULONG
+ #define ULONG unsigned long
+ #endif
+ #ifndef LONG
+ #define LONG long
+ #endif
+ #ifndef USHORT
+ #define USHORT unsigned short
+ #endif
+ #ifndef SHORT
+ #define SHORT short
+ #endif
+ #ifndef UCHAR
+ #define UCHAR unsigned char
+ #endif
+ #ifndef CHAR
+ #define CHAR char
+ #endif
+ #ifndef BYTE
+ #define BYTE unsigned char
+ #endif
+ #ifndef VOID
+ #define VOID void
+ #endif
+ #ifndef SCHAR
+ #define SCHAR signed char
+ #endif
+#else
+/* DOS Program */
+ #define VOID void
+ #define FLONG unsigned long
+ #define ULONG unsigned long
+ #define USHORT unsigned short
+ #define UCHAR unsigned char
+ #define LONG long
+ #define SHORT short
+ #define CHAR char
+ #define BYTE UCHAR
+ #define BOOL SHORT
+ #define BOOLEAN unsigned short
+ #define PULONG ULONG *
+ #define SCHAR signed char
+#endif
+ #define TRUE 1
+ #define FALSE 0
+
+#endif // TYPEDEF_H
diff --git a/arch/arm/cpu/arm926ejs/aspeed/mactest.c b/arch/arm/cpu/arm926ejs/aspeed/mactest.c
new file mode 100644
index 0000000..95bd560
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/mactest.c
@@ -0,0 +1,1215 @@
+/*
+ * 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
+ */
+#define MACTEST_C
+static const char ThisFile[] = "MACTEST.c";
+
+#include "SWFUNC.H"
+
+#ifdef SLT_UBOOT
+ #include <common.h>
+ #include <command.h>
+ #include <post.h>
+ #include <malloc.h>
+ #include <net.h>
+ #include <COMMINF.H>
+ #include <STDUBOOT.H>
+ #include <IO.H>
+#else
+ #include <stdlib.h>
+ #include <string.h>
+ #include "LIB.H"
+ #include "COMMINF.H"
+ #include "IO.H"
+#endif
+
+const BYTE Val_Array[16] = {0,1, 2,3, 4,5, 6,7, 8,9, 10,11, 12,13, 14,15}; // AST2300-A1
+const BYTE Val_Array_A0[16] = {8,1, 10,3, 12,5, 14,7, 0,9, 2,11, 4,13, 6,15}; // AST2300-A0
+
+#ifdef SLT_UBOOT
+int main_function(int argc, char *argv[])
+#endif
+#ifdef SLT_DOS
+int main(int argc, char *argv[])
+#endif
+{
+ CHAR MAC2_Valid;
+ CHAR MAC_1GEn;
+ CHAR MAC1_RMII;
+ CHAR Enable_IntLoopPHY;
+ CHAR Disable_RecovPHY;
+ CHAR Force1G;
+ CHAR Force10M;
+ CHAR Force100M;
+ CHAR *stop_at;
+ ULONG IOStr_val;
+ ULONG IOStr_max;
+ ULONG IOStr_shf;
+ ULONG IOdly_val;
+ ULONG Err_Flag_allapeed;
+ int DES_LowNumber;
+ int index;
+ int i;
+ int j;
+ #ifdef Enable_NCSI_LOOP_INFINI
+ BYTE GSpeed_org[3];
+ #endif
+
+#ifdef SPI_BUS
+ VIDEO_ENGINE_INFO VideoEngineInfo;
+#else
+ // ( USE_P2A | USE_LPC )
+ UCHAR *ulMMIOLinearBaseAddress;
+#endif
+
+ #ifdef SLT_UBOOT
+ #else
+ time(&timestart);
+ #endif
+
+ // For DOS system
+ #if defined(PHY_NCSI)
+ // For DOS compiler OPEN WATCOM
+ ModeSwitch = MODE_NSCI;
+ #else
+ #ifdef SLT_DOS
+ ModeSwitch = MODE_DEDICATED;
+ #endif
+ #endif
+
+//------------------------------------------------------------
+// Argument Initial
+//------------------------------------------------------------
+ Err_Flag_allapeed = 0;
+ Err_Flag = 0;
+ Err_Flag_PrintEn = 1;
+ Loop_rl[0] = 0;
+ Loop_rl[1] = 0;
+ Loop_rl[2] = 0;
+
+//------------------------------------------------------------
+// Bus Initial
+//------------------------------------------------------------
+#if defined(LinuxAP)
+#else
+ //DOS system
+ #ifdef SPI_BUS
+ #endif
+ #ifdef USE_LPC
+
+ if ( findlpcport( 0x0d ) == 0) {
+ printf("Failed to find proper LPC port \n");
+
+ return(1);
+ }
+ open_aspeed_sio_password();
+ enable_aspeed_LDU( 0x0d );
+ #endif
+ #ifdef USE_P2A
+ // PCI bus
+ #ifdef DOS_PMODEW
+ if (CheckDOS()) return 1;
+ #endif
+
+ #ifdef DbgPrn_FuncHeader
+ printf ("Initial-MMIO\n");
+ Debug_delay();
+ #endif
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x2000, ACTIVE);
+ if ( ulPCIBaseAddress == 0 )
+ ulPCIBaseAddress = FindPCIDevice (0x1688, 0x2000, ACTIVE);
+ if ( ulPCIBaseAddress == 0 )
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x0200, ACTIVE);
+ if ( ulPCIBaseAddress == 0 )
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x3000, ACTIVE);
+ if ( ulPCIBaseAddress == 0 )
+ ulPCIBaseAddress = FindPCIDevice (0x1A03, 0x2010, ACTIVE);
+ if ( ulPCIBaseAddress == 0 ) {
+ printf ("Can't find device\n");
+
+ return(1);
+ }
+
+ WritePCIReg (ulPCIBaseAddress, 0x04, 0xFFFFFFFc, 0x3);
+ ulMMIOBaseAddress = ReadPCIReg (ulPCIBaseAddress, 0x14, 0xFFFF0000);
+ ulMMIOLinearBaseAddress = (UCHAR *)MapPhysicalToLinear (ulMMIOBaseAddress, 64 * 1024 * 1024);
+ #endif // #ifdef USE_P2A
+#endif // End defined(LinuxAP)
+
+#ifdef SPI_BUS
+ GetDevicePCIInfo (&VideoEngineInfo);
+ mmiobase = VideoEngineInfo.VGAPCIInfo.ulMMIOBaseAddress;
+ spim_init(SPI_CS);
+#else
+ // ( USE_P2A | USE_LPC )
+ mmiobase = ulMMIOLinearBaseAddress;
+#endif
+
+//------------------------------------------------------------
+// Check Chip Feature
+//------------------------------------------------------------
+ read_scu();
+
+ if (RUN_STEP >= 1) {
+ switch (SCU_7ch_old) {
+// case 0x02000003 : sprintf(ASTChipName, "[ ]AST3200-FPGA" ); ASTChipType = 6; AST1100 = 0; break;
+
+ case 0x03020003 : sprintf(ASTChipName, "[ ]AST1010-A2" ); ASTChipType = 5; AST1100 = 0; break;
+ case 0x03010003 : sprintf(ASTChipName, "[ ]AST1010-A1" ); ASTChipType = 5; AST1100 = 0; break;
+ case 0x03000003 : sprintf(ASTChipName, "[*]AST1010-A0" ); ASTChipType = 5; AST1100 = 0; break;
+
+ case 0x02010303 : sprintf(ASTChipName, "[*]AST2400-A1" ); ASTChipType = 4; AST1100 = 0; break;//AST2400-A1
+ case 0x02000303 : sprintf(ASTChipName, "[ ]AST2400-A0" ); ASTChipType = 4; AST1100 = 0; break;//AST2400-A0
+ case 0x02010103 : sprintf(ASTChipName, "[*]AST1400-A1" ); ASTChipType = 4; AST1100 = 0; break;//AST1400-A1
+ case 0x02000003 : sprintf(ASTChipName, "[ ]AST1400-A0" ); ASTChipType = 4; AST1100 = 0; break;//AST1400-A0
+
+ case 0x01010303 : sprintf(ASTChipName, "[*]AST2300-A1" ); ASTChipType = 3; AST1100 = 0; break;//AST2300-A1
+ case 0x01010203 : sprintf(ASTChipName, "[*]AST1050-A1" ); ASTChipType = 3; AST1100 = 0; break;//AST1050-A1
+ case 0x01010003 : sprintf(ASTChipName, "[*]AST1300-A1" ); ASTChipType = 3; AST1100 = 0; break;//AST1300-A1
+ case 0x01000003 : sprintf(ASTChipName, "[ ]AST2300-A0" ); ASTChipType = 3; AST1100 = 0; break;//AST2300-A0
+// case 0x01860003 : sprintf(ASTChipName, "[ ]AST2300-FPGA" ); ASTChipType = 3; AST1100 = 0; break;
+
+ case 0x00000102 : sprintf(ASTChipName, "[*]AST2200-A1" ); ASTChipType = 2; AST1100 = 0; break;//AST2200-A1/A0
+
+ case 0x00000302 : sprintf(ASTChipName, "[*]AST2100-A3" ); ASTChipType = 1; AST1100 = 0; break;//AST2100-A3/A2
+ case 0x00000301 : sprintf(ASTChipName, "[ ]AST2100-A1" ); ASTChipType = 1; AST1100 = 0; break;//AST2100-A1
+ case 0x00000300 : sprintf(ASTChipName, "[ ]AST2100-A0" ); ASTChipType = 1; AST1100 = 0; break;//AST2100-A0
+ case 0x00000202 : sprintf(ASTChipName, "[*]AST2050/AST1100-A3, AST2150-A1"); ASTChipType = 1; AST1100 = 1; break;//AST2050/AST1100-A3/A2 AST2150-A1/A0
+ case 0x00000201 : sprintf(ASTChipName, "[ ]AST2050/AST1100-A1" ); ASTChipType = 1; AST1100 = 1; break;//AST2050/AST1100-A1
+ case 0x00000200 : sprintf(ASTChipName, "[ ]AST2050/AST1100-A0" ); ASTChipType = 1; AST1100 = 1; break;//AST2050/AST1100-A0
+
+ default :
+ printf ("Error Silicon Revision ID(SCU7C) %08lx!!!\n", SCU_7ch_old);
+ return(1);
+ } // End switch (SCU_7ch_old)
+
+ switch (ASTChipType) {
+ case 6 : AST2300 = 1; AST2400 = 1; AST1010 = 0; AST3200 = 1; break;
+ case 5 : AST2300 = 1; AST2400 = 1; AST1010 = 1; AST3200 = 0; break;
+ case 4 : AST2300 = 1; AST2400 = 1; AST1010 = 0; AST3200 = 0; break;
+ case 3 : AST2300 = 1; AST2400 = 0; AST1010 = 0; AST3200 = 0; break;
+ default : AST2300 = 0; AST2400 = 0; AST1010 = 0; AST3200 = 0; break;
+ } // End switch (ASTChipType)
+
+ if (ASTChipType == 3) {
+#ifdef Force_Enable_MAC34
+ WriteSOC_DD( SCU_BASE + 0xf0, 0xAEED0001 ); //enable mac34
+ Enable_MAC34 = 1;
+#else
+ if (SCU_f0h_old & 0x00000001)
+ Enable_MAC34 = 1;
+ else
+ Enable_MAC34 = 0;
+#endif
+ }
+ else {
+ Enable_MAC34 = 0;
+ } // End if (ASTChipType == 3)
+
+ Setting_scu();
+
+//------------------------------------------------------------
+// Argument Input
+//------------------------------------------------------------
+ // Load default value
+ UserDVal = DEF_USER_DEF_PACKET_VAL;
+ IOTimingBund_arg = DEF_IOTIMINGBUND;
+ PHY_ADR_arg = DEF_PHY_ADR;
+ TestMode = DEF_TESTMODE;
+ LOOP_INFINI = 0;
+ LOOP_MAX_arg = 0;
+ GCtrl = ( DEF_MAC_LOOP_BACK << 6 ) | ( DEF_SKIP_CHECK_PHY << 5 ) | ( DEF_INIT_PHY << 3 );
+ GSpeed = DEF_SPEED;
+
+ // Get setting information by user
+ GRun_Mode = (BYTE)atoi(argv[1]);
+
+ if ( ModeSwitch == MODE_NSCI ) {
+ ARPNumCnt = DEF_ARPNUMCNT;
+ ChannelTolNum = DEF_CHANNEL2NUM;
+ PackageTolNum = DEF_PACKAGE2NUM;
+ GSpeed = SET_100MBPS; // In NCSI mode, we set to 100M bps
+ }
+
+ // Setting user's configuration
+ if (argc > 1) {
+ if ( ModeSwitch == MODE_NSCI )
+ switch (argc) {
+ case 7: ARPNumCnt = (ULONG)atoi(argv[6]);
+ case 6: IOTimingBund_arg = (BYTE)atoi(argv[5]);
+ case 5: TestMode = (BYTE)atoi(argv[4]);
+ case 4: ChannelTolNum = (BYTE)atoi(argv[3]);
+ case 3: PackageTolNum = (BYTE)atoi(argv[2]);
+ default: break;
+ }
+ else
+ switch (argc) {
+ case 9: UserDVal = strtoul (argv[8], &stop_at, 16);
+ case 8: IOTimingBund_arg = (BYTE)atoi(argv[7]);
+ case 7: PHY_ADR_arg = (BYTE)atoi(argv[6]);
+ case 6: TestMode = (BYTE)atoi(argv[5]);
+ case 5: strcpy(LOOP_Str, argv[4]);
+ if (!strcmp(LOOP_Str, "#")) LOOP_INFINI = 1;
+ else LOOP_MAX_arg = (ULONG)atoi(LOOP_Str);
+ case 4: GCtrl = (BYTE)atoi(argv[3]);
+ case 3: GSpeed = (BYTE)atoi(argv[2]);
+ default: break;
+ }
+
+ IOTimingBund = IOTimingBund_arg;
+ PHY_ADR = PHY_ADR_arg;
+ }
+ else {
+ // Wrong parameter
+ if ( ModeSwitch == MODE_NSCI ) {
+ if (AST2300)
+ printf ("\nNCSITEST.exe run_mode <package_num> <channel_num> <test_mode> <IO margin>\n\n");
+ else
+ printf ("\nNCSITEST.exe run_mode <package_num> <channel_num> <test_mode>\n\n");
+ PrintMode ();
+ PrintPakNUm();
+ PrintChlNUm();
+ PrintTest ();
+ if (AST2300)
+ PrintIOTimingBund ();
+ }
+ else {
+ if (AST2300)
+ printf ("\nMACTEST.exe run_mode <speed> <ctrl> <loop_max> <test_mode> <phy_adr> <IO margin>\n\n");
+ else
+ printf ("\nMACTEST.exe run_mode <speed> <ctrl> <loop_max> <test_mode> <phy_adr>\n\n");
+ PrintMode ();
+ PrintSpeed ();
+ PrintCtrl ();
+ PrintLoop ();
+ PrintTest ();
+ PrintPHYAdr ();
+ if (AST2300)
+ PrintIOTimingBund ();
+ }
+ Finish_Close();
+
+ return(1);
+ } // End if (argc > 1)
+
+//------------------------------------------------------------
+// Check Argument
+//------------------------------------------------------------
+ switch ( GRun_Mode ) {
+ case 0: printf ("\n[MAC1]\n"); SelectMAC = 0; H_MAC_BASE = MAC_BASE1; break;
+ case 1: printf ("\n[MAC2]\n"); SelectMAC = 1; H_MAC_BASE = MAC_BASE2; break;
+ case 2: if (Enable_MAC34) {printf ("\n[MAC3]\n"); SelectMAC = 2; H_MAC_BASE = MAC_BASE3; break;}
+ else
+ goto Error_MAC_Mode;
+ case 3: if (Enable_MAC34) {printf ("\n[MAC4]\n"); SelectMAC = 3; H_MAC_BASE = MAC_BASE4; break;}
+ else
+ goto Error_MAC_Mode;
+ default:
+Error_MAC_Mode:
+ printf ("Error run_mode!!!\n");
+ PrintMode ();
+
+ return(1);
+ } // End switch ( GRun_Mode )
+
+ H_TDES_BASE = TDES_BASE1;
+ H_RDES_BASE = RDES_BASE1;
+ MAC_PHYBASE = H_MAC_BASE;
+
+ Force1G = 0;
+ Force10M = 0;
+ Force100M = 0;
+ GSpeed_sel[0] = 0;//1G
+ GSpeed_sel[1] = 0;//100M
+ GSpeed_sel[2] = 0;//10M
+
+ switch ( GSpeed ) {
+ case SET_1GBPS : Force1G = 1; GSpeed_sel[0] = 1; break;
+ case SET_100MBPS : Force100M = 1; GSpeed_sel[1] = 1; break;
+ case SET_10MBPS : Force10M = 1; GSpeed_sel[2] = 1; break;
+ case SET_1G_100M_10MBPS : break;
+ default: printf ("Error speed!!!\n");
+ PrintSpeed ();
+ return(1);
+ } // End switch ( GSpeed )
+
+ if ( ModeSwitch == MODE_NSCI ) {
+ Enable_MACLoopback = 0; // For mactest function
+ Enable_SkipChkPHY = 0; // For mactest function
+ Enable_IntLoopPHY = 0; // For mactest function
+ Enable_InitPHY = 0; // For mactest function
+ Disable_RecovPHY = 0; // For mactest function
+ BurstEnable = 0; // For mactest function
+
+ PrintNCSIEn = (ARPNumCnt & 0x1);
+ ARPNumCnt = ARPNumCnt & 0xfffffffe;
+
+ // Check parameter
+ if ((PackageTolNum < 1) || (PackageTolNum > 8)) {
+ PrintPakNUm();
+ return(1);
+ }
+// if ((ChannelTolNum < 0) || (ChannelTolNum > 32)) {
+ if (ChannelTolNum > 32) {
+ PrintChlNUm();
+ return(1);
+ }
+
+ switch (TestMode) {
+ case 0 : NCSI_DiSChannel = 1; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 1; break;
+ case 1 : NCSI_DiSChannel = 0; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 1; break;
+ case 6 : if (AST2300) {NCSI_DiSChannel = 1; IOTiming = 1; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 1; break;}
+ else
+ goto Error_Test_Mode_NCSI;
+ case 7 : if (AST2300) {NCSI_DiSChannel = 1; IOTiming = 1; IOStrength = 1; TxDataEnable = 1; RxDataEnable = 1; break;}
+ else
+ goto Error_Test_Mode_NCSI;
+ default:
+ // Wrong parameter
+Error_Test_Mode_NCSI:
+ printf ("Error test_mode!!!\n");
+ PrintTest ();
+ return(1);
+ } // End switch (TestMode)
+ }
+ else {
+ if ( GCtrl & 0xffffff83 ) {
+ printf ("Error ctrl!!!\n");
+ PrintCtrl ();
+ return(1);
+ }
+ else {
+ Enable_MACLoopback = ( GCtrl >> 6 ) & 0x1; // ??
+ Enable_SkipChkPHY = ( GCtrl >> 5 ) & 0x1; // ??
+ Enable_IntLoopPHY = ( GCtrl >> 4 ) & 0x1;
+ Enable_InitPHY = ( GCtrl >> 3 ) & 0x1;
+ Disable_RecovPHY = ( GCtrl >> 2 ) & 0x1; // ??
+
+ if (!AST2400 && Enable_MACLoopback) {
+ printf ("Error ctrl!!!\n");
+ PrintCtrl ();
+ return(1);
+ }
+ } // End if ( GCtrl & 0xffffff83 )
+
+ if (!LOOP_MAX_arg) {
+ switch (GSpeed) {
+ case SET_1GBPS : LOOP_MAX_arg = DEF_LOOP_MAX * 200; break; // 20140325
+ case SET_100MBPS : LOOP_MAX_arg = DEF_LOOP_MAX * 20 ; break; // 20140325
+ case SET_10MBPS : LOOP_MAX_arg = DEF_LOOP_MAX * 10 ; break; // 20140325
+ case SET_1G_100M_10MBPS: LOOP_MAX_arg = DEF_LOOP_MAX * 10 ; break; // 20140325
+ }
+ } // End if (!LOOP_MAX_arg)
+
+ LOOP_MAX = LOOP_MAX_arg * 10; // 20140325
+ Calculate_LOOP_CheckNum();
+
+ switch (TestMode) {
+ case 0 : BurstEnable = 0; IEEETesting = 0; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 1; DataDelay = 0; break;
+ case 1 : BurstEnable = 1; IEEETesting = 1; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 0; DataDelay = 0; break;
+ case 2 : BurstEnable = 1; IEEETesting = 1; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 0; DataDelay = 0; break;
+ case 3 : BurstEnable = 1; IEEETesting = 1; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 0; DataDelay = 0; break;
+ case 4 : BurstEnable = 1; IEEETesting = 0; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 0; DataDelay = 0; break; // ??
+ case 5 : BurstEnable = 1; IEEETesting = 1; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 0; DataDelay = 0; break; // ??
+ case 6 : if (AST2300) {BurstEnable = 0; IEEETesting = 0; IOTiming = 1; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 1; DataDelay = 0; break;}
+ else
+ goto Error_Test_Mode;
+ case 7 : if (AST2300) {BurstEnable = 0; IEEETesting = 0; IOTiming = 1; IOStrength = 1; TxDataEnable = 1; RxDataEnable = 1; DataDelay = 0; break;}
+ else
+ goto Error_Test_Mode;
+ case 8 : BurstEnable = 0; IEEETesting = 0; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 0; DataDelay = 0; break; // ??
+ case 9 : BurstEnable = 0; IEEETesting = 0; IOTiming = 0; IOStrength = 0; TxDataEnable = 0; RxDataEnable = 1; DataDelay = 0; break; // ??
+ case 10 : BurstEnable = 0; IEEETesting = 0; IOTiming = 0; IOStrength = 0; TxDataEnable = 1; RxDataEnable = 1; DataDelay = 1; break; // ??
+ default:
+Error_Test_Mode:
+ printf ("Error test_mode!!!\n");
+ PrintTest ();
+ return(1);
+ } // End switch (TestMode)
+
+ if ( PHY_ADR > 31 ) {
+ printf ("Error phy_adr!!!\n");
+ PrintPHYAdr ();
+ return(1);
+ } // End if (PHY_ADR > 31)
+ } // End if ( ModeSwitch == MODE_NSCI )
+
+ if ( BurstEnable ) {
+ IOTimingBund = 0;
+ }
+ else {
+ if ( ~DataDelay && AST2300 ) {
+ if ( !( ( (7 >= IOTimingBund) && (IOTimingBund & 0x1) ) ||
+ ( IOTimingBund == 0 ) ) ) {
+ printf ("Error IO margin!!!\n");
+ PrintIOTimingBund ();
+ return(1);
+ }
+ }
+ else {
+ IOTimingBund = 0;
+ } // End if ( ~DataDelay && AST2300 )
+
+ // Define Output file name
+ if ( ModeSwitch == MODE_NSCI )
+ sprintf(FileNameMain, "%d", SelectMAC+1);
+ else {
+ if (Enable_IntLoopPHY)
+ sprintf(FileNameMain, "%dI", SelectMAC+1);
+ else
+ sprintf(FileNameMain, "%dE", SelectMAC+1);
+ }
+
+ #ifndef SLT_UBOOT
+ if ( IOTiming ) {
+ if ( IOStrength )
+ sprintf(FileName, "MIOD%sS.log", FileNameMain);
+ else
+ sprintf(FileName, "MIOD%s.log", FileNameMain);
+
+ fp_log = fopen(FileName,"w");
+
+ if ( IOStrength )
+ sprintf(FileName, "MIO%sS.log", FileNameMain);
+ else
+ sprintf(FileName, "MIO%s.log", FileNameMain);
+
+ fp_io = fopen(FileName,"w");
+ }
+ else {
+ sprintf(FileName, "MAC%s.log", FileNameMain);
+
+ fp_log = fopen(FileName,"w");
+ }
+ #endif
+ } // End if (BurstEnable)
+
+//------------------------------------------------------------
+// Check Definition
+//------------------------------------------------------------
+ for (i = 0; i < 16; i++)
+ valary[i] = Val_Array[i];
+
+ if ( AST3200 ) {
+ MAC_Mode = (SCU_70h_old >> 6) & 0x1;
+ MAC1_1GEn = (MAC_Mode & 0x1) ? 1 : 0;//1:RGMII, 0:RMII
+ MAC2_1GEn = 0;
+
+ MAC1_RMII = !MAC1_1GEn;
+ MAC2_RMII = 0;
+ MAC2_Valid = 0;
+ }
+ else if ( AST1010 ) {
+ MAC_Mode = 0;
+ MAC1_1GEn = 0;
+ MAC2_1GEn = 0;
+
+ MAC1_RMII = 1;
+ MAC2_RMII = 0;
+ MAC2_Valid = 0;
+ }
+ else if ( AST2300 ) {
+ if (SCU_7ch_old == 0x01000003) {
+ //AST2300-A0
+ for (i = 0; i < 16; i++) {
+ valary[i] = Val_Array_A0[i];
+ }
+ }
+
+ MAC_Mode = (SCU_70h_old >> 6) & 0x3;
+ MAC1_1GEn = (MAC_Mode & 0x1) ? 1 : 0;//1:RGMII, 0:RMII
+ MAC2_1GEn = (MAC_Mode & 0x2) ? 1 : 0;//1:RGMII, 0:RMII
+
+ MAC1_RMII = !MAC1_1GEn;
+ MAC2_RMII = !MAC2_1GEn;
+ MAC2_Valid = 1;
+ }
+ else {
+ MAC_Mode = (SCU_70h_old >> 6) & 0x7;
+ MAC1_1GEn = (MAC_Mode == 0x0) ? 1 : 0;
+ MAC2_1GEn = 0;
+
+ switch ( MAC_Mode ) {
+ case 0 : MAC1_RMII = 0; MAC2_RMII = 0; MAC2_Valid = 0; break; //000: Select GMII(MAC#1) only
+ case 1 : MAC1_RMII = 0; MAC2_RMII = 0; MAC2_Valid = 1; break; //001: Select MII (MAC#1) and MII(MAC#2)
+ case 2 : MAC1_RMII = 1; MAC2_RMII = 0; MAC2_Valid = 1; break; //010: Select RMII(MAC#1) and MII(MAC#2)
+ case 3 : MAC1_RMII = 0; MAC2_RMII = 0; MAC2_Valid = 0; break; //011: Select MII (MAC#1) only
+ case 4 : MAC1_RMII = 1; MAC2_RMII = 0; MAC2_Valid = 0; break; //100: Select RMII(MAC#1) only
+// case 5 : MAC1_RMII = 0; MAC2_RMII = 0; MAC2_Valid = 0; break; //101: Reserved
+ case 6 : MAC1_RMII = 1; MAC2_RMII = 1; MAC2_Valid = 1; break; //110: Select RMII(MAC#1) and RMII(MAC#2)
+// case 7 : MAC1_RMII = 0; MAC2_RMII = 0; MAC2_Valid = 0; break; //111: Disable dual MAC
+ default: return(Finish_Check(Err_MACMode));
+ }
+ } // End if ( AST3200 )
+
+ if ( SelectMAC == 0 ) {
+ Enable_RMII = MAC1_RMII;
+ MAC_1GEn = MAC1_1GEn;
+
+ if ( Force1G & !MAC1_1GEn ) {
+ printf ("\nMAC1 don't support 1Gbps !!!\n");
+ return( Finish_Check(Err_MACMode) );
+ }
+ } else if (SelectMAC == 1) {
+ Enable_RMII = MAC2_RMII;
+ MAC_1GEn = MAC2_1GEn;
+
+ if ( Force1G & !MAC2_1GEn ) {
+ printf ("\nMAC2 don't support 1Gbps !!!\n");
+ return(Finish_Check(Err_MACMode));
+ }
+ if ( !MAC2_Valid ) {
+ printf ("\nMAC2 not valid !!!\n");
+ return(Finish_Check(Err_MACMode));
+ }
+ }
+ else {
+ Enable_RMII = 1;
+ MAC_1GEn = 0;
+
+ if (Force1G) {
+ printf ("\nMAC3/MAC4 don't support 1Gbps !!!\n");
+ return(Finish_Check(Err_MACMode));
+ }
+ } // End if ( SelectMAC == 0 )
+
+ if ( ModeSwitch == MODE_NSCI ) {
+ if (!Enable_RMII) {
+ printf ("\nNCSI must be RMII interface !!!\n");
+ return(Finish_Check(Err_MACMode));
+ }
+ }
+
+ if ( GSpeed == SET_1G_100M_10MBPS ) {
+ GSpeed_sel[0] = MAC_1GEn;
+ GSpeed_sel[1] = 1;
+ GSpeed_sel[2] = 1;
+ }
+
+ if ( AST1010 ) {
+ // Check bit 13:12
+ Dat_ULONG = SCU_08h_old & 0x00003000;
+ if (Dat_ULONG != 0x00000000)
+ return(Finish_Check(Err_MHCLK_Ratio));
+ }
+ else if ( AST2300 ) {
+ Dat_ULONG = (SCU_08h_old >> 16) & 0x7;
+ if (MAC1_1GEn | MAC2_1GEn) {
+ if ( (Dat_ULONG == 0) || (Dat_ULONG > 2) )
+ return(Finish_Check(Err_MHCLK_Ratio));
+ }
+ else {
+ if (Dat_ULONG != 4)
+ return(Finish_Check(Err_MHCLK_Ratio));
+ }
+ } // End if (AST1010)
+
+ //MAC
+ MAC_08h_old = ReadSOC_DD( H_MAC_BASE + 0x08 );
+ MAC_0ch_old = ReadSOC_DD( H_MAC_BASE + 0x0c );
+ MAC_40h_old = ReadSOC_DD( H_MAC_BASE + 0x40 );
+
+ if ( ((MAC_08h_old == 0x0000) && (MAC_0ch_old == 0x00000000))
+ || ((MAC_08h_old == 0xffff) && (MAC_0ch_old == 0xffffffff))
+// || (MAC_0ch_old & 0x1)
+// || (MAC_0ch_old & 0x2)
+ )
+ {
+ // Load default for MAC address
+ SA[0] = 0x00;
+ SA[1] = 0x57;
+ SA[2] = 0x89;
+ SA[3] = 0x56;
+ SA[4] = 0x88;
+ SA[5] = 0x38;
+ }
+ else {
+ SA[0] = (MAC_08h_old >> 8) & 0xff;
+ SA[1] = (MAC_08h_old ) & 0xff;
+ SA[2] = (MAC_0ch_old >> 24) & 0xff;
+ SA[3] = (MAC_0ch_old >> 16) & 0xff;
+ SA[4] = (MAC_0ch_old >> 8) & 0xff;
+ SA[5] = (MAC_0ch_old ) & 0xff;
+ }
+ // printf ("%08x %08x: %02x %02x %02x %02x %02x %02x\n", MAC_08h_old, MAC_0ch_old, SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]);
+
+ if ( AST2300 ) {
+#ifdef Force_Enable_NewMDIO
+ AST2300_NewMDIO = 1;
+ WriteSOC_DD(H_MAC_BASE+0x40, MAC_40h_old | 0x80000000)
+#else
+ AST2300_NewMDIO = (MAC_40h_old & 0x80000000) ? 1 : 0;
+#endif
+ }
+ else {
+ AST2300_NewMDIO = 0;
+ } // End if (AST2300)
+
+//------------------------------------------------------------
+// Parameter Initial
+//------------------------------------------------------------
+ if ( AST3200 ) {
+ SCU_04h = 0x0c000800; //Reset Engine
+ }
+ else if (AST1010) {
+ SCU_04h = 0x00000010; //Reset Engine
+ }
+ else if (AST2300) {
+ SCU_04h = 0x0c001800; //Reset Engine
+ }
+ else {
+ SCU_04h = 0x00001800; //Reset Engine
+ } // End if ( AST3200 )
+
+ if ( ModeSwitch == MODE_NSCI )
+ // Set to 100Mbps and Enable RX broabcast packets and CRC_APD and Full duplex
+ MAC_50h = 0x000a0500;
+ else {
+ // RX_ALLADR and CRC_APD and Full duplex
+ MAC_50h = 0x00004500;
+
+ #ifdef Enable_Runt
+ MAC_50h = MAC_50h | 0x00001000;
+ #endif
+
+ #ifdef Enable_Jumbo
+ MAC_50h = MAC_50h | 0x00002000;
+ #endif
+ } // End if ( ModeSwitch == MODE_NSCI )
+
+//------------------------------------------------------------
+// Descriptor Number
+//------------------------------------------------------------
+ if ( ModeSwitch == MODE_DEDICATED ) {
+
+ #ifdef Enable_Jumbo
+ DES_LowNumber = 1;
+ #else
+ DES_LowNumber = IOTiming;
+ #endif
+ if ( Enable_SkipChkPHY && ( TestMode == 0 ) ) {
+ DES_NUMBER = 114;//for SMSC's LAN9303 issue
+ }
+ else {
+ if ( AST1010 | AST3200 ) {
+ DES_NUMBER = (IOTimingBund) ? 100 : 256;
+ }
+ else {
+ switch ( GSpeed ) {
+ case SET_1GBPS : DES_NUMBER = (IOTimingBund) ? 10 : (DES_LowNumber) ? 50 : 400; break; // 20140325
+ case SET_100MBPS : DES_NUMBER = (IOTimingBund) ? 10 : (DES_LowNumber) ? 50 : 400; break; // 20140325
+ case SET_10MBPS : DES_NUMBER = (IOTimingBund) ? 10 : (DES_LowNumber) ? 10 : 80; break; // 20140325
+ case SET_1G_100M_10MBPS : DES_NUMBER = (IOTimingBund) ? 10 : (DES_LowNumber) ? 10 : 80; break; // 20140325
+ }
+ } // End if ( Enable_SkipChkPHY && ( TestMode == 0 ) )
+ }
+
+ #ifdef SelectDesNumber
+ DES_NUMBER = SelectDesNumber;
+ #endif
+
+ #ifdef USE_LPC
+ DES_NUMBER /= 8;
+ #endif
+
+ #ifdef ENABLE_ARP_2_WOL
+ if ( TestMode == 4 ) {
+ DES_NUMBER = 1;
+ }
+ #endif
+
+ DES_NUMBER_Org = DES_NUMBER;
+
+ if ( DbgPrn_Info ) {
+ printf ("CheckBuf_MBSize : %ld\n", CheckBuf_MBSize);
+ printf ("LOOP_CheckNum : %ld\n", LOOP_CheckNum);
+ printf ("DES_NUMBER : %ld\n", DES_NUMBER);
+ printf ("DMA_BufSize : %ld bytes\n", DMA_BufSize);
+ printf ("DMA_BufNum : %d\n", DMA_BufNum);
+ printf ("\n");
+ }
+// if (3 > DMA_BufNum)
+// return( Finish_Check(Err_DMABufNum) );
+
+ if (2 > DMA_BufNum)
+ return( Finish_Check(Err_DMABufNum) );
+ } // End if ( ModeSwitch == MODE_DEDICATED )
+ } // End if (RUN_STEP >= 1)
+
+//------------------------------------------------------------
+// SCU Initial
+//------------------------------------------------------------
+ if ( RUN_STEP >= 2 ) {
+ init_scu1();
+ }
+
+ if ( RUN_STEP >= 3 ) {
+ init_scu_macrst();
+ }
+
+//------------------------------------------------------------
+// Data Initial
+//------------------------------------------------------------
+ if (RUN_STEP >= 4) {
+ setup_arp();
+ if ( ModeSwitch == MODE_DEDICATED ) {
+
+ FRAME_LEN = (ULONG *)malloc(DES_NUMBER * sizeof( ULONG ));
+ wp_lst = (ULONG *)malloc(DES_NUMBER * sizeof( ULONG ));
+
+ if ( !FRAME_LEN )
+ return( Finish_Check( Err_MALLOC_FrmSize ) );
+
+ if ( !wp_lst )
+ return( Finish_Check( Err_MALLOC_LastWP ));
+
+ // Setup data and length
+ TestingSetup();
+ } // End if ( ModeSwitch == MODE_DEDICATED )
+
+ // Get bit (shift) of IO driving strength register
+ if ( IOStrength ) {
+ if (AST1010) {
+ IOStr_max = 1;//0~1
+ }
+ else if (AST2400) {
+ IOStr_max = 1;//0~1
+ switch (SelectMAC) {
+ case 0 : IOStr_shf = 9; break;
+ case 1 : IOStr_shf = 11; break;
+ }
+ }
+ else {
+ IOStr_max = 3;//0~3
+ switch (SelectMAC) {
+ case 0 : IOStr_shf = 8; break;
+ case 1 : IOStr_shf = 10; break;
+ case 2 : IOStr_shf = 12; break;
+ case 3 : IOStr_shf = 14; break;
+ }
+ }
+ }
+ else {
+ IOStr_max = 0;
+ IOStr_shf = 0;
+ } // End if (IOStrength)
+
+ // Get current clock delay value of TX(out) and RX(in) in the SCU48 register
+ // and setting test range
+ if ( Enable_RMII ) {
+ switch (GRun_Mode) {
+ case 0 : IOdly_out_shf = 24; IOdly_in_shf = 8; break;
+ case 1 : IOdly_out_shf = 25; IOdly_in_shf = 12; break;
+ case 2 : IOdly_out_shf = 26; IOdly_in_shf = 16; break;
+ case 3 : IOdly_out_shf = 27; IOdly_in_shf = 20; break;
+ }
+ IOdly_in_reg = (SCU_48h_old >> IOdly_in_shf ) & 0xf;
+ IOdly_out_reg = (SCU_48h_old >> IOdly_out_shf) & 0x1;
+ }
+ else {
+ switch (GRun_Mode) {
+ case 0 : IOdly_out_shf = 0; IOdly_in_shf = 8; break;
+ case 1 : IOdly_out_shf = 4; IOdly_in_shf = 12; break;
+ }
+ IOdly_in_reg = (SCU_48h_old >> IOdly_in_shf ) & 0xf;
+ IOdly_out_reg = (SCU_48h_old >> IOdly_out_shf) & 0xf;
+ } // End if ( Enable_RMII )
+
+ // Find the coordinate in X-Y axis
+ for ( index = 0; index <= 15; index++ )
+ if ( IOdly_in_reg == valary[index] ) {
+ IOdly_in_reg_idx = index;
+ break;
+ }
+ for ( index = 0; index <= 15; index++ )
+ if ( IOdly_out_reg == valary[index] ) {
+ IOdly_out_reg_idx = index;
+ break;
+ }
+
+ // Get the range for testmargin block
+ if ( IOTiming ) {
+ if ( Enable_RMII ) {
+ IOdly_incval = 1;
+ IOdly_in_str = 0;
+ IOdly_in_end = 15;
+ IOdly_out_str = 0;
+ IOdly_out_end = 1;
+ }
+ else {
+ IOdly_incval = 1;
+ IOdly_in_str = 0;
+ IOdly_in_end = 15;
+ IOdly_out_str = 0;
+ IOdly_out_end = 15;
+ }
+ }
+ else if ( IOTimingBund ) {
+ if ( Enable_RMII ) {
+ IOdly_incval = 1;
+ IOdly_in_str = IOdly_in_reg_idx - ( IOTimingBund >> 1 );
+ IOdly_in_end = IOdly_in_reg_idx + ( IOTimingBund >> 1 );
+ IOdly_out_str = IOdly_out_reg_idx;
+ IOdly_out_end = IOdly_out_reg_idx;
+ }
+ else {
+ IOdly_incval = 1;
+ IOdly_in_str = IOdly_in_reg_idx - ( IOTimingBund >> 1 );
+ IOdly_in_end = IOdly_in_reg_idx + ( IOTimingBund >> 1 );
+ IOdly_out_str = IOdly_out_reg_idx - ( IOTimingBund >> 1 );
+ IOdly_out_end = IOdly_out_reg_idx + ( IOTimingBund >> 1 );
+ }
+ if ((IOdly_in_str < 0) || (IOdly_in_end > 15))
+ return( Finish_Check( Err_IOMarginOUF ) );
+
+ if ((IOdly_out_str < 0) || (IOdly_out_end > 15))
+ return( Finish_Check( Err_IOMarginOUF ) );
+
+// if (IOdly_in_str < 0) IOdly_in_str = 0;
+// if (IOdly_in_end > 15) IOdly_in_end = 15;
+// if (IOdly_out_str < 0) IOdly_out_str = 0;
+// if (IOdly_out_end > 15) IOdly_out_end = 15;
+ }
+ else {
+ IOdly_incval = 1;
+ IOdly_in_str = 0;
+ IOdly_in_end = 0;
+ IOdly_out_str = 0;
+ IOdly_out_end = 0;
+ } // End if (IOTiming)
+ } // End if (RUN_STEP >= 4)
+
+//------------------------------------------------------------
+// main
+//------------------------------------------------------------
+ if (RUN_STEP >= 5) {
+ #ifdef DbgPrn_FuncHeader
+ printf ("GSpeed_sel: %d %d %d\n", GSpeed_sel[0], GSpeed_sel[1], GSpeed_sel[2]);
+ Debug_delay();
+ #endif
+
+ if ( ModeSwitch == MODE_NSCI ) {
+ #ifdef Enable_NCSI_LOOP_INFINI
+ for ( GSpeed_idx = 0; GSpeed_idx < 3; GSpeed_idx++ ) {
+ GSpeed_org[GSpeed_idx] = GSpeed_sel[GSpeed_idx];
+ }
+NCSI_LOOP_INFINI:;
+ for ( GSpeed_idx = 0; GSpeed_idx < 3; GSpeed_idx++ ) {
+ GSpeed_sel[GSpeed_idx] = GSpeed_org[GSpeed_idx];
+ }
+ #endif
+ } // End if ( ModeSwitch == MODE_NSCI )
+
+ for (GSpeed_idx = 0; GSpeed_idx < 3; GSpeed_idx++) {
+ Err_Flag_PrintEn = 1;
+ if ( GSpeed_sel[GSpeed_idx] ) {
+ // Setting the LAN speed
+ if ( ModeSwitch == MODE_DEDICATED ) {
+
+
+ // Test three speed of LAN, we will modify loop number
+ if (GSpeed == SET_1G_100M_10MBPS) {
+ if (GSpeed_sel[0]) LOOP_MAX = LOOP_MAX_arg;
+ else if (GSpeed_sel[1]) LOOP_MAX = LOOP_MAX_arg / 10;
+ else LOOP_MAX = LOOP_MAX_arg / 100;
+
+ if ( !LOOP_MAX )
+ LOOP_MAX = 1;
+
+ Calculate_LOOP_CheckNum();
+ }
+
+ // Setting speed of LAN
+ if (GSpeed_sel[0]) MAC_50h_Speed = 0x00000200;
+ else if (GSpeed_sel[1]) MAC_50h_Speed = 0x00080000;
+ else MAC_50h_Speed = 0x00000000;
+
+ //------------------------------------------------------------
+ // PHY Initial
+ //------------------------------------------------------------
+ if ( AST1100 )
+ init_scu2();
+
+ if ( Enable_InitPHY ) {
+#ifdef SUPPORT_PHY_LAN9303
+ LAN9303(LAN9303_I2C_BUSNUM, PHY_ADR_arg, GSpeed_idx, Enable_IntLoopPHY | (BurstEnable<<1) | IEEETesting);
+#else
+ init_phy( Enable_IntLoopPHY );
+#endif
+ DELAY( Delay_PHYRst * 10 );
+ } // End if (Enable_InitPHY)
+
+ if ( AST1100 )
+ init_scu3();
+
+ if ( Err_Flag )
+ return( Finish_Check( 0 ) );
+ } // End if ( ModeSwitch == MODE_DEDICATED )
+
+ //------------------------------------------------------------
+ // Start
+ //------------------------------------------------------------
+
+ // The loop is for different IO strength
+ for ( IOStr_i = 0; IOStr_i <= IOStr_max; IOStr_i++ ) {
+
+ // Print Header of report to monitor and log file
+ if ( IOTiming || IOTimingBund ) {
+ if ( IOStrength ) {
+ if ( AST1010 ) {
+ IOStr_val = (SCU_ach_old & 0xfff0ffff) | ((IOStr_i) ? 0xf0000 : 0x0);
+ }
+ else {
+ IOStr_val = (SCU_90h_old & 0xffff00ff) | (IOStr_i << IOStr_shf);
+ }
+ //printf("\nIOStrength_val= %08x, ", IOStr_val);
+ //printf("SCU90h: %08x ->", ReadSOC_DD(SCU_BASE+0x90));
+ WriteSOC_DD( SCU_BASE + 0x90, IOStr_val );
+ //printf(" %08x\n", ReadSOC_DD(SCU_BASE+0x90));
+
+ #ifndef SLT_UBOOT
+ if (GSpeed_sel[0]) fprintf(fp_log, "[Strength %d][1G ]========================================\n", IOStr_i);
+ else if (GSpeed_sel[1]) fprintf(fp_log, "[Strength %d][100M]========================================\n", IOStr_i);
+ else fprintf(fp_log, "[Strength %d][10M ]========================================\n", IOStr_i);
+ #endif
+ }
+ else {
+ #ifndef SLT_UBOOT
+ if (GSpeed_sel[0]) fprintf(fp_log, "[1G ]========================================\n");
+ else if (GSpeed_sel[1]) fprintf(fp_log, "[100M]========================================\n");
+ else fprintf(fp_log, "[10M ]========================================\n");
+ #endif
+ }
+
+ if ( IOTimingBund )
+ PrintIO_Header(FP_LOG);
+ if ( IOTiming )
+ PrintIO_Header(FP_IO);
+
+ PrintIO_Header(STD_OUT);
+
+ }
+ else {
+ if ( ModeSwitch == MODE_DEDICATED ) {
+
+ if (!BurstEnable)
+ Print_Header(FP_LOG);
+
+ Print_Header(STD_OUT);
+ }
+ } // End if (IOTiming || IOTimingBund)
+
+#ifdef Enable_Old_Style
+ for (IOdly_i = IOdly_in_str; IOdly_i <= IOdly_in_end; IOdly_i+=IOdly_incval) {
+ IOdly_in = valary[IOdly_i];
+#else
+ for (IOdly_j = IOdly_out_str; IOdly_j <= IOdly_out_end; IOdly_j+=IOdly_incval) {
+ IOdly_out = valary[IOdly_j];
+#endif
+
+ if (IOTiming || IOTimingBund) {
+#ifdef Enable_Fast_SCU
+ #ifdef Enable_Old_Style
+ WriteSOC_DD(SCU_BASE + 0x48, SCU_48h_mix | (IOdly_in << IOdly_in_shf));
+ #else
+ WriteSOC_DD(SCU_BASE + 0x48, SCU_48h_mix | (IOdly_out << IOdly_out_shf));
+ #endif
+#endif
+
+ if ( IOTimingBund )
+ PrintIO_LineS(FP_LOG);
+ if ( IOTiming )
+ PrintIO_LineS(FP_IO);
+
+ PrintIO_LineS(STD_OUT);
+ } // End if (IOTiming || IOTimingBund)
+
+ //------------------------------------------------------------
+ // SCU Initial
+ //------------------------------------------------------------
+#ifdef Enable_Fast_SCU
+ init_scu_macrst();
+#endif
+#ifdef Enable_Old_Style
+ for (IOdly_j = IOdly_out_str; IOdly_j <= IOdly_out_end; IOdly_j+=IOdly_incval) {
+ IOdly_out = valary[IOdly_j];
+#else
+ for (IOdly_i = IOdly_in_str; IOdly_i <= IOdly_in_end; IOdly_i+=IOdly_incval) {
+ IOdly_in = valary[IOdly_i];
+#endif
+ if ( IOTiming || IOTimingBund ) {
+ IOdly_val = (IOdly_in << IOdly_in_shf) | (IOdly_out << IOdly_out_shf);
+
+//printf("\nIOdly_val= %08x, ", IOdly_val);
+//printf("SCU48h: %08x ->", ReadSOC_DD( SCU_BASE + 0x48 ) );
+ WriteSOC_DD( SCU_BASE + 0x48, SCU_48h_mix | IOdly_val );
+//printf(" %08x\n", ReadSOC_DD(SCU_BASE+0x48));
+ } // End if (IOTiming || IOTimingBund)
+
+ //------------------------------------------------------------
+ // SCU Initial
+ //------------------------------------------------------------
+#ifdef Enable_Fast_SCU
+#else
+ init_scu_macrst();
+#endif
+
+ //------------------------------------------------------------
+ // MAC Initial
+ //------------------------------------------------------------
+ init_mac(H_MAC_BASE, H_TDES_BASE, H_RDES_BASE);
+ if ( Err_Flag )
+ return( Finish_Check(0) );
+
+ // Testing
+ if ( ModeSwitch == MODE_NSCI )
+ dlymap[IOdly_i][IOdly_j] = phy_ncsi();
+ else
+ dlymap[IOdly_i][IOdly_j] = TestingLoop(LOOP_CheckNum);
+
+
+ // Display to Log file and monitor
+ if ( IOTiming || IOTimingBund ) {
+
+ if ( IOTimingBund )
+ PrintIO_Line(FP_LOG);
+
+ if ( IOTiming )
+ PrintIO_Line(FP_IO);
+
+ PrintIO_Line(STD_OUT);
+
+ // Find the range of current setting
+ if ( ( IOdly_in_reg == IOdly_in ) && ( IOdly_out_reg == IOdly_out ) ) {
+ IOdly_i_min = IOdly_i - ( IOTimingBund >> 1 );
+ IOdly_i_max = IOdly_i + ( IOTimingBund >> 1 );
+
+ if ( Enable_RMII ) {
+ IOdly_j_min = IOdly_j;
+ IOdly_j_max = IOdly_j;
+ }
+ else {
+ IOdly_j_min = IOdly_j - (IOTimingBund >> 1 );
+ IOdly_j_max = IOdly_j + (IOTimingBund >> 1 );
+ }
+ }
+
+ PrintIO_Line_LOG();
+ FPri_ErrFlag(FP_LOG);
+
+// Err_Flag_allapeed = Err_Flag_allapeed | Err_Flag;
+ Err_Flag = 0;
+ }
+ }// End for (IOdly_j = IOdly_out_str; IOdly_j <= IOdly_out_end; IOdly_j+=IOdly_incval)
+#ifndef SLT_UBOOT
+ if ( IOTiming || IOTimingBund ) {
+ if ( IOTimingBund )
+ fprintf(fp_log, "\n");
+ if (IOTiming )
+ fprintf(fp_io, "\n");
+ }
+#endif
+ printf("\n");
+ } // End for (IOdly_j = IOdly_out_str; IOdly_j <= IOdly_out_end; IOdly_j+=IOdly_incval)
+
+ //------------------------------------------------------------
+ // End
+ //------------------------------------------------------------
+
+ if ( IOTiming || IOTimingBund ) {
+ if ( ( IOdly_i_min < 0 ) || ( IOdly_i_max > 15 ) )
+ FindErr(Err_IOMarginOUF);
+ if ( ( IOdly_j_min < 0 ) || ( IOdly_j_max > 15 ) )
+ FindErr(Err_IOMarginOUF);
+
+ if ( IOdly_i_min < 0 ) IOdly_i_min = 0;
+ if ( IOdly_i_max > 15 ) IOdly_i_max = 15;
+ if ( IOdly_j_min < 0 ) IOdly_j_min = 0;
+ if ( IOdly_j_max > 15 ) IOdly_j_max = 15;
+
+#ifdef Enable_Old_Style
+ for (IOdly_i = IOdly_i_min; IOdly_i <= IOdly_i_max; IOdly_i++)
+ for (IOdly_j = IOdly_j_min; IOdly_j <= IOdly_j_max; IOdly_j++)
+#else
+ for (IOdly_j = IOdly_j_min; IOdly_j <= IOdly_j_max; IOdly_j++)
+ for (IOdly_i = IOdly_i_min; IOdly_i <= IOdly_i_max; IOdly_i++)
+#endif
+ {
+ if ( dlymap[IOdly_i][IOdly_j] ) {
+#ifdef SLT_DOS
+ if ( IOTiming ) {
+#ifdef Enable_Old_Style
+ for (i = IOdly_i_min; i <= IOdly_i_max; i++)
+#else
+ for (j = IOdly_j_min; j <= IOdly_j_max; j++)
+#endif
+ {
+#ifdef Enable_Old_Style
+ for (j = IOdly_j_min; j <= IOdly_j_max; j++)
+#else
+ for (i = IOdly_i_min; i <= IOdly_i_max; i++)
+#endif
+ {
+ if (dlymap[i][j]) fprintf(fp_io, "x ");
+ else fprintf(fp_io, "o ");
+ }
+ fprintf(fp_io, "\n");
+ }
+ } // End if ( IOTiming )
+#endif // End SLT_DOS
+ FindErr(Err_IOMargin);
+ goto Find_Err_IOMargin;
+ } // End if ( dlymap[IOdly_i][IOdly_j] )
+ }
+ } // End if ( IOTiming || IOTimingBund )
+
+Find_Err_IOMargin:;
+ if ( !BurstEnable )
+ FPri_ErrFlag(FP_LOG);
+ if ( IOTiming )
+ FPri_ErrFlag(FP_IO);
+
+ FPri_ErrFlag(STD_OUT);
+
+ Err_Flag_allapeed = Err_Flag_allapeed | Err_Flag;
+ Err_Flag = 0;
+ } // End for (IOStr_i = 0; IOStr_i <= IOStr_max; IOStr_i++)
+
+ if ( ModeSwitch == MODE_DEDICATED ) {
+ if ( Enable_InitPHY & !Disable_RecovPHY )
+ recov_phy(Enable_IntLoopPHY);
+ }
+
+ GSpeed_sel[GSpeed_idx] = 0;
+ } // End if (GSpeed_sel[GSpeed_idx])
+
+ Err_Flag_PrintEn = 0;
+ } // End for (GSpeed_idx = 0; GSpeed_idx < 3; GSpeed_idx++)
+
+ Err_Flag = Err_Flag_allapeed;
+
+ if ( ModeSwitch == MODE_NSCI ) {
+ #ifdef Enable_NCSI_LOOP_INFINI
+ if (Err_Flag == 0) {
+ if (fp_log) {
+ fclose(fp_log);
+ fp_log = fopen(FileName,"w");
+ }
+ goto NCSI_LOOP_INFINI;
+ }
+ #endif
+ }
+
+ } // End if (RUN_STEP >= 5)
+
+ return(Finish_Check(0));
+
+}
+
diff --git a/arch/arm/cpu/arm926ejs/aspeed/reset.c b/arch/arm/cpu/arm926ejs/aspeed/reset.c
new file mode 100644
index 0000000..e0a57f9
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/reset.c
@@ -0,0 +1,24 @@
+/*
+ * 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
+*/
+
+#include <common.h>
+#include <asm/io.h>
+
+#define AST_WDT_BASE 0x1e785000
+void reset_cpu(ulong addr)
+{
+ __raw_writel(0x10 , AST_WDT_BASE+0x04);
+ __raw_writel(0x4755, AST_WDT_BASE+0x08);
+ __raw_writel(0x3, AST_WDT_BASE+0x0c);
+
+ while (1)
+ /*nothing*/;
+}
diff --git a/arch/arm/cpu/arm926ejs/aspeed/timer.c b/arch/arm/cpu/arm926ejs/aspeed/timer.c
new file mode 100644
index 0000000..4bba5c5
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/aspeed/timer.c
@@ -0,0 +1,153 @@
+/*
+ * 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
+ */
+
+#include <common.h>
+#include <arm926ejs.h>
+
+#define TIMER_LOAD_VAL 0xffffffff
+
+/* macro to read the 32 bit timer */
+#define READ_TIMER (*(volatile ulong *)(CONFIG_SYS_TIMERBASE+0))
+
+static ulong timestamp;
+static ulong lastdec;
+
+int timer_init (void)
+{
+ *(volatile ulong *)(CONFIG_SYS_TIMERBASE + 4) = TIMER_LOAD_VAL;
+ *(volatile ulong *)(CONFIG_SYS_TIMERBASE + 0x30) = 0x3; /* enable timer1 */
+
+ /* init the timestamp and lastdec value */
+ reset_timer_masked();
+
+ return 0;
+}
+
+/*
+ * timer without interrupts
+ */
+
+void reset_timer (void)
+{
+ reset_timer_masked ();
+}
+
+ulong get_timer (ulong base)
+{
+ return get_timer_masked () - base;
+}
+
+void set_timer (ulong t)
+{
+ timestamp = t;
+}
+
+/* delay x useconds AND perserve advance timstamp value */
+void udelay (unsigned long usec)
+{
+ ulong tmo, tmp;
+
+ if(usec >= 1000){ /* if "big" number, spread normalization to seconds */
+ tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
+ tmo *= CONFIG_SYS_HZ; /* find number of "ticks" to wait to achieve target */
+ tmo /= 1000; /* finish normalize. */
+ }else{ /* else small number, don't kill it prior to HZ multiply */
+ tmo = usec * CONFIG_SYS_HZ;
+ tmo /= (1000*1000);
+ }
+
+ tmp = get_timer (0); /* get current timestamp */
+ if( (tmo + tmp + 1) < tmp ) /* if setting this fordward will roll time stamp */
+ reset_timer_masked (); /* reset "advancing" timestamp to 0, set lastdec value */
+ else
+ tmo += tmp; /* else, set advancing stamp wake up time */
+
+ while (get_timer_masked () < tmo)/* loop till event */
+ /*NOP*/;
+}
+
+void reset_timer_masked (void)
+{
+ /* reset time */
+ lastdec = READ_TIMER; /* capure current decrementer value time */
+ timestamp = 0; /* start "advancing" time stamp from 0 */
+}
+
+ulong get_timer_masked (void)
+{
+ ulong now = READ_TIMER; /* current tick value */
+
+ if (lastdec >= now) { /* normal mode (non roll) */
+ /* normal mode */
+ timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
+ } else { /* we have overflow of the count down timer */
+ /* nts = ts + ld + (TLV - now)
+ * ts=old stamp, ld=time that passed before passing through -1
+ * (TLV-now) amount of time after passing though -1
+ * nts = new "advancing time stamp"...it could also roll and cause problems.
+ */
+ timestamp += lastdec + TIMER_LOAD_VAL - now;
+ }
+ lastdec = now;
+
+ return timestamp;
+}
+
+/* waits specified delay value and resets timestamp */
+void udelay_masked (unsigned long usec)
+{
+ ulong tmo;
+ ulong endtime;
+ signed long diff;
+
+ if (usec >= 1000) { /* if "big" number, spread normalization to seconds */
+ tmo = usec / 1000; /* start to normalize for usec to ticks per sec */
+ tmo *= CONFIG_SYS_HZ; /* find number of "ticks" to wait to achieve target */
+ tmo /= 1000; /* finish normalize. */
+ } else { /* else small number, don't kill it prior to HZ multiply */
+ tmo = usec * CONFIG_SYS_HZ;
+ tmo /= (1000*1000);
+ }
+
+ endtime = get_timer_masked () + tmo;
+
+ do {
+ ulong now = get_timer_masked ();
+ diff = endtime - now;
+ } while (diff >= 0);
+}
+
+/*
+ * This function is derived from PowerPC code (read timebase as long long).
+ * On ARM it just returns the timer value.
+ */
+unsigned long long get_ticks(void)
+{
+ return get_timer(0);
+}
+
+/*
+ * This function is derived from PowerPC code (timebase clock frequency).
+ * On ARM it returns the number of timer ticks per second.
+ */
+ulong get_tbclk (void)
+{
+ ulong tbclk;
+
+ tbclk = CONFIG_SYS_HZ;
+ return tbclk;
+}
diff --git a/arch/arm/include/asm/arch-aspeed/aspeed_i2c.h b/arch/arm/include/asm/arch-aspeed/aspeed_i2c.h
new file mode 100644
index 0000000..5419fca
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/aspeed_i2c.h
@@ -0,0 +1,69 @@
+/*
+ * 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
+ */
+#if defined(CONFIG_AST1300)
+#define SCU_BASE CONFIG_SCUREG_BASE
+#define I2C_BASE CONFIG_I2CREG_BASE
+#define I2C_CHANNEL CONFIG_I2C_CHANNEL
+#else
+#define SCU_BASE 0x1E6E2000
+#define I2C_BASE 0x1E78A000
+/* Cause U-boot i2c command limitation, it can't assign channel number. Our EEPROM is at channel 3 now*/
+/* AST2200's EEPROM is at channel 4 */
+#if defined(CONFIG_AST2200) || defined(CONFIG_AST2300) || defined(CONFIG_AST2400)
+#define I2C_CHANNEL 4
+#else
+#define I2C_CHANNEL 3
+#endif
+#endif
+
+/* Fix timing for EEPROM 100Khz*/
+#define AC_TIMING 0x77743335
+#define ALL_CLEAR 0xFFFFFFFF
+#define MASTER_ENABLE 0x01
+#define SLAVE_ENABLE 0x02
+#define LOOP_COUNT 0x100000
+#define SCU_RESET_CONTROL 0x04
+#define SCU_MULTIFUNCTION_PIN_CTL5_REG 0x90
+
+/* I2C Register */
+#define I2C_FUNCTION_CONTROL_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x00)
+#define I2C_AC_TIMING_REGISTER_1 (I2C_BASE + I2C_CHANNEL * 0x40 + 0x04)
+#define I2C_AC_TIMING_REGISTER_2 (I2C_BASE + I2C_CHANNEL * 0x40 + 0x08)
+#define I2C_INTERRUPT_CONTROL_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x0c)
+#define I2C_INTERRUPT_STATUS_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x10)
+#define I2C_COMMAND_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x14)
+#define I2C_DEVICE_ADDRESS_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x18)
+#define I2C_BUFFER_CONTROL_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x1c)
+#define I2C_BYTE_BUFFER_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x20)
+#define I2C_DMA_CONTROL_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x24)
+#define I2C_DMA_STATUS_REGISTER (I2C_BASE + I2C_CHANNEL * 0x40 + 0x28)
+
+/* Command Bit */
+#define MASTER_START_COMMAND (1 << 0)
+#define MASTER_TX_COMMAND (1 << 1)
+#define MASTER_RX_COMMAND (1 << 3)
+#define RX_COMMAND_LIST (1 << 4)
+#define MASTER_STOP_COMMAND (1 << 5)
+
+/* Interrupt Status Bit */
+#define TX_ACK (1 << 0)
+#define TX_NACK (1 << 1)
+#define RX_DONE (1 << 2)
+#define STOP_DONE (1 << 4)
+
+/* Macros to access registers */
+#define outb(v,p) *(volatile u8 *) (p) = v
+#define outw(v,p) *(volatile u16 *) (p) = v
+#define outl(v,p) *(volatile u32 *) (p) = v
+
+#define inb(p) *(volatile u8 *) (p)
+#define inw(p) *(volatile u16 *) (p)
+#define inl(p) *(volatile u32 *) (p)
diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mach-types.h
index 440b041..48fcf2b 100644
--- a/arch/arm/include/asm/mach-types.h
+++ b/arch/arm/include/asm/mach-types.h
@@ -175,6 +175,16 @@ extern unsigned int __machine_arch_type;
#define MACH_TYPE_PALMTX 885
#define MACH_TYPE_S3C2413 887
#define MACH_TYPE_WG302V2 890
+#define MACH_TYPE_AST1100 903
+#define MACH_TYPE_AST2000 900
+#define MACH_TYPE_AST2100 902
+#define MACH_TYPE_AST2150 907
+#define MACH_TYPE_AST2200 906
+#define MACH_TYPE_AST2300_FPGA_1 901
+#define MACH_TYPE_AST2300_FPGA_2 901
+#define MACH_TYPE_AST2300 901
+#define MACH_TYPE_AST3100 901
+#define MACH_TYPE_ASPEED 8888
#define MACH_TYPE_OMAP_2430SDP 900
#define MACH_TYPE_DAVINCI_EVM 901
#define MACH_TYPE_PALMZ72 904
@@ -840,7 +850,6 @@ extern unsigned int __machine_arch_type;
#define MACH_TYPE_NV1000 3218
#define MACH_TYPE_NUC950TS 3219
#define MACH_TYPE_NOKIA_RM680 3220
-#define MACH_TYPE_AST2200 3221
#define MACH_TYPE_LEAD 3222
#define MACH_TYPE_UNINO1 3223
#define MACH_TYPE_GREECO 3224
@@ -3063,6 +3072,126 @@ extern unsigned int __machine_arch_type;
# define machine_is_wg302v2() (0)
#endif
+#ifdef CONFIG_MACH_AST1100
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST1100
+# endif
+# define machine_is_ast1100() (machine_arch_type == MACH_TYPE_AST1100)
+#else
+# define machine_is_ast1100() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST2000
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST2000
+# endif
+# define machine_is_ast2000() (machine_arch_type == MACH_TYPE_AST2000)
+#else
+# define machine_is_ast2000() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST2100
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST2100
+# endif
+# define machine_is_ast2100() (machine_arch_type == MACH_TYPE_AST2100)
+#else
+# define machine_is_ast2100() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST2150
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST2150
+# endif
+# define machine_is_ast2150() (machine_arch_type == MACH_TYPE_AST2150)
+#else
+# define machine_is_ast2150() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST2200
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST2200
+# endif
+# define machine_is_ast2200() (machine_arch_type == MACH_TYPE_AST2200)
+#else
+# define machine_is_ast2200() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST2300_FPGA_1
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST2300_FPGA_1
+# endif
+# define machine_is_ast2300_fpga_1() (machine_arch_type == MACH_TYPE_AST2300_FPGA_1)
+#else
+# define machine_is_ast2300_fpga_1() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST2300_FPGA_2
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST2300_FPGA_2
+# endif
+# define machine_is_ast2300_fpga_2() (machine_arch_type == MACH_TYPE_AST2300_FPGA_2)
+#else
+# define machine_is_ast2300_fpga_2() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST3100
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST3100
+# endif
+# define machine_is_ast3100() (machine_arch_type == MACH_TYPE_AST3100)
+#else
+# define machine_is_ast3100() (0)
+#endif
+
+#ifdef CONFIG_MACH_ASPEED
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_ASPEED
+# endif
+# define machine_is_aspeed() (machine_arch_type == MACH_TYPE_ASPEED)
+#else
+# define machine_is_aspeed() (0)
+#endif
+
+#ifdef CONFIG_MACH_AST2300
+# ifdef machine_arch_type
+# undef machine_arch_type
+# define machine_arch_type __machine_arch_type
+# else
+# define machine_arch_type MACH_TYPE_AST2300
+# endif
+# define machine_is_ast2300() (machine_arch_type == MACH_TYPE_AST2300)
+#else
+# define machine_is_ast2300() (0)
+#endif
+
#ifdef CONFIG_MACH_OMAP_2430SDP
# ifdef machine_arch_type
# undef machine_arch_type
@@ -11043,18 +11172,6 @@ extern unsigned int __machine_arch_type;
# define machine_is_nokia_rm680() (0)
#endif
-#ifdef CONFIG_MACH_AST2200
-# ifdef machine_arch_type
-# undef machine_arch_type
-# define machine_arch_type __machine_arch_type
-# else
-# define machine_arch_type MACH_TYPE_AST2200
-# endif
-# define machine_is_ast2200() (machine_arch_type == MACH_TYPE_AST2200)
-#else
-# define machine_is_ast2200() (0)
-#endif
-
#ifdef CONFIG_MACH_LEAD
# ifdef machine_arch_type
# undef machine_arch_type
diff --git a/board/aspeed/ast2300/Makefile b/board/aspeed/ast2300/Makefile
new file mode 100644
index 0000000..d5300e6
--- /dev/null
+++ b/board/aspeed/ast2300/Makefile
@@ -0,0 +1,42 @@
+# 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
+#
+
+include $(TOPDIR)/config.mk
+
+LIB = $(obj)lib$(BOARD).a
+
+COBJS = ast2300.o flash.o flash_spi.o pci.o crc32.o slt.o regtest.o vfun.o vhace.o crt.o videotest.o mactest.o hactest.o mictest.o
+
+ifdef CONFIG_FPGA_ASPEED
+SOBJS := platform_fpga.o
+else
+SOBJS := platform.o
+endif
+
+SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS := $(addprefix $(obj),$(COBJS))
+SOBJS := $(addprefix $(obj),$(SOBJS))
+
+$(LIB): $(obj).depend $(OBJS) $(SOBJS)
+ $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+ rm -f $(SOBJS) $(OBJS)
+
+distclean: clean
+ rm -f $(LIB) core *.bak $(obj).depend
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude .depend
+
+#########################################################################
diff --git a/board/aspeed/ast2300/aes.c b/board/aspeed/ast2300/aes.c
new file mode 100755
index 0000000..f30ab99
--- /dev/null
+++ b/board/aspeed/ast2300/aes.c
@@ -0,0 +1,573 @@
+/*
+ * AES implementation
+ * 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
+ */
+
+/* uncomment the following line to run the test suite */
+
+/* #define TEST */
+
+/* uncomment the following line to use pre-computed tables */
+/* otherwise the tables will be generated at the first run */
+
+#define FIXED_TABLES
+
+#ifndef FIXED_TABLES
+
+/* forward S-box & tables */
+
+uint32 FSb[256];
+uint32 FT0[256];
+uint32 FT1[256];
+uint32 FT2[256];
+uint32 FT3[256];
+
+/* reverse S-box & tables */
+
+uint32 RSb[256];
+uint32 RT0[256];
+uint32 RT1[256];
+uint32 RT2[256];
+uint32 RT3[256];
+
+/* round constants */
+
+uint32 RCON[10];
+
+/* tables generation flag */
+
+int do_init = 1;
+
+/* tables generation routine */
+
+#define ROTR8(x) ( ( ( x << 24 ) & 0xFFFFFFFF ) | \
+ ( ( x & 0xFFFFFFFF ) >> 8 ) )
+
+#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
+#define MUL(x,y) ( ( x && y ) ? pow[(log[x] + log[y]) % 255] : 0 )
+
+void aes_gen_tables( void )
+{
+ int i;
+ uint8 x, y;
+ uint8 pow[256];
+ uint8 log[256];
+
+ /* compute pow and log tables over GF(2^8) */
+
+ for( i = 0, x = 1; i < 256; i++, x ^= XTIME( x ) )
+ {
+ pow[i] = x;
+ log[x] = i;
+ }
+
+ /* calculate the round constants */
+
+ for( i = 0, x = 1; i < 10; i++, x = XTIME( x ) )
+ {
+ RCON[i] = (uint32) x << 24;
+ }
+
+ /* generate the forward and reverse S-boxes */
+
+ FSb[0x00] = 0x63;
+ RSb[0x63] = 0x00;
+
+ for( i = 1; i < 256; i++ )
+ {
+ x = pow[255 - log[i]];
+
+ y = x; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y ^ 0x63;
+
+ FSb[i] = x;
+ RSb[x] = i;
+ }
+
+ /* generate the forward and reverse tables */
+
+ for( i = 0; i < 256; i++ )
+ {
+ x = (unsigned char) FSb[i]; y = XTIME( x );
+
+ FT0[i] = (uint32) ( x ^ y ) ^
+ ( (uint32) x << 8 ) ^
+ ( (uint32) x << 16 ) ^
+ ( (uint32) y << 24 );
+
+ FT0[i] &= 0xFFFFFFFF;
+
+ FT1[i] = ROTR8( FT0[i] );
+ FT2[i] = ROTR8( FT1[i] );
+ FT3[i] = ROTR8( FT2[i] );
+
+ y = (unsigned char) RSb[i];
+
+ RT0[i] = ( (uint32) MUL( 0x0B, y ) ) ^
+ ( (uint32) MUL( 0x0D, y ) << 8 ) ^
+ ( (uint32) MUL( 0x09, y ) << 16 ) ^
+ ( (uint32) MUL( 0x0E, y ) << 24 );
+
+ RT0[i] &= 0xFFFFFFFF;
+
+ RT1[i] = ROTR8( RT0[i] );
+ RT2[i] = ROTR8( RT1[i] );
+ RT3[i] = ROTR8( RT2[i] );
+ }
+}
+
+#else
+
+/* forward S-box */
+
+static const uint32 FSb[256] =
+{
+ 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
+ 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
+ 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
+ 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
+ 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
+ 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
+ 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
+ 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
+ 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
+ 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
+ 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
+ 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
+ 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
+ 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
+ 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
+ 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
+ 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
+};
+
+/* forward tables */
+
+#define FT \
+\
+ V(C6,63,63,A5), V(F8,7C,7C,84), V(EE,77,77,99), V(F6,7B,7B,8D), \
+ V(FF,F2,F2,0D), V(D6,6B,6B,BD), V(DE,6F,6F,B1), V(91,C5,C5,54), \
+ V(60,30,30,50), V(02,01,01,03), V(CE,67,67,A9), V(56,2B,2B,7D), \
+ V(E7,FE,FE,19), V(B5,D7,D7,62), V(4D,AB,AB,E6), V(EC,76,76,9A), \
+ V(8F,CA,CA,45), V(1F,82,82,9D), V(89,C9,C9,40), V(FA,7D,7D,87), \
+ V(EF,FA,FA,15), V(B2,59,59,EB), V(8E,47,47,C9), V(FB,F0,F0,0B), \
+ V(41,AD,AD,EC), V(B3,D4,D4,67), V(5F,A2,A2,FD), V(45,AF,AF,EA), \
+ V(23,9C,9C,BF), V(53,A4,A4,F7), V(E4,72,72,96), V(9B,C0,C0,5B), \
+ V(75,B7,B7,C2), V(E1,FD,FD,1C), V(3D,93,93,AE), V(4C,26,26,6A), \
+ V(6C,36,36,5A), V(7E,3F,3F,41), V(F5,F7,F7,02), V(83,CC,CC,4F), \
+ V(68,34,34,5C), V(51,A5,A5,F4), V(D1,E5,E5,34), V(F9,F1,F1,08), \
+ V(E2,71,71,93), V(AB,D8,D8,73), V(62,31,31,53), V(2A,15,15,3F), \
+ V(08,04,04,0C), V(95,C7,C7,52), V(46,23,23,65), V(9D,C3,C3,5E), \
+ V(30,18,18,28), V(37,96,96,A1), V(0A,05,05,0F), V(2F,9A,9A,B5), \
+ V(0E,07,07,09), V(24,12,12,36), V(1B,80,80,9B), V(DF,E2,E2,3D), \
+ V(CD,EB,EB,26), V(4E,27,27,69), V(7F,B2,B2,CD), V(EA,75,75,9F), \
+ V(12,09,09,1B), V(1D,83,83,9E), V(58,2C,2C,74), V(34,1A,1A,2E), \
+ V(36,1B,1B,2D), V(DC,6E,6E,B2), V(B4,5A,5A,EE), V(5B,A0,A0,FB), \
+ V(A4,52,52,F6), V(76,3B,3B,4D), V(B7,D6,D6,61), V(7D,B3,B3,CE), \
+ V(52,29,29,7B), V(DD,E3,E3,3E), V(5E,2F,2F,71), V(13,84,84,97), \
+ V(A6,53,53,F5), V(B9,D1,D1,68), V(00,00,00,00), V(C1,ED,ED,2C), \
+ V(40,20,20,60), V(E3,FC,FC,1F), V(79,B1,B1,C8), V(B6,5B,5B,ED), \
+ V(D4,6A,6A,BE), V(8D,CB,CB,46), V(67,BE,BE,D9), V(72,39,39,4B), \
+ V(94,4A,4A,DE), V(98,4C,4C,D4), V(B0,58,58,E8), V(85,CF,CF,4A), \
+ V(BB,D0,D0,6B), V(C5,EF,EF,2A), V(4F,AA,AA,E5), V(ED,FB,FB,16), \
+ V(86,43,43,C5), V(9A,4D,4D,D7), V(66,33,33,55), V(11,85,85,94), \
+ V(8A,45,45,CF), V(E9,F9,F9,10), V(04,02,02,06), V(FE,7F,7F,81), \
+ V(A0,50,50,F0), V(78,3C,3C,44), V(25,9F,9F,BA), V(4B,A8,A8,E3), \
+ V(A2,51,51,F3), V(5D,A3,A3,FE), V(80,40,40,C0), V(05,8F,8F,8A), \
+ V(3F,92,92,AD), V(21,9D,9D,BC), V(70,38,38,48), V(F1,F5,F5,04), \
+ V(63,BC,BC,DF), V(77,B6,B6,C1), V(AF,DA,DA,75), V(42,21,21,63), \
+ V(20,10,10,30), V(E5,FF,FF,1A), V(FD,F3,F3,0E), V(BF,D2,D2,6D), \
+ V(81,CD,CD,4C), V(18,0C,0C,14), V(26,13,13,35), V(C3,EC,EC,2F), \
+ V(BE,5F,5F,E1), V(35,97,97,A2), V(88,44,44,CC), V(2E,17,17,39), \
+ V(93,C4,C4,57), V(55,A7,A7,F2), V(FC,7E,7E,82), V(7A,3D,3D,47), \
+ V(C8,64,64,AC), V(BA,5D,5D,E7), V(32,19,19,2B), V(E6,73,73,95), \
+ V(C0,60,60,A0), V(19,81,81,98), V(9E,4F,4F,D1), V(A3,DC,DC,7F), \
+ V(44,22,22,66), V(54,2A,2A,7E), V(3B,90,90,AB), V(0B,88,88,83), \
+ V(8C,46,46,CA), V(C7,EE,EE,29), V(6B,B8,B8,D3), V(28,14,14,3C), \
+ V(A7,DE,DE,79), V(BC,5E,5E,E2), V(16,0B,0B,1D), V(AD,DB,DB,76), \
+ V(DB,E0,E0,3B), V(64,32,32,56), V(74,3A,3A,4E), V(14,0A,0A,1E), \
+ V(92,49,49,DB), V(0C,06,06,0A), V(48,24,24,6C), V(B8,5C,5C,E4), \
+ V(9F,C2,C2,5D), V(BD,D3,D3,6E), V(43,AC,AC,EF), V(C4,62,62,A6), \
+ V(39,91,91,A8), V(31,95,95,A4), V(D3,E4,E4,37), V(F2,79,79,8B), \
+ V(D5,E7,E7,32), V(8B,C8,C8,43), V(6E,37,37,59), V(DA,6D,6D,B7), \
+ V(01,8D,8D,8C), V(B1,D5,D5,64), V(9C,4E,4E,D2), V(49,A9,A9,E0), \
+ V(D8,6C,6C,B4), V(AC,56,56,FA), V(F3,F4,F4,07), V(CF,EA,EA,25), \
+ V(CA,65,65,AF), V(F4,7A,7A,8E), V(47,AE,AE,E9), V(10,08,08,18), \
+ V(6F,BA,BA,D5), V(F0,78,78,88), V(4A,25,25,6F), V(5C,2E,2E,72), \
+ V(38,1C,1C,24), V(57,A6,A6,F1), V(73,B4,B4,C7), V(97,C6,C6,51), \
+ V(CB,E8,E8,23), V(A1,DD,DD,7C), V(E8,74,74,9C), V(3E,1F,1F,21), \
+ V(96,4B,4B,DD), V(61,BD,BD,DC), V(0D,8B,8B,86), V(0F,8A,8A,85), \
+ V(E0,70,70,90), V(7C,3E,3E,42), V(71,B5,B5,C4), V(CC,66,66,AA), \
+ V(90,48,48,D8), V(06,03,03,05), V(F7,F6,F6,01), V(1C,0E,0E,12), \
+ V(C2,61,61,A3), V(6A,35,35,5F), V(AE,57,57,F9), V(69,B9,B9,D0), \
+ V(17,86,86,91), V(99,C1,C1,58), V(3A,1D,1D,27), V(27,9E,9E,B9), \
+ V(D9,E1,E1,38), V(EB,F8,F8,13), V(2B,98,98,B3), V(22,11,11,33), \
+ V(D2,69,69,BB), V(A9,D9,D9,70), V(07,8E,8E,89), V(33,94,94,A7), \
+ V(2D,9B,9B,B6), V(3C,1E,1E,22), V(15,87,87,92), V(C9,E9,E9,20), \
+ V(87,CE,CE,49), V(AA,55,55,FF), V(50,28,28,78), V(A5,DF,DF,7A), \
+ V(03,8C,8C,8F), V(59,A1,A1,F8), V(09,89,89,80), V(1A,0D,0D,17), \
+ V(65,BF,BF,DA), V(D7,E6,E6,31), V(84,42,42,C6), V(D0,68,68,B8), \
+ V(82,41,41,C3), V(29,99,99,B0), V(5A,2D,2D,77), V(1E,0F,0F,11), \
+ V(7B,B0,B0,CB), V(A8,54,54,FC), V(6D,BB,BB,D6), V(2C,16,16,3A)
+
+#define V(a,b,c,d) 0x##a##b##c##d
+static const uint32 FT0[256] = { FT };
+#undef V
+
+#define V(a,b,c,d) 0x##d##a##b##c
+static const uint32 FT1[256] = { FT };
+#undef V
+
+#define V(a,b,c,d) 0x##c##d##a##b
+static const uint32 FT2[256] = { FT };
+#undef V
+
+#define V(a,b,c,d) 0x##b##c##d##a
+static const uint32 FT3[256] = { FT };
+#undef V
+
+#undef FT
+
+/* reverse S-box */
+
+static const uint32 RSb[256] =
+{
+ 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
+ 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
+ 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
+ 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
+ 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
+ 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
+ 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
+ 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
+ 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
+ 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
+ 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
+ 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
+ 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
+ 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
+ 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
+ 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
+};
+
+/* reverse tables */
+
+#define RT \
+\
+ V(51,F4,A7,50), V(7E,41,65,53), V(1A,17,A4,C3), V(3A,27,5E,96), \
+ V(3B,AB,6B,CB), V(1F,9D,45,F1), V(AC,FA,58,AB), V(4B,E3,03,93), \
+ V(20,30,FA,55), V(AD,76,6D,F6), V(88,CC,76,91), V(F5,02,4C,25), \
+ V(4F,E5,D7,FC), V(C5,2A,CB,D7), V(26,35,44,80), V(B5,62,A3,8F), \
+ V(DE,B1,5A,49), V(25,BA,1B,67), V(45,EA,0E,98), V(5D,FE,C0,E1), \
+ V(C3,2F,75,02), V(81,4C,F0,12), V(8D,46,97,A3), V(6B,D3,F9,C6), \
+ V(03,8F,5F,E7), V(15,92,9C,95), V(BF,6D,7A,EB), V(95,52,59,DA), \
+ V(D4,BE,83,2D), V(58,74,21,D3), V(49,E0,69,29), V(8E,C9,C8,44), \
+ V(75,C2,89,6A), V(F4,8E,79,78), V(99,58,3E,6B), V(27,B9,71,DD), \
+ V(BE,E1,4F,B6), V(F0,88,AD,17), V(C9,20,AC,66), V(7D,CE,3A,B4), \
+ V(63,DF,4A,18), V(E5,1A,31,82), V(97,51,33,60), V(62,53,7F,45), \
+ V(B1,64,77,E0), V(BB,6B,AE,84), V(FE,81,A0,1C), V(F9,08,2B,94), \
+ V(70,48,68,58), V(8F,45,FD,19), V(94,DE,6C,87), V(52,7B,F8,B7), \
+ V(AB,73,D3,23), V(72,4B,02,E2), V(E3,1F,8F,57), V(66,55,AB,2A), \
+ V(B2,EB,28,07), V(2F,B5,C2,03), V(86,C5,7B,9A), V(D3,37,08,A5), \
+ V(30,28,87,F2), V(23,BF,A5,B2), V(02,03,6A,BA), V(ED,16,82,5C), \
+ V(8A,CF,1C,2B), V(A7,79,B4,92), V(F3,07,F2,F0), V(4E,69,E2,A1), \
+ V(65,DA,F4,CD), V(06,05,BE,D5), V(D1,34,62,1F), V(C4,A6,FE,8A), \
+ V(34,2E,53,9D), V(A2,F3,55,A0), V(05,8A,E1,32), V(A4,F6,EB,75), \
+ V(0B,83,EC,39), V(40,60,EF,AA), V(5E,71,9F,06), V(BD,6E,10,51), \
+ V(3E,21,8A,F9), V(96,DD,06,3D), V(DD,3E,05,AE), V(4D,E6,BD,46), \
+ V(91,54,8D,B5), V(71,C4,5D,05), V(04,06,D4,6F), V(60,50,15,FF), \
+ V(19,98,FB,24), V(D6,BD,E9,97), V(89,40,43,CC), V(67,D9,9E,77), \
+ V(B0,E8,42,BD), V(07,89,8B,88), V(E7,19,5B,38), V(79,C8,EE,DB), \
+ V(A1,7C,0A,47), V(7C,42,0F,E9), V(F8,84,1E,C9), V(00,00,00,00), \
+ V(09,80,86,83), V(32,2B,ED,48), V(1E,11,70,AC), V(6C,5A,72,4E), \
+ V(FD,0E,FF,FB), V(0F,85,38,56), V(3D,AE,D5,1E), V(36,2D,39,27), \
+ V(0A,0F,D9,64), V(68,5C,A6,21), V(9B,5B,54,D1), V(24,36,2E,3A), \
+ V(0C,0A,67,B1), V(93,57,E7,0F), V(B4,EE,96,D2), V(1B,9B,91,9E), \
+ V(80,C0,C5,4F), V(61,DC,20,A2), V(5A,77,4B,69), V(1C,12,1A,16), \
+ V(E2,93,BA,0A), V(C0,A0,2A,E5), V(3C,22,E0,43), V(12,1B,17,1D), \
+ V(0E,09,0D,0B), V(F2,8B,C7,AD), V(2D,B6,A8,B9), V(14,1E,A9,C8), \
+ V(57,F1,19,85), V(AF,75,07,4C), V(EE,99,DD,BB), V(A3,7F,60,FD), \
+ V(F7,01,26,9F), V(5C,72,F5,BC), V(44,66,3B,C5), V(5B,FB,7E,34), \
+ V(8B,43,29,76), V(CB,23,C6,DC), V(B6,ED,FC,68), V(B8,E4,F1,63), \
+ V(D7,31,DC,CA), V(42,63,85,10), V(13,97,22,40), V(84,C6,11,20), \
+ V(85,4A,24,7D), V(D2,BB,3D,F8), V(AE,F9,32,11), V(C7,29,A1,6D), \
+ V(1D,9E,2F,4B), V(DC,B2,30,F3), V(0D,86,52,EC), V(77,C1,E3,D0), \
+ V(2B,B3,16,6C), V(A9,70,B9,99), V(11,94,48,FA), V(47,E9,64,22), \
+ V(A8,FC,8C,C4), V(A0,F0,3F,1A), V(56,7D,2C,D8), V(22,33,90,EF), \
+ V(87,49,4E,C7), V(D9,38,D1,C1), V(8C,CA,A2,FE), V(98,D4,0B,36), \
+ V(A6,F5,81,CF), V(A5,7A,DE,28), V(DA,B7,8E,26), V(3F,AD,BF,A4), \
+ V(2C,3A,9D,E4), V(50,78,92,0D), V(6A,5F,CC,9B), V(54,7E,46,62), \
+ V(F6,8D,13,C2), V(90,D8,B8,E8), V(2E,39,F7,5E), V(82,C3,AF,F5), \
+ V(9F,5D,80,BE), V(69,D0,93,7C), V(6F,D5,2D,A9), V(CF,25,12,B3), \
+ V(C8,AC,99,3B), V(10,18,7D,A7), V(E8,9C,63,6E), V(DB,3B,BB,7B), \
+ V(CD,26,78,09), V(6E,59,18,F4), V(EC,9A,B7,01), V(83,4F,9A,A8), \
+ V(E6,95,6E,65), V(AA,FF,E6,7E), V(21,BC,CF,08), V(EF,15,E8,E6), \
+ V(BA,E7,9B,D9), V(4A,6F,36,CE), V(EA,9F,09,D4), V(29,B0,7C,D6), \
+ V(31,A4,B2,AF), V(2A,3F,23,31), V(C6,A5,94,30), V(35,A2,66,C0), \
+ V(74,4E,BC,37), V(FC,82,CA,A6), V(E0,90,D0,B0), V(33,A7,D8,15), \
+ V(F1,04,98,4A), V(41,EC,DA,F7), V(7F,CD,50,0E), V(17,91,F6,2F), \
+ V(76,4D,D6,8D), V(43,EF,B0,4D), V(CC,AA,4D,54), V(E4,96,04,DF), \
+ V(9E,D1,B5,E3), V(4C,6A,88,1B), V(C1,2C,1F,B8), V(46,65,51,7F), \
+ V(9D,5E,EA,04), V(01,8C,35,5D), V(FA,87,74,73), V(FB,0B,41,2E), \
+ V(B3,67,1D,5A), V(92,DB,D2,52), V(E9,10,56,33), V(6D,D6,47,13), \
+ V(9A,D7,61,8C), V(37,A1,0C,7A), V(59,F8,14,8E), V(EB,13,3C,89), \
+ V(CE,A9,27,EE), V(B7,61,C9,35), V(E1,1C,E5,ED), V(7A,47,B1,3C), \
+ V(9C,D2,DF,59), V(55,F2,73,3F), V(18,14,CE,79), V(73,C7,37,BF), \
+ V(53,F7,CD,EA), V(5F,FD,AA,5B), V(DF,3D,6F,14), V(78,44,DB,86), \
+ V(CA,AF,F3,81), V(B9,68,C4,3E), V(38,24,34,2C), V(C2,A3,40,5F), \
+ V(16,1D,C3,72), V(BC,E2,25,0C), V(28,3C,49,8B), V(FF,0D,95,41), \
+ V(39,A8,01,71), V(08,0C,B3,DE), V(D8,B4,E4,9C), V(64,56,C1,90), \
+ V(7B,CB,84,61), V(D5,32,B6,70), V(48,6C,5C,74), V(D0,B8,57,42)
+
+#define V(a,b,c,d) 0x##a##b##c##d
+static const uint32 RT0[256] = { RT };
+#undef V
+
+#define V(a,b,c,d) 0x##d##a##b##c
+static const uint32 RT1[256] = { RT };
+#undef V
+
+#define V(a,b,c,d) 0x##c##d##a##b
+static const uint32 RT2[256] = { RT };
+#undef V
+
+#define V(a,b,c,d) 0x##b##c##d##a
+static const uint32 RT3[256] = { RT };
+#undef V
+
+#undef RT
+
+/* round constants */
+
+static const uint32 RCON[10] =
+{
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000
+};
+
+int do_init = 0;
+
+void aes_gen_tables( void )
+{
+}
+
+#endif
+
+/* platform-independant 32-bit integer manipulation macros */
+
+#define GET_UINT32_aes(n,b,i) \
+{ \
+ (n) = ( (uint32) (b)[(i) ] << 24 ) \
+ | ( (uint32) (b)[(i) + 1] << 16 ) \
+ | ( (uint32) (b)[(i) + 2] << 8 ) \
+ | ( (uint32) (b)[(i) + 3] ); \
+}
+
+#define PUT_UINT32_aes(n,b,i) \
+{ \
+ (b)[(i) ] = (uint8) ( (n) >> 24 ); \
+ (b)[(i) + 1] = (uint8) ( (n) >> 16 ); \
+ (b)[(i) + 2] = (uint8) ( (n) >> 8 ); \
+ (b)[(i) + 3] = (uint8) ( (n) ); \
+}
+
+/* decryption key schedule tables */
+
+int KT_init = 1;
+
+uint32 KT0[256];
+uint32 KT1[256];
+uint32 KT2[256];
+uint32 KT3[256];
+
+/* AES key scheduling routine */
+int aes_set_key( aes_context *ctx, uint8 *key, int nbits )
+{
+ int i;
+ uint32 *RK, *SK;
+
+ if( do_init )
+ {
+ aes_gen_tables();
+
+ do_init = 0;
+ }
+
+ switch( nbits )
+ {
+ case 128: ctx->nr = 10; break;
+ case 192: ctx->nr = 12; break;
+ case 256: ctx->nr = 14; break;
+ default : return( 1 );
+ }
+
+ RK = ctx->erk;
+
+ for( i = 0; i < (nbits >> 5); i++ )
+ {
+ GET_UINT32_aes( RK[i], key, i * 4 );
+ }
+
+ /* setup encryption round keys */
+
+ switch( nbits )
+ {
+ case 128:
+
+ for( i = 0; i < 10; i++, RK += 4 )
+ {
+ RK[4] = RK[0] ^ RCON[i] ^
+ ( FSb[ (uint8) ( RK[3] >> 16 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[3] >> 8 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[3] ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[3] >> 24 ) ] );
+
+ RK[5] = RK[1] ^ RK[4];
+ RK[6] = RK[2] ^ RK[5];
+ RK[7] = RK[3] ^ RK[6];
+ }
+ break;
+
+ case 192:
+
+ for( i = 0; i < 8; i++, RK += 6 )
+ {
+ RK[6] = RK[0] ^ RCON[i] ^
+ ( FSb[ (uint8) ( RK[5] >> 16 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[5] >> 8 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[5] ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[5] >> 24 ) ] );
+
+ RK[7] = RK[1] ^ RK[6];
+ RK[8] = RK[2] ^ RK[7];
+ RK[9] = RK[3] ^ RK[8];
+ RK[10] = RK[4] ^ RK[9];
+ RK[11] = RK[5] ^ RK[10];
+ }
+ break;
+
+ case 256:
+
+ for( i = 0; i < 7; i++, RK += 8 )
+ {
+ RK[8] = RK[0] ^ RCON[i] ^
+ ( FSb[ (uint8) ( RK[7] >> 16 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[7] >> 8 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[7] ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[7] >> 24 ) ] );
+
+ RK[9] = RK[1] ^ RK[8];
+ RK[10] = RK[2] ^ RK[9];
+ RK[11] = RK[3] ^ RK[10];
+
+ RK[12] = RK[4] ^
+ ( FSb[ (uint8) ( RK[11] >> 24 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[11] >> 16 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[11] >> 8 ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[11] ) ] );
+
+ RK[13] = RK[5] ^ RK[12];
+ RK[14] = RK[6] ^ RK[13];
+ RK[15] = RK[7] ^ RK[14];
+ }
+ break;
+ }
+
+ /* setup decryption round keys */
+
+ if( KT_init )
+ {
+ for( i = 0; i < 256; i++ )
+ {
+ KT0[i] = RT0[ FSb[i] ];
+ KT1[i] = RT1[ FSb[i] ];
+ KT2[i] = RT2[ FSb[i] ];
+ KT3[i] = RT3[ FSb[i] ];
+ }
+
+ KT_init = 0;
+ }
+
+ SK = ctx->drk;
+
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+
+ for( i = 1; i < ctx->nr; i++ )
+ {
+ RK -= 8;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+ }
+
+ RK -= 8;
+
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+
+ return( 0 );
+}
diff --git a/board/aspeed/ast2300/ast2300.c b/board/aspeed/ast2300/ast2300.c
new file mode 100644
index 0000000..b317786
--- /dev/null
+++ b/board/aspeed/ast2300/ast2300.c
@@ -0,0 +1,171 @@
+/*
+ * 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
+ */
+
+#include <common.h>
+#include <command.h>
+#include <pci.h>
+
+int board_init (void)
+{
+ DECLARE_GLOBAL_DATA_PTR;
+ unsigned char data;
+ unsigned long reg;
+
+ /* AHB Controller */
+ *((volatile ulong*) 0x1E600000) = 0xAEED1A03; /* unlock AHB controller */
+ *((volatile ulong*) 0x1E60008C) |= 0x01; /* map DRAM to 0x00000000 */
+#ifdef CONFIG_PCI
+ *((volatile ulong*) 0x1E60008C) |= 0x30; /* map PCI */
+#endif
+
+ /* Flash Controller */
+#ifdef CONFIG_FLASH_AST2300
+ *((volatile ulong*) 0x1e620000) |= 0x800f0000; /* enable Flash Write */
+#else
+ *((volatile ulong*) 0x16000000) |= 0x00001c00; /* enable Flash Write */
+#endif
+
+ /* SCU */
+ *((volatile ulong*) 0x1e6e2000) = 0x1688A8A8; /* unlock SCU */
+ reg = *((volatile ulong*) 0x1e6e2008);
+ reg &= 0x1c0fffff;
+ reg |= 0x61800000; /* PCLK = HPLL/8 */
+#ifdef CONFIG_AST1070
+ reg |= 0x300000; /* LHCLK = HPLL/8 */
+ reg |= 0x80000; /* LPC Host Clock */
+#endif
+ *((volatile ulong*) 0x1e6e2008) = reg;
+ reg = *((volatile ulong*) 0x1e6e200c); /* enable 2D Clk */
+ *((volatile ulong*) 0x1e6e200c) &= 0xFFFFFFFD;
+/* enable wide screen. If your video driver does not support wide screen, don't
+enable this bit 0x1e6e2040 D[0]*/
+ reg = *((volatile ulong*) 0x1e6e2040);
+ *((volatile ulong*) 0x1e6e2040) |= 0x01;
+#ifdef CONFIG_AST1070
+/*set VPPL1 */
+
+ *((volatile ulong*) 0x1e6e201c) = 0x6420;
+
+// set d2-pll & enable d2-pll D[21:20], D[4]
+ reg = *((volatile ulong*) 0x1e6e202c);
+ reg &= 0xffcfffef;
+ reg |= 0x00200010;
+ *((volatile ulong*) 0x1e6e202c) = reg;
+
+// set OSCCLK = VPLL1
+ *((volatile ulong*) 0x1e6e2010) = 0x8;
+
+// enable OSCCLK
+ reg = *((volatile ulong*) 0x1e6e202c);
+ reg &= 0xfffffffd;
+ reg |= 0x00000002;
+ *((volatile ulong*) 0x1e6e202c) = reg;
+
+// enable AST1050's LPC master
+ reg = *((volatile ulong*) 0x1e7890a0);
+ *((volatile ulong*) 0x1e7890a0) |= 0x11;
+#endif
+ /* arch number */
+ gd->bd->bi_arch_number = MACH_TYPE_ASPEED;
+
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = 0x40000100;
+
+ return 0;
+}
+
+int dram_init (void)
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+ return 0;
+}
+
+/*
+SCU7C: Silicon Revision ID Register
+D[31:24]: Chip ID
+0: AST2050/AST2100/AST2150/AST2200/AST3000
+1: AST2300
+
+D[23:16] Silicon revision ID for AST2300 generation and later
+0: A0
+1: A1
+2: A2
+.
+.
+.
+FPGA revision starts from 0x80
+
+
+D[11:8] Bounding option
+
+D[7:0] Silicon revision ID for AST2050/AST2100 generation (for software compatible)
+0: A0
+1: A1
+2: A2
+3: A3
+.
+.
+FPGA revision starts from 0x08, 8~10 means A0, 11+ means A1, AST2300 should be assigned to 3
+*/
+int misc_init_r(void)
+{
+ unsigned int reg1, revision, chip_id;
+
+ /* Show H/W Version */
+ reg1 = (unsigned int) (*((ulong*) 0x1e6e207c));
+ chip_id = (reg1 & 0xff000000) >> 24;
+ revision = (reg1 & 0xff0000) >> 16;
+
+ puts ("H/W: ");
+ if (chip_id == 1) {
+ if (revision >= 0x80) {
+ printf("AST2300 series FPGA Rev. %02x \n", revision);
+ }
+ else {
+ printf("AST2300 series chip Rev. %02x \n", revision);
+ }
+ }
+ else if (chip_id == 0) {
+ printf("AST2050/AST2150 series chip\n");
+ }
+
+#ifdef CONFIG_AST1070
+ puts ("C/C: ");
+ revision = (unsigned int) (*((ulong*) 0x60002034));
+ printf("AST1070 ID [%08x] \n", revision);
+#endif
+
+#ifdef CONFIG_PCI
+ pci_init ();
+#endif
+
+ if (getenv ("verify") == NULL) {
+ setenv ("verify", "n");
+ }
+ if (getenv ("eeprom") == NULL) {
+ setenv ("eeprom", "y");
+ }
+}
+
+#ifdef CONFIG_PCI
+static struct pci_controller hose;
+
+extern void aspeed_init_pci (struct pci_controller *hose);
+
+void pci_init_board(void)
+{
+ aspeed_init_pci(&hose);
+}
+#endif
diff --git a/board/aspeed/ast2300/config.mk b/board/aspeed/ast2300/config.mk
new file mode 100755
index 0000000..24ca09b
--- /dev/null
+++ b/board/aspeed/ast2300/config.mk
@@ -0,0 +1,18 @@
+# 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
+#
+
+# ROM version
+#TEXT_BASE = 0xBFC00000
+
+# RAM version
+TEXT_BASE = 0x40500000
+#TEXT_BASE = 0x00000000
+#TEXT_BASE = 0x00400000
diff --git a/board/aspeed/ast2300/crc32.c b/board/aspeed/ast2300/crc32.c
new file mode 100755
index 0000000..cc8d2ac
--- /dev/null
+++ b/board/aspeed/ast2300/crc32.c
@@ -0,0 +1,127 @@
+/*
+ * 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
+ */
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/byteorder.h>
+#include <environment.h>
+
+#ifdef CONFIG_2SPIFLASH
+
+extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
+
+/* ========================================================================
+ * Table of CRC-32's of all single-byte values (made by make_aspeed_crc_table)
+ */
+unsigned long aspeed_crc_table[256] = {
+ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+ 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+ 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+ 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+ 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+ 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+ 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+ 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+ 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+ 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+ 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+ 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+ 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+ 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+ 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+ 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+ 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+ 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+ 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+ 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+ 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+ 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+ 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+ 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+ 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+ 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+ 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+ 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+ 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+ 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+ 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+ 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+ 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+ 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+ 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+ 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+ 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+ 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+ 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+ 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+ 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+ 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+ 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+ 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+ 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+ 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+ 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+ 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+ 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+ 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+ 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+ 0x2d02ef8dL
+};
+
+/* ========================================================================= */
+#define ASPEED_DO1(buf) crc = aspeed_crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
+#define ASPEED_DO2(buf) ASPEED_DO1(buf); ASPEED_DO1(buf);
+#define ASPEED_DO4(buf) ASPEED_DO2(buf); ASPEED_DO2(buf);
+#define ASPEED_DO8(buf) ASPEED_DO4(buf); ASPEED_DO4(buf);
+
+/* ========================================================================= */
+unsigned long spi2_crc32(crc, buf, len)
+ unsigned long crc;
+ unsigned char *buf;
+ unsigned long len;
+{
+
+ size_t len1, len2;
+ char *s;
+
+ len1 = len2 = 0;
+ if ( (ulong)(buf) <= (flash_info[0].start[0] + flash_info[0].size) )
+ len1 = (flash_info[0].start[0] + flash_info[0].size) - (ulong)(buf);
+
+ len1 = (len < len1) ? len:len1;
+ len2 = (len < len1) ? 0: (len - len1);
+
+ crc = crc ^ 0xffffffffL;
+ while (len1 >= 8)
+ {
+ ASPEED_DO8(buf);
+ len1 -= 8;
+ }
+ if (len1) do {
+ ASPEED_DO1(buf);
+ } while (--len1);
+
+ //s = (char *) flash_info[1].start[0];
+ s= (char *) flash_make_addr (&flash_info[1], 0, 0);
+ while (len2 >= 8)
+ {
+ ASPEED_DO8(s);
+ len2 -= 8;
+ }
+ if (len2) do {
+ ASPEED_DO1(s);
+ } while (--len2);
+
+ return crc ^ 0xffffffffL;
+
+}
+
+#endif /* CONFIG_2SPIFLASH */
+
diff --git a/board/aspeed/ast2300/crt.c b/board/aspeed/ast2300/crt.c
new file mode 100755
index 0000000..b67f669
--- /dev/null
+++ b/board/aspeed/ast2300/crt.c
@@ -0,0 +1,322 @@
+/*
+ * 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
+ */
+#include <common.h>
+#include <command.h>
+
+#include "type.h"
+#include "vesa.h"
+#include "vdef.h"
+#include "vfun.h"
+#include "vreg.h"
+#include "crt.h"
+
+ULONG AST3000DCLKTableV [] = {
+ 0x00046515, /* 00: VCLK25_175 */
+ 0x00047255, /* 01: VCLK28_322 */
+ 0x0004682a, /* 02: VCLK31_5 */
+ 0x0004672a, /* 03: VCLK36 */
+ 0x00046c50, /* 04: VCLK40 */
+ 0x00046842, /* 05: VCLK49_5 */
+ 0x00006c32, /* 06: VCLK50 */
+ 0x00006a2f, /* 07: VCLK56_25 */
+ 0x00006c41, /* 08: VCLK65 */
+ 0x00006832, /* 09: VCLK75 */
+ 0x0000672e, /* 0A: VCLK78_75 */
+ 0x0000683f, /* 0B: VCLK94_5 */
+ 0x00004824, /* 0C: VCLK108 */
+ 0x00004723, /* 0D: VCLK119 */
+ 0x0000482d, /* 0E: VCLK135 */
+ 0x00004B37, /* 0F: VCLK146_25 */
+ 0x0000472e, /* 10: VCLK157_5 */
+ 0x00004836, /* 11: VCLK162 */
+
+};
+
+BOOL CheckDAC(int nCRTIndex)
+{
+ BYTE btValue;
+ BOOL bValue;
+
+ BYTE btDeviceSelect;
+
+ switch (nCRTIndex)
+ {
+ case CRT_1:
+ btDeviceSelect = DEVICE_ADDRESS_CH7301_CRT1;
+ break;
+ case CRT_2:
+ btDeviceSelect = DEVICE_ADDRESS_CH7301_CRT2;
+ break;
+ default:
+ printf("CRTIndex is not 1 or 2");
+ return FALSE;
+ break;
+ }
+
+ //Enable all DAC's and set register 21h[0] = '0'
+ //DVIP and DVIL disable for DAC
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_PM_REG, 0x00);
+
+ btValue = GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_DC_REG);
+ btValue = btValue & 0xFE;
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_DC_REG, btValue);
+
+ //Set SENSE bit to 1
+ btValue = GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG);
+ btValue = btValue | 0x01;
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG, btValue);
+
+ //Reset SENSE bit to 0
+ btValue = GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG);
+ btValue = btValue & 0xFE;
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG, btValue);
+
+ bValue = (GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG) & CD_DACT) ? TRUE : FALSE;
+
+ return bValue;
+}
+
+VOID SetCH7301C(ULONG MMIOBase,
+ int nCRTIndex,
+ int inFreqRange,
+ int inOperating)
+{
+ BYTE btDeviceSelect;
+ BYTE btValue;
+
+//#ifdef EVB_CLIENT
+ //output RGB doesn't need to set CH7301
+ //if (1 == inOperating)
+ // return;
+//#endif
+
+ switch (nCRTIndex)
+ {
+ case CRT_1:
+ btDeviceSelect = 0xEA;
+
+ break;
+ case CRT_2:
+ btDeviceSelect = 0xEC;
+
+ break;
+ default:
+ printf("CRTIndex is not 1 or 2");
+ return;
+ break;
+ }
+
+ if (inFreqRange <= VCLK65)
+ {
+ printf("ch7301: low f \n");
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x33, 0x08);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x34, 0x16);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x36, 0x60);
+ }
+ else
+ {
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x33, 0x06);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x34, 0x26);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x36, 0xA0);
+ }
+
+ switch (inOperating)
+ {
+ case 0:
+ //DVI is normal function
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x49, 0xC0);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x1D, 0x47);
+ break;
+ case 1:
+ //RGB
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x48, 0x18);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x49, 0x0);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x56, 0x0);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x21, 0x9);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x1D, 0x48);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x1C, 0x00);
+ break;
+ default:
+ break;
+ };
+}
+
+void SetASTModeTiming (ULONG MMIOBase, int nCRTIndex, BYTE ModeIndex, BYTE ColorDepth)
+{
+ ULONG temp, RetraceStart, RetraceEnd, DisplayOffset, TerminalCount, bpp;
+
+// Access CRT Engine
+ // SetPolarity
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, ((vModeTable[ModeIndex].HorPolarity << HOR_SYNC_SELECT_BIT) | (vModeTable[ModeIndex].VerPolarity << VER_SYNC_SELECT_BIT)), (HOR_SYNC_SELECT_MASK|VER_SYNC_SELECT_MASK));
+
+#if CONFIG_AST3000
+ WriteMemoryLongClient(SCU_BASE, CRT1_CONTROL2_REG + nCRTIndex*0x60, 0xc0);
+#else
+ //2100 is single edge
+ WriteMemoryLongClient(SCU_BASE, CRT1_CONTROL2_REG + nCRTIndex*0x60, 0x80);
+#endif
+ // Horizontal Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].HorizontalActive - 1) << HOR_ENABLE_END_BIT) | ((vModeTable[ModeIndex].HorizontalTotal - 1) << HOR_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ RetraceStart = vModeTable[ModeIndex].HorizontalTotal - vModeTable[ModeIndex].HBackPorch - vModeTable[ModeIndex].HSyncTime - vModeTable[ModeIndex].HLeftBorder - 1;
+ RetraceEnd = (RetraceStart + vModeTable[ModeIndex].HSyncTime);
+ temp = 0;
+ temp = (RetraceEnd << HOR_RETRACE_END_BIT) | (RetraceStart << HOR_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Vertical Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].VerticalActive - 1) << VER_ENABLE_END_BIT) | ((vModeTable[ModeIndex].VerticalTotal - 1) << VER_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ temp = 0;
+ RetraceStart = vModeTable[ModeIndex].VerticalTotal - vModeTable[ModeIndex].VBackPorch - vModeTable[ModeIndex].VSyncTime - vModeTable[ModeIndex].VTopBorder - 1;
+ RetraceEnd = (RetraceStart + vModeTable[ModeIndex].VSyncTime);
+ temp = (RetraceEnd << VER_RETRACE_END_BIT) | (RetraceStart << VER_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Set CRT Display Offset and Terminal Count
+ if (ColorDepth == RGB_565) {
+ bpp = 16;
+ }
+ else {
+ bpp = 32;
+ }
+
+ DisplayOffset = vModeTable[ModeIndex].HorizontalActive * bpp / 8;
+ TerminalCount = vModeTable[ModeIndex].HorizontalActive * bpp / 64;
+ if (ColorDepth == YUV_444) {
+ TerminalCount = TerminalCount * 3 / 4;
+ }
+ if (((vModeTable[ModeIndex].HorizontalActive * bpp) % 64) != 0) {
+ TerminalCount++;
+ }
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_DISPLAY_OFFSET + nCRTIndex*0x60, ((TerminalCount << TERMINAL_COUNT_BIT) | DisplayOffset));
+
+ // Set Color Format
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, (ColorDepth << FORMAT_SELECT_BIT), FORMAT_SELECT_MASK);
+
+ // Set Threshold
+ temp = 0;
+ temp = (CRT_HIGH_THRESHOLD_VALUE << THRES_HIGHT_BIT) | (CRT_LOW_THRESHOLD_VALUE << THRES_LOW_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_THRESHOLD_REG + nCRTIndex*0x60, temp);
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_VIDEO_PLL_REG + nCRTIndex*0x60, AST3000DCLKTableV[vModeTable[ModeIndex].PixelClock]);
+}
+
+void SetASTCenter1024ModeTiming (ULONG MMIOBase, int nCRTIndex, BYTE ModeIndex, BYTE ColorDepth)
+{
+ ULONG temp, RetraceStart, RetraceEnd, DisplayOffset, TerminalCount, bpp;
+
+ // Access CRT Engine
+ // SetPolarity
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, (HOR_NEGATIVE << HOR_SYNC_SELECT_BIT) | (VER_NEGATIVE << VER_SYNC_SELECT_BIT), HOR_SYNC_SELECT_MASK|VER_SYNC_SELECT_MASK);
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_CONTROL2_REG + nCRTIndex*0x60, 0xC0);
+
+ // Horizontal Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].HorizontalActive - 1) << HOR_ENABLE_END_BIT) | ((vModeTable[10].HorizontalTotal - 1) << HOR_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ RetraceStart = vModeTable[10].HorizontalTotal - vModeTable[10].HBackPorch - vModeTable[10].HSyncTime - vModeTable[10].HLeftBorder - 1;
+ RetraceStart = RetraceStart - (vModeTable[10].HorizontalActive - vModeTable[ModeIndex].HorizontalActive) / 2 - 1;
+ RetraceEnd = (RetraceStart + vModeTable[10].HSyncTime);
+ temp = 0;
+ temp = (RetraceEnd << HOR_RETRACE_END_BIT) | (RetraceStart << HOR_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Vertical Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].VerticalActive - 1) << VER_ENABLE_END_BIT) | ((vModeTable[10].VerticalTotal - 1) << VER_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ RetraceStart = vModeTable[10].VerticalTotal - vModeTable[10].VBackPorch - vModeTable[10].VSyncTime - vModeTable[10].VTopBorder - 1;
+ RetraceStart = RetraceStart - (vModeTable[10].VerticalActive - vModeTable[ModeIndex].VerticalActive) / 2 - 1;
+ RetraceEnd = (RetraceStart + vModeTable[10].VSyncTime);
+ temp = (RetraceEnd << VER_RETRACE_END_BIT) | (RetraceStart << VER_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Set CRT Display Offset and Terminal Count
+ if (ColorDepth == RGB_565) {
+ bpp = 16;
+ }
+ else {
+ bpp = 32;
+ }
+ DisplayOffset = vModeTable[ModeIndex].HorizontalActive * bpp / 8;
+ TerminalCount = vModeTable[ModeIndex].HorizontalActive * bpp / 64;
+ if (ColorDepth == YUV_444) {
+ TerminalCount = TerminalCount * 3 / 4;
+ }
+ if (((vModeTable[ModeIndex].HorizontalActive * bpp) % 64) != 0) {
+ TerminalCount++;
+ }
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_DISPLAY_OFFSET + nCRTIndex*0x60, (TerminalCount << TERMINAL_COUNT_BIT) | DisplayOffset);
+
+ // Set Color Format
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, (ColorDepth << FORMAT_SELECT_BIT), FORMAT_SELECT_MASK);
+
+ // Set Threshold
+ temp = 0;
+ temp = (CRT_HIGH_THRESHOLD_VALUE << THRES_HIGHT_BIT) | (CRT_LOW_THRESHOLD_VALUE << THRES_LOW_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_THRESHOLD_REG + nCRTIndex*0x60, temp);
+
+ // Set DCLK
+ WriteMemoryLongClient(SCU_BASE, CRT1_VIDEO_PLL_REG + nCRTIndex*0x60, AST3000DCLKTableV[vModeTable[ModeIndex].PixelClock]);
+
+}
+
+BOOL ASTSetModeV (ULONG MMIOBase, int nCRTIndex, ULONG VGABaseAddr, USHORT Horizontal, USHORT Vertical, BYTE ColorFormat, BYTE CenterMode)
+{
+ BYTE i, ModeIndex;
+ BOOL bDAC;
+ ULONG ulTemp;
+
+ // Access CRT Engine
+ //Enable CRT1 graph
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + 0x60*nCRTIndex, GRAPH_DISPLAY_ON, GRAPH_DISPLAY_MASK);
+
+ // Set CRT Display Start Address
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_DISPLAY_ADDRESS + 0x60*nCRTIndex, VGABaseAddr, DISPLAY_ADDRESS_MASK);
+
+ for (i = 0; i < Mode60HZCount; i++) {
+ if ((vModeTable[i].HorizontalActive == Horizontal) && (vModeTable[i].VerticalActive == Vertical)) {
+
+ ModeIndex = i;
+
+ if (CenterMode != 1) {
+ SetASTModeTiming(MMIOBase, nCRTIndex, i, ColorFormat);
+ }
+ else {
+ SetASTCenter1024ModeTiming (MMIOBase, nCRTIndex, i, ColorFormat);
+ }
+
+ //use internal video out sigal and don't need use 7301
+ /*
+ bDAC = CheckDAC(nCRTIndex);
+
+ SetCH7301C(0,
+ nCRTIndex,
+ vModeTable[ModeIndex].PixelClock,
+ bDAC); //For RGB
+ */
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
diff --git a/board/aspeed/ast2300/crt.h b/board/aspeed/ast2300/crt.h
new file mode 100755
index 0000000..e7483be
--- /dev/null
+++ b/board/aspeed/ast2300/crt.h
@@ -0,0 +1,121 @@
+/*
+ * 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
+ */
+#ifndef _CRT_H_
+#define _CRT_H_
+
+#ifdef Watcom
+#define CRT_REMAP_OFFSET 0x10000
+#else
+#define CRT_REMAP_OFFSET 0x0
+#endif
+
+/********************************************************/
+/* CRT register */
+/********************************************************/
+#define CRT_BASE_OFFSET 0x6000+CRT_REMAP_OFFSET
+
+#define CRT1_CONTROL_REG 0x00 + CRT_BASE_OFFSET
+ #define GRAPH_DISPLAY_BIT 0
+ #define GRAPH_DISPLAY_MASK (1<<0)
+ #define GRAPH_DISPLAY_ON 1
+ #define GRAPH_DISPLAY_OFF 0
+ #define FORMAT_SELECT_BIT 8
+ #define FORMAT_SELECT_MASK (3<<8)
+ #define HOR_SYNC_SELECT_BIT 16
+ #define HOR_SYNC_SELECT_MASK (1<<16)
+ #define HOR_NEGATIVE 1
+ #define HOR_POSITIVE 0
+ #define VER_SYNC_SELECT_BIT 17
+ #define VER_SYNC_SELECT_MASK (1<<17)
+ #define VER_NEGATIVE 1
+ #define VER_POSITIVE 0
+
+#define CRT1_CONTROL2_REG 0x04 + CRT_BASE_OFFSET
+
+#define CRT1_VIDEO_PLL_REG 0x0C + CRT_BASE_OFFSET
+ #define POST_DIV_BIT 18
+ #define POST_DIV_MASK 3<<18
+ #define DIV_1_1 0
+ //#define DIV_1_2 1
+ #define DIV_1_2 2
+ #define DIV_1_4 3
+
+#define CRT1_HOR_TOTAL_END_REG 0x10 + CRT_BASE_OFFSET
+ #define HOR_TOTAL_BIT 0
+ #define HOR_ENABLE_END_BIT 16
+
+#define CRT1_HOR_RETRACE_REG 0x14 + CRT_BASE_OFFSET
+ #define HOR_RETRACE_START_BIT 0
+ #define HOR_RETRACE_END_BIT 16
+
+#define CRT1_VER_TOTAL_END_REG 0x18 + CRT_BASE_OFFSET
+ #define VER_TOTAL_BIT 0
+ #define VER_ENABLE_END_BIT 16
+
+#define CRT1_VER_RETRACE_REG 0x1C + CRT_BASE_OFFSET
+ #define VER_RETRACE_START_BIT 0
+ #define VER_RETRACE_END_BIT 16
+
+#define CRT1_DISPLAY_ADDRESS 0x20 + CRT_BASE_OFFSET
+ #define DISPLAY_ADDRESS_MASK 0x0FFFFFFF
+
+#define CRT1_DISPLAY_OFFSET 0x24 + CRT_BASE_OFFSET
+ #define DISPLAY_OFFSET_ALIGN 7 /* 8 byte alignment*/
+ #define TERMINAL_COUNT_BIT 16
+
+#define CRT1_THRESHOLD_REG 0x28 + CRT_BASE_OFFSET
+ #define THRES_LOW_BIT 0
+ #define THRES_HIGHT_BIT 8
+
+#define CURSOR_POSITION 0x30 + OFFSET
+#define CURSOR_OFFSET 0x34 + OFFSET
+#define CURSOR_PATTERN 0x38 + OFFSET
+#define OSD_HORIZONTAL 0x40 + OFFSET
+#define OSD_VERTICAL 0x44 + OFFSET
+#define OSD_PATTERN 0x48 + OFFSET
+#define OSD_OFFSET 0x4C + OFFSET
+#define OSD_THRESHOLD 0x50 + OFFSET
+
+//Ch7301c
+#define DEVICE_ADDRESS_CH7301_CRT1 0xEA
+#define DEVICE_ADDRESS_CH7301_CRT2 0xEC
+
+
+#define DEVICE_SELECT_CH7301 0x3
+
+/* CH7301 Register Definition */
+#define CH7301_CD_REG 0x20
+ #define CD_DACT 0x0E
+ #define CD_DVIT 1 << 5
+#define CH7301_DC_REG 0x21
+#define CH7301_PM_REG 0x49
+
+BOOL CheckHotPlug(int nCRTIndex);
+BOOL CheckDAC(int nCRTIndex);
+
+BOOL ASTSetModeV (ULONG MMIOBase,
+ int nCRTIndex,
+ ULONG VGABaseAddr,
+ USHORT Horizontal,
+ USHORT Vertical,
+ BYTE ColorFormat,
+ BYTE CenterMode);
+
+BOOL SelCRTClock(ULONG MMIOBase,
+ int nCRTIndex,
+ USHORT Horizontal,
+ USHORT Vertical);
+
+void DisableCRT(ULONG MMIOBase, int nCRTIndex);
+void ClearCRTWithBlack(ULONG ulCRTAddr, int iWidth, int iHeight);
+
+#endif /* _CRT_H_ */
+
diff --git a/board/aspeed/ast2300/flash.c b/board/aspeed/ast2300/flash.c
new file mode 100755
index 0000000..d611d0d
--- /dev/null
+++ b/board/aspeed/ast2300/flash.c
@@ -0,0 +1,1651 @@
+/*
+ * 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
+ *
+ * History
+ * 01/20/2004 - combined variants of original driver.
+ * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay)
+ * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud)
+ * 01/27/2004 - Little endian support Ed Okerson
+ *
+ * Tested Architectures
+ * Port Width Chip Width # of banks Flash Chip Board
+ * 32 16 1 28F128J3 seranoa/eagle
+ * 64 16 1 28F128J3 seranoa/falcon
+ */
+// (Sun) This CFI driver is written for fixed-width flash chips.
+// It was not designed for flexible 8-bit/16-bit chips, which are the norm.
+// When those chips are connected to a bus in 8-bit mode, the address wires
+// right-shifted by 1.
+//FIXME: Fix the driver to auto-detect "16-bit flash wired in 8-bit mode".
+// Left-shift CFI offsets by 1 bit instead of doubling the #define values.
+
+/* The DEBUG define must be before common to enable debugging */
+// (Sun) Changed to DEBUG_FLASH because flash debug()s are too numerous.
+// #define DEBUG
+
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/byteorder.h>
+#include <environment.h>
+#ifdef CONFIG_SYS_FLASH_CFI
+
+/*
+ * This file implements a Common Flash Interface (CFI) driver for U-Boot.
+ * The width of the port and the width of the chips are determined at initialization.
+ * These widths are used to calculate the address for access CFI data structures.
+ * It has been tested on an Intel Strataflash implementation and AMD 29F016D.
+ *
+ * References
+ * JEDEC Standard JESD68 - Common Flash Interface (CFI)
+ * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
+ * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
+ * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
+ *
+ * TODO
+ *
+ * Use Primary Extended Query table (PRI) and Alternate Algorithm Query
+ * Table (ALT) to determine if protection is available
+ *
+ * Add support for other command sets Use the PRI and ALT to determine command set
+ * Verify erase and program timeouts.
+ */
+
+#ifndef CONFIG_FLASH_BANKS_LIST
+#define CONFIG_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
+#endif
+
+#define FLASH_CMD_CFI 0x98
+#define FLASH_CMD_READ_ID 0x90
+#define FLASH_CMD_RESET 0xff
+#define FLASH_CMD_BLOCK_ERASE 0x20
+#define FLASH_CMD_ERASE_CONFIRM 0xD0
+#define FLASH_CMD_WRITE 0x40
+#define FLASH_CMD_PROTECT 0x60
+#define FLASH_CMD_PROTECT_SET 0x01
+#define FLASH_CMD_PROTECT_CLEAR 0xD0
+#define FLASH_CMD_CLEAR_STATUS 0x50
+#define FLASH_CMD_WRITE_TO_BUFFER 0xE8
+#define FLASH_CMD_WRITE_BUFFER_CONFIRM 0xD0
+
+#define FLASH_STATUS_DONE 0x80
+#define FLASH_STATUS_ESS 0x40
+#define FLASH_STATUS_ECLBS 0x20
+#define FLASH_STATUS_PSLBS 0x10
+#define FLASH_STATUS_VPENS 0x08
+#define FLASH_STATUS_PSS 0x04
+#define FLASH_STATUS_DPS 0x02
+#define FLASH_STATUS_R 0x01
+#define FLASH_STATUS_PROTECT 0x01
+
+#define AMD_CMD_RESET 0xF0
+#define AMD_CMD_WRITE 0xA0
+#define AMD_CMD_ERASE_START 0x80
+#define AMD_CMD_ERASE_SECTOR 0x30
+#define AMD_CMD_UNLOCK_START 0xAA
+#define AMD_CMD_UNLOCK_ACK 0x55
+#define AMD_CMD_WRITE_TO_BUFFER 0x25
+#define AMD_CMD_BUFFER_TO_FLASH 0x29
+
+#define AMD_STATUS_TOGGLE 0x40
+#define AMD_STATUS_ERROR 0x20
+//FIXME: These 3 were also changed for 8-bit/16-bit flash chips.
+#define AMD_ADDR_ERASE_START (0xAAA/info->portwidth)
+#define AMD_ADDR_START (0xAAA/info->portwidth)
+#define AMD_ADDR_ACK (0x555/info->portwidth)
+
+//FIXME: Fix the driver to auto-detect "16-bit flash wired in 8-bit mode".
+// Left-shift CFI offsets by 1 bit instead of doubling the #define values.
+#define FLASH_OFFSET_CFI (0xAA/info->portwidth)
+#define FLASH_OFFSET_CFI_RESP (0x20/info->portwidth)
+#define FLASH_OFFSET_CFI_RESP1 (0x22/info->portwidth)
+#define FLASH_OFFSET_CFI_RESP2 (0x24/info->portwidth)
+#define FLASH_OFFSET_PRIMARY_VENDOR (0x26/info->portwidth)
+#define FLASH_OFFSET_WTOUT (0x3E/info->portwidth)
+#define FLASH_OFFSET_WBTOUT (0x40/info->portwidth)
+#define FLASH_OFFSET_ETOUT (0x42/info->portwidth)
+#define FLASH_OFFSET_CETOUT (0x44/info->portwidth)
+#define FLASH_OFFSET_WMAX_TOUT (0x46/info->portwidth)
+#define FLASH_OFFSET_WBMAX_TOUT (0x48/info->portwidth)
+#define FLASH_OFFSET_EMAX_TOUT (0x4A/info->portwidth)
+#define FLASH_OFFSET_CEMAX_TOUT (0x4C/info->portwidth)
+#define FLASH_OFFSET_SIZE (0x4E/info->portwidth)
+#define FLASH_OFFSET_INTERFACE (0x50/info->portwidth)
+#define FLASH_OFFSET_BUFFER_SIZE (0x54/info->portwidth)
+#define FLASH_OFFSET_NUM_ERASE_REGIONS (0x58/info->portwidth)
+#define FLASH_OFFSET_ERASE_REGIONS (0x5A/info->portwidth)
+#define FLASH_OFFSET_PROTECT (0x02/info->portwidth)
+#define FLASH_OFFSET_USER_PROTECTION (0x85/info->portwidth)
+#define FLASH_OFFSET_INTEL_PROTECTION (0x81/info->portwidth)
+
+#define MAX_NUM_ERASE_REGIONS 4
+
+#define FLASH_MAN_CFI 0x01000000
+
+#define CFI_CMDSET_NONE 0
+#define CFI_CMDSET_INTEL_EXTENDED 1
+#define CFI_CMDSET_AMD_STANDARD 2
+#define CFI_CMDSET_INTEL_STANDARD 3
+#define CFI_CMDSET_AMD_EXTENDED 4
+#define CFI_CMDSET_MITSU_STANDARD 256
+#define CFI_CMDSET_MITSU_EXTENDED 257
+#define CFI_CMDSET_SST 258
+
+
+#ifdef CONFIG_SYS_FLASH_CFI_AMD_RESET /* needed for STM_ID_29W320DB on UC100 */
+# undef FLASH_CMD_RESET
+# define FLASH_CMD_RESET AMD_CMD_RESET /* use AMD-Reset instead */
+#endif
+
+
+typedef union {
+ unsigned char c;
+ unsigned short w;
+ unsigned long l;
+ unsigned long long ll;
+} cfiword_t;
+
+typedef union {
+ volatile unsigned char *cp;
+ volatile unsigned short *wp;
+ volatile unsigned long *lp;
+ volatile unsigned long long *llp;
+} cfiptr_t;
+
+/* use CFG_MAX_FLASH_BANKS_DETECT if defined */
+#ifdef CONFIG_SYS_MAX_FLASH_BANKS_DETECT
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS_DETECT] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS_DETECT]; /* FLASH chips info */
+#else
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* FLASH chips info */
+#endif
+
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c);
+static void flash_make_cmd (flash_info_t * info, uchar cmd, void *cmdbuf);
+static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static void flash_write_cmd_nodbg (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static void flash_write_cmd_int (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd, int noDebug);
+static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect);
+static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static int flash_detect_cfi (flash_info_t * info);
+ulong flash_get_size (ulong base, int banknum);
+static int flash_write_cfiword (flash_info_t * info, ulong dest, cfiword_t cword);
+static int flash_full_status_check (flash_info_t * info, flash_sect_t sector,
+ ulong tout, char *prompt);
+static void write_buffer_abort_reset(flash_info_t * info, flash_sect_t sector);
+#if defined(CFG_ENV_IS_IN_FLASH) || defined(CFG_ENV_ADDR_REDUND) || (CFG_MONITOR_BASE >= CFG_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base);
+#endif
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp, int len);
+static int flash_write_cfibuffer_amd (flash_info_t * info, ulong dest, uchar * cp, int len);
+#endif
+
+/*-----------------------------------------------------------------------
+ * create an address based on the offset and the port width
+ */
+inline uchar *flash_make_addr (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ return ((uchar *) (info->start[sect] + (offset * info->portwidth)));
+}
+
+/*-----------------------------------------------------------------------
+ * Debug support
+ */
+#ifdef DEBUG_FLASH
+static void print_longlong (char *str, unsigned long long data)
+{
+ int i;
+ char *cp;
+
+ cp = (unsigned char *) &data;
+ for (i = 0; i < 8; i++)
+ sprintf (&str[i * 2], "%2.2x", *cp++);
+}
+#endif
+
+#if defined(DEBUG_FLASH)
+static void flash_printqry (flash_info_t * info, flash_sect_t sect)
+{
+ cfiptr_t cptr;
+ int x, y;
+
+ for (x = 0; x < 0x40; x += 16U / info->portwidth) {
+ cptr.cp =
+ flash_make_addr (info, sect,
+ x + FLASH_OFFSET_CFI_RESP);
+ debug ("%p : ", cptr.cp);
+ for (y = 0; y < 16; y++) {
+ debug ("%2.2x ", cptr.cp[y]);
+ }
+ debug (" ");
+ for (y = 0; y < 16; y++) {
+ if (cptr.cp[y] >= 0x20 && cptr.cp[y] <= 0x7e) {
+ debug ("%c", cptr.cp[y]);
+ } else {
+ debug (".");
+ }
+ }
+ debug ("\n");
+ }
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ * read a character at a port width address
+ */
+inline uchar flash_read_uchar (flash_info_t * info, uint offset)
+{
+ uchar *cp;
+
+ cp = flash_make_addr (info, 0, offset);
+#if defined(__LITTLE_ENDIAN)
+ return (cp[0]);
+#else
+ return (cp[info->portwidth - 1]);
+#endif
+}
+
+/*-----------------------------------------------------------------------
+ * read a short word by swapping for ppc format.
+ */
+#if 0
+static ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ushort retval;
+
+#ifdef DEBUG_FLASH
+ int x;
+#endif
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG_FLASH
+ debug ("ushort addr is at %p info->portwidth = %d\n", addr,
+ info->portwidth);
+ for (x = 0; x < 2 * info->portwidth; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ if (info->interface == FLASH_CFI_X8X16) {
+ retval = (addr[0] | (addr[2] << 8));
+ } else {
+ retval = (addr[0] | (addr[(info->portwidth)] << 8));
+ }
+#else
+ retval = ((addr[(2 * info->portwidth) - 1] << 8) |
+ addr[info->portwidth - 1]);
+#endif
+
+ debug ("retval = 0x%x\n", retval);
+ return retval;
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ * read a long word by picking the least significant byte of each maximum
+ * port size word. Swap for ppc format.
+ */
+static ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ulong retval;
+#ifdef DEBUG_FLASH
+ int x;
+#endif
+#if 0
+ switch (info->interface) {
+ case FLASH_CFI_X8:
+ case FLASH_CFI_X16:
+ break;
+ case FLASH_CFI_X8X16:
+ offset <<= 1;
+ }
+#endif
+ // flash_make_addr() multiplies offset by info->portwidth.
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG_FLASH
+ debug ("long addr is at %p info->portwidth = %d\n", addr,
+ info->portwidth);
+ for (x = 0; x < 4 * info->portwidth; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ if (info->interface == FLASH_CFI_X8X16) {
+ retval = (addr[0] | (addr[2] << 8) | (addr[4] << 16) | (addr[6] << 24));
+ } else {
+ retval = (addr[0] | (addr[(info->portwidth)] << 8) |
+ (addr[(2 * info->portwidth)] << 16) |
+ (addr[(3 * info->portwidth)] << 24));
+ }
+#else
+ //FIXME: This undocumented code appears to match broken bus wiring.
+ retval = (addr[(2 * info->portwidth) - 1] << 24) |
+ (addr[(info->portwidth) - 1] << 16) |
+ (addr[(4 * info->portwidth) - 1] << 8) |
+ addr[(3 * info->portwidth) - 1];
+#endif
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+unsigned long flash_init (void)
+{
+ unsigned long size = 0;
+ int i;
+
+ /* Init: no FLASHes known */
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
+ flash_info[i].flash_id = FLASH_UNKNOWN;
+ size += flash_info[i].size = flash_get_size (bank_base[i], i);
+ if (flash_info[i].flash_id == FLASH_UNKNOWN) {
+#ifndef CFG_FLASH_QUIET_TEST
+ printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
+ i, flash_info[i].size, flash_info[i].size << 20);
+#endif /* CFG_FLASH_QUIET_TEST */
+ }
+ }
+
+ /* Monitor protection ON by default */
+#if (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_MONITOR_BASE,
+ CONFIG_MONITOR_BASE + monitor_flash_len - 1,
+ flash_get_info(CONFIG_MONITOR_BASE));
+#endif
+
+ /* Environment protection ON by default */
+#ifdef CONFIG_ENV_IS_IN_FLASH
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR,
+ CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
+ flash_get_info(CONFIG_ENV_ADDR));
+#endif
+
+ /* Redundant environment protection ON by default */
+#ifdef CONFIG_ENV_ADDR_REDUND
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR_REDUND,
+ CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SIZE_REDUND - 1,
+ flash_get_info(CONFIG_ENV_ADDR_REDUND));
+#endif
+ return (size);
+}
+
+/*-----------------------------------------------------------------------
+ */
+#if defined(CONFIG_ENV_IS_IN_FLASH) || defined(CONFIG_ENV_ADDR_REDUND) || (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base)
+{
+ int i;
+ flash_info_t * info = 0;
+
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i ++) {
+ info = & flash_info[i];
+ if (info->size && info->start[0] <= base &&
+ base <= info->start[0] + info->size - 1)
+ break;
+ }
+
+ return i == CONFIG_SYS_MAX_FLASH_BANKS ? 0 : info;
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ */
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+ int rcode = 0;
+ int prot;
+ flash_sect_t sect;
+ uchar ch;
+ uchar *addr;
+
+ if (info->flash_id != FLASH_MAN_CFI) {
+ puts ("Can't erase unknown flash type - aborted\n");
+ return 1;
+ }
+ if ((s_first < 0) || (s_first > s_last)) {
+ puts ("- no sectors to erase\n");
+ return 1;
+ }
+
+ prot = 0;
+ for (sect = s_first; sect <= s_last; ++sect) {
+ if (info->protect[sect]) {
+ prot++;
+ }
+ }
+ if (prot) {
+ printf ("- Warning: %d protected sectors will not be erased!\n", prot);
+ } else {
+ putc ('\n');
+ }
+
+
+ for (sect = s_first; sect <= s_last; sect++) {
+ if (info->protect[sect] == 0) { /* not protected */
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_STANDARD:
+ case CFI_CMDSET_INTEL_EXTENDED:
+ flash_write_cmd (info, sect, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd (info, sect, 0, FLASH_CMD_BLOCK_ERASE);
+ flash_write_cmd (info, sect, 0, FLASH_CMD_ERASE_CONFIRM);
+ break;
+ case CFI_CMDSET_AMD_STANDARD:
+ case CFI_CMDSET_AMD_EXTENDED:
+ flash_unlock_seq (info, sect);
+ flash_write_cmd (info, sect, AMD_ADDR_ERASE_START,
+ AMD_CMD_ERASE_START);
+ flash_unlock_seq (info, sect);
+ flash_write_cmd (info, sect, 0, AMD_CMD_ERASE_SECTOR);
+
+ /* toggle */
+ addr = flash_make_addr (info, sect, 0);
+ do {
+ ch = *(volatile uchar *)(addr);
+ } while ( ((ch & 0x80) == 0) || (ch != 0xFF) );
+ break;
+ default:
+ debug ("Unkown flash vendor %d\n",
+ info->vendor);
+ break;
+ }
+
+ if (flash_full_status_check
+ (info, sect, info->erase_blk_tout, "erase")) {
+ rcode = 1;
+ } else
+ putc ('.');
+ }
+ }
+ puts (" done\n");
+ return rcode;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+ int i;
+
+ if (info->flash_id != FLASH_MAN_CFI) {
+ puts ("missing or unknown FLASH type\n");
+ return;
+ }
+
+ printf ("CFI conformant FLASH (%d x %d)",
+ (info->portwidth << 3), (info->chipwidth << 3));
+ printf (" Size: %ld MB in %d Sectors\n",
+ info->size >> 20, info->sector_count);
+ printf (" Erase timeout %ld ms, write timeout %ld ms, buffer write timeout %ld ms, buffer size %d\n",
+ info->erase_blk_tout,
+ info->write_tout,
+ info->buffer_write_tout,
+ info->buffer_size);
+
+ puts (" Sector Start Addresses:");
+ for (i = 0; i < info->sector_count; ++i) {
+#ifdef CFG_FLASH_EMPTY_INFO
+ int k;
+ int size;
+ int erased;
+ volatile unsigned long *flash;
+
+ /*
+ * Check if whole sector is erased
+ */
+ if (i != (info->sector_count - 1))
+ size = info->start[i + 1] - info->start[i];
+ else
+ size = info->start[0] + info->size - info->start[i];
+ erased = 1;
+ flash = (volatile unsigned long *) info->start[i];
+ size = size >> 2; /* divide by 4 for longword access */
+ for (k = 0; k < size; k++) {
+ if (*flash++ != 0xffffffff) {
+ erased = 0;
+ break;
+ }
+ }
+
+ if ((i % 5) == 0)
+ printf ("\n");
+ /* print empty and read-only info */
+ printf (" %08lX%s%s",
+ info->start[i],
+ erased ? " E" : " ",
+ info->protect[i] ? "RO " : " ");
+#else /* ! CFG_FLASH_EMPTY_INFO */
+ if ((i % 5) == 0)
+ printf ("\n ");
+ printf (" %08lX%s",
+ info->start[i], info->protect[i] ? " (RO)" : " ");
+#endif
+ }
+ putc ('\n');
+ return;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+ ulong wp;
+ ulong cp;
+ int aln;
+ cfiword_t cword;
+ int i, rc;
+
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+ unsigned char pat[] = {'|', '-', '/', '\\'};
+ int patcnt = 0;
+ int buffered_size;
+#endif
+ /* get lower aligned address */
+ /* get lower aligned address */
+ wp = (addr & ~(info->portwidth - 1));
+
+ /* handle unaligned start */
+ if ((aln = addr - wp) != 0) {
+ cword.l = 0;
+ cp = wp;
+ for (i = 0; i < aln; ++i, ++cp)
+ flash_add_byte (info, &cword, (*(uchar *) cp));
+
+ for (; (i < info->portwidth) && (cnt > 0); i++) {
+ flash_add_byte (info, &cword, *src++);
+ cnt--;
+ cp++;
+ }
+ for (; (cnt == 0) && (i < info->portwidth); ++i, ++cp)
+ flash_add_byte (info, &cword, (*(uchar *) cp));
+ if ((rc = flash_write_cfiword (info, wp, cword)) != 0)
+ return rc;
+ wp = cp;
+ }
+
+ /* handle the aligned part */
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+ buffered_size = (info->portwidth / info->chipwidth);
+ buffered_size *= info->buffer_size;
+ while (cnt >= info->portwidth) {
+ /* Show processing */
+ if ((++patcnt % 256) == 0)
+ printf("%c\b", pat[(patcnt / 256) & 0x03]);
+
+ i = buffered_size > cnt ? cnt : buffered_size;
+ if ((rc = flash_write_cfibuffer (info, wp, src, i)) != ERR_OK)
+ return rc;
+ i -= i & (info->portwidth - 1);
+ wp += i;
+ src += i;
+ cnt -= i;
+ }
+#else
+ while (cnt >= info->portwidth) {
+ cword.l = 0;
+ for (i = 0; i < info->portwidth; i++) {
+ flash_add_byte (info, &cword, *src++);
+ }
+ if ((rc = flash_write_cfiword (info, wp, cword)) != 0)
+ return rc;
+ wp += info->portwidth;
+ cnt -= info->portwidth;
+ }
+#endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */
+ if (cnt == 0) {
+ return (0);
+ }
+
+ /*
+ * handle unaligned tail bytes
+ */
+ cword.l = 0;
+ for (i = 0, cp = wp; (i < info->portwidth) && (cnt > 0); ++i, ++cp) {
+ flash_add_byte (info, &cword, *src++);
+ --cnt;
+ }
+ for (; i < info->portwidth; ++i, ++cp) {
+ flash_add_byte (info, &cword, (*(uchar *) cp));
+ }
+
+ return flash_write_cfiword (info, wp, cword);
+}
+
+/*-----------------------------------------------------------------------
+ */
+#ifdef CFG_FLASH_PROTECTION
+
+int flash_real_protect (flash_info_t * info, long sector, int prot)
+{
+ int retcode = 0;
+
+ flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT);
+ if (prot)
+ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_SET);
+ else
+ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_CLEAR);
+
+ if ((retcode =
+ flash_full_status_check (info, sector, info->erase_blk_tout,
+ prot ? "protect" : "unprotect")) == 0) {
+
+ info->protect[sector] = prot;
+ /* Intel's unprotect unprotects all locking */
+ if (prot == 0) {
+ flash_sect_t i;
+
+ for (i = 0; i < info->sector_count; i++) {
+ if (info->protect[i])
+ flash_real_protect (info, i, 1);
+ }
+ }
+ }
+ return retcode;
+}
+
+/*-----------------------------------------------------------------------
+ * flash_read_user_serial - read the OneTimeProgramming cells
+ */
+void flash_read_user_serial (flash_info_t * info, void *buffer, int offset,
+ int len)
+{
+ uchar *src;
+ uchar *dst;
+
+ dst = buffer;
+ src = flash_make_addr (info, 0, FLASH_OFFSET_USER_PROTECTION);
+ flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
+ memcpy (dst, src + offset, len);
+ flash_write_cmd (info, 0, 0, info->cmd_reset);
+}
+
+/*
+ * flash_read_factory_serial - read the device Id from the protection area
+ */
+void flash_read_factory_serial (flash_info_t * info, void *buffer, int offset,
+ int len)
+{
+ uchar *src;
+
+ src = flash_make_addr (info, 0, FLASH_OFFSET_INTEL_PROTECTION);
+ flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
+ memcpy (buffer, src + offset, len);
+ flash_write_cmd (info, 0, 0, info->cmd_reset);
+}
+
+#endif /* CFG_FLASH_PROTECTION */
+
+/*
+ * flash_is_busy - check to see if the flash is busy
+ * This routine checks the status of the chip and returns true if the chip is busy
+ */
+static int flash_is_busy (flash_info_t * info, flash_sect_t sect)
+{
+ int retval;
+
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_STANDARD:
+ case CFI_CMDSET_INTEL_EXTENDED:
+ retval = !flash_isset (info, sect, 0, FLASH_STATUS_DONE);
+ break;
+ case CFI_CMDSET_AMD_STANDARD:
+ case CFI_CMDSET_AMD_EXTENDED:
+ retval = flash_toggle (info, sect, 0, AMD_STATUS_TOGGLE);
+ break;
+ default:
+ retval = 0;
+ }
+#ifdef DEBUG_FLASH
+ if (retval)
+ debug ("flash_is_busy: %d\n", retval);
+#endif
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ * wait for XSR.7 to be set. Time out with an error if it does not.
+ * This routine does not set the flash to read-array mode.
+ */
+static int flash_status_check (flash_info_t * info, flash_sect_t sector,
+ ulong tout, char *prompt)
+{
+ ulong start, now;
+
+ /* Wait for command completion */
+ // (Sun) Fix order of checking time so it works when the CPU is very
+ // slow, e.g., single-stepping or emulation.
+ start = get_timer (0);
+ while (now = get_timer(start),
+ flash_is_busy (info, sector))
+ {
+ if (now > info->erase_blk_tout) {
+ printf ("Flash %s timeout at address %lx data %lx\n",
+ prompt, info->start[sector],
+ flash_read_long (info, sector, 0));
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_TIMOUT;
+ }
+ }
+ return ERR_OK;
+}
+
+/*-----------------------------------------------------------------------
+ * Wait for XSR.7 to be set, if it times out print an error, otherwise do a full status check.
+ * This routine sets the flash to read-array mode.
+ */
+static int flash_full_status_check (flash_info_t * info, flash_sect_t sector,
+ ulong tout, char *prompt)
+{
+ int retcode;
+
+ retcode = flash_status_check (info, sector, tout, prompt);
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_EXTENDED:
+ case CFI_CMDSET_INTEL_STANDARD:
+ if ((retcode != ERR_OK)
+ && !flash_isequal (info, sector, 0, FLASH_STATUS_DONE)) {
+ retcode = ERR_INVAL;
+ printf ("Flash %s error at address %lx\n", prompt,
+ info->start[sector]);
+ if (flash_isset (info, sector, 0, FLASH_STATUS_ECLBS | FLASH_STATUS_PSLBS)) {
+ puts ("Command Sequence Error.\n");
+ } else if (flash_isset (info, sector, 0, FLASH_STATUS_ECLBS)) {
+ puts ("Block Erase Error.\n");
+ retcode = ERR_NOT_ERASED;
+ } else if (flash_isset (info, sector, 0, FLASH_STATUS_PSLBS)) {
+ puts ("Locking Error\n");
+ }
+ if (flash_isset (info, sector, 0, FLASH_STATUS_DPS)) {
+ puts ("Block locked.\n");
+ retcode = ERR_PROTECTED;
+ }
+ if (flash_isset (info, sector, 0, FLASH_STATUS_VPENS))
+ puts ("Vpp Low Error.\n");
+ }
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ break;
+ default:
+ break;
+ }
+ return retcode;
+}
+
+static void write_buffer_abort_reset(flash_info_t * info, flash_sect_t sector)
+{
+ flash_write_cmd (info, sector, 0xaaa, 0xaa);
+ flash_write_cmd (info, sector, 0x555, 0x55);
+ flash_write_cmd (info, sector, 0xaaa, 0xf0);
+}
+
+/*-----------------------------------------------------------------------
+ */
+static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c)
+{
+#if defined(__LITTLE_ENDIAN)
+ unsigned short w;
+ unsigned int l;
+ unsigned long long ll;
+#endif
+
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cword->c = c;
+ break;
+ case FLASH_CFI_16BIT:
+#if defined(__LITTLE_ENDIAN)
+ w = c;
+ w <<= 8;
+ cword->w = (cword->w >> 8) | w;
+#else
+ cword->w = (cword->w << 8) | c;
+#endif
+ break;
+ case FLASH_CFI_32BIT:
+#if defined(__LITTLE_ENDIAN)
+ l = c;
+ l <<= 24;
+ cword->l = (cword->l >> 8) | l;
+#else
+ cword->l = (cword->l << 8) | c;
+#endif
+ break;
+ case FLASH_CFI_64BIT:
+#if defined(__LITTLE_ENDIAN)
+ ll = c;
+ ll <<= 56;
+ cword->ll = (cword->ll >> 8) | ll;
+#else
+ cword->ll = (cword->ll << 8) | c;
+#endif
+ break;
+ }
+}
+
+
+/*-----------------------------------------------------------------------
+ * make a proper sized command based on the port and chip widths
+ */
+static void flash_make_cmd (flash_info_t * info, uchar cmd, void *cmdbuf)
+{
+ int i;
+ uchar *cp = (uchar *) cmdbuf;
+
+#if defined(__LITTLE_ENDIAN)
+ for (i = info->portwidth; i > 0; i--)
+#else
+ for (i = 1; i <= info->portwidth; i++)
+#endif
+ *cp++ = (i & (info->chipwidth - 1)) ? '\0' : cmd;
+}
+
+/*
+ * Write a proper sized command to the correct address
+ */
+static void
+flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset,
+ uchar cmd)
+{
+#ifdef DEBUG_FLASH
+ const int noDebug = 0;
+#else
+ const int noDebug = 1;
+#endif
+ return flash_write_cmd_int(info, sect, offset, cmd, noDebug);
+}
+static void
+flash_write_cmd_nodbg (flash_info_t * info, flash_sect_t sect, uint offset,
+ uchar cmd)
+{
+ return flash_write_cmd_int(info, sect, offset, cmd, 1);
+}
+
+static void
+flash_write_cmd_int (flash_info_t * info, flash_sect_t sect, uint offset,
+ uchar cmd, int noDebug)
+{
+
+ volatile cfiptr_t addr;
+ cfiword_t cword;
+
+ addr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ if (noDebug == 0)
+ debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr.cp, cmd,
+ cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ *addr.cp = cword.c;
+ break;
+ case FLASH_CFI_16BIT:
+ if (noDebug == 0)
+ debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr.wp,
+ cmd, cword.w,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ *addr.wp = cword.w;
+ break;
+ case FLASH_CFI_32BIT:
+ if (noDebug == 0)
+ debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr.lp,
+ cmd, cword.l,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ *addr.lp = cword.l;
+ break;
+ case FLASH_CFI_64BIT:
+#ifdef DEBUG_FLASH
+ if (noDebug == 0)
+ {
+ char str[20];
+
+ print_longlong (str, cword.ll);
+
+ debug ("fwrite addr %p cmd %x %s 64 bit x %d bit\n",
+ addr.llp, cmd, str,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ }
+#endif
+ *addr.llp = cword.ll;
+ break;
+ }
+}
+
+static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect)
+{
+ flash_write_cmd_nodbg (info, sect, AMD_ADDR_START, AMD_CMD_UNLOCK_START);
+ flash_write_cmd_nodbg (info, sect, AMD_ADDR_ACK, AMD_CMD_UNLOCK_ACK);
+}
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd)
+{
+ cfiptr_t cptr;
+ cfiword_t cword;
+ int retval;
+#ifdef DEBUG_FLASH
+ const int dbg = 1;
+#else
+ const int dbg = 0;
+#endif
+ cptr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+
+ if (dbg)
+ debug ("is= cmd %x(%c) addr %p ", cmd, cmd, cptr.cp);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ if (dbg)
+ debug ("is= %x %x\n", cptr.cp[0], cword.c);
+ retval = (cptr.cp[0] == cword.c);
+ break;
+ case FLASH_CFI_16BIT:
+ if (dbg)
+ debug ("is= %4.4x %4.4x\n", cptr.wp[0], cword.w);
+ retval = (cptr.wp[0] == cword.w);
+ break;
+ case FLASH_CFI_32BIT:
+ if (dbg)
+ debug ("is= %8.8lx %8.8lx\n", cptr.lp[0], cword.l);
+ retval = (cptr.lp[0] == cword.l);
+ break;
+ case FLASH_CFI_64BIT:
+#ifdef DEBUG_FLASH
+ {
+ char str1[20];
+ char str2[20];
+
+ print_longlong (str1, cptr.llp[0]);
+ print_longlong (str2, cword.ll);
+ debug ("is= %s %s\n", str1, str2);
+ }
+#endif
+ retval = (cptr.llp[0] == cword.ll);
+ break;
+ default:
+ retval = 0;
+ break;
+ }
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd)
+{
+ cfiptr_t cptr;
+ cfiword_t cword;
+ int retval;
+
+ cptr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ retval = ((cptr.cp[0] & cword.c) == cword.c);
+ break;
+ case FLASH_CFI_16BIT:
+ retval = ((cptr.wp[0] & cword.w) == cword.w);
+ break;
+ case FLASH_CFI_32BIT:
+ retval = ((cptr.lp[0] & cword.l) == cword.l);
+ break;
+ case FLASH_CFI_64BIT:
+ retval = ((cptr.llp[0] & cword.ll) == cword.ll);
+ break;
+ default:
+ retval = 0;
+ break;
+ }
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd)
+{
+ cfiptr_t cptr;
+ cfiword_t cword;
+ int retval;
+
+ cptr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ retval = ((cptr.cp[0] & cword.c) != (cptr.cp[0] & cword.c));
+ break;
+ case FLASH_CFI_16BIT:
+ retval = ((cptr.wp[0] & cword.w) != (cptr.wp[0] & cword.w));
+ break;
+ case FLASH_CFI_32BIT:
+ retval = ((cptr.lp[0] & cword.l) != (cptr.lp[0] & cword.l));
+ break;
+ case FLASH_CFI_64BIT:
+ retval = ((cptr.llp[0] & cword.ll) !=
+ (cptr.llp[0] & cword.ll));
+ break;
+ default:
+ retval = 0;
+ break;
+ }
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ * detect if flash is compatible with the Common Flash Interface (CFI)
+ * http://www.jedec.org/download/search/jesd68.pdf
+ *
+*/
+static int flash_detect_cfi (flash_info_t * info)
+{
+ ulong data;
+
+ debug ("flash_detect_cfi()... ");
+
+#if defined(CONFIG_FLASH_AST2300)
+ data = *(ulong *)(0x1e6e2070); /* hardware traping */
+ if (data & 0x10) /* D[4]: 0/1 (8/16) */
+ info->portwidth = FLASH_CFI_16BIT;
+ else
+ info->portwidth = FLASH_CFI_8BIT;
+#else
+ info->portwidth = FLASH_CFI_8BIT;
+#endif
+
+ {
+ for (info->chipwidth = FLASH_CFI_BY8;
+ info->chipwidth <= info->portwidth;
+ info->chipwidth <<= 1) {
+ flash_write_cmd (info, 0, 0, FLASH_CMD_RESET);
+ flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
+ if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q')
+ //FIXME: Next 3 lines were changed for 8-bit/16-bit flash chips.
+ && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP1, 'R')
+ && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP2, 'Y')) {
+ info->interface = flash_read_uchar (info, FLASH_OFFSET_INTERFACE);
+ debug ("device interface is %d\n",
+ info->interface);
+ debug ("found port %d chip %d ",
+ info->portwidth, info->chipwidth);
+ debug ("port %d bits chip %d bits\n",
+ info->portwidth << CFI_FLASH_SHIFT_WIDTH,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ return 1;
+ }
+ }
+ }
+ debug ("not found\n");
+ return 0;
+}
+
+/*
+ * The following code cannot be run from FLASH!
+ *
+ */
+ulong flash_get_size (ulong base, int banknum)
+{
+ flash_info_t *info = &flash_info[banknum];
+ int i, j;
+ flash_sect_t sect_cnt;
+ unsigned long sector;
+ unsigned long tmp;
+ int size_ratio;
+ uchar num_erase_regions;
+ int erase_region_size;
+ int erase_region_count;
+
+ info->start[0] = base;
+
+ if (flash_detect_cfi (info)) {
+ info->vendor = flash_read_uchar (info, FLASH_OFFSET_PRIMARY_VENDOR);
+#if defined(DEBUG_FLASH)
+ flash_printqry (info, 0);
+#endif
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_STANDARD:
+ case CFI_CMDSET_INTEL_EXTENDED:
+ default:
+ info->cmd_reset = FLASH_CMD_RESET;
+ break;
+ case CFI_CMDSET_AMD_STANDARD:
+ case CFI_CMDSET_AMD_EXTENDED:
+ info->cmd_reset = AMD_CMD_RESET;
+ break;
+ }
+
+ debugX(2, "manufacturer is %d\n", info->vendor);
+ size_ratio = info->portwidth / info->chipwidth;
+ /* if the chip is x8/x16 reduce the ratio by half */
+#if 0
+ if ((info->interface == FLASH_CFI_X8X16)
+ && (info->chipwidth == FLASH_CFI_BY8)) {
+ size_ratio >>= 1;
+ }
+#endif
+ num_erase_regions = flash_read_uchar (info, FLASH_OFFSET_NUM_ERASE_REGIONS);
+ debugX(2, "size_ratio %d port %d bits chip %d bits\n",
+ size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ debugX(2, "found %d erase regions\n", num_erase_regions);
+ sect_cnt = 0;
+ sector = base;
+ for (i = 0; i < num_erase_regions; i++) {
+ if (i > MAX_NUM_ERASE_REGIONS) {
+ printf ("%d erase regions found, only %d used\n",
+ num_erase_regions, MAX_NUM_ERASE_REGIONS);
+ break;
+ }
+ // CFI Erase Block Region Information:
+ // Bits[31:16] = sect_size/256, 0 means 128-byte
+ // Bits[15:0] = num_sectors - 1
+ tmp = flash_read_long(info, 0,
+ FLASH_OFFSET_ERASE_REGIONS + i * 4);
+ debug("CFI erase block region info[%d]: 0x%08x, ",
+ i, tmp);
+ erase_region_count = (tmp & 0xffff) + 1;
+ tmp >>= 16;
+ erase_region_size = (tmp ? tmp * 256 : 128);
+ debug ("erase_region_count=%d erase_region_size=%d\n",
+ erase_region_count, erase_region_size);
+#if 0
+ erase_region_size = CFG_FLASH_SECTOR_SIZE; // Commented out
+ erase_region_count = CFG_FLASH_SECTOR_COUNT; // Commented out
+#endif
+ if (sect_cnt + erase_region_count > CONFIG_SYS_MAX_FLASH_SECT) {
+ printf("Warning: Erase region %d adds too many flash sectors"
+ " %d+%d; reducing to fit total limit of %d\n",
+ i, sect_cnt, erase_region_count, CONFIG_SYS_MAX_FLASH_SECT);
+ erase_region_count = CONFIG_SYS_MAX_FLASH_SECT - sect_cnt;
+ }
+ for (j = 0; j < erase_region_count; j++) {
+ info->start[sect_cnt] = sector;
+ sector += (erase_region_size * size_ratio);
+
+ /*
+ * Only read protection status from supported devices (intel...)
+ */
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_EXTENDED:
+ case CFI_CMDSET_INTEL_STANDARD:
+ info->protect[sect_cnt] =
+ flash_isset (info, sect_cnt,
+ FLASH_OFFSET_PROTECT,
+ FLASH_STATUS_PROTECT);
+ break;
+ default:
+ info->protect[sect_cnt] = 0; /* default: not protected */
+ }
+
+ sect_cnt++;
+ }
+ }
+
+ info->sector_count = sect_cnt;
+ /* multiply the size by the number of chips */
+ // info->size = (1 << flash_read_uchar (info, FLASH_OFFSET_SIZE)) * size_ratio;
+ // Use only the sectors that fit within the flash_info array size.
+ info->size = sector - base;
+ printf("Flash bank %d at %08x has 0x%x bytes in %d sectors"
+ " (chipSize 1<<%d, size_ratio %d).\n",
+ banknum, base, info->size, info->sector_count,
+ flash_read_uchar(info, FLASH_OFFSET_SIZE), size_ratio);
+
+ info->buffer_size = (1 << flash_read_uchar (info, FLASH_OFFSET_BUFFER_SIZE));
+ /* Limit the buffer size to 32bytes to meet most of AMD-styles flash's minimum requirement */
+ if (info->buffer_size > 32)
+ info->buffer_size = 32;
+ tmp = 1 << flash_read_uchar (info, FLASH_OFFSET_ETOUT);
+ info->erase_blk_tout = (tmp * (1 << flash_read_uchar (info, FLASH_OFFSET_EMAX_TOUT)));
+ tmp = 1 << flash_read_uchar (info, FLASH_OFFSET_WBTOUT);
+ info->buffer_write_tout = (tmp * (1 << flash_read_uchar (info, FLASH_OFFSET_WBMAX_TOUT)));
+ tmp = 1 << flash_read_uchar (info, FLASH_OFFSET_WTOUT);
+ info->write_tout = (tmp * (1 << flash_read_uchar (info, FLASH_OFFSET_WMAX_TOUT))) / 1000;
+ info->flash_id = FLASH_MAN_CFI;
+#if 0
+ if ((info->interface == FLASH_CFI_X8X16) && (info->chipwidth == FLASH_CFI_BY8)) {
+ info->portwidth >>= 1; /* XXX - Need to test on x8/x16 in parallel. */
+ }
+#endif
+ }
+
+ flash_write_cmd (info, 0, 0, info->cmd_reset);
+ return (info->size);
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_write_cfiword (flash_info_t * info, ulong dest,
+ cfiword_t cword)
+{
+
+ cfiptr_t ctladdr;
+ cfiptr_t cptr;
+ int flag;
+
+ ctladdr.cp = flash_make_addr (info, 0, 0);
+ cptr.cp = (uchar *) dest;
+
+
+ /* Check if Flash is (sufficiently) erased */
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ flag = ((cptr.cp[0] & cword.c) == cword.c);
+ break;
+ case FLASH_CFI_16BIT:
+ flag = ((cptr.wp[0] & cword.w) == cword.w);
+ break;
+ case FLASH_CFI_32BIT:
+ flag = ((cptr.lp[0] & cword.l) == cword.l);
+ break;
+ case FLASH_CFI_64BIT:
+ flag = ((cptr.llp[0] & cword.ll) == cword.ll);
+ break;
+ default:
+ return 2;
+ }
+ if (!flag)
+ return 2;
+
+ /* Disable interrupts which might cause a timeout here */
+ flag = disable_interrupts ();
+
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_EXTENDED:
+ case CFI_CMDSET_INTEL_STANDARD:
+ flash_write_cmd_nodbg (info, 0, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd_nodbg (info, 0, 0, FLASH_CMD_WRITE);
+ break;
+ case CFI_CMDSET_AMD_EXTENDED:
+ case CFI_CMDSET_AMD_STANDARD:
+ flash_unlock_seq (info, 0);
+ flash_write_cmd_nodbg (info, 0, AMD_ADDR_START, AMD_CMD_WRITE);
+ break;
+ }
+
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cptr.cp[0] = cword.c;
+ break;
+ case FLASH_CFI_16BIT:
+ cptr.wp[0] = cword.w;
+ break;
+ case FLASH_CFI_32BIT:
+ cptr.lp[0] = cword.l;
+ break;
+ case FLASH_CFI_64BIT:
+ cptr.llp[0] = cword.ll;
+ break;
+ }
+
+ /* re-enable interrupts if necessary */
+ if (flag)
+ enable_interrupts ();
+
+ return flash_full_status_check (info, 0, info->write_tout, "write");
+}
+
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+/* loop through the sectors from the highest address
+ * when the passed address is greater or equal to the sector address
+ * we have a match
+ */
+static flash_sect_t find_sector (flash_info_t * info, ulong addr)
+{
+ flash_sect_t sector;
+
+ for (sector = info->sector_count - 1; sector >= 0; sector--) {
+ if (addr >= info->start[sector])
+ break;
+ }
+ return sector;
+}
+
+static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp,
+ int len)
+{
+ flash_sect_t sector;
+ int cnt;
+ int retcode;
+ volatile cfiptr_t src;
+ volatile cfiptr_t dst;
+
+/* Add AMD write buffer mode support, ycchen@102006 */
+#if 0
+ /* buffered writes in the AMD chip set is not supported yet */
+ if((info->vendor == CFI_CMDSET_AMD_STANDARD) ||
+ (info->vendor == CFI_CMDSET_AMD_EXTENDED))
+ return ERR_INVAL;
+#endif
+ if((info->vendor == CFI_CMDSET_AMD_STANDARD) ||
+ (info->vendor == CFI_CMDSET_AMD_EXTENDED))
+ {
+ retcode = flash_write_cfibuffer_amd(info, dest, cp, len);
+ return retcode;
+ }
+
+ src.cp = cp;
+ dst.cp = (uchar *) dest;
+ sector = find_sector (info, dest);
+ flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd (info, sector, 0, FLASH_CMD_WRITE_TO_BUFFER);
+ if ((retcode =
+ flash_status_check (info, sector, info->buffer_write_tout,
+ "write to buffer")) == ERR_OK) {
+ /* reduce the number of loops by the width of the port */
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cnt = len;
+ break;
+ case FLASH_CFI_16BIT:
+ cnt = len >> 1;
+ break;
+ case FLASH_CFI_32BIT:
+ cnt = len >> 2;
+ break;
+ case FLASH_CFI_64BIT:
+ cnt = len >> 3;
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
+ while (cnt-- > 0) {
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ *dst.cp++ = *src.cp++;
+ break;
+ case FLASH_CFI_16BIT:
+ *dst.wp++ = *src.wp++;
+ break;
+ case FLASH_CFI_32BIT:
+ *dst.lp++ = *src.lp++;
+ break;
+ case FLASH_CFI_64BIT:
+ *dst.llp++ = *src.llp++;
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ }
+ flash_write_cmd (info, sector, 0,
+ FLASH_CMD_WRITE_BUFFER_CONFIRM);
+ retcode =
+ flash_full_status_check (info, sector,
+ info->buffer_write_tout,
+ "buffer write");
+ }
+ flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
+ return retcode;
+}
+
+
+static int flash_write_cfibuffer_amd (flash_info_t * info, ulong dest, uchar * cp,
+ int len)
+{
+ flash_sect_t sector;
+ int cnt;
+ int retcode;
+ volatile cfiptr_t src;
+ volatile cfiptr_t dst;
+ volatile cfiword_t tmpsrc, tmpdst;
+
+ src.cp = cp;
+ dst.cp = (uchar *) dest;
+ sector = find_sector (info, dest);
+ flash_unlock_seq (info, 0);
+ if ((retcode =
+ flash_status_check (info, sector, info->buffer_write_tout,
+ "write to buffer")) == ERR_OK) {
+ /* reduce the number of loops by the width of the port */
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cnt = len;
+ *dst.cp = (uchar) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.cp = (uchar) (cnt -1);
+ break;
+ case FLASH_CFI_16BIT:
+ cnt = len >> 1;
+ *dst.wp = (unsigned short) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.wp = (unsigned short) (cnt -1);
+ break;
+ case FLASH_CFI_32BIT:
+ cnt = len >> 2;
+ *dst.lp = (unsigned long) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.lp = (unsigned long) (cnt -1);
+ break;
+ case FLASH_CFI_64BIT:
+ cnt = len >> 3;
+ *dst.llp = (unsigned long long) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.llp = (unsigned long long) (cnt -1);
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ while (cnt-- > 0) {
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ *dst.cp++ = *src.cp++;
+ break;
+ case FLASH_CFI_16BIT:
+ *dst.wp++ = *src.wp++;
+ break;
+ case FLASH_CFI_32BIT:
+ *dst.lp++ = *src.lp++;
+ break;
+ case FLASH_CFI_64BIT:
+ *dst.llp++ = *src.llp++;
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ }
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ src.cp--;
+ dst.cp--;
+ *dst.cp = (unsigned char) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.c = *src.cp & 0x80;
+
+ do {
+ tmpdst.c = *(volatile uchar *)(dst.cp);
+
+ if (tmpdst.c & 0x20) { /* toggle DQ5 */
+ tmpdst.c = *(volatile uchar *)(dst.cp);
+ if ((tmpdst.c & 0x80) != tmpsrc.c)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.c & 0x02) { /* toggle DQ1 */
+ tmpdst.c = *(volatile uchar *)(dst.cp);
+ if ((tmpdst.c & 0x80) != tmpsrc.c)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.c & 0x80) != tmpsrc.c);
+
+ break;
+ case FLASH_CFI_16BIT:
+ src.wp--;
+ dst.wp--;
+ *dst.wp = (unsigned short) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.w = *src.wp & 0x80;
+
+ do {
+ tmpdst.w = *(volatile short *)(dst.wp);
+
+ if (tmpdst.w & 0x20) { /* toggle DQ5 */
+ tmpdst.w = *(volatile ushort *)(dst.wp);
+ if ((tmpdst.w & 0x80) != tmpsrc.w)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.w & 0x02) { /* toggle DQ1 */
+ tmpdst.w = *(volatile ushort *)(dst.wp);
+ if ((tmpdst.w & 0x80) != tmpsrc.w)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.w & 0x80) != tmpsrc.w);
+
+ break;
+ case FLASH_CFI_32BIT:
+ src.lp--;
+ dst.lp--;
+ *dst.lp = (unsigned long) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.l = *src.lp & 0x80;
+
+ do {
+ tmpdst.l = *(volatile ulong *)(dst.lp);
+
+ if (tmpdst.l & 0x20) { /* toggle DQ5 */
+ tmpdst.l = *(volatile ulong *)(dst.lp);
+ if ((tmpdst.l & 0x80) != tmpsrc.l)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.l & 0x02) { /* toggle DQ1 */
+ tmpdst.l = *(volatile ulong *)(dst.lp);
+ if ((tmpdst.l & 0x80) != tmpsrc.l)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.l & 0x80) != tmpsrc.l);
+
+ break;
+ case FLASH_CFI_64BIT:
+ src.llp--;
+ dst.llp--;
+ *dst.llp = (unsigned long long) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.ll = *src.llp & 0x80;
+
+ do {
+ tmpdst.ll = *(volatile unsigned long long *)(dst.llp);
+
+ if (tmpdst.ll & 0x20) { /* toggle DQ5 */
+ tmpdst.ll = *(volatile unsigned long long *)(dst.llp);
+ if ((tmpdst.ll & 0x80) != tmpsrc.ll)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.ll & 0x02) { /* toggle DQ1 */
+ tmpdst.ll = *(volatile unsigned long long *)(dst.llp);
+ if ((tmpdst.ll & 0x80) != tmpsrc.ll)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.ll & 0x80) != tmpsrc.ll);
+
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+
+ retcode =
+ flash_full_status_check (info, sector,
+ info->buffer_write_tout,
+ "buffer write");
+ }
+
+ return retcode;
+}
+#endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */
+
+#ifdef CONFIG_FLASH_AST2300_DMA
+#define STCBaseAddress 0x1e620000
+
+/* for DMA */
+#define REG_FLASH_INTERRUPT_STATUS 0x08
+#define REG_FLASH_DMA_CONTROL 0x80
+#define REG_FLASH_DMA_FLASH_BASE 0x84
+#define REG_FLASH_DMA_DRAM_BASE 0x88
+#define REG_FLASH_DMA_LENGTH 0x8c
+
+#define FLASH_STATUS_DMA_BUSY 0x0000
+#define FLASH_STATUS_DMA_READY 0x0800
+#define FLASH_STATUS_DMA_CLEAR 0x0800
+
+#define FLASH_DMA_ENABLE 0x01
+
+void * memmove_dma(void * dest,const void *src,size_t count)
+{
+ ulong count_align, poll_time, data;
+
+ count_align = (count + 3) & 0xFFFFFFFC; /* 4-bytes align */
+ poll_time = 100; /* set 100 us as default */
+
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (~FLASH_DMA_ENABLE);
+
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_FLASH_BASE) = (ulong *) (src);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_DRAM_BASE) = (ulong *) (dest);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_LENGTH) = (ulong) (count_align);
+ udelay(10);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (FLASH_DMA_ENABLE);
+
+ /* wait poll */
+ do {
+ udelay(poll_time);
+ data = *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS);
+ } while (!(data & FLASH_STATUS_DMA_READY));
+
+ /* clear status */
+ *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS) |= FLASH_STATUS_DMA_CLEAR;
+}
+#endif
+#endif /* CFG_FLASH_CFI */
diff --git a/board/aspeed/ast2300/flash_spi.c b/board/aspeed/ast2300/flash_spi.c
new file mode 100755
index 0000000..6660628
--- /dev/null
+++ b/board/aspeed/ast2300/flash_spi.c
@@ -0,0 +1,1639 @@
+/*
+ * 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
+ *
+ * History
+ * 01/20/2004 - combined variants of original driver.
+ * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay)
+ * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud)
+ * 01/27/2004 - Little endian support Ed Okerson
+ *
+ * Tested Architectures
+ * Port Width Chip Width # of banks Flash Chip Board
+ * 32 16 1 28F128J3 seranoa/eagle
+ * 64 16 1 28F128J3 seranoa/falcon
+ *
+ */
+
+/* The DEBUG define must be before common to enable debugging */
+/* #define DEBUG */
+
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/byteorder.h>
+#include <environment.h>
+#ifdef CONFIG_FLASH_SPI
+
+/*
+ * This file implements a Common Flash Interface (CFI) driver for U-Boot.
+ * The width of the port and the width of the chips are determined at initialization.
+ * These widths are used to calculate the address for access CFI data structures.
+ * It has been tested on an Intel Strataflash implementation and AMD 29F016D.
+ *
+ * References
+ * JEDEC Standard JESD68 - Common Flash Interface (CFI)
+ * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
+ * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
+ * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
+ *
+ * TODO
+ *
+ * Use Primary Extended Query table (PRI) and Alternate Algorithm Query
+ * Table (ALT) to determine if protection is available
+ *
+ * Add support for other command sets Use the PRI and ALT to determine command set
+ * Verify erase and program timeouts.
+ */
+
+#ifndef CONFIG_FLASH_BANKS_LIST
+#define CONFIG_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
+#endif
+
+/* use CFG_MAX_FLASH_BANKS_DETECT if defined */
+#ifdef CONFIG_SYS_MAX_FLASH_BANKS_DETECT
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS_DETECT] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS_DETECT]; /* FLASH chips info */
+#else
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* FLASH chips info */
+#endif
+
+/* Support Flash ID */
+#define STM25P64 0x172020
+#define STM25P128 0x182020
+#define N25Q256 0x19ba20
+#define N25Q512 0x20ba20
+#define S25FL064A 0x160201
+#define S25FL128P 0x182001
+#define S25FL256S 0x190201
+#define W25X16 0x1530ef
+#define W25X64 0x1730ef
+#define W25Q64BV 0x1740ef
+#define W25Q128BV 0x1840ef
+#define W25Q256FV 0x1940ef
+#define MX25L1605D 0x1520C2
+#define MX25L12805D 0x1820C2
+#define MX25L25635E 0x1920C2
+#define SST25VF016B 0x4125bf
+#define SST25VF064C 0x4b25bf
+#define AT25DF161 0x02461F
+#define AT25DF321 0x01471F
+
+/* SPI Define */
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+#if defined(CONFIG_AST1300)
+#define STCBaseAddress 0x00620000
+#else
+#define STCBaseAddress 0x1e620000
+#endif
+#define SCU_REVISION_REGISTER 0x1e6e207c
+#define SCU_CACHE_CTRL_REGISTER 0x1e6e2118
+
+#define SPICtrlRegOffset 0x10
+#define SPICtrlRegOffset2 0x14
+
+#define SPIMiscCtrlRegOffset 0x54
+
+/* for DMA */
+#define REG_FLASH_INTERRUPT_STATUS 0x08
+#define REG_FLASH_DMA_CONTROL 0x80
+#define REG_FLASH_DMA_FLASH_BASE 0x84
+#define REG_FLASH_DMA_DRAM_BASE 0x88
+#define REG_FLASH_DMA_LENGTH 0x8c
+
+#define FLASH_STATUS_DMA_BUSY 0x0000
+#define FLASH_STATUS_DMA_READY 0x0800
+#define FLASH_STATUS_DMA_CLEAR 0x0800
+
+#define FLASH_DMA_ENABLE 0x01
+#else
+#define STCBaseAddress 0x16000000
+
+#define SPICtrlRegOffset 0x04
+#define SPICtrlRegOffset2 0x0C
+#endif /* CONFIG_FLASH_AST2300 */
+
+#define CMD_MASK 0xFFFFFFF8
+
+#define NORMALREAD 0x00
+#define FASTREAD 0x01
+#define NORMALWRITE 0x02
+#define USERMODE 0x03
+
+#define CE_LOW 0x00
+#define CE_HIGH 0x04
+
+/* AST2300 only */
+#define IOMODEx1 0x00000000
+#define IOMODEx2 0x20000000
+#define IOMODEx2_dummy 0x30000000
+#define IOMODEx4 0x40000000
+#define IOMODEx4_dummy 0x50000000
+
+#define DUMMY_COMMAND_OUT 0x00008000
+/* ~AST2300 only */
+
+/* specificspi */
+#define SpecificSPI_N25Q512 0x00000001
+
+static ulong AST2300_SPICLK_DIV[16] = {0x0F, 0x07, 0x0E, 0x06, 0x0D, 0x05, 0x0C, 0x04, \
+ 0x0B, 0x03, 0x0A, 0x02, 0x09, 0x01, 0x08, 0x00 };
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+static void reset_flash (flash_info_t * info);
+static void enable_write (flash_info_t * info);
+static void write_status_register (flash_info_t * info, uchar data);
+static void enable4b (flash_info_t * info);
+static void enable4b_spansion (flash_info_t * info);
+static void enable4b_numonyx (flash_info_t * info);
+static ulong flash_get_size (ulong base, int banknum);
+static int flash_write_buffer (flash_info_t *info, uchar *src, ulong addr, int len);
+#if defined(CFG_ENV_IS_IN_FLASH) || defined(CFG_ENV_ADDR_REDUND) || (CFG_MONITOR_BASE >= CFG_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base);
+#endif
+
+
+/*-----------------------------------------------------------------------
+ * create an address based on the offset and the port width
+ */
+inline uchar *flash_make_addr (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+#ifdef CONFIG_2SPIFLASH
+ if (info->start[0] >= PHYS_FLASH_2)
+ return ((uchar *) (info->start[sect] + (offset * 1) - (PHYS_FLASH_2 - PHYS_FLASH_2_BASE) ));
+ else
+ return ((uchar *) (info->start[sect] + (offset * 1)));
+#else
+ return ((uchar *) (info->start[sect] + (offset * 1)));
+#endif
+}
+
+/*-----------------------------------------------------------------------
+ * read a character at a port width address
+ */
+inline uchar flash_read_uchar (flash_info_t * info, uint offset)
+{
+ uchar *cp;
+
+ cp = flash_make_addr (info, 0, offset);
+#if defined(__LITTLE_ENDIAN)
+ return (cp[0]);
+#else
+ return (cp[1 - 1]);
+#endif
+}
+
+/*-----------------------------------------------------------------------
+ * read a short word by swapping for ppc format.
+ */
+ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ushort retval;
+
+#ifdef DEBUG
+ int x;
+#endif
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG
+ debug ("ushort addr is at %p 1 = %d\n", addr,
+ 1);
+ for (x = 0; x < 2 * 1; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ retval = ((addr[(1)] << 8) | addr[0]);
+#else
+ retval = ((addr[(2 * 1) - 1] << 8) |
+ addr[1 - 1]);
+#endif
+
+ debug ("retval = 0x%x\n", retval);
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ * read a long word by picking the least significant byte of each maiximum
+ * port size word. Swap for ppc format.
+ */
+ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ulong retval;
+
+#ifdef DEBUG
+ int x;
+#endif
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG
+ debug ("long addr is at %p 1 = %d\n", addr,
+ 1);
+ for (x = 0; x < 4 * 1; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ retval = (addr[0] << 16) | (addr[(1)] << 24) |
+ (addr[(2 * 1)]) | (addr[(3 * 1)] << 8);
+#else
+ retval = (addr[(2 * 1) - 1] << 24) |
+ (addr[(1) - 1] << 16) |
+ (addr[(4 * 1) - 1] << 8) |
+ addr[(3 * 1) - 1];
+#endif
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static void disable_cache(void)
+{
+#if defined(AST1300_CPU_CACHE_ENABLE)
+ ulong uldata;
+
+ uldata = *(volatile ulong *) (SCU_CACHE_CTRL_REGISTER);
+ uldata &= 0xfffffffd;
+ *(ulong *) (SCU_CACHE_CTRL_REGISTER) = uldata;
+#endif
+}
+
+static void enable_cache(void)
+{
+#if defined(AST1300_CPU_CACHE_ENABLE)
+ ulong uldata;
+
+ uldata = *(volatile ulong *) (SCU_CACHE_CTRL_REGISTER);
+ uldata |= 0x00000002;
+ *(ulong *) (SCU_CACHE_CTRL_REGISTER) = uldata;
+#endif
+}
+
+static void reset_flash (flash_info_t * info)
+{
+ ulong ulCtrlData, CtrlOffset, MiscCtrlOffset;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ ulCtrlData = info->iomode | (info->readcmd << 16) | (info->tCK_Read << 8) | (info->dummybyte << 6) | FASTREAD;
+#if 0
+ if (info->quadport)
+ {
+ MiscCtrlOffset = SPIMiscCtrlRegOffset;
+ *(ulong *) (STCBaseAddress + MiscCtrlOffset) = info->dummydata;
+ ulCtrlData |= DUMMY_COMMAND_OUT;
+ }
+#endif
+#else
+ ulCtrlData = (info->readcmd << 16) | (info->tCK_Read << 8) | (info->dummybyte << 6) | FASTREAD;
+ if (info->dualport)
+ ulCtrlData |= 0x08;
+#endif
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+
+ enable_cache();
+}
+
+static void enable_write (flash_info_t * info)
+{
+ ulong base;
+ ulong ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x06);
+ udelay(10);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x02));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+}
+
+static void write_status_register (flash_info_t * info, uchar data)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ enable_write (info);
+
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x01);
+ udelay(10);
+ *(uchar *) (base) = (uchar) (data);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (jReg & 0x01);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+}
+
+static void enable4b (flash_info_t * info)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0xb7);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+} /* enable4b */
+
+static void enable4b_spansion (flash_info_t * info)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ /* Enable 4B: BAR0 D[7] = 1 */
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x17);
+ udelay(10);
+ *(uchar *) (base) = (uchar) (0x80);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x16);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x80));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+} /* enable4b_spansion */
+
+static void enable4b_numonyx (flash_info_t * info)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ /* Enable Write */
+ enable_write (info);
+
+ /* Enable 4B: CMD:0xB7 */
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0xB7);
+ udelay(10);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+} /* enable4b_numonyx */
+
+/*
+ *
+ */
+static ulong flash_get_size (ulong base, int banknum)
+{
+ flash_info_t *info = &flash_info[banknum];
+ int j;
+ unsigned long sector;
+ int erase_region_size;
+ ulong ulCtrlData, CtrlOffset;
+ ulong ulID;
+ uchar ch[3];
+ ulong cpuclk, div, reg;
+ ulong WriteClk, EraseClk, ReadClk;
+ ulong vbase;
+ ulong SCURevision;
+
+ ulong ulRefPLL;
+ ulong ulDeNumerator;
+ ulong ulNumerator;
+ ulong ulOD;
+
+ disable_cache();
+
+ info->start[0] = base;
+ vbase = flash_make_addr (info, 0, 0);
+
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ CtrlOffset = SPICtrlRegOffset;
+ info->CE = 0;
+#else
+ if (vbase == PHYS_FLASH_1)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ info->CE = 2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ info->CE = 0;
+ }
+#endif
+
+ /* Get Flash ID */
+ ulCtrlData = *(ulong *) (STCBaseAddress + CtrlOffset) & CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (vbase) = (uchar) (0x9F);
+ udelay(10);
+ ch[0] = *(volatile uchar *)(vbase);
+ udelay(10);
+ ch[1] = *(volatile uchar *)(vbase);
+ udelay(10);
+ ch[2] = *(volatile uchar *)(vbase);
+ udelay(10);
+ ulCtrlData = *(ulong *) (STCBaseAddress + CtrlOffset) & CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ ulID = ((ulong)ch[0]) | ((ulong)ch[1] << 8) | ((ulong)ch[2] << 16) ;
+ info->flash_id = ulID;
+
+ //printf("SPI Flash ID: %x \n", ulID);
+
+ /* init default */
+ info->iomode = IOMODEx1;
+ info->address32 = 0;
+ info->quadport = 0;
+ info->specificspi = 0;
+
+ switch (info->flash_id)
+ {
+ case STM25P64:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 40;
+ EraseClk = 20;
+ ReadClk = 40;
+ break;
+
+ case STM25P128:
+ info->sector_count = 64;
+ info->size = 0x1000000;
+ erase_region_size = 0x40000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+ break;
+
+ case N25Q256:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case N25Q512:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ info->specificspi = SpecificSPI_N25Q512;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 1024;
+ info->size = 0x4000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case W25X16:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case W25X64:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case W25Q64BV:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 80;
+ EraseClk = 40;
+ ReadClk = 80;
+ break;
+
+ case W25Q128BV:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 104;
+ EraseClk = 50;
+ ReadClk = 104;
+ break;
+
+ case W25Q256FV:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case S25FL064A:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case S25FL128P:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 100;
+ EraseClk = 40;
+ ReadClk = 100;
+ break;
+
+ case S25FL256S:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case MX25L25635E:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ case MX25L12805D:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+/*
+SCU7C: Silicon Revision ID Register
+D[31:24]: Chip ID
+0: AST2050/AST2100/AST2150/AST2200/AST3000
+1: AST2300
+
+D[23:16] Silicon revision ID for AST2300 generation and later
+0: A0
+1: A1
+2: A2
+.
+.
+.
+FPGA revision starts from 0x80
+
+AST2300 A0 SPI can't run faster than 50Mhz
+*/
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+
+ SCURevision = *(ulong *) (SCU_REVISION_REGISTER);
+ if (((SCURevision >> 24) & 0xff) == 0x01) { //AST2300
+ if (((SCURevision >> 16) & 0xff) == 0x00) { //A0
+ WriteClk = 25;
+ EraseClk = 20;
+ ReadClk = 25;
+ }
+ }
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ case MX25L1605D:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+ break;
+
+ case SST25VF016B:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case SST25VF064C:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case AT25DF161:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case AT25DF321:
+ info->sector_count = 32;
+ info->size = 0x400000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ default: /* use JEDEC ID */
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ if ((info->flash_id & 0xFF) == 0x1F) /* Atmel */
+ {
+ switch (info->flash_id & 0x001F00)
+ {
+ case 0x000400:
+ info->sector_count = 8;
+ info->size = 0x80000;
+ break;
+ case 0x000500:
+ info->sector_count = 16;
+ info->size = 0x100000;
+ break;
+ case 0x000600:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ break;
+ case 0x000700:
+ info->sector_count = 64;
+ info->size = 0x400000;
+ break;
+ case 0x000800:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ break;
+ case 0x000900:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ break;
+ default:
+ printf("Can't support this SPI Flash!! \n");
+ return 0;
+ }
+ } /* Atmel JDEC */
+ else /* JDEC */
+ {
+ switch (info->flash_id & 0xFF0000)
+ {
+ case 0x120000:
+ info->sector_count = 4;
+ info->size = 0x40000;
+ break;
+ case 0x130000:
+ info->sector_count = 8;
+ info->size = 0x80000;
+ break;
+ case 0x140000:
+ info->sector_count =16;
+ info->size = 0x100000;
+ break;
+ case 0x150000:
+ info->sector_count =32;
+ info->size = 0x200000;
+ break;
+ case 0x160000:
+ info->sector_count =64;
+ info->size = 0x400000;
+ break;
+ case 0x170000:
+ info->sector_count =128;
+ info->size = 0x800000;
+ break;
+ case 0x180000:
+ info->sector_count =256;
+ info->size = 0x1000000;
+ break;
+ case 0x190000:
+ info->sector_count =256;
+ info->size = 0x1000000;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ case 0x200000:
+ info->sector_count =256;
+ info->size = 0x1000000;
+ if ((info->flash_id & 0xFF) == 0x20) /* numonyx */
+ info->specificspi = SpecificSPI_N25Q512;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 1024;
+ info->size = 0x4000000;
+ info->address32 = 1;
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ default:
+ printf("Can't support this SPI Flash!! \n");
+ return 0;
+ }
+ } /* JDEC */
+ }
+
+ debug ("erase_region_count = %d erase_region_size = %d\n",
+ erase_region_count, erase_region_size);
+
+ sector = base;
+ for (j = 0; j < info->sector_count; j++) {
+
+ info->start[j] = sector;
+ sector += erase_region_size;
+ info->protect[j] = 0; /* default: not protected */
+ }
+
+ /* set SPI flash extended info */
+#if defined(CONFIG_AST1300)
+ if (info->size > 0x200000) /* limit MAX Flash to 2MB for AST1300 */
+ info->size = 0x200000;
+#endif
+#if defined(CONFIG_AST2400) || defined(CONFIG_AST2300) || defined(CONFIG_AST2300_FPGA_1) || defined(CONFIG_AST2300_FPGA_2) || defined(CONFIG_AST1300)
+ reg = *((volatile ulong*) 0x1e6e2024);
+ if (reg & 0x40000)
+ {
+ reg = *((volatile ulong*) 0x1e6e2070);
+
+ ulRefPLL = 24;
+ ulDeNumerator = reg & 0x0F;
+ ulNumerator = (reg & 0x07E0) >> 5;
+ ulOD = (reg & 0x10) ? 1:2;
+
+ cpuclk = ulRefPLL * ulOD * (ulNumerator + 2) / (ulDeNumerator + 1);
+ }
+ else
+ {
+ reg = *((volatile ulong*) 0x1e6e2070);
+#if defined(CONFIG_AST2400)
+ if (reg & 0x00800000) //ref. clk:25MHz
+ {
+ switch (reg & 0x300)
+ {
+ case 0x000:
+ cpuclk = 400;
+ break;
+ case 0x100:
+ cpuclk = 375;
+ break;
+ case 0x200:
+ cpuclk = 350;
+ break;
+ case 0x300:
+ cpuclk = 325;
+ break;
+ }
+ }
+ else
+ {
+ switch (reg & 0x300) //ref. clk:24MHz
+ {
+ case 0x000:
+ cpuclk = 384;
+ break;
+ case 0x100:
+ cpuclk = 360;
+ break;
+ case 0x200:
+ cpuclk = 336;
+ break;
+ case 0x300:
+ cpuclk = 312;
+ break;
+ }
+ }
+#else
+ switch (reg & 0x300)
+ {
+ case 0x000:
+ cpuclk = 384;
+ break;
+ case 0x100:
+ cpuclk = 360;
+ break;
+ case 0x200:
+ cpuclk = 336;
+ break;
+ case 0x300:
+ cpuclk = 408;
+ break;
+ }
+#endif
+ }
+
+ reg = *((volatile ulong*) 0x1e6e2070);
+ switch (reg & 0xc00)
+ {
+ case 0x000:
+ cpuclk /= 1;
+ break;
+ case 0x400:
+ cpuclk /= 2;
+ break;
+ case 0x800:
+ cpuclk /= 4;
+ break;
+ case 0xC00:
+ cpuclk /= 3;
+ break;
+ }
+#else /* AST2100 */
+ reg = *((volatile ulong*) 0x1e6e2070);
+ switch (reg & 0xe00)
+ {
+ case 0x000:
+ cpuclk = 266;
+ break;
+ case 0x200:
+ cpuclk = 233;
+ break;
+ case 0x400:
+ cpuclk = 200;
+ break;
+ case 0x600:
+ cpuclk = 166;
+ break;
+ case 0x800:
+ cpuclk = 133;
+ break;
+ case 0xA00:
+ cpuclk = 100;
+ break;
+ case 0xC00:
+ cpuclk = 300;
+ break;
+ case 0xE00:
+ cpuclk = 24;
+ break;
+ }
+ switch (reg & 0x3000)
+ {
+ case 0x1000:
+ cpuclk /= 2;
+ break;
+ case 0x2000:
+ cpuclk /= 4;
+ break;
+ case 0x3000:
+ cpuclk /= 3;
+ break;
+ }
+#endif
+
+#if defined(CONFIG_AST2400) || defined(CONFIG_AST2300) || defined(CONFIG_AST2300_FPGA_1) || defined(CONFIG_AST2300_FPGA_2) || defined(CONFIG_AST1300)
+
+#if defined(CONFIG_AST2300) || defined(CONFIG_AST1300)
+ /* limit Max SPI CLK to 50MHz (Datasheet v1.2) */
+ if (WriteClk > 50) WriteClk = 50;
+ if (EraseClk > 50) EraseClk = 50;
+ if (ReadClk > 50) ReadClk = 50;
+#endif
+
+ div = 1;
+ while ( ((cpuclk/div) > WriteClk) && (div < 16) )
+ {
+ div++;
+ }
+ info->tCK_Write = AST2300_SPICLK_DIV[div-1];
+
+ div = 1;
+ while ( ((cpuclk/div) > EraseClk) && (div < 16) )
+ {
+ div++;
+ }
+ info->tCK_Erase = AST2300_SPICLK_DIV[div-1];
+
+ div = 1;
+ while ( ((cpuclk/div) > ReadClk) && (div < 16) )
+ {
+ div++;
+ }
+ info->tCK_Read = AST2300_SPICLK_DIV[div-1];
+#else
+ div = 2;
+ info->tCK_Write = 7;
+ while ( (cpuclk/div) > WriteClk )
+ {
+ info->tCK_Write--;
+ div +=2;
+ }
+ div = 2;
+ info->tCK_Erase = 7;
+ while ( (cpuclk/div) > EraseClk )
+ {
+ info->tCK_Erase--;
+ div +=2;
+ }
+ div = 2;
+ info->tCK_Read = 7;
+ while ( (cpuclk/div) > ReadClk )
+ {
+ info->tCK_Read--;
+ div +=2;
+ }
+#endif
+
+ /* unprotect flash */
+ write_status_register(info, 0);
+
+ if (info->quadport)
+ write_status_register(info, 0x40); /* enable QE */
+
+ if (info->address32)
+ {
+ reg = *((volatile ulong*) 0x1e6e2070); /* set H/W Trappings */
+ reg |= 0x10;
+ *((volatile ulong*) 0x1e6e2070) = reg;
+
+ reg = *((volatile ulong*) 0x1e620004); /* enable 32b control bit*/
+ reg |= (0x01 << info->CE);
+ *((volatile ulong*) 0x1e620004) = reg;
+
+ /* set flash chips to 32bits addressing mode */
+ if ((info->flash_id & 0xFF) == 0x01) /* Spansion */
+ enable4b_spansion(info);
+ else if ((info->flash_id & 0xFF) == 0x20) /* Numonyx */
+ enable4b_numonyx(info);
+ else /* MXIC, Winbond */
+ enable4b(info);
+
+ }
+
+ reset_flash(info);
+
+ return (info->size);
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_write_buffer (flash_info_t *info, uchar *src, ulong addr, int len)
+{
+ ulong j, base, offset;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ base = info->start[0];
+ offset = addr - base;
+ base = flash_make_addr (info, 0, 0);
+
+ enable_write (info);
+
+ ulCtrlData = (info->tCK_Write << 8);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x02);
+ udelay(10);
+ if (info->address32)
+ {
+ *(uchar *) (base) = (uchar) ((offset & 0xff000000) >> 24);
+ udelay(10);
+ }
+ *(uchar *) (base) = (uchar) ((offset & 0xff0000) >> 16);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x00ff00) >> 8);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x0000ff));
+ udelay(10);
+
+ for (j=0; j<len; j++)
+ {
+ *(uchar *) (base) = *(uchar *) (src++);
+ udelay(10);
+ }
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while ((jReg & 0x01));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ /* RFSR */
+ if (info->specificspi == SpecificSPI_N25Q512)
+ {
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x70);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x80));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ }
+}
+
+/*-----------------------------------------------------------------------
+ *
+ * export functions
+ *
+ */
+
+/*-----------------------------------------------------------------------
+ *
+ */
+unsigned long flash_init (void)
+{
+ unsigned long size = 0;
+ int i;
+
+ /* Init: no FLASHes known */
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
+ flash_info[i].flash_id = FLASH_UNKNOWN;
+ size += flash_info[i].size = flash_get_size (bank_base[i], i);
+ if (flash_info[i].flash_id == FLASH_UNKNOWN) {
+#ifndef CFG_FLASH_QUIET_TEST
+ printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
+ i, flash_info[i].size, flash_info[i].size << 20);
+#endif /* CFG_FLASH_QUIET_TEST */
+ }
+ }
+
+ /* Monitor protection ON by default */
+#if (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_MONITOR_BASE,
+ CONFIG_MONITOR_BASE + monitor_flash_len - 1,
+ flash_get_info(CONFIG_MONITOR_BASE));
+#endif
+
+ /* Environment protection ON by default */
+#ifdef CONFIG_ENV_IS_IN_FLASH
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR,
+ CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
+ flash_get_info(CONFIG_ENV_ADDR));
+#endif
+
+ /* Redundant environment protection ON by default */
+#ifdef CONFIG_ENV_ADDR_REDUND
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR_REDUND,
+ CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SIZE_REDUND - 1,
+ flash_get_info(CONFIG_ENV_ADDR_REDUND));
+#endif
+ return (size);
+}
+
+/*-----------------------------------------------------------------------
+ */
+#if defined(CONFIG_ENV_IS_IN_FLASH) || defined(CONFIG_ENV_ADDR_REDUND) || (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base)
+{
+ int i;
+ flash_info_t * info = 0;
+
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i ++) {
+ info = & flash_info[i];
+ if (info->size && info->start[0] <= base &&
+ base <= info->start[0] + info->size - 1)
+ break;
+ }
+
+ return i == CONFIG_SYS_MAX_FLASH_BANKS ? 0 : info;
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ */
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+ int rcode = 0;
+ int prot;
+ flash_sect_t sect;
+
+ ulong base, offset;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ disable_cache();
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ if ((s_first < 0) || (s_first > s_last)) {
+ puts ("- no sectors to erase\n");
+ return 1;
+ }
+
+ prot = 0;
+ for (sect = s_first; sect <= s_last; ++sect) {
+ if (info->protect[sect]) {
+ prot++;
+ }
+ }
+ if (prot) {
+ printf ("- Warning: %d protected sectors will not be erased!\n", prot);
+ } else {
+ putc ('\n');
+ }
+
+ ulCtrlData = (info->tCK_Erase << 8);
+ for (sect = s_first; sect <= s_last; sect++) {
+ if (info->protect[sect] == 0) { /* not protected */
+ /* start erasing */
+ enable_write(info);
+
+ base = info->start[0];
+ offset = info->start[sect] - base;
+ base = flash_make_addr (info, 0, 0);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0xd8);
+ udelay(10);
+ if (info->address32)
+ {
+ *(uchar *) (base) = (uchar) ((offset & 0xff000000) >> 24);
+ udelay(10);
+ }
+ *(uchar *) (base) = (uchar) ((offset & 0xff0000) >> 16);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x00ff00) >> 8);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x0000ff));
+ udelay(10);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while ((jReg & 0x01));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ /* RFSR */
+ if (info->specificspi == SpecificSPI_N25Q512)
+ {
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x70);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x80));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ }
+
+ putc ('.');
+ }
+ }
+ puts (" done\n");
+
+ reset_flash(info);
+
+ return rcode;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+ putc ('\n');
+ return;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+ int count;
+ unsigned char pat[] = {'|', '-', '/', '\\'};
+ int patcnt;
+
+ disable_cache();
+
+ /* get lower aligned address */
+ if (addr & (info->buffersize - 1))
+ {
+ count = cnt >= info->buffersize ? (info->buffersize - (addr & 0xff)):cnt;
+ flash_write_buffer (info, src, addr, count);
+ addr+= count;
+ src += count;
+ cnt -= count;
+ }
+
+ /* prog */
+ while (cnt > 0) {
+ count = cnt >= info->buffersize ? info->buffersize:cnt;
+ flash_write_buffer (info, src, addr, count);
+ addr+= count;
+ src += count;
+ cnt -= count;
+ printf("%c\b", pat[(patcnt++) & 0x03]);
+ }
+
+ reset_flash(info);
+
+ return (0);
+}
+
+#ifdef CONFIG_FLASH_AST2300_DMA
+void * memmove_dma(void * dest,const void *src,size_t count)
+{
+ ulong count_align, poll_time, data;
+
+ count_align = (count + 3) & 0xFFFFFFFC; /* 4-bytes align */
+ poll_time = 100; /* set 100 us as default */
+
+ /* force end of burst read */
+ *(volatile ulong *) (STCBaseAddress + SPICtrlRegOffset) |= CE_HIGH;
+ *(volatile ulong *) (STCBaseAddress + SPICtrlRegOffset) &= ~CE_HIGH;
+
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (~FLASH_DMA_ENABLE);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_FLASH_BASE) = (ulong *) (src);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_DRAM_BASE) = (ulong *) (dest);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_LENGTH) = (ulong) (count_align);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (FLASH_DMA_ENABLE);
+
+ /* wait poll */
+ do {
+ udelay(poll_time);
+ data = *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS);
+ } while (!(data & FLASH_STATUS_DMA_READY));
+
+ /* clear status */
+ *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS) |= FLASH_STATUS_DMA_CLEAR;
+}
+#endif
+#endif /* CONFIG_FLASH_SPI */
diff --git a/board/aspeed/ast2300/hactest.c b/board/aspeed/ast2300/hactest.c
new file mode 100755
index 0000000..bfa87d5
--- /dev/null
+++ b/board/aspeed/ast2300/hactest.c
@@ -0,0 +1,762 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_HACTEST) && defined(CONFIG_SLT))
+#include "hactest.h"
+
+#include "aes.c"
+#include "rc4.c"
+
+static unsigned char crypto_src[CRYPTO_MAX_SRC], crypto_dst[CRYPTO_MAX_DST], crypto_context[CRYPTO_MAX_CONTEXT];
+static unsigned char hash_src[HASH_MAX_SRC], hash_dst[HASH_MAX_DST], hmac_key[HMAC_MAX_KEY];
+
+/*
+ * table
+ */
+static aes_test aestest[] = {
+ { CRYPTOMODE_ECB, 128,
+ {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c, '\0'},
+ {0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34, '\0'},
+ {0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32, '\0'} },
+ {0xFF, 0xFF, "", "", ""}, /* End Mark */
+};
+
+static rc4_test rc4test[] = {
+ {{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, '\0'},
+ {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, '\0'}},
+ {{0xff}, {0xff}}, /* End Mark */
+};
+
+static hash_test hashtest[] = {
+ {HASHMODE_SHA1, 20,
+ "abc",
+ {0x53, 0x20, 0xb0, 0x8c, 0xa1, 0xf5, 0x74, 0x62, 0x50, 0x71, 0x89, 0x41, 0xc5, 0x0a, 0xdf, 0x4e, 0xbb, 0x55, 0x76, 0x06, '\0'}},
+ {0xFF, 0xFF, "", ""}, /* End Mark */
+};
+
+static hmac_test hmactest[] = {
+ {HASHMODE_SHA1, 64, 20,
+ {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, '\0' },
+ "Sample #1",
+ {0xbf, 0x39, 0xda, 0xb1, 0x7d, 0xc2, 0xe1, 0x23, 0x0d, 0x28, 0x35, 0x3b, 0x8c, 0xcb, 0x14, 0xb6, 0x22, 0x02, 0x65, 0xb3, '\0'}},
+ {0xFF, 0xFF, 0xFF, "", "", ""}, /* End Mark */
+};
+
+void EnableHMAC(void)
+{
+ unsigned long ulData;
+
+ /* init SCU */
+ *(unsigned long *) (0x1e6e2000) = 0x1688a8a8;
+
+ ulData = *(volatile unsigned long *) (0x1e6e200c);
+ ulData &= 0xfdfff;
+ *(unsigned long *) (0x1e6e200c) = ulData;
+ udelay(100);
+ ulData = *(volatile unsigned long *) (0x1e6e2004);
+ ulData &= 0xfffef;
+ *(unsigned long *) (0x1e6e2004) = ulData;
+
+}
+
+/* AES */
+void aes_enc_ast3000(aes_context *ctx, uint8 *input, uint8 *iv, uint8 *output, uint32 ulMsgLength , uint32 ulAESMode)
+{
+
+ unsigned long i, ulTemp, ulCommand;
+ unsigned char ch;
+ unsigned char *pjsrc, *pjdst, *pjcontext;
+
+ ulCommand = CRYPTO_ENABLE_RW | CRYPTO_ENABLE_CONTEXT_LOAD | CRYPTO_ENABLE_CONTEXT_SAVE | \
+ CRYPTO_AES | CRYPTO_ENCRYPTO | CRYPTO_SYNC_MODE_ASYNC;
+
+ switch (ctx->nr)
+ {
+ case 10:
+ ulCommand |= CRYPTO_AES128;
+ break;
+ case 12:
+ ulCommand |= CRYPTO_AES192;
+ break;
+ case 14:
+ ulCommand |= CRYPTO_AES256;
+ break;
+ }
+
+ switch (ulAESMode)
+ {
+ case CRYPTOMODE_ECB:
+ ulCommand |= CRYPTO_AES_ECB;
+ break;
+ case CRYPTOMODE_CBC:
+ ulCommand |= CRYPTO_AES_CBC;
+ break;
+ case CRYPTOMODE_CFB:
+ ulCommand |= CRYPTO_AES_CFB;
+ break;
+ case CRYPTOMODE_OFB:
+ ulCommand |= CRYPTO_AES_OFB;
+ break;
+ case CRYPTOMODE_CTR:
+ ulCommand |= CRYPTO_AES_CTR;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) crypto_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) crypto_dst);
+ pjcontext = (unsigned char *) m16byteAlignment((unsigned long) crypto_context);
+
+ /* Init HW */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CONTEXT_BASE_OFFSET) = (unsigned long) pjcontext;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_LEN_OFFSET) = ulMsgLength;
+
+ /* Set source */
+ for (i=0; i< ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(input + i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* Set Context */
+ /* Set IV */
+ for (i=0; i<16; i++)
+ {
+ ch = *(uint8 *) (iv + i);
+ *(uint8 *) (pjcontext + i) = ch;
+ }
+
+ /* Set Expansion Key */
+ for (i=0; i<(4*(ctx->nr+1)); i++)
+ {
+ ulTemp = ((ctx->erk[i] & 0xFF) << 24) + ((ctx->erk[i] & 0xFF00) << 8) + ((ctx->erk[i] & 0xFF0000) >> 8) + ((ctx->erk[i] & 0xFF000000) >> 24);
+ *(uint32 *) (pjcontext + i*4 + 16) = ulTemp;
+ }
+
+ /* fire cmd */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CMD_BASE_OFFSET) = ulCommand;
+ do {
+ ulTemp = *(volatile unsigned long *) (HAC_REG_BASE + REG_CRYPTO_STATUS_OFFSET);
+ } while (ulTemp & CRYPTO_BUSY);
+
+ /* Output */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* aes_enc_ast3000 */
+
+
+void aes_dec_ast3000(aes_context *ctx, uint8 *input, uint8 *iv, uint8 *output, uint32 ulMsgLength , uint32 ulAESMode)
+{
+ unsigned long i, ulTemp, ulCommand;
+ unsigned char ch;
+ unsigned char *pjsrc, *pjdst, *pjcontext;
+
+ ulCommand = CRYPTO_ENABLE_RW | CRYPTO_ENABLE_CONTEXT_LOAD | CRYPTO_ENABLE_CONTEXT_SAVE | \
+ CRYPTO_AES | CRYPTO_DECRYPTO | CRYPTO_SYNC_MODE_ASYNC;
+
+ switch (ctx->nr)
+ {
+ case 10:
+ ulCommand |= CRYPTO_AES128;
+ break;
+ case 12:
+ ulCommand |= CRYPTO_AES192;
+ break;
+ case 14:
+ ulCommand |= CRYPTO_AES256;
+ break;
+ }
+
+ switch (ulAESMode)
+ {
+ case CRYPTOMODE_ECB:
+ ulCommand |= CRYPTO_AES_ECB;
+ break;
+ case CRYPTOMODE_CBC:
+ ulCommand |= CRYPTO_AES_CBC;
+ break;
+ case CRYPTOMODE_CFB:
+ ulCommand |= CRYPTO_AES_CFB;
+ break;
+ case CRYPTOMODE_OFB:
+ ulCommand |= CRYPTO_AES_OFB;
+ break;
+ case CRYPTOMODE_CTR:
+ ulCommand |= CRYPTO_AES_CTR;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) crypto_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) crypto_dst);
+ pjcontext = (unsigned char *) m16byteAlignment((unsigned long) crypto_context);
+
+ /* Init HW */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CONTEXT_BASE_OFFSET) = (unsigned long) pjcontext;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_LEN_OFFSET) = ulMsgLength;
+
+ /* Set source */
+ for (i=0; i< ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(input + i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* Set Context */
+ /* Set IV */
+ for (i=0; i<16; i++)
+ {
+ ch = *(uint8 *) (iv + i);
+ *(uint8 *) (pjcontext + i) = ch;
+ }
+
+ /* Set Expansion Key */
+ for (i=0; i<(4*(ctx->nr+1)); i++)
+ {
+ ulTemp = ((ctx->erk[i] & 0xFF) << 24) + ((ctx->erk[i] & 0xFF00) << 8) + ((ctx->erk[i] & 0xFF0000) >> 8) + ((ctx->erk[i] & 0xFF000000) >> 24);
+ *(uint32 *) (pjcontext + i*4 + 16) = ulTemp;
+ }
+
+ /* fire cmd */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CMD_BASE_OFFSET) = ulCommand;
+ do {
+ ulTemp = *(volatile unsigned long *) (HAC_REG_BASE + REG_CRYPTO_STATUS_OFFSET);
+ } while (ulTemp & CRYPTO_BUSY);
+
+ /* Output */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* aes_dec_ast3000 */
+
+void rc4_crypt_ast3000(uint8 *data, int ulMsgLength, uint8 *rc4_key, uint32 ulKeyLength)
+{
+ struct rc4_state s;
+ unsigned long i, ulTemp, ulCommand;
+ unsigned char ch;
+ unsigned char *pjsrc, *pjdst, *pjcontext;
+
+ ulCommand = CRYPTO_ENABLE_RW | CRYPTO_ENABLE_CONTEXT_LOAD | CRYPTO_ENABLE_CONTEXT_SAVE | \
+ CRYPTO_RC4 | CRYPTO_SYNC_MODE_ASYNC;
+
+ rc4_setup( &s, rc4_key, ulKeyLength );
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) crypto_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) crypto_dst);
+ pjcontext = (unsigned char *) m16byteAlignment((unsigned long) crypto_context);
+
+ /* Init HW */
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_CONTEXT_BASE_OFFSET) = (unsigned long) pjcontext;
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_LEN_OFFSET) = ulMsgLength;
+
+
+ /* Set source */
+ for (i=0; i< ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(data + i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* Set Context */
+ /* Set i, j */
+ *(uint32 *) (pjcontext + 8) = 0x0001;
+
+ /* Set Expansion Key */
+ for (i=0; i<(256/4); i++)
+ {
+ ulTemp = (s.m[i * 4] & 0xFF) + ((s.m[i * 4 + 1] & 0xFF) << 8) + ((s.m[i * 4 + 2] & 0xFF) << 16) + ((s.m[i * 4+ 3] & 0xFF) << 24);
+ *(uint32 *) (pjcontext + i*4 + 16) = ulTemp;
+ }
+
+ /* fire cmd */
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_CMD_BASE_OFFSET) = ulCommand;
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_CRYPTO_STATUS_OFFSET);
+ } while (ulTemp & CRYPTO_BUSY);
+
+ /* Output */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(volatile uint8 *) (pjdst + i);
+ *(uint8 *) (data + i) = ch;
+ }
+
+} /* rc4_crypt_ast3000 */
+
+/* Hash */
+void hash_ast3000(uint8 *msg, uint32 ulLength, unsigned char *output, uint32 ulHashMode)
+{
+ uint32 i, ulTemp, ulCommand, ulDigestLength, ulMyMsgLength;
+ uint8 ch;
+ unsigned char *pjsrc, *pjdst;
+
+ /* Get Info */
+ switch (ulHashMode)
+ {
+ case HASHMODE_MD5:
+ ulCommand = HASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case HASHMODE_SHA1:
+ ulCommand = HASH_ALG_SELECT_SHA1 | 0x08;
+ ulDigestLength = 20;
+ break;
+ case HASHMODE_SHA256:
+ ulCommand = HASH_ALG_SELECT_SHA256 | 0x08;
+ ulDigestLength = 32;
+ break;
+ case HASHMODE_SHA224:
+ ulCommand = HASH_ALG_SELECT_SHA224 | 0x08;
+ ulDigestLength = 28;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) hash_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) hash_dst);
+
+ /* 16byte alignment */
+ ulMyMsgLength = m16byteAlignment(ulLength);
+
+ /* Init. HW */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_LEN_OFFSET) = ulMyMsgLength;
+
+ /* write src */
+ for (i=0; i<ulLength; i++)
+ {
+ ch = *(uint8 *)(msg+i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+ for (i=ulLength; i<ulMyMsgLength; i++)
+ *(uint8 *) (pjsrc + i) = 0;
+
+ /* fire cmd */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_CMD_OFFSET) = ulCommand;
+
+ /* get digest */
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_HASH_STATUS_OFFSET);
+ } while (ulTemp & HASH_BUSY);
+
+ for (i=0; i<ulDigestLength; i++)
+ {
+ ch = *(volatile uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* hash_ast3000 */
+
+/* HMAC */
+void hmackey_ast3000(uint8 *key, uint32 ulKeyLength, uint32 ulHashMode)
+{
+ uint32 i, ulBlkLength, ulDigestLength, ulTemp, ulCommand;
+ uint8 k0[64], sum[32];
+ uint8 ch;
+ unsigned char *pjsrc, *pjdst, *pjkey;
+
+ /* Get Info */
+ switch (ulHashMode)
+ {
+ case HASHMODE_MD5:
+ ulCommand = HASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case HASHMODE_SHA1:
+ ulCommand = HASH_ALG_SELECT_SHA1 | 0x08;
+ ulDigestLength = 20;
+ break;
+ case HASHMODE_SHA256:
+ ulCommand = HASH_ALG_SELECT_SHA256 | 0x08;
+ ulDigestLength = 32;
+ break;
+ case HASHMODE_SHA224:
+ ulCommand = HASH_ALG_SELECT_SHA224 | 0x08;
+ ulDigestLength = 28;
+ break;
+ }
+ ulBlkLength = 64; /* MD5, SHA1/256/224: 64bytes */
+
+ /* Init */
+ memset( (void *) k0, 0, 64); /* reset to zero */
+ memset( (void *) sum, 0, 32); /* reset to zero */
+
+ /* Get k0 */
+ if (ulKeyLength <= ulBlkLength)
+ memcpy( (void *) k0, (void *) key, ulKeyLength );
+ else /* (ulKeyLength > ulBlkLength) */
+ {
+ hash_ast3000(key, ulKeyLength, sum, ulHashMode);
+ memcpy( (void *) k0, (void *) sum, ulDigestLength );
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) hash_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) hash_dst);
+ pjkey = (unsigned char *) m64byteAlignment((unsigned long) hmac_key);
+
+ /* Calculate digest */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_KEY_BASE_OFFSET) = (unsigned long) pjkey;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_LEN_OFFSET) = ulBlkLength;
+
+ /* write key to src */
+ for (i=0; i<ulBlkLength; i++)
+ {
+ ch = *(uint8 *)(k0+i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* fire cmd for calculate */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_CMD_OFFSET) = ulCommand | HAC_DIGEST_CAL_ENABLE;
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_HASH_STATUS_OFFSET);
+ } while (ulTemp & HASH_BUSY);
+
+} /* hmackey_ast3000 */
+
+void hmac_ast3000(uint8 *key, uint32 ulKeyLength, uint8 *msg, uint32 ulMsgLength, uint32 ulHashMode, unsigned char *output)
+{
+ uint32 i, ulTemp, ulCommand, ulDigestLength, ulMyMsgLength;;
+ uint8 ch;
+ unsigned char *pjsrc, *pjdst, *pjkey;
+
+ /* Calculate digest */
+ switch (ulHashMode)
+ {
+ case HASHMODE_MD5:
+ ulCommand = HASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case HASHMODE_SHA1:
+ ulCommand = HASH_ALG_SELECT_SHA1 | 0x08;
+ ulDigestLength = 20;
+ break;
+ case HASHMODE_SHA256:
+ ulCommand = HASH_ALG_SELECT_SHA256 | 0x08;
+ ulDigestLength = 32;
+ break;
+ case HASHMODE_SHA224:
+ ulCommand = HASH_ALG_SELECT_SHA224 | 0x08;
+ ulDigestLength = 28;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) hash_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) hash_dst);
+ pjkey = (unsigned char *) m64byteAlignment((unsigned long) hmac_key);
+
+ /* 16byte alignment */
+ ulMyMsgLength = m16byteAlignment(ulMsgLength);
+
+ /* Init. HW */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_KEY_BASE_OFFSET) = (unsigned long) pjkey;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_LEN_OFFSET) = ulMyMsgLength;
+
+ /* write Text to src */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(msg+i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+ for (i=ulMsgLength; i<ulMyMsgLength; i++)
+ *(uint8 *) (pjsrc + i) = 0;
+
+ /* fire cmd */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_CMD_OFFSET) = ulCommand | HAC_ENABLE;
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_HASH_STATUS_OFFSET);
+ } while (ulTemp & HASH_BUSY);
+
+ /* Output Digest */
+ for (i=0; i<ulDigestLength; i++)
+ {
+ ch = *(uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* hmac_ast3000 */
+
+/* main hactest procedure */
+int do_hactest (void)
+{
+ unsigned long i, j, Flags = 0;
+ aes_test *pjaes_test;
+ aes_context aes_ctx;
+ unsigned char AES_Mode[8], aes_output[64];
+ unsigned long ulAESMsgLength;
+
+ rc4_test *pjrc4_test;
+ unsigned char rc4_buf_sw[64], rc4_buf_hw[64];
+ unsigned long ulRC4KeyLength, ulRC4MsgLength;
+
+ hash_test *pjhash_test;
+ unsigned char HASH_Mode[8], hash_out[64];
+
+ hmac_test *pjhmac_test;
+ unsigned char HMAC_Mode[8], hmac_out[64];
+
+ EnableHMAC();
+
+ /* AES Test */
+ pjaes_test = aestest;
+ while (pjaes_test->aes_mode != 0xFF)
+ {
+
+ if (pjaes_test->aes_mode == CRYPTOMODE_CBC)
+ strcpy (AES_Mode, "CBC");
+ else if (pjaes_test->aes_mode == CRYPTOMODE_CFB)
+ strcpy (AES_Mode, "CFB");
+ else if (pjaes_test->aes_mode == CRYPTOMODE_OFB)
+ strcpy (AES_Mode, "OFB");
+ else if (pjaes_test->aes_mode == CRYPTOMODE_CTR)
+ strcpy (AES_Mode, "CTR");
+ else
+ strcpy (AES_Mode, "ECB");
+
+ /* Get Msg. Length */
+ ulAESMsgLength = strlen(pjaes_test->plaintext);
+ j = ( (ulAESMsgLength + 15) >> 4) << 4;
+ for (i=ulAESMsgLength; i<j; i++)
+ pjaes_test->plaintext[i] = 0;
+ ulAESMsgLength = j;
+
+ aes_set_key(&aes_ctx, pjaes_test->key, pjaes_test->key_length);
+
+ /* Encryption Test */
+ aes_enc_ast3000(&aes_ctx, pjaes_test->plaintext, pjaes_test->key, aes_output, ulAESMsgLength, pjaes_test->aes_mode);
+ if (strncmp(aes_output, pjaes_test->ciphertext, ulAESMsgLength))
+ {
+ Flags |= FLAG_AESTEST_FAIL;
+ printf("[INFO] AES%d %s Mode Encryption Failed \n", pjaes_test->key_length, AES_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", pjaes_test->ciphertext[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", aes_output[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] AES%d %s Mode Encryption Passed \n", pjaes_test->key_length, AES_Mode);
+ */
+ }
+
+ /* Decryption Test */
+ aes_dec_ast3000(&aes_ctx, pjaes_test->ciphertext, pjaes_test->key, aes_output, ulAESMsgLength, pjaes_test->aes_mode);
+ if (strncmp(aes_output, pjaes_test->plaintext, ulAESMsgLength))
+ {
+ Flags |= FLAG_AESTEST_FAIL;
+ printf("[INFO] AES%d %s Mode Decryption Failed \n", pjaes_test->key_length, AES_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", pjaes_test->plaintext[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", aes_output[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] AES%d %s Mode Decryption Passed \n", pjaes_test->key_length, AES_Mode);
+ */
+ }
+
+ pjaes_test++;
+ } /* AES */
+
+ /* RC4 Test */
+ pjrc4_test = rc4test;
+ while ((pjrc4_test->key[0] != 0xff) && (pjrc4_test->data[0] != 0xff))
+ {
+
+ /* Get Info */
+ ulRC4KeyLength = strlen(pjrc4_test->key);
+ ulRC4MsgLength = strlen(pjrc4_test->data);
+ memcpy( (void *) rc4_buf_sw, (void *) pjrc4_test->data, ulRC4MsgLength );
+ memcpy( (void *) rc4_buf_hw, (void *) pjrc4_test->data, ulRC4MsgLength );
+
+ /* Crypto */
+ rc4_crypt_sw(rc4_buf_sw, ulRC4MsgLength, pjrc4_test->key, ulRC4KeyLength);
+ rc4_crypt_ast3000(rc4_buf_hw, ulRC4MsgLength, pjrc4_test->key, ulRC4KeyLength);
+
+ if (strncmp(rc4_buf_hw, rc4_buf_sw, ulRC4MsgLength))
+ {
+ Flags |= FLAG_RC4TEST_FAIL;
+ printf("[INFO] RC4 Encryption Failed \n");
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< ulRC4MsgLength; i++)
+ {
+ printf("%02x ", rc4_buf_sw[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< ulRC4MsgLength; i++)
+ {
+ printf("%02x ", rc4_buf_hw[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] RC4 Encryption Passed \n");
+ */
+ }
+
+ pjrc4_test++;
+
+ } /* RC4 */
+
+ /* Hash Test */
+ pjhash_test = hashtest;
+ while (pjhash_test->hash_mode != 0xFF)
+ {
+
+ if (pjhash_test->hash_mode == HASHMODE_MD5)
+ strcpy (HASH_Mode, "MD5");
+ else if (pjhash_test->hash_mode == HASHMODE_SHA1)
+ strcpy (HASH_Mode, "SHA1");
+ else if (pjhash_test->hash_mode == HASHMODE_SHA256)
+ strcpy (HASH_Mode, "SHA256");
+ else if (pjhash_test->hash_mode == HASHMODE_SHA224)
+ strcpy (HASH_Mode, "SHA224");
+
+ /* Hash */
+ hash_ast3000(pjhash_test->input, strlen(pjhash_test->input), hash_out, pjhash_test->hash_mode);
+ if (strncmp(hash_out, pjhash_test->digest, pjhash_test->digest_length))
+ {
+ Flags |= FLAG_HASHTEST_FAIL;
+ printf("[INFO] HASH %s Failed \n", HASH_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< pjhash_test->digest_length; i++)
+ {
+ printf("%02x ",pjhash_test->digest[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< pjhash_test->digest_length; i++)
+ {
+ printf("%02x ",hash_out[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] HASH %s Passed \n", HASH_Mode);
+ */
+ }
+
+ pjhash_test++;
+
+ } /* Hash Test */
+
+ /* HMAC Test */
+ pjhmac_test = hmactest;
+ while (pjhmac_test->hash_mode != 0xFF)
+ {
+
+ if (pjhmac_test->hash_mode == HASHMODE_MD5)
+ strcpy (HMAC_Mode, "MD5");
+ else if (pjhmac_test->hash_mode == HASHMODE_SHA1)
+ strcpy (HMAC_Mode, "SHA1");
+ else if (pjhmac_test->hash_mode == HASHMODE_SHA256)
+ strcpy (HMAC_Mode, "SHA256");
+ else if (pjhmac_test->hash_mode == HASHMODE_SHA224)
+ strcpy (HMAC_Mode, "SHA224");
+
+ /* HMAC */
+ hmackey_ast3000(pjhmac_test->key, pjhmac_test->key_length, pjhmac_test->hash_mode);
+ hmac_ast3000(pjhmac_test->key, pjhmac_test->key_length, pjhmac_test->input, strlen(pjhmac_test->input), pjhmac_test->hash_mode, hmac_out);
+ if (strncmp(hmac_out, pjhmac_test->digest, pjhmac_test->digest_length))
+ {
+ Flags |= FLAG_HASHTEST_FAIL;
+ printf("[INFO] HMAC %s Failed \n", HMAC_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< pjhmac_test->digest_length; i++)
+ {
+ printf("%02x ",pjhmac_test->digest[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< pjhmac_test->digest_length; i++)
+ {
+ printf("%02x ",hmac_out[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] HMAC %s Passed \n", HMAC_Mode);
+ */
+ }
+
+ pjhmac_test++;
+
+ } /* HMAC Test */
+
+ return Flags;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2300/hactest.h b/board/aspeed/ast2300/hactest.h
new file mode 100755
index 0000000..fcf2186
--- /dev/null
+++ b/board/aspeed/ast2300/hactest.h
@@ -0,0 +1,194 @@
+/*
+ * 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
+ */
+/* Err Flags */
+#define FLAG_AESTEST_FAIL 0x00000001
+#define FLAG_RC4TEST_FAIL 0x00000002
+#define FLAG_HASHTEST_FAIL 0x00000004
+
+/* Specific */
+/*
+#define DRAM_BASE 0x40000000
+#define CRYPTO_SRC_BASE (DRAM_BASE + 0x100000)
+#define CRYPTO_DST_BASE (DRAM_BASE + 0x200000)
+#define CRYPTO_CONTEXT_BASE (DRAM_BASE + 0x300000)
+
+#define HASH_SRC_BASE (DRAM_BASE + 0x400000)
+#define HASH_DST_BASE (DRAM_BASE + 0x500000)
+#define HMAC_KEY_BASE (DRAM_BASE + 0x600000)
+*/
+#define m08byteAlignment(x) ((x + 0x00000007) & 0xFFFFFFF8)
+#define m16byteAlignment(x) ((x + 0x0000000F) & 0xFFFFFFF0)
+#define m64byteAlignment(x) ((x + 0x0000003F) & 0xFFFFFFC0)
+
+#define CRYPTO_ALIGNMENT 16
+#define CRYPTO_MAX_SRC (100+CRYPTO_ALIGNMENT)
+#define CRYPTO_MAX_DST (100+CRYPTO_ALIGNMENT)
+#define CRYPTO_MAX_CONTEXT (100+CRYPTO_ALIGNMENT)
+
+#define HASH_ALIGNMENT 16
+#define HMAC_KEY_ALIGNMENT 64
+#define HASH_MAX_SRC (100+HASH_ALIGNMENT)
+#define HASH_MAX_DST (32+HASH_ALIGNMENT)
+#define HMAC_MAX_KEY (64+HMAC_KEY_ALIGNMENT)
+
+/* General */
+#define HAC_REG_BASE 0x1e6e3000
+
+#define MAX_KEYLENGTH 100
+#define MAX_TEXTLENGTH 100
+#define MAX_AESTEXTLENGTH 256
+#define MAX_RC4TEXTLENGTH 256
+#define MAX_RC4KEYLENGTH 256
+
+#define CRYPTOMODE_ECB 0x00
+#define CRYPTOMODE_CBC 0x01
+#define CRYPTOMODE_CFB 0x02
+#define CRYPTOMODE_OFB 0x03
+#define CRYPTOMODE_CTR 0x04
+
+#define HASHMODE_MD5 0x00
+#define HASHMODE_SHA1 0x01
+#define HASHMODE_SHA256 0x02
+#define HASHMODE_SHA224 0x03
+
+#define MIXMODE_DISABLE 0x00
+#define MIXMODE_CRYPTO 0x02
+#define MIXMODE_HASH 0x03
+
+#define REG_CRYPTO_SRC_BASE_OFFSET 0x00
+#define REG_CRYPTO_DST_BASE_OFFSET 0x04
+#define REG_CRYPTO_CONTEXT_BASE_OFFSET 0x08
+#define REG_CRYPTO_LEN_OFFSET 0x0C
+#define REG_CRYPTO_CMD_BASE_OFFSET 0x10
+//#define REG_CRYPTO_ENABLE_OFFSET 0x14
+#define REG_CRYPTO_STATUS_OFFSET 0x1C
+
+#define REG_HASH_SRC_BASE_OFFSET 0x20
+#define REG_HASH_DST_BASE_OFFSET 0x24
+#define REG_HASH_KEY_BASE_OFFSET 0x28
+#define REG_HASH_LEN_OFFSET 0x2C
+#define REG_HASH_CMD_OFFSET 0x30
+//#define REG_HASH_ENABLE_OFFSET 0x14
+#define REG_HASH_STATUS_OFFSET 0x1C
+
+#define HASH_BUSY 0x01
+#define CRYPTO_BUSY 0x02
+
+//#define ENABLE_HASH 0x01
+//#define DISABLE_HASH 0x00
+//#define ENABLE_CRYPTO 0x02
+//#define DISABLE_CRYPTO 0x00
+
+#define CRYPTO_SYNC_MODE_MASK 0x03
+#define CRYPTO_SYNC_MODE_ASYNC 0x00
+#define CRYPTO_SYNC_MODE_PASSIVE 0x02
+#define CRYPTO_SYNC_MODE_ACTIVE 0x03
+
+#define CRYPTO_AES128 0x00
+#define CRYPTO_AES192 0x04
+#define CRYPTO_AES256 0x08
+
+#define CRYPTO_AES_ECB 0x00
+#define CRYPTO_AES_CBC 0x10
+#define CRYPTO_AES_CFB 0x20
+#define CRYPTO_AES_OFB 0x30
+#define CRYPTO_AES_CTR 0x40
+
+#define CRYPTO_ENCRYPTO 0x80
+#define CRYPTO_DECRYPTO 0x00
+
+#define CRYPTO_AES 0x000
+#define CRYPTO_RC4 0x100
+
+#define CRYPTO_ENABLE_RW 0x000
+#define CRYPTO_ENABLE_CONTEXT_LOAD 0x000
+#define CRYPTO_ENABLE_CONTEXT_SAVE 0x000
+
+#define HASH_SYNC_MODE_MASK 0x03
+#define HASH_SYNC_MODE_ASYNC 0x00
+#define HASH_SYNC_MODE_PASSIVE 0x02
+#define HASH_SYNC_MODE_ACTIVE 0x03
+
+#define HASH_READ_SWAP_ENABLE 0x04
+#define HMAC_SWAP_CONTROL_ENABLE 0x08
+
+#define HASH_ALG_SELECT_MASK 0x70
+#define HASH_ALG_SELECT_MD5 0x00
+#define HASH_ALG_SELECT_SHA1 0x20
+#define HASH_ALG_SELECT_SHA224 0x40
+#define HASH_ALG_SELECT_SHA256 0x50
+
+#define HAC_ENABLE 0x80
+#define HAC_DIGEST_CAL_ENABLE 0x180
+#define HASH_INT_ENABLE 0x200
+
+/* AES */
+#ifndef uint8
+#define uint8 unsigned char
+#endif
+
+#ifndef uint32
+#define uint32 unsigned long int
+#endif
+
+typedef struct
+{
+ uint32 erk[64]; /* encryption round keys */
+ uint32 drk[64]; /* decryption round keys */
+ int nr; /* number of rounds */
+}
+aes_context;
+
+typedef struct
+{
+ int aes_mode;
+ int key_length;
+
+ uint8 key[32]; /* as iv in CTR mode */
+ uint8 plaintext[64];
+ uint8 ciphertext[64];
+
+}
+aes_test;
+
+/* RC4 */
+typedef struct
+{
+ uint8 key[32];
+ uint8 data[64];
+}
+rc4_test;
+
+/* Hash */
+typedef struct
+{
+ int hash_mode;
+ int digest_length;
+
+ uint8 input[64];
+ uint8 digest[64];
+
+}
+hash_test;
+
+/* HMAC */
+typedef struct
+{
+ int hash_mode;
+ int key_length;
+ int digest_length;
+
+ uint8 key[100];
+ uint8 input[64];
+ uint8 digest[64];
+
+}
+hmac_test;
diff --git a/board/aspeed/ast2300/mactest.c b/board/aspeed/ast2300/mactest.c
new file mode 100755
index 0000000..5566b65
--- /dev/null
+++ b/board/aspeed/ast2300/mactest.c
@@ -0,0 +1,504 @@
+/*
+ * 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
+ */
+/*
+ * (C) Copyright 2007 ASPEED Software
+ * MAC Manufacture Test in ASPEED's SDK version 0.20.01
+ *
+ * Release History
+ * 1. First Release, river@20071130
+ * 2. Fix the endless loop when PHY is not ready, river@20071204
+ *
+ * Test items:
+ * 1. Support MARVELL PHY only in this version
+ * 2. MDC/MDIO
+ * 3. GMAC/Duplex TX/RX Full_Size, Packet_Length Test
+ * 4. 100M/Duplex TX/RX Full_Size, Packet_Length Test
+ *
+ *
+ *
+*/
+
+
+/*
+* Diagnostics support
+*/
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include <malloc.h>
+#include <net.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_MACTEST) && defined(CONFIG_SLT))
+#include "mactest.h"
+
+static int INL(u_long base, u_long addr)
+{
+ return le32_to_cpu(*(volatile u_long *)(addr + base));
+}
+
+static void OUTL(u_long base, int command, u_long addr)
+{
+ *(volatile u_long *)(addr + base) = cpu_to_le32(command);
+}
+
+
+static void SCU_MAC1_Enable (void)
+{
+ unsigned int SCU_Register;
+
+//MAC1 RESET/PHY_LINK in SCU
+ SCU_Register = INL(SCU_BASE, SCU_RESET_CONTROL_REG);
+ OUTL(SCU_BASE, SCU_Register & ~(0x800), SCU_RESET_CONTROL_REG);
+
+}
+
+/*------------------------------------------------------------
+ . Reads a register from the MII Management serial interface
+ .-------------------------------------------------------------*/
+static u16 phy_read_register (u8 PHY_Register, u8 PHY_Address)
+{
+ u32 Data, Status = 0, Loop_Count = 0, PHY_Ready = 1;
+ u16 Return_Data;
+
+ OUTL(MAC1_IO_BASE, (PHY_Register << 21) + (PHY_Address << 16) + MIIRD + MDC_CYCTHR, PHYCR_REG);
+ do {
+ Status = (INL (MAC1_IO_BASE, PHYCR_REG) & MIIRD);
+ Loop_Count++;
+ if (Loop_Count >= PHY_LOOP) {
+ PHY_Ready = 0;
+ break;
+ }
+ } while (Status == MIIRD);
+
+ if (PHY_Ready == 0) {
+ printf ("PHY NOT REDAY\n");
+ return 0;
+ }
+
+ udelay(5*1000);
+ Data = INL (MAC1_IO_BASE, PHYDATA_REG);
+ Return_Data = (Data >> 16);
+
+ return Return_Data;
+}
+
+static void phy_write_register (u8 PHY_Register, u8 PHY_Address, u16 PHY_Data)
+{
+ u32 Status = 0, Loop_Count = 0, PHY_Ready = 1;
+
+ OUTL(MAC1_IO_BASE, PHY_Data, PHYDATA_REG);
+ OUTL(MAC1_IO_BASE, (PHY_Register << 21) + (PHY_Address << 16) + MIIWR + MDC_CYCTHR, PHYCR_REG);
+ do {
+ Status = (INL (MAC1_IO_BASE, PHYCR_REG) & MIIWR);
+ Loop_Count++;
+ if (Loop_Count >= PHY_LOOP) {
+ PHY_Ready = 0;
+ break;
+ }
+ } while (Status == MIIWR);
+ if (PHY_Ready == 0) {
+ printf ("PHY NOT REDAY\n");
+ }
+}
+
+static int wait_link_resolve (void)
+{
+ int resolved_status, Loop_Count = 0, PHY_Ready = 1;
+
+ do {
+ resolved_status = (phy_read_register (0x11, 0) & (PHY_RESOLVED_bit | PHY_LINK_bit));
+ Loop_Count++;
+ if (Loop_Count >= PHY_LOOP) {
+ PHY_Ready = 0;
+ printf ("PHY NOT READY\n");
+ break;
+ }
+ } while (resolved_status != (PHY_RESOLVED_bit | PHY_LINK_bit));
+
+ return PHY_Ready;
+}
+
+static void set_phy_speed (int chip, int speed, int duplex)
+{
+ unsigned short data, status;
+
+
+ if (chip == PHYID_VENDOR_MARVELL) {
+ if ((speed == PHY_SPEED_1G) && (duplex == DUPLEX_FULL)) {
+//Manual Control
+ phy_write_register (18, 0, 0);
+ data = phy_read_register (9, 0);
+ phy_write_register (9, 0, data | 0x1800);
+//PHY Reset
+ phy_write_register (0, 0, 0x0140 | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+
+//Force 1G
+ phy_write_register (29, 0, 0x07);
+ data = phy_read_register (30, 0);
+ phy_write_register (30, 0, data | 0x08);
+ phy_write_register (29, 0, 0x10);
+ data = phy_read_register (30, 0);
+ phy_write_register (30, 0, data | 0x02);
+ phy_write_register (29, 0, 0x12);
+ data = phy_read_register (30, 0);
+ phy_write_register (30, 0, data | 0x01);
+
+ printf ("FORCE MARVELL PHY to 1G/DUPLEX DONE\n");
+ }
+ else if ((speed == PHY_SPEED_100M) && (duplex == DUPLEX_FULL)) {
+//PHY Reset
+ phy_write_register (0, 0, 0x2100 | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+
+//Force 100M
+ data = phy_read_register (0, 0);
+ phy_write_register (0, 0, data | 0x4000 | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+ data = phy_read_register (0, 0);
+
+ printf ("FORCE MARVELL PHY to 100M/DUPLEX DONE\n");
+ }
+ }
+ else if ( (chip == PHYID_VENDOR_RTL8201E) || (chip == PHYID_VENDOR_BROADCOM) ){
+ /* basic setting */
+ data = phy_read_register (0, 0);
+ data &= 0x7140;
+ data |= 0x4000;
+ if (speed == PHY_SPEED_100M)
+ data |= 0x2000;
+ if (duplex == DUPLEX_FULL)
+ data |= 0x0100;
+ phy_write_register (0, 0, data);
+
+ /* reset */
+ phy_write_register (0, 0, data | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+ udelay(100*1000);
+
+ /* basic setting */
+ phy_write_register (0, 0, data);
+
+ if (chip == PHYID_VENDOR_RTL8201E)
+ printf ("FORCE RTL8201E PHY to 100M/DUPLEX DONE\n");
+ else if (chip == PHYID_VENDOR_BROADCOM)
+ printf ("FORCE Broadcom PHY to 100M/DUPLEX DONE\n");
+
+ }
+
+}
+
+static void MAC1_reset (void)
+{
+ OUTL(MAC1_IO_BASE, SW_RST_bit, MACCR_REG);
+ for (; (INL(MAC1_IO_BASE, MACCR_REG ) & SW_RST_bit) != 0; ) {udelay(1000);}
+ OUTL(MAC1_IO_BASE, 0, IER_REG );
+}
+
+static int set_mac1_control_register (int Chip_ID)
+{
+ unsigned long MAC_CR_Register = 0;
+ int PHY_Ready = 1;
+ u16 PHY_Status, PHY_Speed, PHY_Duplex, Advertise, Link_Partner;
+
+ MAC_CR_Register = SPEED_100M_MODE_bit | RX_ALLADR_bit | FULLDUP_bit | RXMAC_EN_bit | RXDMA_EN_bit | TXMAC_EN_bit | TXDMA_EN_bit | CRC_APD_bit;
+
+ if ( (Chip_ID == PHYID_VENDOR_BROADCOM) || (Chip_ID == PHYID_VENDOR_RTL8201E)) {
+ Advertise = phy_read_register (0x04, 0);
+ Link_Partner = phy_read_register (0x05, 0);
+ Advertise = (Advertise & PHY_SPEED_DUPLEX_MASK);
+ Link_Partner = (Link_Partner & PHY_SPEED_DUPLEX_MASK);
+ if ((Advertise & Link_Partner) & PHY_100M_DUPLEX) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_100M_HALF) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_DUPLEX) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_HALF) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ }
+ else if (Chip_ID == PHYID_VENDOR_MARVELL) {
+
+ PHY_Ready = wait_link_resolve ();
+
+ if (PHY_Ready == 1) {
+ PHY_Status = phy_read_register (0x11, 0);
+ PHY_Speed = (PHY_Status & PHY_SPEED_MASK) >> 14;
+ PHY_Duplex = (PHY_Status & PHY_DUPLEX_MASK) >> 13;
+
+ if (PHY_Speed == SPEED_1000M) {
+ MAC_CR_Register |= GMAC_MODE_bit;
+ }
+ else {
+ MAC_CR_Register &= ~GMAC_MODE_bit;
+ if (PHY_Speed == SPEED_10M) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ }
+ }
+ if (PHY_Duplex == DUPLEX_HALF) {
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ }
+ }
+ OUTL(MAC1_IO_BASE, MAC_CR_Register, MACCR_REG);
+
+ return PHY_Ready;
+}
+
+static void ring_buffer_alloc (void)
+{
+ unsigned int i, j;
+
+//Write data into TX buffer
+ for (i = 0; i < NUM_TX; i++) {
+ for (j = 0; j < TX_BUFF_SZ; j++) {
+ tx_buffer[i][j] = i * 4 + j;
+ }
+ }
+//Initialize RX buffer to 0
+ for (i = 0; i < NUM_RX; i++) {
+ for (j = 0; j < RX_BUFF_SZ; j++) {
+ rx_buffer[i][j] = 0;
+ }
+ }
+//Prepare descriptor
+ for (i = 0; i < NUM_RX; i++) {
+ rx_ring[i].status = cpu_to_le32(RXPKT_RDY + RX_BUFF_SZ);
+ rx_ring[i].buf = ((u32) &rx_buffer[i]);
+ rx_ring[i].reserved = 0;
+ }
+ for (i = 0; i < NUM_TX; i++) {
+ tx_ring[i].status = 0;
+ tx_ring[i].des1 = 0;
+ tx_ring[i].buf = ((u32) &tx_buffer[i]);
+ tx_ring[i].reserved = 0;
+ }
+
+ rx_ring[NUM_RX - 1].status |= cpu_to_le32(EDORR);
+ tx_ring[NUM_TX - 1].status |= cpu_to_le32(EDOTR);
+
+ OUTL(MAC1_IO_BASE, ((u32) &tx_ring), TXR_BADR_REG);
+ OUTL(MAC1_IO_BASE, ((u32) &rx_ring), RXR_BADR_REG);
+
+ tx_new = 0;
+ rx_new = 0;
+}
+
+static int packet_test (void)
+{
+ unsigned int rx_status, length, i, Loop_Count = 0;
+
+ tx_ring[tx_new].status |= cpu_to_le32(LTS | FTS | TX_BUFF_SZ);
+ tx_ring[tx_new].status |= cpu_to_le32(TXDMA_OWN);
+ OUTL(MAC1_IO_BASE, POLL_DEMAND, TXPD_REG);
+
+//Compare result
+ do {
+ rx_status = rx_ring[rx_new].status;
+ Loop_Count++;
+ } while (!(rx_status & RXPKT_STATUS) && (Loop_Count < PHY_LOOP));
+ if (rx_status & (RX_ERR | CRC_ERR | FTL | RUNT | RX_ODD_NB)) {
+ /* There was an error.*/
+ printf("RX error status = 0x%08X\n", rx_status);
+ return PACKET_TEST_FAIL;
+ } else {
+ length = (rx_status & BYTE_COUNT_MASK);
+ for (i = 0; i < RX_BUFF_SZ / 4; i++) {
+ if (rx_buffer[rx_new][i] != tx_buffer[tx_new][i]) {
+ printf ("ERROR at packet %d, address %x\n", rx_new, i);
+ printf ("Gold = %8x, Real = %8x\n", tx_buffer[tx_new][i], rx_buffer[rx_new][i]);
+ return PACKET_TEST_FAIL;
+ }
+ }
+ }
+ tx_new = (tx_new + 1) % NUM_TX;
+ rx_new = (rx_new + 1) % NUM_RX;
+
+ return TEST_PASS;
+}
+
+static int packet_length_test (int packet_length)
+{
+ unsigned int rx_status, length, i, Loop_Count = 0;
+
+ tx_ring[tx_new].status &= (~(BYTE_COUNT_MASK));
+ tx_ring[tx_new].status |= cpu_to_le32(LTS | FTS | packet_length);
+ tx_ring[tx_new].status |= cpu_to_le32(TXDMA_OWN);
+ OUTL(MAC1_IO_BASE, POLL_DEMAND, TXPD_REG);
+
+//Compare result
+ do {
+ rx_status = rx_ring[rx_new].status;
+ Loop_Count++;
+ } while (!(rx_status & RXPKT_STATUS) && (Loop_Count < PHY_LOOP));
+ if (rx_status & (RX_ERR | CRC_ERR | FTL | RUNT | RX_ODD_NB)) {
+ /* There was an error.*/
+ printf("RX error status = 0x%08X\n", rx_status);
+ return PACKET_LENGTH_TEST_FAIL;
+ } else {
+ length = (rx_status & BYTE_COUNT_MASK) - 4;
+ if (length != packet_length) {
+ printf ("Received Length ERROR. Gold = %d, Fail = %d\n",packet_length, length);
+ printf ("rx_new = %d, tx_new = %d\n", rx_new, tx_new);
+ return PACKET_LENGTH_TEST_FAIL;
+ }
+ for (i = 0; i < length; i++) {
+ if (rx_buffer[rx_new][i] != tx_buffer[tx_new][i]) {
+ printf ("ERROR at packet %d, address %x\n", rx_new, i);
+ printf ("Gold = %8x, Real = %8x\n", tx_buffer[tx_new][i], rx_buffer[rx_new][i]);
+ return PACKET_LENGTH_TEST_FAIL;
+ }
+ }
+ }
+ rx_ring[rx_new].status &= (~(RXPKT_STATUS));
+ tx_new = (tx_new + 1) % NUM_TX;
+ rx_new = (rx_new + 1) % NUM_RX;
+
+ return TEST_PASS;
+}
+
+static int MAC1_init (int id)
+{
+ int phy_status = 0;
+
+ MAC1_reset ();
+ phy_status = set_mac1_control_register (id);
+ ring_buffer_alloc ();
+
+ return phy_status;
+}
+
+int do_mactest (void)
+{
+ unsigned int phy_id, i;
+ int test_result = 0, phy_status = 0;
+
+ SCU_MAC1_Enable();
+ phy_id = ((phy_read_register (0x02, 0) << 16) + phy_read_register (0x03, 0)) & PHYID_VENDOR_MASK;
+ if (phy_id == PHYID_VENDOR_MARVELL) {
+ printf ("PHY DETECTED ------> MARVELL\n");
+
+ set_phy_speed (phy_id, PHY_SPEED_1G, DUPLEX_FULL);
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 0; i < NUM_TX; i++) {
+ test_result |= packet_test ();
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 60; i < TX_BUFF_SZ; i++) {
+ test_result |= packet_length_test (i);
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ set_phy_speed (phy_id, PHY_SPEED_100M, DUPLEX_FULL);
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 0; i < NUM_TX; i++) {
+ test_result |= packet_test ();
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 60; i < TX_BUFF_SZ; i++) {
+ test_result |= packet_length_test (i);
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ }
+ else if ( (phy_id == PHYID_VENDOR_RTL8201E) || (phy_id == PHYID_VENDOR_BROADCOM) ){
+
+ if (phy_id == PHYID_VENDOR_RTL8201E)
+ printf ("PHY DETECTED ------> RTL 8201E \n");
+ else if (phy_id == PHYID_VENDOR_BROADCOM)
+ printf ("PHY DETECTED ------> Broadcom \n");
+
+ set_phy_speed (phy_id, PHY_SPEED_100M, DUPLEX_FULL);
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 0; i < NUM_TX; i++) {
+ test_result |= packet_test ();
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 60; i < TX_BUFF_SZ; i++) {
+ test_result |= packet_length_test (i);
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ }
+
+ if ((phy_status == 0) && (test_result & PACKET_TEST_FAIL)) {
+ printf ("Packet Test FAIL !\n");
+ }
+ else if ((phy_status == 0) && (test_result & PACKET_LENGTH_TEST_FAIL)) {
+ printf ("Packet Length Test FAIL !\n");
+ }
+
+ return test_result;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2300/mactest.h b/board/aspeed/ast2300/mactest.h
new file mode 100755
index 0000000..e75b7bb
--- /dev/null
+++ b/board/aspeed/ast2300/mactest.h
@@ -0,0 +1,215 @@
+/*
+ * 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
+ */
+/* MACTest.h */
+
+// --------------------------------------------------------------------
+// General Definition
+// --------------------------------------------------------------------
+#define MAC1_IO_BASE 0x1E660000
+#define PHY_LOOP 100000
+#define NUM_RX 48
+#define NUM_TX 48
+#define RX_BUFF_SZ 1514
+#define TX_BUFF_SZ 1514
+#define TOUT_LOOP 1000000
+#define ETH_ALEN 6
+#define POLL_DEMAND 1
+
+
+// --------------------------------------------------------------------
+// MAC Register Index
+// --------------------------------------------------------------------
+#define ISR_REG 0x00 // interrups status register
+#define IER_REG 0x04 // interrupt maks register
+#define MAC_MADR_REG 0x08 // MAC address (Most significant)
+#define MAC_LADR_REG 0x0c // MAC address (Least significant)
+#define MAHT0_REG 0x10 // Multicast Address Hash Table 0 register
+#define MAHT1_REG 0x14 // Multicast Address Hash Table 1 register
+#define TXPD_REG 0x18 // Transmit Poll Demand register
+#define RXPD_REG 0x1c // Receive Poll Demand register
+#define TXR_BADR_REG 0x20 // Transmit Ring Base Address register
+#define RXR_BADR_REG 0x24 // Receive Ring Base Address register
+#define HPTXPD_REG 0x28
+#define HPTXR_BADR_REG 0x2c
+#define ITC_REG 0x30 // interrupt timer control register
+#define APTC_REG 0x34 // Automatic Polling Timer control register
+#define DBLAC_REG 0x38 // DMA Burst Length and Arbitration control register
+#define DMAFIFOS_REG 0x3c
+#define FEAR_REG 0x44
+#define TPAFCR_REG 0x48
+#define RBSR_REG 0x4c
+#define MACCR_REG 0x50 // MAC control register
+#define MACSR_REG 0x54 // MAC status register
+#define PHYCR_REG 0x60 // PHY control register
+#define PHYDATA_REG 0x64 // PHY Write Data register
+
+// --------------------------------------------------------------------
+// PHYCR_REG
+// --------------------------------------------------------------------
+#define PHY_RE_AUTO_bit (1UL<<9)
+#define PHY_READ_bit (1UL<<26)
+#define PHY_WRITE_bit (1UL<<27)
+// --------------------------------------------------------------------
+// PHYCR_REG
+// --------------------------------------------------------------------
+#define PHY_AUTO_OK_bit (1UL<<5)
+// --------------------------------------------------------------------
+// PHY INT_STAT_REG
+// --------------------------------------------------------------------
+#define PHY_SPEED_CHG_bit (1UL<<14)
+#define PHY_DUPLEX_CHG_bit (1UL<<13)
+#define PHY_LINK_CHG_bit (1UL<<10)
+#define PHY_AUTO_COMP_bit (1UL<<11)
+// --------------------------------------------------------------------
+// PHY SPE_STAT_REG
+// --------------------------------------------------------------------
+#define PHY_RESOLVED_bit (1UL<<11)
+#define PHY_LINK_bit (1UL<<10)
+#define PHY_SPEED_mask 0xC000
+#define PHY_SPEED_10M 0x0
+#define PHY_SPEED_100M 0x1
+#define PHY_SPEED_1G 0x2
+#define PHY_DUPLEX_mask 0x2000
+#define PHY_SPEED_DUPLEX_MASK 0x01E0
+#define PHY_100M_DUPLEX 0x0100
+#define PHY_100M_HALF 0x0080
+#define PHY_10M_DUPLEX 0x0040
+#define PHY_10M_HALF 0x0020
+#define LINK_STATUS 0x04
+#define PHYID_VENDOR_MASK 0xfffffc00
+#define PHYID_VENDOR_MARVELL 0x01410c00
+#define PHYID_VENDOR_BROADCOM 0x00406000
+#define PHYID_VENDOR_RTL8201E 0x001cc800
+#define DUPLEX_FULL 0x01
+#define DUPLEX_HALF 0x00
+
+
+
+// --------------------------------------------------------------------
+// MACCR_REG
+// --------------------------------------------------------------------
+
+#define SW_RST_bit (1UL<<31) // software reset/
+#define DIRPATH_bit (1UL<<21)
+#define RX_IPCS_FAIL_bit (1UL<<20)
+#define SPEED_100M_MODE_bit (1UL<<19)
+#define RX_UDPCS_FAIL_bit (1UL<<18)
+#define RX_BROADPKT_bit (1UL<<17) // Receiving broadcast packet
+#define RX_MULTIPKT_bit (1UL<<16) // receiving multicast packet
+#define RX_HT_EN_bit (1UL<<15)
+#define RX_ALLADR_bit (1UL<<14) // not check incoming packet's destination address
+#define JUMBO_LF_bit (1UL<<13)
+#define RX_RUNT_bit (1UL<<12) // Store incoming packet even its length is les than 64 byte
+#define CRC_CHK_bit (1UL<<11)
+#define CRC_APD_bit (1UL<<10) // append crc to transmit packet
+#define GMAC_MODE_bit (1UL<<9)
+#define FULLDUP_bit (1UL<<8) // full duplex
+#define ENRX_IN_HALFTX_bit (1UL<<7)
+#define LOOP_EN_bit (1UL<<6) // Internal loop-back
+#define HPTXR_EN_bit (1UL<<5)
+#define REMOVE_VLAN_bit (1UL<<4)
+#define RXMAC_EN_bit (1UL<<3) // receiver enable
+#define TXMAC_EN_bit (1UL<<2) // transmitter enable
+#define RXDMA_EN_bit (1UL<<1) // enable DMA receiving channel
+#define TXDMA_EN_bit (1UL<<0) // enable DMA transmitting channel
+
+
+// --------------------------------------------------------------------
+// SCU_REG
+// --------------------------------------------------------------------
+#define SCU_BASE 0x1E6E2000
+#define SCU_PROTECT_KEY_REG 0x0
+#define SCU_PROT_KEY_MAGIC 0x1688a8a8
+#define SCU_RESET_CONTROL_REG 0x04
+#define SCU_RESET_MAC1 (1u << 11)
+#define SCU_RESET_MAC2 (1u << 12)
+#define SCU_HARDWARE_TRAPPING_REG 0x70
+#define SCU_HT_MAC_INTF_LSBIT 6
+#define SCU_HT_MAC_INTERFACE (0x7u << SCU_HT_MAC_INTF_LSBIT)
+#define MAC_INTF_SINGLE_PORT_MODES (1u<<0/*GMII*/ | 1u<<3/*MII_ONLY*/ | 1u<<4/*RMII_ONLY*/)
+#define SCU_HT_MAC_GMII 0x0u
+// MII and MII mode
+#define SCU_HT_MAC_MII_MII 0x1u
+#define SCU_HT_MAC_MII_ONLY 0x3u
+#define SCU_HT_MAC_RMII_ONLY 0x4u
+#define SCU_MULTIFUNCTION_PIN_REG 0x74
+#define SCU_MFP_MAC2_PHYLINK (1u << 26)
+#define SCU_MFP_MAC1_PHYLINK (1u << 25)
+#define SCU_MFP_MAC2_MII_INTF (1u << 21)
+#define SCU_MFP_MAC2_MDC_MDIO (1u << 20)
+#define SCU_SILICON_REVISION_REG 0x7C
+
+//---------------------------------------------------
+// PHY R/W Register Bit
+//---------------------------------------------------
+#define MIIWR (1UL<<27)
+#define MIIRD (1UL<<26)
+#define MDC_CYCTHR 0x34
+#define PHY_SPEED_MASK 0xC000
+#define PHY_DUPLEX_MASK 0x2000
+#define SPEED_1000M 0x02
+#define SPEED_100M 0x01
+#define SPEED_10M 0x00
+#define DUPLEX_FULL 0x01
+#define DUPLEX_HALF 0x00
+#define RESOLVED_BIT 0x800
+
+#define PHY_SPEED_DUPLEX_MASK 0x01E0
+#define PHY_100M_DUPLEX 0x0100
+#define PHY_100M_HALF 0x0080
+#define PHY_10M_DUPLEX 0x0040
+#define PHY_10M_HALF 0x0020
+
+//---------------------------------------------------
+// Descriptor bits.
+//---------------------------------------------------
+#define TXDMA_OWN 0x80000000 /* Own Bit */
+#define RXPKT_RDY 0x00000000
+#define RXPKT_STATUS 0x80000000
+#define EDORR 0x40000000 /* Receive End Of Ring */
+#define LRS 0x10000000 /* Last Descriptor */
+#define RD_ES 0x00008000 /* Error Summary */
+#define EDOTR 0x40000000 /* Transmit End Of Ring */
+#define T_OWN 0x80000000 /* Own Bit */
+#define LTS 0x10000000 /* Last Segment */
+#define FTS 0x20000000 /* First Segment */
+#define CRC_ERR 0x00080000
+#define TD_ES 0x00008000 /* Error Summary */
+#define TD_SET 0x08000000 /* Setup Packet */
+#define RX_ERR 0x00040000
+#define FTL 0x00100000
+#define RUNT 0x00200000
+#define RX_ODD_NB 0x00400000
+#define BYTE_COUNT_MASK 0x00003FFF
+
+//---------------------------------------------------
+// SPEED/DUPLEX Parameters
+//---------------------------------------------------
+
+//---------------------------------------------------
+// Return Status
+//---------------------------------------------------
+#define TEST_PASS 0
+#define PACKET_TEST_FAIL 1
+#define PACKET_LENGTH_TEST_FAIL 2
+
+struct mac_desc {
+ volatile s32 status;
+ u32 des1;
+ u32 reserved;
+ u32 buf;
+};
+static struct mac_desc rx_ring[NUM_RX] __attribute__ ((aligned(32))); /* RX descriptor ring */
+static struct mac_desc tx_ring[NUM_TX] __attribute__ ((aligned(32))); /* TX descriptor ring */
+static int rx_new; /* RX descriptor ring pointer */
+static int tx_new; /* TX descriptor ring pointer */
+static volatile unsigned char rx_buffer[NUM_RX][RX_BUFF_SZ] __attribute__ ((aligned(32))); /* RX buffer */
+static volatile unsigned char tx_buffer[NUM_TX][TX_BUFF_SZ] __attribute__ ((aligned(32))); /* TX buffer */
diff --git a/board/aspeed/ast2300/mictest.c b/board/aspeed/ast2300/mictest.c
new file mode 100755
index 0000000..1b2b342
--- /dev/null
+++ b/board/aspeed/ast2300/mictest.c
@@ -0,0 +1,146 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_MICTEST) && defined(CONFIG_SLT))
+#include "mictest.h"
+
+static unsigned char ctrlbuf[MIC_MAX_CTRL];
+static unsigned char chksumbuf[MIC_MAX_CHKSUM];
+
+void vInitSCU(void)
+{
+ unsigned long ulData;
+
+ *(unsigned long *) (0x1e6e2000) = 0x1688A8A8;
+
+ udelay(100);
+
+ ulData = *(unsigned long *) (0x1e6e2004);
+ ulData &= 0xbffff;
+ *(unsigned long *) (0x1e6e2004) = ulData;
+
+}
+
+void vInitMIC(void)
+{
+ unsigned long i, j, ulPageNumber;
+ unsigned char *pjctrl, *pjsum;
+
+ ulPageNumber = DRAMSIZE >> 12;
+
+ pjctrl = (unsigned char *)(m16byteAlignment((unsigned long) ctrlbuf));
+ pjsum = (unsigned char *)(m16byteAlignment((unsigned long) chksumbuf));
+
+ /* init ctrl buffer (2bits for one page) */
+ for (i=0; i< (ulPageNumber/4); i++)
+ *(unsigned char *) (pjctrl + i) = DEFAULT_CTRL;
+
+ /* init chksum buf (4bytes for one page) */
+ for (i=0; i<ulPageNumber; i++)
+ *(unsigned long *) (pjsum + i*4) = DEFAULT_CHKSUM;
+
+ *(unsigned long *) (MIC_BASE + MIC_CTRLBUFF_REG) = (unsigned long) pjctrl;
+ *(unsigned long *) (MIC_BASE + MIC_CHKSUMBUF_REG) = (unsigned long) pjsum;
+ *(unsigned long *) (MIC_BASE + MIC_RATECTRL_REG) = (unsigned long) DEFAULT_RATE;
+ *(unsigned long *) (MIC_BASE + MIC_ENGINECTRL_REG) = MIC_ENABLE_MIC | (DRAMSIZE - 0x1000);
+
+}
+
+void vDisableMIC(void)
+{
+ *(unsigned long *) (MIC_BASE + MIC_ENGINECTRL_REG) = MIC_RESET_MIC;
+
+}
+
+int do_chksum(void)
+{
+ unsigned long i, j, k, ulPageNumber;
+ int Status = 0;
+ unsigned short tmp;
+ volatile unsigned long sum1, sum2;
+ unsigned long goldensum, chksum;
+ unsigned long len, tlen;
+ unsigned char *pjsum;
+
+ ulPageNumber = DRAMSIZE >> 12;
+ pjsum = (unsigned char *)(m16byteAlignment((unsigned long) chksumbuf));
+
+ /* start test */
+ for (i=0; i<ulPageNumber; i++)
+ {
+
+ sum1 = 0xffff, sum2 = 0xffff;
+ len = 0x0800;
+ j = 0;
+
+ while (len)
+ {
+ tlen = len > 360 ? 360 : len;
+ len -= tlen;
+ do {
+ tmp = *(unsigned short *) (DRAM_BASE + ((i << 12) + j));
+ sum1 += (unsigned long) tmp;
+ sum2 += sum1;
+ j+=2;
+ } while (--tlen);
+ sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+ }
+
+ sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+
+ goldensum = (sum2 << 16) | sum1;
+ k= 0;
+ do {
+ chksum = *(unsigned long *) (pjsum + i*4);
+ udelay(100);
+ k++;
+ } while ((chksum == 0) && (k<1000));
+
+ if (chksum != goldensum)
+ {
+ Status = 1;
+ printf("[FAIL] MIC Chksum Failed at Page %x \n", i);
+ }
+
+ } /* end of i loop */
+
+ return (Status);
+
+}
+
+int do_mictest (void)
+{
+ unsigned long Flags = 0;
+
+ vInitSCU();
+ vInitMIC();
+
+ if (do_chksum())
+ Flags = 1;
+
+ vDisableMIC();
+
+ return Flags;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2300/mictest.h b/board/aspeed/ast2300/mictest.h
new file mode 100755
index 0000000..e14bb41
--- /dev/null
+++ b/board/aspeed/ast2300/mictest.h
@@ -0,0 +1,55 @@
+/*
+ * 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
+ */
+/* Macro */
+#define m08byteAlignment(x) ((x + 0x00000007) & 0xFFFFFFF8)
+#define m16byteAlignment(x) ((x + 0x0000000F) & 0xFFFFFFF0)
+#define m64byteAlignment(x) ((x + 0x0000003F) & 0xFFFFFFC0)
+
+/* Options */
+#define MIC_TEST_PAGE 32
+#define DRAMSIZE (MIC_TEST_PAGE * 0x1000)
+#define MIC_MAX_CTRL (MIC_TEST_PAGE / 4 + 16)
+#define MIC_MAX_CHKSUM (MIC_TEST_PAGE * 4 + 16)
+
+/* Default Setting */
+#define DEFAULT_RATE 0x00000000
+#define DEFAULT_CTRL 0xFF
+#define DEFAULT_CHKSUM 0x00000000
+#define DEFAULT_WRITEBACK 0x08880000
+
+/* Reg. Definition */
+#define DRAM_BASE 0x40000000
+#define MIC_BASE 0x1e640000
+#define MIC_CTRLBUFF_REG 0x00
+#define MIC_CHKSUMBUF_REG 0x04
+#define MIC_RATECTRL_REG 0x08
+#define MIC_ENGINECTRL_REG 0x0C
+#define MIC_STOPPAGE_REG 0x10
+#define MIC_STATUS_REG 0x14
+#define MIC_STATUS1_REG 0x18
+#define MIC_STATUS2_REG 0x1C
+
+#define MIC_RESET_MIC 0x00000000
+#define MIC_ENABLE_MIC 0x10000000
+#define MIC_MAXPAGE_MASK 0x0FFFF000
+#define MIC_WRITEBACK_MASK 0xFFFF0000
+#define MIC_STOPPAGE_MASK 0x0000FFFF
+#define MIC_PAGEERROR 0x40000000
+#define MIC_PAGE1ERROR 0x10000000
+#define MIC_PAGE2ERROR 0x20000000
+#define MIC_INTMASK 0x00060000
+#define MIC_ERRPAGENO_MASK 0x0000FFFF
+
+#define MIC_CTRL_MASK 0x03
+#define MIC_CTRL_SKIP 0x00
+#define MIC_CTRL_CHK1 0x01
+#define MIC_CTRL_CHK2 0x02
+#define MIC_CTRL_CHK3 0x03
diff --git a/board/aspeed/ast2300/pci.c b/board/aspeed/ast2300/pci.c
new file mode 100755
index 0000000..5b17466
--- /dev/null
+++ b/board/aspeed/ast2300/pci.c
@@ -0,0 +1,243 @@
+/*
+ * 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, or (at
+ * your option) any later version.
+ */
+
+#include <common.h>
+#include <pci.h>
+
+#ifdef CONFIG_PCI
+
+#define PCI_CSR_BASE 0x60000000
+#define ASPEED_PCI_IO_BASE 0x00000000
+#define ASPEED_PCI_IO_SIZE 0x00010000
+#define ASPEED_PCI_MEM_BASE 0x68000000
+#define ASPEED_PCI_MEM_SIZE 0x18000000
+
+#define CSR_CRP_CMD_OFFSET 0x00
+#define CSR_CRP_WRITE_OFFSET 0x04
+#define CSR_CRP_READ_OFFSET 0x08
+#define CSR_PCI_ADDR_OFFSET 0x0C
+#define CSR_PCI_CMD_OFFSET 0x10
+#define CSR_PCI_WRITE_OFFSET 0x14
+#define CSR_PCI_READ_OFFSET 0x18
+#define CSR_PCI_STATUS_OFFSET 0x1C
+
+#define CRP_ADDR_REG (volatile ulong*) (PCI_CSR_BASE + CSR_CRP_CMD_OFFSET)
+#define CRP_WRITE_REG (volatile ulong*) (PCI_CSR_BASE + CSR_CRP_WRITE_OFFSET)
+#define CRP_READ_REG (volatile ulong*) (PCI_CSR_BASE + CSR_CRP_READ_OFFSET)
+#define PCI_ADDR_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_ADDR_OFFSET)
+#define PCI_CMD_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_CMD_OFFSET)
+#define PCI_WRITE_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_WRITE_OFFSET)
+#define PCI_READ_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_READ_OFFSET)
+
+#define PCI_CMD_READ 0x0A
+#define PCI_CMD_WRITE 0x0B
+
+#define RESET_PCI_STATUS *(volatile ulong*) (PCI_CSR_BASE + CSR_PCI_STATUS_OFFSET) = 0x01
+#define CHK_PCI_STATUS (*(volatile ulong*) (PCI_CSR_BASE + CSR_PCI_STATUS_OFFSET) & 0x03)
+
+static int pci_config_access (u8 access_type, u32 dev, u32 reg, u32 * data)
+{
+ u32 bus;
+ u32 device;
+ u32 function;
+
+ bus = ((dev & 0xff0000) >> 16);
+ device = ((dev & 0xf800) >> 11);
+ function = (dev & 0x0700);
+
+ if (bus == 0) {
+ // Type 0 Configuration
+ *PCI_ADDR_REG = (u32) (1UL << device | function | (reg & 0xfc));
+ } else {
+ // Type 1 Configuration
+ *PCI_ADDR_REG = (u32) (dev | ((reg / 4) << 2) | 1);
+ }
+
+ RESET_PCI_STATUS;
+
+ if (access_type == PCI_CMD_WRITE) {
+ *PCI_CMD_REG = (ulong) PCI_CMD_WRITE;
+ *PCI_WRITE_REG = *data;
+ } else {
+ *PCI_CMD_REG = (ulong) PCI_CMD_READ;
+ *data = *PCI_READ_REG;
+ }
+
+ return (CHK_PCI_STATUS);
+}
+
+static int aspeed_pci_read_config_byte (u32 hose, u32 dev, u32 reg, u8 * val)
+{
+ u32 data;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data)) {
+ *val = 0;
+ return -1;
+ }
+
+ *val = (data >> ((reg & 3) << 3)) & 0xff;
+
+ return 0;
+}
+
+
+static int aspeed_pci_read_config_word (u32 hose, u32 dev, u32 reg, u16 * val)
+{
+ u32 data;
+
+ if (reg & 1)
+ return -1;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data)) {
+ *val = 0;
+ return -1;
+ }
+
+ *val = (data >> ((reg & 3) << 3)) & 0xffff;
+
+ return 0;
+}
+
+
+static int aspeed_pci_read_config_dword (u32 hose, u32 dev, u32 reg,
+ u32 * val)
+{
+ u32 data = 0;
+
+ if (reg & 3)
+ return -1;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data)) {
+ *val = 0;
+ return -1;
+ }
+
+ *val = data;
+
+ return (0);
+}
+
+static int aspeed_pci_write_config_byte (u32 hose, u32 dev, u32 reg, u8 val)
+{
+ u32 data = 0;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data))
+ return -1;
+
+ data = (data & ~(0xff << ((reg & 3) << 3))) | (val <<
+ ((reg & 3) << 3));
+
+ if (pci_config_access (PCI_CMD_WRITE, dev, reg, &data))
+ return -1;
+
+ return 0;
+}
+
+
+static int aspeed_pci_write_config_word (u32 hose, u32 dev, u32 reg, u16 val)
+{
+ u32 data = 0;
+
+ if (reg & 1)
+ return -1;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data))
+ return -1;
+
+ data = (data & ~(0xffff << ((reg & 3) << 3))) | (val <<
+ ((reg & 3) << 3));
+
+ if (pci_config_access (PCI_CMD_WRITE, dev, reg, &data))
+ return -1;
+
+ return 0;
+}
+
+static int aspeed_pci_write_config_dword (u32 hose, u32 dev, u32 reg, u32 val)
+{
+ u32 data;
+
+ if (reg & 3) {
+ return -1;
+ }
+
+ data = val;
+
+ if (pci_config_access (PCI_CMD_WRITE, dev, reg, &data))
+ return -1;
+
+ return (0);
+}
+
+/*
+ * Initialize PCIU
+ */
+aspeed_pciu_init ()
+{
+
+ unsigned long reg;
+
+ /* Reset PCI Host */
+ reg = *((volatile ulong*) 0x1e6e2004);
+ *((volatile ulong*) 0x1e6e2004) = reg | 0x00280000;
+
+ reg = *((volatile ulong*) 0x1e6e2074); /* REQ2 */
+ *((volatile ulong*) 0x1e6e2074) = reg | 0x00000010;
+
+ *((volatile ulong*) 0x1e6e2008) |= 0x00080000;
+ reg = *((volatile ulong*) 0x1e6e200c);
+ *((volatile ulong*) 0x1e6e200c) = reg & 0xfff7ffff;
+ udelay(1);
+ *((volatile ulong*) 0x1e6e2004) &= 0xfff7ffff;
+
+ /* Initial PCI Host */
+ RESET_PCI_STATUS;
+
+ *CRP_ADDR_REG = ((ulong)(PCI_CMD_READ) << 16) | 0x04;
+ reg = *CRP_READ_REG;
+
+ *CRP_ADDR_REG = ((ulong)(PCI_CMD_WRITE) << 16) | 0x04;
+ *CRP_WRITE_REG = reg | 0x07;
+
+}
+
+/*
+ * Initialize Module
+ */
+
+void aspeed_init_pci (struct pci_controller *hose)
+{
+ hose->first_busno = 0;
+ hose->last_busno = 0xff;
+
+ aspeed_pciu_init (); /* Initialize PCIU */
+
+ /* PCI memory space #1 */
+ pci_set_region (hose->regions + 0,
+ ASPEED_PCI_MEM_BASE, ASPEED_PCI_MEM_BASE, ASPEED_PCI_MEM_SIZE, PCI_REGION_MEM);
+
+ /* PCI I/O space */
+ pci_set_region (hose->regions + 1,
+ ASPEED_PCI_IO_BASE, ASPEED_PCI_IO_BASE, ASPEED_PCI_IO_SIZE, PCI_REGION_IO);
+
+ hose->region_count = 2;
+
+ hose->read_byte = aspeed_pci_read_config_byte;
+ hose->read_word = aspeed_pci_read_config_word;
+ hose->read_dword = aspeed_pci_read_config_dword;
+ hose->write_byte = aspeed_pci_write_config_byte;
+ hose->write_word = aspeed_pci_write_config_word;
+ hose->write_dword = aspeed_pci_write_config_dword;
+
+ pci_register_hose (hose);
+
+ hose->last_busno = pci_hose_scan (hose);
+
+ return;
+}
+#endif /* CONFIG_PCI */
+
diff --git a/board/aspeed/ast2300/platform.S b/board/aspeed/ast2300/platform.S
new file mode 100644
index 0000000..27e8f26
--- /dev/null
+++ b/board/aspeed/ast2300/platform.S
@@ -0,0 +1,3089 @@
+/*
+ * 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
+ */
+/*
+ * Board specific setup info
+ *
+ ******************************************************************************
+ * ASPEED Technology Inc.
+ * AST2300/AST2400 DDR2/DDR3 SDRAM controller initialization and calibration sequence
+ *
+ * Gary Hsu, <gary_hsu@aspeedtech.com>
+ *
+ * Release date: 2014.12.29 formal release for SDK0.60
+ *
+ * Modified list from v0.23
+ * EC1. Modify DQIDLY and DQSI-MCLK2X calibration algorithm
+ * EC2. Remove pass 2 DQIDLY finetune process
+ * EC3. Modify ECC code
+ * EC4. Add AST2400 supporting
+ * EC5. Add SPI timing calibration for AST2400
+ * EC6. Remove AST2300-A0 PCI-e workaround
+ * EC7. Add CK duty calibration for AST2400
+ * EC8. Remove #define CONFIG_DRAM_UART_OUT, default has message output to UART5
+ * EC9. Add DRAM size auto-detection
+ * EC10. Add GPIO register clear when watchdog reboot (only for AST2400)
+ * EC11. Move the "Solve ASPM" code position of AST2300 to avoid watchdog reset
+ *
+ * Modified list from v0.53
+ * EC1. Add solution of LPC lock issue due to watchdog reset. (AP note A2300-11)
+ *
+ * Modified list from v0.56
+ * EC1. Fix read DQS input mask window too late issue if DRAM's t_DQSCK is earlier too much
+ * (ex. Nanya NT5CB64M16FP)
+ * 1. Change init value of MCR18[4] from '1' to '0'
+ * 2. Add CBR4 code to finetune MCR18[4]
+ *
+ * Modified list from v0.59
+ * EC1. Add DQS input gating window delay tuning (1/2 T) when CBR retry
+ * EC2. Modify DLL1 MAdj = 0x4C
+ *
+ * Optional define variable
+ * 1. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 2. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * // when enabled, must define the ECC protected memory size at 0x1e6e0054
+ * 3. UART5 message output //
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ ******************************************************************************
+ */
+
+#include <config.h>
+#include <version.h>
+/******************************************************************************
+ Calibration Macro Start
+ Usable registers:
+ r0, r1, r2, r3, r5, r6, r7, r8, r9, r10, r11
+ ******************************************************************************/
+/* PATTERN_TABLE,
+ init_delay_timer,
+ check_delay_timer,
+ clear_delay_timer,
+ record_dll2_pass_range,
+ record_dll2_pass_range_h,
+ are for DRAM calibration */
+
+PATTERN_TABLE:
+ .word 0xff00ff00
+ .word 0xcc33cc33
+ .word 0xaa55aa55
+ .word 0x88778877
+ .word 0x92cc4d6e @ 5
+ .word 0x543d3cde
+ .word 0xf1e843c7
+ .word 0x7c61d253
+ .word 0x00000000 @ 8
+
+ .macro init_delay_timer
+ ldr r0, =0x1e782024 @ Set Timer3 Reload
+ str r2, [r0]
+
+ ldr r0, =0x1e6c0038 @ Clear Timer3 ISR
+ ldr r1, =0x00040000
+ str r1, [r0]
+
+ ldr r0, =0x1e782030 @ Enable Timer3
+ ldr r1, [r0]
+ mov r2, #7
+ orr r1, r1, r2, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6c0090 @ Check ISR for Timer3 timeout
+ .endm
+
+ .macro check_delay_timer
+ ldr r1, [r0]
+ bic r1, r1, #0xFFFBFFFF
+ mov r2, r1, lsr #18
+ cmp r2, #0x01
+ .endm
+
+ .macro clear_delay_timer
+ ldr r0, =0x1e782030 @ Disable Timer3
+ ldr r1, [r0]
+ bic r1, r1, #0x00000F00
+ str r1, [r0]
+
+ ldr r0, =0x1e6c0038 @ Clear Timer3 ISR
+ ldr r1, =0x00040000
+ str r1, [r0]
+ .endm
+
+ .macro record_dll2_pass_range
+ ldr r1, [r0]
+ bic r2, r1, #0xFFFFFF00
+ cmp r2, r3 @ record min
+ bicgt r1, r1, #0x000000FF
+ orrgt r1, r1, r3
+ bic r2, r1, #0xFFFF00FF
+ cmp r3, r2, lsr #8 @ record max
+ bicgt r1, r1, #0x0000FF00
+ orrgt r1, r1, r3, lsl #8
+ str r1, [r0]
+ .endm
+
+ .macro record_dll2_pass_range_h
+ ldr r1, [r0]
+ bic r2, r1, #0xFF00FFFF
+ mov r2, r2, lsr #16
+ cmp r2, r3 @ record min
+ bicgt r1, r1, #0x00FF0000
+ orrgt r1, r1, r3, lsl #16
+ bic r2, r1, #0x00FFFFFF
+ cmp r3, r2, lsr #24 @ record max
+ bicgt r1, r1, #0xFF000000
+ orrgt r1, r1, r3, lsl #24
+ str r1, [r0]
+ .endm
+
+ .macro init_spi_checksum
+ ldr r0, =0x1e620084
+ ldr r1, =0x20010000
+ str r1, [r0]
+ ldr r0, =0x1e62008C
+ ldr r1, =0x20000200
+ str r1, [r0]
+ ldr r0, =0x1e620080
+ ldr r1, =0x0000000D
+ orr r2, r2, r7
+ orr r1, r1, r2, lsl #8
+ and r2, r6, #0xF
+ orr r1, r1, r2, lsl #4
+ str r1, [r0]
+ ldr r0, =0x1e620008
+ ldr r2, =0x00000800
+ .endm
+
+/******************************************************************************
+ Calibration Macro End
+ ******************************************************************************/
+LPC_Patch: @ load to SRAM base 0x1e720400
+ str r1, [r0]
+ str r3, [r2]
+ bic r1, r1, #0xFF
+LPC_Patch_S1:
+ subs r5, r5, #0x01
+ moveq pc, r8
+ ldr r3, [r2]
+ tst r3, #0x01
+ movne pc, r8
+ mov pc, r7
+LPC_Patch_S2: @ load to SRAM base 0x1e720480
+ str r1, [r0]
+ mov pc, r9
+LPC_Patch_E:
+
+.globl lowlevel_init
+lowlevel_init:
+
+init_dram:
+ /* save lr */
+ mov r4, lr
+/* Test - DRAM initial time */
+ ldr r0, =0x1e782044
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e782030
+ ldr r1, [r0]
+ bic r1, r1, #0x0000F000
+ str r1, [r0]
+ mov r2, #3
+ orr r1, r1, r2, lsl #12
+ str r1, [r0]
+/* Test - DRAM initial time */
+
+ /*Set Scratch register Bit 7 before initialize*/
+ ldr r0, =0x1e6e2000
+ ldr r1, =0x1688a8a8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2040
+ ldr r1, [r0]
+ orr r1, r1, #0x80
+ str r1, [r0]
+
+ /* Fix LPC lock issue for AST2300 */
+ ldr r0, =0x1e6e207c @ Check AST2300
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x01
+ bne lpc_recover_end @ not match AST2300
+
+ mov r3, #0x0
+lpc_recover_check:
+ ldr r0, =0x1e78900c @ check HICR3[4]=0x1
+ ldr r1, [r0]
+ tst r1, #0x10
+ beq lpc_recover_end
+ ldr r0, =0x1e789004 @ check HICR1[7]=0x1
+ ldr r1, [r0]
+ tst r1, #0x80
+ beq lpc_recover_end
+ ldr r0, =0x1e7890a0 @ check LHCR0[27:24]=0x6
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ and r1, r1, #0xF
+ cmp r1, #0x06
+ bne lpc_recover_end
+ add r3, r3, #0x01
+ cmp r3, #0x5 @ repeat 5 times
+ ble lpc_recover_check
+
+ mov r3, #0x0
+lpc_recover_init:
+ ldr r0, =0x1e7890a4 @ set LHCR1[1:0]=0x0
+ ldr r1, =0x00000000
+ str r1, [r0]
+ add r3, r3, #0x01
+ cmp r3, #0x20
+ bge lpc_recover_end
+ ldr r1, [r0]
+ tst r1, #0x01
+ bne lpc_recover_init
+
+ ldr r0, =0x1e7890b0 @ set LHCR4[7:0]=0xFF
+ ldr r1, =0x000000FF
+ str r1, [r0]
+ ldr r0, =0x1e7890b4 @ set LHCR5[31:0]=0xFFFFFFFF
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+ ldr r0, =0x1e7890b8 @ set LHCR6[31:0]=0xFFFFFFFF
+ str r1, [r0]
+
+ adr r6, LPC_Patch
+ adr r7, LPC_Patch_S2
+ ldr r0, =0x1e720400
+copy_lpc_patch_1:
+ ldr r1, [r6]
+ str r1, [r0]
+ add r6, r6, #0x4
+ add r0, r0, #0x4
+ cmp r6, r7
+ bne copy_lpc_patch_1
+
+ adr r6, LPC_Patch_S2
+ adr r7, LPC_Patch_E
+ ldr r0, =0x1e720480
+copy_lpc_patch_2:
+ ldr r1, [r6]
+ str r1, [r0]
+ add r6, r6, #0x4
+ add r0, r0, #0x4
+ cmp r6, r7
+ bne copy_lpc_patch_2
+
+ ldr r0, =0x1e7890a0 @ set LHCR0[31:0]=0xFFFFFF01
+ ldr r1, =0xFFFFFF01
+ add r2, r0, #0x4
+ mov r3, #0x01
+ mov r5, #0x10
+ adr r9, lpc_recover_end
+ adr r6, LPC_Patch
+ adr r7, LPC_Patch_S1
+ sub r6, r7, r6
+ ldr r7, =0x1e720400
+ add r7, r7, r6
+ ldr r8, =0x1e720480
+ ldr pc, =0x1e720400
+
+lpc_recover_end:
+ ldr r0, =0x1e7890a0 @ set LHCR0[31:0]=0xFFFFFF00
+ ldr r1, =0xFFFFFF00
+ str r1, [r0]
+ /* <END> Fix LPC lock issue for AST2300 */
+
+ /* Check Scratch Register Bit 6 */
+ ldr r0, =0x1e6e2040
+ ldr r1, [r0]
+ bic r1, r1, #0xFFFFFFBF
+ mov r2, r1, lsr #6
+ cmp r2, #0x01
+ beq platform_exit
+
+ ldr r2, =0x033103F1 @ load PLL parameter for 24Mhz CLKIN (396:324)
+/* ldr r2, =0x019001F0 @ load PLL parameter for 24Mhz CLKIN (408:336) */
+ ldr r0, =0x1e6e207c @ Check Revision ID
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x02
+ bne set_MPLL @ not match AST2400
+
+ ldr r0, =0x1e6e2070 @ Check CLKIN freq
+ ldr r1, [r0]
+ mov r1, r1, lsr #23
+ tst r1, #0x01
+ ldrne r2, =0x017001D0 @ load PLL parameter for 25Mhz CLKIN (400:325)
+
+set_MPLL:
+ ldr r0, =0x1e6e2020 @ M-PLL (DDR SDRAM) Frequency
+ ldr r1, =0xFFFF
+#if defined(CONFIG_DRAM_336)
+ mov r2, r2, lsr #16
+#endif
+ and r1, r2, r1
+ str r1, [r0]
+
+/* Debug - UART console message */
+ ldr r0, =0x1e78400c
+ mov r1, #0x83
+ str r1, [r0]
+
+ ldr r0, =0x1e6e202c
+ ldr r2, [r0]
+ mov r2, r2, lsr #12
+ tst r2, #0x01
+ ldr r0, =0x1e784000
+ moveq r1, #0x0D @ Baudrate 115200
+ movne r1, #0x01 @ Baudrate 115200, div13
+#if defined(CONFIG_DRAM_UART_38400)
+ moveq r1, #0x27 @ Baudrate 38400
+ movne r1, #0x03 @ Baudrate 38400 , div13
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e784004
+ mov r1, #0x00
+ str r1, [r0]
+
+ ldr r0, =0x1e78400c
+ mov r1, #0x03
+ str r1, [r0]
+
+ ldr r0, =0x1e784008
+ mov r1, #0x07
+ str r1, [r0]
+
+ ldr r0, =0x1e784000
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+ mov r1, #0x41 @ 'A'
+ str r1, [r0]
+ mov r1, #0x4D @ 'M'
+ str r1, [r0]
+ mov r1, #0x20 @ ' '
+ str r1, [r0]
+ mov r1, #0x49 @ 'I'
+ str r1, [r0]
+ mov r1, #0x6E @ 'n'
+ str r1, [r0]
+ mov r1, #0x69 @ 'i'
+ str r1, [r0]
+ mov r1, #0x74 @ 't'
+ str r1, [r0]
+ mov r1, #0x2D @ '-'
+ str r1, [r0]
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ /* Delay about 100us */
+ ldr r0, =0x1e782030 @ Init Timer3 Control
+ ldr r1, [r0]
+ bic r1, r1, #0x00000F00
+ str r1, [r0]
+
+ ldr r2, =0x00000064 @ Set Timer3 Reload = 100 us
+ init_delay_timer
+delay_0:
+ check_delay_timer
+ bne delay_0
+ clear_delay_timer
+ /* end delay 100us */
+
+/******************************************************************************
+ Init DRAM common registers
+ ******************************************************************************/
+ ldr r0, =0x1e6e0000
+ ldr r1, =0xfc600309
+ str r1, [r0]
+
+ /* Reset MMC */
+ ldr r1, =0x00000000
+ ldr r0, =0x1e6e0034
+ str r1, [r0]
+ ldr r0, =0x1e6e0018
+ str r1, [r0]
+ ldr r0, =0x1e6e0024
+ str r1, [r0]
+ ldr r0, =0x1e6e0064 @ REG_MADJ, power down DLL
+ str r1, [r0]
+
+ ldr r1, =0x00034C4C @ REG_MADJ, reset DLL
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068 @ REG_SADJ
+ ldr r1, =0x00001800
+ str r1, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000B @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay_1:
+ check_delay_timer
+ bne delay_1
+ clear_delay_timer
+ /* end delay 10us */
+
+ ldr r0, =0x1e6e0064 @ REG_MADJ | 0xC0000, enable DLL
+ ldr r1, [r0]
+ ldr r2, =0xC0000
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0008
+ ldr r1, =0x0090040f /* VGA */
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x4000A120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00000120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0038
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0040
+ ldr r1, =0xFF444444
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0044
+ ldr r1, =0x22222222
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0048
+ ldr r1, =0x22222222
+ str r1, [r0]
+
+ ldr r0, =0x1e6e004c
+ ldr r1, =0x22222222
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x80000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0054
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0060 @ REG_DRV
+ ldr r1, =0x000000FA @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x000000FA
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0074
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0078
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e007c
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0080
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0084
+ ldr r1, =0x00FFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0088 @ REG_DQIDLY
+ ldr r1, =0x00000089 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000074
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0020 @ REG_DQSIC
+ ldr r1, =0x000000E2 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x000000BA
+#endif
+ str r1, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000B @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay_2:
+ check_delay_timer
+ bne delay_2
+ clear_delay_timer
+ /* end delay 10us */
+
+ /* Check DRAM Type by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xFEFFFFFF @ bit[24]=1 => DDR2
+ mov r2, r1, lsr #24
+ cmp r2, #0x01
+ beq ddr2_init
+ b ddr3_init
+.LTORG
+
+/******************************************************************************
+ DDR3 Init
+
+ tRCD = 15 ns
+ tRAS = 37.5 ns
+ tRRD = max(4 CK,10 ns)
+ tRP = 15 ns
+ tRFC = 110ns/1Gbit, 160ns/2Gbit, 300ns/4Gbit
+ tRTP = max(4 CK,7.5 ns)
+ tWR = 15 ns
+ tXSNR = max(10 CK,200 ns)
+ tWTR = max(4 CK,7.5 ns)
+ tFAW = 50 ns
+ tMRD = max(15 CK,20 ns)
+ ******************************************************************************/
+ddr3_init:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x33 @ '3'
+ str r1, [r0]
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0004
+ ldr r1, =0x00000531 @ Default set to 1Gbit
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0010 @ REG_AC1
+ ldr r1, =0x33302825 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x22202725
+#endif
+ str r1, [r0]
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #9 @ Set CL
+ ldr r1, =0x00020000
+ add r2, r2, r1
+ ldr r1, [r0]
+ bic r1, r1, #0xFBFFFFFF
+ mov r1, r1, lsr #6 @ Set CWL
+ orr r2, r2, r1
+ ldr r1, =0x00300000
+ add r2, r2, r1
+
+ ldr r0, =0x1e6e0014 @ REG_AC2
+ ldr r1, =0xCC00963F @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0xAA007636
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0004 @ check 2400 mode
+ ldr r2, [r0]
+ mov r2, r2, lsr #10
+
+ ldr r0, =0x1e6e006c @ REG_IOZ
+ ldr r1, =0x00002312 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00002312
+#endif
+ tst r2, #0x01
+ moveq r1, r1, lsr #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ mov r1, #0
+ str r1, [r0]
+ tst r2, #0x01 @ check AST2300
+ beq CBRDLL1_2300_Start
+ ldr r0, =0x1e6e207c @ check AST2400 revision A0
+ ldr r1, [r0]
+ mov r1, r1, lsr #16
+ and r1, r1, #0xFF
+ cmp r1, #0x0
+ beq CBRDLL1_2300_Start
+ b CBRDLL1_2400_Start
+MCLK2X_Phase_CBR_Done_DDR3:
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ orr r1, r1, #0x40
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0034
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c
+ ldr r1, =0x00000040
+ str r1, [r0]
+
+ /* Delay about 400us */
+ ldr r2, =0x00000190 @ Set Timer3 Reload = 400 us
+ init_delay_timer
+delay3_4:
+ check_delay_timer
+ bne delay3_4
+ clear_delay_timer
+ /* end delay 400us */
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #21 @ Set CL
+ ldr r1, =0x00000010
+ add r2, r2, r1
+ ldr r1, [r0]
+ bic r1, r1, #0xFBFFFFFF
+ mov r1, r1, lsr #7 @ Set CWL
+ orr r2, r2, r1
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x04001700 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x04001500
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x00000000 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000000
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS2
+ ldr r1, =0x00000005
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS3
+ ldr r1, =0x00000007
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x04001600 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x04001400
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Refresh 8 times
+ ldr r1, =0x00005C48
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Set refresh cycle
+ ldr r1, =0x00002001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0014
+ ldr r1, [r0]
+ bic r1, r1, #0xFFF9FFFF
+ mov r2, r1, lsr #3 @ get CL
+
+ ldr r0, =0x1e6e0034 @ REG_PWC
+ ldr r1, =0x00000303 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000303
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ b Calibration_Start
+.LTORG
+/******************************************************************************
+ End DDR3 Init
+ ******************************************************************************/
+
+/******************************************************************************
+ DDR2 Init
+
+ tRCD = 15 ns
+ tRAS = 45 ns
+ tRRD = 10 ns
+ tRP = 15 ns
+ tRFC = 105ns/512Mbit, 127.5ns/1Gbit, 197.5ns/2Gbit, 327.5ns/4Gbit
+ tRTP = 7.5 ns
+ tWR = 15 ns
+ tXSNR = 200 ns
+ tWTR = 7.5 ns
+ tFAW = 50 ns
+ tMRD = 4 CK
+ ******************************************************************************/
+ddr2_init:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x32 @ '2'
+ str r1, [r0]
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0004
+ ldr r1, =0x00000510 @ Default set to 512Mbit
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0010 @ REG_AC1
+ ldr r1, =0x33302714 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x22201613
+#endif
+ str r1, [r0]
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #5 @ Set CL
+ mov r1, r2, lsr #4 @ Set CWL
+ orr r2, r2, r1
+ ldr r1, =0x00110000
+ add r2, r2, r1
+
+ ldr r0, =0x1e6e0014 @ REG_AC2
+ ldr r1, =0xCC00B03F @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0xAA00903B
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0004 @ check 2400 mode
+ ldr r2, [r0]
+ mov r2, r2, lsr #10
+
+ ldr r0, =0x1e6e006c @ REG_IOZ
+ ldr r1, =0x00002312 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00002312
+#endif
+ tst r2, #0x01
+ moveq r1, r1, lsr #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ mov r1, #1
+ str r1, [r0]
+ tst r2, #0x01 @ check AST2300
+ beq CBRDLL1_2300_Start
+ ldr r0, =0x1e6e207c @ check AST2400 revision A0
+ ldr r1, [r0]
+ mov r1, r1, lsr #16
+ and r1, r1, #0xFF
+ cmp r1, #0x0
+ beq CBRDLL1_2300_Start
+ b CBRDLL1_2400_Start
+MCLK2X_Phase_CBR_Done_DDR2:
+
+ ldr r0, =0x1e6e0034
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ /* Delay about 400us */
+ ldr r2, =0x00000190 @ Set Timer3 Reload = 400 us
+ init_delay_timer
+delay2_4:
+ check_delay_timer
+ bne delay2_4
+ clear_delay_timer
+ /* end delay 400us */
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #21 @ Set CL
+ ldr r1, =0x00000040
+ orr r2, r2, r1
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x00000D03 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000B03
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x00000040 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000040
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS2
+ ldr r1, =0x00000005
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS3
+ ldr r1, =0x00000007
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Refresh 8 times
+ ldr r1, =0x00005C08
+ str r1, [r0]
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x00000C03 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000A03
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x000003C0 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x000003C0
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x00000040 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000040
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Set refresh cycle
+ ldr r1, =0x00002001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0014
+ ldr r1, [r0]
+ bic r1, r1, #0xFFF9FFFF
+ mov r2, r1, lsr #3 @ get CL
+
+ ldr r0, =0x1e6e0034 @ REG_PWC
+ ldr r1, =0x00000503 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000503
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ b Calibration_Start
+.LTORG
+/******************************************************************************
+ End DDR2 Init
+ ******************************************************************************/
+/******************************************************************************
+ DDR CK duty finetune program
+ SRAM buffer definition
+ 0x1E720204 : gdll golden DLL1 record
+ 0x1E720208 : gduty golden duty setting record
+ 0x1E72020C : gdutysum golden duty data record
+ 0x1E720210 : duty record of delay 0 invert
+ 0x1E720214 : duty record of delay 1 invert
+ ....
+ 0x1E72024C : duty record of delay 15 invert
+ 0x1E720250 : duty record of delay 0
+ 0x1E720254 : duty record of delay 1
+ ....
+ 0x1E72028C : duty record of delay 15
+
+ Register usage
+ r0 - r3 = free
+ r4 = record the return pc value, do not use
+ r5 = free
+ r6 = free
+ r7 = duty count
+ r8 = gdll
+ r9 = gduty
+ r10 = gdutysum
+ ******************************************************************************/
+CBRDLL1_2400_Start:
+ ldr r0, =0x1e6e0120
+ ldr r1, [r0]
+ orr r1, r1, #0x02
+ str r1, [r0]
+
+ ldr r1, =0x00000000
+ ldr r0, =0x1e720204
+ ldr r2, =0x1e7202a0
+init_sram_start0:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start0
+
+ ldr r0, =0x1e6e0034
+ mov r1, #0x20
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0060
+ ldr r1, [r0]
+ mov r2, #0x01
+ orr r1, r1, r2, lsl #13
+ str r1, [r0]
+
+ mov r7, #0x0 @ init duty count
+ mov r8, #0x0 @ init gdll
+ mov r9, #0x0 @ init gduty
+ mov r10, #0x0 @ init gdutysum
+cbrdll1_duty_start:
+ cmp r7, #32
+ bge cbrdll1_duty_end
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00008120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0060
+ ldr r1, [r0]
+ bic r1, r1, #0x00001F00
+ orr r1, r1, r7, lsl #8
+ mov r2, #0x10
+ eor r1, r1, r2, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+
+ b CBRDLL1_2300_Start
+CBRDLL1_2400_Call:
+
+ mov r5, #0x01 @ init dqidly count
+ mov r6, #0x00 @ init duty sum
+cbrdll1_duty_cal_start:
+ cmp r5, #0x05
+ bge cbrdll1_duty_cal_end
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00200120
+ orr r1, r1, r5, lsl #16
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000
+ ldr r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ mov r2, #0x10
+ orr r1, r1, r2, lsl #24
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0080
+ ldr r1, =0x80000000 @ init duty cal waiting
+cbrdll1_duty_cal_wait:
+ ldr r2, [r0]
+ tst r2, r1
+ beq cbrdll1_duty_cal_wait
+
+ ldr r0, =0x1e6e008c
+ ldr r2, [r0]
+
+ ldr r0, =0x1e720210
+ add r0, r0, r7, lsl #2
+ str r2, [r0]
+
+ ldr r1, =0xFFFF
+ and r3, r1, r2
+ cmp r3, r1
+ moveq r2, r2, lsr #16
+ and r3, r1, r2
+ add r6, r6, r3
+ ldr r1, =0xF000
+ cmp r3, r1
+ blt cbrdll1_duty_cal_end
+ add r5, r5, #0x01
+ b cbrdll1_duty_cal_start
+
+cbrdll1_duty_cal_end:
+ mov r6, r6, lsr #2 @ get dutysum
+ cmp r6, r10 @ check dutysum > gdutysum
+ ble cbrdll1_duty_next
+ ldr r0, =0x1e6e0068
+ ldr r8, [r0]
+ eor r9, r7, #0x10
+ mov r10, r6
+
+cbrdll1_duty_next:
+ add r7, r7, #0x01
+ cmp r7, #16 @ check duty >= 15
+ blt cbrdll1_duty_start
+ ldr r0, =0xFA00 @ check gdutysum > 0xFA00
+ cmp r10, r0
+ blt cbrdll1_duty_start
+
+cbrdll1_duty_end:
+ ldr r0, =0x1e6e0060
+ ldr r1, [r0]
+ bic r1, r1, #0x00001F00
+ orr r1, r1, r9, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068
+ bic r8, r8, #0xFF000000
+ bic r8, r8, #0x00FF0000
+ str r8, [r0]
+
+ ldr r0, =0x1e720204 @ record result
+ str r8, [r0]
+ add r0, r0, #0x04
+ str r9, [r0]
+ add r0, r0, #0x04
+ str r10, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00008120
+ str r1, [r0]
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00000120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ ldr r1, [r0]
+ cmp r1, #0x3
+ beq MCLK2X_Phase_CBR_Done_DDR2
+ b MCLK2X_Phase_CBR_Done_DDR3
+
+/******************************************************************************
+ MCLK2X lock to MCLK program
+ r0 - r3 = free
+ r5 = madjmax
+ r6 = dllend
+ 0x1E720200 = 0x96cnt:failcnt:dllmax:dllmin
+ ******************************************************************************/
+CBRDLL1_2300_Start:
+ ldr r0, =0x1e6e0064
+ ldr r5, [r0]
+ and r5, r5, #0xFF @ init madjmax
+ mov r6, r5 @ init dllend
+
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e720200
+ str r1, [r0] @ init dllcnt2:dllmax:dllmin
+
+ mov r3, #0x0 @ init loop count
+cbrdll1_scan_start:
+ cmp r3, r6
+ bge cbrdll1_scan_end
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00008120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068
+ mov r1, r3
+ cmp r1, r5
+ subge r1, r1, r5
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00000120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+
+ ldr r0, =0x1e6e001c
+ ldr r1, [r0]
+ mov r1, r1, lsr #16
+ and r1, r1, #0xFF
+
+ and r2, r1, #0x96
+ cmp r2, #0x96
+ beq cbrdll1_scan_pass @ if (mclk2x_phase & 0x96) == 0x96
+ ldr r0, =0x1e720200
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ ands r2, r2, #0xFF @ get dllmax
+ beq cbrdll1_scan_next @ if dllmax == 0
+ mov r2, r1, lsr #16
+ and r2, r2, #0xFF
+ add r2, r2, #0x01
+ cmp r2, #0x02
+ movge r6, r3
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r2, lsl #16
+ str r1, [r0]
+ b cbrdll1_scan_next
+
+cbrdll1_scan_pass:
+ cmp r3, #0x0 @ if dll = 0
+ moveq r3, #0x0F
+ addeq r6, r6, #0x10
+ beq cbrdll1_scan_next
+ ldr r0, =0x1e720200
+ ldr r2, [r0]
+ cmp r1, #0x96
+ bne cbrdll1_scan_pass2
+ mov r1, r2, lsr #24
+ add r1, r1, #0x01
+ bic r2, r2, #0xFF000000
+ orr r2, r2, r1, lsl #24
+ cmp r1, #0x03 @ check (phase == 0x96) count == 3
+ bicge r2, r2, #0x0000FF00
+ bicge r2, r2, #0x000000FF
+ orrge r2, r2, r3, lsl #8
+ orrge r2, r2, r3
+ str r2, [r0]
+ bge cbrdll1_scan_end
+
+cbrdll1_scan_pass2:
+ and r1, r2, #0xFF @ if(dllmin > dll)
+ cmp r1, r3
+ bicgt r2, r2, #0x000000FF
+ orrgt r2, r2, r3
+
+ mov r1, r2, lsr #8 @ if(dllmax < dll)
+ and r1, r1, #0xFF
+ cmp r1, r3
+ biclt r2, r2, #0x0000FF00
+ orrlt r2, r2, r3, lsl #8
+
+ bic r2, r2, #0x00FF0000
+ str r2, [r0]
+
+cbrdll1_scan_next:
+ add r3, r3, #0x01
+ b cbrdll1_scan_start
+
+cbrdll1_scan_end:
+ ldr r0, =0x1e720200
+ ldr r1, [r0]
+ mov r2, r1, lsr #8 @ get dllmax
+ ands r2, r2, #0xFF
+ bne cbrdll1_scan_done @ if(dllmax != 0)
+ ldr r0, =0x1e6e0064
+ ldr r3, [r0]
+ bic r1, r3, #0x000C0000
+ str r1, [r0]
+ add r0, r0, #0x04
+ mov r1, #0x0
+ str r1, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000A @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay0_1:
+ check_delay_timer
+ bne delay0_1
+ clear_delay_timer
+ /* end delay 10us */
+
+ ldr r0, =0x1e6e0064
+ str r3, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000A @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay0_2:
+ check_delay_timer
+ bne delay0_2
+ clear_delay_timer
+ /* end delay 10us */
+
+ b CBRDLL1_2300_Start
+
+cbrdll1_scan_done:
+ and r1, r1, #0xFF
+ add r1, r1, r2
+ mov r6, r1, lsr #1 @ dll1.0 = (dllmin + dllmax) >> 1
+ cmp r6, r5
+ subge r6, r6, r5
+ add r3, r6, r5, lsr #2 @ dll1.1 = dll1.0 + (MADJ >> 2)
+
+ ldr r0, =0x1e6e0004
+ ldr r1, [r0]
+ mov r1, r1, lsr #10
+ tst r1, #0x1
+ bne cbrdll1_scan_set_2400
+ cmp r3, r5
+ subge r3, r3, r5
+ mov r2, #0x0
+ tst r3, #0x08
+ beq cbrdll1_scan_set_2300_2 @ if !(dll & 8)
+cbrdll1_scan_set_2300_1: @ if (dll & 8)
+ mov r1, #0x0
+ tst r3, #0x08
+ addeq r1, r1, #0x01
+ cmp r2, #0x05
+ addge r1, r1, #0x01
+ cmp r1, #0x02
+ beq cbrdll1_scan_set
+ add r2, r2, #0x01
+ add r3, r3, #0x01
+ cmp r3, r5
+ subge r3, r3, r5
+ b cbrdll1_scan_set_2300_1
+
+cbrdll1_scan_set_2300_2:
+ and r1, r3, #0x07
+ cmp r1, #0x07
+ beq cbrdll1_scan_set
+ cmp r2, #0x05
+ bge cbrdll1_scan_set
+ add r2, r2, #0x01
+ add r3, r3, #0x01
+ cmp r3, r5
+ subge r3, r3, r5
+ b cbrdll1_scan_set_2300_2
+
+cbrdll1_scan_set_2400:
+ add r3, r3, #0x05 @ dll1.1 = dll1.0 + (MADJ >> 2) + 5
+ cmp r3, r5
+ subge r3, r3, r5
+
+cbrdll1_scan_set:
+ orr r1, r6, r3, lsl #8
+ ldr r0, =0x1e6e0068
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ ldr r1, [r0]
+ cmp r1, #0x0
+ beq MCLK2X_Phase_CBR_Done_DDR3
+ cmp r1, #0x1
+ beq MCLK2X_Phase_CBR_Done_DDR2
+ b CBRDLL1_2400_Call
+
+.LTORG
+
+/******************************************************************************
+ Calibration Code Start
+ SRAM buffer definition
+ 0x1E720000 : Pass 1, DLLI MIN value range
+ 0x1E720008 : DQS0 DLL valid range, 2nd time CBR
+ 0x1E72000C : DQS1 DLL valid range, 2nd time CBR
+ 0x1E720010 : DQ0 DLL valid range, Pass 1
+ 0x1E720014 : DQ1 DLL valid range, Pass 1
+ ....
+ 0x1E720048 : DQ14 DLL valid range, Pass 1
+ 0x1E72004C : DQ15 DLL valid range, Pass 1
+ 0x1E720090 : DLL1 SAdj record
+ 0x1E720094 : DQL Pass1 finetune result
+ 0x1E720098 : DQH Pass1 finetune result
+ 0x1E72009C : DRAM initial time, (us)
+ 0x1E7200A0 : CBR3 retry counter
+ 0x1E7200A4 : DRAM initial time, (us)
+ 0x1E7200A8 : Released date
+ 0x1E7200AC : Released SDK version
+ 0x1E7200B0 : DQS input mask window for MCR18[4] = 0
+ 0x1E7200B4 : DQS input mask window for MCR18[4] = 1
+ 0x1E720100 : DQIDLY=00, DLL valid range
+ 0x1E720104 : DQIDLY=01, DLL valid range
+ ....
+ 0x1E720178 : DQIDLY=30, DLL valid range
+ 0x1E72017C : DQIDLY=31, DLL valid range
+ 0x1E720180 : DQSI-MCLK2X P-phase pass record DLL2= 0-31
+ 0x1E720184 : DQSI-MCLK2X P-phase pass record DLL2=32-63
+ 0x1E720188 : DQSI-MCLK2X N-phase pass record DLL2= 0-31
+ 0x1E72018C : DQSI-MCLK2X N-phase pass record DLL2=32-63
+ ******************************************************************************/
+Calibration_Start_pre: @ Toggle DQSI mask delay
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ eor r1, r1, #0x10
+ str r1, [r0]
+
+Calibration_Start:
+/* Init SRAM buffer */
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e720000
+ ldr r2, =0x1e720100
+init_sram_start:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start
+
+ ldr r1, =0x00ff00ff
+ ldr r0, =0x1e720100
+ ldr r2, =0x1e720180
+init_sram_start2:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start2
+
+ ldr r1, =0x00000000
+ ldr r0, =0x1e720180
+ ldr r2, =0x1e720200
+init_sram_start3:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start3
+
+ ldr r0, =0x1e6e0068 @ save the DLL1 SAdj initial value
+ ldr r1, [r0]
+ ldr r0, =0x1e720090
+ str r1, [r0]
+
+/* Start
+ r0 = free
+ r1 = free
+ r2 = free
+ r3 = free
+ r4 = record the return pc value, do not use
+ r5 = pattern table index
+ r6 = pass count
+ r7 = dram DLL2 parameter index (0x1e6e0068), max is 0x4C
+*/
+/******************************************************************************
+ Fine DQI delay and DQSI-MCLK phase
+ r8 = DQIDLY count
+ r9 = DQSI-MCLK2X phase count
+ r10 = pattern fail retry counter, initialize to 2 (fail 2 times)
+ r11 = passcnt accumulator for each DQIDLY
+ *****************************************************************************/
+CBR0_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x43 @ 'C'
+ str r1, [r0]
+ mov r1, #0x42 @ 'B'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+ mov r1, #0x30 @ '0'
+ str r1, [r0]
+ mov r1, #0x2D @ '-'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0xFF000000
+ bic r1, r1, #0x00FF0000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 1KB
+ ldr r1, =0x000003FF
+ str r1, [r0]
+
+ mov r8, #0x00 @ init DQIDLY
+ mov r9, #0x00 @ init DQSI-MCLK2X phase
+ mov r11, #0x01 @ init passcnt accumulator
+
+cbr0_next_dqidly:
+ cmp r9, #0x00
+ bne cbr0_next_dqsiphase
+ cmp r11, #0x00
+ addeq r8, r8, #0x01 @ jump 1 stage if no pass at previous stage
+ mov r11, #0x00
+ add r8, r8, #0x01
+ cmp r8, #0x1F @ max DQIDLY = 31
+ bgt CBR0_END
+
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ and r1, r8, #0x07
+ add r1, r1, #0x30 @ '0-7'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r8, lsl #16
+ str r1, [r0]
+ mov r9, #0x01 @ '1':p_phase, '0':n_phase
+
+ /* Delay about 3us */ @ wait DQIDLY load
+ ldr r2, =0x00000003 @ Set Timer4 Reload = 3 us
+ init_delay_timer
+delay_4:
+ check_delay_timer
+ bne delay_4
+ clear_delay_timer
+ /* end delay 3us */
+
+ b cbr0_dll2_scan_start
+
+cbr0_next_dqsiphase:
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ orr r1, r1, r9, lsl #23 @ set DQSI-MCLK2X phase
+ str r1, [r0]
+ mov r9, #0x00
+
+cbr0_dll2_scan_start:
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init DLL2 parameter index
+
+/****************************
+ DLL2 delay margin test loop
+ ***************************/
+cbr0_next_dll2_parameter:
+ ldr r0, =0x1e6e0068 @ load DLL2 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+ ldr r2, =0x40404040 @ DLL2 max is 0x40404040
+ cmp r7, r2
+ bge cbr0_next_dqidly
+ ldr r2, =0x01010101
+ add r7, r7, r2
+
+/* CBRScan3() start */
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr0_next_test_pattern:
+ mov r10, #2 @ set the retry loop = 2 of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr0_test_burst
+
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add 1 after loop check so we need to decrease 1
+ cmp r3, #0x00
+ beq cbr0_next_dqidly @ pass at dlli = 0, invalid
+ add r6, r6, #0x01 @ increment pass count
+ add r11, r11, #0x01 @ increment pass count
+
+ ldr r0, =0x1e720180 @ record DLL2 pass window
+ cmp r9, #0x00 @ DQSI-MCLK2X phase check
+ addeq r0, r0, #0x08
+ cmp r3, #32
+ addge r0, r0, #0x4
+ and r1, r3, #0x1F
+ mov r2, #0x1
+ mov r2, r2, lsl r1
+ ldr r1, [r0]
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e720100 @ record DLL2 min:max value for each DQIDLY
+ add r0, r0, r8, lsl #2
+ cmp r9, #0x00 @ DQSI-MCLK2X phase check
+ beq cbr0_test_pass_dqsin
+ record_dll2_pass_range
+ b cbr0_next_dll2_parameter
+
+cbr0_test_pass_dqsin:
+ record_dll2_pass_range_h
+ b cbr0_next_dll2_parameter
+
+cbr0_test_pattern_fail:
+ cmp r6, #5 @ passcnt >= 5
+ bge cbr0_next_dqidly
+ ldr r0, =0x1e720100 @ reset DLL2 min:max value
+ add r0, r0, r8, lsl #2
+ ldr r1, [r0]
+ ldr r2, =0xFFFF0000
+ ldr r3, =0x000000FF
+ cmp r9, #0x00
+ moveq r2, r2, lsr #16
+ moveq r3, r3, lsl #16
+ and r1, r1, r2
+ orr r1, r1, r3
+ str r1, [r0]
+ b cbr0_next_dll2_parameter @ CBRScan3() end and test result fail, go to next step
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr0_pattern_fail_retry:
+
+/* CBRTest3() start */
+cbr0_test_burst:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x000000C1
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr0_wait_engine_idle_0:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr0_wait_engine_idle_0
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ bne cbr0_test_fail
+
+cbr0_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000085
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr0_wait_engine_idle_1:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr0_wait_engine_idle_1
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ beq cbr0_test_pass
+
+/* CBRTest3() end */
+
+cbr0_test_fail:
+ subs r10, r10, #1
+ bne cbr0_pattern_fail_retry
+ b cbr0_test_pattern_fail @ CBRScan3() return(0)
+
+cbr0_test_pass:
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr0_next_test_pattern
+
+CBR0_END:
+ mov r5, #0x0 @ init DQIDLY search count
+ mov r6, #0x0 @ init max_margin:g_margin
+ mov r8, #0x0 @ init g_side
+ mov r7, #0x0 @ init maximum margin DQIDLY,DQSI-MCLK2X phase
+cbr0_search_dll_margin_s:
+ ldr r0, =0x1e720100
+ add r0, r0, r5, lsl #2
+ ldr r1, [r0]
+ and r2, r1, #0xFF @ get dllmin_p
+ mov r1, r1, lsr #8
+ and r3, r1, #0xFF @ get dllmax_p
+ subs r2, r3, r2 @ get margin-P
+ movmi r2, #0x0
+ mov r1, r1, lsr #8
+ and r3, r1, #0xFF @ get dllmin_n
+ mov r1, r1, lsr #8
+ and r1, r1, #0xFF @ get dllmax_n
+ subs r3, r1, r3 @ get margin-N
+ movmi r3, #0x0
+ add r1, r2, r3
+ cmp r1, #0x0
+ beq cbr0_search_dll_margin_e @ if margin-P = 0 && margin-N = 0
+
+ ldr r9, [r0]
+ ldr r0, =0x1e720180
+ cmp r2, r3
+ orrlt r5, r5, #0x80 @ margin-N > margin-P
+ addlt r0, r0, #0x08
+ movlt r9, r9, lsr #16
+ movge r3, r2 @ max(margin-P/N)
+ add r2, r3, #0x2 @ define +/- 2 steps of variation
+ mov r1, r6, lsr #16
+ cmp r2, r1
+ blt cbr0_search_dll_margin_e @ if max(margin-P/N) + 2 < max_margin
+
+ and r1, r9, #0xFF @ r1 = dlli counter
+ cmp r1, #32
+ ldrge r2, [r0, #0x4] @ load pass window
+ ldrlt r2, [r0]
+ and r1, r1, #0x1F
+ mov r10, #0x1 @ init test bit mask
+ mov r10, r10, lsl r1
+ and r1, r9, #0xFF
+cbr0_search_dllmin_margin_s:
+ tst r2, r10
+ beq cbr0_search_dllmin_margin_e
+ mov r10, r10, lsr #1
+ cmp r1, #32
+ ldreq r2, [r0]
+ ldreq r10, =0x80000000
+ subs r1, r1, #0x1
+ bne cbr0_search_dllmin_margin_s
+
+cbr0_search_dllmin_margin_e:
+ and r2, r9, #0xFF
+ sub r11, r2, r1 @ get dllmin side margin
+
+ mov r9, r9, lsr #8
+ and r1, r9, #0xFF @ r1 = dlli counter
+ cmp r1, #32
+ ldrge r2, [r0, #0x4] @ load pass window
+ ldrlt r2, [r0]
+ and r1, r1, #0x1F
+ mov r10, #0x1 @ init test bit mask
+ mov r10, r10, lsl r1
+ and r1, r9, #0xFF
+cbr0_search_dllmax_margin_s:
+ tst r2, r10
+ beq cbr0_search_dllmax_margin_e
+ mov r10, r10, lsl #1
+ cmp r1, #31
+ ldreq r2, [r0, #0x4]
+ ldreq r10, =0x00000001
+ add r1, r1, #0x1
+ cmp r1, #64
+ bne cbr0_search_dllmax_margin_s
+
+cbr0_search_dllmax_margin_e:
+ and r2, r9, #0xFF
+ sub r1, r1, r2 @ get dllmax side margin
+ cmp r1, r11
+ movlt r11, r1 @ get side_margin
+
+cbr0_check_dll_margin: @ if max(margin-P/N) > g_margin && side_margin >= g_side && dqidly <= 20
+ cmp r5, #20
+ bgt cbr0_check_dll_margin2
+ and r1, r6, #0xFF
+ cmp r3, r1
+ ble cbr0_check_dll_margin3
+ cmp r11, r8
+ bge cbr0_set_dll_margin
+
+cbr0_check_dll_margin2: @ if max(margin-P/N) > g_margin+1 && side_margin >= g_side)
+ and r1, r6, #0xFF
+ add r2, r1, #0x1
+ cmp r3, r2
+ ble cbr0_check_dll_margin3
+ cmp r11, r8
+ bge cbr0_set_dll_margin
+
+cbr0_check_dll_margin3: @ if side_margin > g_side && g_side < 8
+ cmp r8, #8
+ bge cbr0_search_dll_margin_e
+ cmp r11, r8
+ ble cbr0_search_dll_margin_e
+
+cbr0_set_dll_margin:
+ mov r1, r6, lsr #16
+ cmp r3, r1
+ bicgt r6, r6, #0x00FF0000
+ orrgt r6, r6, r3, lsl #16
+ bic r6, r6, #0x000000FF
+ orr r6, r6, r3
+ mov r7, r5
+ mov r8, r11
+
+cbr0_search_dll_margin_e:
+ and r5, r5, #0x7F
+ add r5, r5, #0x01
+ cmp r5, #0x20 @ last DQIDLY
+ blt cbr0_search_dll_margin_s
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ str r1, [r0]
+
+ /* Delay about 5us */
+ ldr r2, =0x00000005 @ Set Timer5 Reload = 5 us
+ init_delay_timer
+delay_5:
+ check_delay_timer
+ bne delay_5
+ clear_delay_timer
+ /* end delay 5us */
+
+ ldr r0, =0x1e6e000c @ Set refresh cycle
+ ldr r1, =0x00005C01
+ str r1, [r0]
+
+/******************************************************************************
+ Fine tune per bit DQ input delay -- Pass 1, left edge align
+ r8 = free
+ r9 = DQ fail bit accumulator
+ r10 = pattern fail counter, initialize to 5 (fail 5 times)
+ r11 = free
+ *****************************************************************************/
+CBR1_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+ mov r1, #0x43 @ 'C'
+ str r1, [r0]
+ mov r1, #0x42 @ 'B'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+ mov r1, #0x31 @ '1'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init DLL2 parameter index
+
+/****************************
+ DLL2 delay margin test loop
+ ***************************/
+cbr1_next_dll2_parameter:
+ ldr r0, =0x1e6e0068 @ load DLL2 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+ ldr r2, =0x40404040 @ parameter's max is to 0x40404040
+ cmp r7, r2
+ bge CBR1_END
+ ldr r2, =0x01010101
+ add r7, r7, r2
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 4KB
+ ldr r1, =0x00000FFF
+ str r1, [r0]
+
+/* CBRScan2() start */
+ ldr r9, =0xFFFF @ init test status
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr1_next_test_pattern:
+ mov r10, #5 @ set the retry loop of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr1_test_single
+
+cbr1_test_pattern_end:
+ cmp r9, #0x00
+ bne cbr1_test_pass_dqi
+ cmp r6, #10
+ bge CBR1_END
+ b cbr1_next_dll2_parameter @ CBRScan2() end and test result fail, go to next step
+
+cbr1_test_pass_dqi:
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add 1 after loop check so we need to decrease 1
+ add r6, r6, #0x01 @ increment pass count
+ ldr r0, =0x1e720010
+ mov r8, #0x01
+cbr1_test_pass_dqi_loop_s:
+ tst r9, r8
+ beq cbr1_test_pass_dqi_loop_e
+ record_dll2_pass_range
+
+cbr1_test_pass_dqi_loop_e:
+ add r0, r0, #0x04
+ mov r8, r8, lsl #1
+ ldr r1, =0xFFFF
+ tst r8, r1
+ bne cbr1_test_pass_dqi_loop_s
+ b cbr1_next_dll2_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr1_pattern_fail_retry:
+
+/* CBRTest2() start */
+cbr1_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000005
+ str r1, [r0]
+ ldr r3, =0x1000
+ ldr r1, =0x1000
+cbr1_wait_engine_idle_0:
+ subs r1, r1, #1
+ beq cbr1_test_single_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr1_wait_engine_idle_0
+
+cbr1_test_single_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r11, [r0]
+ orr r11, r11, r11, lsr #16
+ bic r11, r11, #0xFF000000
+ bic r11, r11, #0x00FF0000
+
+ ldr r1, =0xFFFF
+ cmp r11, r1
+ beq cbr1_test_fail
+
+cbr1_test_burst:
+ ldr r0, =0x1e6e0070
+ ldr r2, =0x00000000
+ str r2, [r0]
+ ldr r2, =0x00000041
+ str r2, [r0]
+ ldr r3, =0x1000
+ ldr r1, =0x1000
+cbr1_wait_engine_idle_1:
+ subs r1, r1, #1
+ beq cbr1_test_burst_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr1_wait_engine_idle_1
+
+cbr1_test_burst_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r2, [r0]
+ orr r2, r2, r2, lsr #16
+ bic r2, r2, #0xFF000000
+ bic r2, r2, #0x00FF0000
+ orr r11, r11, r2
+
+ ldr r2, =0xFFFF
+ cmp r11, r2
+ bne cbr1_test_pass
+/* CBRTest2() end */
+
+cbr1_test_fail:
+ subs r10, r10, #1
+ bne cbr1_pattern_fail_retry
+ mov r9, #0x00
+ b cbr1_test_pattern_end @ CBRScan2() return(0)
+
+cbr1_test_pass:
+ ldr r1, =0xFFFF @ record the pass bit
+ eor r11, r11, r1
+ and r9, r9, r11 @ DQ pass bit
+ cmp r9, #0x00
+ beq cbr1_test_pattern_end @ CBRScan2() return(0)
+
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr1_next_test_pattern
+
+CBR1_END:
+ mov r5, #0x0 @ init DQ DLL_min sum
+ mov r6, #0x0 @ init DQ DLL_min valid count
+ ldr r0, =0x1e72000c
+ ldr r3, =0x1e720050
+cbr1_search_dllmin_s:
+ add r0, r0, #0x04
+ cmp r0, r3
+ beq cbr1_search_dllmin_e
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ subs r2, r2, r1 @ dllmax - dllmin
+ bmi cbr1_search_dllmin_s @ no valid margin found, bypass fine tune
+ cmp r2, #10 @ (dllmax - dllmin) < 10
+ blt cbr1_search_dllmin_s @ no enough margin found, bypass fine tune
+ add r5, r5, r1
+ add r6, r6, #1
+ b cbr1_search_dllmin_s
+
+cbr1_search_dllmin_e:
+ cmp r6, #16
+ bne Calibration_Start_pre @ not all bits valid, retry again
+
+ mov r5, r5, lsr #4
+ ldr r0, =0x1e720000
+ str r5, [r0]
+
+ mov r6, #0x00 @ init DQL CBR value
+ ldr r0, =0x1e720030
+ ldr r7, =0x1e72000c
+cbr1_set_result_dql:
+ sub r0, r0, #4
+ cmp r0, r7
+ beq cbr1_set_result_next
+ mov r6, r6, lsl #3
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ mov r3, r1 @ dll = dllmin
+ cmp r5, r3
+ blt cbr1_set_result_dql_neg
+ sub r1, r5, r3
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ cmp r1, #2 @ dqi_tune max = 2
+ movgt r1, #2
+ orr r6, r6, r1
+ b cbr1_set_result_dql
+
+cbr1_set_result_dql_neg:
+ sub r1, r3, r5
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ cmp r1, #2 @ dqi_tune max = -2
+ movgt r1, #2
+ mov r2, #8
+ sub r1, r2, r1
+ and r1, r1, #7
+ orr r6, r6, r1
+ b cbr1_set_result_dql
+
+cbr1_set_result_next:
+ ldr r0, =0x1e6e0080 @ save DQL fine tune result
+ str r6, [r0]
+ ldr r0, =0x1e720094
+ str r6, [r0]
+
+ mov r6, #0x00 @ init DQH CBR value
+ ldr r0, =0x1e720050
+ ldr r7, =0x1e72002c
+cbr1_set_result_dqh:
+ sub r0, r0, #4
+ cmp r0, r7
+ beq cbr1_set_result_end
+ mov r6, r6, lsl #3
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ mov r3, r1 @ dll = dllmin
+ cmp r5, r3
+ blt cbr1_set_result_dqh_neg
+ sub r1, r5, r3
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ cmp r1, #3 @ dqi_tune max = 2
+ movgt r1, #3
+ subs r1, r1, #1
+ movmi r1, #7
+ orr r6, r6, r1
+ b cbr1_set_result_dqh
+
+cbr1_set_result_dqh_neg:
+ sub r1, r3, r5
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ add r1, r1, #1
+ cmp r1, #2 @ dqi_tune max = -2
+ movgt r1, #2
+ mov r2, #8
+ sub r1, r2, r1
+ and r1, r1, #7
+ orr r6, r6, r1
+ b cbr1_set_result_dqh
+
+cbr1_set_result_end:
+ ldr r0, =0x1e6e0084 @ save DQH fine tune result
+ str r6, [r0]
+ ldr r0, =0x1e720098
+ str r6, [r0]
+
+/******************************************************************************
+ Search the DLL2 detail margin
+ *****************************************************************************/
+ ldr r0, =0x1e7200a0
+ mov r1, #0
+ str r1, [r0]
+
+CBR3_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x33 @ '3'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init DLL2 parameter index
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e720008 @ init DQL dllmax,dllmin
+ str r1, [r0]
+ ldr r0, =0x1e72000c @ init DQH dllmax,dllmin
+ str r1, [r0]
+
+ ldr r0, =0x1e7200a0 @ CBR3 iteration counter
+ ldr r1, [r0]
+ add r1, r1, #1
+ str r1, [r0]
+
+/****************************
+ DLL2 delay margin test loop
+ ***************************/
+cbr3_next_dll2_parameter:
+ ldr r0, =0x1e6e0068 @ load DLL2 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+ ldr r2, =0x40404040 @ parameter's max is to 0x40404040
+ cmp r7, r2
+ bge CBR3_END
+ ldr r2, =0x01010101
+ add r7, r7, r2
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 64KB
+ ldr r1, =0x0000FFFF
+ str r1, [r0]
+
+/* CBRScan() start */
+ mov r9, #0x03 @ init test status
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr3_next_test_pattern:
+ mov r10, #5 @ set the retry loop of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr3_test_single
+
+cbr3_test_pattern_end:
+ cmp r9, #0x00
+ bne cbr3_test_pass_dql
+ cmp r6, #10
+ bge CBR3_END
+ b cbr3_next_dll2_parameter @ CBRScan() end and test result fail, go to next step
+
+cbr3_test_pass_dql:
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add one after loop check so we need to decrease 1
+ add r6, r6, #0x01 @ increment pass count
+ tst r9, #0x01
+ beq cbr3_test_pass_dqh
+
+ ldr r0, =0x1E720008
+ record_dll2_pass_range
+
+cbr3_test_pass_dqh:
+ tst r9, #0x02
+ beq cbr3_next_dll2_parameter
+ ldr r0, =0x1E72000c
+ record_dll2_pass_range
+ b cbr3_next_dll2_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr3_pattern_fail_retry:
+
+/* CBRTest() start */
+cbr3_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000005
+ str r1, [r0]
+ ldr r3, =0x1000
+ ldr r8, =0x10000
+cbr3_wait_engine_idle_0:
+ subs r8, r8, #1
+ beq cbr3_test_single_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr3_wait_engine_idle_0
+
+cbr3_test_single_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r11, [r0]
+ orr r11, r11, r11, lsr #16
+ bic r11, r11, #0xFF000000
+ bic r11, r11, #0x00FF0000
+
+ ldr r1, =0xFF
+ tst r11, r1
+ beq cbr3_test_burst
+ tst r11, r1, lsl #8
+ bne cbr3_test_fail
+
+cbr3_test_burst:
+ mov r1, #0x00 @ initialize loop index, r1 is loop's index
+cbr3_test_burst_loop:
+ ldr r0, =0x1e6e0070
+ ldr r2, =0x00000000
+ str r2, [r0]
+ mov r2, r1, lsl #3
+ orr r2, r2, #0x41 @ test command = 0x41 | (datagen << 3)
+ str r2, [r0]
+ ldr r3, =0x1000
+ ldr r8, =0x10000
+cbr3_wait_engine_idle_1:
+ subs r8, r8, #1
+ beq cbr3_test_burst_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr3_wait_engine_idle_1
+
+cbr3_test_burst_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r2, [r0]
+ orr r2, r2, r2, lsr #16
+ bic r2, r2, #0xFF000000
+ bic r2, r2, #0x00FF0000
+ orr r11, r11, r2
+
+ ldr r2, =0xFF
+ tst r11, r2
+ beq cbr3_next_test_burst_mode
+ tst r11, r2, lsl #8
+ beq cbr3_next_test_burst_mode
+/* CBRTest() end */
+
+cbr3_test_fail:
+ subs r10, r10, #1
+ bne cbr3_pattern_fail_retry
+ mov r9, #0x00
+ b cbr3_test_pattern_end @ CBRScan() return(0)
+
+cbr3_next_test_burst_mode:
+ add r1, r1, #1 @ increase the test mode index
+ cmp r1, #0x08 @ there are 8 modes
+ bne cbr3_test_burst_loop
+
+ ldr r1, =0xFF @ record the pass byte
+ tst r11, r1
+ andne r9, r9, #0x02 @ DQL fail
+ tst r11, r1, lsl #8
+ andne r9, r9, #0x01 @ DQH fail
+ cmp r9, #0x00
+ beq cbr3_test_pattern_end @ CBRScan() return(0)
+
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr3_next_test_pattern
+
+CBR3_END:
+ ldr r0, =0x1e72000c @ check DQH margin
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ subs r5, r2, r1 @ dllmax - dllmin
+ bmi CBR3_START @ no valid margin found, retry again
+ cmp r5, #10 @ (dllmax - dllmin) < 10
+ blt CBR3_START @ no enough margin found, retry again
+ add r2, r1, r2 @ (dllmin[1] + dllmax[1] + 1) >> 1
+ add r2, r2, #0x01
+ mov r1, r2, lsr #1
+ mov r3, r1, lsl #8
+ ldr r1, [r0] @ store the dll search result
+ bic r1, r1, #0xFF000000
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r3, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e720008 @ check DQL margin
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ subs r5, r2, r1 @ dllmax - dllmin
+ bmi CBR3_START @ no valid margin found, retry again
+ cmp r5, #10 @ (dllmax - dllmin) < 10
+ blt CBR3_START @ no enough margin found, retry again
+ add r2, r1, r2 @ (dllmin[0] + dllmax[0] + 1) >> 1
+ add r2, r2, #0x01
+ mov r1, r2, lsr #1
+ ldr r2, [r0] @ store the dll search result
+ bic r2, r2, #0xFF000000
+ bic r2, r2, #0x00FF0000
+ orr r2, r2, r1, lsl #16
+ str r2, [r0]
+ orr r3, r3, r1
+
+ ldr r0, =0x1e6e0068 @ save the result dll value
+ ldr r1, [r0]
+ bic r1, r1, #0xFF000000
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r3, lsl #16
+ str r1, [r0]
+ b CBR4_START
+
+.LTORG
+
+/******************************************************************************
+ Search the DQS input mask margin
+ *****************************************************************************/
+CBR4_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x34 @ '4'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 4KB
+ ldr r1, =0x00000FFF
+ str r1, [r0]
+
+ mov r8, #0x00 @ init MCR18[4]
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e7200b0 @ init MCR18[4]=0 max,min
+ str r1, [r0]
+ ldr r0, =0x1e7200b4 @ init MCR18[4]=1 max,min
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x0000001F
+ str r1, [r0]
+
+ b cbr4_scan_start
+
+cbr4_next_maskdly:
+ add r8, r8, #0x01
+ and r2, r8, #0x01
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x0000001F
+ orr r1, r1, r2, lsl #4
+ str r1, [r0]
+ cmp r8, #0x02
+ bge CBR4_END
+
+cbr4_scan_start:
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init mask delay
+
+/****************************
+ DQS Mask delay margin test loop
+ ***************************/
+cbr4_next_parameter:
+ cmp r7, #0x10 @ max delay = 0xF
+ bge cbr4_next_maskdly
+ ldr r0, =0x1e6e0018 @ load MCR18 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x0000000F
+ orr r1, r1, r7
+ str r1, [r0]
+ add r7, r7, #0x01
+
+/* CBRScan3() start */
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr4_next_test_pattern:
+ mov r10, #2 @ set the retry loop = 2 of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr4_test_burst
+
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add 1 after loop check so we need to decrease 1
+ add r6, r6, #0x01 @ increment pass count
+
+ ldr r0, =0x1e7200b0 @ record pass window
+ add r0, r0, r8, lsl #2
+ record_dll2_pass_range
+ mov r2, #0x01
+ add r1, r1, r2, lsl #16
+ str r1, [r0]
+ b cbr4_next_parameter
+
+cbr4_test_pattern_fail:
+ cmp r6, #5 @ passcnt >= 5
+ bge cbr4_next_maskdly
+ b cbr4_next_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr4_pattern_fail_retry:
+
+/* CBRTest3() start */
+cbr4_test_burst:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x000000C1
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr4_wait_engine_idle_0:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr4_wait_engine_idle_0
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ bne cbr4_test_fail
+
+cbr4_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000085
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr4_wait_engine_idle_1:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr4_wait_engine_idle_1
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ beq cbr4_test_pass
+
+/* CBRTest3() end */
+
+cbr4_test_fail:
+ subs r10, r10, #1
+ bne cbr4_pattern_fail_retry
+ b cbr4_test_pattern_fail @ CBRScan3() return(0)
+
+cbr4_test_pass:
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr4_next_test_pattern
+
+CBR4_END:
+ ldr r0, =0x1e7200b0 @ check mask margin
+ ldr r1, [r0]
+ add r0, r0, #0x04
+ ldr r2, [r0]
+ ands r6, r2, #0xFF @ get min of MCR18[4] = 1
+ bne cbr4_noset_delay
+ ands r5, r1, #0xFF @ get min of MCR18[4] = 0
+ bne cbr4_set_delay
+ mov r1, r1, lsr #8 @ get max of MCR18[4] = 0
+ and r1, r1, #0xFF
+ mov r2, r2, lsr #8 @ get max of MCR18[4] = 1
+ and r2, r2, #0xFF
+ sub r1, r1, r5
+ sub r2, r2, r6
+ cmp r1, r2
+ bge cbr4_noset_delay
+
+cbr4_set_delay:
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ orr r1, r1, #0x10
+ str r1, [r0]
+
+cbr4_noset_delay:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+/******************************************************************************
+ CBR Finish
+ *****************************************************************************/
+/******************************************************************************
+ Check DRAM Size
+ *****************************************************************************/
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xFEFFFFFF @ bit[24]=1 => DDR2
+ mov r2, r1, lsr #24
+ cmp r2, #0x01
+ beq check_ddr2_size
+
+ ldr r0, =0x1e6e0004
+ ldr r5, [r0]
+ bic r5, r5, #0x00000003 @ record MCR04
+ orr r1, r5, #0x3
+ str r1, [r0] @ set to 4Gbit
+ ldr r6, =0x003F2217
+#if defined(CONFIG_DRAM_336)
+ ldr r6, =0x00361C13
+#endif
+ b check_dram_size
+
+check_ddr2_size:
+ ldr r0, =0x1e6e0004
+ ldr r5, [r0]
+ bic r5, r5, #0x00000023 @ record MCR04
+ orr r1, r5, #0x23
+ str r1, [r0] @ set to 4Gbit
+ ldr r6, =0x3F2B1B16
+#if defined(CONFIG_DRAM_336)
+ ldr r6, =0x3B231612
+#endif
+
+ ldr r0, =0x40000000
+ ldr r1, =0x1817191A
+ str r1, [r0]
+ ldr r0, =0x40002000
+ ldr r1, =0x73616532
+ str r1, [r0]
+ ldr r0, =0x40000000
+ ldr r1, =0x1817191A
+ ldr r2, [r0]
+ cmp r1, r2
+ bne check_dram_size_end @ == 512Mbit
+ orr r5, r5, #0x20 @ >= 1Gbit
+ mov r6, r6, lsr #8
+
+check_dram_size:
+ ldr r0, =0x50100000
+ ldr r1, =0x41424344
+ str r1, [r0]
+ ldr r0, =0x48100000
+ ldr r1, =0x25262728
+ str r1, [r0]
+ ldr r0, =0x40100000
+ ldr r1, =0x191A1B1C
+ str r1, [r0]
+ ldr r0, =0x50100000
+ ldr r1, =0x41424344
+ ldr r2, [r0]
+ cmp r2, r1 @ == 4Gbit
+ orreq r5, r5, #0x03
+ moveq r6, r6, lsr #16
+ beq check_dram_size_end
+ ldr r0, =0x48100000
+ ldr r1, =0x25262728
+ ldr r2, [r0]
+ cmp r2, r1 @ == 2Gbit
+ orreq r5, r5, #0x02
+ moveq r6, r6, lsr #8
+ beq check_dram_size_end
+ orr r5, r5, #0x01 @ == 1Gbit
+
+check_dram_size_end:
+ ldr r0, =0x1e6e0004
+ str r5, [r0]
+ ldr r0, =0x1e6e0014
+ ldr r1, [r0]
+ bic r1, r1, #0x000000FF
+ and r6, r6, #0xFF
+ orr r1, r1, r6
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120 @ VGA Compatible Mode
+ ldr r1, =0x000050C0 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00004DC0
+#endif
+ str r1, [r0]
+
+/******************************************************************************
+ Version Number
+ *****************************************************************************/
+ ldr r0, =0x1e7200a8
+ ldr r1, =0x20141229 @ released date
+ str r1, [r0]
+
+ add r0, r0, #4
+ ldr r1, =0x00000060 @ released SDK version
+ str r1, [r0]
+
+/******************************************************************************
+ Calibration Code End
+ ******************************************************************************/
+
+set_scratch:
+ /*Set Scratch register Bit 6 after ddr initial finished */
+ ldr r0, =0x1e6e2040
+ ldr r1, [r0]
+ orr r1, r1, #0x40
+ str r1, [r0]
+
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x6F @ 'o'
+ str r1, [r0]
+ mov r1, #0x6E @ 'n'
+ str r1, [r0]
+ mov r1, #0x65 @ 'e'
+ str r1, [r0]
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+/* Debug - UART console message */
+
+/******************************************************************************
+ Solve PCIe ASPM issue, only applied to AST2300 series
+ ******************************************************************************/
+ ldr r0, =0x1e6e207c @ Check bounding for AST1150 existence
+ ldr r1, [r0]
+ mov r2, r1, lsr #24
+ cmp r2, #0x01
+ bne platform_exit @ not match AST2300
+ bic r1, r1, #0xFFFFFCFF
+ mov r1, r1, lsr #8
+ cmp r1, #0x02
+ beq platform_exit @ match AST1050
+
+ ldr r0, =0x1e6e2004 @ Disable I2C controller reset
+ ldr r1, [r0]
+ orr r1, r1, #0x04
+ str r1, [r0]
+ bic r1, r1, #0x04
+ str r1, [r0]
+
+ ldr r0, =0x1e78a054 @ Check I2C bus state, if busy then quit
+ ldr r1, [r0]
+ mov r1, r1, lsr #17
+ and r1, r1, #0x03
+ cmp r1, #0x03
+ bne platform_exit
+
+ ldr r0, =0x1e78a040 @ Init I2C1 controller
+ mov r1, #0x01
+ orr r1, r1, r1, lsl #16
+ str r1, [r0]
+
+ ldr r0, =0x1e78a044
+ ldr r1, =0x77776704
+ str r1, [r0]
+
+ mov r1, #0x0
+ ldr r0, =0x1e78a048
+ str r1, [r0]
+ ldr r0, =0x1e78a04c
+ str r1, [r0]
+
+ ldr r0, =0x1e78a050
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e78a200 @ Set AST1150 I2C password
+ ldr r1, =0x00A88FA8
+ str r1, [r0]
+
+ ldr r0, =0x1e78a05c
+ ldr r1, =0x00000200 @ Enable buffer mode transfering 3 bytes
+ str r1, [r0]
+
+ ldr r0, =0x1e78a054
+ ldr r1, =0x00000063 @ Fire commmand
+ str r1, [r0]
+
+ ldr r0, =0x1e78a050
+i2c_wait_cmddone_1:
+ ldr r1, [r0]
+ tst r1, #0x38
+ beq i2c_wait_cmddone_1
+ tst r1, #0x2A @ transmit error
+ bne platform_exit2
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e78a200 @ Disable ASPM capability
+ ldr r1, =0x04005DA8
+ str r1, [r0]
+
+ ldr r0, =0x1e78a204
+ ldr r1, =0x00000024
+ str r1, [r0]
+
+ ldr r0, =0x1e78a05c
+ ldr r1, =0x00000200 @ Enable buffer mode transfering 3 bytes
+ str r1, [r0]
+
+ ldr r0, =0x1e78a054
+ ldr r1, =0x00000063 @ Fire commmand
+ str r1, [r0]
+
+ ldr r0, =0x1e78a050
+i2c_wait_cmddone_2:
+ ldr r1, [r0]
+ tst r1, #0x38
+ beq i2c_wait_cmddone_2
+ tst r1, #0x2A @ transmit error
+ bne platform_exit2
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+platform_exit2:
+ ldr r0, =0x1e78a040 @ Disable I2C1 controller
+ mov r1, #0x00
+ str r1, [r0]
+
+ b platform_exit
+.LTORG
+
+platform_exit:
+#ifdef CONFIG_DRAM_ECC
+ ldr r0, =0x1e6e0004
+ ldr r1, [r0]
+ orr r1, r1, #0x80
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0054
+ ldr r1, =0x05000000 /* ECC protected memory size, default set at 80M */
+ str r1, [r0]
+
+ ldr r0, =0x1e6e007C
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r0, =0x1e6e0074
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000221
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r2, =0x00001000
+ECC_Init_Flag:
+ ldr r1, [r0]
+ tst r1, r2 @ D[12] = 1, Done
+ beq ECC_Init_Flag
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x80000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000400
+ str r1, [r0]
+#endif
+ ldr r0, =0x1e6e2008 @ Set Video ECLK phase
+ ldr r1, [r0]
+ ldr r2, =0xfffffff3
+ and r1, r1, r2
+ orr r1, r1, #0x08
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2004
+ ldr r1, [r0]
+ ldr r2, =0xFFBFFFFF @ Enable JTAG Master, solve ARM stucked by JTAG issue
+ and r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2048 @ Set MAC interface delay timing
+ ldr r1, =0x2255
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2070 @ Set MAC AHB bus clock
+ ldr r1, [r0]
+ mov r2, #0x04 @ Default RMII, set MHCLK = HPLL/10
+ tst r1, #0xC0
+ movne r2, #0x02 @ if RGMII, set MHCLK = HPLL/6
+ ldr r0, =0x1e6e2008
+ ldr r1, [r0]
+ bic r1, r1, #0x00070000
+ orr r1, r1, r2, lsl #16
+ str r1, [r0]
+
+/* Test - DRAM initial time */
+ ldr r0, =0x1e782040
+ ldr r1, [r0]
+ ldr r0, =0xFFFFFFFF
+ sub r1, r0, r1
+ ldr r0, =0x1e72009c
+ str r1, [r0]
+ ldr r0, =0x1e7200a4
+ str r1, [r0]
+ ldr r0, =0x1e782030
+ ldr r1, [r0]
+ bic r1, r1, #0x0000F000
+ str r1, [r0]
+/* Test - DRAM initial time */
+
+/******************************************************************************
+ Reset GPIO registers when watchdog reset
+ ******************************************************************************/
+ ldr r0, =0x1e6e207c @ Check Revision ID
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x02
+ bne platform_exit3 @ not match AST2400
+
+ ldr r0, =0x1e6e203c @ Check watchdog reset event
+ ldr r1, [r0]
+ and r1, r1, #0x06
+ cmp r1, #0x0
+ beq platform_exit3 @ no watchdog reset event
+
+ ldr r0, =0x1e6e209c @ Check watchdog GPIO selection
+ ldr r1, [r0]
+ mov r1, r1, lsr #21
+ tst r1, #0x01
+ beq platform_exit3 @ no watchdog reset selection
+
+ ldr r1, =0x00000000 @ clear GPIO register reset by PRST_N
+ ldr r2, =0xFFFFFFFF
+ ldr r0, =0x1e780008
+ str r1, [r0]
+ ldr r0, =0x1e78000c
+ str r1, [r0]
+ ldr r0, =0x1e780010
+ str r1, [r0]
+ ldr r0, =0x1e780014
+ str r1, [r0]
+ ldr r0, =0x1e780018
+ str r2, [r0]
+ ldr r0, =0x1e780028
+ str r1, [r0]
+ ldr r0, =0x1e78002c
+ str r1, [r0]
+ ldr r0, =0x1e780030
+ str r1, [r0]
+ ldr r0, =0x1e780034
+ str r1, [r0]
+ ldr r0, =0x1e780038
+ str r2, [r0]
+ ldr r0, =0x1e780040
+ str r1, [r0]
+ ldr r0, =0x1e780044
+ str r1, [r0]
+ ldr r0, =0x1e780048
+ str r1, [r0]
+ ldr r0, =0x1e78004c
+ str r1, [r0]
+ ldr r0, =0x1e780050
+ str r1, [r0]
+ ldr r0, =0x1e780054
+ str r1, [r0]
+ ldr r0, =0x1e780058
+ str r1, [r0]
+ ldr r0, =0x1e780060
+ str r1, [r0]
+ ldr r0, =0x1e780064
+ str r1, [r0]
+ ldr r0, =0x1e780068
+ str r1, [r0]
+ ldr r0, =0x1e78006c
+ str r1, [r0]
+ ldr r0, =0x1e780090
+ str r1, [r0]
+ ldr r0, =0x1e780094
+ str r1, [r0]
+ ldr r0, =0x1e780098
+ str r1, [r0]
+ ldr r0, =0x1e78009c
+ str r1, [r0]
+ ldr r0, =0x1e7800a0
+ str r1, [r0]
+ ldr r0, =0x1e7800a4
+ str r1, [r0]
+ ldr r0, =0x1e7800a8
+ str r2, [r0]
+ ldr r0, =0x1e7800b0
+ str r1, [r0]
+ ldr r0, =0x1e7800b4
+ str r1, [r0]
+ ldr r0, =0x1e7800b8
+ str r1, [r0]
+ ldr r0, =0x1e7800e0
+ str r1, [r0]
+ ldr r0, =0x1e7800e4
+ str r1, [r0]
+ ldr r0, =0x1e7800e8
+ str r1, [r0]
+ ldr r0, =0x1e7800ec
+ str r1, [r0]
+ ldr r0, =0x1e7800f0
+ str r1, [r0]
+ ldr r0, =0x1e7800f4
+ str r1, [r0]
+ ldr r0, =0x1e7800f8
+ str r2, [r0]
+ ldr r0, =0x1e780100
+ str r1, [r0]
+ ldr r0, =0x1e780104
+ str r1, [r0]
+ ldr r0, =0x1e780108
+ str r1, [r0]
+ ldr r0, =0x1e780110
+ str r1, [r0]
+ ldr r0, =0x1e780114
+ str r1, [r0]
+ ldr r0, =0x1e780118
+ str r1, [r0]
+ ldr r0, =0x1e78011c
+ str r1, [r0]
+ ldr r0, =0x1e780120
+ str r1, [r0]
+ ldr r0, =0x1e780124
+ str r1, [r0]
+ ldr r0, =0x1e780128
+ str r2, [r0]
+ ldr r0, =0x1e780130
+ str r1, [r0]
+ ldr r0, =0x1e780134
+ str r1, [r0]
+ ldr r0, =0x1e780138
+ str r1, [r0]
+ ldr r0, =0x1e780140
+ str r1, [r0]
+ ldr r0, =0x1e780144
+ str r1, [r0]
+ ldr r0, =0x1e780148
+ str r1, [r0]
+ ldr r0, =0x1e78014c
+ str r1, [r0]
+ ldr r0, =0x1e780150
+ str r1, [r0]
+ ldr r0, =0x1e780154
+ str r1, [r0]
+ ldr r0, =0x1e780158
+ str r2, [r0]
+ ldr r0, =0x1e780160
+ str r1, [r0]
+ ldr r0, =0x1e780164
+ str r1, [r0]
+ ldr r0, =0x1e780168
+ str r1, [r0]
+ ldr r0, =0x1e780170
+ str r1, [r0]
+ ldr r0, =0x1e780174
+ str r1, [r0]
+ ldr r0, =0x1e780178
+ str r1, [r0]
+ ldr r0, =0x1e78017c
+ str r1, [r0]
+ ldr r0, =0x1e780180
+ str r1, [r0]
+ ldr r0, =0x1e780184
+ str r1, [r0]
+ ldr r0, =0x1e780188
+ str r2, [r0]
+ ldr r0, =0x1e780190
+ str r1, [r0]
+ ldr r0, =0x1e780194
+ str r1, [r0]
+ ldr r0, =0x1e780198
+ str r1, [r0]
+ ldr r0, =0x1e7801d0
+ str r1, [r0]
+ ldr r0, =0x1e7801d4
+ str r1, [r0]
+
+ ldr r0, =0x1e780204 @ clear SGPIOM register reset by PRST_N
+ str r1, [r0]
+ ldr r0, =0x1e780208
+ str r1, [r0]
+ ldr r0, =0x1e78020c
+ str r1, [r0]
+ ldr r0, =0x1e780210
+ str r1, [r0]
+ ldr r0, =0x1e780214
+ str r2, [r0]
+ ldr r0, =0x1e780220
+ str r1, [r0]
+ ldr r0, =0x1e780224
+ str r1, [r0]
+ ldr r0, =0x1e780228
+ str r1, [r0]
+ ldr r0, =0x1e78022c
+ str r1, [r0]
+ ldr r0, =0x1e780230
+ str r2, [r0]
+ ldr r0, =0x1e78023c
+ str r1, [r0]
+ ldr r0, =0x1e780240
+ str r1, [r0]
+ ldr r0, =0x1e780244
+ str r1, [r0]
+ ldr r0, =0x1e780248
+ str r1, [r0]
+ ldr r0, =0x1e78024c
+ str r2, [r0]
+ ldr r0, =0x1e780254
+ ldr r3, =0x01000040
+ str r3, [r0]
+ ldr r0, =0x1e780258
+ str r1, [r0]
+ ldr r0, =0x1e78025c
+ str r1, [r0]
+ ldr r0, =0x1e780260
+ str r1, [r0]
+
+ ldr r0, =0x1e780300 @ clear SGPIOS register reset by PRST_N
+ str r1, [r0]
+ ldr r0, =0x1e780304
+ str r1, [r0]
+ ldr r0, =0x1e780308
+ str r1, [r0]
+ ldr r0, =0x1e78030c
+ str r1, [r0]
+ ldr r0, =0x1e780310
+ str r1, [r0]
+ ldr r0, =0x1e780314
+ str r1, [r0]
+ ldr r0, =0x1e780318
+ str r2, [r0]
+ ldr r0, =0x1e78031c
+ str r2, [r0]
+ ldr r0, =0x1e780320
+ str r2, [r0]
+
+platform_exit3:
+
+/******************************************************************************
+ SPI Timing Calibration, not applicable to AST2300 series
+ ******************************************************************************/
+ ldr r0, =0x1e6e207c @ Check Revision ID
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x02
+ blt platform_exit4 @ not match AST2400 or later
+
+ ldr r0, =0x1e6e2070 @ Check SPI flash
+ ldr r1, [r0]
+ and r1, r1, #0x03
+ cmp r1, #0x02
+ bne platform_exit4
+
+ mov r2, #0x0
+ mov r6, #0x0
+ mov r7, #0x0
+ init_spi_checksum
+spi_checksum_wait_0:
+ ldr r1, [r0]
+ tst r1, r2
+ beq spi_checksum_wait_0
+ ldr r0, =0x1e620090
+ ldr r5, [r0] @ record golden checksum
+ ldr r0, =0x1e620080
+ mov r1, #0x0
+ str r1, [r0]
+
+ ldr r0, =0x1e620010 @ set to fast read mode
+ ldr r1, =0x000B0041
+ str r1, [r0]
+
+ ldr r6, =0x00F7E6D0 @ Init spiclk loop
+ mov r8, #0x0 @ Init delay record
+
+spi_cbr_next_clkrate:
+ mov r6, r6, lsr #0x4
+ cmp r6, #0x0
+ beq spi_cbr_end
+
+ mov r7, #0x0 @ Init delay loop
+ mov r8, r8, lsl #4
+
+spi_cbr_next_delay_s:
+ mov r2, #0x8
+ init_spi_checksum
+spi_checksum_wait_1:
+ ldr r1, [r0]
+ tst r1, r2
+ beq spi_checksum_wait_1
+ ldr r0, =0x1e620090
+ ldr r2, [r0] @ read checksum
+ ldr r0, =0x1e620080
+ mov r1, #0x0
+ str r1, [r0]
+ cmp r2, r5
+ bne spi_cbr_next_delay_e
+
+ mov r2, #0x0
+ init_spi_checksum
+spi_checksum_wait_2:
+ ldr r1, [r0]
+ tst r1, r2
+ beq spi_checksum_wait_2
+ ldr r0, =0x1e620090
+ ldr r2, [r0] @ read checksum
+ ldr r0, =0x1e620080
+ mov r1, #0x0
+ str r1, [r0]
+ cmp r2, r5
+ bne spi_cbr_next_delay_e
+
+ orr r8, r8, r7 @ record passed delay
+ b spi_cbr_next_clkrate
+
+spi_cbr_next_delay_e:
+ add r7, r7, #0x1
+ cmp r7, #0x6
+ blt spi_cbr_next_delay_s
+ b spi_cbr_next_clkrate
+
+spi_cbr_end:
+ ldr r0, =0x1e620094
+ str r8, [r0]
+ ldr r0, =0x1e620010
+ mov r1, #0x0
+ str r1, [r0]
+
+platform_exit4:
+
+ /* restore lr */
+ mov lr, r4
+
+ /* back to arch calling code */
+ mov pc, lr
diff --git a/board/aspeed/ast2300/rc4.c b/board/aspeed/ast2300/rc4.c
new file mode 100755
index 0000000..32e0ffa
--- /dev/null
+++ b/board/aspeed/ast2300/rc4.c
@@ -0,0 +1,68 @@
+/*
+ * 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
+ */
+struct rc4_state
+{
+ int x, y, m[256];
+};
+
+void rc4_setup( struct rc4_state *s, unsigned char *key, int length )
+{
+ int i, j, k, *m, a;
+
+ s->x = 0;
+ s->y = 0;
+ m = s->m;
+
+ for( i = 0; i < 256; i++ )
+ {
+ m[i] = i;
+ }
+
+ j = k = 0;
+
+ for( i = 0; i < 256; i++ )
+ {
+ a = m[i];
+ j = (unsigned char) ( j + a + key[k] );
+ m[i] = m[j]; m[j] = a;
+ if( ++k >= length ) k = 0;
+ }
+}
+
+void rc4_crypt( struct rc4_state *s, unsigned char *data, int length )
+{
+ int i, x, y, *m, a, b;
+
+ x = s->x;
+ y = s->y;
+ m = s->m;
+
+ for( i = 0; i < length; i++ )
+ {
+ x = (unsigned char) ( x + 1 ); a = m[x];
+ y = (unsigned char) ( y + a );
+ m[x] = b = m[y];
+ m[y] = a;
+ data[i] ^= m[(unsigned char) ( a + b )];
+ }
+
+ s->x = x;
+ s->y = y;
+}
+
+void rc4_crypt_sw(unsigned char *data, int ulMsgLength, unsigned char *rc4_key, unsigned long ulKeyLength )
+{
+ struct rc4_state s;
+
+ rc4_setup( &s, rc4_key, ulKeyLength );
+
+ rc4_crypt( &s, data, ulMsgLength );
+}
diff --git a/board/aspeed/ast2300/regtest.c b/board/aspeed/ast2300/regtest.c
new file mode 100755
index 0000000..1cd75ae
--- /dev/null
+++ b/board/aspeed/ast2300/regtest.c
@@ -0,0 +1,91 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_REGTEST) && defined(CONFIG_SLT))
+#include "regtest.h"
+
+int do_regtest (void)
+{
+ _SOCRegTestInfo *pjSOCRegInfo;
+ _SOCRegTestTbl *pjRegTable;
+ unsigned long ulRegBase;
+ unsigned long ulIndex, ulBack, ulAND, ulMask, ulData, ulTemp;
+ unsigned long Flags = 0;
+
+ /* unlock reg */
+ *(unsigned long *) (0x1e600000) = 0xaeed1a03; /* AHBC */
+ *(unsigned long *) (0x1e6e0000) = 0xfc600309; /* MMC */
+ *(unsigned long *) (0x1e6e2000) = 0x1688a8a8; /* SCU */
+
+ /* SCU */
+
+ /* do test */
+ pjSOCRegInfo = SOCRegTestInfo;
+ while (strcmp(pjSOCRegInfo->jName, "END"))
+ {
+ /* Reg. Test Start */
+ ulRegBase = pjSOCRegInfo->ulRegOffset;
+ pjRegTable = pjSOCRegInfo->pjTblIndex;
+
+ while (pjRegTable->ulIndex != 0xFFFFFFFF)
+ {
+ ulIndex = ulRegBase + pjRegTable->ulIndex;
+
+ ulBack = *(unsigned long *) (ulIndex);
+
+ ulMask = pjRegTable->ulMask;
+ ulAND = ~pjRegTable->ulMask;
+
+ ulData = 0xFFFFFFFF & pjRegTable->ulMask;
+ *(unsigned long *) (ulIndex) = ulData;
+ ulTemp = *(volatile unsigned long *) (ulIndex) & pjRegTable->ulMask;
+ if (ulData != ulTemp)
+ {
+ Flags |= pjSOCRegInfo->ulFlags;
+ printf("[DBG] RegTest: Failed Index:%x, Data:%x, Temp:%x \n", ulIndex, ulData, ulTemp);
+ }
+
+ ulData = 0x00000000 & pjRegTable->ulMask;
+ *(unsigned long *) (ulIndex) = ulData;
+ ulTemp = *(volatile unsigned long *) (ulIndex) & pjRegTable->ulMask;
+ if (ulData != ulTemp)
+ {
+ Flags |= pjSOCRegInfo->ulFlags;
+ printf("[DBG] RegTest: Failed Index:%x, Data:%x, Temp:%x \n", ulIndex, ulData, ulTemp);
+ }
+
+ *(unsigned long *) (ulIndex) = ulBack;
+
+ pjRegTable++;
+
+ } /* Individual Reg. Test */
+
+ if (Flags & pjSOCRegInfo->ulFlags)
+ printf("[INFO] RegTest: %s Failed \n", pjSOCRegInfo->jName);
+
+ pjSOCRegInfo++;
+
+ } /* Reg. Test */
+
+ return Flags;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2300/regtest.h b/board/aspeed/ast2300/regtest.h
new file mode 100755
index 0000000..49a360e
--- /dev/null
+++ b/board/aspeed/ast2300/regtest.h
@@ -0,0 +1,255 @@
+/*
+ * 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
+ */
+typedef struct {
+ unsigned long ulIndex;
+ unsigned long ulMask;
+} _SOCRegTestTbl;
+
+typedef struct {
+ unsigned char jName[10];
+ unsigned long ulRegOffset;
+ _SOCRegTestTbl *pjTblIndex;
+ unsigned long ulFlags;
+} _SOCRegTestInfo;
+
+_SOCRegTestTbl SMCRegTestTbl[] = {
+ {0x00000000, 0x00001FF3},
+ {0x00000004, 0xFFFFFFFF},
+ {0x00000008, 0x0FFF17FF},
+ {0x0000000C, 0xFFFFFFFF},
+ {0x00000010, 0xFF5FFFF3},
+ {0x00000018, 0x0FFFFFFF},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl AHBCRegTestTbl[] = {
+ {0x00000080, 0x0000FFFE},
+ {0x00000088, 0x01000000},
+ {0x0000008c, 0x00000031},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MICRegTestTbl[] = {
+/*
+ {0x00000000, 0x0FFFFFF8},
+ {0x00000004, 0x0FFFFFF8},
+ {0x00000008, 0x0000FFFF},
+ {0x0000000C, 0x0FFFF000},
+ {0x00000010, 0xFFFFFFFF},
+*/
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MAC1RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MAC2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl USB2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VICRegTestTbl[] = {
+ {0x0000000C, 0xFFFFFFFF},
+ {0x00000024, 0xFFFFFFFF},
+ {0x00000028, 0xFFFFFFFF},
+ {0x0000002C, 0xFFFFFFFF},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MMCRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl USB11RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl SCURegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl HASERegTestTbl[] = {
+ {0x00000000, 0x0FFFFFF8},
+ {0x00000004, 0x0FFFFFF8},
+ {0x00000008, 0x0FFFFFF8},
+ {0x0000000C, 0x0FFFFFF8},
+ //{0x00000010, 0x00001FFF},
+ {0x00000020, 0x0FFFFFF8},
+ {0x00000024, 0x0FFFFFF8},
+ {0x00000028, 0x0FFFFFc0},
+ {0x0000002C, 0x0FFFFFFF},
+ //{0x00000030, 0x000003FF},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl I2SRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl CRTRegTestTbl[] = {
+/*
+ {0x00000000, 0x001F3703},
+ {0x00000004, 0x0000FFC1},
+*/
+ {0x00000010, 0x0FFF0FFF},
+ {0x00000014, 0x0FFF0FFF},
+ {0x00000018, 0x07FF07FF},
+ {0x0000001C, 0x07FF07FF},
+ {0x00000020, 0x0FFFFFF8},
+ {0x00000024, 0x07FF3FF8},
+/*
+ {0x00000028, 0x003F003F},
+ {0x00000030, 0x003F003F},
+ {0x00000034, 0x0FFF0FFF},
+ {0x00000038, 0x0FFFFFF8},
+*/
+ {0x00000040, 0x0FFF0FFF},
+ {0x00000044, 0x07FF07FF},
+ {0x00000048, 0x0FFFFFF8},
+ {0x0000004C, 0x00FF07F8},
+ {0x00000050, 0x000F0F0F},
+/*
+ {0x00000060, 0x001F3703},
+ {0x00000064, 0x0000FFC1},
+*/
+ {0x00000070, 0x0FFF0FFF},
+ {0x00000074, 0x0FFF0FFF},
+ {0x00000078, 0x07FF07FF},
+ {0x0000007C, 0x07FF07FF},
+ {0x00000080, 0x0FFFFFF8},
+ {0x00000084, 0x07FF3FF8},
+/*
+ {0x00000088, 0x003F003F},
+ {0x00000090, 0x003F003F},
+ {0x00000094, 0x0FFF0FFF},
+ {0x00000098, 0x0FFFFFF8},
+*/
+ {0x000000A0, 0x0FFF0FFF},
+ {0x000000A4, 0x07FF07FF},
+ {0x000000A8, 0x0FFFFFF8},
+ {0x000000AC, 0x00FF07F8},
+ {0x000000B0, 0x000F0F0F},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VIDEORegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl A2PRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MDMARegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl M2DRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl GPIORegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl RTCRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl TIMERRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl UART1RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl UART2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl WDTRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PWMRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VUART1RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VUART2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl LPCRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl I2CRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PECIRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PCIARegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PCIRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+
+/* Test List */
+_SOCRegTestInfo SOCRegTestInfo[] = {
+ /* Test Name, Reg. Offset, Test Table, Error Code */
+ { "SMCREG", 0x16000000, SMCRegTestTbl, 0x00000001},
+ { "AHBCREG", 0x1e600000, AHBCRegTestTbl, 0x00000002},
+ { "MICREG", 0x1e640000, MICRegTestTbl, 0x00000004},
+ { "MAC1REG", 0x1e660000, MAC1RegTestTbl, 0x00000008},
+ { "MAC2REG", 0x1e680000, MAC2RegTestTbl, 0x00000010},
+ { "USB2REG", 0x1e6a0000, USB2RegTestTbl, 0x00000020},
+ { "VICREG", 0x1e6c0000, VICRegTestTbl, 0x00000040},
+ { "MMCREG", 0x1e6e0000, MMCRegTestTbl, 0x00000080},
+ { "USB11REG", 0x1e6e1000, USB11RegTestTbl, 0x00000100},
+ { "SCUREG", 0x1e6e2000, SCURegTestTbl, 0x00000200},
+ { "HASEREG", 0x1e6e3000, HASERegTestTbl, 0x00000400},
+ { "I2SREG", 0x1e6e5000, I2SRegTestTbl, 0x00000800},
+ { "CRTREG", 0x1e6e6000, CRTRegTestTbl, 0x00001000},
+ { "VIDEOREG", 0x1e700000, VIDEORegTestTbl, 0x00002000},
+ { "A2PREG", 0x1e720000, A2PRegTestTbl, 0x00004000},
+ { "MDMAREG", 0x1e740000, MDMARegTestTbl, 0x00008000},
+ { "2DREG", 0x1e760000, M2DRegTestTbl, 0x00010000},
+ { "GPIOREG", 0x1e780000, GPIORegTestTbl, 0x00020000},
+ { "RTCREG", 0x1e781000, RTCRegTestTbl, 0x00040000},
+ { "TIMERREG", 0x1e782000, TIMERRegTestTbl, 0x00080000},
+ { "UART1REG", 0x1e783000, UART1RegTestTbl, 0x00100000},
+ { "UART2REG", 0x1e784000, UART2RegTestTbl, 0x00200000},
+ { "WDTREG", 0x1e785000, WDTRegTestTbl, 0x00400000},
+ { "PWMREG", 0x1e786000, PWMRegTestTbl, 0x00800000},
+ {"VUART1REG", 0x1e787000, VUART1RegTestTbl, 0x01000000},
+ {"VUART2REG", 0x1e788000, VUART2RegTestTbl, 0x02000000},
+ { "LPCREG", 0x1e789000, LPCRegTestTbl, 0x04000000},
+ { "I2CREG", 0x1e78A000, I2CRegTestTbl, 0x08000000},
+ { "PECIREG", 0x1e78B000, PECIRegTestTbl, 0x10000000},
+ { "PCIAREG", 0x1e78C000, PCIARegTestTbl, 0x20000000},
+ { "PCIREG", 0x60000000, PCIRegTestTbl, 0x40000000},
+ { "END", 0xffffffff, NULL, 0xffffffff}
+};
diff --git a/board/aspeed/ast2300/slt.c b/board/aspeed/ast2300/slt.c
new file mode 100755
index 0000000..3283d34
--- /dev/null
+++ b/board/aspeed/ast2300/slt.c
@@ -0,0 +1,105 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if defined (CONFIG_SLT)
+
+int do_slt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ int flags = 0;
+ int loop = 1;
+
+ if (argc > 1) {
+ loop = simple_strtoul(argv[1], NULL, 10);
+ }
+
+ do {
+
+do_slt_start:
+ /* Reg. Test */
+#if (CFG_CMD_SLT & CFG_CMD_REGTEST)
+ if (do_regtest())
+ {
+ flags |= FLAG_REGTEST_FAIL;
+ printf("[INFO] RegTest Failed \n");
+ }
+ else
+ printf("[INFO] RegTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_MACTEST)
+ if (do_mactest())
+ {
+ flags |= FLAG_MACTEST_FAIL;
+ printf("[INFO] MACTest Failed \n");
+ }
+ else
+ printf("[INFO] MACTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_VIDEOTEST)
+ if (do_videotest())
+ {
+ flags |= FLAG_VIDEOTEST_FAIL;
+ printf("[INFO] VideoTest Failed \n");
+ }
+ else
+ printf("[INFO] VideoTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_HACTEST)
+ if (do_hactest())
+ {
+ flags |= FLAG_HACTEST_FAIL;
+ printf("[INFO] HACTest Failed \n");
+ }
+ else
+ printf("[INFO] HACTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_MICTEST)
+ if (do_mictest())
+ {
+ flags |= FLAG_MICTEST_FAIL;
+ printf("[INFO] MICTest Failed \n");
+ }
+ else
+ printf("[INFO] MICTest Passed \n");
+#endif
+
+ /* Summary */
+ if (flags)
+ printf ("[INFO] SLT Test Failed!! \n");
+ else
+ printf ("[INFO] SLT Test Passed!! \n");
+
+ if (loop == 0) /* infinite */
+ goto do_slt_start;
+ else
+ loop--;
+
+ } while (loop);
+
+ return 0;
+}
+/***************************************************/
+
+U_BOOT_CMD(
+ slt, CONFIG_SYS_MAXARGS, 0, do_slt,
+ "slt - slt test program \n",
+ NULL
+);
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2300/slt.h b/board/aspeed/ast2300/slt.h
new file mode 100755
index 0000000..4e650bc
--- /dev/null
+++ b/board/aspeed/ast2300/slt.h
@@ -0,0 +1,29 @@
+/*
+ * 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
+ */
+#define CFG_CMD_REGTEST 0x00000001
+#define CFG_CMD_MACTEST 0x00000002
+#define CFG_CMD_VIDEOTEST 0x00000004
+#define CFG_CMD_HACTEST 0x00000008
+#define CFG_CMD_MICTEST 0x00000010
+#define CFG_CMD_OSDTEST 0x00000020
+#define CFG_CMD_2DTEST 0x00000040
+#define CFG_CMD_HWCTEST 0x00000080
+
+#define FLAG_REGTEST_FAIL 0x00000001
+#define FLAG_MACTEST_FAIL 0x00000002
+#define FLAG_VIDEOTEST_FAIL 0x00000004
+#define FLAG_HACTEST_FAIL 0x00000008
+#define FLAG_MICTEST_FAIL 0x00000010
+#define FLAG_OSDTEST_FAIL 0x00000020
+#define FLAG_2DTEST_FAIL 0x00000040
+#define FLAG_HWCTEST_FAIL 0x00000080
+
+
diff --git a/board/aspeed/ast2300/type.h b/board/aspeed/ast2300/type.h
new file mode 100755
index 0000000..f57ee5a
--- /dev/null
+++ b/board/aspeed/ast2300/type.h
@@ -0,0 +1,116 @@
+/*
+ * 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
+ */
+#ifndef _TYPE_H_
+#define _TYPE_H_
+
+ typedef unsigned char BOOL;
+ typedef unsigned char UINT8;
+ typedef unsigned short UINT16;
+ typedef unsigned int UINT32;
+
+ #define FLONG unsigned long
+ #define BYTE unsigned char
+ #define INT int
+ #define VOID void
+ #define BOOLEAN unsigned short
+ #define ULONG unsigned long
+ #define USHORT unsigned short
+ #define UCHAR unsigned char
+ #define CHAR char
+ #define LONG long
+ #define PUCHAR UCHAR *
+ #define PULONG ULONG *
+
+ #define FAIL 1
+
+ #define intfunc int386
+
+ #define outdwport outpd
+ #define indwport inpd
+ #define outport outp
+ #define inport inp
+
+ //#define NULL ((void *)0)
+ #define FALSE 0
+ #define TRUE 1
+
+ #define ReadMemoryBYTE(baseaddress,offset) *(BYTE *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define ReadMemoryLong(baseaddress,offset) *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define ReadMemoryShort(baseaddress,offset) *(USHORT *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define WriteMemoryBYTE(baseaddress,offset,data) *(BYTE *)((ULONG)(baseaddress)+(ULONG)(offset)) = (BYTE)(data)
+ #define WriteMemoryLong(baseaddress,offset,data) *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))=(ULONG)(data)
+ #define WriteMemoryShort(baseaddress,offset,data) *(USHORT *)((ULONG)(baseaddress)+(ULONG)(offset))=(USHORT)(data)
+ #define WriteMemoryLongWithANDData(baseaddress, offset, anddata, data) *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) & (ULONG)(anddata) | (ULONG)(data)
+
+ #define WriteMemoryLongWithMASK(baseaddress, offset, data, mask) \
+ *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = *(volatile ULONG *)(((ULONG)(baseaddress)+(ULONG)(offset)) & (ULONG)(~(mask))) | ((ULONG)(data) & (ULONG)(mask))
+
+ #define ReadMemoryLongHost(baseaddress,offset) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define WriteMemoryLongHost(baseaddress,offset,data) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))=(ULONG)(data)
+ #define WriteMemoryBYTEHost(baseaddress,offset,data) *(volatile BYTE *)((ULONG)(baseaddress)+(ULONG)(offset)) = (BYTE)(data)
+#define WriteMemoryLongWithMASKHost(baseaddress, offset, data, mask) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = (((*(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)))&(~mask)) | (ULONG)((data)&(mask)))
+
+ #define ReadMemoryLongClient(baseaddress,offset) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define WriteMemoryLongClient(baseaddress,offset,data) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))=(ULONG)(data)
+ #define WriteMemoryBYTEClient(baseaddress,offset,data) *(volatile BYTE *)((ULONG)(baseaddress)+(ULONG)(offset)) = (BYTE)(data)
+#define WriteMemoryLongWithMASKClient(baseaddress, offset, data, mask) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = (((*(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)))&(~mask)) | (ULONG)((data)&(mask)))
+
+#ifdef BUF_GLOBALS
+#define BUF_EXT
+#else
+#define BUF_EXT extern
+#endif
+
+BUF_EXT ULONG g_CAPTURE_VIDEO1_BUF1_ADDR; /* VIDEO1_BUF_1_ADDR*/
+BUF_EXT ULONG g_CAPTURE_VIDEO1_BUF2_ADDR; /* VIDEO1_BUF_2_ADDR*/
+BUF_EXT ULONG g_VIDEO1_COMPRESS_BUF_ADDR; /* Encode destination address */
+BUF_EXT ULONG g_VIDEO1_CRC_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO1_FLAG_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO1_RC4_BUF_ADDR;
+
+
+BUF_EXT ULONG g_CAPTURE_VIDEO2_BUF1_ADDR;
+BUF_EXT ULONG g_CAPTURE_VIDEO2_BUF2_ADDR;
+BUF_EXT ULONG g_VIDEO2_COMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_CRC_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_FLAG_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_VIDEO1_DECODE_BUF_1_ADDR;
+BUF_EXT ULONG g_VIDEO1_DECODE_BUF_2_ADDR;
+BUF_EXT ULONG g_VIDEO1_DECOMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO1_DECODE_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_VIDEO2_DECODE_BUF_1_ADDR;
+BUF_EXT ULONG g_VIDEO2_DECODE_BUF_2_ADDR;
+BUF_EXT ULONG g_VIDEO2_DECOMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_DECODE_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_CAPTURE_VIDEOM_BUF1_ADDR;
+BUF_EXT ULONG g_CAPTURE_VIDEOM_BUF2_ADDR;
+BUF_EXT ULONG g_VIDEOM_COMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEOM_FLAG_BUF_ADDR;
+BUF_EXT ULONG g_VIDEOM_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_VIDEOM_DECODE_BUF_1_ADDR;
+BUF_EXT ULONG g_VIDEOM_DECODE_BUF_2_ADDR;
+BUF_EXT ULONG g_VIDEOM_DECOMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEOM_DECODE_RC4_BUF_ADDR;
+
+#ifdef WIN_GLOBALS
+#define WIN_EXT
+#else
+#define WIN_EXT extern
+#endif
+
+WIN_EXT USHORT g_DefWidth, g_DefHeight;
+
+#endif
diff --git a/board/aspeed/ast2300/u-boot.lds b/board/aspeed/ast2300/u-boot.lds
new file mode 100755
index 0000000..b5a90ef
--- /dev/null
+++ b/board/aspeed/ast2300/u-boot.lds
@@ -0,0 +1,45 @@
+/*
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+ . = 0x00000000;
+
+ . = ALIGN(4);
+ .text :
+ {
+ cpu/arm926ejs/start.o (.text)
+ *(.text)
+ }
+
+ . = ALIGN(4);
+ .rodata : { *(.rodata) }
+
+ . = ALIGN(4);
+ .data : { *(.data) }
+
+ . = ALIGN(4);
+ .got : { *(.got) }
+
+ __u_boot_cmd_start = .;
+ .u_boot_cmd : { *(.u_boot_cmd) }
+ __u_boot_cmd_end = .;
+
+ . = ALIGN(4);
+ __bss_start = .;
+ .bss : { *(.bss) }
+ _end = .;
+}
diff --git a/board/aspeed/ast2300/vdef.h b/board/aspeed/ast2300/vdef.h
new file mode 100755
index 0000000..3c99b7e
--- /dev/null
+++ b/board/aspeed/ast2300/vdef.h
@@ -0,0 +1,500 @@
+/*
+ * 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
+ */
+#ifndef _VDEF_H_
+#define _VDEF_H_
+
+#define VIDEO1 0
+#define VIDEO1_ON 0x01
+#define VIDEO2 1
+#define VIDEO2_ON 0x02
+
+#define VIDEOM_ON 0x04
+#define VIDEOM 2
+
+#define CRT_1 0
+#define CRT_1_ON 0x01
+#define CRT_2 1
+#define CRT_2_ON 0x02
+
+#define SINGLE_CODEC_SINGLE_CAPTURE 0
+#define AUTO_CODEC_SINGLE_CAPTURE 2
+#define AUTO_CODEC_AUTO_CAPTURE 3
+
+#define MAC1_BASE 0x1E660000
+#define APB_BRIDGE_1_BASE 0x1E6E0000
+#define VIDEO_REG_BASE 0x1E700000
+#define APB_BRIDGE_2_BASE 0x1E780000
+
+#define DRAM_INIT_BASE 0x1E6E0000
+
+#define SDRAM_PROTECT_REG 0x00
+ #define SDRAM_WRITE_DISABLE 0
+ #define SDRAM_WRITE_ENABLE 1
+
+#define SCU_BASE 0x1E6E0000
+#define SCU_OFFSET 0x2000
+
+#define VIC_BASE 0x1E6C0000
+ #define VIDEO_INT_BIT 7
+
+#define IRQ_STATUS_REG 0x00
+#define RAW_INT_STATUS_REG 0x08
+#define INT_SEL_REG 0x0C
+ #define FIQ_INT 1
+ #define IRQ_INT 0
+#define INT_EN_REG 0x10
+#define INT_EN_CLEAR_REG 0x14
+#define INT_SOFT_REG 0x18
+#define INT_SOFT_CLEAR_REG 0x1C
+#define INT_SENSE_REG 0x24
+ #define LEVEL_SENSE 1
+ #define EDGE_SENSE 0
+#define INT_EVENT_REG 0x2C
+ #define HIGH_LEVEL_SENSE 1
+ #define LOW_LEVEL_SENSE 0
+
+#define SCU_HW_TRAPPING_REG 0x70 + SCU_OFFSET
+ #define CLIENT_MODE_EN_BIT 18
+ #define CLIENT_MODE_EN_MASK 0x00040000
+ #define BE_HOST_CHIP 0
+ #define BE_CLIENT_CHIP 1
+
+#define SCU_ULOCK_KEY 0x1688A8A8
+
+#define SCU_PROTECT_REG 0x00 + SCU_OFFSET
+ #define SCU_WRITE_DISABLE 0
+ #define SCU_WRITE_ENABLE 1
+
+#define SCU_CONTROL_REG 0x04 + SCU_OFFSET
+ #define VIDEO_ENGINE_RESET 0x00000040
+ #define VIDEO_ENGINE_RESET_BIT 6
+ #define VIDEO_ENGINE_RESET_MASK 0x00000040
+ #define VIDEO_RESET_EN 1
+ #define VIDEO_RESET_OFF 0
+
+#define SCU_CLOCK_SELECTION_REG 0x08 + SCU_OFFSET
+ #define PORTA_CLOCK_DELAY_MASK 7 << 8 //Video port A output clcok selection
+ #define PORTA_CLOCK_INV_DELAY_1NS 5 << 8 //Clock inversed and delay ~ 2ns
+ #define PORTA_CLOCK_INV_DELAY_2NS 6 << 8 //Clock inversed and delay ~ 3ns
+ #define PORTB_CLOCK_DELAY_MASK 7 << 12 //Video port B output clock delay
+ #define PORTB_CLOCK_INV_DELAY_1NS 5 << 12 //Clock inversed and delay ~ 3ns
+ #define PORTB_CLOCK_INV_DELAY_2NS 6 << 12 //Clock inversed and delay ~ 3ns
+ #define PORTB_CLOCK_SEL 1 << 15 //Video port B clock selection
+ #define PORTB_FROM_D1CLK 0 << 15
+ #define PORTB_FROM_D2CLK 1 << 15
+ #define ECLK_CLK_SEL_MASK (3 << 2)
+ #define ECLK_FROM_HPLL (1 << 2)
+
+ #define D2CLK_CLOCK_SELECTION 0x00020000
+ #define D2CLK_CLOCK_SELECTION_BIT 17
+ #define D2CLK_CLOCK_SELECTION_MASK 0x00060000
+ #define NORMAL_CRT1 0
+ #define V1CLK_VIDEO1 2
+ #define V1CLK_VIDEO2 3
+
+#define SCU_CLOCK_STOP_REG 0x0C + SCU_OFFSET
+ #define EN_ECLK 0 << 0 //Enable ECLK (For Video Engine)
+ #define STOP_ECLK_BIT 0
+ #define STOP_ECLK_MASK 1 << 0
+ #define EN_V1CLK 0 << 3 //Enable V1CLK (For Video Capture #1)
+ #define STOP_V1CLK_BIT 3
+ #define STOP_V1CLK_MASK 1 << 3
+ #define EN_D1CLK 0 << 10 //Enable D1CLK (For CRT1)
+ #define STOP_D1CLK_BIT 10
+ #define STOP_D1CLK_MASK 1 << 10
+ #define EN_D2CLK 0 << 11 //Stop D2CLK (For CRT2)
+ #define STOP_D2CLK (1 << 11)
+ #define STOP_D2CLK_BIT 11
+ #define STOP_D2CLK_MASK 1 << 11
+ #define EN_V2CLK 0 << 12 //Stop V2CLK (For Video Capture #2)
+ #define STOP_V2CLK_BIT 12
+ #define STOP_V2CLK_MASK 1 << 12
+ #define STOP_HACE_BIT 13
+ #define EN_HACE (0 << 13)
+ #define STOP_HACE_MASK (1 << 13)
+ #define EN_I2SCLK 0 << 18
+ #define STOP_I2SCLK_MASK 1 << 18
+
+#define SCU_PIN_CTRL1_REG 0x74 + SCU_OFFSET
+ #define I2C_5_PIN_EN 1 << 12 //Enable I2C #5 PIN
+ #define I2C_5_PIN_OFF 0 << 12 //Disable I2C #5 PIN
+ #define I2C_5_PIN_MASK 1 << 12
+ #define VGA_PIN_OFF 0 << 15 //Enable VGA pins
+ #define VGA_PIN_MASK 1 << 15
+ #define VIDEO_PORTA_EN 1 << 16 //Enable Video port A control pins
+ #define VIDEO_PORTA_MASK 1 << 16
+ #define VIDEO_PORTB_EN 1 << 17 //Enable Video port B control pins
+ #define VIDEO_PORTB_MASK 1 << 17
+ #define VIDEO_VP1_EN 1 << 22 //Enable VP[11:0]
+ #define VIDEO_VP1_MASK 1 << 22
+ #define VIDEO_VP2_EN 1 << 23 //Enable VP[23:12]
+ #define VIDEO_VP2_MASK 1 << 23
+ #define I2S_PIN_EN 1 << 29 //Enable I2S function pins
+ #define I2S_PIN_MASK 1 << 29
+
+#define SCU_PIN_CTRL2_REG 0x78 + SCU_OFFSET
+ #define VIDEO_PORTA_SINGLE_EDGE_MASK 1 << 0
+ #define VIDEO_PORTA_SINGLE_EDGE 1 << 0 //Enable Video port A single mode
+ #define VIDEO_PORTA_DUAL_EDGE 0 << 0
+ #define VIDEO_PORTB_SINGLE_EDGE_MASK 1 << 1
+ #define VIDEO_PORTB_DUAL_EDGE 0 << 1
+ #define VIDEO_PORTB_SINGLE_EDGE 1 << 1 //Enable Video port B single mode
+
+#define SCU_M_PLL_PARAM_REG 0x20 + SCU_OFFSET
+
+#define DRAM_BASE 0x40000000
+
+#define INPUT_BITCOUNT_YUV444 4
+#define INPUT_BITCOUNT_YUV420 2
+
+/* HW comment value */
+//PASSWORD
+#define VIDEO_UNLOCK_KEY 0x1A038AA8
+#define SCU_UNLOCK_KEY 0x1688A8A8
+#define SDRAM_UNLOCK_KEY 0xFC600309
+
+
+//#define SAMPLE_RATE 12000000.0
+#ifdef OSC_NEW
+ #define SAMPLE_RATE 24576000.0
+#else
+ #define SAMPLE_RATE 24000000.0
+#endif
+
+#define MODEDETECTION_VERTICAL_STABLE_MAXIMUM 0x4
+#define MODEDETECTION_HORIZONTAL_STABLE_MAXIMUM 0x4
+#define MODEDETECTION_VERTICAL_STABLE_THRESHOLD 0x4
+#define MODEDETECTION_HORIZONTAL_STABLE_THRESHOLD 0x8
+
+#define MODEDETECTION_EDGE_PIXEL_THRES_DIGITAL 2
+#define MODEDETECTION_EDGE_PIXEL_THRES_ANALOGE 0x0A
+
+#define MODEDETECTION_OK 0
+#define MODEDETECTION_ERROR 1
+#define JUDGE_MODE_ERROR 2
+
+//I2C Loop Count
+#define LOOP_COUNT 1000
+#define CAN_NOT_FIND_DEVICE 1
+#define SET_I2C_DONE 0
+#define I2C_BASE 0xA000
+#define AC_TIMING 0x77743355
+
+//I2C channel and Devices
+#define I2C_VIDEO1_EEPROM 0x2
+#define I2C_VIDEO2_EEPROM 0x5
+#define I2C_VIDEO2_9883 0x4
+/*
+ULONG CAPTURE1_ADDRESS = 0x1000000;
+ULONG CAPTURE2_ADDRESS = 0x3000000;
+ULONG PASS1_ENCODE_SOURCE_ADDRESS = 0x1000000;
+ULONG PASS1_ENCODE_DESTINATION_ADDRESS = 0x2000000;
+ULONG Buffer1_DECODE_SOURCE_ADDRESS = 0x1000000;
+ULONG Buffer2_DECODE_SOURCE_ADDRESS = 0x1400000;
+ULONG PASS1_DECODE_DESTINATION_ADDRESS = 0x600000;
+ULONG CAPTURE_2ND_ADDRESS = 0x1800000;
+ULONG PASS1_2ND_ENCODE_SOURCE_ADDRESS = 0x1800000;
+ULONG PASS1_2ND_ENCODE_DESTINATION_ADDRESS = 0x2800000;
+ULONG PASS1_2ND_DECODE_SOURCE_ADDRESS = 0x1000000;
+ULONG PASS1_2ND_DECODE_DESTINATION_ADDRESS = 0x600000;
+ULONG PASS2_ENCODE_SOURCE_ADDRESS = 0x000000;
+ULONG PASS2_ENCODE_DESTINATION_ADDRESS = 0xC00000;
+ULONG PASS2_DECODE_SOURCE_ADDRESS = 0xC00000;
+ULONG PASS2_DECODE_DESTINATION_ADDRESS = 0x600000;
+ULNG PASS2_DECODE_REFERENCE_ADDRESS = 0x600000;
+*/
+
+typedef struct _CTL_REG_G {
+ ULONG CompressMode:1;
+ ULONG SkipEmptyFrame:1;
+ ULONG MemBurstLen:2;
+ ULONG LineBufEn:2;
+ ULONG Unused:26;
+} CTL_REG_G;
+
+
+typedef union _U_CTL_G {
+ ULONG Value;
+ CTL_REG_G CtlReg;
+} U_CTL_G;
+
+typedef struct _MODE_DETECTION_PARAM_REG {
+ ULONG Unused1:8;
+ ULONG EdgePixelThres:8;
+ ULONG VerStableMax:4;
+ ULONG HorStableMax:4;
+ ULONG VerDiffMax:4;
+ ULONG HorDiffMax:4;
+} MODE_DETECTION_PARAM_REG;
+
+typedef struct _CRC_PRI_PARAM_REG {
+ ULONG Enable:1;
+ ULONG HighBitOnly:1;
+ ULONG SkipCountMax:6;
+ ULONG PolyLow:8;
+ ULONG PolyHigh:16;
+} CRC_PRI_PARAM_REG;
+
+typedef union _U_CRC_PRI_PARAM {
+ ULONG Value;
+ CRC_PRI_PARAM_REG CRCPriParam;
+} U_CRC_PRI_PARAM;
+
+typedef struct _CRC_SEC_PARAM_REG {
+ ULONG Unused1:8;
+ ULONG PolyLow:8;
+ ULONG PolyHigh:16;
+} CRC_SEC_PARAM_REG;
+
+typedef union _U_CRC_SEC_PARAM {
+ ULONG Value;
+ CRC_SEC_PARAM_REG CRCSecParam;
+} U_CRC_SEC_PARAM;
+
+typedef struct _GENERAL_INFO {
+ BYTE EnableVideoM;
+ BYTE CenterMode;
+ BYTE RC4NoResetFrame;
+ BYTE RC4TestMode;
+ U_CTL_G uCtlReg;
+ U_CRC_PRI_PARAM uCRCPriParam;
+ U_CRC_SEC_PARAM uCRCSecParam;
+} GENERAL_INFO, *PGENERAL_INFO;
+
+typedef struct _SEQ_CTL_REG {
+ ULONG Unused1:1;
+ ULONG Unused2:1;
+ ULONG Unused3:1;
+ ULONG CaptureAutoMode:1;
+ ULONG Unused4:1;
+ ULONG CodecAutoMode:1;
+ ULONG Unused5:1;
+ ULONG WatchDog:1;
+ ULONG CRTSel:1;
+ ULONG AntiTearing:1;
+ ULONG DataType:2;
+ ULONG Unused6:20;
+} SEQ_CTL_REG;
+
+typedef union _U_SEQ_CTL {
+ ULONG Value;
+ SEQ_CTL_REG SeqCtlReg;
+} U_SEQ_CTL;
+
+typedef struct _CTL_REG {
+ ULONG SrcHsync:1;
+ ULONG SrcVsync:1;
+ ULONG ExtSrc:1;
+ ULONG AnalongExtSrc:1;
+ ULONG IntTimingGen:1;
+ ULONG IntDataFrom:1;
+ ULONG WriteFmt:2;
+ ULONG VGACursor:1;
+ ULONG LinearMode:1;
+ ULONG ClockDelay:2;
+ ULONG CCIR656Src:1;
+ ULONG PortClock:1;
+ ULONG ExtPort:1;
+ ULONG Unused1:1;
+ ULONG FrameRate:8;
+ ULONG Unused2:8;
+} CTL_REG;
+
+typedef union _U_CTL {
+ ULONG Value;
+ CTL_REG CtlReg;
+} U_CTL_REG;
+
+typedef struct _TIMING_GEN_SETTING_H {
+ ULONG HDEEnd:13;
+ ULONG Unused1:3;
+ ULONG HDEStart:13;
+ ULONG Unused2:3;
+} TIMING_GEN_SETTING_H;
+
+typedef struct _TIMING_GEN_SETTING_V {
+ ULONG VDEEnd:13;
+ ULONG Unused1:3;
+ ULONG VDEStart:13;
+ ULONG Unused2:3;
+} TIMING_GEN_SETTING_V;
+
+typedef struct _BCD_CTL_REG {
+ ULONG Enable:1;
+ ULONG Unused1:15;
+ ULONG Tolerance:8;
+ ULONG Unused2:8;
+} BCD_CTL_REG;
+
+typedef union _U_BCD_CTL {
+ ULONG Value;
+ BCD_CTL_REG BCDCtlReg;
+} U_BCD_CTL;
+
+typedef struct _COMPRESS_WINDOW_REG {
+ ULONG VerLine:13;
+ ULONG Unused1:3;
+ ULONG HorPixel:13;
+ ULONG Unused2:3;
+} COMPRESS_WINDOW_REG;
+
+typedef struct _STREAM_BUF_SIZE {
+ ULONG PacketSize:3;
+ ULONG RingBufNum:2;
+ ULONG Unused1:11;
+ ULONG SkipHighMBThres:7;
+ ULONG SkipTestMode:2;
+ ULONG Unused2:7;
+} STREAM_BUF_SIZE;
+
+typedef union _U_STREAM_BUF {
+ ULONG Value;
+ STREAM_BUF_SIZE StreamBufSize;
+} U_STREAM_BUF;
+
+
+typedef struct _COMPRESS_CTL_REG {
+ ULONG JPEGOnly:1; /* True: Jpeg Only mode(Disable VQ), False:Jpeg and VQ mix mode */
+ ULONG En4VQ:1; /* True: 1, 2, 4 color mode, False: 1,2 color mode */
+ ULONG CodecMode:1; /* High and best Quantization encoding/decoding setting*/
+ ULONG DualQuality:1;
+ ULONG EnBest:1;
+ ULONG EnRC4:1;
+ ULONG NorChromaDCTTable:5;
+ ULONG NorLumaDCTTable:5;
+ ULONG EnHigh:1;
+ ULONG TestCtl:2;
+ ULONG UVFmt:1;
+ ULONG HufTable:2;
+ ULONG AlterValue1:5;
+ ULONG AlterValue2:5;
+} COMPRESS_CTL_REG;
+
+typedef union _U_COMPRESS_CTL {
+ ULONG Value;
+ COMPRESS_CTL_REG CompressCtlReg;
+} U_COMPRESS_CTL;
+
+typedef struct _QUANTI_TABLE_LOW_REG {
+ ULONG ChromaTable:5;
+ ULONG LumaTable:5;
+ ULONG Unused1:22;
+} QUANTI_TABLE_LOW_REG;
+
+typedef union _U_CQUANTI_TABLE_LOW {
+ ULONG Value;
+ QUANTI_TABLE_LOW_REG QTableLowReg;
+} U_QUANTI_TABLE_LOW;
+
+typedef struct _QUANTI_VALUE_REG {
+ ULONG High:15;
+ ULONG Unused1:1;
+ ULONG Best:15;
+ ULONG Unused2:1;
+} QUANTI_VALUE_REG;
+
+typedef union _U_QUANTI_VALUE {
+ ULONG Value;
+ QUANTI_VALUE_REG QValueReg;
+} U_QUANTI_VALUE;
+
+typedef struct _BSD_PARAM_REG {
+ ULONG HighThres:8;
+ ULONG LowThres:8;
+ ULONG HighCount:6;
+ ULONG Unused1:2;
+ ULONG LowCount:6;
+ ULONG Unused2:2;
+} BSD_PARAM_REG;
+
+typedef union _U_BSD_PARAM {
+ ULONG Value;
+ BSD_PARAM_REG BSDParamReg;
+} U_BSD_PARAM;
+
+typedef struct _VIDEO_INFO {
+ BYTE ExtADCAct; /* read from modection register */
+ BYTE EnableRC4;
+ BYTE DownScalingMethod;
+ USHORT AnalogDifferentialThreshold; /* BCD tolerance */
+ USHORT DigitalDifferentialThreshold; /* BCD tolerance */
+ USHORT DstWidth;
+ USHORT DstHeight;
+ USHORT SrcWidth;
+ USHORT SrcHeight;
+ BYTE HighLumaTable; /* if High and best Jpeg codec enable, use HighLumaTable and HighChromaTable, otherwise HighDeQuantiValue and BestDequantiValue*/
+ BYTE HighChromaTable;
+ BYTE HighDeQuantiValue;
+ BYTE BestDequantiValue;
+ U_SEQ_CTL uSeqCtlReg;
+ U_CTL_REG uCtlReg;
+ U_BCD_CTL uBCDCtlReg;
+ U_STREAM_BUF uStreamBufSize;
+ U_COMPRESS_CTL uCompressCtlReg;
+ U_QUANTI_TABLE_LOW uQTableLowReg;
+ U_QUANTI_VALUE uQValueReg;
+ U_BSD_PARAM uBSDParamReg;
+} VIDEO_INFO, *PVIDEO_INFO ;
+
+typedef struct _VIDEOM_SEQ_CTL_REG {
+ ULONG Unused1:1; //Bit 0
+ ULONG Unused2:1; //Bit 1
+ ULONG Unused3:1; //Bit 2
+ ULONG StreamMode:1; //Bit 3
+ ULONG Unused4:1; //Bit 4
+ ULONG CodecAutoMode:1; //Bit 5
+ ULONG Unused6:1; //Bit 6
+ ULONG Unused7:1; //Bit 7
+ ULONG SrcSel:1; //Bit 8
+ ULONG Unused9:1; //Bit 9
+ ULONG DataType:2; //Bit[11:10]
+ ULONG Unused12:20;
+} VIDEOM_SEQ_CTL_REG;
+
+typedef union _U_VIDEOM_SEQ_CTL {
+ ULONG Value;
+ VIDEOM_SEQ_CTL_REG SeqCtlReg;
+} U_VIDEOM_SEQ_CTL;
+
+typedef struct _VIDEOM_INFO {
+ BYTE DownScalingMethod;
+ USHORT AnalogDifferentialThreshold; /* BCD tolerance */
+ USHORT DigitalDifferentialThreshold; /* BCD tolerance */
+ USHORT DstWidth;
+ USHORT DstHeight;
+ USHORT SrcWidth;
+ USHORT SrcHeight;
+ BYTE HighLumaTable; /* if High and best Jpeg codec enable, use HighLumaTable and HighChromaTable, otherwise HighDeQuantiValue and BestDequantiValue*/
+ BYTE HighChromaTable;
+ BYTE HighDeQuantiValue;
+ BYTE BestDequantiValue;
+ BYTE PacketSize; //the same as video1 & video2
+ BYTE RingBufNum;
+ BYTE EnableRC4;
+ U_VIDEOM_SEQ_CTL uSeqCtlReg;
+ U_BCD_CTL uBCDCtlReg;
+ U_COMPRESS_CTL uCompressCtlReg;
+ U_QUANTI_TABLE_LOW uQTableLowReg;
+ U_QUANTI_VALUE uQValueReg;
+ U_BSD_PARAM uBSDParamReg;
+} VIDEOM_INFO, *PVIDEOM_INFO ;
+
+typedef struct _VIDEO_MODE_INFO
+{
+ USHORT X;
+ USHORT Y;
+ USHORT ColorDepth;
+ USHORT RefreshRate;
+ BYTE ModeIndex;
+} VIDEO_MODE_INFO, *PVIDEO_MODE_INFO;
+
+#endif
+
diff --git a/board/aspeed/ast2300/vesa.h b/board/aspeed/ast2300/vesa.h
new file mode 100755
index 0000000..69aba90
--- /dev/null
+++ b/board/aspeed/ast2300/vesa.h
@@ -0,0 +1,163 @@
+/*
+ * 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
+ */
+#ifndef _VESA_H_
+#define _VESA_H_
+
+typedef enum
+{
+ VCLK25_175 = 0x00,
+ VCLK28_322 = 0x01,
+ VCLK31_5 = 0x02,
+ VCLK31_574 = 0x03,
+ VCLK32_76 = 0x04,
+ VCLK33_154 = 0x05,
+ VCLK36 = 0x06,
+ VCLK40 = 0x07,
+ VCLK45_978 = 0x08,
+ VCLK49_5 = 0x09,
+ VCLK50 = 0x0A,
+ VCLK52_95 = 0x0B,
+ VCLK56_25 = 0x0C,
+ VCLK65 = 0x0D,
+ VCLK74_48 = 0x0E,
+ VCLK75 = 0x0F,
+ VCLK78_75 = 0x10,
+ VCLK79_373 = 0x11,
+ VCLK81_624 = 0x12,
+ VCLK83_462 = 0x13,
+ VCLK84_715 = 0x14,
+ VCLK94_5 = 0x15,
+ VCLK106_5 = 0x16,
+ VCLK108 = 0x17,
+ VCLK119 = 0x18,
+ VCLK135 = 0x19,
+ VCLK136_358 = 0x1A,
+ VCLK146_25 = 0x1B,
+ VCLK154 = 0x1C,
+ VCLK157_5 = 0x1D,
+ VCLK162 = 0x1E
+} ePIXEL_CLOCK;
+
+typedef struct {
+ USHORT HorizontalTotal;
+ USHORT VerticalTotal;
+ USHORT HorizontalActive;
+ USHORT VerticalActive;
+ BYTE RefreshRate;
+ double HorizontalFrequency;
+ USHORT HSyncTime;
+ USHORT HBackPorch;
+ USHORT VSyncTime;
+ USHORT VBackPorch;
+ USHORT HLeftBorder;
+ USHORT HRightBorder;
+ USHORT VBottomBorder;
+ USHORT VTopBorder;
+ USHORT PixelClock;
+ BOOL HorPolarity;
+ BOOL VerPolarity;
+ BYTE ADCIndex1;
+ BYTE ADCIndex2;
+ BYTE ADCIndex3;
+ BYTE ADCIndex5;
+ BYTE ADCIndex6;
+ BYTE ADCIndex7;
+ BYTE ADCIndex8;
+ BYTE ADCIndex9;
+ BYTE ADCIndexA;
+ BYTE ADCIndexF;
+ BYTE ADCIndex15;
+ int HorizontalShift;
+ int VerticalShift;
+} VESA_MODE;
+
+#define HOR_POSITIVE 0
+#define HOR_NEGATIVE 1
+#define VER_POSITIVE 0
+#define VER_NEGATIVE 1
+
+#ifdef VESA_GLOBALS
+
+// Note: Modified for modes which have border issue
+VESA_MODE vModeTable[] = {
+////////////////////////// 60Hz mode
+// 720x480 done
+ {1056, 497, 720, 480, 60, 29.900, 88, 104, 3, 13, 0, 0, 0, 0, VCLK31_574, HOR_NEGATIVE, VER_NEGATIVE, 0x41, 0xF0, 0x48, 0x05, 0x20, 0x58, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+// 848x480 done
+ {1064, 517, 848, 480, 60, 31.160, 88, 91, 3, 26, 0, 0, 0, 0, VCLK33_154, HOR_NEGATIVE, VER_NEGATIVE, 0x42, 0x70, 0x48, 0x05, 0x20, 0x58, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+ {800, 525, 640, 480, 60, 31.469, 96, 40, 2, 25, 1, 1, 8, 8, VCLK25_175, HOR_NEGATIVE, VER_NEGATIVE, 0x31, 0xF0, 0x48, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+// 720x576
+ {912, 597, 720, 576, 60, 35.920, 72, 88, 3, 17, 0, 0, 0, 0, VCLK32_76, HOR_NEGATIVE, VER_NEGATIVE, 0x38, 0xF0, 0x48, 0x05, 0x20, 0x48, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+// 960x600 GTF done
+ {1232, 622, 960, 600, 60, 37.320, 96, 136, 3, 18, 0, 0, 0, 0, VCLK45_978, HOR_NEGATIVE, VER_NEGATIVE, 0x4C, 0xF0, 0x60, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1056, 628, 800, 600, 60, 37.879, 128, 88, 4, 23, 0, 0, 0, 0, VCLK40, HOR_POSITIVE, VER_POSITIVE, 0x41, 0xF0, 0x60, 0x05, 0x20, 0x80, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1088x612 GTF done
+ {1392, 634, 1088, 612, 60, 38.04, 112, 152, 3, 18, 0, 0, 0, 0, VCLK52_95, HOR_NEGATIVE, VER_NEGATIVE, 0x56, 0xF0, 0x60, 0x05, 0x20, 0x70, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1280x720 GTF done
+ {1664, 746, 1280, 720, 60, 44.760, 136, 192, 3, 22, 0, 0, 0, 0, VCLK74_48, HOR_NEGATIVE, VER_NEGATIVE, 0x67, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1360x768 GTF done
+ {1776, 795, 1360, 768, 60, 47.700, 144, 208, 3, 23, 0, 0, 0, 0, VCLK84_715, HOR_NEGATIVE, VER_NEGATIVE, 0x6E, 0xF0, 0xA8, 0x05, 0x20, 0x90, 0x60, 0x60, 0x60, 0x5E, 0xFE, 7, 1},
+// 1280x768 done
+ {1664, 798, 1280, 768, 60, 47.700, 128, 184, 7, 20, 0, 0, 0, 0, VCLK79_373, HOR_NEGATIVE, VER_NEGATIVE, 0x67, 0xF0, 0xA8, 0x05, 0x20, 0x80, 0x60, 0x60, 0x60, 0x5E, 0xFE, 7, 1},
+ {1344, 806, 1024, 768, 60, 48.363, 136, 160, 6, 29, 0, 0, 0, 0, VCLK65, HOR_NEGATIVE, VER_NEGATIVE, 0x53, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 7},
+// 1280x800 GTF done
+ {1680, 828, 1280, 800, 60, 49.680, 136, 200, 3, 24, 0, 0, 0, 0, VCLK83_462, HOR_NEGATIVE, VER_NEGATIVE, 0x68, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1152x864 GTF done
+ {1520, 895, 1152, 864, 60, 53.700, 120, 184, 3, 27, 0, 0, 0, 0, VCLK81_624, HOR_NEGATIVE, VER_NEGATIVE, 0x5E, 0xF0, 0xA8, 0x05, 0x20, 0x78, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1600x900 GTF done
+ {2128, 932, 1600, 900, 60, 55.920, 168, 264, 3, 28, 0, 0, 0, 0, VCLK119, HOR_NEGATIVE, VER_NEGATIVE, 0x84, 0xF0, 0xA8, 0x05, 0x20, 0xA8, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1440X900 CVT done
+ {1904, 933, 1440, 900, 60, 55.935, 152, 232, 6, 25, 0, 0, 0, 0, VCLK106_5, HOR_NEGATIVE, VER_POSITIVE, 0x76, 0xF0, 0xA8, 0x05, 0x20, 0x96, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1800, 1000, 1280, 960, 60, 60.000, 112, 312, 3, 36, 0, 0, 0, 0, VCLK108, HOR_POSITIVE, VER_POSITIVE, 0x70, 0x70, 0xA8, 0x05, 0x20, 0x70, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1600x1024 GTF done
+ {2144, 1060, 1600, 1024, 60, 63.600, 168, 272, 3, 32, 0, 0, 0, 0, VCLK136_358, HOR_NEGATIVE, VER_NEGATIVE, 0x85, 0xF0, 0xE8, 0x05, 0x20, 0xA8, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1688, 1066, 1280, 1024, 60, 63.981, 112, 248, 3, 38, 0, 0, 0, 0, VCLK108, HOR_POSITIVE, VER_POSITIVE, 0x69, 0x70, 0xA8, 0x05, 0x20, 0x70, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1680X1050 CVT done Reduced Blanking
+ {1840, 1080, 1680, 1050, 60, 64.674, 32, 80, 6, 21, 0, 0, 0, 0, VCLK119, HOR_POSITIVE, VER_NEGATIVE, 0x72, 0xF0, 0xA8, 0x05, 0x20, 0x20, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1920X1200 CVT done Reduced Blanking
+ {2080, 1235, 1920, 1200, 60, 74.038, 32, 80, 6, 26, 0, 0, 0, 0, VCLK154, HOR_POSITIVE, VER_NEGATIVE, 0x81, 0xF0, 0xA8, 0x05, 0x20, 0x20, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ //{2160, 1250, 1600, 1200, 60,75.000, 192, 304, 3, 46, 0, 0, 0, 0, VCLK162, HOR_POSITIVE, VER_POSITIVE},
+ {2160, 1248, 1600, 1200, 60, 75.000, 192, 304, 3, 46, 0, 0, 0, 0, VCLK162, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xE8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+
+////////////////////// Not 60Hz mode
+ {900, 449, 720, 400, 70, 31.469, 108, 45, 2, 25, 1, 1, 8, 8, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x38, 0x30, 0x48, 0x05, 0x20, 0x6C, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 1},
+ {832, 520, 640, 480, 72, 37.861, 40, 120, 3, 20, 1, 1, 8, 8, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x33, 0xF0, 0x48, 0x05, 0x20, 0x28, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 3},
+ {840, 500, 640, 480, 75, 37.500, 64, 120, 3, 16, 0, 0, 0, 0, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x34, 0x70, 0x48, 0x05, 0x20, 0x40, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 3},
+ {832, 509, 640, 480, 85, 43.269, 56, 80, 3, 25, 0, 0, 0, 0, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x33, 0xF0, 0x48, 0x05, 0x20, 0x38, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 3},
+ {1024, 625, 800, 600, 56, 35.156, 72, 128, 2, 22, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x3F, 0xF0, 0x60, 0x05, 0x20, 0x48, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1040, 666, 800, 600, 72, 48.077, 120, 64, 6, 23, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x40, 0xF0, 0x60, 0x05, 0x20, 0x78, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1056, 625, 800, 600, 75, 46.875, 80, 160, 3, 21, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x41, 0xF0, 0x60, 0x05, 0x20, 0x50, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1048, 631, 800, 600, 85, 53.674, 64, 152, 3, 27, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x41, 0x70, 0x60, 0x05, 0x20, 0x40, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1328, 806, 1024, 768, 70, 56.476, 136, 144, 6, 29, 0, 0, 0, 0, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x52, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 7},
+ {1312, 800, 1024, 768, 75, 60.023, 96, 176, 3, 28, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x51, 0xF0, 0xA8, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 1},
+ {1376, 808, 1024, 768, 85, 68.677, 96, 208, 3, 36, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x55, 0xF0, 0xA8, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 1},
+ {1600, 900, 1152, 864, 75, 67.500, 128, 256, 3, 32, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x63, 0xF0, 0xA8, 0x05, 0x20, 0x80, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1728, 1011, 1280, 960, 85, 85.938, 160, 224, 3, 47, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x6B, 0xF0, 0xA8, 0x05, 0x20, 0xA0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1688, 1066, 1280, 1024, 75, 79.976, 144, 248, 3, 38, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x69, 0x70, 0xE8, 0x05, 0x20, 0x90, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1728, 1072, 1280, 1024, 85, 91.146, 160, 224, 3, 44, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x6B, 0xF0, 0xA8, 0x05, 0x20, 0xA0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 65, 81.250, 192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 70, 87.500, 192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 75, 93.750, 192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 85, 106.250,192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0}
+};
+
+USHORT ModeNumberCount = sizeof (vModeTable) / sizeof (VESA_MODE);
+USHORT Mode60HZCount = 21;
+
+#else /* NOT VESA_GLOBALS */
+extern VESA_MODE vModeTable[];
+extern USHORT ModeNumberCount;
+extern USHORT Mode60HZCount;
+#endif
+
+#endif /* _VESA_H_ */
+
+
diff --git a/board/aspeed/ast2300/vfun.c b/board/aspeed/ast2300/vfun.c
new file mode 100755
index 0000000..f707e80
--- /dev/null
+++ b/board/aspeed/ast2300/vfun.c
@@ -0,0 +1,545 @@
+/*
+ * 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
+ */
+#define BUF_GLOBALS
+#include "type.h"
+#include "vdef.h"
+#include "vreg.h"
+#include "crt.h"
+#include "vfun.h"
+
+ULONG UnlockSCURegHost(ULONG MMIOBase, ULONG Key)
+{
+ WriteMemoryLongHost(SCU_BASE, SCU_PROTECT_REG, Key);
+ return ReadMemoryLongHost(SCU_BASE,SCU_PROTECT_REG);
+}
+
+void ResetVideoHost(void)
+{
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, VIDEO_RESET_EN << VIDEO_ENGINE_RESET_BIT, VIDEO_ENGINE_RESET_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, VIDEO_RESET_OFF << VIDEO_ENGINE_RESET_BIT, VIDEO_ENGINE_RESET_MASK);
+}
+
+void StartModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, MODE_DETECTION_TRIGGER);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, MODE_DETECTION_TRIGGER, MODE_DETECTION_TRIGGER);
+}
+
+BOOL ReadVideoInterruptHost(ULONG MMIOBase, ULONG value)
+{
+ return ((ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_READ_REG) & value) ? TRUE : FALSE);
+}
+
+ULONG UnlockVideoRegHost(ULONG MMIOBase, ULONG Key)
+{
+ WriteMemoryLongHost(VIDEO_REG_BASE, KEY_CONTROL_REG, Key);
+ return ReadMemoryLongHost(VIDEO_REG_BASE,KEY_CONTROL_REG);
+}
+
+void StartVideoCaptureTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, VIDEO_CAPTURE_TRIGGER);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, VIDEO_CAPTURE_TRIGGER, VIDEO_CAPTURE_TRIGGER);
+}
+
+void StartVideoCodecTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, VIDEO_CODEC_TRIGGER);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, VIDEO_CODEC_TRIGGER, VIDEO_CODEC_TRIGGER);
+}
+
+void StopModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, MODE_DETECTION_TRIGGER);
+}
+
+void ClearVideoInterruptHost(ULONG MMIOBase, ULONG value)
+{
+ //WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_CLEAR_REG, value, value);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_CLEAR_REG, value);
+}
+
+/* UnLock SCU Host and Reset Engine */
+BOOL CheckOnStartHost(void)
+{
+ int i=0, dwValue=0;
+
+ do
+ {
+ dwValue = UnlockSCURegHost(0, SCU_UNLOCK_KEY);
+ i++;
+ }
+ while ((SCU_WRITE_ENABLE != dwValue) && (i<10));
+
+ //Clear SCU Reset Register
+ WriteMemoryLongHost(SCU_BASE, SCU_CONTROL_REG, 0);
+
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, (EN_ECLK | EN_V1CLK | EN_V2CLK), (STOP_ECLK_MASK | STOP_V1CLK_MASK | STOP_V2CLK_MASK));
+
+#if defined(CONFIG_AST2300)
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x90 + SCU_OFFSET), 0x00000020, 0x00000030); //enable 24bits
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x88 + SCU_OFFSET), 0x000fff00, 0x000fff00); //enable video multi-pins
+#else //AST2100
+ //WriteMemoryLongWithMASKHost(SCU_BASE, SCU_PIN_CTRL1_REG, (VIDEO_PORTA_EN | VIDEO_PORTB_EN | VIDEO_VP1_EN | VIDEO_VP2_EN) ,
+ // (VIDEO_PORTA_MASK | VIDEO_PORTB_MASK | VIDEO_VP1_MASK | VIDEO_VP2_MASK));
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_PIN_CTRL2_REG, (VIDEO_PORTA_SINGLE_EDGE | VIDEO_PORTB_SINGLE_EDGE) ,
+ (VIDEO_PORTA_SINGLE_EDGE_MASK | VIDEO_PORTB_SINGLE_EDGE_MASK));
+#endif
+
+ ResetVideoHost();
+
+ return TRUE;
+}
+
+BOOL CheckOnStartClient(void)
+{
+ int i=0, dwValue=0;
+
+ do
+ {
+ dwValue = UnlockSCURegHost(0, SCU_UNLOCK_KEY);
+ i++;
+ }
+ while ((SCU_WRITE_ENABLE != dwValue) && (i<10));
+
+ //Clear SCU Reset Register
+ WriteMemoryLongClient(SCU_BASE, SCU_CONTROL_REG, 0);
+
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_STOP_REG, (EN_ECLK | EN_V1CLK | EN_D1CLK | EN_D2CLK | EN_V2CLK),
+ (STOP_ECLK_MASK | STOP_D1CLK_MASK | STOP_D2CLK_MASK | STOP_V1CLK_MASK | STOP_V2CLK_MASK));
+
+ //WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_SELECTION_REG, PORTB_FROM_D2CLK | PORTB_CLOCK_INV_DELAY_3NS | PORTA_CLOCK_INV_DELAY_3NS, PORTB_CLOCK_SEL | PORTB_CLOCK_DELAY_MASK | PORTA_CLOCK_DELAY_MASK);
+ //A1EVA
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_SELECTION_REG, (PORTB_FROM_D2CLK | PORTB_CLOCK_INV_DELAY_1NS | PORTA_CLOCK_INV_DELAY_1NS), (PORTB_CLOCK_SEL | PORTB_CLOCK_DELAY_MASK | PORTA_CLOCK_DELAY_MASK));
+ WriteMemoryLongWithMASKClient(SCU_BASE, 0x202C, (0x03<<9), (0x03<<9));
+
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL1_REG, (VIDEO_PORTA_EN | VIDEO_PORTB_EN | VIDEO_VP1_EN | VIDEO_VP2_EN),
+ (VIDEO_PORTA_MASK | VIDEO_PORTB_MASK | VIDEO_VP1_MASK | VIDEO_VP2_MASK));
+
+#if CONFIG_AST3000
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL2_REG, (VIDEO_PORTA_DUAL_EDGE | VIDEO_PORTB_DUAL_EDGE),
+ (VIDEO_PORTA_SINGLE_EDGE_MASK | VIDEO_PORTB_SINGLE_EDGE_MASK));
+#else
+ //2100 is single edge
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL2_REG, (VIDEO_PORTA_SINGLE_EDGE | VIDEO_PORTB_SINGLE_EDGE),
+ (VIDEO_PORTA_SINGLE_EDGE_MASK | VIDEO_PORTB_SINGLE_EDGE_MASK));
+#endif
+
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_STOP_REG, (EN_D1CLK | EN_D2CLK), (STOP_D1CLK_MASK | STOP_D2CLK_MASK));
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL1_REG, VGA_PIN_OFF, VGA_PIN_MASK);
+
+ //ResetVideoHost();
+
+ return TRUE;
+}
+
+ULONG InitializeVideoEngineHost (ULONG MMIOBase,
+ int nVideo,
+ BOOL HorPolarity,
+ BOOL VerPolarity)
+{
+ //ULONG temp, temp1, temp2;
+ ULONG dwRegOffset = nVideo * 0x100;
+ ULONG dwValue;
+ int i;
+
+
+ /* General Video Control */
+ //LineBufEn 0
+ //dwValue = (COMPRESS_MODE << CODEC_DECOMPRESS_MODE_BIT) | DELAY_VSYNC_EN;
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CONTROL_REG, dwValue);
+ //Video Data Truncation Register
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x328, 0);
+
+ //D2CLK clock must config according to video's line buffer
+ if (VIDEO1 == nVideo)
+ dwValue = LINE_BUFFER_VIDEO1;
+ else
+ dwValue = LINE_BUFFER_VIDEO2;
+
+ //D2CLK clock must config according to video's line buffer
+ switch (dwValue)
+ {
+ case LINE_BUFFER_OFF:
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_SELECTION_REG, NORMAL_CRT1, D2CLK_CLOCK_SELECTION_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, STOP_D2CLK, STOP_D2CLK_MASK);
+ break;
+ case LINE_BUFFER_VIDEO1:
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_SELECTION_REG, V1CLK_VIDEO1 << D2CLK_CLOCK_SELECTION_BIT, D2CLK_CLOCK_SELECTION_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_D2CLK, STOP_D2CLK_MASK);
+ break;
+ case LINE_BUFFER_VIDEO2:
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_SELECTION_REG, V1CLK_VIDEO2 << D2CLK_CLOCK_SELECTION_BIT, D2CLK_CLOCK_SELECTION_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_D2CLK, STOP_D2CLK_MASK);
+ break;
+ case LINE_BUFFER_VIDEOM:
+ //If select this option, it will config at videoM INIT
+ break;
+ default:
+ break;
+ }
+
+ dwValue = 0;
+ //VR30 now is capture window in the compression
+ dwValue = g_DefHeight << CAPTURE_VER_LINE_BIT |
+ g_DefWidth << CAPTURE_HOR_PIXEL_BIT;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CAPTURE_WINDOWS_REG + dwRegOffset, dwValue);
+
+ dwValue = 0;
+ //VR34 now is destionation window in the compression
+ dwValue = g_DefHeight << COMPRESS_VER_LINE_BIT |
+ g_DefWidth << COMPRESS_HOR_PIXEL_BIT;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_WINDOWS_REG + dwRegOffset, dwValue);
+
+ //BitCOUNT according compress data format
+ dwValue = YUV444_MODE;
+ if (YUV444_MODE == dwValue)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV444, BUF_LINE_OFFSET_MASK);
+ else
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV420, BUF_LINE_OFFSET_MASK);
+
+ // CRC
+ //Disable
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_PRIMARY_REG, 0x0);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_SECOND_REG, 0x0);
+
+ /* Sequence Control register */
+ //Oonly Encoder need to set
+ /* Engine Sequence Contol Register */
+ dwValue = (WATCH_DOG_EN << WATCH_DOG_ENABLE_BIT) |
+ VIDEO_CAPTURE_AUTO_MODE |
+ VIDEO_CODEC_AUTO_MODE;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Control register */
+ dwValue = (HOR_NEGATIVE == HorPolarity) ? NO_INVERSE_POL : INVERSE_POL;
+ dwValue = (((VER_NEGATIVE == VerPolarity) ? NO_INVERSE_POL : INVERSE_POL) << VIDEO_VSYNC_POLARITY_BIT) | dwValue;
+
+ /* HW Recommand*/
+ //dwValue = (TILE_MODE << 9) | dwValue;
+ dwValue = (EXTERNAL_VGA_SOURCE << EXTERNAL_SOURCE_BIT) | dwValue;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* BCD register */
+ //NO BCD
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BCD_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Stream Buffer Size register */
+ dwValue = (YUV_TEST << SKIP_TEST_MODE_BIT) |
+ (PACKET_SIZE_32KB << STREAM_PACKET_SIZE_BIT) |
+ (PACKETS_8 << RING_BUF_PACKET_NUM_BIT);
+ /* the same with Video1, Video2, and VideoM*/
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_STREAM_BUF_SIZE, dwValue);
+
+ /* Comression control register */
+ dwValue = (USE_UV_CIR656 << UV_CIR656_FORMAT_BIT)|
+ (JPEG_MIX_MODE << JPEG_ONLY_BIT)|
+ (VQ_4_COLOR_MODE << VQ_4_COLOR_BIT)|
+ (QUANTI_CODEC_MODE << QUALITY_CODEC_SETTING_BIT)|
+ (7 << NORMAL_QUANTI_CHROMI_TABLE_BIT) |
+ (23 << NORMAL_QUANTI_LUMI_TABLE_BIT);
+
+ //Video2 have same value as video1
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_CONTROL_REG, dwValue);
+
+ /* JPEG Quantization Table register */
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_TABLE_LOW_REG, dwValue);
+
+ /* Quantization value register */
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_VALUE_REG, dwValue);
+
+ //Video BSD Parameter Register
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BSD_PARA_REG, dwValue);
+
+ //no scale
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_REG, 0x10001000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER0_REG, 0x00200000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER1_REG, 0x00200000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER2_REG, 0x00200000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER3_REG, 0x00200000);
+ return TRUE;
+}
+
+ULONG InitializeVideoEngineClient (ULONG MMIOBase,
+ int nVideo)
+{
+ //ULONG temp, temp1, temp2;
+ ULONG dwRegOffset = nVideo * 0x100;
+ ULONG dwValue;
+ int i;
+
+
+ /* General Video Control */
+ //LineBufEn 0
+ dwValue = (DECOMPRESS_MODE << CODEC_DECOMPRESS_MODE_BIT);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CONTROL_REG, dwValue);
+ //Video Data Truncation Register
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x328, 0);
+
+ //VR30 now is capture window in the compression
+ dwValue = g_DefHeight << CAPTURE_VER_LINE_BIT |
+ g_DefWidth << CAPTURE_HOR_PIXEL_BIT;
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CAPTURE_WINDOWS_REG + dwRegOffset, dwValue, CAPTURE_VER_LINE_MASK | CAPTURE_HOR_PIXEL_MASK);
+
+ //VR34 now is destionation window in the compression
+ dwValue = g_DefHeight << COMPRESS_VER_LINE_BIT |
+ g_DefWidth << COMPRESS_HOR_PIXEL_BIT;
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_WINDOWS_REG + dwRegOffset, dwValue, COMPRESS_VER_LINE_MASK | COMPRESS_HOR_PIXEL_MASK);
+
+ //BitCOUNT according compress data format
+ dwValue = YUV444_MODE;
+ if (YUV444_MODE == dwValue)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV444, BUF_LINE_OFFSET_MASK);
+ else
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV420, BUF_LINE_OFFSET_MASK);
+
+ // CRC
+ //Disable
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_PRIMARY_REG, 0x0);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_SECOND_REG, 0x0);
+
+ /* Sequence Control register */
+ //Oonly Encoder need to set
+ /* Engine Sequence Contol Register */
+ dwValue = VIDEO_CAPTURE_AUTO_MODE |
+ VIDEO_CODEC_AUTO_MODE;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Control register */
+ /* HW Recommand*/
+ dwValue = (TILE_MODE << 9);
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* BCD register */
+ //NO BCD
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BCD_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Stream Buffer Size register */
+ dwValue = (YUV_TEST << SKIP_TEST_MODE_BIT) |
+ (PACKET_SIZE_32KB << STREAM_PACKET_SIZE_BIT) |
+ (PACKETS_8 << RING_BUF_PACKET_NUM_BIT);
+ /* the same with Video1, Video2, and VideoM*/
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_STREAM_BUF_SIZE, dwValue);
+
+
+ /* Comression control register */
+ dwValue = (USE_UV_CIR656 << UV_CIR656_FORMAT_BIT)|
+ (JPEG_MIX_MODE << JPEG_ONLY_BIT)|
+ (VQ_4_COLOR_MODE << VQ_4_COLOR_BIT)|
+ (QUANTI_CODEC_MODE << QUALITY_CODEC_SETTING_BIT)|
+ (7 << NORMAL_QUANTI_CHROMI_TABLE_BIT) |
+ (23 << NORMAL_QUANTI_LUMI_TABLE_BIT);
+
+ //Video2 have same value as video1
+ if (VIDEO1 == nVideo)
+ {
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_CONTROL_REG, dwValue);
+ }
+ else
+ {
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEOM_COMPRESS_CONTROL_REG, dwValue);
+ }
+
+ /* JPEG Quantization Table register */
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_TABLE_LOW_REG, dwValue);
+
+ /* Quantization value register */
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_VALUE_REG, dwValue);
+
+ //Video BSD Parameter Register
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BSD_PARA_REG, dwValue);
+
+ return TRUE;
+}
+
+BYTE GetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex)
+{
+ BYTE Data;
+ ULONG Status;
+
+// Reset
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 0);
+// Set AC Timing and Speed
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x04, AC_TIMING);
+// Lower Speed
+// WriteMemoryLongWithANDData (VideoEngineInfo->VGAPCIInfo.ulMMIOBaseAddress, I2C_BASE + DeviceSelect * 0x40 + 0x04, 0, 0x33317805);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x08, 0);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Enable Master Mode
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 1);
+// Enable Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0xAF);
+// BYTE I2C Mode
+// Start and Send Device Address
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x3);
+// Wait TX ACK
+ do {
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ } while (Status != 1);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Send Device Register Index
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, RegisterIndex);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x2);
+// Wait Tx ACK
+ do {
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ } while (Status != 1);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Start, Send Device Address + 1(Read Mode), Receive Data
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress + 1);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x1B);
+// Wait Rx Done
+ do {
+ Status = (ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x04) >> 2;
+ } while (Status != 1);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+
+// Enable STOP Interrupt
+ WriteMemoryLongWithMASKClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0x10, 0x10);
+// Issue STOP Command
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x20);
+// Wait STOP
+ do {
+ Status = (ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x10) >> 4;
+ } while (Status != 1);
+// Disable STOP Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0x10);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Read Received Data
+ Data = (BYTE)((ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20) & 0xFF00) >> 8);
+
+ return Data;
+}
+
+ULONG SetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex,
+ BYTE RegisterValue)
+{
+ ULONG Status;
+ ULONG Count = 0;
+
+// Reset
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 0);
+// Set Speed
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x04, AC_TIMING);
+// Lower Speed
+// WriteMemoryLongWithANDData (VideoEngineInfo->VGAPCIInfo.ulMMIOBaseAddress, I2C_BASE + DeviceSelect * 0x40 + 0x04, 0, 0x33317805);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x08, 0);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Enable Master Mode
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 1);
+// Enable Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0xAF);
+// BYTE I2C Mode
+// Start and Send Device Address
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x3);
+// Wait Tx ACK
+ do {
+ Count++;
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+
+ if (2 == Status)
+ {
+ //Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+ //Re-Send Start and Send Device Address while NACK return
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x3);
+ }
+ //else
+ {
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ }
+ } while (Status != 1);
+ Count = 0;
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Send Device Register Index
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, RegisterIndex);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x2);
+// Wait Tx ACK
+ do {
+ Count++;
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ } while (Status != 1);
+ Count = 0;
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Send Device Register Value and Stop
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, RegisterValue);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x2);
+// Wait Tx ACK
+ do {
+ Count++;
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ } while (Status != 1);
+ Count = 0;
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Enable STOP Interrupt
+ WriteMemoryLongWithMASKClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0x10, 0x10);
+// Issue STOP Command
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x20);
+// Wait STOP
+ do {
+ Count++;
+ Status = (ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x10) >> 4;
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ } while (Status != 1);
+// Disable STOP Interrupt
+ WriteMemoryLongWithMASKClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0, 0x10);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+
+ return SET_I2C_DONE;
+}
diff --git a/board/aspeed/ast2300/vfun.h b/board/aspeed/ast2300/vfun.h
new file mode 100755
index 0000000..90f9ec4
--- /dev/null
+++ b/board/aspeed/ast2300/vfun.h
@@ -0,0 +1,79 @@
+/*
+ * 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
+ */
+#ifndef _VFUN_H_
+#define _VFUN_H_
+
+//#define vBufAlign(x) ((x + 0x0000007F) & 0xFFFFFF80) //128 byte alignment
+#define vBufAlign(x) ((x + 0x000003FF) & 0xFFFFFC00) //128 byte alignment
+#define vBufAlign2(x) ((x + 0x0000FFFF) & 0xFFFF0000) //128 byte alignment
+#define v16byteAlign(x) ((x + 0x0000000F) & 0xFFFFFFF0)
+#define vBuf_ALIGNMENT 128
+
+#define HOST_TOTAL_SIZE 0x8000000 /* 128M */
+#define STATION_TOTAL_SIZE 0xF800000 /* 120M */
+
+#define VIDEO_SOURCE_SIZE 0x200000 /* 800X600X4 = 0x1D4C00 */
+#define VIDEO_MAX_STREAM_SIZE 0x400000 /* 32X128K = 0x400000 */
+#define VIDEO_FLAG_SIZE 0x5000 /* 1920X1200/128 = 0x4650*/
+#define VIDEO_CRC_SIZE 0x50000 /* 1920/64X1200X8 = 0x46500*/
+
+#define VIDEO1_EN_TOTAL_SIZE (VIDEO_SOURCE_SIZE*2+VIDEO_MAX_STREAM_SIZE+VIDEO_FLAG_SIZE+VIDEO_CRC_SIZE) /* 0x1655000 = about 23M*/
+#define VIDEO2_EN_TOTAL_SIZE VIDEO1_EN_TOTAL_SIZE
+//#define VIDEOM_EN_TOTAL_SIZE (VIDEO_SOURCE_SIZE*2+VIDEO_MAX_STREAM_SIZE+VIDEO_FLAG_SIZE) /* 0x1605000 = about 22.7M */
+//#define VIDEO_HOST_SIZE (VIDEO1_EN_TOTAL_SIZE + VIDEO2_EN_TOTAL_SIZE + VIDEOM_EN_TOTAL_SIZE) /* 0x69922816 = about 70M */
+#define VIDEO_HOST_SIZE (VIDEO1_EN_TOTAL_SIZE + VIDEO2_EN_TOTAL_SIZE) /* NOT NEED VIDEOM */
+
+#define VIDEO1_EN_BASE 0x100000
+#define VIDEO2_EN_BASE (VIDEO1_EN_BASE + VIDEO1_EN_TOTAL_SIZE)
+#define VIDEOM_EN_BASE (VIDEO2_EN_BASE + VIDEO2_EN_TOTAL_SIZE)
+
+#define VIDEO1_DE_TOTAL_SIZE (VIDEO_MAX_STREAM_SIZE + VIDEO_SOURCE_SIZE) /* 0xD00000 = 13M*/
+#define VIDEO2_DE_TOTAL_SIZE (VIDEO1_DE_TOTAL_SIZE)
+#define VIDEO_STATION_SIZE (VIDEO1_DE_TOTAL_SIZE + VIDEO2_DE_TOTAL_SIZE) /* 26M */
+
+#define VIDEO1_DE_BASE VIDEO_HOST_SIZE
+#define VIDEO2_DE_BASE (VIDEO1_DE_BASE + VIDEO1_DE_TOTAL_SIZE)
+#define VIDEO_ALL_SIZE (VIDEO_HOST_SIZE + VIDEO_STATION_SIZE) //Host and Station
+
+#define OutdwmBankModeHost(offset,data) WriteMemoryLongHost(DRAM_BASE,offset,data)
+#define IndwmBankModeHost(offset) ReadMemoryLongHost(DRAM_BASE,offset)
+
+ULONG UnlockVideoRegHost(ULONG MMIOBase, ULONG Key);
+BOOL CheckOnStartHost(void);
+BOOL CheckOnStartClient(void);
+void StartVideoCaptureTriggerHost(ULONG MMIOBase, ULONG offset);
+void StartVideoCaptureTriggerHost(ULONG MMIOBase, ULONG offset);
+void StartVideoCodecTriggerHost(ULONG MMIOBase, ULONG offset);
+ULONG UnlockSCURegHost(ULONG MMIOBase, ULONG Key);
+ULONG UnlockSCURegHost(ULONG MMIOBase, ULONG Key);
+void StartModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset);
+void ClearVideoInterruptHost(ULONG MMIOBase, ULONG value);
+BOOL ReadVideoInterruptHost(ULONG MMIOBase, ULONG value);
+void StopModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset);
+void ResetVideoHost(void);
+ULONG InitializeVideoEngineHost (ULONG MMIOBase,
+ int nVideo,
+ BOOL HorPolarity,
+ BOOL VerPolarity);
+ULONG InitializeVideoEngineClient (ULONG MMIOBase,
+ int nVideo);
+BYTE GetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex);
+
+ULONG SetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex,
+ BYTE RegisterValue);
+#endif //_VFUN_H_
+
diff --git a/board/aspeed/ast2300/vgahw.h b/board/aspeed/ast2300/vgahw.h
new file mode 100755
index 0000000..7cbba0d
--- /dev/null
+++ b/board/aspeed/ast2300/vgahw.h
@@ -0,0 +1,175 @@
+/*
+ * 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
+ */
+/******************************************************************************
+ * Mode Stuff
+ ******************************************************************************/
+/* Default Settings */
+#define CRT_LOW_THRESHOLD_VALUE 0x12
+#define CRT_HIGH_THRESHOLD_VALUE 0x1E
+
+/* Output Selection */
+#define CRT1 0x00
+#define CRT2 0x01
+#define DVI1 0x10
+#define DVI2 0x11
+#define LVDS1 0x20
+#define LVDS2 0x21
+
+/* Mode Limitation */
+#define MAX_HResolution 1600
+#define MAX_VResolution 1200
+
+/* Std. Table Index Definition */
+#define TextModeIndex 0
+#define EGAModeIndex 1
+#define VGAModeIndex 2
+#define HiCModeIndex 3
+#define TrueCModeIndex 4
+
+/* DCLK Index */
+#define VCLK25_175 0x00
+#define VCLK28_322 0x01
+#define VCLK31_5 0x02
+#define VCLK36 0x03
+#define VCLK40 0x04
+#define VCLK49_5 0x05
+#define VCLK50 0x06
+#define VCLK56_25 0x07
+#define VCLK65 0x08
+#define VCLK75 0x09
+#define VCLK78_75 0x0A
+#define VCLK94_5 0x0B
+#define VCLK108 0x0C
+#define VCLK135 0x0D
+#define VCLK157_5 0x0E
+#define VCLK162 0x0F
+#define VCLK119 0x10
+
+/* Flags Definition */
+#define Charx8Dot 0x00000001
+#define HalfDCLK 0x00000002
+#define DoubleScanMode 0x00000004
+#define LineCompareOff 0x00000008
+#define SyncPP 0x00000000
+#define SyncPN 0x00000040
+#define SyncNP 0x00000080
+#define SyncNN 0x000000C0
+#define HBorder 0x00000020
+#define VBorder 0x00000010
+#define COLORINDEX 0x00000000
+#define MONOINDEX 0x00000100
+
+/* DAC Definition */
+#define DAC_NUM_TEXT 64
+#define DAC_NUM_EGA 64
+#define DAC_NUM_VGA 256
+
+/* AST3000 Reg. Definition */
+#define AST3000_VGAREG_BASE 0x1e6e6000
+#define AST3000_VGA1_CTLREG 0x00
+#define AST3000_VGA1_CTLREG2 0x04
+#define AST3000_VGA1_STATUSREG 0x08
+#define AST3000_VGA1_PLL 0x0C
+#define AST3000_VGA1_HTREG 0x10
+#define AST3000_VGA1_HRREG 0x14
+#define AST3000_VGA1_VTREG 0x18
+#define AST3000_VGA1_VRREG 0x1C
+#define AST3000_VGA1_STARTADDR 0x20
+#define AST3000_VGA1_OFFSETREG 0x24
+#define AST3000_VGA1_THRESHOLD 0x28
+#define AST3000_HWC1_OFFSET 0x30
+#define AST3000_HWC1_XY 0x34
+#define AST3000_HWC1_PBase 0x38
+#define AST3000_OSD1_H 0x40
+#define AST3000_OSD1_V 0x44
+#define AST3000_OSD1_PBase 0x48
+#define AST3000_OSD1_Offset 0x4C
+#define AST3000_OSD1_THRESHOLD 0x50
+
+#define AST3000_VGA2_CTLREG 0x60
+#define AST3000_VGA2_CTLREG2 0x64
+#define AST3000_VGA2_STATUSREG 0x68
+#define AST3000_VGA2_PLL 0x6C
+#define AST3000_VGA2_HTREG 0x70
+#define AST3000_VGA2_HRREG 0x74
+#define AST3000_VGA2_VTREG 0x78
+#define AST3000_VGA2_VRREG 0x7C
+#define AST3000_VGA2_STARTADDR 0x80
+#define AST3000_VGA2_OFFSETREG 0x84
+#define AST3000_VGA2_THRESHOLD 0x88
+#define AST3000_HWC2_OFFSET 0x90
+#define AST3000_HWC2_XY 0x94
+#define AST3000_HWC2_PBase 0x98
+#define AST3000_OSD2_H 0xA0
+#define AST3000_OSD2_V 0xA4
+#define AST3000_OSD2_PBase 0xA8
+#define AST3000_OSD2_Offset 0xAC
+#define AST3000_OSD2_THRESHOLD 0xB0
+
+/* Data Structure */
+typedef struct {
+ UCHAR ModeName[20];
+ USHORT usModeIndex;
+ USHORT usModeID;
+ USHORT usColorIndex;
+ USHORT usRefreshRateIndex;
+ USHORT usWidth;
+ USHORT usHeight;
+ USHORT usBitsPerPlane;
+ USHORT usRefreshRate;
+} ModeInfoStruct;
+
+typedef struct {
+
+ UCHAR MISC;
+ UCHAR SEQ[4];
+ UCHAR CRTC[25];
+ UCHAR AR[20];
+ UCHAR GR[9];
+
+} VBIOS_STDTABLE_STRUCT, *PVBIOS_STDTABLE_STRUCT;
+
+typedef struct {
+
+ ULONG HT;
+ ULONG HDE;
+ ULONG HFP;
+ ULONG HSYNC;
+ ULONG VT;
+ ULONG VDE;
+ ULONG VFP;
+ ULONG VSYNC;
+ ULONG DCLKIndex;
+ ULONG Flags;
+
+ ULONG ulRefreshRate;
+ ULONG ulRefreshRateIndex;
+ ULONG ulModeID;
+
+} VBIOS_ENHTABLE_STRUCT, *PVBIOS_ENHTABLE_STRUCT;
+
+typedef struct {
+ UCHAR Param1;
+ UCHAR Param2;
+ UCHAR Param3;
+} VBIOS_DCLK_INFO, *PVBIOS_DCLK_INFO;
+
+typedef struct {
+ UCHAR DACR;
+ UCHAR DACG;
+ UCHAR DACB;
+} VBIOS_DAC_INFO, *PVBIOS_DAC_INFO;
+
+typedef struct {
+ PVBIOS_STDTABLE_STRUCT pStdTableEntry;
+ PVBIOS_ENHTABLE_STRUCT pEnhTableEntry;
+
+} VBIOS_MODE_INFO, *PVBIOS_MODE_INFO;
diff --git a/board/aspeed/ast2300/vhace.c b/board/aspeed/ast2300/vhace.c
new file mode 100755
index 0000000..d045cbd
--- /dev/null
+++ b/board/aspeed/ast2300/vhace.c
@@ -0,0 +1,66 @@
+/*
+ * 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
+ */
+#define HASH_GLOBALS
+#include "type.h"
+#include "vdef.h"
+#include "vhace.h"
+#include "vfun.h"
+
+void HashAst3000(ULONG ulLength, ULONG *output, ULONG ulHashMode)
+{
+ ULONG i, ulTemp, ulCommand, ulDigestLength;
+ ULONG ulValue;
+
+ /* Get Info */
+ switch (ulHashMode)
+ {
+ case VHASHMODE_MD5:
+ ulCommand = VHASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case VHASHMODE_SHA1:
+ ulCommand = VHASH_ALG_SELECT_SHA1;
+ ulDigestLength = 20;
+ break;
+ case VHASHMODE_SHA256:
+ ulCommand = VHASH_ALG_SELECT_SHA256;
+ ulDigestLength = 32;
+ break;
+ case VHASHMODE_SHA224:
+ ulCommand = VHASH_ALG_SELECT_SHA224;
+ ulDigestLength = 28;
+ break;
+ }
+
+ /* Init. HW */
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_SRC_BASE_OFFSET, g_HashSrcBuffer);
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_DST_BASE_OFFSET, g_HashDstBuffer);
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_LEN_OFFSET, ulLength);
+
+ /* write src */
+ //already fill in g_VIDEO1_COMPRESS_BUF_ADDR
+
+ /* fire cmd */
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_CMD_OFFSET, ulCommand);
+
+ /* get digest */
+ do {
+ ulTemp = ReadMemoryLongHost(VHAC_REG_BASE, VREG_HASH_STATUS_OFFSET);
+ } while (ulTemp & VHASH_BUSY);
+
+ for (i=0; i<ulDigestLength/4; i++)
+ {
+ ulValue = *(((ULONG *)g_HashDstBuffer) + i);
+
+ //output is ULONG pointer
+ *(output + i) = ulValue;
+ }
+}
diff --git a/board/aspeed/ast2300/vhace.h b/board/aspeed/ast2300/vhace.h
new file mode 100755
index 0000000..460989b
--- /dev/null
+++ b/board/aspeed/ast2300/vhace.h
@@ -0,0 +1,58 @@
+/*
+ * 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
+ */
+#ifndef _VHACE_H_
+#define _VHACE_H_
+
+#define VHASHMODE_MD5 0x00
+#define VHASHMODE_SHA1 0x01
+#define VHASHMODE_SHA256 0x02
+#define VHASHMODE_SHA224 0x03
+
+#define VHASH_ALG_SELECT_MASK 0x70
+#define VHASH_ALG_SELECT_MD5 0x00
+#define VHASH_ALG_SELECT_SHA1 0x20
+#define VHASH_ALG_SELECT_SHA224 0x40
+#define VHASH_ALG_SELECT_SHA256 0x50
+
+#define VHASH_BUSY 0x01
+
+#define VHAC_REG_BASE 0x1e6e0000
+#define VHAC_REG_OFFSET 0x3000
+
+#define VREG_HASH_SRC_BASE_OFFSET (0x20+VHAC_REG_OFFSET)
+#define VREG_HASH_DST_BASE_OFFSET (0x24+VHAC_REG_OFFSET)
+#define VREG_HASH_KEY_BASE_OFFSET (0x28+VHAC_REG_OFFSET)
+#define VREG_HASH_LEN_OFFSET (0x2C+VHAC_REG_OFFSET)
+#define VREG_HASH_CMD_OFFSET (0x30+VHAC_REG_OFFSET)
+
+#define VREG_HASH_STATUS_OFFSET (0x1C+VHAC_REG_OFFSET)
+
+typedef struct
+{
+ int HashMode;
+ int DigestLen;
+} HASH_METHOD;
+
+
+#ifdef HASH_GLOBALS
+#define HASH_EXT
+#else
+#define HASH_EXT extern
+#endif
+
+HASH_EXT HASH_METHOD g_HashMethod;
+HASH_EXT BYTE g_DigestBuf[32];
+HASH_EXT ULONG g_HashSrcBuffer;
+HASH_EXT ULONG g_HashDstBuffer;
+
+void HashAst3000(ULONG ulLength, ULONG *output, ULONG ulHashMode);
+#endif
+
diff --git a/board/aspeed/ast2300/videotest.c b/board/aspeed/ast2300/videotest.c
new file mode 100755
index 0000000..f2e4953
--- /dev/null
+++ b/board/aspeed/ast2300/videotest.c
@@ -0,0 +1,779 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <post.h>
+
+#include "slt.h"
+#define WIN_GLOBALS
+#include "type.h"
+#include "vreg.h"
+#define VESA_GLOBALS
+#include "vesa.h"
+#include "vfun.h"
+#include "vdef.h"
+#include "vhace.h"
+#include "crt.h"
+#include "videotest.h"
+
+#define VHASH_ALIGNMENT 16
+#define VHASH_MAX_DST (32+VHASH_ALIGNMENT)
+
+
+#if ((CFG_CMD_SLT & CFG_CMD_VIDEOTEST) && defined(CONFIG_SLT))
+#include "videotest.h"
+
+#define RAND_MAX 32767 //2^16-1
+
+ULONG randSeed = 1;
+
+void srand(ULONG seed)
+{
+ randSeed = seed;
+}
+
+int rand(void)
+{
+ randSeed = randSeed * 214013 + 2531011;
+ return (int)(randSeed >> 17); //32 -15 = 17
+}
+
+//static unsigned char CaptureVideo1Buf1Addr[VIDEO_SOURCE_SIZE], CaptureVideo1Buf2Addr[VIDEO_SOURCE_SIZE], Video1CompressBufAddr[CRYPTO_MAX_CONTEXT];
+ULONG pCaptureVideo1Buf1Addr[VIDEO_SOURCE_SIZE/4], pCaptureVideo1Buf2Addr[VIDEO_SOURCE_SIZE/4], pVideo1CompressBufAddr[VIDEO_MAX_STREAM_SIZE/4], pVideo1FlagBufAddr[VIDEO_FLAG_SIZE];
+ULONG pCaptureVideo2Buf1Addr[VIDEO_SOURCE_SIZE/4], pCaptureVideo2Buf2Addr[VIDEO_SOURCE_SIZE/4], pVideo2CompressBufAddr[VIDEO_MAX_STREAM_SIZE/4], pVideo2FlagBufAddr[VIDEO_FLAG_SIZE];
+
+ULONG pVHashDstBuffer[VHASH_MAX_DST/4];
+
+ULONG pVideo1DecAddr[VIDEO_SOURCE_SIZE/4];
+ULONG pCrt1Addr[VIDEO_SOURCE_SIZE/4];
+//ULONG pCap1Addr[VIDEO_SOURCE_SIZE/4];
+
+BOOL AllocateEncodeBufHost(ULONG MMIOBase, int nVideo)
+{
+ //ULONG Addr;
+ //ULONG dwRegOffset = nVideo * 0x100;
+
+ if (VIDEO1 == nVideo)
+ {
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo1Buf1Addr = malloc(VIDEO_SOURCE_SIZE);
+
+ g_CAPTURE_VIDEO1_BUF1_ADDR = vBufAlign((ULONG)pCaptureVideo1Buf1Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_1_ADDR_REG, g_CAPTURE_VIDEO1_BUF1_ADDR, BUF_1_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo1Buf2Addr = malloc(VIDEO_SOURCE_SIZE);
+
+ g_CAPTURE_VIDEO1_BUF2_ADDR = vBufAlign((ULONG)pCaptureVideo1Buf2Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, g_CAPTURE_VIDEO1_BUF2_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->uStreamBufSize.StreamBufSize.RingBufNum * pVideoInfo->uStreamBufSize.StreamBufSize.PacketSize)
+ //pVideo1CompressBufAddr = malloc(VIDEO_MAX_STREAM_SIZE);
+ g_VIDEO1_COMPRESS_BUF_ADDR = vBufAlign((ULONG)pVideo1CompressBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_ADDR_REG, g_VIDEO1_COMPRESS_BUF_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc((pVideoInfo->SrcHeigh/64) * pVideoInfo->SrcWidth * 8);
+ //g_VIDEO1_CRC_BUF_ADDR = vBufAlign((ULONG)malloc(VIDEO_MAX_STREAM_SIZE));
+ //WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CRC_BUF_ADDR_REG, g_VIDEO1_CRC_BUF_ADDR, BUF_2_ADDR_MASK);
+
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcHeigh * pVideoInfo->SrcWidth / 128 (/64*4/8));
+ //pVideo1FlagBufAddr = malloc(VIDEO_FLAG_SIZE);
+ g_VIDEO1_FLAG_BUF_ADDR = vBufAlign((ULONG)pVideo1FlagBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_FLAG_BUF_ADDR_REG, g_VIDEO1_FLAG_BUF_ADDR, BUF_2_ADDR_MASK);
+ }
+ else if (VIDEO2 == nVideo)
+ {
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo2Buf1Addr = malloc(VIDEO_SOURCE_SIZE);
+ g_CAPTURE_VIDEO2_BUF1_ADDR = vBufAlign((ULONG)pCaptureVideo2Buf1Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_BUF_1_ADDR_REG, g_CAPTURE_VIDEO2_BUF1_ADDR, BUF_1_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo2Buf2Addr = malloc(VIDEO_SOURCE_SIZE);
+ g_CAPTURE_VIDEO2_BUF2_ADDR = vBufAlign((ULONG)pCaptureVideo2Buf2Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_BUF_2_ADDR_REG, g_CAPTURE_VIDEO2_BUF2_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->uStreamBufSize.StreamBufSize.RingBufNum * pVideoInfo->uStreamBufSize.StreamBufSize.PacketSize)
+ //pVideo2CompressBufAddr = malloc(VIDEO_MAX_STREAM_SIZE);
+ g_VIDEO2_COMPRESS_BUF_ADDR = vBufAlign((ULONG)pVideo2CompressBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_COMPRESS_BUF_ADDR_REG, g_VIDEO2_COMPRESS_BUF_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc((pVideoInfo->SrcHeigh/64) * pVideoInfo->SrcWidth * 8);
+ //g_VIDEO1_CRC_BUF_ADDR = vBufAlign((ULONG)malloc(VIDEO_MAX_STREAM_SIZE));
+ //WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CRC_BUF_ADDR_REG, g_VIDEO1_CRC_BUF_ADDR, BUF_2_ADDR_MASK);
+
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcHeigh * pVideoInfo->SrcWidth / 128 (/64*4/8));
+ //pVideo2FlagBufAddr = malloc(VIDEO_FLAG_SIZE);
+ g_VIDEO2_FLAG_BUF_ADDR = vBufAlign((ULONG)pVideo2FlagBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_FLAG_BUF_ADDR_REG, g_VIDEO2_FLAG_BUF_ADDR, BUF_2_ADDR_MASK);
+ }
+
+}
+
+/********************************************************/
+/* 1. product random data to encode */
+/* 2. use hash to verify encode function */
+/* 3. use encode stream to decompress original data */
+/********************************************************/
+int CodecTest(void)
+{
+ int num, i=0, j=0;
+ ULONG ulTemp = 0, ulTemp2;
+ int dwValue;
+ ULONG ulHWWp;
+ ULONG ulHWPt;
+
+ //max size
+ ULONG tArray[32/4];
+
+ //mode detection
+ BOOL bExternal = TRUE;
+ BOOL bAnalog = TRUE;
+ ULONG Status;
+
+#if defined(CONFIG_AST2300)
+ ULONG ulHashSha1[5] = {0x3f0c2ad6,0xc8eb7074,0xa9929352,0xfcd5b8b0,0x76fa8461};
+ ULONG aHashDecode[5] = {0xb23b62bb,0xd22a602b,0x113038a0,0x7217c6ab,0xcb156f06};
+#else
+ ULONG ulHashSha1[5] = {0x2a19e99f,0x99b1bb2d,0x9ac82862,0x49205e43,0x6bc4b4d7};
+ ULONG aHashDecode[5] = {0x2907a827,0xaf337079,0x47817f1f,0xb0b7cd68,0x8d33bd2};
+#endif
+
+ //Load pattern to src1 & src2 buffer
+ srand(1);
+
+ //Total size : DefWidth*DeHeight*4
+ //rand function: 16 bits one time is equal to 2 bytes
+ //OutdwmBankMode: 32 bits one time is equal to 4 bytes
+ for (i=0; i<g_DefWidth*g_DefHeight*2; i++)
+ {
+ if (i%2)
+ {
+ ulTemp2 = rand();
+ ulTemp = (ulTemp2 << 16) | ulTemp;
+ //WriteMemoryLongHost(DRAM_BASE, g_CAPTURE_VIDEO1_BUF1_ADDR + ((i-1)/2)*4, ulTemp);
+ *(((ULONG *)g_CAPTURE_VIDEO1_BUF1_ADDR) + (i-1)/2) = ulTemp;
+ ulTemp = 0;
+ }
+ else
+ {
+ ulTemp = rand();
+ }
+ }
+
+ /* init encoder engine */
+ InitializeVideoEngineHost (0,
+ VIDEO1,
+ vModeTable[2].HorPolarity,
+ vModeTable[2].VerPolarity);
+
+ /* reset offset pointer register*/
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, 0, VIDEO_CODEC_TRIGGER | VIDEO_CAPTURE_TRIGGER);
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_READ_OFFSET_REG, 0, COMPRESS_BUF_READ_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ, 0, BUF_CODEC_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_PROCESS_OFFSET_REG, 0, COMPRESS_BUF_PROCESS_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_FRAME_END_READ, 0, COMPRESS_FRAME_END_READ_MASK);
+
+ /* start compress stream */
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, MODE_DETECTION_TRIGGER, MODE_DETECTION_TRIGGER);
+ //Stream mode: set CODEC trigger first
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, VIDEO_CODEC_TRIGGER, VIDEO_CODEC_TRIGGER);
+
+ //Stream mode: start trigger (only trigger capture bit)
+ StartVideoCaptureTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+
+ //stop engine
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, 0, 0xFF);
+#if defined(CONFIG_AST2300)
+ do { /* wait compress engine idle */
+ ulTemp = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+ } while (!(ulTemp & 0x40000));
+#endif
+
+ //read 30 times to get HW write pointer
+ for (i=0; i<30000; i++)
+ ulHWWp = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ);
+
+ g_HashSrcBuffer = g_VIDEO1_COMPRESS_BUF_ADDR + 128; //skip encode data 128 byte
+ g_HashDstBuffer = v16byteAlign((unsigned long)pVHashDstBuffer);
+ ulTemp = 300;
+
+ //Enable hash clock
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_HACE, STOP_HACE_MASK);
+ g_HashMethod.HashMode = VHASHMODE_SHA1;
+ g_HashMethod.DigestLen = 20;
+ HashAst3000(ulTemp, tArray, g_HashMethod.HashMode);
+
+ if (strncmp((const char *)tArray, (const char *)ulHashSha1, g_HashMethod.DigestLen))
+ {
+ printf("[VIDEO] Encoder Test: Wrong\n");
+ //ExitVideoTest();
+ return VIDEO_ENCODE_FAIL;
+ }
+ else
+ {
+ printf("[VIDEO] Encoder Test: Pass\n");
+ }
+
+#if 0
+ /******** prepare for next decoding test at the same chip ***********/
+ ResetVideoHost();
+
+ dwValue=0;
+
+ do
+ {
+ dwValue = UnlockVideoRegHost(0, VIDEO_UNLOCK_KEY);
+ i++;
+ }
+ while ((VIDEO_UNLOCK != dwValue) && (i<10));
+
+ if (VIDEO_UNLOCK != dwValue)
+ {
+ printf("[VIDEO] Video register is locked");
+ return VIDEO_UNLOCK_FAIL;
+ }
+
+ // allocate decoding buffer
+ //Use Compress buffer last time, and Don't need to allocate
+ g_VIDEO1_DECODE_BUF_1_ADDR = g_VIDEO1_COMPRESS_BUF_ADDR;
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_1_ADDR_REG, g_VIDEO1_DECODE_BUF_1_ADDR, BUF_1_ADDR_MASK);
+
+ // pVideo1DecAddr = malloc(VIDEO_SOURCE_SIZE);
+ g_VIDEO1_DECOMPRESS_BUF_ADDR = vBufAlign((unsigned long)pVideo1DecAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_ADDR_REG, g_VIDEO1_DECOMPRESS_BUF_ADDR, COMPRESS_BUF_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(256);
+ //g_VIDEO1_RC4_BUF_ADDR = Addr;
+ //g_VIDEO1_DECODE_RC4_BUF_ADDR = g_VIDEO1_DECOMPRESS_BUF_ADDR + 0x800000; //assume video size is 8MB for umcompressed buf;
+ //WriteMemoryLongWithMASKClient(VIDEO_REG_BASE, VIDEO1_RC4_TABLE_ADDR, g_VIDEO1_DECODE_RC4_BUF_ADDR, RC4_TABLE_ADDR_MASK);
+
+ //HW recommanded value
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, g_VIDEO1_DECOMPRESS_BUF_ADDR, BUF_2_ADDR_MASK);
+ //WriteMemoryLongWithMASKClient(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, 0, BUF_2_ADDR_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CRC_BUF_ADDR_REG, 0, BUF_2_ADDR_MASK);
+
+ /* init encoder engine */
+ InitializeVideoEngineClient (0, VIDEO1);
+
+ /* reset offset pointer register*/
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, 0, VIDEO_CODEC_TRIGGER | VIDEO_CAPTURE_TRIGGER);
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_READ_OFFSET_REG, 0, COMPRESS_BUF_READ_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ, 0, BUF_CODEC_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_PROCESS_OFFSET_REG, 0, COMPRESS_BUF_PROCESS_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_FRAME_END_READ, 0, COMPRESS_FRAME_END_READ_MASK);
+
+ StartVideoCodecTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+
+ //wrtie SW write pointer
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_DECOMPRESS_BUF_PROCESS_OFFSET_REG, ulHWWp, COMPRESS_BUF_READ_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_DECOMPRESS_BUF_WRITE_OFFSET_REG, ulHWWp, COMPRESS_BUF_READ_OFFSET_MASK);
+
+ i = 0;
+
+ do
+ {
+ ulHWPt = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ);
+ i++;
+ }while((ulHWPt != ulHWWp) && (i<10000));
+
+ if (10000 > i)
+ {
+ printf("[VIDEO] Decoder Pointer cannot move!!! /n");
+ //ExitVideoTest();
+ return VIDEO_DECODE_FAIL;
+ }
+
+ //8*8 YUVA block
+ for (i=24; i<g_DefWidth*g_DefHeight; i=i+32)
+ {
+ *(((ULONG *)g_VIDEO1_DECOMPRESS_BUF_ADDR) + i) = 0x0;
+ *(((ULONG *)g_VIDEO1_DECOMPRESS_BUF_ADDR) + i+1) = 0x0;
+ }
+
+ g_HashSrcBuffer = g_VIDEO1_DECOMPRESS_BUF_ADDR;
+ //g_HashDstBuffer = VIDEO1_EN_BASE + VIDEO_ALL_SIZE; //config forward
+
+ ulTemp = 300;
+
+ //Enable hash clock
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_HACE, STOP_HACE_MASK);
+ g_HashMethod.HashMode = VHASHMODE_SHA1;
+ g_HashMethod.DigestLen = 20;
+ HashAst3000(ulTemp, tArray, g_HashMethod.HashMode);
+
+ if (strncmp((const char *)tArray, (const char *)aHashDecode, g_HashMethod.DigestLen))
+ {
+ printf("[VIDEO] Decoder Test: Wrong\n");
+ //ExitVideoTest();
+ return VIDEO_DECODE_FAIL;
+ }
+ else
+ {
+ printf("[VIDEO] Decoder Test: Pass\n");
+ }
+#endif
+
+ return VIDEO_TEST_OK;
+}
+
+/********************************************************/
+/* Only used in the host */
+/* test function: Mode detection and Capture pattern */
+/********************************************************/
+int CapTest(void)
+{
+ ULONG dwValue, Status;
+ int i;
+ BOOL bAnalog;
+ ULONG HStart, HEnd, VStart, VEnd;
+ USHORT usCRTHor, usCRTVer;
+ ULONG ulHor, ulVer;
+ ULONG ulVGABaseAddr, ulCapAddr;
+ ULONG ulFlag;
+
+ printf("\n --------- Mode Detection Test --------- \n");
+ //clear clear register
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG, 0);
+ dwValue = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG);
+
+ // Note: Current mode detection procedure has to set signal input 1st
+ //Note: Clear and enable interrupt Encode
+ ClearVideoInterruptHost(0, VIDEO1_MODE_DETECTION_READY_CLEAR);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_EN_REG, VIDEO1_MODE_DETECTION_READY_INT_EN, VIDEO1_MODE_DETECTION_READY_INT_EN);
+ // Set input signal
+ dwValue |= EXTERNAL_VGA_SOURCE;
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG, (dwValue <<EXTERNAL_SOURCE_BIT), EXTERNAL_SOURCE_MASK);
+
+// Set H/V stable maximum
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_VERTICAL_STABLE_MAXIMUM << VER_STABLE_MAX_BIT), 0x000F0000);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_HORIZONTAL_STABLE_MAXIMUM << HOR_STABLE_MAX_BIT), HOR_STABLE_MAX_BIT_MASK);
+// Set H/V stable threshold
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_VERTICAL_STABLE_THRESHOLD << VER_STABLE_THRES_BIT), VER_STABLE_THRES_BIT_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_HORIZONTAL_STABLE_THRESHOLD << HOR_STABLE_THRES_BIT), HOR_STABLE_THRES_BIT_MASK);
+
+ //Trigger mode detection
+ // turn off WATCH_DOG first
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, (WATCH_DOG_OFF << WATCH_DOG_ENABLE_BIT), WATCH_DOG_EN_MASK);
+
+ // Note: Clear mode detection ready interrupt
+ //ClearVideoInterrupt(MMIOBase, MODE_DETECTION_READY_CLEAR);
+ StartModeDetectionTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+
+
+// Note: Polling mode detection ready interrupt
+ //it sometime take a long time, especially during change mode,
+ //so the loop count must be big, or you can't pull it by timer
+ i = 0;
+ do {
+
+ Status = ReadVideoInterruptHost(0, VIDEO1_MODE_DETECTION_READY_READ);
+ i++;
+ } while ((!Status) & (i<500000));
+
+ if (!Status)
+ {
+ printf("[VIDEO] Mode detection error\n");
+ //ExitVideoTest();
+ return VIDEO_TEST_FAIL;
+ }
+
+ HStart = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_H_REG) & LEFT_EDGE_LOCATION_MASK) >> LEFT_EDGE_LOCATION_BIT;
+ HEnd = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_H_REG) & RIGHT_EDGE_LOCATION_MASK) >> RIGHT_EDGE_LOCATION_BIT;
+
+ VStart = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_V_REG) & TOP_EDGE_LOCATION_MASK) >> TOP_EDGE_LOCATION_BIT;
+ VEnd = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_V_REG) & BOTTOM_EDGE_LOCATION_MASK) >> BOTTOM_EDGE_LOCATION_BIT;
+
+ ulHor = HEnd-HStart+1;
+ ulVer = VEnd-VStart+1;
+
+ printf("[VIDEO] Resolution: H[%d] * V[%d]\n", ulHor, ulVer);
+
+ if ((g_DefWidth == ulHor) & (g_DefHeight == ulVer))
+ {
+ printf("[VIDEO] Mode detection PASS\n");
+ }
+ else
+ {
+ printf("[VIDEO] Mode detection FAIL\n");
+ return VIDEO_TEST_FAIL;
+ }
+
+ if(!((ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_MODE_DETECTION_STATUS_READ_REG) & ANALONG_DIGITAL_READ) >> ANALONG_DIGITAL_READ_BIT))
+ bAnalog = FALSE;
+ else
+ bAnalog = TRUE;
+
+ // Note: Clear mode detection ready interrupt
+ ClearVideoInterruptHost(0, VIDEO1_MODE_DETECTION_READY_CLEAR);
+
+ printf("\n --------- Capture Test --------- \n");
+
+ //capture engine
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_HOR_REG, (HEnd << VIDEO_HDE_END_BIT), VIDEO_HDE_END_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_HOR_REG, (HStart << VIDEO_HDE_START_BIT), VIDEO_HDE_START_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_V_REG, (VEnd << VIDEO_VDE_END_BIT), VIDEO_VDE_END_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_V_REG, (VStart << VIDEO_VDE_START_BIT), VIDEO_VDE_START_MASK);
+
+ ulCapAddr = vBufAlign2((ULONG)pCaptureVideo1Buf1Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_1_ADDR_REG, ulCapAddr, BUF_1_ADDR_MASK);
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, 0, BUF_2_ADDR_MASK);
+
+ InitializeVideoEngineHost (0,
+ VIDEO1,
+ vModeTable[2].HorPolarity,
+ vModeTable[2].VerPolarity);
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x04, 0x01);
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x300, 0x0);
+#if defined(CONFIG_AST2300)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, 0x8, 0x0880, 0x0ec0);
+#elif defined(CONFIG_AST3000)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, 0x8, 0x2800, 0x2800);
+#else
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, 0x8, 0xa00, 0x2a80); //tile mode
+#endif
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_HOR_REG, 0xa0000000, 0xa0000000);
+
+ //only trigger capture, in source buffer (vr44), the front of data is correct.
+ //StartVideoCaptureTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, VIDEO_CAPTURE_TRIGGER);
+
+ i = 0;
+ do {
+ Status = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG) & CAPTURE_READY_MASK;
+ i++;
+ } while ((!Status) & (i<500000));
+
+ if (!Status)
+ {
+ printf("[VIDEO] Capture is not READY\n");
+ return VIDEO_TEST_FAIL;
+ }
+
+#if !defined(CONFIG_AST2300)
+ ulVGABaseAddr = ulCapAddr + 0x1000;
+
+ /* check pattern */
+ ulFlag = 0; //no 0 is error
+
+ for (i=0; i<100; i++)
+ {
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32);
+ if (0x32323232 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("[VIDEO]1 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 4);
+ if (0x32323232 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("[VIDEO]2 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 8);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("[VIDEO]3 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 12);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("4 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 16);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("5 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 20);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("6 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+ }
+#endif
+
+ if (!ulFlag)
+ {
+ printf("[VIDEO] Capture Test OK\n");
+ }
+ else
+ {
+ printf("[VIDEO] Capture Test FAIL\n");
+ return VIDEO_TEST_FAIL;
+ }
+
+ return VIDEO_TEST_OK;
+}
+
+/********************************************************/
+/* Only used in the station */
+/********************************************************/
+int CRTTest(void)
+{
+ ULONG ulVGABaseAddr;
+ BYTE btCRTCenterMode, btCRTColorFmt;
+ USHORT usCRTHor, usCRTVer;
+ ULONG ulData;
+
+ int i,j;
+
+ //printf("\n --------- Turn on CRT --------- \n");
+
+ //Enable CRT1 first
+ ulVGABaseAddr = vBufAlign((unsigned long)pCrt1Addr);
+
+ btCRTCenterMode = 0;
+ btCRTColorFmt = YUV_444;
+ usCRTHor = g_DefWidth;
+ usCRTVer = g_DefHeight;
+
+ CheckOnStartClient();
+
+ /* Fill Pattern */
+ for (i=0; i<usCRTHor; i++)
+ {
+ for (j=0; j<usCRTVer/8; j++)
+ {
+ //Y
+ //ulData = 0x10101010;
+ ulData = 0x32323232;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32)) = ulData;
+ //ulData = 0x10101010;
+ ulData = 0x32323232;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +4) = ulData;
+ //U
+ ulData = 0x80808080;
+ //ulData = 0x77777777;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +8) = ulData;
+ ulData = 0x80808080;
+ //ulData = 0x77777777;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +12) = ulData;
+ //V
+ ulData = 0x80808080;
+ //ulData = 0x11111111;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +16) = ulData;
+ ulData = 0x80808080;
+ //ulData = 0x11111111;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +20) = ulData;
+ //A
+ ulData = 0xFFFFFFFFF;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +24) = ulData;
+ ulData = 0xFFFFFFFFF;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +28) = ulData;
+ }
+ } /* ~Fill Pattern */
+
+#if defined(CONFIG_AST2300)
+ if(!ASTSetModeV (0, CRT_2, ulVGABaseAddr, usCRTHor, usCRTVer, btCRTColorFmt, btCRTCenterMode))
+#else
+ if(!ASTSetModeV (0, CRT_1, ulVGABaseAddr, usCRTHor, usCRTVer, btCRTColorFmt, btCRTCenterMode))
+#endif
+ {
+ printf("[VIDEO] The resolution is not in mode table list\n");
+ return CRT_FAIL;
+ }
+
+ //printf("[VIDEO] CRT turn on\n");
+
+ return VIDEO_TEST_OK;
+}
+
+int do_videotest (void)
+{
+ int dwValue=0;
+ int i = 0;
+ int iRet;
+ ULONG ulRestore1, ulTemp;
+ BOOL bClient;
+
+
+ //InitVideoTest();
+ g_DefWidth = 640;
+ g_DefHeight= 480;
+
+ printf("\n --------- Codec Test --------- \n");
+
+#if defined(CONFIG_AST2300)
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, 0x00002000, 0x00002000);
+#endif
+
+ CheckOnStartHost();
+
+ do
+ {
+ dwValue = UnlockVideoRegHost(0, VIDEO_UNLOCK_KEY);
+ i++;
+ }
+ while ((VIDEO_UNLOCK != dwValue) && (i<1000));
+
+ if (VIDEO_UNLOCK != dwValue)
+ {
+ printf("[VIDEO] Video register is locked \n");
+ return VIDEO_TEST_FAIL;
+ }
+ AllocateEncodeBufHost(0, VIDEO1);
+
+ iRet = CodecTest();
+ if (iRet)
+ return VIDEO_TEST_FAIL;
+
+#if defined(CONFIG_AST2300)
+ /* Init SCU */
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x2c + SCU_OFFSET), 0x00040000, 0x00040010); /* Enable D2-PLL */
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, 0, 0x00000400); /* Enable D2CLK */
+ udelay(10);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, 0, 0x00002000);
+
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x90 + SCU_OFFSET), 0x20, 0x00000030); /* enable video mode single edge */
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x84 + SCU_OFFSET), 0xfffe0000, 0xfffe0000); /* multi-pins */
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x88 + SCU_OFFSET), 0x000fffff, 0x000fffff); /* multi-pins */
+
+ iRet = CRTTest();
+ if (iRet)
+ {
+ printf("[VIDEO] CRT Test Failed \n");
+ return VIDEO_TEST_FAIL;
+ }
+
+ iRet = CapTest();
+ if (iRet)
+ {
+ printf("[VIDEO] Capture Test Failed \n");
+ return VIDEO_TEST_FAIL;
+ }
+#else
+ //Host or Client
+ bClient = ((ReadMemoryLong(SCU_BASE, SCU_HW_TRAPPING_REG) & CLIENT_MODE_EN_MASK)?TRUE:FALSE);
+ //reset video for another testing
+ ResetVideoHost();
+ dwValue=0;
+ i = 0;
+ do
+ {
+ dwValue = UnlockVideoRegHost(0, VIDEO_UNLOCK_KEY);
+ i++;
+ }
+ while ((VIDEO_UNLOCK != dwValue) && (i<10));
+
+ if (VIDEO_UNLOCK != dwValue)
+ {
+ printf("[VIDEO] Video register is locked");
+ return VIDEO_UNLOCK_FAIL;
+ }
+
+ //check if 1e6e0008[3,0] is 0
+ ulRestore1 = ReadMemoryLongHost(0x1e6e0000, 8);
+ dwValue = ReadMemoryLongHost(0x1e6e0000, 8)&0xF;
+
+ //set 1e6e0008[3,0] to 0
+ if (dwValue)
+ {
+ WriteMemoryLongHost(0x1e6e0000, 0, 0xfc600309);
+
+ i=0;
+ do
+ {
+ i++;
+ dwValue = ReadMemoryLongHost(0x1e6e0000,0);
+ }while((1 != dwValue)&& (i<10));
+
+ if (1 != dwValue)
+ {
+ printf("0x1e6e0000 is locked");
+ return VIDEO_UNLOCK_FAIL;
+ }
+ }
+
+ //only clear 1e6e0008[3,0]
+ WriteMemoryLongWithMASKHost(0x1e6e0000, 8, 0, 0xf);
+
+ bClient = 0;
+ if (!bClient)
+ {
+ //To turn on crt, must be the client mode
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_CLIENT_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+
+ iRet = CRTTest();
+
+ if (iRet)
+ {
+ //trapping to host, the Vsync of CRT can't output and the host doesn't have video sync input
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ //restore value
+ WriteMemoryLongHost(0x1e6e0000, 8, ulRestore1);
+ //lock register
+ WriteMemoryLongHost(0x1e6e0000, 0, 0x12345678);
+ return VIDEO_TEST_FAIL;
+ }
+
+ iRet = CapTest();
+
+ if (iRet)
+ {
+ //trapping to host, the Vsync of CRT can't output and the host doesn't have video sync input
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ //restore value
+ WriteMemoryLongHost(0x1e6e0000, 8, ulRestore1);
+ //lock register
+ WriteMemoryLongHost(0x1e6e0000, 0, 0x12345678);
+
+ return VIDEO_TEST_FAIL;
+ }
+ //WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ }
+ //trapping to host, the Vsync of CRT can't output and the host doesn't have video sync input
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ //restore value
+ WriteMemoryLongHost(0x1e6e0000, 8, ulRestore1);
+ //lock register
+ WriteMemoryLongHost(0x1e6e0000, 0, 0x12345678);
+#endif
+
+ return VIDEO_TEST_OK;
+}
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2300/videotest.h b/board/aspeed/ast2300/videotest.h
new file mode 100755
index 0000000..79b8dd9
--- /dev/null
+++ b/board/aspeed/ast2300/videotest.h
@@ -0,0 +1,24 @@
+/*
+ * 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
+ */
+/* VideoTest.h */
+#ifndef _VIDEOTEST_H_
+#define _VIDEOTEST_H_
+
+#define VIDEO_TEST_OK 0
+#define VIDEO_TEST_FAIL 1
+
+#define VIDEO_UNLOCK_FAIL 1
+#define VIDEO_ENCODE_FAIL 2
+#define VIDEO_DECODE_FAIL 3
+#define CRT_FAIL 4
+
+#endif /* _VIDEOTEST_H_ */
+
diff --git a/board/aspeed/ast2300/vreg.h b/board/aspeed/ast2300/vreg.h
new file mode 100755
index 0000000..9738548
--- /dev/null
+++ b/board/aspeed/ast2300/vreg.h
@@ -0,0 +1,845 @@
+/*
+ * 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
+ */
+#ifndef _VREG_H_
+#define _VREG_H_
+
+/********************************************************/
+/* CRT register */
+/********************************************************/
+#define CRT_BASE_ADDRESS 0x000400
+#define VGA_GRAPH_BASE_ADDRESS 0x600000
+#define VGA_CURSOR_BASE_ADDRESS 0x300000
+#define VGA_OSD_BASE_ADDRESS 0x300000
+#define RGB_565 0x0
+#define RGB_888 0x1
+#define YUV_444 0x2
+#define NO_SUPPORTED_CRT_FMT 0x3
+#define CRT_LOW_THRESHOLD_VALUE 0x12
+#define CRT_HIGH_THRESHOLD_VALUE 0x1E
+
+// AST3000's Registers
+#ifdef Watcom
+#define VIDEOBASE_OFFSET 0x10000
+#else
+#define VIDEOBASE_OFFSET 0x0
+#endif
+
+#define KEY_CONTROL_REG 0x00 + VIDEOBASE_OFFSET
+ #define VIDEO_LOCKED 0
+ #define VIDEO_UNLOCK 1
+
+// Registers for video1 and video2
+#define VIDEO1_ENGINE_SEQUENCE_CONTROL_REG 0x04 + VIDEOBASE_OFFSET
+#define VIDEO2_ENGINE_SEQUENCE_CONTROL_REG 0x104 + VIDEOBASE_OFFSET
+ #define MODE_DETECTION_TRIGGER 0x00000001 //Bit[0] trigger HW auto mode detection
+ #define VIDEO_CAPTURE_TRIGGER 0x00000002 //Bit[1] trigger HW to capture video
+ #define FORCE_HW_IDLE_MASK (1<<2) //Bit[2] Force engine into ready(idle) state
+ #define ENGINE_RESET (0<<2)
+ #define ENGINE_IDLE (1<<2)
+ #define VIDEO_CAPTURE_AUTO_MODE 0x00000008 //Bit[3]
+ #define CAPTURE_FRAME_MODE 0
+ #define CAPTURE_AUTO_MODE 1
+ #define CAPTURE_AUTO_MODE_BIT 3
+ #define CAPTURE_AUTO_MODE_MASK 0x00000008
+ #define VIDEO_CODEC_TRIGGER 0x00000010 //Bit[4] trigger HW to compress or decompress video
+ #define CODEC_TRIGGER_BIT 4
+ #define CODEC_TRIGGER_MASK 0x00000010
+ #define CLEAR_CODEC_TRIGGER 0
+ #define EN_CODEC_TRIGGER 1
+ #define VIDEO_CODEC_AUTO_MODE 0x00000020 //Bit[5]
+ #define CODEC_FRAME_MODE 0
+ #define CODEC_AUTO_MODE 1
+ #define CODEC_AUTO_MODE_BIT 5
+ #define CODEC_AUTO_MODE_MASK 0x00000020
+ #define INSERT_FULL_FRAME_MASK (1<<6) //Bit[6] Insert full frame compression
+ #define INSERT_FULL_FRAME_EN (1<<6)
+ #define INSERT_FULL_FRAME_OFF (0<<6)
+ #define WATCH_DOG_ENABLE 0x00000080 //Bit[7] Video Enable watch dog for mode change detection
+ #define WATCH_DOG_ENABLE_BIT 7
+ #define WATCH_DOG_OFF 0
+ #define WATCH_DOG_EN 1
+ #define WATCH_DOG_EN_MASK 0x00000080
+ #define VIDEO_CRT_SELECTION 0x00000100 //Bit[8]
+ #define CRT1 0
+ #define CRT2 1
+ #define ANTI_TEARING_ENABLE 0x00000200 //Bit[9] Anti-tearing mode enable for decoding
+ #define ANTI_TEARING_EN 1
+ #define STREAM_DATA_MODE 0x00000400 //Bit[11:10] Buffer and Stream Data type
+ #define STREAM_DATA_MODE_BIT 10
+ #define STREAM_DATA_MODE_MASK 0x00000C00
+ #define YUV444_MODE 0
+ #define YUV420_MODE 1
+ #define YUV420_MODE_WITH_AST2000 2 //AST2000 compatible
+ #define VIDEO_CAPTURE_READY 0x00010000 //Bit[16] Video capture ready status read back(read only)
+ #define CAPTURE_READY_MASK 0x00010000
+ #define HW_BUSY 0
+ #define HW_IDLE 1
+ #define VIDEO_CODEC_READY 0x00040000 //Bit[18] Video codec ready status read back(read only)
+ #define CODEC_READY_MASK 0x00040000
+ //#define HW_BUSY 0
+ //#define HW_IDLE 1
+
+#define VIDEO1_CONTROL_REG 0x08 + VIDEOBASE_OFFSET
+#define VIDEO2_CONTROL_REG 0x108 + VIDEOBASE_OFFSET
+ #define VIDEO_HSYNC_POLARITY 0x00000001 //Bit[0] Video source hsync polarity
+ #define VIDEO_HSYNC_POLARITY_BIT 0
+ #define NO_INVERSE_POL 0
+ #define INVERSE_POL 1
+ #define VIDEO_VSYNC_POLARITY 0x00000002 //Bit[1] Video source vsync polarity
+ #define VIDEO_VSYNC_POLARITY_BIT 1
+ //Setting defination the same as VIDEO_HSYNC_POLARITY
+ #define VIDEO_EXTERNAL_SOURCE 0x00000004 //Bit[2] Video external source
+ #define EXTERNAL_SOURCE_BIT 2
+ #define INTERNAL_VGA_SOURCE 0
+ #define EXTERNAL_VGA_SOURCE 1
+ #define EXTERNAL_SOURCE_MASK 0x00000004
+ #define VIDEO_ANALONG_EXTERNAL_SOURCE 0x00000008 //Bit[3] Video Analog external source
+ #define ANALONG_EXTERNAL_SOURCE_BIT 3
+ #define DVI_SOURCE 0
+ #define ANALOG_RGB_SOURCE 1
+ #define VIDEO_INTERNAL_TIMING_GEN 0x00000010 //Bit[4] Video Use internal timing generator
+ #define INTERNAL_TIMING_GEN_BIT 4
+ #define EXTERNAL_DE_SIGNAL 0 //DVI only
+ #define VR0C_VR10_DE_SINGAL 1 //use VR0C and VR10 for generate VDE signal
+ /****** Video2 Only from DAC ******/
+ #define VIDEO1_CAPTURE_FROM 0x00000020 //Bit[5] Video1 capture data direct from VGA frame buffer(internal VGA only)
+ #define FROM_DAC_PORT 0
+ #define FROM_FRAME_BUFFER 1
+ #define WRITE_DATA_FORMAT 0x00000040 //Bit[7:6] Write data format
+ #define WRITE_DATA_FORMAT_BIT 6
+ #define WRTIE_DATA_FORMAT_MASK 0x000000C0
+ #define CCIR601_2_YUV_FORMAT 0
+ #define FULL_YUV_FORMAT 1
+ #define RGB_FORMAT 2
+ #define VGA_CURSOR_DISABLE 0x00000100 //Bit[8] External video port slection
+ #define VGA_CURSOR_NORMAL 0
+ #define VGA_CURSOR_OFF 1
+ #define VIDEO_CAPTURE_LINEAR_MODE 0x00000200 //Bit[9] VIDEO_CAPTURE_LINEAR_MODE
+ #define LINEAR_MODE 0
+ #define TILE_MODE 1
+ #define VIDEO_CLOCK_DELAY 0x00000400 //Bit[11:10] Video clock delay control
+ #define VIDEO_CLOCK_DELAY_BIT 10
+ #define VIDEO_CLOCK_DELAY_MASK 0x00000C00
+ #define DELAY_0_NS 0
+ #define DELAY_1_NS 1
+ #define INV_AND_DELAY_0_NS 2
+ #define INV_AND_DELAY_1_NS 3
+ #define VIDEO_CCIR656_SOURCE_MODE 0x00001000 //Bit[12] Video CCIR656 source mode
+ #define RGB_SOURCE_MODE 0
+ #define CCIR656_SOURCE_MODE 1
+ #define SOURCE_PORT_CLOCK_MODE 0x00002000 //Bit[13] Video Source port clock mode
+ #define SINGLE_EDGE_MODE 0
+ #define DUAL_EDGE_MODE 1
+ #define EXTERNAL_PORT_SELECTION 0x00004000 //Bit[14] External video port slection
+ #define VIDEO_PORT_A 0
+ #define VIDEO_PORT_B 1
+ #define VIDEO_CAPTURE_FRAME_RATE 0x00010000 //Bit[23:16] Video capture frame rate control
+ #define VIDEO_CAPTURE_FRAME_RATE_BIT 16
+ #define VIDEO_CAPTURE_FRAME_RATE_MASK 0x00FF0000 //Maximum frame rate = XX * SourceFPS / 60
+
+#define VIDEO1_TIMEING_GEN_HOR_REG 0x0C + VIDEOBASE_OFFSET
+#define VIDEO2_TIMEING_GEN_HOR_REG 0x10C + VIDEOBASE_OFFSET
+ #define VIDEO_HDE_END 0x00000000 //Bit[12:0] Video HDE End timing generator
+ #define VIDEO_HDE_END_BIT 0 //Number of pixels from rising edge of Hsync for first active pixel
+ #define VIDEO_HDE_END_MASK 0x00001FFF
+ #define VIDEO_HDE_START 0x00010000 //Bit[28:16] Video HDE Start timing generator
+ #define VIDEO_HDE_START_BIT 16 //Number of pixels from rising edge of Hsync for last active pixel
+ #define VIDEO_HDE_START_MASK 0x1FFF0000
+ #define FRAME_RATE_OFF 0
+
+#define VIDEO1_TIMEING_GEN_V_REG 0x10 + VIDEOBASE_OFFSET
+#define VIDEO2_TIMEING_GEN_V_REG 0x110 + VIDEOBASE_OFFSET
+ #define VIDEO_VDE_END 0x00000001 //Bit[11:0] Video VDE End timing generator
+ #define VIDEO_VDE_END_BIT 0 //Number of pixels from rising edge of Vsync for first active pixel
+ #define VIDEO_VDE_END_MASK 0x00000FFF
+ #define VIDEO_VDE_START 0x00010000 //Bit[27:16] Video VDE Start timing generator
+ #define VIDEO_VDE_START_BIT 16 //Number of pixels from rising edge of Vsync for last active pixel
+ #define VIDEO_VDE_START_MASK 0x0FFF0000
+
+#define VIDEO1_SCALE_FACTOR_REG 0x14 + VIDEOBASE_OFFSET
+#define VIDEO2_SCALE_FACTOR_REG 0x114 + VIDEOBASE_OFFSET
+ #define HOR_SCALING_FACTOR 0x00000001 //Bit[15:0] Video Horizontal scaling factor
+ #define HOR_SCALING_FACTOR_BIT 0 //The formula=4096/(Horizontal scaling facotr)
+ #define HOR_SCALING_FACTOR_MASK 0x0000FFFF
+ #define VER_SCALING_FACTOR 0x00000000 //Bit[31:16] Video Vertical scaling factor
+ #define VER_SCALING_FACTOR_BIT 16 //The formula=4096/(Vertical scaling facotr)
+ #define VER_SCALING_FACTOR_MASK 0xFFFF0000
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER0_REG 0x18 + VIDEOBASE_OFFSET //Scaling Parameters F00, F01, F02, F03
+#define VIDEO2_SCALE_FACTOR_PARAMETER0_REG 0x118 + VIDEOBASE_OFFSET
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER1_REG 0x1C + VIDEOBASE_OFFSET //Scaling Parameters F10, F11, F12, F13
+#define VIDEO2_SCALE_FACTOR_PARAMETER1_REG 0x11C + VIDEOBASE_OFFSET
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER2_REG 0x20 + VIDEOBASE_OFFSET //Scaling Parameters F20, F21, F22, F23
+#define VIDEO2_SCALE_FACTOR_PARAMETER2_REG 0x120 + VIDEOBASE_OFFSET
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER3_REG 0x24 + VIDEOBASE_OFFSET //Scaling Parameters F30, F31, F32, F33
+#define VIDEO2_SCALE_FACTOR_PARAMETER3_REG 0x124 + VIDEOBASE_OFFSET
+
+#define VIDEO1_BCD_CONTROL_REG 0x2C + VIDEOBASE_OFFSET
+#define VIDEO2_BCD_CONTROL_REG 0x12C + VIDEOBASE_OFFSET
+ #define BCD_ENABLE 0x00000001 //Bit[0] Enable block change detection(BCD)
+ #define BCD_ENABLE_BIT 0
+ #define BCD_ENABLE_MASK 0x00000001
+ #define BCD_TOLERANCE 0x00010000 //Bit[23:16]
+ #define BCD_TOLERANCE_BIT 16 //flag as changed block when the video data difference greater
+ #define BCD_TOLERANCE_MASK 0x00FF0000
+
+#define VIDEO1_CAPTURE_WINDOWS_REG 0x30 + VIDEOBASE_OFFSET
+#define VIDEO2_CAPTURE_WINDOWS_REG 0x130 + VIDEOBASE_OFFSET
+ #define CAPTURE_VER_LINE 0x00000001 //Bit[10:0] Video compression vertical line total
+ #define CAPTURE_VER_LINE_BIT 0
+ #define CAPTURE_VER_LINE_MASK 0x000007FF
+ #define CAPTURE_HOR_PIXEL 0x00010000 //Bit[26:16] Video compression vertical line total
+ #define CAPTURE_HOR_PIXEL_BIT 16
+ #define CAPTURE_HOR_PIXEL_MASK 0x07FF0000
+
+#define VIDEO1_COMPRESS_WINDOWS_REG 0x34 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_WINDOWS_REG 0x134 + VIDEOBASE_OFFSET
+ #define COMPRESS_VER_LINE 0x00000001 //Bit[10:0] Video compression vertical line total
+ #define COMPRESS_VER_LINE_BIT 0
+ #define COMPRESS_VER_LINE_MASK 0x000007FF
+ #define COMPRESS_HOR_PIXEL 0x00010000 //Bit[26:16] Video compression vertical line total
+ #define COMPRESS_HOR_PIXEL_BIT 16
+ #define COMPRESS_HOR_PIXEL_MASK 0x07FF0000
+
+#define VIDEO1_COMPRESS_BUF_PROCESS_OFFSET_REG 0x38
+#define VIDEO2_COMPRESS_BUF_PROCESS_OFFSET_REG 0x138
+ #define COMPRESS_BUF_PROCESS_OFFSET_ALIGN 127 //128 byte alignment
+ #define COMPRESS_BUF_PROCESS_OFFSET_MASK 0xFFFFFF
+
+#define VIDEO1_DECOMPRESS_BUF_PROCESS_OFFSET_REG 0x38
+#define VIDEO2_DECOMPRESS_BUF_PROCESS_OFFSET_REG 0x138
+ #define DECOMPRESS_BUF_PROCESS_OFFSET_ALIGN 127 //128 byte alignment
+ #define DECOMPRESS_BUF_PROCESS_OFFSET_MASK 0xFFFFFF
+
+
+//For Compression
+#define VIDEO1_COMPRESS_BUF_READ_OFFSET_REG 0x3C + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_COMPRESS_BUF_READ_OFFSET_REG 0x13C + VIDEOBASE_OFFSET
+ #define COMPRESS_BUF_READ_OFFSET_ALIGN 127 //128 byte alignment
+ #define COMPRESS_BUF_READ_OFFSET_MASK 0x00FFFFFF
+//For Decompression
+#define VIDEO1_DECOMPRESS_BUF_WRITE_OFFSET_REG 0x3C + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_DECOMPRESS_BUF_WRITE_OFFSET_REG 0x13C + VIDEOBASE_OFFSET
+ #define DECOMPRESS_BUF_WRITE_OFFSET_ALIGN 127 //128 byte alignment
+ #define DECOMPRESS_BUF_WRITE_OFFSET_MASK 0x00FFFFFF
+
+#define VIDEO1_CRC_BUF_ADDR_REG 0x40 + VIDEOBASE_OFFSET
+#define VIDEO2_CRC_BUF_ADDR_REG 0x140 + VIDEOBASE_OFFSET
+ #define CRC_BUF_ADDR_ALIGN 7 //8 byte alignment
+ #define CRC_BUF_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEO1_BUF_1_ADDR_REG 0x44 + VIDEOBASE_OFFSET //For Source Buffer in frame mode
+#define VIDEO2_BUF_1_ADDR_REG 0x144 + VIDEOBASE_OFFSET
+ #define BUF_1_ADDR_ALIGN 255 //256 byte alignment
+ #define BUF_1_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_BUF_LINE_OFFSET_REG 0x48 + VIDEOBASE_OFFSET //Must set both in Frame/Stream mode
+#define VIDEO2_BUF_LINE_OFFSET_REG 0x148 + VIDEOBASE_OFFSET
+ #define BUF_LINE_OFFSET_ALIGN 7 //8 byte alignment
+ #define BUF_LINE_OFFSET_MASK 0x00003FFF
+
+#define VIDEO1_BUF_2_ADDR_REG 0x4C + VIDEOBASE_OFFSET //For BCD Buffer in frame mode
+#define VIDEO2_BUF_2_ADDR_REG 0x14C + VIDEOBASE_OFFSET
+ #define BUF_2_ADDR_ALIGN 255 //256 byte alignment
+ #define BUF_2_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_FLAG_BUF_ADDR_REG 0x50 + VIDEOBASE_OFFSET //For block change flag buffer
+#define VIDEO2_FLAG_BUF_ADDR_REG 0x150 + VIDEOBASE_OFFSET
+ #define FLAG_BUF_ADDR_ALIGN 7 //8 byte alignment
+ #define FLAG_BUF_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_COMPRESS_BUF_ADDR_REG 0x54 + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_COMPRESS_BUF_ADDR_REG 0x154 + VIDEOBASE_OFFSET
+ #define COMPRESS_BUF_ADDR_ALIGN 127 //128 byte alignment
+ #define COMPRESS_BUF_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_STREAM_BUF_SIZE 0x58 + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_STREAM_BUF_SIZE 0x158 + VIDEOBASE_OFFSET
+ #define STREAM_PACKET_SIZE 0x00000001
+ #define STREAM_PACKET_SIZE_BIT 0
+ #define STREAM_PACKET_SIZE_MASK 0x00000007
+ #define PACKET_SIZE_1KB 0
+ #define PACKET_SIZE_2KB 1
+ #define PACKET_SIZE_4KB 2
+ #define PACKET_SIZE_8KB 3
+ #define PACKET_SIZE_16KB 4
+ #define PACKET_SIZE_32KB 5
+ #define PACKET_SIZE_64KB 6
+ #define PACKET_SIZE_128KB 7
+ #define RING_BUF_PACKET_NUM 0x00000008
+ #define RING_BUF_PACKET_NUM_BIT 3
+ #define RING_BUF_PACKET_NUM_MASK 0x00000018
+ #define PACKETS_4 0
+ #define PACKETS_8 1
+ #define PACKETS_16 2
+ #define PACKETS_32 3
+ #define SKIP_HIGH_MB_THRES 0x00010000 //Bit[22:16] Skip high quality macro block threshold
+ #define SKIP_HIGH_MB_THRES_BIT 16
+ #define SKIP_HIGH_MB_THRES_MASK 0x007F0000
+ #define SKIP_TEST_MODE 0x00800000 //Bit[24:23] Skip test mode
+ #define SKIP_TEST_MODE_BIT 23
+ #define SKIP_TEST_MODE_MASK 0x01800000
+ #define YUV_TEST 2 //recommend
+
+#define VIDEO1_BUF_CODEC_OFFSET_READ 0x5C + VIDEOBASE_OFFSET //For stream mode,
+#define VIDEO2_BUF_CODEC_OFFSET_READ 0x15C + VIDEOBASE_OFFSET //Video stream buffer offset read back(HW)
+ #define BUF_CODEC_OFFSET_ALIGN 255 //256 byte alignment
+ #define BUF_CODEC_OFFSET_MASK 0x00FFFFFF
+
+#define VIDEO1_COMPRESS_CONTROL_REG 0x60 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_CONTROL_REG 0x160 + VIDEOBASE_OFFSET
+ #define JPEG_ONLY_ENCODE 0x00000001 //Bit[0] JPEG only encoding
+ #define JPEG_ONLY_BIT 0
+ #define JPEG_MIX_MODE 0 //Enable JPEG/VQ mix mode encoding
+ #define JPEG_ONLY_MODE 1 //JPEG encoding mode only
+ #define VQ_4_COLOR_ENCODE 0x00000002 //Bit[1] Enable 4 color VQ encoding
+ #define VQ_4_COLOR_BIT 1
+ #define VQ_1_2_COLOR_MODE 0 //1 and 2 color mode VQ encoding
+ #define VQ_4_COLOR_MODE 1 //1, 2 and 4 color VQ encoding
+ #define QUALITY_CODEC_SETTING 0x00000004 //Bit[2] High and best video quality codec mode setting
+ #define QUALITY_CODEC_SETTING_BIT 2
+ #define JPEG_CODEC_MODE 0 //not supported in best video quality mode
+ #define QUANTI_CODEC_MODE 1
+ #define JPEG_DUAL_QUALITY_EN 0x00000008 //Bit[3] JPEG dual quality mode
+ #define EN_JPEG_DUAL_QUALITY 1 //enable(only for normal video quality mode)
+ #define BEST_QUALITY_EN 0x00000010 //Bit[4] Best quality video mode enable
+ #define BEST_QUALITY_EN_BIT 4
+ #define EN_BEST_QUALITY 1 //enable(only for quantization codec mode)
+ #define RC4_CRYPT_EN 0x00000020 //Bit[5] Enable RC4 encryption/decryption
+ #define RC4_CRYPT_EN_BIT 5
+ #define RC4_CRYPT_EN_MASK 0x00000020
+ #define RC4_CRYPT_ON 1 //enable
+ #define NORMAL_QUANTI_CHROMI_TABLE 0x00000040 //Bit[10:6] Normal video quality mode JPEG DCT chromi quantination table
+ #define NORMAL_QUANTI_CHROMI_TABLE_BIT 6
+ #define NORMAL_QUANTI_CHROMI_TABLE_MASK 0x000007C0
+ #define NORMAL_QUANTI_LUMI_TABLE 0x00000800 //Bit[15:11] Normal video quality mode JPEG DCT lumi quantination table
+ #define NORMAL_QUANTI_LUMI_TABLE_BIT 11
+ #define NORMAL_QUANTI_LUMI_TABLE_MASK 0x0000F800
+ #define HIGH_QUALITY_EN 0x00010000 //Bit[16] High video quality mode enable
+ #define HIGH_QUALITY_EN_BIT 16
+ #define EN_HIGH_QUALITY 1 //Enable
+ #define UV_CIR656_FORMAT 0x00080000 //Bit[19] UV fromat
+ #define UV_CIR656_FORMAT_BIT 19
+ #define USE_UV_CIR656 1 //recommand
+ #define HUFFMAN_TABLE_SELECT 0x00100000 //Bit[20] JPEG Huffman table combination
+ #define DUAL_TABLE 0 //Dual Y, UV table
+ #define SINGLE_TABLE 1 //Single Y table
+ #define SINGLE_UV_TABLE 0x00200000 //1x: Single UV table
+ #define HIGH_QUANTI_CHROMI_TABLE 0x00400000 //Bit[26:22] High quality JPEG DCT chromi quantization table
+ #define HIGH_QUANTI_CHROMI_TABLE_BIT 22
+ #define HIGH_QUANTI_CHROMI_TABLE_MASK 0x07C00000
+ #define HIGH_DEQUANTI_VALUE 0x00400000 //Bit[26:22] High quality de-quantization value
+ #define HIGH_DEQUANTI_VALUE_BIT 22
+ #define HIGH_DEQUANTI_VALUE_MASK 0x07C00000
+ #define HIGH_QUANTI_LUMI_TABLE 0x08000000 //Bit[31:27] High quality JPEG DCT lumi quantization table
+ #define HIGH_QUANTI_LUMI_TABLE_BIT 27
+ #define HIGH_QUANTI_LUMI_TABLE_MASK 0xF8000000
+ #define BEST_DEQUANTI_VALUE 0x08000000 //Bit[31:27] Best quality de-quantization value
+ #define BEST_DEQUANTI_VALUE_BIT 27
+ #define BEST_DEQUANTI_VALUE_MASK 0xF8000000
+
+
+#define VIDEO1_QUANTI_TABLE_LOW_REG 0x64 + VIDEOBASE_OFFSET //Match with 0x60 Bit[10:6], Bit[15:11]
+#define VIDEO2_QUANTI_TABLE_LOW_REG 0x164 + VIDEOBASE_OFFSET
+ #define QUANTI_CHROMI_TABLE_LOW 0x00000001 //Bit[4:0] Normal video low quality block chromi quantization table
+ #define QUANTI_CHROMI_TABLE_LOW_BIT 0
+ #define QUANTI_CHROMI_TABLE_LOW_MASK 0x0000001F
+ #define QUANTI_LUMI_TABLE_LOW 0x00000020 //Bit[9:5] Normal video low quality block lumi quantization table
+ #define QUANTI_LUMI_TABLE_LOW_BIT 5
+ #define QUANTI_LUMI_TABLE_LOW_MASK 0x000003E0
+
+#define VIDEO1_QUANTI_VALUE_REG 0x68 + VIDEOBASE_OFFSET //Match with 0x60 Bit[26:22],Bit[31:27]
+#define VIDEO2_QUANTI_VALUE_REG 0x168 + VIDEOBASE_OFFSET
+ #define HIGH_QUANTI_VALUE 0x00000001 //Bit[14:0] High quality quantization value. Format is 1.14
+ #define HIGH_QUANTI_VALUE_BIT 0
+ #define HIGH_QUANTI_VALUE_MASK 0x00007FFF
+ #define BEST_QUANTI_VALUE 0x00010000 //Bit[30:16] Best quality quantization value. Format is 1.14
+ #define BEST_QUANTI_VALUE_BIT 16
+ #define BEST_QUANTI_VALUE_MASK 0x7FFF0000
+
+#define VIDEO1_BSD_PARA_REG 0x6C + VIDEOBASE_OFFSET //Video BSD Parameters Register
+#define VIDEO2_BSD_PARA_REG 0x16C + VIDEOBASE_OFFSET
+ #define BSD_HIGH_THRES 0x00000001 //Bit[7:0] Block sharpness detection high threshold
+ #define BSD_HIGH_THRES_BIT 0
+ #define BSD_HIGH_THRES_MASK 0x000000FF
+ #define BSD_LOW_THRES 0x00000100 //Bit[15:8] Block shaprpness detection low threshold
+ #define BSD_LOW_THRES_BIT 8
+ #define BSD_LOW_THRES_MASK 0x0000FF00
+ #define BSD_HIGH_COUNTS 0x00010000 //Bit[21:16] Block sharpness detection high counts threshold
+ #define BSD_HIGH_COUNTS_BIT 16
+ #define BSD_HIGH_COUNTS_MASK 0x003F0000
+ #define BSD_LOW_COUNTS 0x00400000 //Bit[27:22] Block sharpness detection low counts threshold
+ #define BSD_LOW_COUNTS_BIT 22
+ #define BSD_LOW_COUNTS_MASK 0x0FC00000
+
+#define VIDEO1_COMPRESS_FRAME_SIZE_REG 0x70 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_FRAME_SIZE_REG 0x170 + VIDEOBASE_OFFSET
+ #define COMPRESS_FRAME_SIZE_READ 0x00000001 //Bit[19:0] Video compression frame size read back(number of DW)
+ #define COMPRESS_FRAME_SIZE_READ_BIT 0
+ #define COMPRESS_FRAME_SIZE_READ_MASK 0x003FFFFF
+
+#define VIDEO1_COMPRESS_BLOCK_COUNT_REG 0x74 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_BLOCK_COUNT_REG 0x174 + VIDEOBASE_OFFSET
+ #define PROCESS_BLOCK_COUNT_READ_BIT 0
+ #define PROCESS_BLOCK_COUNT_READ_MASK 0x00003FFF //Bit[13:0] Video processed total block counter read back(number of blocks)
+ #define COMPRESS_BLOCK_COUNT_READ_BIT 16
+ #define COMPRESS_BLOCK_COUNT_READ_MASK 0xFFFF0000 //Bit[29:16] Video processed total block counter read back(number of blocks)
+
+#define VIDEO1_COMPRESS_FRAME_END_READ 0x78 + VIDEOBASE_OFFSET //Video compression stream frame end pointer
+#define VIDEO2_COMPRESS_FRAME_END_READ 0x178 + VIDEOBASE_OFFSET
+ #define COMPRESS_FRAME_END_READ_ALIGN 7
+ #define COMPRESS_FRAME_END_READ_MASK 0x00FFFFFF
+
+#define VIDEO1_COMPRESS_FRAME_COUNT_READ 0x7C + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_FRAME_COUNT_READ 0x17C + VIDEOBASE_OFFSET
+ #define COMPRESS_FRAME_COUNT_READ 0x00000001 //Bit[15:0] Video compression frame count read back(number of frame)
+ #define COMPRESS_FRAME_COUNT_READ_BIT 0
+ #define COMPRESS_FRAME_COUNT_READ_MASK 0xFFFFFFFF
+
+#define VIDEO1_USER_DEFINE_HEADER 0x80 + VIDEOBASE_OFFSET
+#define VIDEO2_USER_DEFINE_HEADER 0x180 + VIDEOBASE_OFFSET
+ #define USER_DEFINE_HEADER 0x00000001 //Bit[15:0] Video user defined header parameter
+ #define USER_DEFINE_HEADER_BIT 0
+ #define USER_DEFINE_HEADER_MASK 0x0000FFFF
+
+#define VIDE1_MODE_DETECTION_EDGE_H_REG 0x90 + VIDEOBASE_OFFSET
+#define VIDE2_MODE_DETECTION_EDGE_H_REG 0x190 + VIDEOBASE_OFFSET
+ #define LEFT_EDGE_LOCATION 0x00000001 //Bit[11:0] Video source left edge location from sync rising edge
+ #define LEFT_EDGE_LOCATION_BIT 0
+ #define LEFT_EDGE_LOCATION_MASK 0x00000FFF
+ #define NO_VER_SYNC (1 << 12) //Bit[12] No Vertical sync detected
+ #define NO_HOR_SYNC (1 << 13) //Bit[13] No horizontal sync detected
+ #define NO_ACTIVE_DISP (1 << 14) //Bit[14] No active display detected
+ #define NO_DISP_CLOCK (1 << 15)
+ #define RIGHT_EDGE_LOCATION 0x00010000 //Bit[27:16] Video source right edge location from sync rising edge
+ #define RIGHT_EDGE_LOCATION_BIT 16
+ #define RIGHT_EDGE_LOCATION_MASK 0x0FFF0000
+
+#define VIDE1_MODE_DETECTION_EDGE_V_REG 0x94 + VIDEOBASE_OFFSET
+#define VIDE2_MODE_DETECTION_EDGE_V_REG 0x194 + VIDEOBASE_OFFSET
+ #define TOP_EDGE_LOCATION 0x00000001 //Bit[11:0] Video source top edge location from sync rising edge
+ #define TOP_EDGE_LOCATION_BIT 0
+ #define TOP_EDGE_LOCATION_MASK 0x00000FFF
+ #define BOTTOM_EDGE_LOCATION 0x00010000 //Bit[27:16] Video source bottom edge location from sync rising edge
+ #define BOTTOM_EDGE_LOCATION_BIT 16
+ #define BOTTOM_EDGE_LOCATION_MASK 0x0FFF0000
+
+#define VIDEO1_MODE_DETECTION_STATUS_READ_REG 0x98 + VIDEOBASE_OFFSET
+#define VIDEO2_MODE_DETECTION_STATUS_READ_REG 0x198 + VIDEOBASE_OFFSET
+ #define MODE_DETECTION_HOR_TIME_READ 0x00000001 //Bit[11:0] Mode detection Horizontal time read back (read only)
+ #define MODE_DETECTION_HOR_TIME_READ_BIT 0
+ #define MODE_DETECTION_HOR_TIME_READ_MASK 0x00000FFF
+ #define ANALONG_DIGITAL_READ 0x00001000 //Bit[12] Auto detection for external analog or digital source read back
+ #define ANALONG_DIGITAL_READ_BIT 12
+ #define DVI_SIGNAL 0
+ #define ADC_SIGNAL 1
+ #define MODE_DETECTION_HOR_STABLE_READ 0x00002000 //Bit[13] Mode detection horizontal stable read back
+ #define HOR_STABLE 1
+ #define MODE_DETECTION_VER_STABLE_READ 0x00004000 //Bit[14] Mode detection vertical stable read back
+ #define VER_STABLE 1
+ #define OUT_LOCK_READ 0x00008000 //Bit[15] Mode detection out of lock read back
+ #define SIGNAL_OUT_LOCK 1
+ #define MODE_DETECTION_VER_LINE_READ 0x00010000 //Bit[27:16] Mode detection Vertical lines read back
+ #define MODE_DETECTION_VER_LINE_READ_BIT 16
+ #define MODE_DETECTION_VER_LINE_READ_MASK 0x0FFF0000
+ #define VSYNC_POLARITY_READ 0x10000000 //Bit[28] Vsync polarity read back
+ #define HSYNC_POLARITY_READ 0x20000000 //Bit[29] Hsync polarity read back
+ #define MODE_DETECTION_VSYNC_READY 0x40000000 //Bit[30] Mode detection Vsync ready
+ #define MODE_DETECTION_HSYNC_READY 0x80000000 //Bit[31] Mode detection Hsync ready
+
+/****** VIDEO MEMAGER SETTING ******/
+#define VIDEOM_ENGINE_SEQUENCE_CONTROL_REG 0x204 + VIDEOBASE_OFFSET
+ #define VIDEOM_CAPTURE_TRIGGER 0x00000002 //Bit[1] trigger HW to capture video
+ #define VIDEOM_AUTO_MODE 0x00000008 //Bit[3]
+ #define DISABLE_AUTO_MODE 0
+ #define AUTO_COMPRESS 1
+ #define VIDEOM_CODEC_TRIGGER 0x00000010 //Bit[4] trigger HW to compress or decompress video
+ #define VIDEOM_SOURCE_SELECTION 0x00000100 //Bit[8]
+ #define VIDEO1 0
+ #define VIDEO2 1
+ //#define STREAM_DATA_MODE 0x00000400 //Bit[11:10] Buffer and Stream Data type
+ // #define STREAM_DATA_MODE_BIT 10
+ // #define STREAM_DATA_MODE_MASK 0x00000C00
+ // #define YUV444_MODE 0
+ // #define YUV420_MODE 1
+ // #define YUV420_MODE_WITH_AST2000 2 //AST2000 compatible
+ #define VIDEOM_CAPTURE_READY 0x00010000 //Bit[16] Video capture ready status read back(read only)
+ //#define HW_BUSY 0
+ //#define HW_IDLE 1
+ #define VIDEOM_CODEC_READY 0x00040000 //Bit[18] Video codec ready status read back(read only)
+ //#define HW_BUSY 0
+ //#define HW_IDLE 1
+
+#define VIDEOM_SCALE_FACTOR_REG 0x214 + VIDEOBASE_OFFSET
+// #define HOR_SCALING_FACTOR 0x00000001 //Bit[15:0] Video Horizontal scaling factor
+// #define HOR_SCALING_FACTOR_BIT 0 //The formula=4096/(Horizontal scaling facotr)
+// #define HOR_SCALING_FACTOR_MASK 0x0000FFFF
+// #define VER_SCALING_FACTOR 0x00000000 //Bit[31:16] Video Vertical scaling factor
+// #define VER_SCALING_FACTOR_BIT 16 //The formula=4096/(Vertical scaling facotr)
+// #define VER_SCALING_FACTOR_MASK 0xFFFF0000
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER0_REG 0x218 + VIDEOBASE_OFFSET //Scaling Parameters F00, F01, F02, F03
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER1_REG 0x21C + VIDEOBASE_OFFSET //Scaling Parameters F10, F11, F12, F13
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER2_REG 0x220 + VIDEOBASE_OFFSET //Scaling Parameters F20, F21, F22, F23
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER3_REG 0x224 + VIDEOBASE_OFFSET //Scaling Parameters F30, F31, F32, F33
+
+#define VIDEOM_BCD_CONTROL_REG 0x22C + VIDEOBASE_OFFSET
+ //#define BCD_ENABLE 0x00000001 //Bit[0] Enable block change detection(BCD)
+ //#define BCD_TOLERANCE 0x00010000 //Bit[23:16]
+ // #define BCD_TOLERANCE_BIT 16 //flag as changed block when the video data difference greater
+ // #define BCD_TOLERANCE_MASK 0x00FF0000
+
+#define VIDEOM_CAPTURE_WINDOWS_REG 0x230 + VIDEOBASE_OFFSET
+ //#define RC4_TABLE_ADDR_ALIGN 7 //8 byte alignment
+ //#define RC4_TABLE_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_COMPRESS_WINDOWS_REG 0x234 + VIDEOBASE_OFFSET
+ //#define COMPRESS_VER_LINE 0x00000001 //Bit[12:0] Video compression vertical line total
+ //#define COMPRESS_VER_LINE_BIT 0
+ //#define COMPRESS_VER_LINE_MASK 0x00001FFF
+ //#define COMPRESS_HOR_PIXEL 0x00010000 //Bit[12:0] Video compression vertical line total
+ //#define COMPRESS_HOR_PIXEL_BIT 16
+ //#define COMPRESS_HOR_PIXEL_MASK 0x1FFF0000
+
+#define VIDEOM_COMPRESS_BUF_PROCESS_OFFSET_REG 0x238
+ //#define COMPRESS_BUF_PROCESS_OFFSET_ALIGN 127 //128 byte alignment
+ //#define COMPRESS_BUF_PROCESS_OFFSET_MASK 0x3FFFFF
+
+
+//For Compression
+#define VIDEOM_COMPRESS_BUF_READ_OFFSET_REG 0x23C + VIDEOBASE_OFFSET //For stream mode
+ //#define COMPRESS_BUF_READ_OFFSET_ALIGN 127 //128 byte alignment
+ //#define COMPRESS_BUF_READ_OFFSET_MASK 0x003FFFFF
+//For Decompression
+#define VIDEOM_DECOMPRESS_BUF_WRITE_OFFSET_REG 0x23C + VIDEOBASE_OFFSET //For stream mode
+ //#define DECOMPRESS_BUF_WRITE_OFFSET_ALIGN 127 //128 byte alignment
+ //#define DECOMPRESS_BUF_WRITE_OFFSET_MASK 0x003FFFFF
+
+#define VIDEOM_BUF_1_ADDR_REG 0x244 + VIDEOBASE_OFFSET //For Source Buffer in frame mode
+ //#define BUF_1_ADDR_ALIGN 255 //256 byte alignment
+ //#define BUF_1_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_BUF_LINE_OFFSET_REG 0x248 + VIDEOBASE_OFFSET //Must set both in Frame/Stream mode
+ //#define BUF_LINE_OFFSET_ALIGN 7 //8 byte alignment
+ //#define BUF_LINE_OFFSET_MASK 0x00003FFF
+
+#define VIDEOM_BUF_2_ADDR_REG 0x24C + VIDEOBASE_OFFSET //For BCD Buffer in frame mode
+ //#define BUF_2_ADDR_ALIGN 255 //256 byte alignment
+ //#define BUF_2_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_FLAG_BUF_ADDR_REG 0x250 + VIDEOBASE_OFFSET //For block change flag buffer
+ //#define FLAG_BUF_ADDR_ALIGN 7 //8 byte alignment
+ //#define FLAG_BUF_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_COMPRESS_BUF_ADDR_REG 0x254 + VIDEOBASE_OFFSET //For stream mode
+ //#define FLAG_BUF_ADDR_ALIGN 7 //8 byte alignment
+ //#define FLAG_BUF_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_BUF_CODEC_OFFSET_READ 0x25C + VIDEOBASE_OFFSET //For stream mode,
+ //#define BUF_CODEC_OFFSET_ALIGN 255 //256 byte alignment
+ //#define BUF_CODEC_OFFSET_MASK 0x003FFFFF
+
+#define VIDEOM_COMPRESS_CONTROL_REG 0x260 + VIDEOBASE_OFFSET
+ //#define JPEG_ONLY_ENCODE 0x00000001 //Bit[0] JPEG only encoding
+ // #define JPEG_MIX_MODE 0 //Enable JPEG/VQ mix mode encoding
+ // #define JPEG_ONLY_MODE 1 //JPEG encoding mode only
+ //#define VQ_4_COLOR_ENCODE 0x00000002 //Bit[1] Enable 4 color VQ encoding
+ // #define VQ_1_2_COLOR_MODE 0 //1 and 2 color mode VQ encoding
+ // #define VQ_4_COLOR_MODE 1 //1, 2 and 4 color VQ encoding
+ //#define QUALITY_CODEC_SETTING 0x00000004 //Bit[2] High and best video quality codec mode setting
+ // #define JPEG_CODEC_MODE 0 //not supported in best video quality mode
+ // #define QUANTI_CODEC_MODE 1
+ //#define JPEG_DUAL_QUALITY_EN 0x00000008 //Bit[3] JPEG dual quality mode
+ // #define EN_JPEG_DUAL_QUALITY 1 //enable(only for normal video quality mode)
+ //#define BEST_QUALITY_EN 0x00000010 //Bit[4] Best quality video mode enable
+ // #define EN_BEST_QUALITY 1 //enable(only for quantization codec mode)
+ //#define RC4_CRYPT_EN 0x00000020 //Bit[5] Enable RC4 encryption/decryption
+ // #define EN_RC4_CRYPT 1 //enable
+ //#define NORMAL_QUANTI_CHROMI_TABLE 0x00000040 //Bit[10:6] Normal video quality mode JPEG DCT chromi quantination table
+ // #define NORMAL_QUANTI_CHROMI_TABLE_BIT 6
+ // #define NORMAL_QUANTI_CHROMI_TABLE_MASK 0x000007C0
+ //#define NORMAL_QUANTI_LUMI_TABLE 0x00000800 //Bit[15:11] Normal video quality mode JPEG DCT lumi quantination table
+ // #define NORMAL_QUANTI_LUMI_TABLE_BIT 11
+ // #define NORMAL_QUANTI_LUMI_TABLE_MASK 0x0000F800
+ //#define HIGH_QUALITY_EN 0x00010000 //Bit[16] High video quality mode enable
+ // #define EN_HIGH_QUALITY 1 //Enable
+ //#define UV_CIR656_FORMAT 0x00080000 //Bit[19] UV fromat
+ // #define USE_UV_CIR656 1 //recommand
+ //#define HUFFMAN_TABLE_SELECT 0x00100000 //Bit[20] JPEG Huffman table combination
+ // #define DUAL_TABLE 0 //Dual Y, UV table
+ // #define SINGLE_TABLE 1 //Single Y table
+ // #define SINGLE_UV_TABLE 0x00200000 //1x: Single UV table
+ //#define HIGH_QUANTI_CHROMI_TABLE 0x00400000 //Bit[26:22] High quality JPEG DCT chromi quantization table
+ // #define HIGH_QUANTI_CHROMI_TABLE_BIT 22
+ // #define HIGH_QUANTI_CHROMI_TABLE_MASK 0x07C00000
+ //#define HIGH_DEQUANTI_VALUE 0x00400000 //Bit[26:22] High quality de-quantization value
+ // #define HIGH_DEQUANTI_VALUE_BIT 22
+ // #define HIGH_DEQUANTI_VALUE_MASK 0x07C00000
+ //#define HIGH_QUANTI_LUMI_TABLE 0x08000000 //Bit[31:27] High quality JPEG DCT lumi quantization table
+ // #define HIGH_QUANTI_LUMI_TABLE_BIT 27
+ // #define HIGH_QUANTI_LUMI_TABLE_MASK 0xF8000000
+ //#define BEST_DEQUANTI_VALUE 0x08000000 //Bit[31:27] Best quality de-quantization value
+ // #define BEST_QUANTI_VALUE_BIT 27
+ // #define BEST_QUANTI_VALUE_MASK 0xF8000000
+
+#define VIDEOM_QUANTI_TABLE_LOW_REG 0x264 + VIDEOBASE_OFFSET //Match with 0x60 Bit[10:6], Bit[15:11]
+// #define QUANTI_CHROMI_TABLE_LOW 0x00000001 //Bit[4:0] Normal video low quality block chromi quantization table
+// #define QUANTI_CHROMI_TABLE_LOW_BIT 0
+// #define QUANTI_CHROMI_TABLE_LOW_MASK 0x0000001F
+// #define QUANTI_LUMI_TABLE_LOW 0x00000020 //Bit[9:5] Normal video low quality block lumi quantization table
+// #define QUANTI_CHROMI_TABLE_LOW_BIT 5
+// #define QUANTI_CHROMI_TABLE_LOW_MASK 0x000003E0
+
+#define VIDEOM_QUANTI_VALUE_REG 0x268 + VIDEOBASE_OFFSET //Match with 0x60 Bit[26:22],Bit[31:27]
+// #define HIGH_QUANTI_VALUE 0x00000001 //Bit[14:0] High quality quantization value. Format is 1.14
+// #define HIGH_QUANTI_VALUE_BIT 0
+// #define HIGH_QUANTI_VALUE_MASK 0x00007FFF
+// #define BEST_QUANTI_VALUE 0x00010000 //Bit[30:16] Best quality quantization value. Format is 1.14
+// #define BEST_QUANTI_VALUE_BIT 16
+// #define BEST_QUANTI_VALUE_MASK 0x7FFF0000
+
+#define VIDEOM_BSD_PARA_REG 0x26C + VIDEOBASE_OFFSET //Video BSD Parameters Register
+// #define BSD_HIGH_THRES 0x00000001 //Bit[7:0] Block sharpness detection high threshold
+// #define BSD_HIGH_THRES_BIT 0
+// #define BSD_HIGH_THRES_MASK 0x000000FF
+// #define BSD_LOW_THRES 0x00000100 //Bit[15:8] Block shaprpness detection low threshold
+// #define BSD_LOW_THRES_BIT 8
+// #define BSD_LOW_THRES_MASK 0x0000FF00
+// #define BSD_HIGH_COUNTS 0x00010000 //Bit[21:16] Block sharpness detection high counts threshold
+// #define BSD_HIGH_COUNTS_BIT 16
+// #define BSD_HIGH_COUNTS_MASK 0x003F0000
+// #define BSD_LOW_COUNTS 0x01000000 //Bit[27:24] Block sharpness detection low counts threshold
+// #define BSD_LOW_COUNTS_BIT 24
+// #define BSD_LOW_COUNTS_MASK 0x3F000000
+
+#define VIDEOM_COMPRESS_FRAME_SIZE_REG 0x270 + VIDEOBASE_OFFSET
+// #define COMPRESS_FRAME_SIZE_READ 0x00000001 //Bit[19:0] Video compression frame size read back(number of DW)
+// #define COMPRESS_FRAME_SIZE_READ_BIT 0
+// #define COMPRESS_FRAME_SIZE_READ_MASK 0x000FFFFF
+
+#define VIDEOM_COMPRESS_BLOCK_COUNT_REG 0x274 + VIDEOBASE_OFFSET
+// #define COMPRESS_BLOCK_COUNT_READ 0x00000001 //Bit[15:0] Video compress block counter read back(number of blocks)
+// #define COMPRESS_BLOCK_COUNT_READ_BIT 0
+// #define COMPRESS_BLOCK_COUNT_READ_MASK 0x0000FFFF
+
+#define VIDEOM_COMPRESS_FRAME_END_READ 0x278 + VIDEOBASE_OFFSET //Video compression stream frame end pointer
+ //#define COMPRESS_FRAME_END_READ_ALIGN 7
+ //#define COMPRESS_FRAME_END_READ_MASK 0x003FFFFF
+
+#define VIDEOM_USER_DEFINE_HEADER_REG 0x280 + VIDEOBASE_OFFSET
+// #define USER_DEFINE_HEADER 0x00000001 //Bit[15:0] Video user defined header parameter
+// #define USER_DEFINE_HEADER_BIT 0
+// #define USER_DEFINE_HEADER_MASK 0x0000FFFF
+
+/****** VR300-VR3FC: General Control registers *****/
+#define VIDEO_CONTROL_REG 0x300 + VIDEOBASE_OFFSET
+ #define CODEC_DECOMPRESS_MODE 0x00000001 //Bit[0] Codec in de-compression mode
+ #define CODEC_DECOMPRESS_MODE_BIT 0
+ #define CODEC_DECOMPRESS_MODE_MASK 0x00000001
+ #define COMPRESS_MODE 0
+ #define DECOMPRESS_MODE 1
+ #define VIDEO_SAFE_MODE 0x00000002 //Bit[1] VIDEO SAFE MODE
+ #define VIDEO_SAFE_MODE_BIT 1
+ #define VIDEO_SAFE_MODE_OFF 0
+ #define VIDEO_SAFE_MODE_ON 1
+ #define DELAY_VSYNC 0x00000004 //Bit[2] Delay Internal VSYNC
+ #define DELAY_VSYNC_BIT 2
+ #define DELAY_VSYNC_MASK (1<<2)
+ #define DELAY_VSYNC_OFF (0<<2)
+ #define DELAY_VSYNC_EN (1<<2)
+ #define VER_DOWNSCALING_LINE_BUFFER_EN 0x00000010 //Bit[5:4] Video vertical downscaling line buffer enable
+ #define VER_LINE_BUFFER_MASK (3<<4)
+ #define LINE_BUFFER_OFF (0<<4)
+ #define LINE_BUFFER_VIDEO1 1
+ #define LINE_BUFFER_VIDEO2 2
+ #define LINE_BUFFER_VIDEOM 3
+ #define RC4_KEY_BUFFER_SELECTION (1UL<<6) //Bit[7:6] RC4 Key Buffer Selection
+ #define RC4_KEY_BUFFER_SELECTION_BIT 6
+ #define RC4_KEY_BUFFER_SELECTION_MASK (3UL<<6)
+ #define RC4_KEY_BUFFER_VIDEO1 0
+ #define RC4_KEY_BUFFER_VIDEO2 1
+ #define RC4_KEY_BUFFER_VIDEOM 2
+ #define RC4_INIT_RESET (1UL<<8) //Bit[8] RC4 initial reset
+ #define RC4_INIT_RESET_BIT 8
+ #define RC4_INIT_RESET_MASK (1UL<<8)
+ #define RC4_NORMAL_MODE 0
+ #define RC4_RESET_COUNTER 1
+ #define RC4_TEST_MODE (1UL<<9) //Bit[9] RC4 test mode
+ #define RC4_TEST_MODE_BIT 9
+ #define RC4_TEST_OFF 0
+ #define RC4_TEST_ON 1
+ #define RC4_SAVE_MODE (1UL<<14) //Bit[14] RC4 save mode
+ #define RC4_SAVE_MODE_BIT 14
+ #define RC4_SAVE_MODE_MASK (1UL<<14)
+ #define RC4_SAVE_MODE_OFF 0
+ #define RC4_SAVE_MODE_ON 1
+ #define RC4_NO_RESET_FRAME (1UL<<15) //Bit[15] RC4 no reset when frame completed
+ #define RC4_NO_RESET_FRAME_BIT 15
+ #define RC4_NO_RESET_FRAME_MASK (1UL<<15)
+ #define RC4_NO_RESET_FRAME_OFF 0 //Always reset
+ #define RC4_NO_RESET_FRAME_ON 1
+
+#define VIDEO_INT_CONTROL_EN_REG 0x304 + VIDEOBASE_OFFSET
+ #define VIDEO1_WATCH_DOG_INT_EN 0x00000001 //Bit[0] Enable Video1 mode detection watch dog out of lock interrupt
+ #define VIDEO1_INPUT_COMPLETE_INT_EN 0x00000002 //Bit[1] Enable Video1 video input complete interrupt (frame complete only for frame mode)
+ #define VIDEO1_PACKET_READY_INT_EN 0x00000004 //Bit[2] Enable Video1 packet ready interrupt
+ #define VIDEO1_COMPRESS_COMPLETE_INT_EN 0x00000008 //Bit[3] Enable Video1 compression complete interrupt
+ #define VIDEO1_MODE_DETECTION_READY_INT_EN 0x00000010 //Bit[4] Enable video1 mode detection ready interrupt
+ #define VIDEO1_FRAME_COMPLETE_INT_EN 0x00000020 //Bit[5] Enable Video1 frame complete interrupt (only for stream mode)
+ #define VIDEO1_STREAM_ERR_INT_EN 0x00000040 //Bit[6] Enable Video1 decode stream error interrupt
+ #define VIDEO2_WATCH_DOG_INT_EN 0x00000100 //Bit[8] Enable Video2 mode detection watch dog out of lock interrupt
+ #define VIDEO2_INPUT_COMPLETE_INT_EN 0x00000200 //Bit[9] Enable Video2 video input complete interrupt (frame complete only for frame mode)
+ #define VIDEO2_PACKET_READY_INT_EN 0x00000400 //Bit[10] Enable Video2 packet ready interrupt
+ #define VIDEO2_COMPRESS_COMPLETE_INT_EN 0x00000800 //Bit[11] Enable Video2 compression complete interrupt
+ #define VIDEO2_MODE_DETECTION_READY_INT_EN 0x00001000 //Bit[12] Enable video2 mode detection ready interrupt
+ #define VIDEO2_FRAME_COMPLETE_INT_EN 0x00002000 //Bit[13] Enable Video2 frame complete interrupt (only for stream mode)
+ #define VIDEO2_STREAM_ERR_INT_EN 0x00004000 //Bit[14] Enable Video2 decode stream error interrupt
+ #define VIDEOM_INPUT_COMPLETE_INT_EN 0x00010000 //Bit[16] Enable VideoM video input complete interrupt
+ #define VIDEOM_COMPRESS_COMPLETE_INT_EN 0x00020000 //Bit[17] Enable VideoM compression complete interrupt
+ #define VIDEOM_PACKET_READY_INT_EN 0x00040000 //Bit[18] Enable VideoM packet ready interrupt
+ #define VIDEOM_FRAME_COMPLETE_INT_EN 0x00080000 //Bit[19] Enable VideoM frame complete interrupt (only for stream mode)
+
+#define VIDEO_INT_CONTROL_READ_REG 0x308 + VIDEOBASE_OFFSET //Clear when write 1
+ #define VIDEO1_WATCH_DOG_READ 0x00000001 //Bit[0] Video1 mode detection watch dog out of lock interrupt status read back
+ #define VIDEO1_WATCH_DOG_BIT 0
+ #define VIDEO1_WATCH_DOG_MASK 0x00000001
+ #define VIDEO1_INPUT_COMPLETE_READ 0x00000002 //Bit[1] Video1 video input complete interrupt status read back (frame complete only for frame mode)
+ #define VIDEO1_INPUT_COMPLETE_BIT 1
+ #define VIDEO1_INPUT_COMPLETE_MASK 0x00000002
+ #define VIDEO1_PACKET_READY_READ 0x00000004 //Bit[2] Video1 packet ready interrupt status read back
+ #define VIDEO1_PACKET_READY_BIT 2
+ #define VIDEO1_PACKET_READY_MASK 0x00000004
+ #define VIDEO1_COMPRESS_COMPLETE_READ 0x00000008 //Bit[3] Video1 compression complete interrupt status read back
+ #define VIDEO1_COMPRESS_COMPLETE_BIT 3
+ #define VIDEO1_COMPRESS_COMPLETE_MASK 0x00000008
+ #define VIDEO1_MODE_DETECTION_READY_READ 0x00000010 //Bit[4] Video1 mode detection ready interrupt status read back
+ #define VIDEO1_MODE_DETECTION_READY_BIT 4
+ #define VIDEO1_FRAME_COMPLETE_READ 0x00000020 //Bit[5] Video1 frame complete interrupt status read back
+ #define VIDEO1_FRAME_COMPLETE_BIT 5
+ #define VIDEO1_FRAME_COMPLETE_MASK 0x00000020
+ #define VIDEO1_STREAM_ERR_READ 0x00000040 //Bit[6] Video1 decode stream error interrupt status read back
+ #define VIDEO1_STREAM_ERR_BIT 6
+ #define VIDEO1_STREAM_ERR_MASK 0x00000040
+ #define VIDEO2_WATCH_DOG_READ 0x00000100 //Bit[8] Video2 mode detection watch dog out of lock interrupt status read back
+ #define VIDEO2_WATCH_DOG_BIT 8
+ #define VIDEO2_WATCH_DOG_MASK 0x00000100
+ #define VIDEO2_INPUT_COMPLETE_READ 0x00000200 //Bit[9] Video2 video input complete interrupt status read back (frame complete only for frame mode)
+ #define VIDEO2_INPUT_COMPLETE_BIT 9
+ #define VIDEO2_INPUT_COMPLETE_MASK 0x00000200
+ #define VIDEO2_PACKET_READY_READ 0x00000400 //Bit[10] Video2 packet ready interrupt status read back
+ #define VIDEO2_PACKET_READY_BIT 10
+ #define VIDEO2_PACKET_READY_MASK 0x00000400
+ #define VIDEO2_COMPRESS_COMPLETE_READ 0x00000800 //Bit[11] Video2 compression complete interrupt status read back
+ #define VIDEO2_COMPRESS_COMPLETE_BIT 11
+ #define VIDEO2_COMPRESS_COMPLETE_MASK 0x00000800
+ #define VIDEO2_MODE_DETECTION_READY_READ 0x00001000 //Bit[12] Video2 mode detection ready interrupt status read back
+ #define VIDEO2_MODE_DETECTION_READY_BIT 12
+ #define VIDEO2_FRAME_COMPLETE_READ 0x00002000 //Bit[13] Video2 frame complete interrupt status read back
+ #define VIDEO2_FRAME_COMPLETE_BIT 13
+ #define VIDEO2_FRAME_COMPLETE_MASK 0x00002000
+ #define VIDEO2_STREAM_ERR_READ 0x00004000 //Bit[14] Video2 decode stream error interrupt status read back
+ #define VIDEO2_STREAM_ERR_BIT 14
+ #define VIDEO2_STREAM_ERR_MASK 0x00004000
+ //need check spec
+ #define VIDEOM_INPUT_COMPLETE_READ 0x00010000 //Bit[16] VideoM video input complete interrupt status read back
+ #define VIDEOM_INPUT_COMPLETE_BIT 16
+ #define VIDEOM_INPUT_COMPLETE_MASK 0x00010000
+ #define VIDEOM_COMPRESS_COMPLETE_READ 0x00020000 //Bit[17] VideoM compression complete interrupt status read back
+ #define VIDEOM_COMPRESS_COMPLETE_BIT 17
+ #define VIDEOM_COMPRESS_COMPLETE_MASK 0x00020000
+ #define VIDEOM_PACKET_READY_READ 0x00040000 //Bit[18] Clear Packet ready interrupt when write 1
+ #define VIDEOM_PACKET_READY_BIT 18
+ #define VIDEOM_PACKET_READY_MASK 0x00040000
+ #define VIDEOM_FRAME_COMPLETE_READ 0x00080000 //Bit[19] Clear Frame complete interrupt when write 1
+ #define VIDEOM_FRAME_COMPLETE_BIT 19
+ #define VIDEOM_FRAME_COMPLETE_MASK 0x00080000
+
+#define VIDEO_INT_CONTROL_CLEAR_REG 0x308 + VIDEOBASE_OFFSET //Clear when write 1
+ //Clear when write 1
+ #define VIDEO1_WATCH_DOG_CLEAR 0x00000001 //Bit[0] Clear mode detection watch dog out of lock interrupt when write 1
+ #define VIDEO1_INPUT_COMPLETE_CLEAR 0x00000002 //Bit[1] Clear video input complete interrupt when write 1 (frame complete only for frame mode)
+ #define VIDEO1_PACKET_READY_CLEAR 0x00000004 //Bit[2] Clear Packet ready interrupt when write 1
+ #define VIDEO1_PACKET_READY_CLEAR_BIT 2
+ #define VIDEO1_PACKET_READY_CLEAR_MASK 0x00000004
+ #define VIDEO1_COMPRESS_COMPLETE_CLEAR 0x00000008 //Bit[3] Clear video compression interrupt when write 1
+ #define VIDEO1_MODE_DETECTION_READY_CLEAR 0x00000010 //Bit[4] Clear Video1 Mode detection ready interrupt when write 1
+ #define VIDEO1_FRAME_COMPLETE_CLEAR 0x00000020 //Bit[5] Clear Frame complete interrupt when write 1
+ #define VIDEO1_FRAME_COMPLETE_CLEAR_BIT 5
+ #define VIDEO1_FRAME_COMPLETE_CLEAR_MASK 0x00000020
+ #define VIDEO1_STREAM_ERR_CLEAR 0x00000040 //Bit[6] Clear decode stream error interrupt when write 1
+ #define VIDEO2_WATCH_DOG_CLEAR 0x00000100 //Bit[8] Clear Mode detection interrupt when write 1
+ #define VIDEO2_INPUT_COMPLETE_CLEAR 0x00000200 //Bit[9] Clear video input complete interrupt when write 1
+ #define VIDEO2_PACKET_READY_CLEAR 0x00000400 //Bit[10] Clear packet ready interrupt when write 1
+ #define VIDEO2_COMPRESS_COMPLETE_CLEAR 0x00000800 //Bit[11] Clear video compression complete interrupt when write 1
+ #define VIDEO2_MODE_DETECTION_READY_CLEAR 0x00001000 //Bit[12] Clear Video2 Mode detection ready interrupt when write 1
+ #define VIDEO2_FRAME_COMPLETE_CLEAR 0x00002000 //Bit[13] Clear Frame complete interrupt when write 1 (frame complete only for frame mode)
+ #define VIDEO2_STREAM_ERR_CLEAR 0x00004000 //Bit[14] Clear Decode stream error interrupt when write 1
+ //need check spec
+ #define VIDEOM_INPUT_COMPLETE_CLEAR 0x00010000 //Bit[16] Clear video input complete interrupt when write 1
+ #define VIDEOM_COMPRESS_COMPLETE_CLEAR 0x00020000 //Bit[17] Clear compression complete interrupt when write 1
+ #define VIDEOM_COMPRESS_COMPLETE_CLEAR_BIT 17
+ #define VIDEOM_COMPRESS_COMPLETE_CLEAR_MASK 0x00020000
+ #define VIDEOM_PACKET_READY_CLEAR 0x00040000 //Bit[18] Clear compression complete interrupt when write 1
+ #define VIDEOM_PACKET_READY_CLEAR_BIT 18
+ #define VIDEOM_PACKET_READY_CLEAR_MASK 0x00040000
+ #define VIDEOM_FRAME_COMPLETE_CLEAR 0x00100000 //Bit[20] Clear Frame complete interrupt when write 1
+ #define VIDEOM_FRAME_COMPLETE_CLEAR_BIT 20
+ #define VIDEOM_FRAME_COMPLETE_CLEAR_MASK 0x00100000
+ #define VIDEOM_STREAM_ERR_CLEAR 0x00200000 //Bit[21] Clear decode stream error interrupt when write 1
+
+#define VIDEO_MODE_DETECTION_PARAM_REG 0x30C + VIDEOBASE_OFFSET
+ #define EDGE_PIXEL_THRES_BIT 8 //Bit[15:8] Mode detection edge pixel threshold
+ #define EDGE_PIXEL_THRES_MASK 0x0000FF00
+ #define VER_STABLE_MAX_BIT 16 //Bit[19:16] Mode detection vertical stable maximum
+ #define VER_STABLE_MAX_BIT_MASK 0x000F0000
+ #define HOR_STABLE_MAX_BIT 20 //Bit[23:20] Mode detection horizontal stable maximum
+ #define HOR_STABLE_MAX_BIT_MASK 0x00F00000
+ #define VER_STABLE_THRES_BIT 24 //Bit[27:24] Mode detection vertical stable threshold
+ #define VER_STABLE_THRES_BIT_MASK 0x0F000000
+ #define HOR_STABLE_THRES_BIT 28 //Bit[31:28] Mode detection horizontal stable threshold
+ #define HOR_STABLE_THRES_BIT_MASK 0xF0000000
+
+#define VIDEO_CRC_PRIMARY_REG 0x320 + VIDEOBASE_OFFSET
+ #define CRC_CHECK_EN 0x00000001 //Bit[0] Video port 1/2 Enable video capture write CRC check
+ #define CRC_CHECK_EN_BIT 0
+ #define CRC_CHECK_HIGH 0x00000002 //Bit[1] Video port 1/2 CRC check high bit only
+ #define CRC_CHECK_HIGH_BIT 1
+ #define SKIP_COUNT_MAX 0x00000004 //Bit[7:2] Video port 1/2 Max capture write skip count
+ #define SKIP_COUNT_MAX_BIT 2
+ #define SKIP_COUNT_MAX_MASK 0x000000FC
+ #define CRC_PRIMARY_POLY_LOW 0x00000100 //Bit[15:8] Primary CRC low 8-bit polynomial
+ #define CRC_RIMARY_POLY_LOW_BIT 8
+ #define CRC_RIMARY_POLY_LOW_MASK 0x0000FF00
+ #define CRC_PRIMARY_POLY_HIGH 0x00010000 //Bit[31:16] Primary CRC high 8-bit polynomial
+ #define CRC_RIMARY_POLY_HIGH_BIT 16
+ #define CRC_RIMARY_POLY_HIGH_MASK 0xFFFF0000
+
+
+#define VIDEO_CRC_SECOND_REG 0x324 + VIDEOBASE_OFFSET
+ #define CRC_SECOND_POLY_LOW 0x00000100 //Bit[15:8] Secondary CRC low 8-bit polynomial
+ #define CRC_SECOND_POLY_LOW_BIT 8
+ #define CRC_SECOND_POLY_LOW_MASK 0x0000FF00
+ #define CRC_SECOND_POLY_HIGH 0x00010000 //Bit[31:16] Secondary CRC high 8-bit polynomial
+ #define CRC_SECOND_POLY_HIGH_BIT 16
+ #define CRC_SECOND_POLY_HIGH_MASK 0xFFFF0000
+
+#define VIDEO1_RC4_KEYS_REG 0x400 + VIDEOBASE_OFFSET //Total Video1 RC4 Keys
+#define VIDEO2_RC4_KEYS_REG 0x500 + VIDEOBASE_OFFSET //Total Video2 RC4 Keys
+#define VIDEOM_RC4_KEYS_REG 0x600 + VIDEOBASE_OFFSET //Total VideoM RC4 Keys
+
+#endif /* end of _VREG_H_ */
+
diff --git a/board/aspeed/ast2400/Makefile b/board/aspeed/ast2400/Makefile
new file mode 100644
index 0000000..1970ea1
--- /dev/null
+++ b/board/aspeed/ast2400/Makefile
@@ -0,0 +1,44 @@
+# 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
+#
+
+include $(TOPDIR)/config.mk
+
+LIB = $(obj)lib$(BOARD).a
+
+COBJS := ast2400.o flash.o flash_spi.o pci.o crc32.o slt.o regtest.o vfun.o vhace.o crt.o videotest.o mactest.o hactest.o mictest.o
+
+ifeq ($(CONFIG_FPGA_ASPEED),y)
+SOBJS := platform_fpga.o
+else ifeq ($(CONFIG_SLT_ASPEED),y)
+SOBJS := platform_slt.o
+else
+SOBJS := platform.o
+endif
+
+SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS := $(addprefix $(obj),$(COBJS))
+SOBJS := $(addprefix $(obj),$(SOBJS))
+
+$(LIB): $(obj).depend $(OBJS) $(SOBJS)
+ $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+ rm -f $(SOBJS) $(OBJS)
+
+distclean: clean
+ rm -f $(LIB) core *.bak $(obj).depend
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude .depend
+
+#########################################################################
diff --git a/board/aspeed/ast2400/aes.c b/board/aspeed/ast2400/aes.c
new file mode 100755
index 0000000..76262e7
--- /dev/null
+++ b/board/aspeed/ast2400/aes.c
@@ -0,0 +1,579 @@
+/*
+ * AES implementation
+ *
+ * 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
+ */
+
+/* uncomment the following line to run the test suite */
+
+/* #define TEST */
+
+/* uncomment the following line to use pre-computed tables */
+/* otherwise the tables will be generated at the first run */
+
+#define FIXED_TABLES
+
+#ifndef FIXED_TABLES
+
+/* forward S-box & tables */
+
+uint32 FSb[256];
+uint32 FT0[256];
+uint32 FT1[256];
+uint32 FT2[256];
+uint32 FT3[256];
+
+/* reverse S-box & tables */
+
+uint32 RSb[256];
+uint32 RT0[256];
+uint32 RT1[256];
+uint32 RT2[256];
+uint32 RT3[256];
+
+/* round constants */
+
+uint32 RCON[10];
+
+/* tables generation flag */
+
+int do_init = 1;
+
+/* tables generation routine */
+
+#define ROTR8(x) ( ( ( x << 24 ) & 0xFFFFFFFF ) | \
+ ( ( x & 0xFFFFFFFF ) >> 8 ) )
+
+#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
+#define MUL(x,y) ( ( x && y ) ? pow[(log[x] + log[y]) % 255] : 0 )
+
+void aes_gen_tables( void )
+{
+ int i;
+ uint8 x, y;
+ uint8 pow[256];
+ uint8 log[256];
+
+ /* compute pow and log tables over GF(2^8) */
+
+ for( i = 0, x = 1; i < 256; i++, x ^= XTIME( x ) )
+ {
+ pow[i] = x;
+ log[x] = i;
+ }
+
+ /* calculate the round constants */
+
+ for( i = 0, x = 1; i < 10; i++, x = XTIME( x ) )
+ {
+ RCON[i] = (uint32) x << 24;
+ }
+
+ /* generate the forward and reverse S-boxes */
+
+ FSb[0x00] = 0x63;
+ RSb[0x63] = 0x00;
+
+ for( i = 1; i < 256; i++ )
+ {
+ x = pow[255 - log[i]];
+
+ y = x; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y; y = ( y << 1 ) | ( y >> 7 );
+ x ^= y ^ 0x63;
+
+ FSb[i] = x;
+ RSb[x] = i;
+ }
+
+ /* generate the forward and reverse tables */
+
+ for( i = 0; i < 256; i++ )
+ {
+ x = (unsigned char) FSb[i]; y = XTIME( x );
+
+ FT0[i] = (uint32) ( x ^ y ) ^
+ ( (uint32) x << 8 ) ^
+ ( (uint32) x << 16 ) ^
+ ( (uint32) y << 24 );
+
+ FT0[i] &= 0xFFFFFFFF;
+
+ FT1[i] = ROTR8( FT0[i] );
+ FT2[i] = ROTR8( FT1[i] );
+ FT3[i] = ROTR8( FT2[i] );
+
+ y = (unsigned char) RSb[i];
+
+ RT0[i] = ( (uint32) MUL( 0x0B, y ) ) ^
+ ( (uint32) MUL( 0x0D, y ) << 8 ) ^
+ ( (uint32) MUL( 0x09, y ) << 16 ) ^
+ ( (uint32) MUL( 0x0E, y ) << 24 );
+
+ RT0[i] &= 0xFFFFFFFF;
+
+ RT1[i] = ROTR8( RT0[i] );
+ RT2[i] = ROTR8( RT1[i] );
+ RT3[i] = ROTR8( RT2[i] );
+ }
+}
+
+#else
+
+/* forward S-box */
+
+static const uint32 FSb[256] =
+{
+ 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
+ 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
+ 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
+ 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
+ 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
+ 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
+ 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
+ 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
+ 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
+ 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
+ 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
+ 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
+ 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
+ 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
+ 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
+ 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
+ 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
+};
+
+/* forward tables */
+
+#define FT \
+\
+ V(C6,63,63,A5), V(F8,7C,7C,84), V(EE,77,77,99), V(F6,7B,7B,8D), \
+ V(FF,F2,F2,0D), V(D6,6B,6B,BD), V(DE,6F,6F,B1), V(91,C5,C5,54), \
+ V(60,30,30,50), V(02,01,01,03), V(CE,67,67,A9), V(56,2B,2B,7D), \
+ V(E7,FE,FE,19), V(B5,D7,D7,62), V(4D,AB,AB,E6), V(EC,76,76,9A), \
+ V(8F,CA,CA,45), V(1F,82,82,9D), V(89,C9,C9,40), V(FA,7D,7D,87), \
+ V(EF,FA,FA,15), V(B2,59,59,EB), V(8E,47,47,C9), V(FB,F0,F0,0B), \
+ V(41,AD,AD,EC), V(B3,D4,D4,67), V(5F,A2,A2,FD), V(45,AF,AF,EA), \
+ V(23,9C,9C,BF), V(53,A4,A4,F7), V(E4,72,72,96), V(9B,C0,C0,5B), \
+ V(75,B7,B7,C2), V(E1,FD,FD,1C), V(3D,93,93,AE), V(4C,26,26,6A), \
+ V(6C,36,36,5A), V(7E,3F,3F,41), V(F5,F7,F7,02), V(83,CC,CC,4F), \
+ V(68,34,34,5C), V(51,A5,A5,F4), V(D1,E5,E5,34), V(F9,F1,F1,08), \
+ V(E2,71,71,93), V(AB,D8,D8,73), V(62,31,31,53), V(2A,15,15,3F), \
+ V(08,04,04,0C), V(95,C7,C7,52), V(46,23,23,65), V(9D,C3,C3,5E), \
+ V(30,18,18,28), V(37,96,96,A1), V(0A,05,05,0F), V(2F,9A,9A,B5), \
+ V(0E,07,07,09), V(24,12,12,36), V(1B,80,80,9B), V(DF,E2,E2,3D), \
+ V(CD,EB,EB,26), V(4E,27,27,69), V(7F,B2,B2,CD), V(EA,75,75,9F), \
+ V(12,09,09,1B), V(1D,83,83,9E), V(58,2C,2C,74), V(34,1A,1A,2E), \
+ V(36,1B,1B,2D), V(DC,6E,6E,B2), V(B4,5A,5A,EE), V(5B,A0,A0,FB), \
+ V(A4,52,52,F6), V(76,3B,3B,4D), V(B7,D6,D6,61), V(7D,B3,B3,CE), \
+ V(52,29,29,7B), V(DD,E3,E3,3E), V(5E,2F,2F,71), V(13,84,84,97), \
+ V(A6,53,53,F5), V(B9,D1,D1,68), V(00,00,00,00), V(C1,ED,ED,2C), \
+ V(40,20,20,60), V(E3,FC,FC,1F), V(79,B1,B1,C8), V(B6,5B,5B,ED), \
+ V(D4,6A,6A,BE), V(8D,CB,CB,46), V(67,BE,BE,D9), V(72,39,39,4B), \
+ V(94,4A,4A,DE), V(98,4C,4C,D4), V(B0,58,58,E8), V(85,CF,CF,4A), \
+ V(BB,D0,D0,6B), V(C5,EF,EF,2A), V(4F,AA,AA,E5), V(ED,FB,FB,16), \
+ V(86,43,43,C5), V(9A,4D,4D,D7), V(66,33,33,55), V(11,85,85,94), \
+ V(8A,45,45,CF), V(E9,F9,F9,10), V(04,02,02,06), V(FE,7F,7F,81), \
+ V(A0,50,50,F0), V(78,3C,3C,44), V(25,9F,9F,BA), V(4B,A8,A8,E3), \
+ V(A2,51,51,F3), V(5D,A3,A3,FE), V(80,40,40,C0), V(05,8F,8F,8A), \
+ V(3F,92,92,AD), V(21,9D,9D,BC), V(70,38,38,48), V(F1,F5,F5,04), \
+ V(63,BC,BC,DF), V(77,B6,B6,C1), V(AF,DA,DA,75), V(42,21,21,63), \
+ V(20,10,10,30), V(E5,FF,FF,1A), V(FD,F3,F3,0E), V(BF,D2,D2,6D), \
+ V(81,CD,CD,4C), V(18,0C,0C,14), V(26,13,13,35), V(C3,EC,EC,2F), \
+ V(BE,5F,5F,E1), V(35,97,97,A2), V(88,44,44,CC), V(2E,17,17,39), \
+ V(93,C4,C4,57), V(55,A7,A7,F2), V(FC,7E,7E,82), V(7A,3D,3D,47), \
+ V(C8,64,64,AC), V(BA,5D,5D,E7), V(32,19,19,2B), V(E6,73,73,95), \
+ V(C0,60,60,A0), V(19,81,81,98), V(9E,4F,4F,D1), V(A3,DC,DC,7F), \
+ V(44,22,22,66), V(54,2A,2A,7E), V(3B,90,90,AB), V(0B,88,88,83), \
+ V(8C,46,46,CA), V(C7,EE,EE,29), V(6B,B8,B8,D3), V(28,14,14,3C), \
+ V(A7,DE,DE,79), V(BC,5E,5E,E2), V(16,0B,0B,1D), V(AD,DB,DB,76), \
+ V(DB,E0,E0,3B), V(64,32,32,56), V(74,3A,3A,4E), V(14,0A,0A,1E), \
+ V(92,49,49,DB), V(0C,06,06,0A), V(48,24,24,6C), V(B8,5C,5C,E4), \
+ V(9F,C2,C2,5D), V(BD,D3,D3,6E), V(43,AC,AC,EF), V(C4,62,62,A6), \
+ V(39,91,91,A8), V(31,95,95,A4), V(D3,E4,E4,37), V(F2,79,79,8B), \
+ V(D5,E7,E7,32), V(8B,C8,C8,43), V(6E,37,37,59), V(DA,6D,6D,B7), \
+ V(01,8D,8D,8C), V(B1,D5,D5,64), V(9C,4E,4E,D2), V(49,A9,A9,E0), \
+ V(D8,6C,6C,B4), V(AC,56,56,FA), V(F3,F4,F4,07), V(CF,EA,EA,25), \
+ V(CA,65,65,AF), V(F4,7A,7A,8E), V(47,AE,AE,E9), V(10,08,08,18), \
+ V(6F,BA,BA,D5), V(F0,78,78,88), V(4A,25,25,6F), V(5C,2E,2E,72), \
+ V(38,1C,1C,24), V(57,A6,A6,F1), V(73,B4,B4,C7), V(97,C6,C6,51), \
+ V(CB,E8,E8,23), V(A1,DD,DD,7C), V(E8,74,74,9C), V(3E,1F,1F,21), \
+ V(96,4B,4B,DD), V(61,BD,BD,DC), V(0D,8B,8B,86), V(0F,8A,8A,85), \
+ V(E0,70,70,90), V(7C,3E,3E,42), V(71,B5,B5,C4), V(CC,66,66,AA), \
+ V(90,48,48,D8), V(06,03,03,05), V(F7,F6,F6,01), V(1C,0E,0E,12), \
+ V(C2,61,61,A3), V(6A,35,35,5F), V(AE,57,57,F9), V(69,B9,B9,D0), \
+ V(17,86,86,91), V(99,C1,C1,58), V(3A,1D,1D,27), V(27,9E,9E,B9), \
+ V(D9,E1,E1,38), V(EB,F8,F8,13), V(2B,98,98,B3), V(22,11,11,33), \
+ V(D2,69,69,BB), V(A9,D9,D9,70), V(07,8E,8E,89), V(33,94,94,A7), \
+ V(2D,9B,9B,B6), V(3C,1E,1E,22), V(15,87,87,92), V(C9,E9,E9,20), \
+ V(87,CE,CE,49), V(AA,55,55,FF), V(50,28,28,78), V(A5,DF,DF,7A), \
+ V(03,8C,8C,8F), V(59,A1,A1,F8), V(09,89,89,80), V(1A,0D,0D,17), \
+ V(65,BF,BF,DA), V(D7,E6,E6,31), V(84,42,42,C6), V(D0,68,68,B8), \
+ V(82,41,41,C3), V(29,99,99,B0), V(5A,2D,2D,77), V(1E,0F,0F,11), \
+ V(7B,B0,B0,CB), V(A8,54,54,FC), V(6D,BB,BB,D6), V(2C,16,16,3A)
+
+#define V(a,b,c,d) 0x##a##b##c##d
+static const uint32 FT0[256] = { FT };
+#undef V
+
+#define V(a,b,c,d) 0x##d##a##b##c
+static const uint32 FT1[256] = { FT };
+#undef V
+
+#define V(a,b,c,d) 0x##c##d##a##b
+static const uint32 FT2[256] = { FT };
+#undef V
+
+#define V(a,b,c,d) 0x##b##c##d##a
+static const uint32 FT3[256] = { FT };
+#undef V
+
+#undef FT
+
+/* reverse S-box */
+
+static const uint32 RSb[256] =
+{
+ 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
+ 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
+ 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
+ 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
+ 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
+ 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
+ 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
+ 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
+ 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
+ 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
+ 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
+ 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
+ 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
+ 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
+ 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
+ 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
+};
+
+/* reverse tables */
+
+#define RT \
+\
+ V(51,F4,A7,50), V(7E,41,65,53), V(1A,17,A4,C3), V(3A,27,5E,96), \
+ V(3B,AB,6B,CB), V(1F,9D,45,F1), V(AC,FA,58,AB), V(4B,E3,03,93), \
+ V(20,30,FA,55), V(AD,76,6D,F6), V(88,CC,76,91), V(F5,02,4C,25), \
+ V(4F,E5,D7,FC), V(C5,2A,CB,D7), V(26,35,44,80), V(B5,62,A3,8F), \
+ V(DE,B1,5A,49), V(25,BA,1B,67), V(45,EA,0E,98), V(5D,FE,C0,E1), \
+ V(C3,2F,75,02), V(81,4C,F0,12), V(8D,46,97,A3), V(6B,D3,F9,C6), \
+ V(03,8F,5F,E7), V(15,92,9C,95), V(BF,6D,7A,EB), V(95,52,59,DA), \
+ V(D4,BE,83,2D), V(58,74,21,D3), V(49,E0,69,29), V(8E,C9,C8,44), \
+ V(75,C2,89,6A), V(F4,8E,79,78), V(99,58,3E,6B), V(27,B9,71,DD), \
+ V(BE,E1,4F,B6), V(F0,88,AD,17), V(C9,20,AC,66), V(7D,CE,3A,B4), \
+ V(63,DF,4A,18), V(E5,1A,31,82), V(97,51,33,60), V(62,53,7F,45), \
+ V(B1,64,77,E0), V(BB,6B,AE,84), V(FE,81,A0,1C), V(F9,08,2B,94), \
+ V(70,48,68,58), V(8F,45,FD,19), V(94,DE,6C,87), V(52,7B,F8,B7), \
+ V(AB,73,D3,23), V(72,4B,02,E2), V(E3,1F,8F,57), V(66,55,AB,2A), \
+ V(B2,EB,28,07), V(2F,B5,C2,03), V(86,C5,7B,9A), V(D3,37,08,A5), \
+ V(30,28,87,F2), V(23,BF,A5,B2), V(02,03,6A,BA), V(ED,16,82,5C), \
+ V(8A,CF,1C,2B), V(A7,79,B4,92), V(F3,07,F2,F0), V(4E,69,E2,A1), \
+ V(65,DA,F4,CD), V(06,05,BE,D5), V(D1,34,62,1F), V(C4,A6,FE,8A), \
+ V(34,2E,53,9D), V(A2,F3,55,A0), V(05,8A,E1,32), V(A4,F6,EB,75), \
+ V(0B,83,EC,39), V(40,60,EF,AA), V(5E,71,9F,06), V(BD,6E,10,51), \
+ V(3E,21,8A,F9), V(96,DD,06,3D), V(DD,3E,05,AE), V(4D,E6,BD,46), \
+ V(91,54,8D,B5), V(71,C4,5D,05), V(04,06,D4,6F), V(60,50,15,FF), \
+ V(19,98,FB,24), V(D6,BD,E9,97), V(89,40,43,CC), V(67,D9,9E,77), \
+ V(B0,E8,42,BD), V(07,89,8B,88), V(E7,19,5B,38), V(79,C8,EE,DB), \
+ V(A1,7C,0A,47), V(7C,42,0F,E9), V(F8,84,1E,C9), V(00,00,00,00), \
+ V(09,80,86,83), V(32,2B,ED,48), V(1E,11,70,AC), V(6C,5A,72,4E), \
+ V(FD,0E,FF,FB), V(0F,85,38,56), V(3D,AE,D5,1E), V(36,2D,39,27), \
+ V(0A,0F,D9,64), V(68,5C,A6,21), V(9B,5B,54,D1), V(24,36,2E,3A), \
+ V(0C,0A,67,B1), V(93,57,E7,0F), V(B4,EE,96,D2), V(1B,9B,91,9E), \
+ V(80,C0,C5,4F), V(61,DC,20,A2), V(5A,77,4B,69), V(1C,12,1A,16), \
+ V(E2,93,BA,0A), V(C0,A0,2A,E5), V(3C,22,E0,43), V(12,1B,17,1D), \
+ V(0E,09,0D,0B), V(F2,8B,C7,AD), V(2D,B6,A8,B9), V(14,1E,A9,C8), \
+ V(57,F1,19,85), V(AF,75,07,4C), V(EE,99,DD,BB), V(A3,7F,60,FD), \
+ V(F7,01,26,9F), V(5C,72,F5,BC), V(44,66,3B,C5), V(5B,FB,7E,34), \
+ V(8B,43,29,76), V(CB,23,C6,DC), V(B6,ED,FC,68), V(B8,E4,F1,63), \
+ V(D7,31,DC,CA), V(42,63,85,10), V(13,97,22,40), V(84,C6,11,20), \
+ V(85,4A,24,7D), V(D2,BB,3D,F8), V(AE,F9,32,11), V(C7,29,A1,6D), \
+ V(1D,9E,2F,4B), V(DC,B2,30,F3), V(0D,86,52,EC), V(77,C1,E3,D0), \
+ V(2B,B3,16,6C), V(A9,70,B9,99), V(11,94,48,FA), V(47,E9,64,22), \
+ V(A8,FC,8C,C4), V(A0,F0,3F,1A), V(56,7D,2C,D8), V(22,33,90,EF), \
+ V(87,49,4E,C7), V(D9,38,D1,C1), V(8C,CA,A2,FE), V(98,D4,0B,36), \
+ V(A6,F5,81,CF), V(A5,7A,DE,28), V(DA,B7,8E,26), V(3F,AD,BF,A4), \
+ V(2C,3A,9D,E4), V(50,78,92,0D), V(6A,5F,CC,9B), V(54,7E,46,62), \
+ V(F6,8D,13,C2), V(90,D8,B8,E8), V(2E,39,F7,5E), V(82,C3,AF,F5), \
+ V(9F,5D,80,BE), V(69,D0,93,7C), V(6F,D5,2D,A9), V(CF,25,12,B3), \
+ V(C8,AC,99,3B), V(10,18,7D,A7), V(E8,9C,63,6E), V(DB,3B,BB,7B), \
+ V(CD,26,78,09), V(6E,59,18,F4), V(EC,9A,B7,01), V(83,4F,9A,A8), \
+ V(E6,95,6E,65), V(AA,FF,E6,7E), V(21,BC,CF,08), V(EF,15,E8,E6), \
+ V(BA,E7,9B,D9), V(4A,6F,36,CE), V(EA,9F,09,D4), V(29,B0,7C,D6), \
+ V(31,A4,B2,AF), V(2A,3F,23,31), V(C6,A5,94,30), V(35,A2,66,C0), \
+ V(74,4E,BC,37), V(FC,82,CA,A6), V(E0,90,D0,B0), V(33,A7,D8,15), \
+ V(F1,04,98,4A), V(41,EC,DA,F7), V(7F,CD,50,0E), V(17,91,F6,2F), \
+ V(76,4D,D6,8D), V(43,EF,B0,4D), V(CC,AA,4D,54), V(E4,96,04,DF), \
+ V(9E,D1,B5,E3), V(4C,6A,88,1B), V(C1,2C,1F,B8), V(46,65,51,7F), \
+ V(9D,5E,EA,04), V(01,8C,35,5D), V(FA,87,74,73), V(FB,0B,41,2E), \
+ V(B3,67,1D,5A), V(92,DB,D2,52), V(E9,10,56,33), V(6D,D6,47,13), \
+ V(9A,D7,61,8C), V(37,A1,0C,7A), V(59,F8,14,8E), V(EB,13,3C,89), \
+ V(CE,A9,27,EE), V(B7,61,C9,35), V(E1,1C,E5,ED), V(7A,47,B1,3C), \
+ V(9C,D2,DF,59), V(55,F2,73,3F), V(18,14,CE,79), V(73,C7,37,BF), \
+ V(53,F7,CD,EA), V(5F,FD,AA,5B), V(DF,3D,6F,14), V(78,44,DB,86), \
+ V(CA,AF,F3,81), V(B9,68,C4,3E), V(38,24,34,2C), V(C2,A3,40,5F), \
+ V(16,1D,C3,72), V(BC,E2,25,0C), V(28,3C,49,8B), V(FF,0D,95,41), \
+ V(39,A8,01,71), V(08,0C,B3,DE), V(D8,B4,E4,9C), V(64,56,C1,90), \
+ V(7B,CB,84,61), V(D5,32,B6,70), V(48,6C,5C,74), V(D0,B8,57,42)
+
+#define V(a,b,c,d) 0x##a##b##c##d
+static const uint32 RT0[256] = { RT };
+#undef V
+
+#define V(a,b,c,d) 0x##d##a##b##c
+static const uint32 RT1[256] = { RT };
+#undef V
+
+#define V(a,b,c,d) 0x##c##d##a##b
+static const uint32 RT2[256] = { RT };
+#undef V
+
+#define V(a,b,c,d) 0x##b##c##d##a
+static const uint32 RT3[256] = { RT };
+#undef V
+
+#undef RT
+
+/* round constants */
+
+static const uint32 RCON[10] =
+{
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000
+};
+
+int do_init = 0;
+
+void aes_gen_tables( void )
+{
+}
+
+#endif
+
+/* platform-independant 32-bit integer manipulation macros */
+
+#define GET_UINT32_aes(n,b,i) \
+{ \
+ (n) = ( (uint32) (b)[(i) ] << 24 ) \
+ | ( (uint32) (b)[(i) + 1] << 16 ) \
+ | ( (uint32) (b)[(i) + 2] << 8 ) \
+ | ( (uint32) (b)[(i) + 3] ); \
+}
+
+#define PUT_UINT32_aes(n,b,i) \
+{ \
+ (b)[(i) ] = (uint8) ( (n) >> 24 ); \
+ (b)[(i) + 1] = (uint8) ( (n) >> 16 ); \
+ (b)[(i) + 2] = (uint8) ( (n) >> 8 ); \
+ (b)[(i) + 3] = (uint8) ( (n) ); \
+}
+
+/* decryption key schedule tables */
+
+int KT_init = 1;
+
+uint32 KT0[256];
+uint32 KT1[256];
+uint32 KT2[256];
+uint32 KT3[256];
+
+/* AES key scheduling routine */
+int aes_set_key( aes_context *ctx, uint8 *key, int nbits )
+{
+ int i;
+ uint32 *RK, *SK;
+
+ if( do_init )
+ {
+ aes_gen_tables();
+
+ do_init = 0;
+ }
+
+ switch( nbits )
+ {
+ case 128: ctx->nr = 10; break;
+ case 192: ctx->nr = 12; break;
+ case 256: ctx->nr = 14; break;
+ default : return( 1 );
+ }
+
+ RK = ctx->erk;
+
+ for( i = 0; i < (nbits >> 5); i++ )
+ {
+ GET_UINT32_aes( RK[i], key, i * 4 );
+ }
+
+ /* setup encryption round keys */
+
+ switch( nbits )
+ {
+ case 128:
+
+ for( i = 0; i < 10; i++, RK += 4 )
+ {
+ RK[4] = RK[0] ^ RCON[i] ^
+ ( FSb[ (uint8) ( RK[3] >> 16 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[3] >> 8 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[3] ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[3] >> 24 ) ] );
+
+ RK[5] = RK[1] ^ RK[4];
+ RK[6] = RK[2] ^ RK[5];
+ RK[7] = RK[3] ^ RK[6];
+ }
+ break;
+
+ case 192:
+
+ for( i = 0; i < 8; i++, RK += 6 )
+ {
+ RK[6] = RK[0] ^ RCON[i] ^
+ ( FSb[ (uint8) ( RK[5] >> 16 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[5] >> 8 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[5] ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[5] >> 24 ) ] );
+
+ RK[7] = RK[1] ^ RK[6];
+ RK[8] = RK[2] ^ RK[7];
+ RK[9] = RK[3] ^ RK[8];
+ RK[10] = RK[4] ^ RK[9];
+ RK[11] = RK[5] ^ RK[10];
+ }
+ break;
+
+ case 256:
+
+ for( i = 0; i < 7; i++, RK += 8 )
+ {
+ RK[8] = RK[0] ^ RCON[i] ^
+ ( FSb[ (uint8) ( RK[7] >> 16 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[7] >> 8 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[7] ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[7] >> 24 ) ] );
+
+ RK[9] = RK[1] ^ RK[8];
+ RK[10] = RK[2] ^ RK[9];
+ RK[11] = RK[3] ^ RK[10];
+
+ RK[12] = RK[4] ^
+ ( FSb[ (uint8) ( RK[11] >> 24 ) ] << 24 ) ^
+ ( FSb[ (uint8) ( RK[11] >> 16 ) ] << 16 ) ^
+ ( FSb[ (uint8) ( RK[11] >> 8 ) ] << 8 ) ^
+ ( FSb[ (uint8) ( RK[11] ) ] );
+
+ RK[13] = RK[5] ^ RK[12];
+ RK[14] = RK[6] ^ RK[13];
+ RK[15] = RK[7] ^ RK[14];
+ }
+ break;
+ }
+
+ /* setup decryption round keys */
+
+ if( KT_init )
+ {
+ for( i = 0; i < 256; i++ )
+ {
+ KT0[i] = RT0[ FSb[i] ];
+ KT1[i] = RT1[ FSb[i] ];
+ KT2[i] = RT2[ FSb[i] ];
+ KT3[i] = RT3[ FSb[i] ];
+ }
+
+ KT_init = 0;
+ }
+
+ SK = ctx->drk;
+
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+
+ for( i = 1; i < ctx->nr; i++ )
+ {
+ RK -= 8;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+
+ *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
+ KT1[ (uint8) ( *RK >> 16 ) ] ^
+ KT2[ (uint8) ( *RK >> 8 ) ] ^
+ KT3[ (uint8) ( *RK ) ]; RK++;
+ }
+
+ RK -= 8;
+
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+ *SK++ = *RK++;
+
+ return( 0 );
+}
diff --git a/board/aspeed/ast2400/ast2400.c b/board/aspeed/ast2400/ast2400.c
new file mode 100644
index 0000000..65bccbe
--- /dev/null
+++ b/board/aspeed/ast2400/ast2400.c
@@ -0,0 +1,304 @@
+/*
+ * 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
+ */
+
+#include <common.h>
+#include <command.h>
+#include <pci.h>
+
+int board_init (void)
+{
+ DECLARE_GLOBAL_DATA_PTR;
+ unsigned char data;
+ unsigned long gpio;
+ unsigned long reg;
+
+ /* AHB Controller */
+ *((volatile ulong*) 0x1E600000) = 0xAEED1A03; /* unlock AHB controller */
+ *((volatile ulong*) 0x1E60008C) |= 0x01; /* map DRAM to 0x00000000 */
+
+ /* Flash Controller */
+#ifdef CONFIG_FLASH_AST2300
+ *((volatile ulong*) 0x1e620000) |= 0x800f0000; /* enable Flash Write */
+#else
+ *((volatile ulong*) 0x16000000) |= 0x00001c00; /* enable Flash Write */
+#endif
+
+ /* SCU */
+ *((volatile ulong*) 0x1e6e2000) = 0x1688A8A8; /* unlock SCU */
+ reg = *((volatile ulong*) 0x1e6e2008);
+ reg &= 0x1c0fffff;
+ reg |= 0x61800000; /* PCLK = HPLL/8 */
+#ifdef CONFIG_AST1070
+ //check lpc or lpc+ mode
+////////////////////////////////////////////////////////////////////////
+ gpio = *((volatile ulong*) 0x1e780070); /* mode check */
+ if(gpio & 0x2)
+ reg |= 0x100000; /* LHCLK = HPLL/4 */
+ else
+ reg |= 0x300000; /* LHCLK = HPLL/8 */
+
+ reg |= 0x80000; /* enable LPC Host Clock */
+
+ *((volatile ulong*) 0x1e6e2008) = reg;
+
+ reg = *((volatile ulong*) 0x1e6e200c); /* enable LPC clock */
+ *((volatile ulong*) 0x1e6e200c) &= ~(1 << 28);
+
+ if(gpio & 0x2) {
+
+ //use LPC+ for sys clk
+ // set OSCCLK = VPLL1
+ *((volatile ulong*) 0x1e6e2010) = 0x18;
+
+ // enable OSCCLK
+ reg = *((volatile ulong*) 0x1e6e202c);
+ reg |= 0x00000002;
+ *((volatile ulong*) 0x1e6e202c) = reg;
+ } else {
+ // USE LPC use D2 clk
+ /*set VPPL1 */
+ *((volatile ulong*) 0x1e6e201c) = 0x6420;
+
+ // set d2-pll & enable d2-pll D[21:20], D[4]
+ reg = *((volatile ulong*) 0x1e6e202c);
+ reg &= 0xffcfffef;
+ reg |= 0x00200010;
+ *((volatile ulong*) 0x1e6e202c) = reg;
+
+ // set OSCCLK = VPLL1
+ *((volatile ulong*) 0x1e6e2010) = 0x8;
+
+ // enable OSCCLK
+ reg = *((volatile ulong*) 0x1e6e202c);
+ reg &= 0xfffffffd;
+ reg |= 0x00000002;
+ *((volatile ulong*) 0x1e6e202c) = reg;
+ }
+#else
+ *((volatile ulong*) 0x1e6e2008) = reg;
+#endif
+ reg = *((volatile ulong*) 0x1e6e200c); /* enable 2D Clk */
+ *((volatile ulong*) 0x1e6e200c) &= 0xFFFFFFFD;
+/* enable wide screen. If your video driver does not support wide screen, don't
+enable this bit 0x1e6e2040 D[0]*/
+ reg = *((volatile ulong*) 0x1e6e2040);
+ *((volatile ulong*) 0x1e6e2040) |= 0x01;
+
+ /* arch number */
+ gd->bd->bi_arch_number = MACH_TYPE_ASPEED;
+
+ /* adress of boot parameters */
+ gd->bd->bi_boot_params = 0x40000100;
+
+ return 0;
+}
+
+int dram_init (void)
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+ return 0;
+}
+
+/*
+SCU7C: Silicon Revision ID Register
+D[31:24]: Chip ID
+0: AST2050/AST2100/AST2150/AST2200/AST3000
+1: AST2300
+
+D[23:16] Silicon revision ID for AST2300 generation and later
+0: A0
+1: A1
+2: A2
+.
+.
+.
+FPGA revision starts from 0x80
+
+
+D[11:8] Bounding option
+
+D[7:0] Silicon revision ID for AST2050/AST2100 generation (for software compatible)
+0: A0
+1: A1
+2: A2
+3: A3
+.
+.
+FPGA revision starts from 0x08, 8~10 means A0, 11+ means A1, AST2300 should be assigned to 3
+*/
+int wait_calibration_done()
+{
+ DECLARE_GLOBAL_DATA_PTR;
+ unsigned char data;
+ unsigned long reg, count = 0;
+
+ do {
+ udelay(1000);
+ count++;
+ if (count >= 1000) {
+
+ return 1;
+ }
+ } while ((*(volatile ulong*) 0x1e6ec000) & 0xf00);
+
+// printf ("count = %d\n", count);
+
+ return 0;
+}
+
+/* AST1070 Calibration
+Program 0x101 to 0x1e6ec000
+Wait till 1e6ec000 [8] = 0
+Check 0x1e6ec004 = 0x5a5a5a5a
+*/
+int ast1070_calibration()
+{
+ DECLARE_GLOBAL_DATA_PTR;
+ unsigned char data;
+ unsigned long reg, i, j;
+
+ //only for 2 chip
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < 4; j++) {
+// printf ("chip = %d, delay = %d\n", i, j);
+ *((volatile ulong*) 0x1e6ec000) = (j << (12 + i * 2)) + (1 << (8 + i)) + 0x01;
+// printf ("1e6ec000 = %x\n", *(volatile ulong*)0x1e6ec000);
+ if (!wait_calibration_done()) {
+ if ((*(volatile ulong*) 0x1e6ec004) == 0x5a5a5a5a) {
+// printf ("calibration result: chip %d pass, timing = %d\n", i, j);
+ break;
+ }
+ else {
+// printf ("calibration result: chip %d fail, timing = %d\n", i, j);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int misc_init_r(void)
+{
+ unsigned int reg, reg1, revision, chip_id, lpc_plus;
+
+#ifdef CONFIG_AST1070
+ //Reset AST1070 and AST2400 engine [bit 23:15]
+ reg = *((volatile ulong*) 0x1e7890a0);
+ reg &= ~0x808000;
+ *((volatile ulong*) 0x1e7890a0) = reg;
+
+ udelay(5000);
+
+ lpc_plus = (*((volatile ulong*) 0x1e780070)) & 0x2;
+
+ reg = *((volatile ulong*) 0x1e7890a0);
+ reg |= 0x800000;
+ *((volatile ulong*) 0x1e7890a0) = reg;
+
+ udelay(1000);
+
+ reg = *((volatile ulong*) 0x1e7890a0);
+ reg |= 0x008000;
+ *((volatile ulong*) 0x1e7890a0) = reg;
+
+
+ if(lpc_plus) {
+ *((volatile ulong*) 0x1E60008C) |= 0x011; /* map DRAM to 0x00000000 and LPC+ 0x70000000*/
+
+ //SCU multi-Function pin
+ reg = *((volatile ulong*) 0x1e6e2090);
+ reg |= (1 << 30);
+ *((volatile ulong*) 0x1e6e2090) = reg;
+ //LPC+ Engine Enable
+ reg = *((volatile ulong*) 0x1e6ec000);
+ reg |= 1;
+ *((volatile ulong*) 0x1e6ec000) = reg;
+
+ ast1070_calibration();
+
+ } else {
+ // enable AST1050's LPC master
+ reg = *((volatile ulong*) 0x1e7890a0);
+ *((volatile ulong*) 0x1e7890a0) |= 0x11;
+
+ }
+
+#endif
+ /* Show H/W Version */
+ reg1 = (unsigned int) (*((ulong*) 0x1e6e207c));
+ chip_id = (reg1 & 0xff000000) >> 24;
+ revision = (reg1 & 0xff0000) >> 16;
+
+ puts ("H/W: ");
+ if (chip_id == 1) {
+ if (revision >= 0x80) {
+ printf("AST2300 series FPGA Rev. %02x \n", revision);
+ }
+ else {
+ printf("AST2300 series chip Rev. %02x \n", revision);
+ }
+ }
+ else if (chip_id == 2) {
+ printf("AST2400 series chip Rev. %02x \n", revision);
+ }
+ else if (chip_id == 0) {
+ printf("AST2050/AST2150 series chip\n");
+ }
+
+#ifdef CONFIG_AST1070
+ if(lpc_plus) {
+ puts ("C/C: LPC+ :");
+ revision = (unsigned int) (*((ulong*) 0x70002034));
+ printf("AST1070 ID [%08x] ", revision);
+
+ if((*((volatile ulong*) 0x1e780070)) & 0x4) {
+ if((unsigned int) (*((ulong*) 0x70012034)) == 0x10700001)
+ printf(", 2nd : AST1070 ID [%08x] \n", (unsigned int) (*((ulong*) 0x70012034)));
+ else
+ printf("\n");
+ } else {
+ printf("\n");
+ }
+ } else {
+ puts ("C/C: LPC :");
+ revision = (unsigned int) (*((ulong*) 0x60002034));
+ printf("LPC : AST1070 ID [%08x] \n", revision);
+
+ }
+#endif
+
+#ifdef CONFIG_PCI
+ pci_init ();
+#endif
+
+ if (getenv ("verify") == NULL) {
+ setenv ("verify", "n");
+ }
+ if (getenv ("eeprom") == NULL) {
+ setenv ("eeprom", "y");
+ }
+}
+
+#ifdef CONFIG_PCI
+static struct pci_controller hose;
+
+extern void aspeed_init_pci (struct pci_controller *hose);
+
+void pci_init_board(void)
+{
+ aspeed_init_pci(&hose);
+}
+#endif
diff --git a/board/aspeed/ast2400/config.mk b/board/aspeed/ast2400/config.mk
new file mode 100755
index 0000000..24ca09b
--- /dev/null
+++ b/board/aspeed/ast2400/config.mk
@@ -0,0 +1,18 @@
+# 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
+#
+
+# ROM version
+#TEXT_BASE = 0xBFC00000
+
+# RAM version
+TEXT_BASE = 0x40500000
+#TEXT_BASE = 0x00000000
+#TEXT_BASE = 0x00400000
diff --git a/board/aspeed/ast2400/crc32.c b/board/aspeed/ast2400/crc32.c
new file mode 100755
index 0000000..cc8d2ac
--- /dev/null
+++ b/board/aspeed/ast2400/crc32.c
@@ -0,0 +1,127 @@
+/*
+ * 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
+ */
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/byteorder.h>
+#include <environment.h>
+
+#ifdef CONFIG_2SPIFLASH
+
+extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
+
+/* ========================================================================
+ * Table of CRC-32's of all single-byte values (made by make_aspeed_crc_table)
+ */
+unsigned long aspeed_crc_table[256] = {
+ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+ 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+ 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+ 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+ 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+ 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+ 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+ 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+ 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+ 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+ 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+ 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+ 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+ 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+ 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+ 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+ 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+ 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+ 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+ 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+ 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+ 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+ 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+ 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+ 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+ 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+ 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+ 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+ 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+ 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+ 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+ 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+ 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+ 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+ 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+ 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+ 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+ 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+ 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+ 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+ 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+ 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+ 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+ 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+ 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+ 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+ 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+ 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+ 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+ 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+ 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+ 0x2d02ef8dL
+};
+
+/* ========================================================================= */
+#define ASPEED_DO1(buf) crc = aspeed_crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
+#define ASPEED_DO2(buf) ASPEED_DO1(buf); ASPEED_DO1(buf);
+#define ASPEED_DO4(buf) ASPEED_DO2(buf); ASPEED_DO2(buf);
+#define ASPEED_DO8(buf) ASPEED_DO4(buf); ASPEED_DO4(buf);
+
+/* ========================================================================= */
+unsigned long spi2_crc32(crc, buf, len)
+ unsigned long crc;
+ unsigned char *buf;
+ unsigned long len;
+{
+
+ size_t len1, len2;
+ char *s;
+
+ len1 = len2 = 0;
+ if ( (ulong)(buf) <= (flash_info[0].start[0] + flash_info[0].size) )
+ len1 = (flash_info[0].start[0] + flash_info[0].size) - (ulong)(buf);
+
+ len1 = (len < len1) ? len:len1;
+ len2 = (len < len1) ? 0: (len - len1);
+
+ crc = crc ^ 0xffffffffL;
+ while (len1 >= 8)
+ {
+ ASPEED_DO8(buf);
+ len1 -= 8;
+ }
+ if (len1) do {
+ ASPEED_DO1(buf);
+ } while (--len1);
+
+ //s = (char *) flash_info[1].start[0];
+ s= (char *) flash_make_addr (&flash_info[1], 0, 0);
+ while (len2 >= 8)
+ {
+ ASPEED_DO8(s);
+ len2 -= 8;
+ }
+ if (len2) do {
+ ASPEED_DO1(s);
+ } while (--len2);
+
+ return crc ^ 0xffffffffL;
+
+}
+
+#endif /* CONFIG_2SPIFLASH */
+
diff --git a/board/aspeed/ast2400/crt.c b/board/aspeed/ast2400/crt.c
new file mode 100755
index 0000000..b67f669
--- /dev/null
+++ b/board/aspeed/ast2400/crt.c
@@ -0,0 +1,322 @@
+/*
+ * 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
+ */
+#include <common.h>
+#include <command.h>
+
+#include "type.h"
+#include "vesa.h"
+#include "vdef.h"
+#include "vfun.h"
+#include "vreg.h"
+#include "crt.h"
+
+ULONG AST3000DCLKTableV [] = {
+ 0x00046515, /* 00: VCLK25_175 */
+ 0x00047255, /* 01: VCLK28_322 */
+ 0x0004682a, /* 02: VCLK31_5 */
+ 0x0004672a, /* 03: VCLK36 */
+ 0x00046c50, /* 04: VCLK40 */
+ 0x00046842, /* 05: VCLK49_5 */
+ 0x00006c32, /* 06: VCLK50 */
+ 0x00006a2f, /* 07: VCLK56_25 */
+ 0x00006c41, /* 08: VCLK65 */
+ 0x00006832, /* 09: VCLK75 */
+ 0x0000672e, /* 0A: VCLK78_75 */
+ 0x0000683f, /* 0B: VCLK94_5 */
+ 0x00004824, /* 0C: VCLK108 */
+ 0x00004723, /* 0D: VCLK119 */
+ 0x0000482d, /* 0E: VCLK135 */
+ 0x00004B37, /* 0F: VCLK146_25 */
+ 0x0000472e, /* 10: VCLK157_5 */
+ 0x00004836, /* 11: VCLK162 */
+
+};
+
+BOOL CheckDAC(int nCRTIndex)
+{
+ BYTE btValue;
+ BOOL bValue;
+
+ BYTE btDeviceSelect;
+
+ switch (nCRTIndex)
+ {
+ case CRT_1:
+ btDeviceSelect = DEVICE_ADDRESS_CH7301_CRT1;
+ break;
+ case CRT_2:
+ btDeviceSelect = DEVICE_ADDRESS_CH7301_CRT2;
+ break;
+ default:
+ printf("CRTIndex is not 1 or 2");
+ return FALSE;
+ break;
+ }
+
+ //Enable all DAC's and set register 21h[0] = '0'
+ //DVIP and DVIL disable for DAC
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_PM_REG, 0x00);
+
+ btValue = GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_DC_REG);
+ btValue = btValue & 0xFE;
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_DC_REG, btValue);
+
+ //Set SENSE bit to 1
+ btValue = GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG);
+ btValue = btValue | 0x01;
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG, btValue);
+
+ //Reset SENSE bit to 0
+ btValue = GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG);
+ btValue = btValue & 0xFE;
+ SetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG, btValue);
+
+ bValue = (GetI2CRegClient(0, DEVICE_SELECT_CH7301, btDeviceSelect, CH7301_CD_REG) & CD_DACT) ? TRUE : FALSE;
+
+ return bValue;
+}
+
+VOID SetCH7301C(ULONG MMIOBase,
+ int nCRTIndex,
+ int inFreqRange,
+ int inOperating)
+{
+ BYTE btDeviceSelect;
+ BYTE btValue;
+
+//#ifdef EVB_CLIENT
+ //output RGB doesn't need to set CH7301
+ //if (1 == inOperating)
+ // return;
+//#endif
+
+ switch (nCRTIndex)
+ {
+ case CRT_1:
+ btDeviceSelect = 0xEA;
+
+ break;
+ case CRT_2:
+ btDeviceSelect = 0xEC;
+
+ break;
+ default:
+ printf("CRTIndex is not 1 or 2");
+ return;
+ break;
+ }
+
+ if (inFreqRange <= VCLK65)
+ {
+ printf("ch7301: low f \n");
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x33, 0x08);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x34, 0x16);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x36, 0x60);
+ }
+ else
+ {
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x33, 0x06);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x34, 0x26);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x36, 0xA0);
+ }
+
+ switch (inOperating)
+ {
+ case 0:
+ //DVI is normal function
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x49, 0xC0);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x1D, 0x47);
+ break;
+ case 1:
+ //RGB
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x48, 0x18);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x49, 0x0);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x56, 0x0);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x21, 0x9);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x1D, 0x48);
+ SetI2CRegClient(MMIOBase, 0x3, btDeviceSelect, 0x1C, 0x00);
+ break;
+ default:
+ break;
+ };
+}
+
+void SetASTModeTiming (ULONG MMIOBase, int nCRTIndex, BYTE ModeIndex, BYTE ColorDepth)
+{
+ ULONG temp, RetraceStart, RetraceEnd, DisplayOffset, TerminalCount, bpp;
+
+// Access CRT Engine
+ // SetPolarity
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, ((vModeTable[ModeIndex].HorPolarity << HOR_SYNC_SELECT_BIT) | (vModeTable[ModeIndex].VerPolarity << VER_SYNC_SELECT_BIT)), (HOR_SYNC_SELECT_MASK|VER_SYNC_SELECT_MASK));
+
+#if CONFIG_AST3000
+ WriteMemoryLongClient(SCU_BASE, CRT1_CONTROL2_REG + nCRTIndex*0x60, 0xc0);
+#else
+ //2100 is single edge
+ WriteMemoryLongClient(SCU_BASE, CRT1_CONTROL2_REG + nCRTIndex*0x60, 0x80);
+#endif
+ // Horizontal Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].HorizontalActive - 1) << HOR_ENABLE_END_BIT) | ((vModeTable[ModeIndex].HorizontalTotal - 1) << HOR_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ RetraceStart = vModeTable[ModeIndex].HorizontalTotal - vModeTable[ModeIndex].HBackPorch - vModeTable[ModeIndex].HSyncTime - vModeTable[ModeIndex].HLeftBorder - 1;
+ RetraceEnd = (RetraceStart + vModeTable[ModeIndex].HSyncTime);
+ temp = 0;
+ temp = (RetraceEnd << HOR_RETRACE_END_BIT) | (RetraceStart << HOR_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Vertical Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].VerticalActive - 1) << VER_ENABLE_END_BIT) | ((vModeTable[ModeIndex].VerticalTotal - 1) << VER_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ temp = 0;
+ RetraceStart = vModeTable[ModeIndex].VerticalTotal - vModeTable[ModeIndex].VBackPorch - vModeTable[ModeIndex].VSyncTime - vModeTable[ModeIndex].VTopBorder - 1;
+ RetraceEnd = (RetraceStart + vModeTable[ModeIndex].VSyncTime);
+ temp = (RetraceEnd << VER_RETRACE_END_BIT) | (RetraceStart << VER_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Set CRT Display Offset and Terminal Count
+ if (ColorDepth == RGB_565) {
+ bpp = 16;
+ }
+ else {
+ bpp = 32;
+ }
+
+ DisplayOffset = vModeTable[ModeIndex].HorizontalActive * bpp / 8;
+ TerminalCount = vModeTable[ModeIndex].HorizontalActive * bpp / 64;
+ if (ColorDepth == YUV_444) {
+ TerminalCount = TerminalCount * 3 / 4;
+ }
+ if (((vModeTable[ModeIndex].HorizontalActive * bpp) % 64) != 0) {
+ TerminalCount++;
+ }
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_DISPLAY_OFFSET + nCRTIndex*0x60, ((TerminalCount << TERMINAL_COUNT_BIT) | DisplayOffset));
+
+ // Set Color Format
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, (ColorDepth << FORMAT_SELECT_BIT), FORMAT_SELECT_MASK);
+
+ // Set Threshold
+ temp = 0;
+ temp = (CRT_HIGH_THRESHOLD_VALUE << THRES_HIGHT_BIT) | (CRT_LOW_THRESHOLD_VALUE << THRES_LOW_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_THRESHOLD_REG + nCRTIndex*0x60, temp);
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_VIDEO_PLL_REG + nCRTIndex*0x60, AST3000DCLKTableV[vModeTable[ModeIndex].PixelClock]);
+}
+
+void SetASTCenter1024ModeTiming (ULONG MMIOBase, int nCRTIndex, BYTE ModeIndex, BYTE ColorDepth)
+{
+ ULONG temp, RetraceStart, RetraceEnd, DisplayOffset, TerminalCount, bpp;
+
+ // Access CRT Engine
+ // SetPolarity
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, (HOR_NEGATIVE << HOR_SYNC_SELECT_BIT) | (VER_NEGATIVE << VER_SYNC_SELECT_BIT), HOR_SYNC_SELECT_MASK|VER_SYNC_SELECT_MASK);
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_CONTROL2_REG + nCRTIndex*0x60, 0xC0);
+
+ // Horizontal Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].HorizontalActive - 1) << HOR_ENABLE_END_BIT) | ((vModeTable[10].HorizontalTotal - 1) << HOR_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ RetraceStart = vModeTable[10].HorizontalTotal - vModeTable[10].HBackPorch - vModeTable[10].HSyncTime - vModeTable[10].HLeftBorder - 1;
+ RetraceStart = RetraceStart - (vModeTable[10].HorizontalActive - vModeTable[ModeIndex].HorizontalActive) / 2 - 1;
+ RetraceEnd = (RetraceStart + vModeTable[10].HSyncTime);
+ temp = 0;
+ temp = (RetraceEnd << HOR_RETRACE_END_BIT) | (RetraceStart << HOR_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_HOR_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Vertical Timing
+ temp = 0;
+ temp = ((vModeTable[ModeIndex].VerticalActive - 1) << VER_ENABLE_END_BIT) | ((vModeTable[10].VerticalTotal - 1) << VER_TOTAL_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_TOTAL_END_REG + nCRTIndex*0x60, temp);
+
+ RetraceStart = vModeTable[10].VerticalTotal - vModeTable[10].VBackPorch - vModeTable[10].VSyncTime - vModeTable[10].VTopBorder - 1;
+ RetraceStart = RetraceStart - (vModeTable[10].VerticalActive - vModeTable[ModeIndex].VerticalActive) / 2 - 1;
+ RetraceEnd = (RetraceStart + vModeTable[10].VSyncTime);
+ temp = (RetraceEnd << VER_RETRACE_END_BIT) | (RetraceStart << VER_RETRACE_START_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_VER_RETRACE_REG + nCRTIndex*0x60, temp);
+
+ // Set CRT Display Offset and Terminal Count
+ if (ColorDepth == RGB_565) {
+ bpp = 16;
+ }
+ else {
+ bpp = 32;
+ }
+ DisplayOffset = vModeTable[ModeIndex].HorizontalActive * bpp / 8;
+ TerminalCount = vModeTable[ModeIndex].HorizontalActive * bpp / 64;
+ if (ColorDepth == YUV_444) {
+ TerminalCount = TerminalCount * 3 / 4;
+ }
+ if (((vModeTable[ModeIndex].HorizontalActive * bpp) % 64) != 0) {
+ TerminalCount++;
+ }
+
+ WriteMemoryLongClient(SCU_BASE, CRT1_DISPLAY_OFFSET + nCRTIndex*0x60, (TerminalCount << TERMINAL_COUNT_BIT) | DisplayOffset);
+
+ // Set Color Format
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + nCRTIndex*0x60, (ColorDepth << FORMAT_SELECT_BIT), FORMAT_SELECT_MASK);
+
+ // Set Threshold
+ temp = 0;
+ temp = (CRT_HIGH_THRESHOLD_VALUE << THRES_HIGHT_BIT) | (CRT_LOW_THRESHOLD_VALUE << THRES_LOW_BIT);
+ WriteMemoryLongClient(SCU_BASE, CRT1_THRESHOLD_REG + nCRTIndex*0x60, temp);
+
+ // Set DCLK
+ WriteMemoryLongClient(SCU_BASE, CRT1_VIDEO_PLL_REG + nCRTIndex*0x60, AST3000DCLKTableV[vModeTable[ModeIndex].PixelClock]);
+
+}
+
+BOOL ASTSetModeV (ULONG MMIOBase, int nCRTIndex, ULONG VGABaseAddr, USHORT Horizontal, USHORT Vertical, BYTE ColorFormat, BYTE CenterMode)
+{
+ BYTE i, ModeIndex;
+ BOOL bDAC;
+ ULONG ulTemp;
+
+ // Access CRT Engine
+ //Enable CRT1 graph
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_CONTROL_REG + 0x60*nCRTIndex, GRAPH_DISPLAY_ON, GRAPH_DISPLAY_MASK);
+
+ // Set CRT Display Start Address
+ WriteMemoryLongWithMASKClient(SCU_BASE, CRT1_DISPLAY_ADDRESS + 0x60*nCRTIndex, VGABaseAddr, DISPLAY_ADDRESS_MASK);
+
+ for (i = 0; i < Mode60HZCount; i++) {
+ if ((vModeTable[i].HorizontalActive == Horizontal) && (vModeTable[i].VerticalActive == Vertical)) {
+
+ ModeIndex = i;
+
+ if (CenterMode != 1) {
+ SetASTModeTiming(MMIOBase, nCRTIndex, i, ColorFormat);
+ }
+ else {
+ SetASTCenter1024ModeTiming (MMIOBase, nCRTIndex, i, ColorFormat);
+ }
+
+ //use internal video out sigal and don't need use 7301
+ /*
+ bDAC = CheckDAC(nCRTIndex);
+
+ SetCH7301C(0,
+ nCRTIndex,
+ vModeTable[ModeIndex].PixelClock,
+ bDAC); //For RGB
+ */
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
diff --git a/board/aspeed/ast2400/crt.h b/board/aspeed/ast2400/crt.h
new file mode 100755
index 0000000..e7483be
--- /dev/null
+++ b/board/aspeed/ast2400/crt.h
@@ -0,0 +1,121 @@
+/*
+ * 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
+ */
+#ifndef _CRT_H_
+#define _CRT_H_
+
+#ifdef Watcom
+#define CRT_REMAP_OFFSET 0x10000
+#else
+#define CRT_REMAP_OFFSET 0x0
+#endif
+
+/********************************************************/
+/* CRT register */
+/********************************************************/
+#define CRT_BASE_OFFSET 0x6000+CRT_REMAP_OFFSET
+
+#define CRT1_CONTROL_REG 0x00 + CRT_BASE_OFFSET
+ #define GRAPH_DISPLAY_BIT 0
+ #define GRAPH_DISPLAY_MASK (1<<0)
+ #define GRAPH_DISPLAY_ON 1
+ #define GRAPH_DISPLAY_OFF 0
+ #define FORMAT_SELECT_BIT 8
+ #define FORMAT_SELECT_MASK (3<<8)
+ #define HOR_SYNC_SELECT_BIT 16
+ #define HOR_SYNC_SELECT_MASK (1<<16)
+ #define HOR_NEGATIVE 1
+ #define HOR_POSITIVE 0
+ #define VER_SYNC_SELECT_BIT 17
+ #define VER_SYNC_SELECT_MASK (1<<17)
+ #define VER_NEGATIVE 1
+ #define VER_POSITIVE 0
+
+#define CRT1_CONTROL2_REG 0x04 + CRT_BASE_OFFSET
+
+#define CRT1_VIDEO_PLL_REG 0x0C + CRT_BASE_OFFSET
+ #define POST_DIV_BIT 18
+ #define POST_DIV_MASK 3<<18
+ #define DIV_1_1 0
+ //#define DIV_1_2 1
+ #define DIV_1_2 2
+ #define DIV_1_4 3
+
+#define CRT1_HOR_TOTAL_END_REG 0x10 + CRT_BASE_OFFSET
+ #define HOR_TOTAL_BIT 0
+ #define HOR_ENABLE_END_BIT 16
+
+#define CRT1_HOR_RETRACE_REG 0x14 + CRT_BASE_OFFSET
+ #define HOR_RETRACE_START_BIT 0
+ #define HOR_RETRACE_END_BIT 16
+
+#define CRT1_VER_TOTAL_END_REG 0x18 + CRT_BASE_OFFSET
+ #define VER_TOTAL_BIT 0
+ #define VER_ENABLE_END_BIT 16
+
+#define CRT1_VER_RETRACE_REG 0x1C + CRT_BASE_OFFSET
+ #define VER_RETRACE_START_BIT 0
+ #define VER_RETRACE_END_BIT 16
+
+#define CRT1_DISPLAY_ADDRESS 0x20 + CRT_BASE_OFFSET
+ #define DISPLAY_ADDRESS_MASK 0x0FFFFFFF
+
+#define CRT1_DISPLAY_OFFSET 0x24 + CRT_BASE_OFFSET
+ #define DISPLAY_OFFSET_ALIGN 7 /* 8 byte alignment*/
+ #define TERMINAL_COUNT_BIT 16
+
+#define CRT1_THRESHOLD_REG 0x28 + CRT_BASE_OFFSET
+ #define THRES_LOW_BIT 0
+ #define THRES_HIGHT_BIT 8
+
+#define CURSOR_POSITION 0x30 + OFFSET
+#define CURSOR_OFFSET 0x34 + OFFSET
+#define CURSOR_PATTERN 0x38 + OFFSET
+#define OSD_HORIZONTAL 0x40 + OFFSET
+#define OSD_VERTICAL 0x44 + OFFSET
+#define OSD_PATTERN 0x48 + OFFSET
+#define OSD_OFFSET 0x4C + OFFSET
+#define OSD_THRESHOLD 0x50 + OFFSET
+
+//Ch7301c
+#define DEVICE_ADDRESS_CH7301_CRT1 0xEA
+#define DEVICE_ADDRESS_CH7301_CRT2 0xEC
+
+
+#define DEVICE_SELECT_CH7301 0x3
+
+/* CH7301 Register Definition */
+#define CH7301_CD_REG 0x20
+ #define CD_DACT 0x0E
+ #define CD_DVIT 1 << 5
+#define CH7301_DC_REG 0x21
+#define CH7301_PM_REG 0x49
+
+BOOL CheckHotPlug(int nCRTIndex);
+BOOL CheckDAC(int nCRTIndex);
+
+BOOL ASTSetModeV (ULONG MMIOBase,
+ int nCRTIndex,
+ ULONG VGABaseAddr,
+ USHORT Horizontal,
+ USHORT Vertical,
+ BYTE ColorFormat,
+ BYTE CenterMode);
+
+BOOL SelCRTClock(ULONG MMIOBase,
+ int nCRTIndex,
+ USHORT Horizontal,
+ USHORT Vertical);
+
+void DisableCRT(ULONG MMIOBase, int nCRTIndex);
+void ClearCRTWithBlack(ULONG ulCRTAddr, int iWidth, int iHeight);
+
+#endif /* _CRT_H_ */
+
diff --git a/board/aspeed/ast2400/flash.c b/board/aspeed/ast2400/flash.c
new file mode 100755
index 0000000..d611d0d
--- /dev/null
+++ b/board/aspeed/ast2400/flash.c
@@ -0,0 +1,1651 @@
+/*
+ * 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
+ *
+ * History
+ * 01/20/2004 - combined variants of original driver.
+ * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay)
+ * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud)
+ * 01/27/2004 - Little endian support Ed Okerson
+ *
+ * Tested Architectures
+ * Port Width Chip Width # of banks Flash Chip Board
+ * 32 16 1 28F128J3 seranoa/eagle
+ * 64 16 1 28F128J3 seranoa/falcon
+ */
+// (Sun) This CFI driver is written for fixed-width flash chips.
+// It was not designed for flexible 8-bit/16-bit chips, which are the norm.
+// When those chips are connected to a bus in 8-bit mode, the address wires
+// right-shifted by 1.
+//FIXME: Fix the driver to auto-detect "16-bit flash wired in 8-bit mode".
+// Left-shift CFI offsets by 1 bit instead of doubling the #define values.
+
+/* The DEBUG define must be before common to enable debugging */
+// (Sun) Changed to DEBUG_FLASH because flash debug()s are too numerous.
+// #define DEBUG
+
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/byteorder.h>
+#include <environment.h>
+#ifdef CONFIG_SYS_FLASH_CFI
+
+/*
+ * This file implements a Common Flash Interface (CFI) driver for U-Boot.
+ * The width of the port and the width of the chips are determined at initialization.
+ * These widths are used to calculate the address for access CFI data structures.
+ * It has been tested on an Intel Strataflash implementation and AMD 29F016D.
+ *
+ * References
+ * JEDEC Standard JESD68 - Common Flash Interface (CFI)
+ * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
+ * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
+ * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
+ *
+ * TODO
+ *
+ * Use Primary Extended Query table (PRI) and Alternate Algorithm Query
+ * Table (ALT) to determine if protection is available
+ *
+ * Add support for other command sets Use the PRI and ALT to determine command set
+ * Verify erase and program timeouts.
+ */
+
+#ifndef CONFIG_FLASH_BANKS_LIST
+#define CONFIG_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
+#endif
+
+#define FLASH_CMD_CFI 0x98
+#define FLASH_CMD_READ_ID 0x90
+#define FLASH_CMD_RESET 0xff
+#define FLASH_CMD_BLOCK_ERASE 0x20
+#define FLASH_CMD_ERASE_CONFIRM 0xD0
+#define FLASH_CMD_WRITE 0x40
+#define FLASH_CMD_PROTECT 0x60
+#define FLASH_CMD_PROTECT_SET 0x01
+#define FLASH_CMD_PROTECT_CLEAR 0xD0
+#define FLASH_CMD_CLEAR_STATUS 0x50
+#define FLASH_CMD_WRITE_TO_BUFFER 0xE8
+#define FLASH_CMD_WRITE_BUFFER_CONFIRM 0xD0
+
+#define FLASH_STATUS_DONE 0x80
+#define FLASH_STATUS_ESS 0x40
+#define FLASH_STATUS_ECLBS 0x20
+#define FLASH_STATUS_PSLBS 0x10
+#define FLASH_STATUS_VPENS 0x08
+#define FLASH_STATUS_PSS 0x04
+#define FLASH_STATUS_DPS 0x02
+#define FLASH_STATUS_R 0x01
+#define FLASH_STATUS_PROTECT 0x01
+
+#define AMD_CMD_RESET 0xF0
+#define AMD_CMD_WRITE 0xA0
+#define AMD_CMD_ERASE_START 0x80
+#define AMD_CMD_ERASE_SECTOR 0x30
+#define AMD_CMD_UNLOCK_START 0xAA
+#define AMD_CMD_UNLOCK_ACK 0x55
+#define AMD_CMD_WRITE_TO_BUFFER 0x25
+#define AMD_CMD_BUFFER_TO_FLASH 0x29
+
+#define AMD_STATUS_TOGGLE 0x40
+#define AMD_STATUS_ERROR 0x20
+//FIXME: These 3 were also changed for 8-bit/16-bit flash chips.
+#define AMD_ADDR_ERASE_START (0xAAA/info->portwidth)
+#define AMD_ADDR_START (0xAAA/info->portwidth)
+#define AMD_ADDR_ACK (0x555/info->portwidth)
+
+//FIXME: Fix the driver to auto-detect "16-bit flash wired in 8-bit mode".
+// Left-shift CFI offsets by 1 bit instead of doubling the #define values.
+#define FLASH_OFFSET_CFI (0xAA/info->portwidth)
+#define FLASH_OFFSET_CFI_RESP (0x20/info->portwidth)
+#define FLASH_OFFSET_CFI_RESP1 (0x22/info->portwidth)
+#define FLASH_OFFSET_CFI_RESP2 (0x24/info->portwidth)
+#define FLASH_OFFSET_PRIMARY_VENDOR (0x26/info->portwidth)
+#define FLASH_OFFSET_WTOUT (0x3E/info->portwidth)
+#define FLASH_OFFSET_WBTOUT (0x40/info->portwidth)
+#define FLASH_OFFSET_ETOUT (0x42/info->portwidth)
+#define FLASH_OFFSET_CETOUT (0x44/info->portwidth)
+#define FLASH_OFFSET_WMAX_TOUT (0x46/info->portwidth)
+#define FLASH_OFFSET_WBMAX_TOUT (0x48/info->portwidth)
+#define FLASH_OFFSET_EMAX_TOUT (0x4A/info->portwidth)
+#define FLASH_OFFSET_CEMAX_TOUT (0x4C/info->portwidth)
+#define FLASH_OFFSET_SIZE (0x4E/info->portwidth)
+#define FLASH_OFFSET_INTERFACE (0x50/info->portwidth)
+#define FLASH_OFFSET_BUFFER_SIZE (0x54/info->portwidth)
+#define FLASH_OFFSET_NUM_ERASE_REGIONS (0x58/info->portwidth)
+#define FLASH_OFFSET_ERASE_REGIONS (0x5A/info->portwidth)
+#define FLASH_OFFSET_PROTECT (0x02/info->portwidth)
+#define FLASH_OFFSET_USER_PROTECTION (0x85/info->portwidth)
+#define FLASH_OFFSET_INTEL_PROTECTION (0x81/info->portwidth)
+
+#define MAX_NUM_ERASE_REGIONS 4
+
+#define FLASH_MAN_CFI 0x01000000
+
+#define CFI_CMDSET_NONE 0
+#define CFI_CMDSET_INTEL_EXTENDED 1
+#define CFI_CMDSET_AMD_STANDARD 2
+#define CFI_CMDSET_INTEL_STANDARD 3
+#define CFI_CMDSET_AMD_EXTENDED 4
+#define CFI_CMDSET_MITSU_STANDARD 256
+#define CFI_CMDSET_MITSU_EXTENDED 257
+#define CFI_CMDSET_SST 258
+
+
+#ifdef CONFIG_SYS_FLASH_CFI_AMD_RESET /* needed for STM_ID_29W320DB on UC100 */
+# undef FLASH_CMD_RESET
+# define FLASH_CMD_RESET AMD_CMD_RESET /* use AMD-Reset instead */
+#endif
+
+
+typedef union {
+ unsigned char c;
+ unsigned short w;
+ unsigned long l;
+ unsigned long long ll;
+} cfiword_t;
+
+typedef union {
+ volatile unsigned char *cp;
+ volatile unsigned short *wp;
+ volatile unsigned long *lp;
+ volatile unsigned long long *llp;
+} cfiptr_t;
+
+/* use CFG_MAX_FLASH_BANKS_DETECT if defined */
+#ifdef CONFIG_SYS_MAX_FLASH_BANKS_DETECT
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS_DETECT] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS_DETECT]; /* FLASH chips info */
+#else
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* FLASH chips info */
+#endif
+
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c);
+static void flash_make_cmd (flash_info_t * info, uchar cmd, void *cmdbuf);
+static void flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static void flash_write_cmd_nodbg (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static void flash_write_cmd_int (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd, int noDebug);
+static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect);
+static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd);
+static int flash_detect_cfi (flash_info_t * info);
+ulong flash_get_size (ulong base, int banknum);
+static int flash_write_cfiword (flash_info_t * info, ulong dest, cfiword_t cword);
+static int flash_full_status_check (flash_info_t * info, flash_sect_t sector,
+ ulong tout, char *prompt);
+static void write_buffer_abort_reset(flash_info_t * info, flash_sect_t sector);
+#if defined(CFG_ENV_IS_IN_FLASH) || defined(CFG_ENV_ADDR_REDUND) || (CFG_MONITOR_BASE >= CFG_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base);
+#endif
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp, int len);
+static int flash_write_cfibuffer_amd (flash_info_t * info, ulong dest, uchar * cp, int len);
+#endif
+
+/*-----------------------------------------------------------------------
+ * create an address based on the offset and the port width
+ */
+inline uchar *flash_make_addr (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ return ((uchar *) (info->start[sect] + (offset * info->portwidth)));
+}
+
+/*-----------------------------------------------------------------------
+ * Debug support
+ */
+#ifdef DEBUG_FLASH
+static void print_longlong (char *str, unsigned long long data)
+{
+ int i;
+ char *cp;
+
+ cp = (unsigned char *) &data;
+ for (i = 0; i < 8; i++)
+ sprintf (&str[i * 2], "%2.2x", *cp++);
+}
+#endif
+
+#if defined(DEBUG_FLASH)
+static void flash_printqry (flash_info_t * info, flash_sect_t sect)
+{
+ cfiptr_t cptr;
+ int x, y;
+
+ for (x = 0; x < 0x40; x += 16U / info->portwidth) {
+ cptr.cp =
+ flash_make_addr (info, sect,
+ x + FLASH_OFFSET_CFI_RESP);
+ debug ("%p : ", cptr.cp);
+ for (y = 0; y < 16; y++) {
+ debug ("%2.2x ", cptr.cp[y]);
+ }
+ debug (" ");
+ for (y = 0; y < 16; y++) {
+ if (cptr.cp[y] >= 0x20 && cptr.cp[y] <= 0x7e) {
+ debug ("%c", cptr.cp[y]);
+ } else {
+ debug (".");
+ }
+ }
+ debug ("\n");
+ }
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ * read a character at a port width address
+ */
+inline uchar flash_read_uchar (flash_info_t * info, uint offset)
+{
+ uchar *cp;
+
+ cp = flash_make_addr (info, 0, offset);
+#if defined(__LITTLE_ENDIAN)
+ return (cp[0]);
+#else
+ return (cp[info->portwidth - 1]);
+#endif
+}
+
+/*-----------------------------------------------------------------------
+ * read a short word by swapping for ppc format.
+ */
+#if 0
+static ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ushort retval;
+
+#ifdef DEBUG_FLASH
+ int x;
+#endif
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG_FLASH
+ debug ("ushort addr is at %p info->portwidth = %d\n", addr,
+ info->portwidth);
+ for (x = 0; x < 2 * info->portwidth; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ if (info->interface == FLASH_CFI_X8X16) {
+ retval = (addr[0] | (addr[2] << 8));
+ } else {
+ retval = (addr[0] | (addr[(info->portwidth)] << 8));
+ }
+#else
+ retval = ((addr[(2 * info->portwidth) - 1] << 8) |
+ addr[info->portwidth - 1]);
+#endif
+
+ debug ("retval = 0x%x\n", retval);
+ return retval;
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ * read a long word by picking the least significant byte of each maximum
+ * port size word. Swap for ppc format.
+ */
+static ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ulong retval;
+#ifdef DEBUG_FLASH
+ int x;
+#endif
+#if 0
+ switch (info->interface) {
+ case FLASH_CFI_X8:
+ case FLASH_CFI_X16:
+ break;
+ case FLASH_CFI_X8X16:
+ offset <<= 1;
+ }
+#endif
+ // flash_make_addr() multiplies offset by info->portwidth.
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG_FLASH
+ debug ("long addr is at %p info->portwidth = %d\n", addr,
+ info->portwidth);
+ for (x = 0; x < 4 * info->portwidth; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ if (info->interface == FLASH_CFI_X8X16) {
+ retval = (addr[0] | (addr[2] << 8) | (addr[4] << 16) | (addr[6] << 24));
+ } else {
+ retval = (addr[0] | (addr[(info->portwidth)] << 8) |
+ (addr[(2 * info->portwidth)] << 16) |
+ (addr[(3 * info->portwidth)] << 24));
+ }
+#else
+ //FIXME: This undocumented code appears to match broken bus wiring.
+ retval = (addr[(2 * info->portwidth) - 1] << 24) |
+ (addr[(info->portwidth) - 1] << 16) |
+ (addr[(4 * info->portwidth) - 1] << 8) |
+ addr[(3 * info->portwidth) - 1];
+#endif
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+unsigned long flash_init (void)
+{
+ unsigned long size = 0;
+ int i;
+
+ /* Init: no FLASHes known */
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
+ flash_info[i].flash_id = FLASH_UNKNOWN;
+ size += flash_info[i].size = flash_get_size (bank_base[i], i);
+ if (flash_info[i].flash_id == FLASH_UNKNOWN) {
+#ifndef CFG_FLASH_QUIET_TEST
+ printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
+ i, flash_info[i].size, flash_info[i].size << 20);
+#endif /* CFG_FLASH_QUIET_TEST */
+ }
+ }
+
+ /* Monitor protection ON by default */
+#if (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_MONITOR_BASE,
+ CONFIG_MONITOR_BASE + monitor_flash_len - 1,
+ flash_get_info(CONFIG_MONITOR_BASE));
+#endif
+
+ /* Environment protection ON by default */
+#ifdef CONFIG_ENV_IS_IN_FLASH
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR,
+ CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
+ flash_get_info(CONFIG_ENV_ADDR));
+#endif
+
+ /* Redundant environment protection ON by default */
+#ifdef CONFIG_ENV_ADDR_REDUND
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR_REDUND,
+ CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SIZE_REDUND - 1,
+ flash_get_info(CONFIG_ENV_ADDR_REDUND));
+#endif
+ return (size);
+}
+
+/*-----------------------------------------------------------------------
+ */
+#if defined(CONFIG_ENV_IS_IN_FLASH) || defined(CONFIG_ENV_ADDR_REDUND) || (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base)
+{
+ int i;
+ flash_info_t * info = 0;
+
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i ++) {
+ info = & flash_info[i];
+ if (info->size && info->start[0] <= base &&
+ base <= info->start[0] + info->size - 1)
+ break;
+ }
+
+ return i == CONFIG_SYS_MAX_FLASH_BANKS ? 0 : info;
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ */
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+ int rcode = 0;
+ int prot;
+ flash_sect_t sect;
+ uchar ch;
+ uchar *addr;
+
+ if (info->flash_id != FLASH_MAN_CFI) {
+ puts ("Can't erase unknown flash type - aborted\n");
+ return 1;
+ }
+ if ((s_first < 0) || (s_first > s_last)) {
+ puts ("- no sectors to erase\n");
+ return 1;
+ }
+
+ prot = 0;
+ for (sect = s_first; sect <= s_last; ++sect) {
+ if (info->protect[sect]) {
+ prot++;
+ }
+ }
+ if (prot) {
+ printf ("- Warning: %d protected sectors will not be erased!\n", prot);
+ } else {
+ putc ('\n');
+ }
+
+
+ for (sect = s_first; sect <= s_last; sect++) {
+ if (info->protect[sect] == 0) { /* not protected */
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_STANDARD:
+ case CFI_CMDSET_INTEL_EXTENDED:
+ flash_write_cmd (info, sect, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd (info, sect, 0, FLASH_CMD_BLOCK_ERASE);
+ flash_write_cmd (info, sect, 0, FLASH_CMD_ERASE_CONFIRM);
+ break;
+ case CFI_CMDSET_AMD_STANDARD:
+ case CFI_CMDSET_AMD_EXTENDED:
+ flash_unlock_seq (info, sect);
+ flash_write_cmd (info, sect, AMD_ADDR_ERASE_START,
+ AMD_CMD_ERASE_START);
+ flash_unlock_seq (info, sect);
+ flash_write_cmd (info, sect, 0, AMD_CMD_ERASE_SECTOR);
+
+ /* toggle */
+ addr = flash_make_addr (info, sect, 0);
+ do {
+ ch = *(volatile uchar *)(addr);
+ } while ( ((ch & 0x80) == 0) || (ch != 0xFF) );
+ break;
+ default:
+ debug ("Unkown flash vendor %d\n",
+ info->vendor);
+ break;
+ }
+
+ if (flash_full_status_check
+ (info, sect, info->erase_blk_tout, "erase")) {
+ rcode = 1;
+ } else
+ putc ('.');
+ }
+ }
+ puts (" done\n");
+ return rcode;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+ int i;
+
+ if (info->flash_id != FLASH_MAN_CFI) {
+ puts ("missing or unknown FLASH type\n");
+ return;
+ }
+
+ printf ("CFI conformant FLASH (%d x %d)",
+ (info->portwidth << 3), (info->chipwidth << 3));
+ printf (" Size: %ld MB in %d Sectors\n",
+ info->size >> 20, info->sector_count);
+ printf (" Erase timeout %ld ms, write timeout %ld ms, buffer write timeout %ld ms, buffer size %d\n",
+ info->erase_blk_tout,
+ info->write_tout,
+ info->buffer_write_tout,
+ info->buffer_size);
+
+ puts (" Sector Start Addresses:");
+ for (i = 0; i < info->sector_count; ++i) {
+#ifdef CFG_FLASH_EMPTY_INFO
+ int k;
+ int size;
+ int erased;
+ volatile unsigned long *flash;
+
+ /*
+ * Check if whole sector is erased
+ */
+ if (i != (info->sector_count - 1))
+ size = info->start[i + 1] - info->start[i];
+ else
+ size = info->start[0] + info->size - info->start[i];
+ erased = 1;
+ flash = (volatile unsigned long *) info->start[i];
+ size = size >> 2; /* divide by 4 for longword access */
+ for (k = 0; k < size; k++) {
+ if (*flash++ != 0xffffffff) {
+ erased = 0;
+ break;
+ }
+ }
+
+ if ((i % 5) == 0)
+ printf ("\n");
+ /* print empty and read-only info */
+ printf (" %08lX%s%s",
+ info->start[i],
+ erased ? " E" : " ",
+ info->protect[i] ? "RO " : " ");
+#else /* ! CFG_FLASH_EMPTY_INFO */
+ if ((i % 5) == 0)
+ printf ("\n ");
+ printf (" %08lX%s",
+ info->start[i], info->protect[i] ? " (RO)" : " ");
+#endif
+ }
+ putc ('\n');
+ return;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+ ulong wp;
+ ulong cp;
+ int aln;
+ cfiword_t cword;
+ int i, rc;
+
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+ unsigned char pat[] = {'|', '-', '/', '\\'};
+ int patcnt = 0;
+ int buffered_size;
+#endif
+ /* get lower aligned address */
+ /* get lower aligned address */
+ wp = (addr & ~(info->portwidth - 1));
+
+ /* handle unaligned start */
+ if ((aln = addr - wp) != 0) {
+ cword.l = 0;
+ cp = wp;
+ for (i = 0; i < aln; ++i, ++cp)
+ flash_add_byte (info, &cword, (*(uchar *) cp));
+
+ for (; (i < info->portwidth) && (cnt > 0); i++) {
+ flash_add_byte (info, &cword, *src++);
+ cnt--;
+ cp++;
+ }
+ for (; (cnt == 0) && (i < info->portwidth); ++i, ++cp)
+ flash_add_byte (info, &cword, (*(uchar *) cp));
+ if ((rc = flash_write_cfiword (info, wp, cword)) != 0)
+ return rc;
+ wp = cp;
+ }
+
+ /* handle the aligned part */
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+ buffered_size = (info->portwidth / info->chipwidth);
+ buffered_size *= info->buffer_size;
+ while (cnt >= info->portwidth) {
+ /* Show processing */
+ if ((++patcnt % 256) == 0)
+ printf("%c\b", pat[(patcnt / 256) & 0x03]);
+
+ i = buffered_size > cnt ? cnt : buffered_size;
+ if ((rc = flash_write_cfibuffer (info, wp, src, i)) != ERR_OK)
+ return rc;
+ i -= i & (info->portwidth - 1);
+ wp += i;
+ src += i;
+ cnt -= i;
+ }
+#else
+ while (cnt >= info->portwidth) {
+ cword.l = 0;
+ for (i = 0; i < info->portwidth; i++) {
+ flash_add_byte (info, &cword, *src++);
+ }
+ if ((rc = flash_write_cfiword (info, wp, cword)) != 0)
+ return rc;
+ wp += info->portwidth;
+ cnt -= info->portwidth;
+ }
+#endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */
+ if (cnt == 0) {
+ return (0);
+ }
+
+ /*
+ * handle unaligned tail bytes
+ */
+ cword.l = 0;
+ for (i = 0, cp = wp; (i < info->portwidth) && (cnt > 0); ++i, ++cp) {
+ flash_add_byte (info, &cword, *src++);
+ --cnt;
+ }
+ for (; i < info->portwidth; ++i, ++cp) {
+ flash_add_byte (info, &cword, (*(uchar *) cp));
+ }
+
+ return flash_write_cfiword (info, wp, cword);
+}
+
+/*-----------------------------------------------------------------------
+ */
+#ifdef CFG_FLASH_PROTECTION
+
+int flash_real_protect (flash_info_t * info, long sector, int prot)
+{
+ int retcode = 0;
+
+ flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT);
+ if (prot)
+ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_SET);
+ else
+ flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT_CLEAR);
+
+ if ((retcode =
+ flash_full_status_check (info, sector, info->erase_blk_tout,
+ prot ? "protect" : "unprotect")) == 0) {
+
+ info->protect[sector] = prot;
+ /* Intel's unprotect unprotects all locking */
+ if (prot == 0) {
+ flash_sect_t i;
+
+ for (i = 0; i < info->sector_count; i++) {
+ if (info->protect[i])
+ flash_real_protect (info, i, 1);
+ }
+ }
+ }
+ return retcode;
+}
+
+/*-----------------------------------------------------------------------
+ * flash_read_user_serial - read the OneTimeProgramming cells
+ */
+void flash_read_user_serial (flash_info_t * info, void *buffer, int offset,
+ int len)
+{
+ uchar *src;
+ uchar *dst;
+
+ dst = buffer;
+ src = flash_make_addr (info, 0, FLASH_OFFSET_USER_PROTECTION);
+ flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
+ memcpy (dst, src + offset, len);
+ flash_write_cmd (info, 0, 0, info->cmd_reset);
+}
+
+/*
+ * flash_read_factory_serial - read the device Id from the protection area
+ */
+void flash_read_factory_serial (flash_info_t * info, void *buffer, int offset,
+ int len)
+{
+ uchar *src;
+
+ src = flash_make_addr (info, 0, FLASH_OFFSET_INTEL_PROTECTION);
+ flash_write_cmd (info, 0, 0, FLASH_CMD_READ_ID);
+ memcpy (buffer, src + offset, len);
+ flash_write_cmd (info, 0, 0, info->cmd_reset);
+}
+
+#endif /* CFG_FLASH_PROTECTION */
+
+/*
+ * flash_is_busy - check to see if the flash is busy
+ * This routine checks the status of the chip and returns true if the chip is busy
+ */
+static int flash_is_busy (flash_info_t * info, flash_sect_t sect)
+{
+ int retval;
+
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_STANDARD:
+ case CFI_CMDSET_INTEL_EXTENDED:
+ retval = !flash_isset (info, sect, 0, FLASH_STATUS_DONE);
+ break;
+ case CFI_CMDSET_AMD_STANDARD:
+ case CFI_CMDSET_AMD_EXTENDED:
+ retval = flash_toggle (info, sect, 0, AMD_STATUS_TOGGLE);
+ break;
+ default:
+ retval = 0;
+ }
+#ifdef DEBUG_FLASH
+ if (retval)
+ debug ("flash_is_busy: %d\n", retval);
+#endif
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ * wait for XSR.7 to be set. Time out with an error if it does not.
+ * This routine does not set the flash to read-array mode.
+ */
+static int flash_status_check (flash_info_t * info, flash_sect_t sector,
+ ulong tout, char *prompt)
+{
+ ulong start, now;
+
+ /* Wait for command completion */
+ // (Sun) Fix order of checking time so it works when the CPU is very
+ // slow, e.g., single-stepping or emulation.
+ start = get_timer (0);
+ while (now = get_timer(start),
+ flash_is_busy (info, sector))
+ {
+ if (now > info->erase_blk_tout) {
+ printf ("Flash %s timeout at address %lx data %lx\n",
+ prompt, info->start[sector],
+ flash_read_long (info, sector, 0));
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_TIMOUT;
+ }
+ }
+ return ERR_OK;
+}
+
+/*-----------------------------------------------------------------------
+ * Wait for XSR.7 to be set, if it times out print an error, otherwise do a full status check.
+ * This routine sets the flash to read-array mode.
+ */
+static int flash_full_status_check (flash_info_t * info, flash_sect_t sector,
+ ulong tout, char *prompt)
+{
+ int retcode;
+
+ retcode = flash_status_check (info, sector, tout, prompt);
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_EXTENDED:
+ case CFI_CMDSET_INTEL_STANDARD:
+ if ((retcode != ERR_OK)
+ && !flash_isequal (info, sector, 0, FLASH_STATUS_DONE)) {
+ retcode = ERR_INVAL;
+ printf ("Flash %s error at address %lx\n", prompt,
+ info->start[sector]);
+ if (flash_isset (info, sector, 0, FLASH_STATUS_ECLBS | FLASH_STATUS_PSLBS)) {
+ puts ("Command Sequence Error.\n");
+ } else if (flash_isset (info, sector, 0, FLASH_STATUS_ECLBS)) {
+ puts ("Block Erase Error.\n");
+ retcode = ERR_NOT_ERASED;
+ } else if (flash_isset (info, sector, 0, FLASH_STATUS_PSLBS)) {
+ puts ("Locking Error\n");
+ }
+ if (flash_isset (info, sector, 0, FLASH_STATUS_DPS)) {
+ puts ("Block locked.\n");
+ retcode = ERR_PROTECTED;
+ }
+ if (flash_isset (info, sector, 0, FLASH_STATUS_VPENS))
+ puts ("Vpp Low Error.\n");
+ }
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ break;
+ default:
+ break;
+ }
+ return retcode;
+}
+
+static void write_buffer_abort_reset(flash_info_t * info, flash_sect_t sector)
+{
+ flash_write_cmd (info, sector, 0xaaa, 0xaa);
+ flash_write_cmd (info, sector, 0x555, 0x55);
+ flash_write_cmd (info, sector, 0xaaa, 0xf0);
+}
+
+/*-----------------------------------------------------------------------
+ */
+static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c)
+{
+#if defined(__LITTLE_ENDIAN)
+ unsigned short w;
+ unsigned int l;
+ unsigned long long ll;
+#endif
+
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cword->c = c;
+ break;
+ case FLASH_CFI_16BIT:
+#if defined(__LITTLE_ENDIAN)
+ w = c;
+ w <<= 8;
+ cword->w = (cword->w >> 8) | w;
+#else
+ cword->w = (cword->w << 8) | c;
+#endif
+ break;
+ case FLASH_CFI_32BIT:
+#if defined(__LITTLE_ENDIAN)
+ l = c;
+ l <<= 24;
+ cword->l = (cword->l >> 8) | l;
+#else
+ cword->l = (cword->l << 8) | c;
+#endif
+ break;
+ case FLASH_CFI_64BIT:
+#if defined(__LITTLE_ENDIAN)
+ ll = c;
+ ll <<= 56;
+ cword->ll = (cword->ll >> 8) | ll;
+#else
+ cword->ll = (cword->ll << 8) | c;
+#endif
+ break;
+ }
+}
+
+
+/*-----------------------------------------------------------------------
+ * make a proper sized command based on the port and chip widths
+ */
+static void flash_make_cmd (flash_info_t * info, uchar cmd, void *cmdbuf)
+{
+ int i;
+ uchar *cp = (uchar *) cmdbuf;
+
+#if defined(__LITTLE_ENDIAN)
+ for (i = info->portwidth; i > 0; i--)
+#else
+ for (i = 1; i <= info->portwidth; i++)
+#endif
+ *cp++ = (i & (info->chipwidth - 1)) ? '\0' : cmd;
+}
+
+/*
+ * Write a proper sized command to the correct address
+ */
+static void
+flash_write_cmd (flash_info_t * info, flash_sect_t sect, uint offset,
+ uchar cmd)
+{
+#ifdef DEBUG_FLASH
+ const int noDebug = 0;
+#else
+ const int noDebug = 1;
+#endif
+ return flash_write_cmd_int(info, sect, offset, cmd, noDebug);
+}
+static void
+flash_write_cmd_nodbg (flash_info_t * info, flash_sect_t sect, uint offset,
+ uchar cmd)
+{
+ return flash_write_cmd_int(info, sect, offset, cmd, 1);
+}
+
+static void
+flash_write_cmd_int (flash_info_t * info, flash_sect_t sect, uint offset,
+ uchar cmd, int noDebug)
+{
+
+ volatile cfiptr_t addr;
+ cfiword_t cword;
+
+ addr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ if (noDebug == 0)
+ debug ("fwc addr %p cmd %x %x 8bit x %d bit\n", addr.cp, cmd,
+ cword.c, info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ *addr.cp = cword.c;
+ break;
+ case FLASH_CFI_16BIT:
+ if (noDebug == 0)
+ debug ("fwc addr %p cmd %x %4.4x 16bit x %d bit\n", addr.wp,
+ cmd, cword.w,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ *addr.wp = cword.w;
+ break;
+ case FLASH_CFI_32BIT:
+ if (noDebug == 0)
+ debug ("fwc addr %p cmd %x %8.8lx 32bit x %d bit\n", addr.lp,
+ cmd, cword.l,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ *addr.lp = cword.l;
+ break;
+ case FLASH_CFI_64BIT:
+#ifdef DEBUG_FLASH
+ if (noDebug == 0)
+ {
+ char str[20];
+
+ print_longlong (str, cword.ll);
+
+ debug ("fwrite addr %p cmd %x %s 64 bit x %d bit\n",
+ addr.llp, cmd, str,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ }
+#endif
+ *addr.llp = cword.ll;
+ break;
+ }
+}
+
+static void flash_unlock_seq (flash_info_t * info, flash_sect_t sect)
+{
+ flash_write_cmd_nodbg (info, sect, AMD_ADDR_START, AMD_CMD_UNLOCK_START);
+ flash_write_cmd_nodbg (info, sect, AMD_ADDR_ACK, AMD_CMD_UNLOCK_ACK);
+}
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd)
+{
+ cfiptr_t cptr;
+ cfiword_t cword;
+ int retval;
+#ifdef DEBUG_FLASH
+ const int dbg = 1;
+#else
+ const int dbg = 0;
+#endif
+ cptr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+
+ if (dbg)
+ debug ("is= cmd %x(%c) addr %p ", cmd, cmd, cptr.cp);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ if (dbg)
+ debug ("is= %x %x\n", cptr.cp[0], cword.c);
+ retval = (cptr.cp[0] == cword.c);
+ break;
+ case FLASH_CFI_16BIT:
+ if (dbg)
+ debug ("is= %4.4x %4.4x\n", cptr.wp[0], cword.w);
+ retval = (cptr.wp[0] == cword.w);
+ break;
+ case FLASH_CFI_32BIT:
+ if (dbg)
+ debug ("is= %8.8lx %8.8lx\n", cptr.lp[0], cword.l);
+ retval = (cptr.lp[0] == cword.l);
+ break;
+ case FLASH_CFI_64BIT:
+#ifdef DEBUG_FLASH
+ {
+ char str1[20];
+ char str2[20];
+
+ print_longlong (str1, cptr.llp[0]);
+ print_longlong (str2, cword.ll);
+ debug ("is= %s %s\n", str1, str2);
+ }
+#endif
+ retval = (cptr.llp[0] == cword.ll);
+ break;
+ default:
+ retval = 0;
+ break;
+ }
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd)
+{
+ cfiptr_t cptr;
+ cfiword_t cword;
+ int retval;
+
+ cptr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ retval = ((cptr.cp[0] & cword.c) == cword.c);
+ break;
+ case FLASH_CFI_16BIT:
+ retval = ((cptr.wp[0] & cword.w) == cword.w);
+ break;
+ case FLASH_CFI_32BIT:
+ retval = ((cptr.lp[0] & cword.l) == cword.l);
+ break;
+ case FLASH_CFI_64BIT:
+ retval = ((cptr.llp[0] & cword.ll) == cword.ll);
+ break;
+ default:
+ retval = 0;
+ break;
+ }
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd)
+{
+ cfiptr_t cptr;
+ cfiword_t cword;
+ int retval;
+
+ cptr.cp = flash_make_addr (info, sect, offset);
+ flash_make_cmd (info, cmd, &cword);
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ retval = ((cptr.cp[0] & cword.c) != (cptr.cp[0] & cword.c));
+ break;
+ case FLASH_CFI_16BIT:
+ retval = ((cptr.wp[0] & cword.w) != (cptr.wp[0] & cword.w));
+ break;
+ case FLASH_CFI_32BIT:
+ retval = ((cptr.lp[0] & cword.l) != (cptr.lp[0] & cword.l));
+ break;
+ case FLASH_CFI_64BIT:
+ retval = ((cptr.llp[0] & cword.ll) !=
+ (cptr.llp[0] & cword.ll));
+ break;
+ default:
+ retval = 0;
+ break;
+ }
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ * detect if flash is compatible with the Common Flash Interface (CFI)
+ * http://www.jedec.org/download/search/jesd68.pdf
+ *
+*/
+static int flash_detect_cfi (flash_info_t * info)
+{
+ ulong data;
+
+ debug ("flash_detect_cfi()... ");
+
+#if defined(CONFIG_FLASH_AST2300)
+ data = *(ulong *)(0x1e6e2070); /* hardware traping */
+ if (data & 0x10) /* D[4]: 0/1 (8/16) */
+ info->portwidth = FLASH_CFI_16BIT;
+ else
+ info->portwidth = FLASH_CFI_8BIT;
+#else
+ info->portwidth = FLASH_CFI_8BIT;
+#endif
+
+ {
+ for (info->chipwidth = FLASH_CFI_BY8;
+ info->chipwidth <= info->portwidth;
+ info->chipwidth <<= 1) {
+ flash_write_cmd (info, 0, 0, FLASH_CMD_RESET);
+ flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
+ if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q')
+ //FIXME: Next 3 lines were changed for 8-bit/16-bit flash chips.
+ && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP1, 'R')
+ && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP2, 'Y')) {
+ info->interface = flash_read_uchar (info, FLASH_OFFSET_INTERFACE);
+ debug ("device interface is %d\n",
+ info->interface);
+ debug ("found port %d chip %d ",
+ info->portwidth, info->chipwidth);
+ debug ("port %d bits chip %d bits\n",
+ info->portwidth << CFI_FLASH_SHIFT_WIDTH,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ return 1;
+ }
+ }
+ }
+ debug ("not found\n");
+ return 0;
+}
+
+/*
+ * The following code cannot be run from FLASH!
+ *
+ */
+ulong flash_get_size (ulong base, int banknum)
+{
+ flash_info_t *info = &flash_info[banknum];
+ int i, j;
+ flash_sect_t sect_cnt;
+ unsigned long sector;
+ unsigned long tmp;
+ int size_ratio;
+ uchar num_erase_regions;
+ int erase_region_size;
+ int erase_region_count;
+
+ info->start[0] = base;
+
+ if (flash_detect_cfi (info)) {
+ info->vendor = flash_read_uchar (info, FLASH_OFFSET_PRIMARY_VENDOR);
+#if defined(DEBUG_FLASH)
+ flash_printqry (info, 0);
+#endif
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_STANDARD:
+ case CFI_CMDSET_INTEL_EXTENDED:
+ default:
+ info->cmd_reset = FLASH_CMD_RESET;
+ break;
+ case CFI_CMDSET_AMD_STANDARD:
+ case CFI_CMDSET_AMD_EXTENDED:
+ info->cmd_reset = AMD_CMD_RESET;
+ break;
+ }
+
+ debugX(2, "manufacturer is %d\n", info->vendor);
+ size_ratio = info->portwidth / info->chipwidth;
+ /* if the chip is x8/x16 reduce the ratio by half */
+#if 0
+ if ((info->interface == FLASH_CFI_X8X16)
+ && (info->chipwidth == FLASH_CFI_BY8)) {
+ size_ratio >>= 1;
+ }
+#endif
+ num_erase_regions = flash_read_uchar (info, FLASH_OFFSET_NUM_ERASE_REGIONS);
+ debugX(2, "size_ratio %d port %d bits chip %d bits\n",
+ size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+ debugX(2, "found %d erase regions\n", num_erase_regions);
+ sect_cnt = 0;
+ sector = base;
+ for (i = 0; i < num_erase_regions; i++) {
+ if (i > MAX_NUM_ERASE_REGIONS) {
+ printf ("%d erase regions found, only %d used\n",
+ num_erase_regions, MAX_NUM_ERASE_REGIONS);
+ break;
+ }
+ // CFI Erase Block Region Information:
+ // Bits[31:16] = sect_size/256, 0 means 128-byte
+ // Bits[15:0] = num_sectors - 1
+ tmp = flash_read_long(info, 0,
+ FLASH_OFFSET_ERASE_REGIONS + i * 4);
+ debug("CFI erase block region info[%d]: 0x%08x, ",
+ i, tmp);
+ erase_region_count = (tmp & 0xffff) + 1;
+ tmp >>= 16;
+ erase_region_size = (tmp ? tmp * 256 : 128);
+ debug ("erase_region_count=%d erase_region_size=%d\n",
+ erase_region_count, erase_region_size);
+#if 0
+ erase_region_size = CFG_FLASH_SECTOR_SIZE; // Commented out
+ erase_region_count = CFG_FLASH_SECTOR_COUNT; // Commented out
+#endif
+ if (sect_cnt + erase_region_count > CONFIG_SYS_MAX_FLASH_SECT) {
+ printf("Warning: Erase region %d adds too many flash sectors"
+ " %d+%d; reducing to fit total limit of %d\n",
+ i, sect_cnt, erase_region_count, CONFIG_SYS_MAX_FLASH_SECT);
+ erase_region_count = CONFIG_SYS_MAX_FLASH_SECT - sect_cnt;
+ }
+ for (j = 0; j < erase_region_count; j++) {
+ info->start[sect_cnt] = sector;
+ sector += (erase_region_size * size_ratio);
+
+ /*
+ * Only read protection status from supported devices (intel...)
+ */
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_EXTENDED:
+ case CFI_CMDSET_INTEL_STANDARD:
+ info->protect[sect_cnt] =
+ flash_isset (info, sect_cnt,
+ FLASH_OFFSET_PROTECT,
+ FLASH_STATUS_PROTECT);
+ break;
+ default:
+ info->protect[sect_cnt] = 0; /* default: not protected */
+ }
+
+ sect_cnt++;
+ }
+ }
+
+ info->sector_count = sect_cnt;
+ /* multiply the size by the number of chips */
+ // info->size = (1 << flash_read_uchar (info, FLASH_OFFSET_SIZE)) * size_ratio;
+ // Use only the sectors that fit within the flash_info array size.
+ info->size = sector - base;
+ printf("Flash bank %d at %08x has 0x%x bytes in %d sectors"
+ " (chipSize 1<<%d, size_ratio %d).\n",
+ banknum, base, info->size, info->sector_count,
+ flash_read_uchar(info, FLASH_OFFSET_SIZE), size_ratio);
+
+ info->buffer_size = (1 << flash_read_uchar (info, FLASH_OFFSET_BUFFER_SIZE));
+ /* Limit the buffer size to 32bytes to meet most of AMD-styles flash's minimum requirement */
+ if (info->buffer_size > 32)
+ info->buffer_size = 32;
+ tmp = 1 << flash_read_uchar (info, FLASH_OFFSET_ETOUT);
+ info->erase_blk_tout = (tmp * (1 << flash_read_uchar (info, FLASH_OFFSET_EMAX_TOUT)));
+ tmp = 1 << flash_read_uchar (info, FLASH_OFFSET_WBTOUT);
+ info->buffer_write_tout = (tmp * (1 << flash_read_uchar (info, FLASH_OFFSET_WBMAX_TOUT)));
+ tmp = 1 << flash_read_uchar (info, FLASH_OFFSET_WTOUT);
+ info->write_tout = (tmp * (1 << flash_read_uchar (info, FLASH_OFFSET_WMAX_TOUT))) / 1000;
+ info->flash_id = FLASH_MAN_CFI;
+#if 0
+ if ((info->interface == FLASH_CFI_X8X16) && (info->chipwidth == FLASH_CFI_BY8)) {
+ info->portwidth >>= 1; /* XXX - Need to test on x8/x16 in parallel. */
+ }
+#endif
+ }
+
+ flash_write_cmd (info, 0, 0, info->cmd_reset);
+ return (info->size);
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_write_cfiword (flash_info_t * info, ulong dest,
+ cfiword_t cword)
+{
+
+ cfiptr_t ctladdr;
+ cfiptr_t cptr;
+ int flag;
+
+ ctladdr.cp = flash_make_addr (info, 0, 0);
+ cptr.cp = (uchar *) dest;
+
+
+ /* Check if Flash is (sufficiently) erased */
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ flag = ((cptr.cp[0] & cword.c) == cword.c);
+ break;
+ case FLASH_CFI_16BIT:
+ flag = ((cptr.wp[0] & cword.w) == cword.w);
+ break;
+ case FLASH_CFI_32BIT:
+ flag = ((cptr.lp[0] & cword.l) == cword.l);
+ break;
+ case FLASH_CFI_64BIT:
+ flag = ((cptr.llp[0] & cword.ll) == cword.ll);
+ break;
+ default:
+ return 2;
+ }
+ if (!flag)
+ return 2;
+
+ /* Disable interrupts which might cause a timeout here */
+ flag = disable_interrupts ();
+
+ switch (info->vendor) {
+ case CFI_CMDSET_INTEL_EXTENDED:
+ case CFI_CMDSET_INTEL_STANDARD:
+ flash_write_cmd_nodbg (info, 0, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd_nodbg (info, 0, 0, FLASH_CMD_WRITE);
+ break;
+ case CFI_CMDSET_AMD_EXTENDED:
+ case CFI_CMDSET_AMD_STANDARD:
+ flash_unlock_seq (info, 0);
+ flash_write_cmd_nodbg (info, 0, AMD_ADDR_START, AMD_CMD_WRITE);
+ break;
+ }
+
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cptr.cp[0] = cword.c;
+ break;
+ case FLASH_CFI_16BIT:
+ cptr.wp[0] = cword.w;
+ break;
+ case FLASH_CFI_32BIT:
+ cptr.lp[0] = cword.l;
+ break;
+ case FLASH_CFI_64BIT:
+ cptr.llp[0] = cword.ll;
+ break;
+ }
+
+ /* re-enable interrupts if necessary */
+ if (flag)
+ enable_interrupts ();
+
+ return flash_full_status_check (info, 0, info->write_tout, "write");
+}
+
+#ifdef CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+/* loop through the sectors from the highest address
+ * when the passed address is greater or equal to the sector address
+ * we have a match
+ */
+static flash_sect_t find_sector (flash_info_t * info, ulong addr)
+{
+ flash_sect_t sector;
+
+ for (sector = info->sector_count - 1; sector >= 0; sector--) {
+ if (addr >= info->start[sector])
+ break;
+ }
+ return sector;
+}
+
+static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp,
+ int len)
+{
+ flash_sect_t sector;
+ int cnt;
+ int retcode;
+ volatile cfiptr_t src;
+ volatile cfiptr_t dst;
+
+/* Add AMD write buffer mode support, ycchen@102006 */
+#if 0
+ /* buffered writes in the AMD chip set is not supported yet */
+ if((info->vendor == CFI_CMDSET_AMD_STANDARD) ||
+ (info->vendor == CFI_CMDSET_AMD_EXTENDED))
+ return ERR_INVAL;
+#endif
+ if((info->vendor == CFI_CMDSET_AMD_STANDARD) ||
+ (info->vendor == CFI_CMDSET_AMD_EXTENDED))
+ {
+ retcode = flash_write_cfibuffer_amd(info, dest, cp, len);
+ return retcode;
+ }
+
+ src.cp = cp;
+ dst.cp = (uchar *) dest;
+ sector = find_sector (info, dest);
+ flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
+ flash_write_cmd (info, sector, 0, FLASH_CMD_WRITE_TO_BUFFER);
+ if ((retcode =
+ flash_status_check (info, sector, info->buffer_write_tout,
+ "write to buffer")) == ERR_OK) {
+ /* reduce the number of loops by the width of the port */
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cnt = len;
+ break;
+ case FLASH_CFI_16BIT:
+ cnt = len >> 1;
+ break;
+ case FLASH_CFI_32BIT:
+ cnt = len >> 2;
+ break;
+ case FLASH_CFI_64BIT:
+ cnt = len >> 3;
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
+ while (cnt-- > 0) {
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ *dst.cp++ = *src.cp++;
+ break;
+ case FLASH_CFI_16BIT:
+ *dst.wp++ = *src.wp++;
+ break;
+ case FLASH_CFI_32BIT:
+ *dst.lp++ = *src.lp++;
+ break;
+ case FLASH_CFI_64BIT:
+ *dst.llp++ = *src.llp++;
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ }
+ flash_write_cmd (info, sector, 0,
+ FLASH_CMD_WRITE_BUFFER_CONFIRM);
+ retcode =
+ flash_full_status_check (info, sector,
+ info->buffer_write_tout,
+ "buffer write");
+ }
+ flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
+ return retcode;
+}
+
+
+static int flash_write_cfibuffer_amd (flash_info_t * info, ulong dest, uchar * cp,
+ int len)
+{
+ flash_sect_t sector;
+ int cnt;
+ int retcode;
+ volatile cfiptr_t src;
+ volatile cfiptr_t dst;
+ volatile cfiword_t tmpsrc, tmpdst;
+
+ src.cp = cp;
+ dst.cp = (uchar *) dest;
+ sector = find_sector (info, dest);
+ flash_unlock_seq (info, 0);
+ if ((retcode =
+ flash_status_check (info, sector, info->buffer_write_tout,
+ "write to buffer")) == ERR_OK) {
+ /* reduce the number of loops by the width of the port */
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ cnt = len;
+ *dst.cp = (uchar) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.cp = (uchar) (cnt -1);
+ break;
+ case FLASH_CFI_16BIT:
+ cnt = len >> 1;
+ *dst.wp = (unsigned short) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.wp = (unsigned short) (cnt -1);
+ break;
+ case FLASH_CFI_32BIT:
+ cnt = len >> 2;
+ *dst.lp = (unsigned long) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.lp = (unsigned long) (cnt -1);
+ break;
+ case FLASH_CFI_64BIT:
+ cnt = len >> 3;
+ *dst.llp = (unsigned long long) (AMD_CMD_WRITE_TO_BUFFER);
+ *dst.llp = (unsigned long long) (cnt -1);
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ while (cnt-- > 0) {
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ *dst.cp++ = *src.cp++;
+ break;
+ case FLASH_CFI_16BIT:
+ *dst.wp++ = *src.wp++;
+ break;
+ case FLASH_CFI_32BIT:
+ *dst.lp++ = *src.lp++;
+ break;
+ case FLASH_CFI_64BIT:
+ *dst.llp++ = *src.llp++;
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+ }
+ switch (info->portwidth) {
+ case FLASH_CFI_8BIT:
+ src.cp--;
+ dst.cp--;
+ *dst.cp = (unsigned char) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.c = *src.cp & 0x80;
+
+ do {
+ tmpdst.c = *(volatile uchar *)(dst.cp);
+
+ if (tmpdst.c & 0x20) { /* toggle DQ5 */
+ tmpdst.c = *(volatile uchar *)(dst.cp);
+ if ((tmpdst.c & 0x80) != tmpsrc.c)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.c & 0x02) { /* toggle DQ1 */
+ tmpdst.c = *(volatile uchar *)(dst.cp);
+ if ((tmpdst.c & 0x80) != tmpsrc.c)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.c & 0x80) != tmpsrc.c);
+
+ break;
+ case FLASH_CFI_16BIT:
+ src.wp--;
+ dst.wp--;
+ *dst.wp = (unsigned short) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.w = *src.wp & 0x80;
+
+ do {
+ tmpdst.w = *(volatile short *)(dst.wp);
+
+ if (tmpdst.w & 0x20) { /* toggle DQ5 */
+ tmpdst.w = *(volatile ushort *)(dst.wp);
+ if ((tmpdst.w & 0x80) != tmpsrc.w)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.w & 0x02) { /* toggle DQ1 */
+ tmpdst.w = *(volatile ushort *)(dst.wp);
+ if ((tmpdst.w & 0x80) != tmpsrc.w)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.w & 0x80) != tmpsrc.w);
+
+ break;
+ case FLASH_CFI_32BIT:
+ src.lp--;
+ dst.lp--;
+ *dst.lp = (unsigned long) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.l = *src.lp & 0x80;
+
+ do {
+ tmpdst.l = *(volatile ulong *)(dst.lp);
+
+ if (tmpdst.l & 0x20) { /* toggle DQ5 */
+ tmpdst.l = *(volatile ulong *)(dst.lp);
+ if ((tmpdst.l & 0x80) != tmpsrc.l)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.l & 0x02) { /* toggle DQ1 */
+ tmpdst.l = *(volatile ulong *)(dst.lp);
+ if ((tmpdst.l & 0x80) != tmpsrc.l)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.l & 0x80) != tmpsrc.l);
+
+ break;
+ case FLASH_CFI_64BIT:
+ src.llp--;
+ dst.llp--;
+ *dst.llp = (unsigned long long) (AMD_CMD_BUFFER_TO_FLASH);
+ tmpsrc.ll = *src.llp & 0x80;
+
+ do {
+ tmpdst.ll = *(volatile unsigned long long *)(dst.llp);
+
+ if (tmpdst.ll & 0x20) { /* toggle DQ5 */
+ tmpdst.ll = *(volatile unsigned long long *)(dst.llp);
+ if ((tmpdst.ll & 0x80) != tmpsrc.ll)
+ {
+ printf("program error occurred\n");
+ flash_write_cmd (info, sector, 0, info->cmd_reset);
+ return ERR_PROG_ERROR;
+ }
+ }
+ else if (tmpdst.ll & 0x02) { /* toggle DQ1 */
+ tmpdst.ll = *(volatile unsigned long long *)(dst.llp);
+ if ((tmpdst.ll & 0x80) != tmpsrc.ll)
+ {
+ printf("write buffer error occurred \n");
+ write_buffer_abort_reset(info, sector);
+ return ERR_PROG_ERROR;
+ }
+ }
+
+ } while ((tmpdst.ll & 0x80) != tmpsrc.ll);
+
+ break;
+ default:
+ return ERR_INVAL;
+ break;
+ }
+
+ retcode =
+ flash_full_status_check (info, sector,
+ info->buffer_write_tout,
+ "buffer write");
+ }
+
+ return retcode;
+}
+#endif /* CONFIG_SYS_FLASH_USE_BUFFER_WRITE */
+
+#ifdef CONFIG_FLASH_AST2300_DMA
+#define STCBaseAddress 0x1e620000
+
+/* for DMA */
+#define REG_FLASH_INTERRUPT_STATUS 0x08
+#define REG_FLASH_DMA_CONTROL 0x80
+#define REG_FLASH_DMA_FLASH_BASE 0x84
+#define REG_FLASH_DMA_DRAM_BASE 0x88
+#define REG_FLASH_DMA_LENGTH 0x8c
+
+#define FLASH_STATUS_DMA_BUSY 0x0000
+#define FLASH_STATUS_DMA_READY 0x0800
+#define FLASH_STATUS_DMA_CLEAR 0x0800
+
+#define FLASH_DMA_ENABLE 0x01
+
+void * memmove_dma(void * dest,const void *src,size_t count)
+{
+ ulong count_align, poll_time, data;
+
+ count_align = (count + 3) & 0xFFFFFFFC; /* 4-bytes align */
+ poll_time = 100; /* set 100 us as default */
+
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (~FLASH_DMA_ENABLE);
+
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_FLASH_BASE) = (ulong *) (src);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_DRAM_BASE) = (ulong *) (dest);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_LENGTH) = (ulong) (count_align);
+ udelay(10);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (FLASH_DMA_ENABLE);
+
+ /* wait poll */
+ do {
+ udelay(poll_time);
+ data = *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS);
+ } while (!(data & FLASH_STATUS_DMA_READY));
+
+ /* clear status */
+ *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS) |= FLASH_STATUS_DMA_CLEAR;
+}
+#endif
+#endif /* CFG_FLASH_CFI */
diff --git a/board/aspeed/ast2400/flash_spi.c b/board/aspeed/ast2400/flash_spi.c
new file mode 100755
index 0000000..ad89254
--- /dev/null
+++ b/board/aspeed/ast2400/flash_spi.c
@@ -0,0 +1,1634 @@
+/*
+ * 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
+ *
+ * History
+ * 01/20/2004 - combined variants of original driver.
+ * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay)
+ * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud)
+ * 01/27/2004 - Little endian support Ed Okerson
+ *
+ * Tested Architectures
+ * Port Width Chip Width # of banks Flash Chip Board
+ * 32 16 1 28F128J3 seranoa/eagle
+ * 64 16 1 28F128J3 seranoa/falcon
+ *
+ */
+
+/* The DEBUG define must be before common to enable debugging */
+/* #define DEBUG */
+
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/byteorder.h>
+#include <environment.h>
+#ifdef CONFIG_FLASH_SPI
+
+/*
+ * This file implements a Common Flash Interface (CFI) driver for U-Boot.
+ * The width of the port and the width of the chips are determined at initialization.
+ * These widths are used to calculate the address for access CFI data structures.
+ * It has been tested on an Intel Strataflash implementation and AMD 29F016D.
+ *
+ * References
+ * JEDEC Standard JESD68 - Common Flash Interface (CFI)
+ * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
+ * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
+ * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
+ *
+ * TODO
+ *
+ * Use Primary Extended Query table (PRI) and Alternate Algorithm Query
+ * Table (ALT) to determine if protection is available
+ *
+ * Add support for other command sets Use the PRI and ALT to determine command set
+ * Verify erase and program timeouts.
+ */
+
+#ifndef CONFIG_FLASH_BANKS_LIST
+#define CONFIG_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
+#endif
+
+/* use CFG_MAX_FLASH_BANKS_DETECT if defined */
+#ifdef CONFIG_SYS_MAX_FLASH_BANKS_DETECT
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS_DETECT] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS_DETECT]; /* FLASH chips info */
+#else
+static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS] = CONFIG_FLASH_BANKS_LIST;
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* FLASH chips info */
+#endif
+
+/* Support Flash ID */
+#define STM25P64 0x172020
+#define STM25P128 0x182020
+#define N25Q256 0x19ba20
+#define N25Q512 0x20ba20
+#define S25FL064A 0x160201
+#define S25FL128P 0x182001
+#define S25FL256S 0x190201
+#define W25X16 0x1530ef
+#define W25X64 0x1730ef
+#define W25Q64BV 0x1740ef
+#define W25Q128BV 0x1840ef
+#define W25Q256FV 0x1940ef
+#define MX25L1605D 0x1520C2
+#define MX25L12805D 0x1820C2
+#define MX25L25635E 0x1920C2
+#define SST25VF016B 0x4125bf
+#define SST25VF064C 0x4b25bf
+#define AT25DF161 0x02461F
+#define AT25DF321 0x01471F
+
+/* SPI Define */
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+#if defined(CONFIG_AST1300)
+#define STCBaseAddress 0x00620000
+#else
+#define STCBaseAddress 0x1e620000
+#endif
+#define SCU_REVISION_REGISTER 0x1e6e207c
+#define SCU_CACHE_CTRL_REGISTER 0x1e6e2118
+
+#define SPICtrlRegOffset 0x10
+#define SPICtrlRegOffset2 0x14
+
+#define SPIMiscCtrlRegOffset 0x54
+
+/* for DMA */
+#define REG_FLASH_INTERRUPT_STATUS 0x08
+#define REG_FLASH_DMA_CONTROL 0x80
+#define REG_FLASH_DMA_FLASH_BASE 0x84
+#define REG_FLASH_DMA_DRAM_BASE 0x88
+#define REG_FLASH_DMA_LENGTH 0x8c
+
+#define FLASH_STATUS_DMA_BUSY 0x0000
+#define FLASH_STATUS_DMA_READY 0x0800
+#define FLASH_STATUS_DMA_CLEAR 0x0800
+
+#define FLASH_DMA_ENABLE 0x01
+#else
+#define STCBaseAddress 0x16000000
+
+#define SPICtrlRegOffset 0x04
+#define SPICtrlRegOffset2 0x0C
+#endif /* CONFIG_FLASH_AST2300 */
+
+#define CMD_MASK 0xFFFFFFF8
+
+#define NORMALREAD 0x00
+#define FASTREAD 0x01
+#define NORMALWRITE 0x02
+#define USERMODE 0x03
+
+#define CE_LOW 0x00
+#define CE_HIGH 0x04
+
+/* AST2300 only */
+#define IOMODEx1 0x00000000
+#define IOMODEx2 0x20000000
+#define IOMODEx2_dummy 0x30000000
+#define IOMODEx4 0x40000000
+#define IOMODEx4_dummy 0x50000000
+
+#define DUMMY_COMMAND_OUT 0x00008000
+/* ~AST2300 only */
+
+/* specificspi */
+#define SpecificSPI_N25Q512 0x00000001
+
+static ulong AST2300_SPICLK_DIV[16] = {0x0F, 0x07, 0x0E, 0x06, 0x0D, 0x05, 0x0C, 0x04, \
+ 0x0B, 0x03, 0x0A, 0x02, 0x09, 0x01, 0x08, 0x00 };
+
+/*-----------------------------------------------------------------------
+ * Functions
+ */
+static void reset_flash (flash_info_t * info);
+static void enable_write (flash_info_t * info);
+static void write_status_register (flash_info_t * info, uchar data);
+static void enable4b (flash_info_t * info);
+static void enable4b_spansion (flash_info_t * info);
+static void enable4b_numonyx (flash_info_t * info);
+static ulong flash_get_size (ulong base, int banknum);
+static int flash_write_buffer (flash_info_t *info, uchar *src, ulong addr, int len);
+#if defined(CFG_ENV_IS_IN_FLASH) || defined(CFG_ENV_ADDR_REDUND) || (CFG_MONITOR_BASE >= CFG_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base);
+#endif
+
+
+/*-----------------------------------------------------------------------
+ * create an address based on the offset and the port width
+ */
+inline uchar *flash_make_addr (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+#ifdef CONFIG_2SPIFLASH
+ if (info->start[0] >= PHYS_FLASH_2)
+ return ((uchar *) (info->start[sect] + (offset * 1) - (PHYS_FLASH_2 - PHYS_FLASH_2_BASE) ));
+ else
+ return ((uchar *) (info->start[sect] + (offset * 1)));
+#else
+ return ((uchar *) (info->start[sect] + (offset * 1)));
+#endif
+}
+
+/*-----------------------------------------------------------------------
+ * read a character at a port width address
+ */
+inline uchar flash_read_uchar (flash_info_t * info, uint offset)
+{
+ uchar *cp;
+
+ cp = flash_make_addr (info, 0, offset);
+#if defined(__LITTLE_ENDIAN)
+ return (cp[0]);
+#else
+ return (cp[1 - 1]);
+#endif
+}
+
+/*-----------------------------------------------------------------------
+ * read a short word by swapping for ppc format.
+ */
+ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ushort retval;
+
+#ifdef DEBUG
+ int x;
+#endif
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG
+ debug ("ushort addr is at %p 1 = %d\n", addr,
+ 1);
+ for (x = 0; x < 2 * 1; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ retval = ((addr[(1)] << 8) | addr[0]);
+#else
+ retval = ((addr[(2 * 1) - 1] << 8) |
+ addr[1 - 1]);
+#endif
+
+ debug ("retval = 0x%x\n", retval);
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ * read a long word by picking the least significant byte of each maiximum
+ * port size word. Swap for ppc format.
+ */
+ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset)
+{
+ uchar *addr;
+ ulong retval;
+
+#ifdef DEBUG
+ int x;
+#endif
+ addr = flash_make_addr (info, sect, offset);
+
+#ifdef DEBUG
+ debug ("long addr is at %p 1 = %d\n", addr,
+ 1);
+ for (x = 0; x < 4 * 1; x++) {
+ debug ("addr[%x] = 0x%x\n", x, addr[x]);
+ }
+#endif
+#if defined(__LITTLE_ENDIAN)
+ retval = (addr[0] << 16) | (addr[(1)] << 24) |
+ (addr[(2 * 1)]) | (addr[(3 * 1)] << 8);
+#else
+ retval = (addr[(2 * 1) - 1] << 24) |
+ (addr[(1) - 1] << 16) |
+ (addr[(4 * 1) - 1] << 8) |
+ addr[(3 * 1) - 1];
+#endif
+ return retval;
+}
+
+/*-----------------------------------------------------------------------
+ */
+static void disable_cache(void)
+{
+#if defined(AST1300_CPU_CACHE_ENABLE)
+ ulong uldata;
+
+ uldata = *(volatile ulong *) (SCU_CACHE_CTRL_REGISTER);
+ uldata &= 0xfffffffd;
+ *(ulong *) (SCU_CACHE_CTRL_REGISTER) = uldata;
+#endif
+}
+
+static void enable_cache(void)
+{
+#if defined(AST1300_CPU_CACHE_ENABLE)
+ ulong uldata;
+
+ uldata = *(volatile ulong *) (SCU_CACHE_CTRL_REGISTER);
+ uldata |= 0x00000002;
+ *(ulong *) (SCU_CACHE_CTRL_REGISTER) = uldata;
+#endif
+}
+
+static void reset_flash (flash_info_t * info)
+{
+ ulong ulCtrlData, CtrlOffset, MiscCtrlOffset;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ ulCtrlData = info->iomode | (info->readcmd << 16) | (info->tCK_Read << 8) | (info->dummybyte << 6) | FASTREAD;
+#if 0
+ if (info->quadport)
+ {
+ MiscCtrlOffset = SPIMiscCtrlRegOffset;
+ *(ulong *) (STCBaseAddress + MiscCtrlOffset) = info->dummydata;
+ ulCtrlData |= DUMMY_COMMAND_OUT;
+ }
+#endif
+#else
+ ulCtrlData = (info->readcmd << 16) | (info->tCK_Read << 8) | (info->dummybyte << 6) | FASTREAD;
+ if (info->dualport)
+ ulCtrlData |= 0x08;
+#endif
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+
+ enable_cache();
+}
+
+static void enable_write (flash_info_t * info)
+{
+ ulong base;
+ ulong ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x06);
+ udelay(10);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x02));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+}
+
+static void write_status_register (flash_info_t * info, uchar data)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ enable_write (info);
+
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x01);
+ udelay(10);
+ *(uchar *) (base) = (uchar) (data);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (jReg & 0x01);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+}
+
+static void enable4b (flash_info_t * info)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0xb7);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+} /* enable4b */
+
+static void enable4b_spansion (flash_info_t * info)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ /* Enable 4B: BAR0 D[7] = 1 */
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x17);
+ udelay(10);
+ *(uchar *) (base) = (uchar) (0x80);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x16);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x80));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+} /* enable4b_spansion */
+
+static void enable4b_numonyx (flash_info_t * info)
+{
+ ulong base;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ //base = info->start[0];
+ base = flash_make_addr (info, 0, 0);
+
+ /* Enable Write */
+ enable_write (info);
+
+ /* Enable 4B: CMD:0xB7 */
+ ulCtrlData = (info->tCK_Write << 8);
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0xB7);
+ udelay(10);
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+} /* enable4b_numonyx */
+
+/*
+ *
+ */
+static ulong flash_get_size (ulong base, int banknum)
+{
+ flash_info_t *info = &flash_info[banknum];
+ int j;
+ unsigned long sector;
+ int erase_region_size;
+ ulong ulCtrlData, CtrlOffset;
+ ulong ulID;
+ uchar ch[3];
+ ulong cpuclk, div, reg;
+ ulong WriteClk, EraseClk, ReadClk;
+ ulong vbase;
+ ulong SCURevision;
+
+ ulong ulRefPLL;
+ ulong ulDeNumerator;
+ ulong ulNumerator;
+ ulong ulOD;
+
+ disable_cache();
+
+ info->start[0] = base;
+ vbase = flash_make_addr (info, 0, 0);
+
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ CtrlOffset = SPICtrlRegOffset;
+ info->CE = 0;
+#else
+ if (vbase == PHYS_FLASH_1)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ info->CE = 2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ info->CE = 0;
+ }
+#endif
+
+ /* Get Flash ID */
+ ulCtrlData = *(ulong *) (STCBaseAddress + CtrlOffset) & CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (vbase) = (uchar) (0x9F);
+ udelay(10);
+ ch[0] = *(volatile uchar *)(vbase);
+ udelay(10);
+ ch[1] = *(volatile uchar *)(vbase);
+ udelay(10);
+ ch[2] = *(volatile uchar *)(vbase);
+ udelay(10);
+ ulCtrlData = *(ulong *) (STCBaseAddress + CtrlOffset) & CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ ulID = ((ulong)ch[0]) | ((ulong)ch[1] << 8) | ((ulong)ch[2] << 16) ;
+ info->flash_id = ulID;
+
+ //printf("SPI Flash ID: %x \n", ulID);
+
+ /* init default */
+ info->iomode = IOMODEx1;
+ info->address32 = 0;
+ info->quadport = 0;
+ info->specificspi = 0;
+
+ switch (info->flash_id)
+ {
+ case STM25P64:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 40;
+ EraseClk = 20;
+ ReadClk = 40;
+ break;
+
+ case STM25P128:
+ info->sector_count = 64;
+ info->size = 0x1000000;
+ erase_region_size = 0x40000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+ break;
+
+ case N25Q256:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case N25Q512:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ info->specificspi = SpecificSPI_N25Q512;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 1024;
+ info->size = 0x4000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case W25X16:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case W25X64:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case W25Q64BV:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 80;
+ EraseClk = 40;
+ ReadClk = 80;
+ break;
+
+ case W25Q128BV:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x3b;
+ info->dualport = 1;
+ info->dummybyte = 1;
+ info->iomode = IOMODEx2;
+ info->buffersize = 256;
+ WriteClk = 104;
+ EraseClk = 50;
+ ReadClk = 104;
+ break;
+
+ case W25Q256FV:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case S25FL064A:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case S25FL128P:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 100;
+ EraseClk = 40;
+ ReadClk = 100;
+ break;
+
+ case S25FL256S:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#endif
+ break;
+
+ case MX25L25635E:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ case MX25L12805D:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+/*
+SCU7C: Silicon Revision ID Register
+D[31:24]: Chip ID
+0: AST2050/AST2100/AST2150/AST2200/AST3000
+1: AST2300
+
+D[23:16] Silicon revision ID for AST2300 generation and later
+0: A0
+1: A1
+2: A2
+.
+.
+.
+FPGA revision starts from 0x80
+
+AST2300 A0 SPI can't run faster than 50Mhz
+*/
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+
+ SCURevision = *(ulong *) (SCU_REVISION_REGISTER);
+ if (((SCURevision >> 24) & 0xff) == 0x01) { //AST2300
+ if (((SCURevision >> 16) & 0xff) == 0x00) { //A0
+ WriteClk = 25;
+ EraseClk = 20;
+ ReadClk = 25;
+ }
+ }
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ case MX25L1605D:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 256;
+ WriteClk = 50;
+ EraseClk = 20;
+ ReadClk = 50;
+ break;
+
+ case SST25VF016B:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case SST25VF064C:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case AT25DF161:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ case AT25DF321:
+ info->sector_count = 32;
+ info->size = 0x400000;
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ break;
+
+ default: /* use JEDEC ID */
+ erase_region_size = 0x10000;
+ info->readcmd = 0x0b;
+ info->dualport = 0;
+ info->dummybyte = 1;
+ info->buffersize = 1;
+ WriteClk = 50;
+ EraseClk = 25;
+ ReadClk = 50;
+ if ((info->flash_id & 0xFF) == 0x1F) /* Atmel */
+ {
+ switch (info->flash_id & 0x001F00)
+ {
+ case 0x000400:
+ info->sector_count = 8;
+ info->size = 0x80000;
+ break;
+ case 0x000500:
+ info->sector_count = 16;
+ info->size = 0x100000;
+ break;
+ case 0x000600:
+ info->sector_count = 32;
+ info->size = 0x200000;
+ break;
+ case 0x000700:
+ info->sector_count = 64;
+ info->size = 0x400000;
+ break;
+ case 0x000800:
+ info->sector_count = 128;
+ info->size = 0x800000;
+ break;
+ case 0x000900:
+ info->sector_count = 256;
+ info->size = 0x1000000;
+ break;
+ default:
+ printf("Can't support this SPI Flash!! \n");
+ return 0;
+ }
+ } /* Atmel JDEC */
+ else /* JDEC */
+ {
+ switch (info->flash_id & 0xFF0000)
+ {
+ case 0x120000:
+ info->sector_count = 4;
+ info->size = 0x40000;
+ break;
+ case 0x130000:
+ info->sector_count = 8;
+ info->size = 0x80000;
+ break;
+ case 0x140000:
+ info->sector_count =16;
+ info->size = 0x100000;
+ break;
+ case 0x150000:
+ info->sector_count =32;
+ info->size = 0x200000;
+ break;
+ case 0x160000:
+ info->sector_count =64;
+ info->size = 0x400000;
+ break;
+ case 0x170000:
+ info->sector_count =128;
+ info->size = 0x800000;
+ break;
+ case 0x180000:
+ info->sector_count =256;
+ info->size = 0x1000000;
+ break;
+ case 0x190000:
+ info->sector_count =256;
+ info->size = 0x1000000;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 512;
+ info->size = 0x2000000;
+ info->address32 = 1;
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ case 0x200000:
+ info->sector_count =256;
+ info->size = 0x1000000;
+ if ((info->flash_id & 0xFF) == 0x20) /* numonyx */
+ info->specificspi = SpecificSPI_N25Q512;
+#if defined(CONFIG_FLASH_AST2300) || defined(CONFIG_AST1300)
+ info->sector_count = 1024;
+ info->size = 0x4000000;
+ info->address32 = 1;
+#if defined(CONFIG_FLASH_SPIx2_Dummy)
+ info->readcmd = 0xbb;
+ info->dummybyte = 1;
+ info->dualport = 1;
+ info->iomode = IOMODEx2_dummy;
+#elif defined(CONFIG_FLASH_SPIx4_Dummy)
+ info->readcmd = 0xeb;
+ info->dummybyte = 3;
+ info->dualport = 0;
+ info->iomode = IOMODEx4_dummy;
+ info->quadport = 1;
+ info->dummydata = 0xaa;
+#endif
+#endif
+ break;
+
+ default:
+ printf("Can't support this SPI Flash!! \n");
+ return 0;
+ }
+ } /* JDEC */
+ }
+
+ debug ("erase_region_count = %d erase_region_size = %d\n",
+ erase_region_count, erase_region_size);
+
+ sector = base;
+ for (j = 0; j < info->sector_count; j++) {
+
+ info->start[j] = sector;
+ sector += erase_region_size;
+ info->protect[j] = 0; /* default: not protected */
+ }
+
+ /* set SPI flash extended info */
+#if defined(CONFIG_AST1300)
+ if (info->size > 0x200000) /* limit MAX Flash to 2MB for AST1300 */
+ info->size = 0x200000;
+#endif
+#if defined(CONFIG_AST2400) || defined(CONFIG_AST2300) || defined(CONFIG_AST2300_FPGA_1) || defined(CONFIG_AST2300_FPGA_2) || defined(CONFIG_AST1300)
+ reg = *((volatile ulong*) 0x1e6e2024);
+ if (reg & 0x40000)
+ {
+ reg = *((volatile ulong*) 0x1e6e2070);
+
+ ulRefPLL = 24;
+ ulDeNumerator = reg & 0x0F;
+ ulNumerator = (reg & 0x07E0) >> 5;
+ ulOD = (reg & 0x10) ? 1:2;
+
+ cpuclk = ulRefPLL * ulOD * (ulNumerator + 2) / (ulDeNumerator + 1);
+ }
+ else
+ {
+ reg = *((volatile ulong*) 0x1e6e2070);
+#if defined(CONFIG_AST2400)
+ if (reg & 0x00800000) //ref. clk:25MHz
+ {
+ switch (reg & 0x300)
+ {
+ case 0x000:
+ cpuclk = 400;
+ break;
+ case 0x100:
+ cpuclk = 375;
+ break;
+ case 0x200:
+ cpuclk = 350;
+ break;
+ case 0x300:
+ cpuclk = 325;
+ break;
+ }
+ }
+ else
+ {
+ switch (reg & 0x300) //ref. clk:24MHz
+ {
+ case 0x000:
+ cpuclk = 384;
+ break;
+ case 0x100:
+ cpuclk = 360;
+ break;
+ case 0x200:
+ cpuclk = 336;
+ break;
+ case 0x300:
+ cpuclk = 312;
+ break;
+ }
+ }
+#else
+ switch (reg & 0x300)
+ {
+ case 0x000:
+ cpuclk = 384;
+ break;
+ case 0x100:
+ cpuclk = 360;
+ break;
+ case 0x200:
+ cpuclk = 336;
+ break;
+ case 0x300:
+ cpuclk = 408;
+ break;
+ }
+#endif
+ }
+
+ reg = *((volatile ulong*) 0x1e6e2070);
+ switch (reg & 0xc00)
+ {
+ case 0x000:
+ cpuclk /= 1;
+ break;
+ case 0x400:
+ cpuclk /= 2;
+ break;
+ case 0x800:
+ cpuclk /= 4;
+ break;
+ case 0xC00:
+ cpuclk /= 3;
+ break;
+ }
+#else /* AST2100 */
+ reg = *((volatile ulong*) 0x1e6e2070);
+ switch (reg & 0xe00)
+ {
+ case 0x000:
+ cpuclk = 266;
+ break;
+ case 0x200:
+ cpuclk = 233;
+ break;
+ case 0x400:
+ cpuclk = 200;
+ break;
+ case 0x600:
+ cpuclk = 166;
+ break;
+ case 0x800:
+ cpuclk = 133;
+ break;
+ case 0xA00:
+ cpuclk = 100;
+ break;
+ case 0xC00:
+ cpuclk = 300;
+ break;
+ case 0xE00:
+ cpuclk = 24;
+ break;
+ }
+ switch (reg & 0x3000)
+ {
+ case 0x1000:
+ cpuclk /= 2;
+ break;
+ case 0x2000:
+ cpuclk /= 4;
+ break;
+ case 0x3000:
+ cpuclk /= 3;
+ break;
+ }
+#endif
+
+#if defined(CONFIG_AST2400) || defined(CONFIG_AST2300) || defined(CONFIG_AST2300_FPGA_1) || defined(CONFIG_AST2300_FPGA_2) || defined(CONFIG_AST1300)
+
+#if defined(CONFIG_AST2300) || defined(CONFIG_AST1300)
+ /* limit Max SPI CLK to 50MHz (Datasheet v1.2) */
+ if (WriteClk > 50) WriteClk = 50;
+ if (EraseClk > 50) EraseClk = 50;
+ if (ReadClk > 50) ReadClk = 50;
+#endif
+
+ div = 1;
+ while ( ((cpuclk/div) > WriteClk) && (div < 16) )
+ {
+ div++;
+ }
+ info->tCK_Write = AST2300_SPICLK_DIV[div-1];
+
+ div = 1;
+ while ( ((cpuclk/div) > EraseClk) && (div < 16) )
+ {
+ div++;
+ }
+ info->tCK_Erase = AST2300_SPICLK_DIV[div-1];
+
+ div = 1;
+ while ( ((cpuclk/div) > ReadClk) && (div < 16) )
+ {
+ div++;
+ }
+ info->tCK_Read = AST2300_SPICLK_DIV[div-1];
+#else
+ div = 2;
+ info->tCK_Write = 7;
+ while ( (cpuclk/div) > WriteClk )
+ {
+ info->tCK_Write--;
+ div +=2;
+ }
+ div = 2;
+ info->tCK_Erase = 7;
+ while ( (cpuclk/div) > EraseClk )
+ {
+ info->tCK_Erase--;
+ div +=2;
+ }
+ div = 2;
+ info->tCK_Read = 7;
+ while ( (cpuclk/div) > ReadClk )
+ {
+ info->tCK_Read--;
+ div +=2;
+ }
+#endif
+
+ /* unprotect flash */
+ write_status_register(info, 0);
+
+ if (info->quadport)
+ write_status_register(info, 0x40); /* enable QE */
+
+ if (info->address32)
+ {
+ reg = *((volatile ulong*) 0x1e6e2070); /* set H/W Trappings */
+ reg |= 0x10;
+ *((volatile ulong*) 0x1e6e2070) = reg;
+
+ reg = *((volatile ulong*) 0x1e620004); /* enable 32b control bit*/
+ reg |= (0x01 << info->CE);
+ *((volatile ulong*) 0x1e620004) = reg;
+
+ /* set flash chips to 32bits addressing mode */
+ if ((info->flash_id & 0xFF) == 0x01) /* Spansion */
+ enable4b_spansion(info);
+ else if ((info->flash_id & 0xFF) == 0x20) /* Numonyx */
+ enable4b_numonyx(info);
+ else /* MXIC, Winbond */
+ enable4b(info);
+
+ }
+
+ reset_flash(info);
+
+ return (info->size);
+}
+
+
+/*-----------------------------------------------------------------------
+ */
+static int flash_write_buffer (flash_info_t *info, uchar *src, ulong addr, int len)
+{
+ ulong j, base, offset;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ base = info->start[0];
+ offset = addr - base;
+ base = flash_make_addr (info, 0, 0);
+
+ enable_write (info);
+
+ ulCtrlData = (info->tCK_Write << 8);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x02);
+ udelay(10);
+ if (info->address32)
+ {
+ *(uchar *) (base) = (uchar) ((offset & 0xff000000) >> 24);
+ udelay(10);
+ }
+ *(uchar *) (base) = (uchar) ((offset & 0xff0000) >> 16);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x00ff00) >> 8);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x0000ff));
+ udelay(10);
+
+ for (j=0; j<len; j++)
+ {
+ *(uchar *) (base) = *(uchar *) (src++);
+ udelay(10);
+ }
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while ((jReg & 0x01));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ /* RFSR */
+ if (info->specificspi == SpecificSPI_N25Q512)
+ {
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x70);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x80));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ }
+}
+
+/*-----------------------------------------------------------------------
+ *
+ * export functions
+ *
+ */
+
+/*-----------------------------------------------------------------------
+ *
+ */
+unsigned long flash_init (void)
+{
+ unsigned long size = 0;
+ int i;
+
+ /* Init: no FLASHes known */
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
+ flash_info[i].flash_id = FLASH_UNKNOWN;
+ size += flash_info[i].size = flash_get_size (bank_base[i], i);
+ if (flash_info[i].flash_id == FLASH_UNKNOWN) {
+#ifndef CFG_FLASH_QUIET_TEST
+ printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
+ i, flash_info[i].size, flash_info[i].size << 20);
+#endif /* CFG_FLASH_QUIET_TEST */
+ }
+ }
+
+ /* Monitor protection ON by default */
+#if (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_MONITOR_BASE,
+ CONFIG_MONITOR_BASE + monitor_flash_len - 1,
+ flash_get_info(CONFIG_MONITOR_BASE));
+#endif
+
+ /* Environment protection ON by default */
+#ifdef CONFIG_ENV_IS_IN_FLASH
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR,
+ CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
+ flash_get_info(CONFIG_ENV_ADDR));
+#endif
+
+ /* Redundant environment protection ON by default */
+#ifdef CONFIG_ENV_ADDR_REDUND
+ flash_protect (FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR_REDUND,
+ CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SIZE_REDUND - 1,
+ flash_get_info(CONFIG_ENV_ADDR_REDUND));
+#endif
+ return (size);
+}
+
+/*-----------------------------------------------------------------------
+ */
+#if defined(CONFIG_ENV_IS_IN_FLASH) || defined(CONFIG_ENV_ADDR_REDUND) || (CONFIG_MONITOR_BASE >= CONFIG_SYS_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base)
+{
+ int i;
+ flash_info_t * info = 0;
+
+ for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i ++) {
+ info = & flash_info[i];
+ if (info->size && info->start[0] <= base &&
+ base <= info->start[0] + info->size - 1)
+ break;
+ }
+
+ return i == CONFIG_SYS_MAX_FLASH_BANKS ? 0 : info;
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ */
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+ int rcode = 0;
+ int prot;
+ flash_sect_t sect;
+
+ ulong base, offset;
+ ulong ulSMMBase, ulCtrlData, CtrlOffset;
+ uchar jReg;
+
+ disable_cache();
+
+ if (info->CE == 2)
+ {
+ CtrlOffset = SPICtrlRegOffset2;
+ }
+ else
+ {
+ CtrlOffset = SPICtrlRegOffset;
+ }
+
+ if ((s_first < 0) || (s_first > s_last)) {
+ puts ("- no sectors to erase\n");
+ return 1;
+ }
+
+ prot = 0;
+ for (sect = s_first; sect <= s_last; ++sect) {
+ if (info->protect[sect]) {
+ prot++;
+ }
+ }
+ if (prot) {
+ printf ("- Warning: %d protected sectors will not be erased!\n", prot);
+ } else {
+ putc ('\n');
+ }
+
+ ulCtrlData = (info->tCK_Erase << 8);
+ for (sect = s_first; sect <= s_last; sect++) {
+ if (info->protect[sect] == 0) { /* not protected */
+ /* start erasing */
+ enable_write(info);
+
+ base = info->start[0];
+ offset = info->start[sect] - base;
+ base = flash_make_addr (info, 0, 0);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0xd8);
+ udelay(10);
+ if (info->address32)
+ {
+ *(uchar *) (base) = (uchar) ((offset & 0xff000000) >> 24);
+ udelay(10);
+ }
+ *(uchar *) (base) = (uchar) ((offset & 0xff0000) >> 16);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x00ff00) >> 8);
+ udelay(10);
+ *(uchar *) (base) = (uchar) ((offset & 0x0000ff));
+ udelay(10);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x05);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while ((jReg & 0x01));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+
+ /* RFSR */
+ if (info->specificspi == SpecificSPI_N25Q512)
+ {
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_LOW | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ *(uchar *) (base) = (uchar) (0x70);
+ udelay(10);
+ do {
+ jReg = *(volatile uchar *) (base);
+ } while (!(jReg & 0x80));
+ ulCtrlData &= CMD_MASK;
+ ulCtrlData |= CE_HIGH | USERMODE;
+ *(ulong *) (STCBaseAddress + CtrlOffset) = ulCtrlData;
+ udelay(200);
+ }
+
+ putc ('.');
+ }
+ }
+ puts (" done\n");
+
+ reset_flash(info);
+
+ return rcode;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info (flash_info_t * info)
+{
+ putc ('\n');
+ return;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+ int count;
+ unsigned char pat[] = {'|', '-', '/', '\\'};
+ int patcnt;
+
+ disable_cache();
+
+ /* get lower aligned address */
+ if (addr & (info->buffersize - 1))
+ {
+ count = cnt >= info->buffersize ? (info->buffersize - (addr & 0xff)):cnt;
+ flash_write_buffer (info, src, addr, count);
+ addr+= count;
+ src += count;
+ cnt -= count;
+ }
+
+ /* prog */
+ while (cnt > 0) {
+ count = cnt >= info->buffersize ? info->buffersize:cnt;
+ flash_write_buffer (info, src, addr, count);
+ addr+= count;
+ src += count;
+ cnt -= count;
+ printf("%c\b", pat[(patcnt++) & 0x03]);
+ }
+
+ reset_flash(info);
+
+ return (0);
+}
+
+#ifdef CONFIG_FLASH_AST2300_DMA
+void * memmove_dma(void * dest,const void *src,size_t count)
+{
+ ulong count_align, poll_time, data;
+
+ count_align = (count + 3) & 0xFFFFFFFC; /* 4-bytes align */
+ poll_time = 100; /* set 100 us as default */
+
+ /* force end of burst read */
+ *(volatile ulong *) (STCBaseAddress + SPICtrlRegOffset) |= CE_HIGH;
+ *(volatile ulong *) (STCBaseAddress + SPICtrlRegOffset) &= ~CE_HIGH;
+
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (~FLASH_DMA_ENABLE);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_FLASH_BASE) = (ulong *) (src);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_DRAM_BASE) = (ulong *) (dest);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_LENGTH) = (ulong) (count_align);
+ *(ulong *) (STCBaseAddress + REG_FLASH_DMA_CONTROL) = (ulong) (FLASH_DMA_ENABLE);
+
+ /* wait poll */
+ do {
+ udelay(poll_time);
+ data = *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS);
+ } while (!(data & FLASH_STATUS_DMA_READY));
+
+ /* clear status */
+ *(ulong *) (STCBaseAddress + REG_FLASH_INTERRUPT_STATUS) |= FLASH_STATUS_DMA_CLEAR;
+}
+#endif
+#endif /* CONFIG_FLASH_SPI */
diff --git a/board/aspeed/ast2400/hactest.c b/board/aspeed/ast2400/hactest.c
new file mode 100755
index 0000000..bfa87d5
--- /dev/null
+++ b/board/aspeed/ast2400/hactest.c
@@ -0,0 +1,762 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_HACTEST) && defined(CONFIG_SLT))
+#include "hactest.h"
+
+#include "aes.c"
+#include "rc4.c"
+
+static unsigned char crypto_src[CRYPTO_MAX_SRC], crypto_dst[CRYPTO_MAX_DST], crypto_context[CRYPTO_MAX_CONTEXT];
+static unsigned char hash_src[HASH_MAX_SRC], hash_dst[HASH_MAX_DST], hmac_key[HMAC_MAX_KEY];
+
+/*
+ * table
+ */
+static aes_test aestest[] = {
+ { CRYPTOMODE_ECB, 128,
+ {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c, '\0'},
+ {0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34, '\0'},
+ {0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32, '\0'} },
+ {0xFF, 0xFF, "", "", ""}, /* End Mark */
+};
+
+static rc4_test rc4test[] = {
+ {{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, '\0'},
+ {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, '\0'}},
+ {{0xff}, {0xff}}, /* End Mark */
+};
+
+static hash_test hashtest[] = {
+ {HASHMODE_SHA1, 20,
+ "abc",
+ {0x53, 0x20, 0xb0, 0x8c, 0xa1, 0xf5, 0x74, 0x62, 0x50, 0x71, 0x89, 0x41, 0xc5, 0x0a, 0xdf, 0x4e, 0xbb, 0x55, 0x76, 0x06, '\0'}},
+ {0xFF, 0xFF, "", ""}, /* End Mark */
+};
+
+static hmac_test hmactest[] = {
+ {HASHMODE_SHA1, 64, 20,
+ {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, '\0' },
+ "Sample #1",
+ {0xbf, 0x39, 0xda, 0xb1, 0x7d, 0xc2, 0xe1, 0x23, 0x0d, 0x28, 0x35, 0x3b, 0x8c, 0xcb, 0x14, 0xb6, 0x22, 0x02, 0x65, 0xb3, '\0'}},
+ {0xFF, 0xFF, 0xFF, "", "", ""}, /* End Mark */
+};
+
+void EnableHMAC(void)
+{
+ unsigned long ulData;
+
+ /* init SCU */
+ *(unsigned long *) (0x1e6e2000) = 0x1688a8a8;
+
+ ulData = *(volatile unsigned long *) (0x1e6e200c);
+ ulData &= 0xfdfff;
+ *(unsigned long *) (0x1e6e200c) = ulData;
+ udelay(100);
+ ulData = *(volatile unsigned long *) (0x1e6e2004);
+ ulData &= 0xfffef;
+ *(unsigned long *) (0x1e6e2004) = ulData;
+
+}
+
+/* AES */
+void aes_enc_ast3000(aes_context *ctx, uint8 *input, uint8 *iv, uint8 *output, uint32 ulMsgLength , uint32 ulAESMode)
+{
+
+ unsigned long i, ulTemp, ulCommand;
+ unsigned char ch;
+ unsigned char *pjsrc, *pjdst, *pjcontext;
+
+ ulCommand = CRYPTO_ENABLE_RW | CRYPTO_ENABLE_CONTEXT_LOAD | CRYPTO_ENABLE_CONTEXT_SAVE | \
+ CRYPTO_AES | CRYPTO_ENCRYPTO | CRYPTO_SYNC_MODE_ASYNC;
+
+ switch (ctx->nr)
+ {
+ case 10:
+ ulCommand |= CRYPTO_AES128;
+ break;
+ case 12:
+ ulCommand |= CRYPTO_AES192;
+ break;
+ case 14:
+ ulCommand |= CRYPTO_AES256;
+ break;
+ }
+
+ switch (ulAESMode)
+ {
+ case CRYPTOMODE_ECB:
+ ulCommand |= CRYPTO_AES_ECB;
+ break;
+ case CRYPTOMODE_CBC:
+ ulCommand |= CRYPTO_AES_CBC;
+ break;
+ case CRYPTOMODE_CFB:
+ ulCommand |= CRYPTO_AES_CFB;
+ break;
+ case CRYPTOMODE_OFB:
+ ulCommand |= CRYPTO_AES_OFB;
+ break;
+ case CRYPTOMODE_CTR:
+ ulCommand |= CRYPTO_AES_CTR;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) crypto_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) crypto_dst);
+ pjcontext = (unsigned char *) m16byteAlignment((unsigned long) crypto_context);
+
+ /* Init HW */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CONTEXT_BASE_OFFSET) = (unsigned long) pjcontext;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_LEN_OFFSET) = ulMsgLength;
+
+ /* Set source */
+ for (i=0; i< ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(input + i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* Set Context */
+ /* Set IV */
+ for (i=0; i<16; i++)
+ {
+ ch = *(uint8 *) (iv + i);
+ *(uint8 *) (pjcontext + i) = ch;
+ }
+
+ /* Set Expansion Key */
+ for (i=0; i<(4*(ctx->nr+1)); i++)
+ {
+ ulTemp = ((ctx->erk[i] & 0xFF) << 24) + ((ctx->erk[i] & 0xFF00) << 8) + ((ctx->erk[i] & 0xFF0000) >> 8) + ((ctx->erk[i] & 0xFF000000) >> 24);
+ *(uint32 *) (pjcontext + i*4 + 16) = ulTemp;
+ }
+
+ /* fire cmd */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CMD_BASE_OFFSET) = ulCommand;
+ do {
+ ulTemp = *(volatile unsigned long *) (HAC_REG_BASE + REG_CRYPTO_STATUS_OFFSET);
+ } while (ulTemp & CRYPTO_BUSY);
+
+ /* Output */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* aes_enc_ast3000 */
+
+
+void aes_dec_ast3000(aes_context *ctx, uint8 *input, uint8 *iv, uint8 *output, uint32 ulMsgLength , uint32 ulAESMode)
+{
+ unsigned long i, ulTemp, ulCommand;
+ unsigned char ch;
+ unsigned char *pjsrc, *pjdst, *pjcontext;
+
+ ulCommand = CRYPTO_ENABLE_RW | CRYPTO_ENABLE_CONTEXT_LOAD | CRYPTO_ENABLE_CONTEXT_SAVE | \
+ CRYPTO_AES | CRYPTO_DECRYPTO | CRYPTO_SYNC_MODE_ASYNC;
+
+ switch (ctx->nr)
+ {
+ case 10:
+ ulCommand |= CRYPTO_AES128;
+ break;
+ case 12:
+ ulCommand |= CRYPTO_AES192;
+ break;
+ case 14:
+ ulCommand |= CRYPTO_AES256;
+ break;
+ }
+
+ switch (ulAESMode)
+ {
+ case CRYPTOMODE_ECB:
+ ulCommand |= CRYPTO_AES_ECB;
+ break;
+ case CRYPTOMODE_CBC:
+ ulCommand |= CRYPTO_AES_CBC;
+ break;
+ case CRYPTOMODE_CFB:
+ ulCommand |= CRYPTO_AES_CFB;
+ break;
+ case CRYPTOMODE_OFB:
+ ulCommand |= CRYPTO_AES_OFB;
+ break;
+ case CRYPTOMODE_CTR:
+ ulCommand |= CRYPTO_AES_CTR;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) crypto_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) crypto_dst);
+ pjcontext = (unsigned char *) m16byteAlignment((unsigned long) crypto_context);
+
+ /* Init HW */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CONTEXT_BASE_OFFSET) = (unsigned long) pjcontext;
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_LEN_OFFSET) = ulMsgLength;
+
+ /* Set source */
+ for (i=0; i< ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(input + i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* Set Context */
+ /* Set IV */
+ for (i=0; i<16; i++)
+ {
+ ch = *(uint8 *) (iv + i);
+ *(uint8 *) (pjcontext + i) = ch;
+ }
+
+ /* Set Expansion Key */
+ for (i=0; i<(4*(ctx->nr+1)); i++)
+ {
+ ulTemp = ((ctx->erk[i] & 0xFF) << 24) + ((ctx->erk[i] & 0xFF00) << 8) + ((ctx->erk[i] & 0xFF0000) >> 8) + ((ctx->erk[i] & 0xFF000000) >> 24);
+ *(uint32 *) (pjcontext + i*4 + 16) = ulTemp;
+ }
+
+ /* fire cmd */
+ *(unsigned long *) (HAC_REG_BASE + REG_CRYPTO_CMD_BASE_OFFSET) = ulCommand;
+ do {
+ ulTemp = *(volatile unsigned long *) (HAC_REG_BASE + REG_CRYPTO_STATUS_OFFSET);
+ } while (ulTemp & CRYPTO_BUSY);
+
+ /* Output */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* aes_dec_ast3000 */
+
+void rc4_crypt_ast3000(uint8 *data, int ulMsgLength, uint8 *rc4_key, uint32 ulKeyLength)
+{
+ struct rc4_state s;
+ unsigned long i, ulTemp, ulCommand;
+ unsigned char ch;
+ unsigned char *pjsrc, *pjdst, *pjcontext;
+
+ ulCommand = CRYPTO_ENABLE_RW | CRYPTO_ENABLE_CONTEXT_LOAD | CRYPTO_ENABLE_CONTEXT_SAVE | \
+ CRYPTO_RC4 | CRYPTO_SYNC_MODE_ASYNC;
+
+ rc4_setup( &s, rc4_key, ulKeyLength );
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) crypto_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) crypto_dst);
+ pjcontext = (unsigned char *) m16byteAlignment((unsigned long) crypto_context);
+
+ /* Init HW */
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_CONTEXT_BASE_OFFSET) = (unsigned long) pjcontext;
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_LEN_OFFSET) = ulMsgLength;
+
+
+ /* Set source */
+ for (i=0; i< ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(data + i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* Set Context */
+ /* Set i, j */
+ *(uint32 *) (pjcontext + 8) = 0x0001;
+
+ /* Set Expansion Key */
+ for (i=0; i<(256/4); i++)
+ {
+ ulTemp = (s.m[i * 4] & 0xFF) + ((s.m[i * 4 + 1] & 0xFF) << 8) + ((s.m[i * 4 + 2] & 0xFF) << 16) + ((s.m[i * 4+ 3] & 0xFF) << 24);
+ *(uint32 *) (pjcontext + i*4 + 16) = ulTemp;
+ }
+
+ /* fire cmd */
+ *(uint32 *) (HAC_REG_BASE + REG_CRYPTO_CMD_BASE_OFFSET) = ulCommand;
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_CRYPTO_STATUS_OFFSET);
+ } while (ulTemp & CRYPTO_BUSY);
+
+ /* Output */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(volatile uint8 *) (pjdst + i);
+ *(uint8 *) (data + i) = ch;
+ }
+
+} /* rc4_crypt_ast3000 */
+
+/* Hash */
+void hash_ast3000(uint8 *msg, uint32 ulLength, unsigned char *output, uint32 ulHashMode)
+{
+ uint32 i, ulTemp, ulCommand, ulDigestLength, ulMyMsgLength;
+ uint8 ch;
+ unsigned char *pjsrc, *pjdst;
+
+ /* Get Info */
+ switch (ulHashMode)
+ {
+ case HASHMODE_MD5:
+ ulCommand = HASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case HASHMODE_SHA1:
+ ulCommand = HASH_ALG_SELECT_SHA1 | 0x08;
+ ulDigestLength = 20;
+ break;
+ case HASHMODE_SHA256:
+ ulCommand = HASH_ALG_SELECT_SHA256 | 0x08;
+ ulDigestLength = 32;
+ break;
+ case HASHMODE_SHA224:
+ ulCommand = HASH_ALG_SELECT_SHA224 | 0x08;
+ ulDigestLength = 28;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) hash_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) hash_dst);
+
+ /* 16byte alignment */
+ ulMyMsgLength = m16byteAlignment(ulLength);
+
+ /* Init. HW */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_LEN_OFFSET) = ulMyMsgLength;
+
+ /* write src */
+ for (i=0; i<ulLength; i++)
+ {
+ ch = *(uint8 *)(msg+i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+ for (i=ulLength; i<ulMyMsgLength; i++)
+ *(uint8 *) (pjsrc + i) = 0;
+
+ /* fire cmd */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_CMD_OFFSET) = ulCommand;
+
+ /* get digest */
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_HASH_STATUS_OFFSET);
+ } while (ulTemp & HASH_BUSY);
+
+ for (i=0; i<ulDigestLength; i++)
+ {
+ ch = *(volatile uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* hash_ast3000 */
+
+/* HMAC */
+void hmackey_ast3000(uint8 *key, uint32 ulKeyLength, uint32 ulHashMode)
+{
+ uint32 i, ulBlkLength, ulDigestLength, ulTemp, ulCommand;
+ uint8 k0[64], sum[32];
+ uint8 ch;
+ unsigned char *pjsrc, *pjdst, *pjkey;
+
+ /* Get Info */
+ switch (ulHashMode)
+ {
+ case HASHMODE_MD5:
+ ulCommand = HASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case HASHMODE_SHA1:
+ ulCommand = HASH_ALG_SELECT_SHA1 | 0x08;
+ ulDigestLength = 20;
+ break;
+ case HASHMODE_SHA256:
+ ulCommand = HASH_ALG_SELECT_SHA256 | 0x08;
+ ulDigestLength = 32;
+ break;
+ case HASHMODE_SHA224:
+ ulCommand = HASH_ALG_SELECT_SHA224 | 0x08;
+ ulDigestLength = 28;
+ break;
+ }
+ ulBlkLength = 64; /* MD5, SHA1/256/224: 64bytes */
+
+ /* Init */
+ memset( (void *) k0, 0, 64); /* reset to zero */
+ memset( (void *) sum, 0, 32); /* reset to zero */
+
+ /* Get k0 */
+ if (ulKeyLength <= ulBlkLength)
+ memcpy( (void *) k0, (void *) key, ulKeyLength );
+ else /* (ulKeyLength > ulBlkLength) */
+ {
+ hash_ast3000(key, ulKeyLength, sum, ulHashMode);
+ memcpy( (void *) k0, (void *) sum, ulDigestLength );
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) hash_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) hash_dst);
+ pjkey = (unsigned char *) m64byteAlignment((unsigned long) hmac_key);
+
+ /* Calculate digest */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_KEY_BASE_OFFSET) = (unsigned long) pjkey;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_LEN_OFFSET) = ulBlkLength;
+
+ /* write key to src */
+ for (i=0; i<ulBlkLength; i++)
+ {
+ ch = *(uint8 *)(k0+i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+
+ /* fire cmd for calculate */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_CMD_OFFSET) = ulCommand | HAC_DIGEST_CAL_ENABLE;
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_HASH_STATUS_OFFSET);
+ } while (ulTemp & HASH_BUSY);
+
+} /* hmackey_ast3000 */
+
+void hmac_ast3000(uint8 *key, uint32 ulKeyLength, uint8 *msg, uint32 ulMsgLength, uint32 ulHashMode, unsigned char *output)
+{
+ uint32 i, ulTemp, ulCommand, ulDigestLength, ulMyMsgLength;;
+ uint8 ch;
+ unsigned char *pjsrc, *pjdst, *pjkey;
+
+ /* Calculate digest */
+ switch (ulHashMode)
+ {
+ case HASHMODE_MD5:
+ ulCommand = HASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case HASHMODE_SHA1:
+ ulCommand = HASH_ALG_SELECT_SHA1 | 0x08;
+ ulDigestLength = 20;
+ break;
+ case HASHMODE_SHA256:
+ ulCommand = HASH_ALG_SELECT_SHA256 | 0x08;
+ ulDigestLength = 32;
+ break;
+ case HASHMODE_SHA224:
+ ulCommand = HASH_ALG_SELECT_SHA224 | 0x08;
+ ulDigestLength = 28;
+ break;
+ }
+
+ pjsrc = (unsigned char *) m16byteAlignment((unsigned long) hash_src);
+ pjdst = (unsigned char *) m16byteAlignment((unsigned long) hash_dst);
+ pjkey = (unsigned char *) m64byteAlignment((unsigned long) hmac_key);
+
+ /* 16byte alignment */
+ ulMyMsgLength = m16byteAlignment(ulMsgLength);
+
+ /* Init. HW */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_SRC_BASE_OFFSET) = (unsigned long) pjsrc;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_DST_BASE_OFFSET) = (unsigned long) pjdst;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_KEY_BASE_OFFSET) = (unsigned long) pjkey;
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_LEN_OFFSET) = ulMyMsgLength;
+
+ /* write Text to src */
+ for (i=0; i<ulMsgLength; i++)
+ {
+ ch = *(uint8 *)(msg+i);
+ *(uint8 *) (pjsrc + i) = ch;
+ }
+ for (i=ulMsgLength; i<ulMyMsgLength; i++)
+ *(uint8 *) (pjsrc + i) = 0;
+
+ /* fire cmd */
+ *(uint32 *) (HAC_REG_BASE + REG_HASH_CMD_OFFSET) = ulCommand | HAC_ENABLE;
+ do {
+ ulTemp = *(volatile uint32 *) (HAC_REG_BASE + REG_HASH_STATUS_OFFSET);
+ } while (ulTemp & HASH_BUSY);
+
+ /* Output Digest */
+ for (i=0; i<ulDigestLength; i++)
+ {
+ ch = *(uint8 *) (pjdst + i);
+ *(uint8 *) (output + i) = ch;
+ }
+
+} /* hmac_ast3000 */
+
+/* main hactest procedure */
+int do_hactest (void)
+{
+ unsigned long i, j, Flags = 0;
+ aes_test *pjaes_test;
+ aes_context aes_ctx;
+ unsigned char AES_Mode[8], aes_output[64];
+ unsigned long ulAESMsgLength;
+
+ rc4_test *pjrc4_test;
+ unsigned char rc4_buf_sw[64], rc4_buf_hw[64];
+ unsigned long ulRC4KeyLength, ulRC4MsgLength;
+
+ hash_test *pjhash_test;
+ unsigned char HASH_Mode[8], hash_out[64];
+
+ hmac_test *pjhmac_test;
+ unsigned char HMAC_Mode[8], hmac_out[64];
+
+ EnableHMAC();
+
+ /* AES Test */
+ pjaes_test = aestest;
+ while (pjaes_test->aes_mode != 0xFF)
+ {
+
+ if (pjaes_test->aes_mode == CRYPTOMODE_CBC)
+ strcpy (AES_Mode, "CBC");
+ else if (pjaes_test->aes_mode == CRYPTOMODE_CFB)
+ strcpy (AES_Mode, "CFB");
+ else if (pjaes_test->aes_mode == CRYPTOMODE_OFB)
+ strcpy (AES_Mode, "OFB");
+ else if (pjaes_test->aes_mode == CRYPTOMODE_CTR)
+ strcpy (AES_Mode, "CTR");
+ else
+ strcpy (AES_Mode, "ECB");
+
+ /* Get Msg. Length */
+ ulAESMsgLength = strlen(pjaes_test->plaintext);
+ j = ( (ulAESMsgLength + 15) >> 4) << 4;
+ for (i=ulAESMsgLength; i<j; i++)
+ pjaes_test->plaintext[i] = 0;
+ ulAESMsgLength = j;
+
+ aes_set_key(&aes_ctx, pjaes_test->key, pjaes_test->key_length);
+
+ /* Encryption Test */
+ aes_enc_ast3000(&aes_ctx, pjaes_test->plaintext, pjaes_test->key, aes_output, ulAESMsgLength, pjaes_test->aes_mode);
+ if (strncmp(aes_output, pjaes_test->ciphertext, ulAESMsgLength))
+ {
+ Flags |= FLAG_AESTEST_FAIL;
+ printf("[INFO] AES%d %s Mode Encryption Failed \n", pjaes_test->key_length, AES_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", pjaes_test->ciphertext[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", aes_output[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] AES%d %s Mode Encryption Passed \n", pjaes_test->key_length, AES_Mode);
+ */
+ }
+
+ /* Decryption Test */
+ aes_dec_ast3000(&aes_ctx, pjaes_test->ciphertext, pjaes_test->key, aes_output, ulAESMsgLength, pjaes_test->aes_mode);
+ if (strncmp(aes_output, pjaes_test->plaintext, ulAESMsgLength))
+ {
+ Flags |= FLAG_AESTEST_FAIL;
+ printf("[INFO] AES%d %s Mode Decryption Failed \n", pjaes_test->key_length, AES_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", pjaes_test->plaintext[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< ulAESMsgLength; i++)
+ {
+ printf("%02x ", aes_output[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] AES%d %s Mode Decryption Passed \n", pjaes_test->key_length, AES_Mode);
+ */
+ }
+
+ pjaes_test++;
+ } /* AES */
+
+ /* RC4 Test */
+ pjrc4_test = rc4test;
+ while ((pjrc4_test->key[0] != 0xff) && (pjrc4_test->data[0] != 0xff))
+ {
+
+ /* Get Info */
+ ulRC4KeyLength = strlen(pjrc4_test->key);
+ ulRC4MsgLength = strlen(pjrc4_test->data);
+ memcpy( (void *) rc4_buf_sw, (void *) pjrc4_test->data, ulRC4MsgLength );
+ memcpy( (void *) rc4_buf_hw, (void *) pjrc4_test->data, ulRC4MsgLength );
+
+ /* Crypto */
+ rc4_crypt_sw(rc4_buf_sw, ulRC4MsgLength, pjrc4_test->key, ulRC4KeyLength);
+ rc4_crypt_ast3000(rc4_buf_hw, ulRC4MsgLength, pjrc4_test->key, ulRC4KeyLength);
+
+ if (strncmp(rc4_buf_hw, rc4_buf_sw, ulRC4MsgLength))
+ {
+ Flags |= FLAG_RC4TEST_FAIL;
+ printf("[INFO] RC4 Encryption Failed \n");
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< ulRC4MsgLength; i++)
+ {
+ printf("%02x ", rc4_buf_sw[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< ulRC4MsgLength; i++)
+ {
+ printf("%02x ", rc4_buf_hw[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] RC4 Encryption Passed \n");
+ */
+ }
+
+ pjrc4_test++;
+
+ } /* RC4 */
+
+ /* Hash Test */
+ pjhash_test = hashtest;
+ while (pjhash_test->hash_mode != 0xFF)
+ {
+
+ if (pjhash_test->hash_mode == HASHMODE_MD5)
+ strcpy (HASH_Mode, "MD5");
+ else if (pjhash_test->hash_mode == HASHMODE_SHA1)
+ strcpy (HASH_Mode, "SHA1");
+ else if (pjhash_test->hash_mode == HASHMODE_SHA256)
+ strcpy (HASH_Mode, "SHA256");
+ else if (pjhash_test->hash_mode == HASHMODE_SHA224)
+ strcpy (HASH_Mode, "SHA224");
+
+ /* Hash */
+ hash_ast3000(pjhash_test->input, strlen(pjhash_test->input), hash_out, pjhash_test->hash_mode);
+ if (strncmp(hash_out, pjhash_test->digest, pjhash_test->digest_length))
+ {
+ Flags |= FLAG_HASHTEST_FAIL;
+ printf("[INFO] HASH %s Failed \n", HASH_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< pjhash_test->digest_length; i++)
+ {
+ printf("%02x ",pjhash_test->digest[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< pjhash_test->digest_length; i++)
+ {
+ printf("%02x ",hash_out[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] HASH %s Passed \n", HASH_Mode);
+ */
+ }
+
+ pjhash_test++;
+
+ } /* Hash Test */
+
+ /* HMAC Test */
+ pjhmac_test = hmactest;
+ while (pjhmac_test->hash_mode != 0xFF)
+ {
+
+ if (pjhmac_test->hash_mode == HASHMODE_MD5)
+ strcpy (HMAC_Mode, "MD5");
+ else if (pjhmac_test->hash_mode == HASHMODE_SHA1)
+ strcpy (HMAC_Mode, "SHA1");
+ else if (pjhmac_test->hash_mode == HASHMODE_SHA256)
+ strcpy (HMAC_Mode, "SHA256");
+ else if (pjhmac_test->hash_mode == HASHMODE_SHA224)
+ strcpy (HMAC_Mode, "SHA224");
+
+ /* HMAC */
+ hmackey_ast3000(pjhmac_test->key, pjhmac_test->key_length, pjhmac_test->hash_mode);
+ hmac_ast3000(pjhmac_test->key, pjhmac_test->key_length, pjhmac_test->input, strlen(pjhmac_test->input), pjhmac_test->hash_mode, hmac_out);
+ if (strncmp(hmac_out, pjhmac_test->digest, pjhmac_test->digest_length))
+ {
+ Flags |= FLAG_HASHTEST_FAIL;
+ printf("[INFO] HMAC %s Failed \n", HMAC_Mode);
+ printf("[DBG] Golden Data Dump .... \n");
+ for (i=0; i< pjhmac_test->digest_length; i++)
+ {
+ printf("%02x ",pjhmac_test->digest[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n [DBG] Error Data Dump .... \n");
+ for (i=0; i< pjhmac_test->digest_length; i++)
+ {
+ printf("%02x ",hmac_out[i]);
+ if (((i+1) % 8) == 0)
+ printf("\n");
+ }
+ printf("\n");
+ }
+ else
+ {
+ /*
+ printf("[INFO] HMAC %s Passed \n", HMAC_Mode);
+ */
+ }
+
+ pjhmac_test++;
+
+ } /* HMAC Test */
+
+ return Flags;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2400/hactest.h b/board/aspeed/ast2400/hactest.h
new file mode 100755
index 0000000..fcf2186
--- /dev/null
+++ b/board/aspeed/ast2400/hactest.h
@@ -0,0 +1,194 @@
+/*
+ * 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
+ */
+/* Err Flags */
+#define FLAG_AESTEST_FAIL 0x00000001
+#define FLAG_RC4TEST_FAIL 0x00000002
+#define FLAG_HASHTEST_FAIL 0x00000004
+
+/* Specific */
+/*
+#define DRAM_BASE 0x40000000
+#define CRYPTO_SRC_BASE (DRAM_BASE + 0x100000)
+#define CRYPTO_DST_BASE (DRAM_BASE + 0x200000)
+#define CRYPTO_CONTEXT_BASE (DRAM_BASE + 0x300000)
+
+#define HASH_SRC_BASE (DRAM_BASE + 0x400000)
+#define HASH_DST_BASE (DRAM_BASE + 0x500000)
+#define HMAC_KEY_BASE (DRAM_BASE + 0x600000)
+*/
+#define m08byteAlignment(x) ((x + 0x00000007) & 0xFFFFFFF8)
+#define m16byteAlignment(x) ((x + 0x0000000F) & 0xFFFFFFF0)
+#define m64byteAlignment(x) ((x + 0x0000003F) & 0xFFFFFFC0)
+
+#define CRYPTO_ALIGNMENT 16
+#define CRYPTO_MAX_SRC (100+CRYPTO_ALIGNMENT)
+#define CRYPTO_MAX_DST (100+CRYPTO_ALIGNMENT)
+#define CRYPTO_MAX_CONTEXT (100+CRYPTO_ALIGNMENT)
+
+#define HASH_ALIGNMENT 16
+#define HMAC_KEY_ALIGNMENT 64
+#define HASH_MAX_SRC (100+HASH_ALIGNMENT)
+#define HASH_MAX_DST (32+HASH_ALIGNMENT)
+#define HMAC_MAX_KEY (64+HMAC_KEY_ALIGNMENT)
+
+/* General */
+#define HAC_REG_BASE 0x1e6e3000
+
+#define MAX_KEYLENGTH 100
+#define MAX_TEXTLENGTH 100
+#define MAX_AESTEXTLENGTH 256
+#define MAX_RC4TEXTLENGTH 256
+#define MAX_RC4KEYLENGTH 256
+
+#define CRYPTOMODE_ECB 0x00
+#define CRYPTOMODE_CBC 0x01
+#define CRYPTOMODE_CFB 0x02
+#define CRYPTOMODE_OFB 0x03
+#define CRYPTOMODE_CTR 0x04
+
+#define HASHMODE_MD5 0x00
+#define HASHMODE_SHA1 0x01
+#define HASHMODE_SHA256 0x02
+#define HASHMODE_SHA224 0x03
+
+#define MIXMODE_DISABLE 0x00
+#define MIXMODE_CRYPTO 0x02
+#define MIXMODE_HASH 0x03
+
+#define REG_CRYPTO_SRC_BASE_OFFSET 0x00
+#define REG_CRYPTO_DST_BASE_OFFSET 0x04
+#define REG_CRYPTO_CONTEXT_BASE_OFFSET 0x08
+#define REG_CRYPTO_LEN_OFFSET 0x0C
+#define REG_CRYPTO_CMD_BASE_OFFSET 0x10
+//#define REG_CRYPTO_ENABLE_OFFSET 0x14
+#define REG_CRYPTO_STATUS_OFFSET 0x1C
+
+#define REG_HASH_SRC_BASE_OFFSET 0x20
+#define REG_HASH_DST_BASE_OFFSET 0x24
+#define REG_HASH_KEY_BASE_OFFSET 0x28
+#define REG_HASH_LEN_OFFSET 0x2C
+#define REG_HASH_CMD_OFFSET 0x30
+//#define REG_HASH_ENABLE_OFFSET 0x14
+#define REG_HASH_STATUS_OFFSET 0x1C
+
+#define HASH_BUSY 0x01
+#define CRYPTO_BUSY 0x02
+
+//#define ENABLE_HASH 0x01
+//#define DISABLE_HASH 0x00
+//#define ENABLE_CRYPTO 0x02
+//#define DISABLE_CRYPTO 0x00
+
+#define CRYPTO_SYNC_MODE_MASK 0x03
+#define CRYPTO_SYNC_MODE_ASYNC 0x00
+#define CRYPTO_SYNC_MODE_PASSIVE 0x02
+#define CRYPTO_SYNC_MODE_ACTIVE 0x03
+
+#define CRYPTO_AES128 0x00
+#define CRYPTO_AES192 0x04
+#define CRYPTO_AES256 0x08
+
+#define CRYPTO_AES_ECB 0x00
+#define CRYPTO_AES_CBC 0x10
+#define CRYPTO_AES_CFB 0x20
+#define CRYPTO_AES_OFB 0x30
+#define CRYPTO_AES_CTR 0x40
+
+#define CRYPTO_ENCRYPTO 0x80
+#define CRYPTO_DECRYPTO 0x00
+
+#define CRYPTO_AES 0x000
+#define CRYPTO_RC4 0x100
+
+#define CRYPTO_ENABLE_RW 0x000
+#define CRYPTO_ENABLE_CONTEXT_LOAD 0x000
+#define CRYPTO_ENABLE_CONTEXT_SAVE 0x000
+
+#define HASH_SYNC_MODE_MASK 0x03
+#define HASH_SYNC_MODE_ASYNC 0x00
+#define HASH_SYNC_MODE_PASSIVE 0x02
+#define HASH_SYNC_MODE_ACTIVE 0x03
+
+#define HASH_READ_SWAP_ENABLE 0x04
+#define HMAC_SWAP_CONTROL_ENABLE 0x08
+
+#define HASH_ALG_SELECT_MASK 0x70
+#define HASH_ALG_SELECT_MD5 0x00
+#define HASH_ALG_SELECT_SHA1 0x20
+#define HASH_ALG_SELECT_SHA224 0x40
+#define HASH_ALG_SELECT_SHA256 0x50
+
+#define HAC_ENABLE 0x80
+#define HAC_DIGEST_CAL_ENABLE 0x180
+#define HASH_INT_ENABLE 0x200
+
+/* AES */
+#ifndef uint8
+#define uint8 unsigned char
+#endif
+
+#ifndef uint32
+#define uint32 unsigned long int
+#endif
+
+typedef struct
+{
+ uint32 erk[64]; /* encryption round keys */
+ uint32 drk[64]; /* decryption round keys */
+ int nr; /* number of rounds */
+}
+aes_context;
+
+typedef struct
+{
+ int aes_mode;
+ int key_length;
+
+ uint8 key[32]; /* as iv in CTR mode */
+ uint8 plaintext[64];
+ uint8 ciphertext[64];
+
+}
+aes_test;
+
+/* RC4 */
+typedef struct
+{
+ uint8 key[32];
+ uint8 data[64];
+}
+rc4_test;
+
+/* Hash */
+typedef struct
+{
+ int hash_mode;
+ int digest_length;
+
+ uint8 input[64];
+ uint8 digest[64];
+
+}
+hash_test;
+
+/* HMAC */
+typedef struct
+{
+ int hash_mode;
+ int key_length;
+ int digest_length;
+
+ uint8 key[100];
+ uint8 input[64];
+ uint8 digest[64];
+
+}
+hmac_test;
diff --git a/board/aspeed/ast2400/mactest.c b/board/aspeed/ast2400/mactest.c
new file mode 100755
index 0000000..22054b9
--- /dev/null
+++ b/board/aspeed/ast2400/mactest.c
@@ -0,0 +1,510 @@
+/*
+ * 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
+ */
+/*
+ * (C) Copyright 2007 ASPEED Software
+ * MAC Manufacture Test in ASPEED's SDK version 0.20.01
+ *
+ * Release History
+ * 1. First Release, river@20071130
+ * 2. Fix the endless loop when PHY is not ready, river@20071204
+ *
+ * Test items:
+ * 1. Support MARVELL PHY only in this version
+ * 2. MDC/MDIO
+ * 3. GMAC/Duplex TX/RX Full_Size, Packet_Length Test
+ * 4. 100M/Duplex TX/RX Full_Size, Packet_Length Test
+ *
+ *
+ *
+*/
+
+
+/*
+* Diagnostics support
+*/
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include <malloc.h>
+#include <net.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_MACTEST) && defined(CONFIG_SLT))
+#include "mactest.h"
+
+static int INL(u_long base, u_long addr)
+{
+ return le32_to_cpu(*(volatile u_long *)(addr + base));
+}
+
+static void OUTL(u_long base, int command, u_long addr)
+{
+ *(volatile u_long *)(addr + base) = cpu_to_le32(command);
+}
+
+
+static void SCU_MAC1_Enable (u8 enable)
+{
+ unsigned int SCU_Register;
+
+ if(enable) {
+//MAC1 RESET/PHY_LINK in SCU
+ SCU_Register = INL(SCU_BASE, SCU_RESET_CONTROL_REG);
+ OUTL(SCU_BASE, SCU_Register & ~(0x800), SCU_RESET_CONTROL_REG);
+ } else {
+ SCU_Register = INL(SCU_BASE, SCU_RESET_CONTROL_REG);
+ OUTL(SCU_BASE, SCU_Register |(0x800), SCU_RESET_CONTROL_REG);
+
+}
+}
+
+/*------------------------------------------------------------
+ . Reads a register from the MII Management serial interface
+ .-------------------------------------------------------------*/
+static u16 phy_read_register (u8 PHY_Register, u8 PHY_Address)
+{
+ u32 Data, Status = 0, Loop_Count = 0, PHY_Ready = 1;
+ u16 Return_Data;
+
+ OUTL(MAC1_IO_BASE, (PHY_Register << 21) + (PHY_Address << 16) + MIIRD + MDC_CYCTHR, PHYCR_REG);
+ do {
+ Status = (INL (MAC1_IO_BASE, PHYCR_REG) & MIIRD);
+ Loop_Count++;
+ if (Loop_Count >= PHY_LOOP) {
+ PHY_Ready = 0;
+ break;
+ }
+ } while (Status == MIIRD);
+
+ if (PHY_Ready == 0) {
+ printf ("PHY NOT REDAY\n");
+ return 0;
+ }
+
+ udelay(5*1000);
+ Data = INL (MAC1_IO_BASE, PHYDATA_REG);
+ Return_Data = (Data >> 16);
+
+ return Return_Data;
+}
+
+static void phy_write_register (u8 PHY_Register, u8 PHY_Address, u16 PHY_Data)
+{
+ u32 Status = 0, Loop_Count = 0, PHY_Ready = 1;
+
+ OUTL(MAC1_IO_BASE, PHY_Data, PHYDATA_REG);
+ OUTL(MAC1_IO_BASE, (PHY_Register << 21) + (PHY_Address << 16) + MIIWR + MDC_CYCTHR, PHYCR_REG);
+ do {
+ Status = (INL (MAC1_IO_BASE, PHYCR_REG) & MIIWR);
+ Loop_Count++;
+ if (Loop_Count >= PHY_LOOP) {
+ PHY_Ready = 0;
+ break;
+ }
+ } while (Status == MIIWR);
+ if (PHY_Ready == 0) {
+ printf ("PHY NOT REDAY\n");
+ }
+}
+
+static int wait_link_resolve (void)
+{
+ int resolved_status, Loop_Count = 0, PHY_Ready = 1;
+
+ do {
+ resolved_status = (phy_read_register (0x11, 0) & (PHY_RESOLVED_bit | PHY_LINK_bit));
+ Loop_Count++;
+ if (Loop_Count >= PHY_LOOP) {
+ PHY_Ready = 0;
+ printf ("PHY NOT READY\n");
+ break;
+ }
+ } while (resolved_status != (PHY_RESOLVED_bit | PHY_LINK_bit));
+
+ return PHY_Ready;
+}
+
+static void set_phy_speed (int chip, int speed, int duplex)
+{
+ unsigned short data, status;
+
+
+ if (chip == PHYID_VENDOR_MARVELL) {
+ if ((speed == PHY_SPEED_1G) && (duplex == DUPLEX_FULL)) {
+//Manual Control
+ phy_write_register (18, 0, 0);
+ data = phy_read_register (9, 0);
+ phy_write_register (9, 0, data | 0x1800);
+//PHY Reset
+ phy_write_register (0, 0, 0x0140 | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+
+//Force 1G
+ phy_write_register (29, 0, 0x07);
+ data = phy_read_register (30, 0);
+ phy_write_register (30, 0, data | 0x08);
+ phy_write_register (29, 0, 0x10);
+ data = phy_read_register (30, 0);
+ phy_write_register (30, 0, data | 0x02);
+ phy_write_register (29, 0, 0x12);
+ data = phy_read_register (30, 0);
+ phy_write_register (30, 0, data | 0x01);
+
+ printf ("FORCE MARVELL PHY to 1G/DUPLEX DONE\n");
+ }
+ else if ((speed == PHY_SPEED_100M) && (duplex == DUPLEX_FULL)) {
+//PHY Reset
+ phy_write_register (0, 0, 0x2100 | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+
+//Force 100M
+ data = phy_read_register (0, 0);
+ phy_write_register (0, 0, data | 0x4000 | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+ data = phy_read_register (0, 0);
+
+ printf ("FORCE MARVELL PHY to 100M/DUPLEX DONE\n");
+ }
+ }
+ else if ( (chip == PHYID_VENDOR_RTL8201E) || (chip == PHYID_VENDOR_BROADCOM) ){
+ /* basic setting */
+ data = phy_read_register (0, 0);
+ data &= 0x7140;
+ data |= 0x4000;
+ if (speed == PHY_SPEED_100M)
+ data |= 0x2000;
+ if (duplex == DUPLEX_FULL)
+ data |= 0x0100;
+ phy_write_register (0, 0, data);
+
+ /* reset */
+ phy_write_register (0, 0, data | 0x8000);
+ do {
+ status = (phy_read_register (0, 0) & 0x8000);
+ } while (status != 0);
+ udelay(100*1000);
+
+ /* basic setting */
+ phy_write_register (0, 0, data);
+
+ if (chip == PHYID_VENDOR_RTL8201E)
+ printf ("FORCE RTL8201E PHY to 100M/DUPLEX DONE\n");
+ else if (chip == PHYID_VENDOR_BROADCOM)
+ printf ("FORCE Broadcom PHY to 100M/DUPLEX DONE\n");
+
+ }
+
+}
+
+static void MAC1_reset (void)
+{
+ OUTL(MAC1_IO_BASE, SW_RST_bit, MACCR_REG);
+ for (; (INL(MAC1_IO_BASE, MACCR_REG ) & SW_RST_bit) != 0; ) {udelay(1000);}
+ OUTL(MAC1_IO_BASE, 0, IER_REG );
+}
+
+static int set_mac1_control_register (int Chip_ID)
+{
+ unsigned long MAC_CR_Register = 0;
+ int PHY_Ready = 1;
+ u16 PHY_Status, PHY_Speed, PHY_Duplex, Advertise, Link_Partner;
+
+ MAC_CR_Register = SPEED_100M_MODE_bit | RX_ALLADR_bit | FULLDUP_bit | RXMAC_EN_bit | RXDMA_EN_bit | TXMAC_EN_bit | TXDMA_EN_bit | CRC_APD_bit;
+
+ if ( (Chip_ID == PHYID_VENDOR_BROADCOM) || (Chip_ID == PHYID_VENDOR_RTL8201E)) {
+ Advertise = phy_read_register (0x04, 0);
+ Link_Partner = phy_read_register (0x05, 0);
+ Advertise = (Advertise & PHY_SPEED_DUPLEX_MASK);
+ Link_Partner = (Link_Partner & PHY_SPEED_DUPLEX_MASK);
+ if ((Advertise & Link_Partner) & PHY_100M_DUPLEX) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_100M_HALF) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_DUPLEX) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_HALF) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ }
+ else if (Chip_ID == PHYID_VENDOR_MARVELL) {
+
+ PHY_Ready = wait_link_resolve ();
+
+ if (PHY_Ready == 1) {
+ PHY_Status = phy_read_register (0x11, 0);
+ PHY_Speed = (PHY_Status & PHY_SPEED_MASK) >> 14;
+ PHY_Duplex = (PHY_Status & PHY_DUPLEX_MASK) >> 13;
+
+ if (PHY_Speed == SPEED_1000M) {
+ MAC_CR_Register |= GMAC_MODE_bit;
+ }
+ else {
+ MAC_CR_Register &= ~GMAC_MODE_bit;
+ if (PHY_Speed == SPEED_10M) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ }
+ }
+ if (PHY_Duplex == DUPLEX_HALF) {
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ }
+ }
+ OUTL(MAC1_IO_BASE, MAC_CR_Register, MACCR_REG);
+
+ return PHY_Ready;
+}
+
+static void ring_buffer_alloc (void)
+{
+ unsigned int i, j;
+
+//Write data into TX buffer
+ for (i = 0; i < NUM_TX; i++) {
+ for (j = 0; j < TX_BUFF_SZ; j++) {
+ tx_buffer[i][j] = i * 4 + j;
+ }
+ }
+//Initialize RX buffer to 0
+ for (i = 0; i < NUM_RX; i++) {
+ for (j = 0; j < RX_BUFF_SZ; j++) {
+ rx_buffer[i][j] = 0;
+ }
+ }
+//Prepare descriptor
+ for (i = 0; i < NUM_RX; i++) {
+ rx_ring[i].status = cpu_to_le32(RXPKT_RDY + RX_BUFF_SZ);
+ rx_ring[i].buf = ((u32) &rx_buffer[i]);
+ rx_ring[i].reserved = 0;
+ }
+ for (i = 0; i < NUM_TX; i++) {
+ tx_ring[i].status = 0;
+ tx_ring[i].des1 = 0;
+ tx_ring[i].buf = ((u32) &tx_buffer[i]);
+ tx_ring[i].reserved = 0;
+ }
+
+ rx_ring[NUM_RX - 1].status |= cpu_to_le32(EDORR);
+ tx_ring[NUM_TX - 1].status |= cpu_to_le32(EDOTR);
+
+ OUTL(MAC1_IO_BASE, ((u32) &tx_ring), TXR_BADR_REG);
+ OUTL(MAC1_IO_BASE, ((u32) &rx_ring), RXR_BADR_REG);
+
+ tx_new = 0;
+ rx_new = 0;
+}
+
+static int packet_test (void)
+{
+ unsigned int rx_status, length, i, Loop_Count = 0;
+
+ tx_ring[tx_new].status |= cpu_to_le32(LTS | FTS | TX_BUFF_SZ);
+ tx_ring[tx_new].status |= cpu_to_le32(TXDMA_OWN);
+ OUTL(MAC1_IO_BASE, POLL_DEMAND, TXPD_REG);
+
+//Compare result
+ do {
+ rx_status = rx_ring[rx_new].status;
+ Loop_Count++;
+ } while (!(rx_status & RXPKT_STATUS) && (Loop_Count < PHY_LOOP));
+ if (rx_status & (RX_ERR | CRC_ERR | FTL | RUNT | RX_ODD_NB)) {
+ /* There was an error.*/
+ printf("RX error status = 0x%08X\n", rx_status);
+ return PACKET_TEST_FAIL;
+ } else {
+ length = (rx_status & BYTE_COUNT_MASK);
+ for (i = 0; i < RX_BUFF_SZ / 4; i++) {
+ if (rx_buffer[rx_new][i] != tx_buffer[tx_new][i]) {
+ printf ("ERROR at packet %d, address %x\n", rx_new, i);
+ printf ("Gold = %8x, Real = %8x\n", tx_buffer[tx_new][i], rx_buffer[rx_new][i]);
+ return PACKET_TEST_FAIL;
+ }
+ }
+ }
+ tx_new = (tx_new + 1) % NUM_TX;
+ rx_new = (rx_new + 1) % NUM_RX;
+
+ return TEST_PASS;
+}
+
+static int packet_length_test (int packet_length)
+{
+ unsigned int rx_status, length, i, Loop_Count = 0;
+
+ tx_ring[tx_new].status &= (~(BYTE_COUNT_MASK));
+ tx_ring[tx_new].status |= cpu_to_le32(LTS | FTS | packet_length);
+ tx_ring[tx_new].status |= cpu_to_le32(TXDMA_OWN);
+ OUTL(MAC1_IO_BASE, POLL_DEMAND, TXPD_REG);
+
+//Compare result
+ do {
+ rx_status = rx_ring[rx_new].status;
+ Loop_Count++;
+ } while (!(rx_status & RXPKT_STATUS) && (Loop_Count < PHY_LOOP));
+ if (rx_status & (RX_ERR | CRC_ERR | FTL | RUNT | RX_ODD_NB)) {
+ /* There was an error.*/
+ printf("RX error status = 0x%08X\n", rx_status);
+ return PACKET_LENGTH_TEST_FAIL;
+ } else {
+ length = (rx_status & BYTE_COUNT_MASK) - 4;
+ if (length != packet_length) {
+ printf ("Received Length ERROR. Gold = %d, Fail = %d\n",packet_length, length);
+ printf ("rx_new = %d, tx_new = %d\n", rx_new, tx_new);
+ return PACKET_LENGTH_TEST_FAIL;
+ }
+ for (i = 0; i < length; i++) {
+ if (rx_buffer[rx_new][i] != tx_buffer[tx_new][i]) {
+ printf ("ERROR at packet %d, address %x\n", rx_new, i);
+ printf ("Gold = %8x, Real = %8x\n", tx_buffer[tx_new][i], rx_buffer[rx_new][i]);
+ return PACKET_LENGTH_TEST_FAIL;
+ }
+ }
+ }
+ rx_ring[rx_new].status &= (~(RXPKT_STATUS));
+ tx_new = (tx_new + 1) % NUM_TX;
+ rx_new = (rx_new + 1) % NUM_RX;
+
+ return TEST_PASS;
+}
+
+static int MAC1_init (int id)
+{
+ int phy_status = 0;
+
+ MAC1_reset ();
+ phy_status = set_mac1_control_register (id);
+ ring_buffer_alloc ();
+
+ return phy_status;
+}
+
+int do_mactest (void)
+{
+ unsigned int phy_id, i;
+ int test_result = 0, phy_status = 0;
+
+ SCU_MAC1_Enable(1);
+ phy_id = ((phy_read_register (0x02, 0) << 16) + phy_read_register (0x03, 0)) & PHYID_VENDOR_MASK;
+ if (phy_id == PHYID_VENDOR_MARVELL) {
+ printf ("PHY DETECTED ------> MARVELL\n");
+
+ set_phy_speed (phy_id, PHY_SPEED_1G, DUPLEX_FULL);
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 0; i < NUM_TX; i++) {
+ test_result |= packet_test ();
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 60; i < TX_BUFF_SZ; i++) {
+ test_result |= packet_length_test (i);
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ set_phy_speed (phy_id, PHY_SPEED_100M, DUPLEX_FULL);
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 0; i < NUM_TX; i++) {
+ test_result |= packet_test ();
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 60; i < TX_BUFF_SZ; i++) {
+ test_result |= packet_length_test (i);
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ }
+ else if ( (phy_id == PHYID_VENDOR_RTL8201E) || (phy_id == PHYID_VENDOR_BROADCOM) ){
+
+ if (phy_id == PHYID_VENDOR_RTL8201E)
+ printf ("PHY DETECTED ------> RTL 8201E \n");
+ else if (phy_id == PHYID_VENDOR_BROADCOM)
+ printf ("PHY DETECTED ------> Broadcom \n");
+
+ set_phy_speed (phy_id, PHY_SPEED_100M, DUPLEX_FULL);
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 0; i < NUM_TX; i++) {
+ test_result |= packet_test ();
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+
+ if ((phy_status = MAC1_init (phy_id)) != 0) {
+ for (i = 60; i < TX_BUFF_SZ; i++) {
+ test_result |= packet_length_test (i);
+ if (test_result != 0)
+ break;
+ }
+ }
+ else if (phy_status == 0) {
+ printf ("PHY FAIL: Please Check If you are using LOOP BACK Connector\n");
+ test_result = 3;
+ return test_result;
+ }
+ }
+
+ if ((phy_status == 0) && (test_result & PACKET_TEST_FAIL)) {
+ printf ("Packet Test FAIL !\n");
+ }
+ else if ((phy_status == 0) && (test_result & PACKET_LENGTH_TEST_FAIL)) {
+ printf ("Packet Length Test FAIL !\n");
+ }
+
+ SCU_MAC1_Enable(0);
+ return test_result;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2400/mactest.h b/board/aspeed/ast2400/mactest.h
new file mode 100755
index 0000000..e75b7bb
--- /dev/null
+++ b/board/aspeed/ast2400/mactest.h
@@ -0,0 +1,215 @@
+/*
+ * 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
+ */
+/* MACTest.h */
+
+// --------------------------------------------------------------------
+// General Definition
+// --------------------------------------------------------------------
+#define MAC1_IO_BASE 0x1E660000
+#define PHY_LOOP 100000
+#define NUM_RX 48
+#define NUM_TX 48
+#define RX_BUFF_SZ 1514
+#define TX_BUFF_SZ 1514
+#define TOUT_LOOP 1000000
+#define ETH_ALEN 6
+#define POLL_DEMAND 1
+
+
+// --------------------------------------------------------------------
+// MAC Register Index
+// --------------------------------------------------------------------
+#define ISR_REG 0x00 // interrups status register
+#define IER_REG 0x04 // interrupt maks register
+#define MAC_MADR_REG 0x08 // MAC address (Most significant)
+#define MAC_LADR_REG 0x0c // MAC address (Least significant)
+#define MAHT0_REG 0x10 // Multicast Address Hash Table 0 register
+#define MAHT1_REG 0x14 // Multicast Address Hash Table 1 register
+#define TXPD_REG 0x18 // Transmit Poll Demand register
+#define RXPD_REG 0x1c // Receive Poll Demand register
+#define TXR_BADR_REG 0x20 // Transmit Ring Base Address register
+#define RXR_BADR_REG 0x24 // Receive Ring Base Address register
+#define HPTXPD_REG 0x28
+#define HPTXR_BADR_REG 0x2c
+#define ITC_REG 0x30 // interrupt timer control register
+#define APTC_REG 0x34 // Automatic Polling Timer control register
+#define DBLAC_REG 0x38 // DMA Burst Length and Arbitration control register
+#define DMAFIFOS_REG 0x3c
+#define FEAR_REG 0x44
+#define TPAFCR_REG 0x48
+#define RBSR_REG 0x4c
+#define MACCR_REG 0x50 // MAC control register
+#define MACSR_REG 0x54 // MAC status register
+#define PHYCR_REG 0x60 // PHY control register
+#define PHYDATA_REG 0x64 // PHY Write Data register
+
+// --------------------------------------------------------------------
+// PHYCR_REG
+// --------------------------------------------------------------------
+#define PHY_RE_AUTO_bit (1UL<<9)
+#define PHY_READ_bit (1UL<<26)
+#define PHY_WRITE_bit (1UL<<27)
+// --------------------------------------------------------------------
+// PHYCR_REG
+// --------------------------------------------------------------------
+#define PHY_AUTO_OK_bit (1UL<<5)
+// --------------------------------------------------------------------
+// PHY INT_STAT_REG
+// --------------------------------------------------------------------
+#define PHY_SPEED_CHG_bit (1UL<<14)
+#define PHY_DUPLEX_CHG_bit (1UL<<13)
+#define PHY_LINK_CHG_bit (1UL<<10)
+#define PHY_AUTO_COMP_bit (1UL<<11)
+// --------------------------------------------------------------------
+// PHY SPE_STAT_REG
+// --------------------------------------------------------------------
+#define PHY_RESOLVED_bit (1UL<<11)
+#define PHY_LINK_bit (1UL<<10)
+#define PHY_SPEED_mask 0xC000
+#define PHY_SPEED_10M 0x0
+#define PHY_SPEED_100M 0x1
+#define PHY_SPEED_1G 0x2
+#define PHY_DUPLEX_mask 0x2000
+#define PHY_SPEED_DUPLEX_MASK 0x01E0
+#define PHY_100M_DUPLEX 0x0100
+#define PHY_100M_HALF 0x0080
+#define PHY_10M_DUPLEX 0x0040
+#define PHY_10M_HALF 0x0020
+#define LINK_STATUS 0x04
+#define PHYID_VENDOR_MASK 0xfffffc00
+#define PHYID_VENDOR_MARVELL 0x01410c00
+#define PHYID_VENDOR_BROADCOM 0x00406000
+#define PHYID_VENDOR_RTL8201E 0x001cc800
+#define DUPLEX_FULL 0x01
+#define DUPLEX_HALF 0x00
+
+
+
+// --------------------------------------------------------------------
+// MACCR_REG
+// --------------------------------------------------------------------
+
+#define SW_RST_bit (1UL<<31) // software reset/
+#define DIRPATH_bit (1UL<<21)
+#define RX_IPCS_FAIL_bit (1UL<<20)
+#define SPEED_100M_MODE_bit (1UL<<19)
+#define RX_UDPCS_FAIL_bit (1UL<<18)
+#define RX_BROADPKT_bit (1UL<<17) // Receiving broadcast packet
+#define RX_MULTIPKT_bit (1UL<<16) // receiving multicast packet
+#define RX_HT_EN_bit (1UL<<15)
+#define RX_ALLADR_bit (1UL<<14) // not check incoming packet's destination address
+#define JUMBO_LF_bit (1UL<<13)
+#define RX_RUNT_bit (1UL<<12) // Store incoming packet even its length is les than 64 byte
+#define CRC_CHK_bit (1UL<<11)
+#define CRC_APD_bit (1UL<<10) // append crc to transmit packet
+#define GMAC_MODE_bit (1UL<<9)
+#define FULLDUP_bit (1UL<<8) // full duplex
+#define ENRX_IN_HALFTX_bit (1UL<<7)
+#define LOOP_EN_bit (1UL<<6) // Internal loop-back
+#define HPTXR_EN_bit (1UL<<5)
+#define REMOVE_VLAN_bit (1UL<<4)
+#define RXMAC_EN_bit (1UL<<3) // receiver enable
+#define TXMAC_EN_bit (1UL<<2) // transmitter enable
+#define RXDMA_EN_bit (1UL<<1) // enable DMA receiving channel
+#define TXDMA_EN_bit (1UL<<0) // enable DMA transmitting channel
+
+
+// --------------------------------------------------------------------
+// SCU_REG
+// --------------------------------------------------------------------
+#define SCU_BASE 0x1E6E2000
+#define SCU_PROTECT_KEY_REG 0x0
+#define SCU_PROT_KEY_MAGIC 0x1688a8a8
+#define SCU_RESET_CONTROL_REG 0x04
+#define SCU_RESET_MAC1 (1u << 11)
+#define SCU_RESET_MAC2 (1u << 12)
+#define SCU_HARDWARE_TRAPPING_REG 0x70
+#define SCU_HT_MAC_INTF_LSBIT 6
+#define SCU_HT_MAC_INTERFACE (0x7u << SCU_HT_MAC_INTF_LSBIT)
+#define MAC_INTF_SINGLE_PORT_MODES (1u<<0/*GMII*/ | 1u<<3/*MII_ONLY*/ | 1u<<4/*RMII_ONLY*/)
+#define SCU_HT_MAC_GMII 0x0u
+// MII and MII mode
+#define SCU_HT_MAC_MII_MII 0x1u
+#define SCU_HT_MAC_MII_ONLY 0x3u
+#define SCU_HT_MAC_RMII_ONLY 0x4u
+#define SCU_MULTIFUNCTION_PIN_REG 0x74
+#define SCU_MFP_MAC2_PHYLINK (1u << 26)
+#define SCU_MFP_MAC1_PHYLINK (1u << 25)
+#define SCU_MFP_MAC2_MII_INTF (1u << 21)
+#define SCU_MFP_MAC2_MDC_MDIO (1u << 20)
+#define SCU_SILICON_REVISION_REG 0x7C
+
+//---------------------------------------------------
+// PHY R/W Register Bit
+//---------------------------------------------------
+#define MIIWR (1UL<<27)
+#define MIIRD (1UL<<26)
+#define MDC_CYCTHR 0x34
+#define PHY_SPEED_MASK 0xC000
+#define PHY_DUPLEX_MASK 0x2000
+#define SPEED_1000M 0x02
+#define SPEED_100M 0x01
+#define SPEED_10M 0x00
+#define DUPLEX_FULL 0x01
+#define DUPLEX_HALF 0x00
+#define RESOLVED_BIT 0x800
+
+#define PHY_SPEED_DUPLEX_MASK 0x01E0
+#define PHY_100M_DUPLEX 0x0100
+#define PHY_100M_HALF 0x0080
+#define PHY_10M_DUPLEX 0x0040
+#define PHY_10M_HALF 0x0020
+
+//---------------------------------------------------
+// Descriptor bits.
+//---------------------------------------------------
+#define TXDMA_OWN 0x80000000 /* Own Bit */
+#define RXPKT_RDY 0x00000000
+#define RXPKT_STATUS 0x80000000
+#define EDORR 0x40000000 /* Receive End Of Ring */
+#define LRS 0x10000000 /* Last Descriptor */
+#define RD_ES 0x00008000 /* Error Summary */
+#define EDOTR 0x40000000 /* Transmit End Of Ring */
+#define T_OWN 0x80000000 /* Own Bit */
+#define LTS 0x10000000 /* Last Segment */
+#define FTS 0x20000000 /* First Segment */
+#define CRC_ERR 0x00080000
+#define TD_ES 0x00008000 /* Error Summary */
+#define TD_SET 0x08000000 /* Setup Packet */
+#define RX_ERR 0x00040000
+#define FTL 0x00100000
+#define RUNT 0x00200000
+#define RX_ODD_NB 0x00400000
+#define BYTE_COUNT_MASK 0x00003FFF
+
+//---------------------------------------------------
+// SPEED/DUPLEX Parameters
+//---------------------------------------------------
+
+//---------------------------------------------------
+// Return Status
+//---------------------------------------------------
+#define TEST_PASS 0
+#define PACKET_TEST_FAIL 1
+#define PACKET_LENGTH_TEST_FAIL 2
+
+struct mac_desc {
+ volatile s32 status;
+ u32 des1;
+ u32 reserved;
+ u32 buf;
+};
+static struct mac_desc rx_ring[NUM_RX] __attribute__ ((aligned(32))); /* RX descriptor ring */
+static struct mac_desc tx_ring[NUM_TX] __attribute__ ((aligned(32))); /* TX descriptor ring */
+static int rx_new; /* RX descriptor ring pointer */
+static int tx_new; /* TX descriptor ring pointer */
+static volatile unsigned char rx_buffer[NUM_RX][RX_BUFF_SZ] __attribute__ ((aligned(32))); /* RX buffer */
+static volatile unsigned char tx_buffer[NUM_TX][TX_BUFF_SZ] __attribute__ ((aligned(32))); /* TX buffer */
diff --git a/board/aspeed/ast2400/mictest.c b/board/aspeed/ast2400/mictest.c
new file mode 100755
index 0000000..1b2b342
--- /dev/null
+++ b/board/aspeed/ast2400/mictest.c
@@ -0,0 +1,146 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_MICTEST) && defined(CONFIG_SLT))
+#include "mictest.h"
+
+static unsigned char ctrlbuf[MIC_MAX_CTRL];
+static unsigned char chksumbuf[MIC_MAX_CHKSUM];
+
+void vInitSCU(void)
+{
+ unsigned long ulData;
+
+ *(unsigned long *) (0x1e6e2000) = 0x1688A8A8;
+
+ udelay(100);
+
+ ulData = *(unsigned long *) (0x1e6e2004);
+ ulData &= 0xbffff;
+ *(unsigned long *) (0x1e6e2004) = ulData;
+
+}
+
+void vInitMIC(void)
+{
+ unsigned long i, j, ulPageNumber;
+ unsigned char *pjctrl, *pjsum;
+
+ ulPageNumber = DRAMSIZE >> 12;
+
+ pjctrl = (unsigned char *)(m16byteAlignment((unsigned long) ctrlbuf));
+ pjsum = (unsigned char *)(m16byteAlignment((unsigned long) chksumbuf));
+
+ /* init ctrl buffer (2bits for one page) */
+ for (i=0; i< (ulPageNumber/4); i++)
+ *(unsigned char *) (pjctrl + i) = DEFAULT_CTRL;
+
+ /* init chksum buf (4bytes for one page) */
+ for (i=0; i<ulPageNumber; i++)
+ *(unsigned long *) (pjsum + i*4) = DEFAULT_CHKSUM;
+
+ *(unsigned long *) (MIC_BASE + MIC_CTRLBUFF_REG) = (unsigned long) pjctrl;
+ *(unsigned long *) (MIC_BASE + MIC_CHKSUMBUF_REG) = (unsigned long) pjsum;
+ *(unsigned long *) (MIC_BASE + MIC_RATECTRL_REG) = (unsigned long) DEFAULT_RATE;
+ *(unsigned long *) (MIC_BASE + MIC_ENGINECTRL_REG) = MIC_ENABLE_MIC | (DRAMSIZE - 0x1000);
+
+}
+
+void vDisableMIC(void)
+{
+ *(unsigned long *) (MIC_BASE + MIC_ENGINECTRL_REG) = MIC_RESET_MIC;
+
+}
+
+int do_chksum(void)
+{
+ unsigned long i, j, k, ulPageNumber;
+ int Status = 0;
+ unsigned short tmp;
+ volatile unsigned long sum1, sum2;
+ unsigned long goldensum, chksum;
+ unsigned long len, tlen;
+ unsigned char *pjsum;
+
+ ulPageNumber = DRAMSIZE >> 12;
+ pjsum = (unsigned char *)(m16byteAlignment((unsigned long) chksumbuf));
+
+ /* start test */
+ for (i=0; i<ulPageNumber; i++)
+ {
+
+ sum1 = 0xffff, sum2 = 0xffff;
+ len = 0x0800;
+ j = 0;
+
+ while (len)
+ {
+ tlen = len > 360 ? 360 : len;
+ len -= tlen;
+ do {
+ tmp = *(unsigned short *) (DRAM_BASE + ((i << 12) + j));
+ sum1 += (unsigned long) tmp;
+ sum2 += sum1;
+ j+=2;
+ } while (--tlen);
+ sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+ }
+
+ sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+
+ goldensum = (sum2 << 16) | sum1;
+ k= 0;
+ do {
+ chksum = *(unsigned long *) (pjsum + i*4);
+ udelay(100);
+ k++;
+ } while ((chksum == 0) && (k<1000));
+
+ if (chksum != goldensum)
+ {
+ Status = 1;
+ printf("[FAIL] MIC Chksum Failed at Page %x \n", i);
+ }
+
+ } /* end of i loop */
+
+ return (Status);
+
+}
+
+int do_mictest (void)
+{
+ unsigned long Flags = 0;
+
+ vInitSCU();
+ vInitMIC();
+
+ if (do_chksum())
+ Flags = 1;
+
+ vDisableMIC();
+
+ return Flags;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2400/mictest.h b/board/aspeed/ast2400/mictest.h
new file mode 100755
index 0000000..e14bb41
--- /dev/null
+++ b/board/aspeed/ast2400/mictest.h
@@ -0,0 +1,55 @@
+/*
+ * 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
+ */
+/* Macro */
+#define m08byteAlignment(x) ((x + 0x00000007) & 0xFFFFFFF8)
+#define m16byteAlignment(x) ((x + 0x0000000F) & 0xFFFFFFF0)
+#define m64byteAlignment(x) ((x + 0x0000003F) & 0xFFFFFFC0)
+
+/* Options */
+#define MIC_TEST_PAGE 32
+#define DRAMSIZE (MIC_TEST_PAGE * 0x1000)
+#define MIC_MAX_CTRL (MIC_TEST_PAGE / 4 + 16)
+#define MIC_MAX_CHKSUM (MIC_TEST_PAGE * 4 + 16)
+
+/* Default Setting */
+#define DEFAULT_RATE 0x00000000
+#define DEFAULT_CTRL 0xFF
+#define DEFAULT_CHKSUM 0x00000000
+#define DEFAULT_WRITEBACK 0x08880000
+
+/* Reg. Definition */
+#define DRAM_BASE 0x40000000
+#define MIC_BASE 0x1e640000
+#define MIC_CTRLBUFF_REG 0x00
+#define MIC_CHKSUMBUF_REG 0x04
+#define MIC_RATECTRL_REG 0x08
+#define MIC_ENGINECTRL_REG 0x0C
+#define MIC_STOPPAGE_REG 0x10
+#define MIC_STATUS_REG 0x14
+#define MIC_STATUS1_REG 0x18
+#define MIC_STATUS2_REG 0x1C
+
+#define MIC_RESET_MIC 0x00000000
+#define MIC_ENABLE_MIC 0x10000000
+#define MIC_MAXPAGE_MASK 0x0FFFF000
+#define MIC_WRITEBACK_MASK 0xFFFF0000
+#define MIC_STOPPAGE_MASK 0x0000FFFF
+#define MIC_PAGEERROR 0x40000000
+#define MIC_PAGE1ERROR 0x10000000
+#define MIC_PAGE2ERROR 0x20000000
+#define MIC_INTMASK 0x00060000
+#define MIC_ERRPAGENO_MASK 0x0000FFFF
+
+#define MIC_CTRL_MASK 0x03
+#define MIC_CTRL_SKIP 0x00
+#define MIC_CTRL_CHK1 0x01
+#define MIC_CTRL_CHK2 0x02
+#define MIC_CTRL_CHK3 0x03
diff --git a/board/aspeed/ast2400/pci.c b/board/aspeed/ast2400/pci.c
new file mode 100755
index 0000000..5b17466
--- /dev/null
+++ b/board/aspeed/ast2400/pci.c
@@ -0,0 +1,243 @@
+/*
+ * 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, or (at
+ * your option) any later version.
+ */
+
+#include <common.h>
+#include <pci.h>
+
+#ifdef CONFIG_PCI
+
+#define PCI_CSR_BASE 0x60000000
+#define ASPEED_PCI_IO_BASE 0x00000000
+#define ASPEED_PCI_IO_SIZE 0x00010000
+#define ASPEED_PCI_MEM_BASE 0x68000000
+#define ASPEED_PCI_MEM_SIZE 0x18000000
+
+#define CSR_CRP_CMD_OFFSET 0x00
+#define CSR_CRP_WRITE_OFFSET 0x04
+#define CSR_CRP_READ_OFFSET 0x08
+#define CSR_PCI_ADDR_OFFSET 0x0C
+#define CSR_PCI_CMD_OFFSET 0x10
+#define CSR_PCI_WRITE_OFFSET 0x14
+#define CSR_PCI_READ_OFFSET 0x18
+#define CSR_PCI_STATUS_OFFSET 0x1C
+
+#define CRP_ADDR_REG (volatile ulong*) (PCI_CSR_BASE + CSR_CRP_CMD_OFFSET)
+#define CRP_WRITE_REG (volatile ulong*) (PCI_CSR_BASE + CSR_CRP_WRITE_OFFSET)
+#define CRP_READ_REG (volatile ulong*) (PCI_CSR_BASE + CSR_CRP_READ_OFFSET)
+#define PCI_ADDR_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_ADDR_OFFSET)
+#define PCI_CMD_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_CMD_OFFSET)
+#define PCI_WRITE_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_WRITE_OFFSET)
+#define PCI_READ_REG (volatile ulong*) (PCI_CSR_BASE + CSR_PCI_READ_OFFSET)
+
+#define PCI_CMD_READ 0x0A
+#define PCI_CMD_WRITE 0x0B
+
+#define RESET_PCI_STATUS *(volatile ulong*) (PCI_CSR_BASE + CSR_PCI_STATUS_OFFSET) = 0x01
+#define CHK_PCI_STATUS (*(volatile ulong*) (PCI_CSR_BASE + CSR_PCI_STATUS_OFFSET) & 0x03)
+
+static int pci_config_access (u8 access_type, u32 dev, u32 reg, u32 * data)
+{
+ u32 bus;
+ u32 device;
+ u32 function;
+
+ bus = ((dev & 0xff0000) >> 16);
+ device = ((dev & 0xf800) >> 11);
+ function = (dev & 0x0700);
+
+ if (bus == 0) {
+ // Type 0 Configuration
+ *PCI_ADDR_REG = (u32) (1UL << device | function | (reg & 0xfc));
+ } else {
+ // Type 1 Configuration
+ *PCI_ADDR_REG = (u32) (dev | ((reg / 4) << 2) | 1);
+ }
+
+ RESET_PCI_STATUS;
+
+ if (access_type == PCI_CMD_WRITE) {
+ *PCI_CMD_REG = (ulong) PCI_CMD_WRITE;
+ *PCI_WRITE_REG = *data;
+ } else {
+ *PCI_CMD_REG = (ulong) PCI_CMD_READ;
+ *data = *PCI_READ_REG;
+ }
+
+ return (CHK_PCI_STATUS);
+}
+
+static int aspeed_pci_read_config_byte (u32 hose, u32 dev, u32 reg, u8 * val)
+{
+ u32 data;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data)) {
+ *val = 0;
+ return -1;
+ }
+
+ *val = (data >> ((reg & 3) << 3)) & 0xff;
+
+ return 0;
+}
+
+
+static int aspeed_pci_read_config_word (u32 hose, u32 dev, u32 reg, u16 * val)
+{
+ u32 data;
+
+ if (reg & 1)
+ return -1;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data)) {
+ *val = 0;
+ return -1;
+ }
+
+ *val = (data >> ((reg & 3) << 3)) & 0xffff;
+
+ return 0;
+}
+
+
+static int aspeed_pci_read_config_dword (u32 hose, u32 dev, u32 reg,
+ u32 * val)
+{
+ u32 data = 0;
+
+ if (reg & 3)
+ return -1;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data)) {
+ *val = 0;
+ return -1;
+ }
+
+ *val = data;
+
+ return (0);
+}
+
+static int aspeed_pci_write_config_byte (u32 hose, u32 dev, u32 reg, u8 val)
+{
+ u32 data = 0;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data))
+ return -1;
+
+ data = (data & ~(0xff << ((reg & 3) << 3))) | (val <<
+ ((reg & 3) << 3));
+
+ if (pci_config_access (PCI_CMD_WRITE, dev, reg, &data))
+ return -1;
+
+ return 0;
+}
+
+
+static int aspeed_pci_write_config_word (u32 hose, u32 dev, u32 reg, u16 val)
+{
+ u32 data = 0;
+
+ if (reg & 1)
+ return -1;
+
+ if (pci_config_access (PCI_CMD_READ, dev, reg, &data))
+ return -1;
+
+ data = (data & ~(0xffff << ((reg & 3) << 3))) | (val <<
+ ((reg & 3) << 3));
+
+ if (pci_config_access (PCI_CMD_WRITE, dev, reg, &data))
+ return -1;
+
+ return 0;
+}
+
+static int aspeed_pci_write_config_dword (u32 hose, u32 dev, u32 reg, u32 val)
+{
+ u32 data;
+
+ if (reg & 3) {
+ return -1;
+ }
+
+ data = val;
+
+ if (pci_config_access (PCI_CMD_WRITE, dev, reg, &data))
+ return -1;
+
+ return (0);
+}
+
+/*
+ * Initialize PCIU
+ */
+aspeed_pciu_init ()
+{
+
+ unsigned long reg;
+
+ /* Reset PCI Host */
+ reg = *((volatile ulong*) 0x1e6e2004);
+ *((volatile ulong*) 0x1e6e2004) = reg | 0x00280000;
+
+ reg = *((volatile ulong*) 0x1e6e2074); /* REQ2 */
+ *((volatile ulong*) 0x1e6e2074) = reg | 0x00000010;
+
+ *((volatile ulong*) 0x1e6e2008) |= 0x00080000;
+ reg = *((volatile ulong*) 0x1e6e200c);
+ *((volatile ulong*) 0x1e6e200c) = reg & 0xfff7ffff;
+ udelay(1);
+ *((volatile ulong*) 0x1e6e2004) &= 0xfff7ffff;
+
+ /* Initial PCI Host */
+ RESET_PCI_STATUS;
+
+ *CRP_ADDR_REG = ((ulong)(PCI_CMD_READ) << 16) | 0x04;
+ reg = *CRP_READ_REG;
+
+ *CRP_ADDR_REG = ((ulong)(PCI_CMD_WRITE) << 16) | 0x04;
+ *CRP_WRITE_REG = reg | 0x07;
+
+}
+
+/*
+ * Initialize Module
+ */
+
+void aspeed_init_pci (struct pci_controller *hose)
+{
+ hose->first_busno = 0;
+ hose->last_busno = 0xff;
+
+ aspeed_pciu_init (); /* Initialize PCIU */
+
+ /* PCI memory space #1 */
+ pci_set_region (hose->regions + 0,
+ ASPEED_PCI_MEM_BASE, ASPEED_PCI_MEM_BASE, ASPEED_PCI_MEM_SIZE, PCI_REGION_MEM);
+
+ /* PCI I/O space */
+ pci_set_region (hose->regions + 1,
+ ASPEED_PCI_IO_BASE, ASPEED_PCI_IO_BASE, ASPEED_PCI_IO_SIZE, PCI_REGION_IO);
+
+ hose->region_count = 2;
+
+ hose->read_byte = aspeed_pci_read_config_byte;
+ hose->read_word = aspeed_pci_read_config_word;
+ hose->read_dword = aspeed_pci_read_config_dword;
+ hose->write_byte = aspeed_pci_write_config_byte;
+ hose->write_word = aspeed_pci_write_config_word;
+ hose->write_dword = aspeed_pci_write_config_dword;
+
+ pci_register_hose (hose);
+
+ hose->last_busno = pci_hose_scan (hose);
+
+ return;
+}
+#endif /* CONFIG_PCI */
+
diff --git a/board/aspeed/ast2400/platform.S b/board/aspeed/ast2400/platform.S
new file mode 100644
index 0000000..27e8f26
--- /dev/null
+++ b/board/aspeed/ast2400/platform.S
@@ -0,0 +1,3089 @@
+/*
+ * 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
+ */
+/*
+ * Board specific setup info
+ *
+ ******************************************************************************
+ * ASPEED Technology Inc.
+ * AST2300/AST2400 DDR2/DDR3 SDRAM controller initialization and calibration sequence
+ *
+ * Gary Hsu, <gary_hsu@aspeedtech.com>
+ *
+ * Release date: 2014.12.29 formal release for SDK0.60
+ *
+ * Modified list from v0.23
+ * EC1. Modify DQIDLY and DQSI-MCLK2X calibration algorithm
+ * EC2. Remove pass 2 DQIDLY finetune process
+ * EC3. Modify ECC code
+ * EC4. Add AST2400 supporting
+ * EC5. Add SPI timing calibration for AST2400
+ * EC6. Remove AST2300-A0 PCI-e workaround
+ * EC7. Add CK duty calibration for AST2400
+ * EC8. Remove #define CONFIG_DRAM_UART_OUT, default has message output to UART5
+ * EC9. Add DRAM size auto-detection
+ * EC10. Add GPIO register clear when watchdog reboot (only for AST2400)
+ * EC11. Move the "Solve ASPM" code position of AST2300 to avoid watchdog reset
+ *
+ * Modified list from v0.53
+ * EC1. Add solution of LPC lock issue due to watchdog reset. (AP note A2300-11)
+ *
+ * Modified list from v0.56
+ * EC1. Fix read DQS input mask window too late issue if DRAM's t_DQSCK is earlier too much
+ * (ex. Nanya NT5CB64M16FP)
+ * 1. Change init value of MCR18[4] from '1' to '0'
+ * 2. Add CBR4 code to finetune MCR18[4]
+ *
+ * Modified list from v0.59
+ * EC1. Add DQS input gating window delay tuning (1/2 T) when CBR retry
+ * EC2. Modify DLL1 MAdj = 0x4C
+ *
+ * Optional define variable
+ * 1. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 2. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * // when enabled, must define the ECC protected memory size at 0x1e6e0054
+ * 3. UART5 message output //
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ ******************************************************************************
+ */
+
+#include <config.h>
+#include <version.h>
+/******************************************************************************
+ Calibration Macro Start
+ Usable registers:
+ r0, r1, r2, r3, r5, r6, r7, r8, r9, r10, r11
+ ******************************************************************************/
+/* PATTERN_TABLE,
+ init_delay_timer,
+ check_delay_timer,
+ clear_delay_timer,
+ record_dll2_pass_range,
+ record_dll2_pass_range_h,
+ are for DRAM calibration */
+
+PATTERN_TABLE:
+ .word 0xff00ff00
+ .word 0xcc33cc33
+ .word 0xaa55aa55
+ .word 0x88778877
+ .word 0x92cc4d6e @ 5
+ .word 0x543d3cde
+ .word 0xf1e843c7
+ .word 0x7c61d253
+ .word 0x00000000 @ 8
+
+ .macro init_delay_timer
+ ldr r0, =0x1e782024 @ Set Timer3 Reload
+ str r2, [r0]
+
+ ldr r0, =0x1e6c0038 @ Clear Timer3 ISR
+ ldr r1, =0x00040000
+ str r1, [r0]
+
+ ldr r0, =0x1e782030 @ Enable Timer3
+ ldr r1, [r0]
+ mov r2, #7
+ orr r1, r1, r2, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6c0090 @ Check ISR for Timer3 timeout
+ .endm
+
+ .macro check_delay_timer
+ ldr r1, [r0]
+ bic r1, r1, #0xFFFBFFFF
+ mov r2, r1, lsr #18
+ cmp r2, #0x01
+ .endm
+
+ .macro clear_delay_timer
+ ldr r0, =0x1e782030 @ Disable Timer3
+ ldr r1, [r0]
+ bic r1, r1, #0x00000F00
+ str r1, [r0]
+
+ ldr r0, =0x1e6c0038 @ Clear Timer3 ISR
+ ldr r1, =0x00040000
+ str r1, [r0]
+ .endm
+
+ .macro record_dll2_pass_range
+ ldr r1, [r0]
+ bic r2, r1, #0xFFFFFF00
+ cmp r2, r3 @ record min
+ bicgt r1, r1, #0x000000FF
+ orrgt r1, r1, r3
+ bic r2, r1, #0xFFFF00FF
+ cmp r3, r2, lsr #8 @ record max
+ bicgt r1, r1, #0x0000FF00
+ orrgt r1, r1, r3, lsl #8
+ str r1, [r0]
+ .endm
+
+ .macro record_dll2_pass_range_h
+ ldr r1, [r0]
+ bic r2, r1, #0xFF00FFFF
+ mov r2, r2, lsr #16
+ cmp r2, r3 @ record min
+ bicgt r1, r1, #0x00FF0000
+ orrgt r1, r1, r3, lsl #16
+ bic r2, r1, #0x00FFFFFF
+ cmp r3, r2, lsr #24 @ record max
+ bicgt r1, r1, #0xFF000000
+ orrgt r1, r1, r3, lsl #24
+ str r1, [r0]
+ .endm
+
+ .macro init_spi_checksum
+ ldr r0, =0x1e620084
+ ldr r1, =0x20010000
+ str r1, [r0]
+ ldr r0, =0x1e62008C
+ ldr r1, =0x20000200
+ str r1, [r0]
+ ldr r0, =0x1e620080
+ ldr r1, =0x0000000D
+ orr r2, r2, r7
+ orr r1, r1, r2, lsl #8
+ and r2, r6, #0xF
+ orr r1, r1, r2, lsl #4
+ str r1, [r0]
+ ldr r0, =0x1e620008
+ ldr r2, =0x00000800
+ .endm
+
+/******************************************************************************
+ Calibration Macro End
+ ******************************************************************************/
+LPC_Patch: @ load to SRAM base 0x1e720400
+ str r1, [r0]
+ str r3, [r2]
+ bic r1, r1, #0xFF
+LPC_Patch_S1:
+ subs r5, r5, #0x01
+ moveq pc, r8
+ ldr r3, [r2]
+ tst r3, #0x01
+ movne pc, r8
+ mov pc, r7
+LPC_Patch_S2: @ load to SRAM base 0x1e720480
+ str r1, [r0]
+ mov pc, r9
+LPC_Patch_E:
+
+.globl lowlevel_init
+lowlevel_init:
+
+init_dram:
+ /* save lr */
+ mov r4, lr
+/* Test - DRAM initial time */
+ ldr r0, =0x1e782044
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e782030
+ ldr r1, [r0]
+ bic r1, r1, #0x0000F000
+ str r1, [r0]
+ mov r2, #3
+ orr r1, r1, r2, lsl #12
+ str r1, [r0]
+/* Test - DRAM initial time */
+
+ /*Set Scratch register Bit 7 before initialize*/
+ ldr r0, =0x1e6e2000
+ ldr r1, =0x1688a8a8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2040
+ ldr r1, [r0]
+ orr r1, r1, #0x80
+ str r1, [r0]
+
+ /* Fix LPC lock issue for AST2300 */
+ ldr r0, =0x1e6e207c @ Check AST2300
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x01
+ bne lpc_recover_end @ not match AST2300
+
+ mov r3, #0x0
+lpc_recover_check:
+ ldr r0, =0x1e78900c @ check HICR3[4]=0x1
+ ldr r1, [r0]
+ tst r1, #0x10
+ beq lpc_recover_end
+ ldr r0, =0x1e789004 @ check HICR1[7]=0x1
+ ldr r1, [r0]
+ tst r1, #0x80
+ beq lpc_recover_end
+ ldr r0, =0x1e7890a0 @ check LHCR0[27:24]=0x6
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ and r1, r1, #0xF
+ cmp r1, #0x06
+ bne lpc_recover_end
+ add r3, r3, #0x01
+ cmp r3, #0x5 @ repeat 5 times
+ ble lpc_recover_check
+
+ mov r3, #0x0
+lpc_recover_init:
+ ldr r0, =0x1e7890a4 @ set LHCR1[1:0]=0x0
+ ldr r1, =0x00000000
+ str r1, [r0]
+ add r3, r3, #0x01
+ cmp r3, #0x20
+ bge lpc_recover_end
+ ldr r1, [r0]
+ tst r1, #0x01
+ bne lpc_recover_init
+
+ ldr r0, =0x1e7890b0 @ set LHCR4[7:0]=0xFF
+ ldr r1, =0x000000FF
+ str r1, [r0]
+ ldr r0, =0x1e7890b4 @ set LHCR5[31:0]=0xFFFFFFFF
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+ ldr r0, =0x1e7890b8 @ set LHCR6[31:0]=0xFFFFFFFF
+ str r1, [r0]
+
+ adr r6, LPC_Patch
+ adr r7, LPC_Patch_S2
+ ldr r0, =0x1e720400
+copy_lpc_patch_1:
+ ldr r1, [r6]
+ str r1, [r0]
+ add r6, r6, #0x4
+ add r0, r0, #0x4
+ cmp r6, r7
+ bne copy_lpc_patch_1
+
+ adr r6, LPC_Patch_S2
+ adr r7, LPC_Patch_E
+ ldr r0, =0x1e720480
+copy_lpc_patch_2:
+ ldr r1, [r6]
+ str r1, [r0]
+ add r6, r6, #0x4
+ add r0, r0, #0x4
+ cmp r6, r7
+ bne copy_lpc_patch_2
+
+ ldr r0, =0x1e7890a0 @ set LHCR0[31:0]=0xFFFFFF01
+ ldr r1, =0xFFFFFF01
+ add r2, r0, #0x4
+ mov r3, #0x01
+ mov r5, #0x10
+ adr r9, lpc_recover_end
+ adr r6, LPC_Patch
+ adr r7, LPC_Patch_S1
+ sub r6, r7, r6
+ ldr r7, =0x1e720400
+ add r7, r7, r6
+ ldr r8, =0x1e720480
+ ldr pc, =0x1e720400
+
+lpc_recover_end:
+ ldr r0, =0x1e7890a0 @ set LHCR0[31:0]=0xFFFFFF00
+ ldr r1, =0xFFFFFF00
+ str r1, [r0]
+ /* <END> Fix LPC lock issue for AST2300 */
+
+ /* Check Scratch Register Bit 6 */
+ ldr r0, =0x1e6e2040
+ ldr r1, [r0]
+ bic r1, r1, #0xFFFFFFBF
+ mov r2, r1, lsr #6
+ cmp r2, #0x01
+ beq platform_exit
+
+ ldr r2, =0x033103F1 @ load PLL parameter for 24Mhz CLKIN (396:324)
+/* ldr r2, =0x019001F0 @ load PLL parameter for 24Mhz CLKIN (408:336) */
+ ldr r0, =0x1e6e207c @ Check Revision ID
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x02
+ bne set_MPLL @ not match AST2400
+
+ ldr r0, =0x1e6e2070 @ Check CLKIN freq
+ ldr r1, [r0]
+ mov r1, r1, lsr #23
+ tst r1, #0x01
+ ldrne r2, =0x017001D0 @ load PLL parameter for 25Mhz CLKIN (400:325)
+
+set_MPLL:
+ ldr r0, =0x1e6e2020 @ M-PLL (DDR SDRAM) Frequency
+ ldr r1, =0xFFFF
+#if defined(CONFIG_DRAM_336)
+ mov r2, r2, lsr #16
+#endif
+ and r1, r2, r1
+ str r1, [r0]
+
+/* Debug - UART console message */
+ ldr r0, =0x1e78400c
+ mov r1, #0x83
+ str r1, [r0]
+
+ ldr r0, =0x1e6e202c
+ ldr r2, [r0]
+ mov r2, r2, lsr #12
+ tst r2, #0x01
+ ldr r0, =0x1e784000
+ moveq r1, #0x0D @ Baudrate 115200
+ movne r1, #0x01 @ Baudrate 115200, div13
+#if defined(CONFIG_DRAM_UART_38400)
+ moveq r1, #0x27 @ Baudrate 38400
+ movne r1, #0x03 @ Baudrate 38400 , div13
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e784004
+ mov r1, #0x00
+ str r1, [r0]
+
+ ldr r0, =0x1e78400c
+ mov r1, #0x03
+ str r1, [r0]
+
+ ldr r0, =0x1e784008
+ mov r1, #0x07
+ str r1, [r0]
+
+ ldr r0, =0x1e784000
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+ mov r1, #0x41 @ 'A'
+ str r1, [r0]
+ mov r1, #0x4D @ 'M'
+ str r1, [r0]
+ mov r1, #0x20 @ ' '
+ str r1, [r0]
+ mov r1, #0x49 @ 'I'
+ str r1, [r0]
+ mov r1, #0x6E @ 'n'
+ str r1, [r0]
+ mov r1, #0x69 @ 'i'
+ str r1, [r0]
+ mov r1, #0x74 @ 't'
+ str r1, [r0]
+ mov r1, #0x2D @ '-'
+ str r1, [r0]
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ /* Delay about 100us */
+ ldr r0, =0x1e782030 @ Init Timer3 Control
+ ldr r1, [r0]
+ bic r1, r1, #0x00000F00
+ str r1, [r0]
+
+ ldr r2, =0x00000064 @ Set Timer3 Reload = 100 us
+ init_delay_timer
+delay_0:
+ check_delay_timer
+ bne delay_0
+ clear_delay_timer
+ /* end delay 100us */
+
+/******************************************************************************
+ Init DRAM common registers
+ ******************************************************************************/
+ ldr r0, =0x1e6e0000
+ ldr r1, =0xfc600309
+ str r1, [r0]
+
+ /* Reset MMC */
+ ldr r1, =0x00000000
+ ldr r0, =0x1e6e0034
+ str r1, [r0]
+ ldr r0, =0x1e6e0018
+ str r1, [r0]
+ ldr r0, =0x1e6e0024
+ str r1, [r0]
+ ldr r0, =0x1e6e0064 @ REG_MADJ, power down DLL
+ str r1, [r0]
+
+ ldr r1, =0x00034C4C @ REG_MADJ, reset DLL
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068 @ REG_SADJ
+ ldr r1, =0x00001800
+ str r1, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000B @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay_1:
+ check_delay_timer
+ bne delay_1
+ clear_delay_timer
+ /* end delay 10us */
+
+ ldr r0, =0x1e6e0064 @ REG_MADJ | 0xC0000, enable DLL
+ ldr r1, [r0]
+ ldr r2, =0xC0000
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0008
+ ldr r1, =0x0090040f /* VGA */
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x4000A120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00000120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0038
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0040
+ ldr r1, =0xFF444444
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0044
+ ldr r1, =0x22222222
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0048
+ ldr r1, =0x22222222
+ str r1, [r0]
+
+ ldr r0, =0x1e6e004c
+ ldr r1, =0x22222222
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x80000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0054
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0060 @ REG_DRV
+ ldr r1, =0x000000FA @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x000000FA
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0074
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0078
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e007c
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0080
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0084
+ ldr r1, =0x00FFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0088 @ REG_DQIDLY
+ ldr r1, =0x00000089 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000074
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0020 @ REG_DQSIC
+ ldr r1, =0x000000E2 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x000000BA
+#endif
+ str r1, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000B @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay_2:
+ check_delay_timer
+ bne delay_2
+ clear_delay_timer
+ /* end delay 10us */
+
+ /* Check DRAM Type by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xFEFFFFFF @ bit[24]=1 => DDR2
+ mov r2, r1, lsr #24
+ cmp r2, #0x01
+ beq ddr2_init
+ b ddr3_init
+.LTORG
+
+/******************************************************************************
+ DDR3 Init
+
+ tRCD = 15 ns
+ tRAS = 37.5 ns
+ tRRD = max(4 CK,10 ns)
+ tRP = 15 ns
+ tRFC = 110ns/1Gbit, 160ns/2Gbit, 300ns/4Gbit
+ tRTP = max(4 CK,7.5 ns)
+ tWR = 15 ns
+ tXSNR = max(10 CK,200 ns)
+ tWTR = max(4 CK,7.5 ns)
+ tFAW = 50 ns
+ tMRD = max(15 CK,20 ns)
+ ******************************************************************************/
+ddr3_init:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x33 @ '3'
+ str r1, [r0]
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0004
+ ldr r1, =0x00000531 @ Default set to 1Gbit
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0010 @ REG_AC1
+ ldr r1, =0x33302825 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x22202725
+#endif
+ str r1, [r0]
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #9 @ Set CL
+ ldr r1, =0x00020000
+ add r2, r2, r1
+ ldr r1, [r0]
+ bic r1, r1, #0xFBFFFFFF
+ mov r1, r1, lsr #6 @ Set CWL
+ orr r2, r2, r1
+ ldr r1, =0x00300000
+ add r2, r2, r1
+
+ ldr r0, =0x1e6e0014 @ REG_AC2
+ ldr r1, =0xCC00963F @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0xAA007636
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0004 @ check 2400 mode
+ ldr r2, [r0]
+ mov r2, r2, lsr #10
+
+ ldr r0, =0x1e6e006c @ REG_IOZ
+ ldr r1, =0x00002312 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00002312
+#endif
+ tst r2, #0x01
+ moveq r1, r1, lsr #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ mov r1, #0
+ str r1, [r0]
+ tst r2, #0x01 @ check AST2300
+ beq CBRDLL1_2300_Start
+ ldr r0, =0x1e6e207c @ check AST2400 revision A0
+ ldr r1, [r0]
+ mov r1, r1, lsr #16
+ and r1, r1, #0xFF
+ cmp r1, #0x0
+ beq CBRDLL1_2300_Start
+ b CBRDLL1_2400_Start
+MCLK2X_Phase_CBR_Done_DDR3:
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ orr r1, r1, #0x40
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0034
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c
+ ldr r1, =0x00000040
+ str r1, [r0]
+
+ /* Delay about 400us */
+ ldr r2, =0x00000190 @ Set Timer3 Reload = 400 us
+ init_delay_timer
+delay3_4:
+ check_delay_timer
+ bne delay3_4
+ clear_delay_timer
+ /* end delay 400us */
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #21 @ Set CL
+ ldr r1, =0x00000010
+ add r2, r2, r1
+ ldr r1, [r0]
+ bic r1, r1, #0xFBFFFFFF
+ mov r1, r1, lsr #7 @ Set CWL
+ orr r2, r2, r1
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x04001700 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x04001500
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x00000000 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000000
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS2
+ ldr r1, =0x00000005
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS3
+ ldr r1, =0x00000007
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x04001600 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x04001400
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Refresh 8 times
+ ldr r1, =0x00005C48
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Set refresh cycle
+ ldr r1, =0x00002001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0014
+ ldr r1, [r0]
+ bic r1, r1, #0xFFF9FFFF
+ mov r2, r1, lsr #3 @ get CL
+
+ ldr r0, =0x1e6e0034 @ REG_PWC
+ ldr r1, =0x00000303 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000303
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ b Calibration_Start
+.LTORG
+/******************************************************************************
+ End DDR3 Init
+ ******************************************************************************/
+
+/******************************************************************************
+ DDR2 Init
+
+ tRCD = 15 ns
+ tRAS = 45 ns
+ tRRD = 10 ns
+ tRP = 15 ns
+ tRFC = 105ns/512Mbit, 127.5ns/1Gbit, 197.5ns/2Gbit, 327.5ns/4Gbit
+ tRTP = 7.5 ns
+ tWR = 15 ns
+ tXSNR = 200 ns
+ tWTR = 7.5 ns
+ tFAW = 50 ns
+ tMRD = 4 CK
+ ******************************************************************************/
+ddr2_init:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x32 @ '2'
+ str r1, [r0]
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0004
+ ldr r1, =0x00000510 @ Default set to 512Mbit
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0010 @ REG_AC1
+ ldr r1, =0x33302714 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x22201613
+#endif
+ str r1, [r0]
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #5 @ Set CL
+ mov r1, r2, lsr #4 @ Set CWL
+ orr r2, r2, r1
+ ldr r1, =0x00110000
+ add r2, r2, r1
+
+ ldr r0, =0x1e6e0014 @ REG_AC2
+ ldr r1, =0xCC00B03F @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0xAA00903B
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0004 @ check 2400 mode
+ ldr r2, [r0]
+ mov r2, r2, lsr #10
+
+ ldr r0, =0x1e6e006c @ REG_IOZ
+ ldr r1, =0x00002312 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00002312
+#endif
+ tst r2, #0x01
+ moveq r1, r1, lsr #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ mov r1, #1
+ str r1, [r0]
+ tst r2, #0x01 @ check AST2300
+ beq CBRDLL1_2300_Start
+ ldr r0, =0x1e6e207c @ check AST2400 revision A0
+ ldr r1, [r0]
+ mov r1, r1, lsr #16
+ and r1, r1, #0xFF
+ cmp r1, #0x0
+ beq CBRDLL1_2300_Start
+ b CBRDLL1_2400_Start
+MCLK2X_Phase_CBR_Done_DDR2:
+
+ ldr r0, =0x1e6e0034
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ /* Delay about 400us */
+ ldr r2, =0x00000190 @ Set Timer3 Reload = 400 us
+ init_delay_timer
+delay2_4:
+ check_delay_timer
+ bne delay2_4
+ clear_delay_timer
+ /* end delay 400us */
+
+ /* Check DRAM CL Timing by H/W Trapping */
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xF9FFFFFF
+ mov r2, r1, lsr #21 @ Set CL
+ ldr r1, =0x00000040
+ orr r2, r2, r1
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x00000D03 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000B03
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x00000040 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000040
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS2
+ ldr r1, =0x00000005
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS3
+ ldr r1, =0x00000007
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Refresh 8 times
+ ldr r1, =0x00005C08
+ str r1, [r0]
+
+ ldr r0, =0x1e6e002c @ REG_MRS
+ ldr r1, =0x00000C03 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000A03
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set MRS
+ ldr r1, =0x00000001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x000003C0 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x000003C0
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0030 @ REG_EMRS
+ ldr r1, =0x00000040 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000040
+#endif
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0028 @ Set EMRS
+ ldr r1, =0x00000003
+ str r1, [r0]
+
+ ldr r0, =0x1e6e000c @ Set refresh cycle
+ ldr r1, =0x00002001
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0014
+ ldr r1, [r0]
+ bic r1, r1, #0xFFF9FFFF
+ mov r2, r1, lsr #3 @ get CL
+
+ ldr r0, =0x1e6e0034 @ REG_PWC
+ ldr r1, =0x00000503 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00000503
+#endif
+ orr r1, r1, r2
+ str r1, [r0]
+
+ b Calibration_Start
+.LTORG
+/******************************************************************************
+ End DDR2 Init
+ ******************************************************************************/
+/******************************************************************************
+ DDR CK duty finetune program
+ SRAM buffer definition
+ 0x1E720204 : gdll golden DLL1 record
+ 0x1E720208 : gduty golden duty setting record
+ 0x1E72020C : gdutysum golden duty data record
+ 0x1E720210 : duty record of delay 0 invert
+ 0x1E720214 : duty record of delay 1 invert
+ ....
+ 0x1E72024C : duty record of delay 15 invert
+ 0x1E720250 : duty record of delay 0
+ 0x1E720254 : duty record of delay 1
+ ....
+ 0x1E72028C : duty record of delay 15
+
+ Register usage
+ r0 - r3 = free
+ r4 = record the return pc value, do not use
+ r5 = free
+ r6 = free
+ r7 = duty count
+ r8 = gdll
+ r9 = gduty
+ r10 = gdutysum
+ ******************************************************************************/
+CBRDLL1_2400_Start:
+ ldr r0, =0x1e6e0120
+ ldr r1, [r0]
+ orr r1, r1, #0x02
+ str r1, [r0]
+
+ ldr r1, =0x00000000
+ ldr r0, =0x1e720204
+ ldr r2, =0x1e7202a0
+init_sram_start0:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start0
+
+ ldr r0, =0x1e6e0034
+ mov r1, #0x20
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0060
+ ldr r1, [r0]
+ mov r2, #0x01
+ orr r1, r1, r2, lsl #13
+ str r1, [r0]
+
+ mov r7, #0x0 @ init duty count
+ mov r8, #0x0 @ init gdll
+ mov r9, #0x0 @ init gduty
+ mov r10, #0x0 @ init gdutysum
+cbrdll1_duty_start:
+ cmp r7, #32
+ bge cbrdll1_duty_end
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00008120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0060
+ ldr r1, [r0]
+ bic r1, r1, #0x00001F00
+ orr r1, r1, r7, lsl #8
+ mov r2, #0x10
+ eor r1, r1, r2, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+
+ b CBRDLL1_2300_Start
+CBRDLL1_2400_Call:
+
+ mov r5, #0x01 @ init dqidly count
+ mov r6, #0x00 @ init duty sum
+cbrdll1_duty_cal_start:
+ cmp r5, #0x05
+ bge cbrdll1_duty_cal_end
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00200120
+ orr r1, r1, r5, lsl #16
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000
+ ldr r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ mov r2, #0x10
+ orr r1, r1, r2, lsl #24
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0080
+ ldr r1, =0x80000000 @ init duty cal waiting
+cbrdll1_duty_cal_wait:
+ ldr r2, [r0]
+ tst r2, r1
+ beq cbrdll1_duty_cal_wait
+
+ ldr r0, =0x1e6e008c
+ ldr r2, [r0]
+
+ ldr r0, =0x1e720210
+ add r0, r0, r7, lsl #2
+ str r2, [r0]
+
+ ldr r1, =0xFFFF
+ and r3, r1, r2
+ cmp r3, r1
+ moveq r2, r2, lsr #16
+ and r3, r1, r2
+ add r6, r6, r3
+ ldr r1, =0xF000
+ cmp r3, r1
+ blt cbrdll1_duty_cal_end
+ add r5, r5, #0x01
+ b cbrdll1_duty_cal_start
+
+cbrdll1_duty_cal_end:
+ mov r6, r6, lsr #2 @ get dutysum
+ cmp r6, r10 @ check dutysum > gdutysum
+ ble cbrdll1_duty_next
+ ldr r0, =0x1e6e0068
+ ldr r8, [r0]
+ eor r9, r7, #0x10
+ mov r10, r6
+
+cbrdll1_duty_next:
+ add r7, r7, #0x01
+ cmp r7, #16 @ check duty >= 15
+ blt cbrdll1_duty_start
+ ldr r0, =0xFA00 @ check gdutysum > 0xFA00
+ cmp r10, r0
+ blt cbrdll1_duty_start
+
+cbrdll1_duty_end:
+ ldr r0, =0x1e6e0060
+ ldr r1, [r0]
+ bic r1, r1, #0x00001F00
+ orr r1, r1, r9, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068
+ bic r8, r8, #0xFF000000
+ bic r8, r8, #0x00FF0000
+ str r8, [r0]
+
+ ldr r0, =0x1e720204 @ record result
+ str r8, [r0]
+ add r0, r0, #0x04
+ str r9, [r0]
+ add r0, r0, #0x04
+ str r10, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00008120
+ str r1, [r0]
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00000120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ ldr r1, [r0]
+ cmp r1, #0x3
+ beq MCLK2X_Phase_CBR_Done_DDR2
+ b MCLK2X_Phase_CBR_Done_DDR3
+
+/******************************************************************************
+ MCLK2X lock to MCLK program
+ r0 - r3 = free
+ r5 = madjmax
+ r6 = dllend
+ 0x1E720200 = 0x96cnt:failcnt:dllmax:dllmin
+ ******************************************************************************/
+CBRDLL1_2300_Start:
+ ldr r0, =0x1e6e0064
+ ldr r5, [r0]
+ and r5, r5, #0xFF @ init madjmax
+ mov r6, r5 @ init dllend
+
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e720200
+ str r1, [r0] @ init dllcnt2:dllmax:dllmin
+
+ mov r3, #0x0 @ init loop count
+cbrdll1_scan_start:
+ cmp r3, r6
+ bge cbrdll1_scan_end
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00008120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068
+ mov r1, r3
+ cmp r1, r5
+ subge r1, r1, r5
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, =0x00000120
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+ ldr r0, =0x1e6e0000 @ dummy read
+ ldr r1, [r0]
+
+ ldr r0, =0x1e6e001c
+ ldr r1, [r0]
+ mov r1, r1, lsr #16
+ and r1, r1, #0xFF
+
+ and r2, r1, #0x96
+ cmp r2, #0x96
+ beq cbrdll1_scan_pass @ if (mclk2x_phase & 0x96) == 0x96
+ ldr r0, =0x1e720200
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ ands r2, r2, #0xFF @ get dllmax
+ beq cbrdll1_scan_next @ if dllmax == 0
+ mov r2, r1, lsr #16
+ and r2, r2, #0xFF
+ add r2, r2, #0x01
+ cmp r2, #0x02
+ movge r6, r3
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r2, lsl #16
+ str r1, [r0]
+ b cbrdll1_scan_next
+
+cbrdll1_scan_pass:
+ cmp r3, #0x0 @ if dll = 0
+ moveq r3, #0x0F
+ addeq r6, r6, #0x10
+ beq cbrdll1_scan_next
+ ldr r0, =0x1e720200
+ ldr r2, [r0]
+ cmp r1, #0x96
+ bne cbrdll1_scan_pass2
+ mov r1, r2, lsr #24
+ add r1, r1, #0x01
+ bic r2, r2, #0xFF000000
+ orr r2, r2, r1, lsl #24
+ cmp r1, #0x03 @ check (phase == 0x96) count == 3
+ bicge r2, r2, #0x0000FF00
+ bicge r2, r2, #0x000000FF
+ orrge r2, r2, r3, lsl #8
+ orrge r2, r2, r3
+ str r2, [r0]
+ bge cbrdll1_scan_end
+
+cbrdll1_scan_pass2:
+ and r1, r2, #0xFF @ if(dllmin > dll)
+ cmp r1, r3
+ bicgt r2, r2, #0x000000FF
+ orrgt r2, r2, r3
+
+ mov r1, r2, lsr #8 @ if(dllmax < dll)
+ and r1, r1, #0xFF
+ cmp r1, r3
+ biclt r2, r2, #0x0000FF00
+ orrlt r2, r2, r3, lsl #8
+
+ bic r2, r2, #0x00FF0000
+ str r2, [r0]
+
+cbrdll1_scan_next:
+ add r3, r3, #0x01
+ b cbrdll1_scan_start
+
+cbrdll1_scan_end:
+ ldr r0, =0x1e720200
+ ldr r1, [r0]
+ mov r2, r1, lsr #8 @ get dllmax
+ ands r2, r2, #0xFF
+ bne cbrdll1_scan_done @ if(dllmax != 0)
+ ldr r0, =0x1e6e0064
+ ldr r3, [r0]
+ bic r1, r3, #0x000C0000
+ str r1, [r0]
+ add r0, r0, #0x04
+ mov r1, #0x0
+ str r1, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000A @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay0_1:
+ check_delay_timer
+ bne delay0_1
+ clear_delay_timer
+ /* end delay 10us */
+
+ ldr r0, =0x1e6e0064
+ str r3, [r0]
+
+ /* Delay about 10us */
+ ldr r2, =0x0000000A @ Set Timer3 Reload = 10 us
+ init_delay_timer
+delay0_2:
+ check_delay_timer
+ bne delay0_2
+ clear_delay_timer
+ /* end delay 10us */
+
+ b CBRDLL1_2300_Start
+
+cbrdll1_scan_done:
+ and r1, r1, #0xFF
+ add r1, r1, r2
+ mov r6, r1, lsr #1 @ dll1.0 = (dllmin + dllmax) >> 1
+ cmp r6, r5
+ subge r6, r6, r5
+ add r3, r6, r5, lsr #2 @ dll1.1 = dll1.0 + (MADJ >> 2)
+
+ ldr r0, =0x1e6e0004
+ ldr r1, [r0]
+ mov r1, r1, lsr #10
+ tst r1, #0x1
+ bne cbrdll1_scan_set_2400
+ cmp r3, r5
+ subge r3, r3, r5
+ mov r2, #0x0
+ tst r3, #0x08
+ beq cbrdll1_scan_set_2300_2 @ if !(dll & 8)
+cbrdll1_scan_set_2300_1: @ if (dll & 8)
+ mov r1, #0x0
+ tst r3, #0x08
+ addeq r1, r1, #0x01
+ cmp r2, #0x05
+ addge r1, r1, #0x01
+ cmp r1, #0x02
+ beq cbrdll1_scan_set
+ add r2, r2, #0x01
+ add r3, r3, #0x01
+ cmp r3, r5
+ subge r3, r3, r5
+ b cbrdll1_scan_set_2300_1
+
+cbrdll1_scan_set_2300_2:
+ and r1, r3, #0x07
+ cmp r1, #0x07
+ beq cbrdll1_scan_set
+ cmp r2, #0x05
+ bge cbrdll1_scan_set
+ add r2, r2, #0x01
+ add r3, r3, #0x01
+ cmp r3, r5
+ subge r3, r3, r5
+ b cbrdll1_scan_set_2300_2
+
+cbrdll1_scan_set_2400:
+ add r3, r3, #0x05 @ dll1.1 = dll1.0 + (MADJ >> 2) + 5
+ cmp r3, r5
+ subge r3, r3, r5
+
+cbrdll1_scan_set:
+ orr r1, r6, r3, lsl #8
+ ldr r0, =0x1e6e0068
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120
+ ldr r1, [r0]
+ cmp r1, #0x0
+ beq MCLK2X_Phase_CBR_Done_DDR3
+ cmp r1, #0x1
+ beq MCLK2X_Phase_CBR_Done_DDR2
+ b CBRDLL1_2400_Call
+
+.LTORG
+
+/******************************************************************************
+ Calibration Code Start
+ SRAM buffer definition
+ 0x1E720000 : Pass 1, DLLI MIN value range
+ 0x1E720008 : DQS0 DLL valid range, 2nd time CBR
+ 0x1E72000C : DQS1 DLL valid range, 2nd time CBR
+ 0x1E720010 : DQ0 DLL valid range, Pass 1
+ 0x1E720014 : DQ1 DLL valid range, Pass 1
+ ....
+ 0x1E720048 : DQ14 DLL valid range, Pass 1
+ 0x1E72004C : DQ15 DLL valid range, Pass 1
+ 0x1E720090 : DLL1 SAdj record
+ 0x1E720094 : DQL Pass1 finetune result
+ 0x1E720098 : DQH Pass1 finetune result
+ 0x1E72009C : DRAM initial time, (us)
+ 0x1E7200A0 : CBR3 retry counter
+ 0x1E7200A4 : DRAM initial time, (us)
+ 0x1E7200A8 : Released date
+ 0x1E7200AC : Released SDK version
+ 0x1E7200B0 : DQS input mask window for MCR18[4] = 0
+ 0x1E7200B4 : DQS input mask window for MCR18[4] = 1
+ 0x1E720100 : DQIDLY=00, DLL valid range
+ 0x1E720104 : DQIDLY=01, DLL valid range
+ ....
+ 0x1E720178 : DQIDLY=30, DLL valid range
+ 0x1E72017C : DQIDLY=31, DLL valid range
+ 0x1E720180 : DQSI-MCLK2X P-phase pass record DLL2= 0-31
+ 0x1E720184 : DQSI-MCLK2X P-phase pass record DLL2=32-63
+ 0x1E720188 : DQSI-MCLK2X N-phase pass record DLL2= 0-31
+ 0x1E72018C : DQSI-MCLK2X N-phase pass record DLL2=32-63
+ ******************************************************************************/
+Calibration_Start_pre: @ Toggle DQSI mask delay
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ eor r1, r1, #0x10
+ str r1, [r0]
+
+Calibration_Start:
+/* Init SRAM buffer */
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e720000
+ ldr r2, =0x1e720100
+init_sram_start:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start
+
+ ldr r1, =0x00ff00ff
+ ldr r0, =0x1e720100
+ ldr r2, =0x1e720180
+init_sram_start2:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start2
+
+ ldr r1, =0x00000000
+ ldr r0, =0x1e720180
+ ldr r2, =0x1e720200
+init_sram_start3:
+ str r1, [r0]
+ add r0, r0, #4
+ cmp r0, r2
+ blt init_sram_start3
+
+ ldr r0, =0x1e6e0068 @ save the DLL1 SAdj initial value
+ ldr r1, [r0]
+ ldr r0, =0x1e720090
+ str r1, [r0]
+
+/* Start
+ r0 = free
+ r1 = free
+ r2 = free
+ r3 = free
+ r4 = record the return pc value, do not use
+ r5 = pattern table index
+ r6 = pass count
+ r7 = dram DLL2 parameter index (0x1e6e0068), max is 0x4C
+*/
+/******************************************************************************
+ Fine DQI delay and DQSI-MCLK phase
+ r8 = DQIDLY count
+ r9 = DQSI-MCLK2X phase count
+ r10 = pattern fail retry counter, initialize to 2 (fail 2 times)
+ r11 = passcnt accumulator for each DQIDLY
+ *****************************************************************************/
+CBR0_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x43 @ 'C'
+ str r1, [r0]
+ mov r1, #0x42 @ 'B'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+ mov r1, #0x30 @ '0'
+ str r1, [r0]
+ mov r1, #0x2D @ '-'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0xFF000000
+ bic r1, r1, #0x00FF0000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 1KB
+ ldr r1, =0x000003FF
+ str r1, [r0]
+
+ mov r8, #0x00 @ init DQIDLY
+ mov r9, #0x00 @ init DQSI-MCLK2X phase
+ mov r11, #0x01 @ init passcnt accumulator
+
+cbr0_next_dqidly:
+ cmp r9, #0x00
+ bne cbr0_next_dqsiphase
+ cmp r11, #0x00
+ addeq r8, r8, #0x01 @ jump 1 stage if no pass at previous stage
+ mov r11, #0x00
+ add r8, r8, #0x01
+ cmp r8, #0x1F @ max DQIDLY = 31
+ bgt CBR0_END
+
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ and r1, r8, #0x07
+ add r1, r1, #0x30 @ '0-7'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r8, lsl #16
+ str r1, [r0]
+ mov r9, #0x01 @ '1':p_phase, '0':n_phase
+
+ /* Delay about 3us */ @ wait DQIDLY load
+ ldr r2, =0x00000003 @ Set Timer4 Reload = 3 us
+ init_delay_timer
+delay_4:
+ check_delay_timer
+ bne delay_4
+ clear_delay_timer
+ /* end delay 3us */
+
+ b cbr0_dll2_scan_start
+
+cbr0_next_dqsiphase:
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ orr r1, r1, r9, lsl #23 @ set DQSI-MCLK2X phase
+ str r1, [r0]
+ mov r9, #0x00
+
+cbr0_dll2_scan_start:
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init DLL2 parameter index
+
+/****************************
+ DLL2 delay margin test loop
+ ***************************/
+cbr0_next_dll2_parameter:
+ ldr r0, =0x1e6e0068 @ load DLL2 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+ ldr r2, =0x40404040 @ DLL2 max is 0x40404040
+ cmp r7, r2
+ bge cbr0_next_dqidly
+ ldr r2, =0x01010101
+ add r7, r7, r2
+
+/* CBRScan3() start */
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr0_next_test_pattern:
+ mov r10, #2 @ set the retry loop = 2 of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr0_test_burst
+
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add 1 after loop check so we need to decrease 1
+ cmp r3, #0x00
+ beq cbr0_next_dqidly @ pass at dlli = 0, invalid
+ add r6, r6, #0x01 @ increment pass count
+ add r11, r11, #0x01 @ increment pass count
+
+ ldr r0, =0x1e720180 @ record DLL2 pass window
+ cmp r9, #0x00 @ DQSI-MCLK2X phase check
+ addeq r0, r0, #0x08
+ cmp r3, #32
+ addge r0, r0, #0x4
+ and r1, r3, #0x1F
+ mov r2, #0x1
+ mov r2, r2, lsl r1
+ ldr r1, [r0]
+ orr r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e720100 @ record DLL2 min:max value for each DQIDLY
+ add r0, r0, r8, lsl #2
+ cmp r9, #0x00 @ DQSI-MCLK2X phase check
+ beq cbr0_test_pass_dqsin
+ record_dll2_pass_range
+ b cbr0_next_dll2_parameter
+
+cbr0_test_pass_dqsin:
+ record_dll2_pass_range_h
+ b cbr0_next_dll2_parameter
+
+cbr0_test_pattern_fail:
+ cmp r6, #5 @ passcnt >= 5
+ bge cbr0_next_dqidly
+ ldr r0, =0x1e720100 @ reset DLL2 min:max value
+ add r0, r0, r8, lsl #2
+ ldr r1, [r0]
+ ldr r2, =0xFFFF0000
+ ldr r3, =0x000000FF
+ cmp r9, #0x00
+ moveq r2, r2, lsr #16
+ moveq r3, r3, lsl #16
+ and r1, r1, r2
+ orr r1, r1, r3
+ str r1, [r0]
+ b cbr0_next_dll2_parameter @ CBRScan3() end and test result fail, go to next step
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr0_pattern_fail_retry:
+
+/* CBRTest3() start */
+cbr0_test_burst:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x000000C1
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr0_wait_engine_idle_0:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr0_wait_engine_idle_0
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ bne cbr0_test_fail
+
+cbr0_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000085
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr0_wait_engine_idle_1:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr0_wait_engine_idle_1
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ beq cbr0_test_pass
+
+/* CBRTest3() end */
+
+cbr0_test_fail:
+ subs r10, r10, #1
+ bne cbr0_pattern_fail_retry
+ b cbr0_test_pattern_fail @ CBRScan3() return(0)
+
+cbr0_test_pass:
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr0_next_test_pattern
+
+CBR0_END:
+ mov r5, #0x0 @ init DQIDLY search count
+ mov r6, #0x0 @ init max_margin:g_margin
+ mov r8, #0x0 @ init g_side
+ mov r7, #0x0 @ init maximum margin DQIDLY,DQSI-MCLK2X phase
+cbr0_search_dll_margin_s:
+ ldr r0, =0x1e720100
+ add r0, r0, r5, lsl #2
+ ldr r1, [r0]
+ and r2, r1, #0xFF @ get dllmin_p
+ mov r1, r1, lsr #8
+ and r3, r1, #0xFF @ get dllmax_p
+ subs r2, r3, r2 @ get margin-P
+ movmi r2, #0x0
+ mov r1, r1, lsr #8
+ and r3, r1, #0xFF @ get dllmin_n
+ mov r1, r1, lsr #8
+ and r1, r1, #0xFF @ get dllmax_n
+ subs r3, r1, r3 @ get margin-N
+ movmi r3, #0x0
+ add r1, r2, r3
+ cmp r1, #0x0
+ beq cbr0_search_dll_margin_e @ if margin-P = 0 && margin-N = 0
+
+ ldr r9, [r0]
+ ldr r0, =0x1e720180
+ cmp r2, r3
+ orrlt r5, r5, #0x80 @ margin-N > margin-P
+ addlt r0, r0, #0x08
+ movlt r9, r9, lsr #16
+ movge r3, r2 @ max(margin-P/N)
+ add r2, r3, #0x2 @ define +/- 2 steps of variation
+ mov r1, r6, lsr #16
+ cmp r2, r1
+ blt cbr0_search_dll_margin_e @ if max(margin-P/N) + 2 < max_margin
+
+ and r1, r9, #0xFF @ r1 = dlli counter
+ cmp r1, #32
+ ldrge r2, [r0, #0x4] @ load pass window
+ ldrlt r2, [r0]
+ and r1, r1, #0x1F
+ mov r10, #0x1 @ init test bit mask
+ mov r10, r10, lsl r1
+ and r1, r9, #0xFF
+cbr0_search_dllmin_margin_s:
+ tst r2, r10
+ beq cbr0_search_dllmin_margin_e
+ mov r10, r10, lsr #1
+ cmp r1, #32
+ ldreq r2, [r0]
+ ldreq r10, =0x80000000
+ subs r1, r1, #0x1
+ bne cbr0_search_dllmin_margin_s
+
+cbr0_search_dllmin_margin_e:
+ and r2, r9, #0xFF
+ sub r11, r2, r1 @ get dllmin side margin
+
+ mov r9, r9, lsr #8
+ and r1, r9, #0xFF @ r1 = dlli counter
+ cmp r1, #32
+ ldrge r2, [r0, #0x4] @ load pass window
+ ldrlt r2, [r0]
+ and r1, r1, #0x1F
+ mov r10, #0x1 @ init test bit mask
+ mov r10, r10, lsl r1
+ and r1, r9, #0xFF
+cbr0_search_dllmax_margin_s:
+ tst r2, r10
+ beq cbr0_search_dllmax_margin_e
+ mov r10, r10, lsl #1
+ cmp r1, #31
+ ldreq r2, [r0, #0x4]
+ ldreq r10, =0x00000001
+ add r1, r1, #0x1
+ cmp r1, #64
+ bne cbr0_search_dllmax_margin_s
+
+cbr0_search_dllmax_margin_e:
+ and r2, r9, #0xFF
+ sub r1, r1, r2 @ get dllmax side margin
+ cmp r1, r11
+ movlt r11, r1 @ get side_margin
+
+cbr0_check_dll_margin: @ if max(margin-P/N) > g_margin && side_margin >= g_side && dqidly <= 20
+ cmp r5, #20
+ bgt cbr0_check_dll_margin2
+ and r1, r6, #0xFF
+ cmp r3, r1
+ ble cbr0_check_dll_margin3
+ cmp r11, r8
+ bge cbr0_set_dll_margin
+
+cbr0_check_dll_margin2: @ if max(margin-P/N) > g_margin+1 && side_margin >= g_side)
+ and r1, r6, #0xFF
+ add r2, r1, #0x1
+ cmp r3, r2
+ ble cbr0_check_dll_margin3
+ cmp r11, r8
+ bge cbr0_set_dll_margin
+
+cbr0_check_dll_margin3: @ if side_margin > g_side && g_side < 8
+ cmp r8, #8
+ bge cbr0_search_dll_margin_e
+ cmp r11, r8
+ ble cbr0_search_dll_margin_e
+
+cbr0_set_dll_margin:
+ mov r1, r6, lsr #16
+ cmp r3, r1
+ bicgt r6, r6, #0x00FF0000
+ orrgt r6, r6, r3, lsl #16
+ bic r6, r6, #0x000000FF
+ orr r6, r6, r3
+ mov r7, r5
+ mov r8, r11
+
+cbr0_search_dll_margin_e:
+ and r5, r5, #0x7F
+ add r5, r5, #0x01
+ cmp r5, #0x20 @ last DQIDLY
+ blt cbr0_search_dll_margin_s
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0068
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ str r1, [r0]
+
+ /* Delay about 5us */
+ ldr r2, =0x00000005 @ Set Timer5 Reload = 5 us
+ init_delay_timer
+delay_5:
+ check_delay_timer
+ bne delay_5
+ clear_delay_timer
+ /* end delay 5us */
+
+ ldr r0, =0x1e6e000c @ Set refresh cycle
+ ldr r1, =0x00005C01
+ str r1, [r0]
+
+/******************************************************************************
+ Fine tune per bit DQ input delay -- Pass 1, left edge align
+ r8 = free
+ r9 = DQ fail bit accumulator
+ r10 = pattern fail counter, initialize to 5 (fail 5 times)
+ r11 = free
+ *****************************************************************************/
+CBR1_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+ mov r1, #0x43 @ 'C'
+ str r1, [r0]
+ mov r1, #0x42 @ 'B'
+ str r1, [r0]
+ mov r1, #0x52 @ 'R'
+ str r1, [r0]
+ mov r1, #0x31 @ '1'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init DLL2 parameter index
+
+/****************************
+ DLL2 delay margin test loop
+ ***************************/
+cbr1_next_dll2_parameter:
+ ldr r0, =0x1e6e0068 @ load DLL2 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+ ldr r2, =0x40404040 @ parameter's max is to 0x40404040
+ cmp r7, r2
+ bge CBR1_END
+ ldr r2, =0x01010101
+ add r7, r7, r2
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 4KB
+ ldr r1, =0x00000FFF
+ str r1, [r0]
+
+/* CBRScan2() start */
+ ldr r9, =0xFFFF @ init test status
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr1_next_test_pattern:
+ mov r10, #5 @ set the retry loop of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr1_test_single
+
+cbr1_test_pattern_end:
+ cmp r9, #0x00
+ bne cbr1_test_pass_dqi
+ cmp r6, #10
+ bge CBR1_END
+ b cbr1_next_dll2_parameter @ CBRScan2() end and test result fail, go to next step
+
+cbr1_test_pass_dqi:
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add 1 after loop check so we need to decrease 1
+ add r6, r6, #0x01 @ increment pass count
+ ldr r0, =0x1e720010
+ mov r8, #0x01
+cbr1_test_pass_dqi_loop_s:
+ tst r9, r8
+ beq cbr1_test_pass_dqi_loop_e
+ record_dll2_pass_range
+
+cbr1_test_pass_dqi_loop_e:
+ add r0, r0, #0x04
+ mov r8, r8, lsl #1
+ ldr r1, =0xFFFF
+ tst r8, r1
+ bne cbr1_test_pass_dqi_loop_s
+ b cbr1_next_dll2_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr1_pattern_fail_retry:
+
+/* CBRTest2() start */
+cbr1_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000005
+ str r1, [r0]
+ ldr r3, =0x1000
+ ldr r1, =0x1000
+cbr1_wait_engine_idle_0:
+ subs r1, r1, #1
+ beq cbr1_test_single_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr1_wait_engine_idle_0
+
+cbr1_test_single_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r11, [r0]
+ orr r11, r11, r11, lsr #16
+ bic r11, r11, #0xFF000000
+ bic r11, r11, #0x00FF0000
+
+ ldr r1, =0xFFFF
+ cmp r11, r1
+ beq cbr1_test_fail
+
+cbr1_test_burst:
+ ldr r0, =0x1e6e0070
+ ldr r2, =0x00000000
+ str r2, [r0]
+ ldr r2, =0x00000041
+ str r2, [r0]
+ ldr r3, =0x1000
+ ldr r1, =0x1000
+cbr1_wait_engine_idle_1:
+ subs r1, r1, #1
+ beq cbr1_test_burst_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr1_wait_engine_idle_1
+
+cbr1_test_burst_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r2, [r0]
+ orr r2, r2, r2, lsr #16
+ bic r2, r2, #0xFF000000
+ bic r2, r2, #0x00FF0000
+ orr r11, r11, r2
+
+ ldr r2, =0xFFFF
+ cmp r11, r2
+ bne cbr1_test_pass
+/* CBRTest2() end */
+
+cbr1_test_fail:
+ subs r10, r10, #1
+ bne cbr1_pattern_fail_retry
+ mov r9, #0x00
+ b cbr1_test_pattern_end @ CBRScan2() return(0)
+
+cbr1_test_pass:
+ ldr r1, =0xFFFF @ record the pass bit
+ eor r11, r11, r1
+ and r9, r9, r11 @ DQ pass bit
+ cmp r9, #0x00
+ beq cbr1_test_pattern_end @ CBRScan2() return(0)
+
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr1_next_test_pattern
+
+CBR1_END:
+ mov r5, #0x0 @ init DQ DLL_min sum
+ mov r6, #0x0 @ init DQ DLL_min valid count
+ ldr r0, =0x1e72000c
+ ldr r3, =0x1e720050
+cbr1_search_dllmin_s:
+ add r0, r0, #0x04
+ cmp r0, r3
+ beq cbr1_search_dllmin_e
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ subs r2, r2, r1 @ dllmax - dllmin
+ bmi cbr1_search_dllmin_s @ no valid margin found, bypass fine tune
+ cmp r2, #10 @ (dllmax - dllmin) < 10
+ blt cbr1_search_dllmin_s @ no enough margin found, bypass fine tune
+ add r5, r5, r1
+ add r6, r6, #1
+ b cbr1_search_dllmin_s
+
+cbr1_search_dllmin_e:
+ cmp r6, #16
+ bne Calibration_Start_pre @ not all bits valid, retry again
+
+ mov r5, r5, lsr #4
+ ldr r0, =0x1e720000
+ str r5, [r0]
+
+ mov r6, #0x00 @ init DQL CBR value
+ ldr r0, =0x1e720030
+ ldr r7, =0x1e72000c
+cbr1_set_result_dql:
+ sub r0, r0, #4
+ cmp r0, r7
+ beq cbr1_set_result_next
+ mov r6, r6, lsl #3
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ mov r3, r1 @ dll = dllmin
+ cmp r5, r3
+ blt cbr1_set_result_dql_neg
+ sub r1, r5, r3
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ cmp r1, #2 @ dqi_tune max = 2
+ movgt r1, #2
+ orr r6, r6, r1
+ b cbr1_set_result_dql
+
+cbr1_set_result_dql_neg:
+ sub r1, r3, r5
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ cmp r1, #2 @ dqi_tune max = -2
+ movgt r1, #2
+ mov r2, #8
+ sub r1, r2, r1
+ and r1, r1, #7
+ orr r6, r6, r1
+ b cbr1_set_result_dql
+
+cbr1_set_result_next:
+ ldr r0, =0x1e6e0080 @ save DQL fine tune result
+ str r6, [r0]
+ ldr r0, =0x1e720094
+ str r6, [r0]
+
+ mov r6, #0x00 @ init DQH CBR value
+ ldr r0, =0x1e720050
+ ldr r7, =0x1e72002c
+cbr1_set_result_dqh:
+ sub r0, r0, #4
+ cmp r0, r7
+ beq cbr1_set_result_end
+ mov r6, r6, lsl #3
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ mov r3, r1 @ dll = dllmin
+ cmp r5, r3
+ blt cbr1_set_result_dqh_neg
+ sub r1, r5, r3
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ cmp r1, #3 @ dqi_tune max = 2
+ movgt r1, #3
+ subs r1, r1, #1
+ movmi r1, #7
+ orr r6, r6, r1
+ b cbr1_set_result_dqh
+
+cbr1_set_result_dqh_neg:
+ sub r1, r3, r5
+ mov r2, #19
+ mul r1, r2, r1
+ mov r1, r1, lsr #5 @ dqi_tune = ((gold_dll - dll) * 19) >> 5
+ add r1, r1, #1
+ cmp r1, #2 @ dqi_tune max = -2
+ movgt r1, #2
+ mov r2, #8
+ sub r1, r2, r1
+ and r1, r1, #7
+ orr r6, r6, r1
+ b cbr1_set_result_dqh
+
+cbr1_set_result_end:
+ ldr r0, =0x1e6e0084 @ save DQH fine tune result
+ str r6, [r0]
+ ldr r0, =0x1e720098
+ str r6, [r0]
+
+/******************************************************************************
+ Search the DLL2 detail margin
+ *****************************************************************************/
+ ldr r0, =0x1e7200a0
+ mov r1, #0
+ str r1, [r0]
+
+CBR3_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x33 @ '3'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init DLL2 parameter index
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e720008 @ init DQL dllmax,dllmin
+ str r1, [r0]
+ ldr r0, =0x1e72000c @ init DQH dllmax,dllmin
+ str r1, [r0]
+
+ ldr r0, =0x1e7200a0 @ CBR3 iteration counter
+ ldr r1, [r0]
+ add r1, r1, #1
+ str r1, [r0]
+
+/****************************
+ DLL2 delay margin test loop
+ ***************************/
+cbr3_next_dll2_parameter:
+ ldr r0, =0x1e6e0068 @ load DLL2 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x00FF0000
+ bic r1, r1, #0xFF000000
+ orr r1, r1, r7, lsl #16
+ str r1, [r0]
+ ldr r2, =0x40404040 @ parameter's max is to 0x40404040
+ cmp r7, r2
+ bge CBR3_END
+ ldr r2, =0x01010101
+ add r7, r7, r2
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 64KB
+ ldr r1, =0x0000FFFF
+ str r1, [r0]
+
+/* CBRScan() start */
+ mov r9, #0x03 @ init test status
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr3_next_test_pattern:
+ mov r10, #5 @ set the retry loop of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr3_test_single
+
+cbr3_test_pattern_end:
+ cmp r9, #0x00
+ bne cbr3_test_pass_dql
+ cmp r6, #10
+ bge CBR3_END
+ b cbr3_next_dll2_parameter @ CBRScan() end and test result fail, go to next step
+
+cbr3_test_pass_dql:
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add one after loop check so we need to decrease 1
+ add r6, r6, #0x01 @ increment pass count
+ tst r9, #0x01
+ beq cbr3_test_pass_dqh
+
+ ldr r0, =0x1E720008
+ record_dll2_pass_range
+
+cbr3_test_pass_dqh:
+ tst r9, #0x02
+ beq cbr3_next_dll2_parameter
+ ldr r0, =0x1E72000c
+ record_dll2_pass_range
+ b cbr3_next_dll2_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr3_pattern_fail_retry:
+
+/* CBRTest() start */
+cbr3_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000005
+ str r1, [r0]
+ ldr r3, =0x1000
+ ldr r8, =0x10000
+cbr3_wait_engine_idle_0:
+ subs r8, r8, #1
+ beq cbr3_test_single_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr3_wait_engine_idle_0
+
+cbr3_test_single_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r11, [r0]
+ orr r11, r11, r11, lsr #16
+ bic r11, r11, #0xFF000000
+ bic r11, r11, #0x00FF0000
+
+ ldr r1, =0xFF
+ tst r11, r1
+ beq cbr3_test_burst
+ tst r11, r1, lsl #8
+ bne cbr3_test_fail
+
+cbr3_test_burst:
+ mov r1, #0x00 @ initialize loop index, r1 is loop's index
+cbr3_test_burst_loop:
+ ldr r0, =0x1e6e0070
+ ldr r2, =0x00000000
+ str r2, [r0]
+ mov r2, r1, lsl #3
+ orr r2, r2, #0x41 @ test command = 0x41 | (datagen << 3)
+ str r2, [r0]
+ ldr r3, =0x1000
+ ldr r8, =0x10000
+cbr3_wait_engine_idle_1:
+ subs r8, r8, #1
+ beq cbr3_test_burst_end
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr3_wait_engine_idle_1
+
+cbr3_test_burst_end:
+ ldr r0, =0x1e6e0078 @ read fail bit status
+ ldr r2, [r0]
+ orr r2, r2, r2, lsr #16
+ bic r2, r2, #0xFF000000
+ bic r2, r2, #0x00FF0000
+ orr r11, r11, r2
+
+ ldr r2, =0xFF
+ tst r11, r2
+ beq cbr3_next_test_burst_mode
+ tst r11, r2, lsl #8
+ beq cbr3_next_test_burst_mode
+/* CBRTest() end */
+
+cbr3_test_fail:
+ subs r10, r10, #1
+ bne cbr3_pattern_fail_retry
+ mov r9, #0x00
+ b cbr3_test_pattern_end @ CBRScan() return(0)
+
+cbr3_next_test_burst_mode:
+ add r1, r1, #1 @ increase the test mode index
+ cmp r1, #0x08 @ there are 8 modes
+ bne cbr3_test_burst_loop
+
+ ldr r1, =0xFF @ record the pass byte
+ tst r11, r1
+ andne r9, r9, #0x02 @ DQL fail
+ tst r11, r1, lsl #8
+ andne r9, r9, #0x01 @ DQH fail
+ cmp r9, #0x00
+ beq cbr3_test_pattern_end @ CBRScan() return(0)
+
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr3_next_test_pattern
+
+CBR3_END:
+ ldr r0, =0x1e72000c @ check DQH margin
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ subs r5, r2, r1 @ dllmax - dllmin
+ bmi CBR3_START @ no valid margin found, retry again
+ cmp r5, #10 @ (dllmax - dllmin) < 10
+ blt CBR3_START @ no enough margin found, retry again
+ add r2, r1, r2 @ (dllmin[1] + dllmax[1] + 1) >> 1
+ add r2, r2, #0x01
+ mov r1, r2, lsr #1
+ mov r3, r1, lsl #8
+ ldr r1, [r0] @ store the dll search result
+ bic r1, r1, #0xFF000000
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r3, lsl #8
+ str r1, [r0]
+
+ ldr r0, =0x1e720008 @ check DQL margin
+ ldr r1, [r0]
+ mov r2, r1, lsr #8
+ and r2, r2, #0xFF @ get dllmax
+ and r1, r1, #0xFF @ get dllmin
+ subs r5, r2, r1 @ dllmax - dllmin
+ bmi CBR3_START @ no valid margin found, retry again
+ cmp r5, #10 @ (dllmax - dllmin) < 10
+ blt CBR3_START @ no enough margin found, retry again
+ add r2, r1, r2 @ (dllmin[0] + dllmax[0] + 1) >> 1
+ add r2, r2, #0x01
+ mov r1, r2, lsr #1
+ ldr r2, [r0] @ store the dll search result
+ bic r2, r2, #0xFF000000
+ bic r2, r2, #0x00FF0000
+ orr r2, r2, r1, lsl #16
+ str r2, [r0]
+ orr r3, r3, r1
+
+ ldr r0, =0x1e6e0068 @ save the result dll value
+ ldr r1, [r0]
+ bic r1, r1, #0xFF000000
+ bic r1, r1, #0x00FF0000
+ orr r1, r1, r3, lsl #16
+ str r1, [r0]
+ b CBR4_START
+
+.LTORG
+
+/******************************************************************************
+ Search the DQS input mask margin
+ *****************************************************************************/
+CBR4_START:
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x34 @ '4'
+ str r1, [r0]
+/* Debug - UART console message */
+
+ ldr r0, =0x1e6e0074 @ set the testing DRAM size = 4KB
+ ldr r1, =0x00000FFF
+ str r1, [r0]
+
+ mov r8, #0x00 @ init MCR18[4]
+ ldr r1, =0x000000ff
+ ldr r0, =0x1e7200b0 @ init MCR18[4]=0 max,min
+ str r1, [r0]
+ ldr r0, =0x1e7200b4 @ init MCR18[4]=1 max,min
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x0000001F
+ str r1, [r0]
+
+ b cbr4_scan_start
+
+cbr4_next_maskdly:
+ add r8, r8, #0x01
+ and r2, r8, #0x01
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ bic r1, r1, #0x0000001F
+ orr r1, r1, r2, lsl #4
+ str r1, [r0]
+ cmp r8, #0x02
+ bge CBR4_END
+
+cbr4_scan_start:
+ mov r6, #0x00 @ init pass count
+ mov r7, #0x00 @ init mask delay
+
+/****************************
+ DQS Mask delay margin test loop
+ ***************************/
+cbr4_next_parameter:
+ cmp r7, #0x10 @ max delay = 0xF
+ bge cbr4_next_maskdly
+ ldr r0, =0x1e6e0018 @ load MCR18 parameter
+ ldr r1, [r0]
+ bic r1, r1, #0x0000000F
+ orr r1, r1, r7
+ str r1, [r0]
+ add r7, r7, #0x01
+
+/* CBRScan3() start */
+ adrl r5, PATTERN_TABLE @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr4_next_test_pattern:
+ mov r10, #2 @ set the retry loop = 2 of each pattern
+ ldr r1, [r5] @ load test pattern
+ ldr r0, =0x1e6e007c
+ str r1, [r0]
+ cmp r1, #0x00 @ the last data in pattern is 0x00
+ bne cbr4_test_burst
+
+ and r3, r7, #0xFF
+ sub r3, r3, #0x01 @ we add 1 after loop check so we need to decrease 1
+ add r6, r6, #0x01 @ increment pass count
+
+ ldr r0, =0x1e7200b0 @ record pass window
+ add r0, r0, r8, lsl #2
+ record_dll2_pass_range
+ mov r2, #0x01
+ add r1, r1, r2, lsl #16
+ str r1, [r0]
+ b cbr4_next_parameter
+
+cbr4_test_pattern_fail:
+ cmp r6, #5 @ passcnt >= 5
+ bge cbr4_next_maskdly
+ b cbr4_next_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr4_pattern_fail_retry:
+
+/* CBRTest3() start */
+cbr4_test_burst:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x000000C1
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr4_wait_engine_idle_0:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr4_wait_engine_idle_0
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ bne cbr4_test_fail
+
+cbr4_test_single:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r1, =0x00000085
+ str r1, [r0]
+ ldr r3, =0x3000
+cbr4_wait_engine_idle_1:
+ ldr r2, [r0]
+ tst r2, r3 @ D[12] = idle bit
+ beq cbr4_wait_engine_idle_1
+
+ ldr r2, [r0] @ read fail bit status
+ mov r1, #0x0
+ str r1, [r0]
+ mov r2, r2, lsr #13 @ D[13] = fail bit
+ cmp r2, #0x00
+ beq cbr4_test_pass
+
+/* CBRTest3() end */
+
+cbr4_test_fail:
+ subs r10, r10, #1
+ bne cbr4_pattern_fail_retry
+ b cbr4_test_pattern_fail @ CBRScan3() return(0)
+
+cbr4_test_pass:
+ add r5, r5, #0x04 @ increase the test pattern index
+ b cbr4_next_test_pattern
+
+CBR4_END:
+ ldr r0, =0x1e7200b0 @ check mask margin
+ ldr r1, [r0]
+ add r0, r0, #0x04
+ ldr r2, [r0]
+ ands r6, r2, #0xFF @ get min of MCR18[4] = 1
+ bne cbr4_noset_delay
+ ands r5, r1, #0xFF @ get min of MCR18[4] = 0
+ bne cbr4_set_delay
+ mov r1, r1, lsr #8 @ get max of MCR18[4] = 0
+ and r1, r1, #0xFF
+ mov r2, r2, lsr #8 @ get max of MCR18[4] = 1
+ and r2, r2, #0xFF
+ sub r1, r1, r5
+ sub r2, r2, r6
+ cmp r1, r2
+ bge cbr4_noset_delay
+
+cbr4_set_delay:
+ ldr r0, =0x1e6e0018
+ ldr r1, [r0]
+ orr r1, r1, #0x10
+ str r1, [r0]
+
+cbr4_noset_delay:
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+/******************************************************************************
+ CBR Finish
+ *****************************************************************************/
+/******************************************************************************
+ Check DRAM Size
+ *****************************************************************************/
+ ldr r0, =0x1e6e2070
+ ldr r1, [r0]
+ bic r1, r1, #0xFEFFFFFF @ bit[24]=1 => DDR2
+ mov r2, r1, lsr #24
+ cmp r2, #0x01
+ beq check_ddr2_size
+
+ ldr r0, =0x1e6e0004
+ ldr r5, [r0]
+ bic r5, r5, #0x00000003 @ record MCR04
+ orr r1, r5, #0x3
+ str r1, [r0] @ set to 4Gbit
+ ldr r6, =0x003F2217
+#if defined(CONFIG_DRAM_336)
+ ldr r6, =0x00361C13
+#endif
+ b check_dram_size
+
+check_ddr2_size:
+ ldr r0, =0x1e6e0004
+ ldr r5, [r0]
+ bic r5, r5, #0x00000023 @ record MCR04
+ orr r1, r5, #0x23
+ str r1, [r0] @ set to 4Gbit
+ ldr r6, =0x3F2B1B16
+#if defined(CONFIG_DRAM_336)
+ ldr r6, =0x3B231612
+#endif
+
+ ldr r0, =0x40000000
+ ldr r1, =0x1817191A
+ str r1, [r0]
+ ldr r0, =0x40002000
+ ldr r1, =0x73616532
+ str r1, [r0]
+ ldr r0, =0x40000000
+ ldr r1, =0x1817191A
+ ldr r2, [r0]
+ cmp r1, r2
+ bne check_dram_size_end @ == 512Mbit
+ orr r5, r5, #0x20 @ >= 1Gbit
+ mov r6, r6, lsr #8
+
+check_dram_size:
+ ldr r0, =0x50100000
+ ldr r1, =0x41424344
+ str r1, [r0]
+ ldr r0, =0x48100000
+ ldr r1, =0x25262728
+ str r1, [r0]
+ ldr r0, =0x40100000
+ ldr r1, =0x191A1B1C
+ str r1, [r0]
+ ldr r0, =0x50100000
+ ldr r1, =0x41424344
+ ldr r2, [r0]
+ cmp r2, r1 @ == 4Gbit
+ orreq r5, r5, #0x03
+ moveq r6, r6, lsr #16
+ beq check_dram_size_end
+ ldr r0, =0x48100000
+ ldr r1, =0x25262728
+ ldr r2, [r0]
+ cmp r2, r1 @ == 2Gbit
+ orreq r5, r5, #0x02
+ moveq r6, r6, lsr #8
+ beq check_dram_size_end
+ orr r5, r5, #0x01 @ == 1Gbit
+
+check_dram_size_end:
+ ldr r0, =0x1e6e0004
+ str r5, [r0]
+ ldr r0, =0x1e6e0014
+ ldr r1, [r0]
+ bic r1, r1, #0x000000FF
+ and r6, r6, #0xFF
+ orr r1, r1, r6
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0120 @ VGA Compatible Mode
+ ldr r1, =0x000050C0 @ 408 MHz
+#if defined(CONFIG_DRAM_336)
+ ldr r1, =0x00004DC0
+#endif
+ str r1, [r0]
+
+/******************************************************************************
+ Version Number
+ *****************************************************************************/
+ ldr r0, =0x1e7200a8
+ ldr r1, =0x20141229 @ released date
+ str r1, [r0]
+
+ add r0, r0, #4
+ ldr r1, =0x00000060 @ released SDK version
+ str r1, [r0]
+
+/******************************************************************************
+ Calibration Code End
+ ******************************************************************************/
+
+set_scratch:
+ /*Set Scratch register Bit 6 after ddr initial finished */
+ ldr r0, =0x1e6e2040
+ ldr r1, [r0]
+ orr r1, r1, #0x40
+ str r1, [r0]
+
+/* Debug - UART console message */
+ ldr r0, =0x1e784000
+ mov r1, #0x44 @ 'D'
+ str r1, [r0]
+ mov r1, #0x6F @ 'o'
+ str r1, [r0]
+ mov r1, #0x6E @ 'n'
+ str r1, [r0]
+ mov r1, #0x65 @ 'e'
+ str r1, [r0]
+ mov r1, #0x0D @ '\r'
+ str r1, [r0]
+ mov r1, #0x0A @ '\n'
+ str r1, [r0]
+/* Debug - UART console message */
+
+/******************************************************************************
+ Solve PCIe ASPM issue, only applied to AST2300 series
+ ******************************************************************************/
+ ldr r0, =0x1e6e207c @ Check bounding for AST1150 existence
+ ldr r1, [r0]
+ mov r2, r1, lsr #24
+ cmp r2, #0x01
+ bne platform_exit @ not match AST2300
+ bic r1, r1, #0xFFFFFCFF
+ mov r1, r1, lsr #8
+ cmp r1, #0x02
+ beq platform_exit @ match AST1050
+
+ ldr r0, =0x1e6e2004 @ Disable I2C controller reset
+ ldr r1, [r0]
+ orr r1, r1, #0x04
+ str r1, [r0]
+ bic r1, r1, #0x04
+ str r1, [r0]
+
+ ldr r0, =0x1e78a054 @ Check I2C bus state, if busy then quit
+ ldr r1, [r0]
+ mov r1, r1, lsr #17
+ and r1, r1, #0x03
+ cmp r1, #0x03
+ bne platform_exit
+
+ ldr r0, =0x1e78a040 @ Init I2C1 controller
+ mov r1, #0x01
+ orr r1, r1, r1, lsl #16
+ str r1, [r0]
+
+ ldr r0, =0x1e78a044
+ ldr r1, =0x77776704
+ str r1, [r0]
+
+ mov r1, #0x0
+ ldr r0, =0x1e78a048
+ str r1, [r0]
+ ldr r0, =0x1e78a04c
+ str r1, [r0]
+
+ ldr r0, =0x1e78a050
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e78a200 @ Set AST1150 I2C password
+ ldr r1, =0x00A88FA8
+ str r1, [r0]
+
+ ldr r0, =0x1e78a05c
+ ldr r1, =0x00000200 @ Enable buffer mode transfering 3 bytes
+ str r1, [r0]
+
+ ldr r0, =0x1e78a054
+ ldr r1, =0x00000063 @ Fire commmand
+ str r1, [r0]
+
+ ldr r0, =0x1e78a050
+i2c_wait_cmddone_1:
+ ldr r1, [r0]
+ tst r1, #0x38
+ beq i2c_wait_cmddone_1
+ tst r1, #0x2A @ transmit error
+ bne platform_exit2
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+ ldr r0, =0x1e78a200 @ Disable ASPM capability
+ ldr r1, =0x04005DA8
+ str r1, [r0]
+
+ ldr r0, =0x1e78a204
+ ldr r1, =0x00000024
+ str r1, [r0]
+
+ ldr r0, =0x1e78a05c
+ ldr r1, =0x00000200 @ Enable buffer mode transfering 3 bytes
+ str r1, [r0]
+
+ ldr r0, =0x1e78a054
+ ldr r1, =0x00000063 @ Fire commmand
+ str r1, [r0]
+
+ ldr r0, =0x1e78a050
+i2c_wait_cmddone_2:
+ ldr r1, [r0]
+ tst r1, #0x38
+ beq i2c_wait_cmddone_2
+ tst r1, #0x2A @ transmit error
+ bne platform_exit2
+ ldr r1, =0xFFFFFFFF
+ str r1, [r0]
+
+platform_exit2:
+ ldr r0, =0x1e78a040 @ Disable I2C1 controller
+ mov r1, #0x00
+ str r1, [r0]
+
+ b platform_exit
+.LTORG
+
+platform_exit:
+#ifdef CONFIG_DRAM_ECC
+ ldr r0, =0x1e6e0004
+ ldr r1, [r0]
+ orr r1, r1, #0x80
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0054
+ ldr r1, =0x05000000 /* ECC protected memory size, default set at 80M */
+ str r1, [r0]
+
+ ldr r0, =0x1e6e007C
+ ldr r1, =0x00000000
+ str r1, [r0]
+ ldr r0, =0x1e6e0074
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000221
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r2, =0x00001000
+ECC_Init_Flag:
+ ldr r1, [r0]
+ tst r1, r2 @ D[12] = 1, Done
+ beq ECC_Init_Flag
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x80000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0050
+ ldr r1, =0x00000000
+ str r1, [r0]
+
+ ldr r0, =0x1e6e0070
+ ldr r1, =0x00000400
+ str r1, [r0]
+#endif
+ ldr r0, =0x1e6e2008 @ Set Video ECLK phase
+ ldr r1, [r0]
+ ldr r2, =0xfffffff3
+ and r1, r1, r2
+ orr r1, r1, #0x08
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2004
+ ldr r1, [r0]
+ ldr r2, =0xFFBFFFFF @ Enable JTAG Master, solve ARM stucked by JTAG issue
+ and r1, r1, r2
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2048 @ Set MAC interface delay timing
+ ldr r1, =0x2255
+ str r1, [r0]
+
+ ldr r0, =0x1e6e2070 @ Set MAC AHB bus clock
+ ldr r1, [r0]
+ mov r2, #0x04 @ Default RMII, set MHCLK = HPLL/10
+ tst r1, #0xC0
+ movne r2, #0x02 @ if RGMII, set MHCLK = HPLL/6
+ ldr r0, =0x1e6e2008
+ ldr r1, [r0]
+ bic r1, r1, #0x00070000
+ orr r1, r1, r2, lsl #16
+ str r1, [r0]
+
+/* Test - DRAM initial time */
+ ldr r0, =0x1e782040
+ ldr r1, [r0]
+ ldr r0, =0xFFFFFFFF
+ sub r1, r0, r1
+ ldr r0, =0x1e72009c
+ str r1, [r0]
+ ldr r0, =0x1e7200a4
+ str r1, [r0]
+ ldr r0, =0x1e782030
+ ldr r1, [r0]
+ bic r1, r1, #0x0000F000
+ str r1, [r0]
+/* Test - DRAM initial time */
+
+/******************************************************************************
+ Reset GPIO registers when watchdog reset
+ ******************************************************************************/
+ ldr r0, =0x1e6e207c @ Check Revision ID
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x02
+ bne platform_exit3 @ not match AST2400
+
+ ldr r0, =0x1e6e203c @ Check watchdog reset event
+ ldr r1, [r0]
+ and r1, r1, #0x06
+ cmp r1, #0x0
+ beq platform_exit3 @ no watchdog reset event
+
+ ldr r0, =0x1e6e209c @ Check watchdog GPIO selection
+ ldr r1, [r0]
+ mov r1, r1, lsr #21
+ tst r1, #0x01
+ beq platform_exit3 @ no watchdog reset selection
+
+ ldr r1, =0x00000000 @ clear GPIO register reset by PRST_N
+ ldr r2, =0xFFFFFFFF
+ ldr r0, =0x1e780008
+ str r1, [r0]
+ ldr r0, =0x1e78000c
+ str r1, [r0]
+ ldr r0, =0x1e780010
+ str r1, [r0]
+ ldr r0, =0x1e780014
+ str r1, [r0]
+ ldr r0, =0x1e780018
+ str r2, [r0]
+ ldr r0, =0x1e780028
+ str r1, [r0]
+ ldr r0, =0x1e78002c
+ str r1, [r0]
+ ldr r0, =0x1e780030
+ str r1, [r0]
+ ldr r0, =0x1e780034
+ str r1, [r0]
+ ldr r0, =0x1e780038
+ str r2, [r0]
+ ldr r0, =0x1e780040
+ str r1, [r0]
+ ldr r0, =0x1e780044
+ str r1, [r0]
+ ldr r0, =0x1e780048
+ str r1, [r0]
+ ldr r0, =0x1e78004c
+ str r1, [r0]
+ ldr r0, =0x1e780050
+ str r1, [r0]
+ ldr r0, =0x1e780054
+ str r1, [r0]
+ ldr r0, =0x1e780058
+ str r1, [r0]
+ ldr r0, =0x1e780060
+ str r1, [r0]
+ ldr r0, =0x1e780064
+ str r1, [r0]
+ ldr r0, =0x1e780068
+ str r1, [r0]
+ ldr r0, =0x1e78006c
+ str r1, [r0]
+ ldr r0, =0x1e780090
+ str r1, [r0]
+ ldr r0, =0x1e780094
+ str r1, [r0]
+ ldr r0, =0x1e780098
+ str r1, [r0]
+ ldr r0, =0x1e78009c
+ str r1, [r0]
+ ldr r0, =0x1e7800a0
+ str r1, [r0]
+ ldr r0, =0x1e7800a4
+ str r1, [r0]
+ ldr r0, =0x1e7800a8
+ str r2, [r0]
+ ldr r0, =0x1e7800b0
+ str r1, [r0]
+ ldr r0, =0x1e7800b4
+ str r1, [r0]
+ ldr r0, =0x1e7800b8
+ str r1, [r0]
+ ldr r0, =0x1e7800e0
+ str r1, [r0]
+ ldr r0, =0x1e7800e4
+ str r1, [r0]
+ ldr r0, =0x1e7800e8
+ str r1, [r0]
+ ldr r0, =0x1e7800ec
+ str r1, [r0]
+ ldr r0, =0x1e7800f0
+ str r1, [r0]
+ ldr r0, =0x1e7800f4
+ str r1, [r0]
+ ldr r0, =0x1e7800f8
+ str r2, [r0]
+ ldr r0, =0x1e780100
+ str r1, [r0]
+ ldr r0, =0x1e780104
+ str r1, [r0]
+ ldr r0, =0x1e780108
+ str r1, [r0]
+ ldr r0, =0x1e780110
+ str r1, [r0]
+ ldr r0, =0x1e780114
+ str r1, [r0]
+ ldr r0, =0x1e780118
+ str r1, [r0]
+ ldr r0, =0x1e78011c
+ str r1, [r0]
+ ldr r0, =0x1e780120
+ str r1, [r0]
+ ldr r0, =0x1e780124
+ str r1, [r0]
+ ldr r0, =0x1e780128
+ str r2, [r0]
+ ldr r0, =0x1e780130
+ str r1, [r0]
+ ldr r0, =0x1e780134
+ str r1, [r0]
+ ldr r0, =0x1e780138
+ str r1, [r0]
+ ldr r0, =0x1e780140
+ str r1, [r0]
+ ldr r0, =0x1e780144
+ str r1, [r0]
+ ldr r0, =0x1e780148
+ str r1, [r0]
+ ldr r0, =0x1e78014c
+ str r1, [r0]
+ ldr r0, =0x1e780150
+ str r1, [r0]
+ ldr r0, =0x1e780154
+ str r1, [r0]
+ ldr r0, =0x1e780158
+ str r2, [r0]
+ ldr r0, =0x1e780160
+ str r1, [r0]
+ ldr r0, =0x1e780164
+ str r1, [r0]
+ ldr r0, =0x1e780168
+ str r1, [r0]
+ ldr r0, =0x1e780170
+ str r1, [r0]
+ ldr r0, =0x1e780174
+ str r1, [r0]
+ ldr r0, =0x1e780178
+ str r1, [r0]
+ ldr r0, =0x1e78017c
+ str r1, [r0]
+ ldr r0, =0x1e780180
+ str r1, [r0]
+ ldr r0, =0x1e780184
+ str r1, [r0]
+ ldr r0, =0x1e780188
+ str r2, [r0]
+ ldr r0, =0x1e780190
+ str r1, [r0]
+ ldr r0, =0x1e780194
+ str r1, [r0]
+ ldr r0, =0x1e780198
+ str r1, [r0]
+ ldr r0, =0x1e7801d0
+ str r1, [r0]
+ ldr r0, =0x1e7801d4
+ str r1, [r0]
+
+ ldr r0, =0x1e780204 @ clear SGPIOM register reset by PRST_N
+ str r1, [r0]
+ ldr r0, =0x1e780208
+ str r1, [r0]
+ ldr r0, =0x1e78020c
+ str r1, [r0]
+ ldr r0, =0x1e780210
+ str r1, [r0]
+ ldr r0, =0x1e780214
+ str r2, [r0]
+ ldr r0, =0x1e780220
+ str r1, [r0]
+ ldr r0, =0x1e780224
+ str r1, [r0]
+ ldr r0, =0x1e780228
+ str r1, [r0]
+ ldr r0, =0x1e78022c
+ str r1, [r0]
+ ldr r0, =0x1e780230
+ str r2, [r0]
+ ldr r0, =0x1e78023c
+ str r1, [r0]
+ ldr r0, =0x1e780240
+ str r1, [r0]
+ ldr r0, =0x1e780244
+ str r1, [r0]
+ ldr r0, =0x1e780248
+ str r1, [r0]
+ ldr r0, =0x1e78024c
+ str r2, [r0]
+ ldr r0, =0x1e780254
+ ldr r3, =0x01000040
+ str r3, [r0]
+ ldr r0, =0x1e780258
+ str r1, [r0]
+ ldr r0, =0x1e78025c
+ str r1, [r0]
+ ldr r0, =0x1e780260
+ str r1, [r0]
+
+ ldr r0, =0x1e780300 @ clear SGPIOS register reset by PRST_N
+ str r1, [r0]
+ ldr r0, =0x1e780304
+ str r1, [r0]
+ ldr r0, =0x1e780308
+ str r1, [r0]
+ ldr r0, =0x1e78030c
+ str r1, [r0]
+ ldr r0, =0x1e780310
+ str r1, [r0]
+ ldr r0, =0x1e780314
+ str r1, [r0]
+ ldr r0, =0x1e780318
+ str r2, [r0]
+ ldr r0, =0x1e78031c
+ str r2, [r0]
+ ldr r0, =0x1e780320
+ str r2, [r0]
+
+platform_exit3:
+
+/******************************************************************************
+ SPI Timing Calibration, not applicable to AST2300 series
+ ******************************************************************************/
+ ldr r0, =0x1e6e207c @ Check Revision ID
+ ldr r1, [r0]
+ mov r1, r1, lsr #24
+ cmp r1, #0x02
+ blt platform_exit4 @ not match AST2400 or later
+
+ ldr r0, =0x1e6e2070 @ Check SPI flash
+ ldr r1, [r0]
+ and r1, r1, #0x03
+ cmp r1, #0x02
+ bne platform_exit4
+
+ mov r2, #0x0
+ mov r6, #0x0
+ mov r7, #0x0
+ init_spi_checksum
+spi_checksum_wait_0:
+ ldr r1, [r0]
+ tst r1, r2
+ beq spi_checksum_wait_0
+ ldr r0, =0x1e620090
+ ldr r5, [r0] @ record golden checksum
+ ldr r0, =0x1e620080
+ mov r1, #0x0
+ str r1, [r0]
+
+ ldr r0, =0x1e620010 @ set to fast read mode
+ ldr r1, =0x000B0041
+ str r1, [r0]
+
+ ldr r6, =0x00F7E6D0 @ Init spiclk loop
+ mov r8, #0x0 @ Init delay record
+
+spi_cbr_next_clkrate:
+ mov r6, r6, lsr #0x4
+ cmp r6, #0x0
+ beq spi_cbr_end
+
+ mov r7, #0x0 @ Init delay loop
+ mov r8, r8, lsl #4
+
+spi_cbr_next_delay_s:
+ mov r2, #0x8
+ init_spi_checksum
+spi_checksum_wait_1:
+ ldr r1, [r0]
+ tst r1, r2
+ beq spi_checksum_wait_1
+ ldr r0, =0x1e620090
+ ldr r2, [r0] @ read checksum
+ ldr r0, =0x1e620080
+ mov r1, #0x0
+ str r1, [r0]
+ cmp r2, r5
+ bne spi_cbr_next_delay_e
+
+ mov r2, #0x0
+ init_spi_checksum
+spi_checksum_wait_2:
+ ldr r1, [r0]
+ tst r1, r2
+ beq spi_checksum_wait_2
+ ldr r0, =0x1e620090
+ ldr r2, [r0] @ read checksum
+ ldr r0, =0x1e620080
+ mov r1, #0x0
+ str r1, [r0]
+ cmp r2, r5
+ bne spi_cbr_next_delay_e
+
+ orr r8, r8, r7 @ record passed delay
+ b spi_cbr_next_clkrate
+
+spi_cbr_next_delay_e:
+ add r7, r7, #0x1
+ cmp r7, #0x6
+ blt spi_cbr_next_delay_s
+ b spi_cbr_next_clkrate
+
+spi_cbr_end:
+ ldr r0, =0x1e620094
+ str r8, [r0]
+ ldr r0, =0x1e620010
+ mov r1, #0x0
+ str r1, [r0]
+
+platform_exit4:
+
+ /* restore lr */
+ mov lr, r4
+
+ /* back to arch calling code */
+ mov pc, lr
diff --git a/board/aspeed/ast2400/rc4.c b/board/aspeed/ast2400/rc4.c
new file mode 100755
index 0000000..32e0ffa
--- /dev/null
+++ b/board/aspeed/ast2400/rc4.c
@@ -0,0 +1,68 @@
+/*
+ * 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
+ */
+struct rc4_state
+{
+ int x, y, m[256];
+};
+
+void rc4_setup( struct rc4_state *s, unsigned char *key, int length )
+{
+ int i, j, k, *m, a;
+
+ s->x = 0;
+ s->y = 0;
+ m = s->m;
+
+ for( i = 0; i < 256; i++ )
+ {
+ m[i] = i;
+ }
+
+ j = k = 0;
+
+ for( i = 0; i < 256; i++ )
+ {
+ a = m[i];
+ j = (unsigned char) ( j + a + key[k] );
+ m[i] = m[j]; m[j] = a;
+ if( ++k >= length ) k = 0;
+ }
+}
+
+void rc4_crypt( struct rc4_state *s, unsigned char *data, int length )
+{
+ int i, x, y, *m, a, b;
+
+ x = s->x;
+ y = s->y;
+ m = s->m;
+
+ for( i = 0; i < length; i++ )
+ {
+ x = (unsigned char) ( x + 1 ); a = m[x];
+ y = (unsigned char) ( y + a );
+ m[x] = b = m[y];
+ m[y] = a;
+ data[i] ^= m[(unsigned char) ( a + b )];
+ }
+
+ s->x = x;
+ s->y = y;
+}
+
+void rc4_crypt_sw(unsigned char *data, int ulMsgLength, unsigned char *rc4_key, unsigned long ulKeyLength )
+{
+ struct rc4_state s;
+
+ rc4_setup( &s, rc4_key, ulKeyLength );
+
+ rc4_crypt( &s, data, ulMsgLength );
+}
diff --git a/board/aspeed/ast2400/regtest.c b/board/aspeed/ast2400/regtest.c
new file mode 100755
index 0000000..1cd75ae
--- /dev/null
+++ b/board/aspeed/ast2400/regtest.c
@@ -0,0 +1,91 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if ((CFG_CMD_SLT & CFG_CMD_REGTEST) && defined(CONFIG_SLT))
+#include "regtest.h"
+
+int do_regtest (void)
+{
+ _SOCRegTestInfo *pjSOCRegInfo;
+ _SOCRegTestTbl *pjRegTable;
+ unsigned long ulRegBase;
+ unsigned long ulIndex, ulBack, ulAND, ulMask, ulData, ulTemp;
+ unsigned long Flags = 0;
+
+ /* unlock reg */
+ *(unsigned long *) (0x1e600000) = 0xaeed1a03; /* AHBC */
+ *(unsigned long *) (0x1e6e0000) = 0xfc600309; /* MMC */
+ *(unsigned long *) (0x1e6e2000) = 0x1688a8a8; /* SCU */
+
+ /* SCU */
+
+ /* do test */
+ pjSOCRegInfo = SOCRegTestInfo;
+ while (strcmp(pjSOCRegInfo->jName, "END"))
+ {
+ /* Reg. Test Start */
+ ulRegBase = pjSOCRegInfo->ulRegOffset;
+ pjRegTable = pjSOCRegInfo->pjTblIndex;
+
+ while (pjRegTable->ulIndex != 0xFFFFFFFF)
+ {
+ ulIndex = ulRegBase + pjRegTable->ulIndex;
+
+ ulBack = *(unsigned long *) (ulIndex);
+
+ ulMask = pjRegTable->ulMask;
+ ulAND = ~pjRegTable->ulMask;
+
+ ulData = 0xFFFFFFFF & pjRegTable->ulMask;
+ *(unsigned long *) (ulIndex) = ulData;
+ ulTemp = *(volatile unsigned long *) (ulIndex) & pjRegTable->ulMask;
+ if (ulData != ulTemp)
+ {
+ Flags |= pjSOCRegInfo->ulFlags;
+ printf("[DBG] RegTest: Failed Index:%x, Data:%x, Temp:%x \n", ulIndex, ulData, ulTemp);
+ }
+
+ ulData = 0x00000000 & pjRegTable->ulMask;
+ *(unsigned long *) (ulIndex) = ulData;
+ ulTemp = *(volatile unsigned long *) (ulIndex) & pjRegTable->ulMask;
+ if (ulData != ulTemp)
+ {
+ Flags |= pjSOCRegInfo->ulFlags;
+ printf("[DBG] RegTest: Failed Index:%x, Data:%x, Temp:%x \n", ulIndex, ulData, ulTemp);
+ }
+
+ *(unsigned long *) (ulIndex) = ulBack;
+
+ pjRegTable++;
+
+ } /* Individual Reg. Test */
+
+ if (Flags & pjSOCRegInfo->ulFlags)
+ printf("[INFO] RegTest: %s Failed \n", pjSOCRegInfo->jName);
+
+ pjSOCRegInfo++;
+
+ } /* Reg. Test */
+
+ return Flags;
+
+}
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2400/regtest.h b/board/aspeed/ast2400/regtest.h
new file mode 100755
index 0000000..49a360e
--- /dev/null
+++ b/board/aspeed/ast2400/regtest.h
@@ -0,0 +1,255 @@
+/*
+ * 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
+ */
+typedef struct {
+ unsigned long ulIndex;
+ unsigned long ulMask;
+} _SOCRegTestTbl;
+
+typedef struct {
+ unsigned char jName[10];
+ unsigned long ulRegOffset;
+ _SOCRegTestTbl *pjTblIndex;
+ unsigned long ulFlags;
+} _SOCRegTestInfo;
+
+_SOCRegTestTbl SMCRegTestTbl[] = {
+ {0x00000000, 0x00001FF3},
+ {0x00000004, 0xFFFFFFFF},
+ {0x00000008, 0x0FFF17FF},
+ {0x0000000C, 0xFFFFFFFF},
+ {0x00000010, 0xFF5FFFF3},
+ {0x00000018, 0x0FFFFFFF},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl AHBCRegTestTbl[] = {
+ {0x00000080, 0x0000FFFE},
+ {0x00000088, 0x01000000},
+ {0x0000008c, 0x00000031},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MICRegTestTbl[] = {
+/*
+ {0x00000000, 0x0FFFFFF8},
+ {0x00000004, 0x0FFFFFF8},
+ {0x00000008, 0x0000FFFF},
+ {0x0000000C, 0x0FFFF000},
+ {0x00000010, 0xFFFFFFFF},
+*/
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MAC1RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MAC2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl USB2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VICRegTestTbl[] = {
+ {0x0000000C, 0xFFFFFFFF},
+ {0x00000024, 0xFFFFFFFF},
+ {0x00000028, 0xFFFFFFFF},
+ {0x0000002C, 0xFFFFFFFF},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MMCRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl USB11RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl SCURegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl HASERegTestTbl[] = {
+ {0x00000000, 0x0FFFFFF8},
+ {0x00000004, 0x0FFFFFF8},
+ {0x00000008, 0x0FFFFFF8},
+ {0x0000000C, 0x0FFFFFF8},
+ //{0x00000010, 0x00001FFF},
+ {0x00000020, 0x0FFFFFF8},
+ {0x00000024, 0x0FFFFFF8},
+ {0x00000028, 0x0FFFFFc0},
+ {0x0000002C, 0x0FFFFFFF},
+ //{0x00000030, 0x000003FF},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl I2SRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl CRTRegTestTbl[] = {
+/*
+ {0x00000000, 0x001F3703},
+ {0x00000004, 0x0000FFC1},
+*/
+ {0x00000010, 0x0FFF0FFF},
+ {0x00000014, 0x0FFF0FFF},
+ {0x00000018, 0x07FF07FF},
+ {0x0000001C, 0x07FF07FF},
+ {0x00000020, 0x0FFFFFF8},
+ {0x00000024, 0x07FF3FF8},
+/*
+ {0x00000028, 0x003F003F},
+ {0x00000030, 0x003F003F},
+ {0x00000034, 0x0FFF0FFF},
+ {0x00000038, 0x0FFFFFF8},
+*/
+ {0x00000040, 0x0FFF0FFF},
+ {0x00000044, 0x07FF07FF},
+ {0x00000048, 0x0FFFFFF8},
+ {0x0000004C, 0x00FF07F8},
+ {0x00000050, 0x000F0F0F},
+/*
+ {0x00000060, 0x001F3703},
+ {0x00000064, 0x0000FFC1},
+*/
+ {0x00000070, 0x0FFF0FFF},
+ {0x00000074, 0x0FFF0FFF},
+ {0x00000078, 0x07FF07FF},
+ {0x0000007C, 0x07FF07FF},
+ {0x00000080, 0x0FFFFFF8},
+ {0x00000084, 0x07FF3FF8},
+/*
+ {0x00000088, 0x003F003F},
+ {0x00000090, 0x003F003F},
+ {0x00000094, 0x0FFF0FFF},
+ {0x00000098, 0x0FFFFFF8},
+*/
+ {0x000000A0, 0x0FFF0FFF},
+ {0x000000A4, 0x07FF07FF},
+ {0x000000A8, 0x0FFFFFF8},
+ {0x000000AC, 0x00FF07F8},
+ {0x000000B0, 0x000F0F0F},
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VIDEORegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl A2PRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl MDMARegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl M2DRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl GPIORegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl RTCRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl TIMERRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl UART1RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl UART2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl WDTRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PWMRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VUART1RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl VUART2RegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl LPCRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl I2CRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PECIRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PCIARegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+_SOCRegTestTbl PCIRegTestTbl[] = {
+ {0xFFFFFFFF, 0xFFFFFFFF},
+};
+
+
+/* Test List */
+_SOCRegTestInfo SOCRegTestInfo[] = {
+ /* Test Name, Reg. Offset, Test Table, Error Code */
+ { "SMCREG", 0x16000000, SMCRegTestTbl, 0x00000001},
+ { "AHBCREG", 0x1e600000, AHBCRegTestTbl, 0x00000002},
+ { "MICREG", 0x1e640000, MICRegTestTbl, 0x00000004},
+ { "MAC1REG", 0x1e660000, MAC1RegTestTbl, 0x00000008},
+ { "MAC2REG", 0x1e680000, MAC2RegTestTbl, 0x00000010},
+ { "USB2REG", 0x1e6a0000, USB2RegTestTbl, 0x00000020},
+ { "VICREG", 0x1e6c0000, VICRegTestTbl, 0x00000040},
+ { "MMCREG", 0x1e6e0000, MMCRegTestTbl, 0x00000080},
+ { "USB11REG", 0x1e6e1000, USB11RegTestTbl, 0x00000100},
+ { "SCUREG", 0x1e6e2000, SCURegTestTbl, 0x00000200},
+ { "HASEREG", 0x1e6e3000, HASERegTestTbl, 0x00000400},
+ { "I2SREG", 0x1e6e5000, I2SRegTestTbl, 0x00000800},
+ { "CRTREG", 0x1e6e6000, CRTRegTestTbl, 0x00001000},
+ { "VIDEOREG", 0x1e700000, VIDEORegTestTbl, 0x00002000},
+ { "A2PREG", 0x1e720000, A2PRegTestTbl, 0x00004000},
+ { "MDMAREG", 0x1e740000, MDMARegTestTbl, 0x00008000},
+ { "2DREG", 0x1e760000, M2DRegTestTbl, 0x00010000},
+ { "GPIOREG", 0x1e780000, GPIORegTestTbl, 0x00020000},
+ { "RTCREG", 0x1e781000, RTCRegTestTbl, 0x00040000},
+ { "TIMERREG", 0x1e782000, TIMERRegTestTbl, 0x00080000},
+ { "UART1REG", 0x1e783000, UART1RegTestTbl, 0x00100000},
+ { "UART2REG", 0x1e784000, UART2RegTestTbl, 0x00200000},
+ { "WDTREG", 0x1e785000, WDTRegTestTbl, 0x00400000},
+ { "PWMREG", 0x1e786000, PWMRegTestTbl, 0x00800000},
+ {"VUART1REG", 0x1e787000, VUART1RegTestTbl, 0x01000000},
+ {"VUART2REG", 0x1e788000, VUART2RegTestTbl, 0x02000000},
+ { "LPCREG", 0x1e789000, LPCRegTestTbl, 0x04000000},
+ { "I2CREG", 0x1e78A000, I2CRegTestTbl, 0x08000000},
+ { "PECIREG", 0x1e78B000, PECIRegTestTbl, 0x10000000},
+ { "PCIAREG", 0x1e78C000, PCIARegTestTbl, 0x20000000},
+ { "PCIREG", 0x60000000, PCIRegTestTbl, 0x40000000},
+ { "END", 0xffffffff, NULL, 0xffffffff}
+};
diff --git a/board/aspeed/ast2400/slt.c b/board/aspeed/ast2400/slt.c
new file mode 100755
index 0000000..3283d34
--- /dev/null
+++ b/board/aspeed/ast2400/slt.c
@@ -0,0 +1,105 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <post.h>
+#include "slt.h"
+
+#if defined (CONFIG_SLT)
+
+int do_slt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ int flags = 0;
+ int loop = 1;
+
+ if (argc > 1) {
+ loop = simple_strtoul(argv[1], NULL, 10);
+ }
+
+ do {
+
+do_slt_start:
+ /* Reg. Test */
+#if (CFG_CMD_SLT & CFG_CMD_REGTEST)
+ if (do_regtest())
+ {
+ flags |= FLAG_REGTEST_FAIL;
+ printf("[INFO] RegTest Failed \n");
+ }
+ else
+ printf("[INFO] RegTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_MACTEST)
+ if (do_mactest())
+ {
+ flags |= FLAG_MACTEST_FAIL;
+ printf("[INFO] MACTest Failed \n");
+ }
+ else
+ printf("[INFO] MACTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_VIDEOTEST)
+ if (do_videotest())
+ {
+ flags |= FLAG_VIDEOTEST_FAIL;
+ printf("[INFO] VideoTest Failed \n");
+ }
+ else
+ printf("[INFO] VideoTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_HACTEST)
+ if (do_hactest())
+ {
+ flags |= FLAG_HACTEST_FAIL;
+ printf("[INFO] HACTest Failed \n");
+ }
+ else
+ printf("[INFO] HACTest Passed \n");
+#endif
+#if (CFG_CMD_SLT & CFG_CMD_MICTEST)
+ if (do_mictest())
+ {
+ flags |= FLAG_MICTEST_FAIL;
+ printf("[INFO] MICTest Failed \n");
+ }
+ else
+ printf("[INFO] MICTest Passed \n");
+#endif
+
+ /* Summary */
+ if (flags)
+ printf ("[INFO] SLT Test Failed!! \n");
+ else
+ printf ("[INFO] SLT Test Passed!! \n");
+
+ if (loop == 0) /* infinite */
+ goto do_slt_start;
+ else
+ loop--;
+
+ } while (loop);
+
+ return 0;
+}
+/***************************************************/
+
+U_BOOT_CMD(
+ slt, CONFIG_SYS_MAXARGS, 0, do_slt,
+ "slt - slt test program \n",
+ NULL
+);
+
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2400/slt.h b/board/aspeed/ast2400/slt.h
new file mode 100755
index 0000000..4e650bc
--- /dev/null
+++ b/board/aspeed/ast2400/slt.h
@@ -0,0 +1,29 @@
+/*
+ * 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
+ */
+#define CFG_CMD_REGTEST 0x00000001
+#define CFG_CMD_MACTEST 0x00000002
+#define CFG_CMD_VIDEOTEST 0x00000004
+#define CFG_CMD_HACTEST 0x00000008
+#define CFG_CMD_MICTEST 0x00000010
+#define CFG_CMD_OSDTEST 0x00000020
+#define CFG_CMD_2DTEST 0x00000040
+#define CFG_CMD_HWCTEST 0x00000080
+
+#define FLAG_REGTEST_FAIL 0x00000001
+#define FLAG_MACTEST_FAIL 0x00000002
+#define FLAG_VIDEOTEST_FAIL 0x00000004
+#define FLAG_HACTEST_FAIL 0x00000008
+#define FLAG_MICTEST_FAIL 0x00000010
+#define FLAG_OSDTEST_FAIL 0x00000020
+#define FLAG_2DTEST_FAIL 0x00000040
+#define FLAG_HWCTEST_FAIL 0x00000080
+
+
diff --git a/board/aspeed/ast2400/type.h b/board/aspeed/ast2400/type.h
new file mode 100755
index 0000000..f57ee5a
--- /dev/null
+++ b/board/aspeed/ast2400/type.h
@@ -0,0 +1,116 @@
+/*
+ * 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
+ */
+#ifndef _TYPE_H_
+#define _TYPE_H_
+
+ typedef unsigned char BOOL;
+ typedef unsigned char UINT8;
+ typedef unsigned short UINT16;
+ typedef unsigned int UINT32;
+
+ #define FLONG unsigned long
+ #define BYTE unsigned char
+ #define INT int
+ #define VOID void
+ #define BOOLEAN unsigned short
+ #define ULONG unsigned long
+ #define USHORT unsigned short
+ #define UCHAR unsigned char
+ #define CHAR char
+ #define LONG long
+ #define PUCHAR UCHAR *
+ #define PULONG ULONG *
+
+ #define FAIL 1
+
+ #define intfunc int386
+
+ #define outdwport outpd
+ #define indwport inpd
+ #define outport outp
+ #define inport inp
+
+ //#define NULL ((void *)0)
+ #define FALSE 0
+ #define TRUE 1
+
+ #define ReadMemoryBYTE(baseaddress,offset) *(BYTE *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define ReadMemoryLong(baseaddress,offset) *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define ReadMemoryShort(baseaddress,offset) *(USHORT *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define WriteMemoryBYTE(baseaddress,offset,data) *(BYTE *)((ULONG)(baseaddress)+(ULONG)(offset)) = (BYTE)(data)
+ #define WriteMemoryLong(baseaddress,offset,data) *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))=(ULONG)(data)
+ #define WriteMemoryShort(baseaddress,offset,data) *(USHORT *)((ULONG)(baseaddress)+(ULONG)(offset))=(USHORT)(data)
+ #define WriteMemoryLongWithANDData(baseaddress, offset, anddata, data) *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = *(ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) & (ULONG)(anddata) | (ULONG)(data)
+
+ #define WriteMemoryLongWithMASK(baseaddress, offset, data, mask) \
+ *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = *(volatile ULONG *)(((ULONG)(baseaddress)+(ULONG)(offset)) & (ULONG)(~(mask))) | ((ULONG)(data) & (ULONG)(mask))
+
+ #define ReadMemoryLongHost(baseaddress,offset) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define WriteMemoryLongHost(baseaddress,offset,data) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))=(ULONG)(data)
+ #define WriteMemoryBYTEHost(baseaddress,offset,data) *(volatile BYTE *)((ULONG)(baseaddress)+(ULONG)(offset)) = (BYTE)(data)
+#define WriteMemoryLongWithMASKHost(baseaddress, offset, data, mask) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = (((*(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)))&(~mask)) | (ULONG)((data)&(mask)))
+
+ #define ReadMemoryLongClient(baseaddress,offset) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))
+ #define WriteMemoryLongClient(baseaddress,offset,data) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset))=(ULONG)(data)
+ #define WriteMemoryBYTEClient(baseaddress,offset,data) *(volatile BYTE *)((ULONG)(baseaddress)+(ULONG)(offset)) = (BYTE)(data)
+#define WriteMemoryLongWithMASKClient(baseaddress, offset, data, mask) *(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)) = (((*(volatile ULONG *)((ULONG)(baseaddress)+(ULONG)(offset)))&(~mask)) | (ULONG)((data)&(mask)))
+
+#ifdef BUF_GLOBALS
+#define BUF_EXT
+#else
+#define BUF_EXT extern
+#endif
+
+BUF_EXT ULONG g_CAPTURE_VIDEO1_BUF1_ADDR; /* VIDEO1_BUF_1_ADDR*/
+BUF_EXT ULONG g_CAPTURE_VIDEO1_BUF2_ADDR; /* VIDEO1_BUF_2_ADDR*/
+BUF_EXT ULONG g_VIDEO1_COMPRESS_BUF_ADDR; /* Encode destination address */
+BUF_EXT ULONG g_VIDEO1_CRC_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO1_FLAG_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO1_RC4_BUF_ADDR;
+
+
+BUF_EXT ULONG g_CAPTURE_VIDEO2_BUF1_ADDR;
+BUF_EXT ULONG g_CAPTURE_VIDEO2_BUF2_ADDR;
+BUF_EXT ULONG g_VIDEO2_COMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_CRC_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_FLAG_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_VIDEO1_DECODE_BUF_1_ADDR;
+BUF_EXT ULONG g_VIDEO1_DECODE_BUF_2_ADDR;
+BUF_EXT ULONG g_VIDEO1_DECOMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO1_DECODE_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_VIDEO2_DECODE_BUF_1_ADDR;
+BUF_EXT ULONG g_VIDEO2_DECODE_BUF_2_ADDR;
+BUF_EXT ULONG g_VIDEO2_DECOMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEO2_DECODE_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_CAPTURE_VIDEOM_BUF1_ADDR;
+BUF_EXT ULONG g_CAPTURE_VIDEOM_BUF2_ADDR;
+BUF_EXT ULONG g_VIDEOM_COMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEOM_FLAG_BUF_ADDR;
+BUF_EXT ULONG g_VIDEOM_RC4_BUF_ADDR;
+
+BUF_EXT ULONG g_VIDEOM_DECODE_BUF_1_ADDR;
+BUF_EXT ULONG g_VIDEOM_DECODE_BUF_2_ADDR;
+BUF_EXT ULONG g_VIDEOM_DECOMPRESS_BUF_ADDR;
+BUF_EXT ULONG g_VIDEOM_DECODE_RC4_BUF_ADDR;
+
+#ifdef WIN_GLOBALS
+#define WIN_EXT
+#else
+#define WIN_EXT extern
+#endif
+
+WIN_EXT USHORT g_DefWidth, g_DefHeight;
+
+#endif
diff --git a/board/aspeed/ast2400/u-boot.lds b/board/aspeed/ast2400/u-boot.lds
new file mode 100755
index 0000000..ff0fe22
--- /dev/null
+++ b/board/aspeed/ast2400/u-boot.lds
@@ -0,0 +1,56 @@
+/*
+ * (C) Copyright 2004
+ * Wolfgang Denk, DENX Software Engineering, <wg@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+ . = 0x00000000;
+
+ . = ALIGN(4);
+ .text :
+ {
+ cpu/arm926ejs/start.o (.text)
+ *(.text)
+ }
+
+ . = ALIGN(4);
+ .rodata : { *(.rodata) }
+
+ . = ALIGN(4);
+ .data : { *(.data) }
+
+ . = ALIGN(4);
+ .got : { *(.got) }
+
+ __u_boot_cmd_start = .;
+ .u_boot_cmd : { *(.u_boot_cmd) }
+ __u_boot_cmd_end = .;
+
+ . = ALIGN(4);
+ __bss_start = .;
+ .bss : { *(.bss) }
+ _end = .;
+}
diff --git a/board/aspeed/ast2400/vdef.h b/board/aspeed/ast2400/vdef.h
new file mode 100755
index 0000000..3c99b7e
--- /dev/null
+++ b/board/aspeed/ast2400/vdef.h
@@ -0,0 +1,500 @@
+/*
+ * 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
+ */
+#ifndef _VDEF_H_
+#define _VDEF_H_
+
+#define VIDEO1 0
+#define VIDEO1_ON 0x01
+#define VIDEO2 1
+#define VIDEO2_ON 0x02
+
+#define VIDEOM_ON 0x04
+#define VIDEOM 2
+
+#define CRT_1 0
+#define CRT_1_ON 0x01
+#define CRT_2 1
+#define CRT_2_ON 0x02
+
+#define SINGLE_CODEC_SINGLE_CAPTURE 0
+#define AUTO_CODEC_SINGLE_CAPTURE 2
+#define AUTO_CODEC_AUTO_CAPTURE 3
+
+#define MAC1_BASE 0x1E660000
+#define APB_BRIDGE_1_BASE 0x1E6E0000
+#define VIDEO_REG_BASE 0x1E700000
+#define APB_BRIDGE_2_BASE 0x1E780000
+
+#define DRAM_INIT_BASE 0x1E6E0000
+
+#define SDRAM_PROTECT_REG 0x00
+ #define SDRAM_WRITE_DISABLE 0
+ #define SDRAM_WRITE_ENABLE 1
+
+#define SCU_BASE 0x1E6E0000
+#define SCU_OFFSET 0x2000
+
+#define VIC_BASE 0x1E6C0000
+ #define VIDEO_INT_BIT 7
+
+#define IRQ_STATUS_REG 0x00
+#define RAW_INT_STATUS_REG 0x08
+#define INT_SEL_REG 0x0C
+ #define FIQ_INT 1
+ #define IRQ_INT 0
+#define INT_EN_REG 0x10
+#define INT_EN_CLEAR_REG 0x14
+#define INT_SOFT_REG 0x18
+#define INT_SOFT_CLEAR_REG 0x1C
+#define INT_SENSE_REG 0x24
+ #define LEVEL_SENSE 1
+ #define EDGE_SENSE 0
+#define INT_EVENT_REG 0x2C
+ #define HIGH_LEVEL_SENSE 1
+ #define LOW_LEVEL_SENSE 0
+
+#define SCU_HW_TRAPPING_REG 0x70 + SCU_OFFSET
+ #define CLIENT_MODE_EN_BIT 18
+ #define CLIENT_MODE_EN_MASK 0x00040000
+ #define BE_HOST_CHIP 0
+ #define BE_CLIENT_CHIP 1
+
+#define SCU_ULOCK_KEY 0x1688A8A8
+
+#define SCU_PROTECT_REG 0x00 + SCU_OFFSET
+ #define SCU_WRITE_DISABLE 0
+ #define SCU_WRITE_ENABLE 1
+
+#define SCU_CONTROL_REG 0x04 + SCU_OFFSET
+ #define VIDEO_ENGINE_RESET 0x00000040
+ #define VIDEO_ENGINE_RESET_BIT 6
+ #define VIDEO_ENGINE_RESET_MASK 0x00000040
+ #define VIDEO_RESET_EN 1
+ #define VIDEO_RESET_OFF 0
+
+#define SCU_CLOCK_SELECTION_REG 0x08 + SCU_OFFSET
+ #define PORTA_CLOCK_DELAY_MASK 7 << 8 //Video port A output clcok selection
+ #define PORTA_CLOCK_INV_DELAY_1NS 5 << 8 //Clock inversed and delay ~ 2ns
+ #define PORTA_CLOCK_INV_DELAY_2NS 6 << 8 //Clock inversed and delay ~ 3ns
+ #define PORTB_CLOCK_DELAY_MASK 7 << 12 //Video port B output clock delay
+ #define PORTB_CLOCK_INV_DELAY_1NS 5 << 12 //Clock inversed and delay ~ 3ns
+ #define PORTB_CLOCK_INV_DELAY_2NS 6 << 12 //Clock inversed and delay ~ 3ns
+ #define PORTB_CLOCK_SEL 1 << 15 //Video port B clock selection
+ #define PORTB_FROM_D1CLK 0 << 15
+ #define PORTB_FROM_D2CLK 1 << 15
+ #define ECLK_CLK_SEL_MASK (3 << 2)
+ #define ECLK_FROM_HPLL (1 << 2)
+
+ #define D2CLK_CLOCK_SELECTION 0x00020000
+ #define D2CLK_CLOCK_SELECTION_BIT 17
+ #define D2CLK_CLOCK_SELECTION_MASK 0x00060000
+ #define NORMAL_CRT1 0
+ #define V1CLK_VIDEO1 2
+ #define V1CLK_VIDEO2 3
+
+#define SCU_CLOCK_STOP_REG 0x0C + SCU_OFFSET
+ #define EN_ECLK 0 << 0 //Enable ECLK (For Video Engine)
+ #define STOP_ECLK_BIT 0
+ #define STOP_ECLK_MASK 1 << 0
+ #define EN_V1CLK 0 << 3 //Enable V1CLK (For Video Capture #1)
+ #define STOP_V1CLK_BIT 3
+ #define STOP_V1CLK_MASK 1 << 3
+ #define EN_D1CLK 0 << 10 //Enable D1CLK (For CRT1)
+ #define STOP_D1CLK_BIT 10
+ #define STOP_D1CLK_MASK 1 << 10
+ #define EN_D2CLK 0 << 11 //Stop D2CLK (For CRT2)
+ #define STOP_D2CLK (1 << 11)
+ #define STOP_D2CLK_BIT 11
+ #define STOP_D2CLK_MASK 1 << 11
+ #define EN_V2CLK 0 << 12 //Stop V2CLK (For Video Capture #2)
+ #define STOP_V2CLK_BIT 12
+ #define STOP_V2CLK_MASK 1 << 12
+ #define STOP_HACE_BIT 13
+ #define EN_HACE (0 << 13)
+ #define STOP_HACE_MASK (1 << 13)
+ #define EN_I2SCLK 0 << 18
+ #define STOP_I2SCLK_MASK 1 << 18
+
+#define SCU_PIN_CTRL1_REG 0x74 + SCU_OFFSET
+ #define I2C_5_PIN_EN 1 << 12 //Enable I2C #5 PIN
+ #define I2C_5_PIN_OFF 0 << 12 //Disable I2C #5 PIN
+ #define I2C_5_PIN_MASK 1 << 12
+ #define VGA_PIN_OFF 0 << 15 //Enable VGA pins
+ #define VGA_PIN_MASK 1 << 15
+ #define VIDEO_PORTA_EN 1 << 16 //Enable Video port A control pins
+ #define VIDEO_PORTA_MASK 1 << 16
+ #define VIDEO_PORTB_EN 1 << 17 //Enable Video port B control pins
+ #define VIDEO_PORTB_MASK 1 << 17
+ #define VIDEO_VP1_EN 1 << 22 //Enable VP[11:0]
+ #define VIDEO_VP1_MASK 1 << 22
+ #define VIDEO_VP2_EN 1 << 23 //Enable VP[23:12]
+ #define VIDEO_VP2_MASK 1 << 23
+ #define I2S_PIN_EN 1 << 29 //Enable I2S function pins
+ #define I2S_PIN_MASK 1 << 29
+
+#define SCU_PIN_CTRL2_REG 0x78 + SCU_OFFSET
+ #define VIDEO_PORTA_SINGLE_EDGE_MASK 1 << 0
+ #define VIDEO_PORTA_SINGLE_EDGE 1 << 0 //Enable Video port A single mode
+ #define VIDEO_PORTA_DUAL_EDGE 0 << 0
+ #define VIDEO_PORTB_SINGLE_EDGE_MASK 1 << 1
+ #define VIDEO_PORTB_DUAL_EDGE 0 << 1
+ #define VIDEO_PORTB_SINGLE_EDGE 1 << 1 //Enable Video port B single mode
+
+#define SCU_M_PLL_PARAM_REG 0x20 + SCU_OFFSET
+
+#define DRAM_BASE 0x40000000
+
+#define INPUT_BITCOUNT_YUV444 4
+#define INPUT_BITCOUNT_YUV420 2
+
+/* HW comment value */
+//PASSWORD
+#define VIDEO_UNLOCK_KEY 0x1A038AA8
+#define SCU_UNLOCK_KEY 0x1688A8A8
+#define SDRAM_UNLOCK_KEY 0xFC600309
+
+
+//#define SAMPLE_RATE 12000000.0
+#ifdef OSC_NEW
+ #define SAMPLE_RATE 24576000.0
+#else
+ #define SAMPLE_RATE 24000000.0
+#endif
+
+#define MODEDETECTION_VERTICAL_STABLE_MAXIMUM 0x4
+#define MODEDETECTION_HORIZONTAL_STABLE_MAXIMUM 0x4
+#define MODEDETECTION_VERTICAL_STABLE_THRESHOLD 0x4
+#define MODEDETECTION_HORIZONTAL_STABLE_THRESHOLD 0x8
+
+#define MODEDETECTION_EDGE_PIXEL_THRES_DIGITAL 2
+#define MODEDETECTION_EDGE_PIXEL_THRES_ANALOGE 0x0A
+
+#define MODEDETECTION_OK 0
+#define MODEDETECTION_ERROR 1
+#define JUDGE_MODE_ERROR 2
+
+//I2C Loop Count
+#define LOOP_COUNT 1000
+#define CAN_NOT_FIND_DEVICE 1
+#define SET_I2C_DONE 0
+#define I2C_BASE 0xA000
+#define AC_TIMING 0x77743355
+
+//I2C channel and Devices
+#define I2C_VIDEO1_EEPROM 0x2
+#define I2C_VIDEO2_EEPROM 0x5
+#define I2C_VIDEO2_9883 0x4
+/*
+ULONG CAPTURE1_ADDRESS = 0x1000000;
+ULONG CAPTURE2_ADDRESS = 0x3000000;
+ULONG PASS1_ENCODE_SOURCE_ADDRESS = 0x1000000;
+ULONG PASS1_ENCODE_DESTINATION_ADDRESS = 0x2000000;
+ULONG Buffer1_DECODE_SOURCE_ADDRESS = 0x1000000;
+ULONG Buffer2_DECODE_SOURCE_ADDRESS = 0x1400000;
+ULONG PASS1_DECODE_DESTINATION_ADDRESS = 0x600000;
+ULONG CAPTURE_2ND_ADDRESS = 0x1800000;
+ULONG PASS1_2ND_ENCODE_SOURCE_ADDRESS = 0x1800000;
+ULONG PASS1_2ND_ENCODE_DESTINATION_ADDRESS = 0x2800000;
+ULONG PASS1_2ND_DECODE_SOURCE_ADDRESS = 0x1000000;
+ULONG PASS1_2ND_DECODE_DESTINATION_ADDRESS = 0x600000;
+ULONG PASS2_ENCODE_SOURCE_ADDRESS = 0x000000;
+ULONG PASS2_ENCODE_DESTINATION_ADDRESS = 0xC00000;
+ULONG PASS2_DECODE_SOURCE_ADDRESS = 0xC00000;
+ULONG PASS2_DECODE_DESTINATION_ADDRESS = 0x600000;
+ULNG PASS2_DECODE_REFERENCE_ADDRESS = 0x600000;
+*/
+
+typedef struct _CTL_REG_G {
+ ULONG CompressMode:1;
+ ULONG SkipEmptyFrame:1;
+ ULONG MemBurstLen:2;
+ ULONG LineBufEn:2;
+ ULONG Unused:26;
+} CTL_REG_G;
+
+
+typedef union _U_CTL_G {
+ ULONG Value;
+ CTL_REG_G CtlReg;
+} U_CTL_G;
+
+typedef struct _MODE_DETECTION_PARAM_REG {
+ ULONG Unused1:8;
+ ULONG EdgePixelThres:8;
+ ULONG VerStableMax:4;
+ ULONG HorStableMax:4;
+ ULONG VerDiffMax:4;
+ ULONG HorDiffMax:4;
+} MODE_DETECTION_PARAM_REG;
+
+typedef struct _CRC_PRI_PARAM_REG {
+ ULONG Enable:1;
+ ULONG HighBitOnly:1;
+ ULONG SkipCountMax:6;
+ ULONG PolyLow:8;
+ ULONG PolyHigh:16;
+} CRC_PRI_PARAM_REG;
+
+typedef union _U_CRC_PRI_PARAM {
+ ULONG Value;
+ CRC_PRI_PARAM_REG CRCPriParam;
+} U_CRC_PRI_PARAM;
+
+typedef struct _CRC_SEC_PARAM_REG {
+ ULONG Unused1:8;
+ ULONG PolyLow:8;
+ ULONG PolyHigh:16;
+} CRC_SEC_PARAM_REG;
+
+typedef union _U_CRC_SEC_PARAM {
+ ULONG Value;
+ CRC_SEC_PARAM_REG CRCSecParam;
+} U_CRC_SEC_PARAM;
+
+typedef struct _GENERAL_INFO {
+ BYTE EnableVideoM;
+ BYTE CenterMode;
+ BYTE RC4NoResetFrame;
+ BYTE RC4TestMode;
+ U_CTL_G uCtlReg;
+ U_CRC_PRI_PARAM uCRCPriParam;
+ U_CRC_SEC_PARAM uCRCSecParam;
+} GENERAL_INFO, *PGENERAL_INFO;
+
+typedef struct _SEQ_CTL_REG {
+ ULONG Unused1:1;
+ ULONG Unused2:1;
+ ULONG Unused3:1;
+ ULONG CaptureAutoMode:1;
+ ULONG Unused4:1;
+ ULONG CodecAutoMode:1;
+ ULONG Unused5:1;
+ ULONG WatchDog:1;
+ ULONG CRTSel:1;
+ ULONG AntiTearing:1;
+ ULONG DataType:2;
+ ULONG Unused6:20;
+} SEQ_CTL_REG;
+
+typedef union _U_SEQ_CTL {
+ ULONG Value;
+ SEQ_CTL_REG SeqCtlReg;
+} U_SEQ_CTL;
+
+typedef struct _CTL_REG {
+ ULONG SrcHsync:1;
+ ULONG SrcVsync:1;
+ ULONG ExtSrc:1;
+ ULONG AnalongExtSrc:1;
+ ULONG IntTimingGen:1;
+ ULONG IntDataFrom:1;
+ ULONG WriteFmt:2;
+ ULONG VGACursor:1;
+ ULONG LinearMode:1;
+ ULONG ClockDelay:2;
+ ULONG CCIR656Src:1;
+ ULONG PortClock:1;
+ ULONG ExtPort:1;
+ ULONG Unused1:1;
+ ULONG FrameRate:8;
+ ULONG Unused2:8;
+} CTL_REG;
+
+typedef union _U_CTL {
+ ULONG Value;
+ CTL_REG CtlReg;
+} U_CTL_REG;
+
+typedef struct _TIMING_GEN_SETTING_H {
+ ULONG HDEEnd:13;
+ ULONG Unused1:3;
+ ULONG HDEStart:13;
+ ULONG Unused2:3;
+} TIMING_GEN_SETTING_H;
+
+typedef struct _TIMING_GEN_SETTING_V {
+ ULONG VDEEnd:13;
+ ULONG Unused1:3;
+ ULONG VDEStart:13;
+ ULONG Unused2:3;
+} TIMING_GEN_SETTING_V;
+
+typedef struct _BCD_CTL_REG {
+ ULONG Enable:1;
+ ULONG Unused1:15;
+ ULONG Tolerance:8;
+ ULONG Unused2:8;
+} BCD_CTL_REG;
+
+typedef union _U_BCD_CTL {
+ ULONG Value;
+ BCD_CTL_REG BCDCtlReg;
+} U_BCD_CTL;
+
+typedef struct _COMPRESS_WINDOW_REG {
+ ULONG VerLine:13;
+ ULONG Unused1:3;
+ ULONG HorPixel:13;
+ ULONG Unused2:3;
+} COMPRESS_WINDOW_REG;
+
+typedef struct _STREAM_BUF_SIZE {
+ ULONG PacketSize:3;
+ ULONG RingBufNum:2;
+ ULONG Unused1:11;
+ ULONG SkipHighMBThres:7;
+ ULONG SkipTestMode:2;
+ ULONG Unused2:7;
+} STREAM_BUF_SIZE;
+
+typedef union _U_STREAM_BUF {
+ ULONG Value;
+ STREAM_BUF_SIZE StreamBufSize;
+} U_STREAM_BUF;
+
+
+typedef struct _COMPRESS_CTL_REG {
+ ULONG JPEGOnly:1; /* True: Jpeg Only mode(Disable VQ), False:Jpeg and VQ mix mode */
+ ULONG En4VQ:1; /* True: 1, 2, 4 color mode, False: 1,2 color mode */
+ ULONG CodecMode:1; /* High and best Quantization encoding/decoding setting*/
+ ULONG DualQuality:1;
+ ULONG EnBest:1;
+ ULONG EnRC4:1;
+ ULONG NorChromaDCTTable:5;
+ ULONG NorLumaDCTTable:5;
+ ULONG EnHigh:1;
+ ULONG TestCtl:2;
+ ULONG UVFmt:1;
+ ULONG HufTable:2;
+ ULONG AlterValue1:5;
+ ULONG AlterValue2:5;
+} COMPRESS_CTL_REG;
+
+typedef union _U_COMPRESS_CTL {
+ ULONG Value;
+ COMPRESS_CTL_REG CompressCtlReg;
+} U_COMPRESS_CTL;
+
+typedef struct _QUANTI_TABLE_LOW_REG {
+ ULONG ChromaTable:5;
+ ULONG LumaTable:5;
+ ULONG Unused1:22;
+} QUANTI_TABLE_LOW_REG;
+
+typedef union _U_CQUANTI_TABLE_LOW {
+ ULONG Value;
+ QUANTI_TABLE_LOW_REG QTableLowReg;
+} U_QUANTI_TABLE_LOW;
+
+typedef struct _QUANTI_VALUE_REG {
+ ULONG High:15;
+ ULONG Unused1:1;
+ ULONG Best:15;
+ ULONG Unused2:1;
+} QUANTI_VALUE_REG;
+
+typedef union _U_QUANTI_VALUE {
+ ULONG Value;
+ QUANTI_VALUE_REG QValueReg;
+} U_QUANTI_VALUE;
+
+typedef struct _BSD_PARAM_REG {
+ ULONG HighThres:8;
+ ULONG LowThres:8;
+ ULONG HighCount:6;
+ ULONG Unused1:2;
+ ULONG LowCount:6;
+ ULONG Unused2:2;
+} BSD_PARAM_REG;
+
+typedef union _U_BSD_PARAM {
+ ULONG Value;
+ BSD_PARAM_REG BSDParamReg;
+} U_BSD_PARAM;
+
+typedef struct _VIDEO_INFO {
+ BYTE ExtADCAct; /* read from modection register */
+ BYTE EnableRC4;
+ BYTE DownScalingMethod;
+ USHORT AnalogDifferentialThreshold; /* BCD tolerance */
+ USHORT DigitalDifferentialThreshold; /* BCD tolerance */
+ USHORT DstWidth;
+ USHORT DstHeight;
+ USHORT SrcWidth;
+ USHORT SrcHeight;
+ BYTE HighLumaTable; /* if High and best Jpeg codec enable, use HighLumaTable and HighChromaTable, otherwise HighDeQuantiValue and BestDequantiValue*/
+ BYTE HighChromaTable;
+ BYTE HighDeQuantiValue;
+ BYTE BestDequantiValue;
+ U_SEQ_CTL uSeqCtlReg;
+ U_CTL_REG uCtlReg;
+ U_BCD_CTL uBCDCtlReg;
+ U_STREAM_BUF uStreamBufSize;
+ U_COMPRESS_CTL uCompressCtlReg;
+ U_QUANTI_TABLE_LOW uQTableLowReg;
+ U_QUANTI_VALUE uQValueReg;
+ U_BSD_PARAM uBSDParamReg;
+} VIDEO_INFO, *PVIDEO_INFO ;
+
+typedef struct _VIDEOM_SEQ_CTL_REG {
+ ULONG Unused1:1; //Bit 0
+ ULONG Unused2:1; //Bit 1
+ ULONG Unused3:1; //Bit 2
+ ULONG StreamMode:1; //Bit 3
+ ULONG Unused4:1; //Bit 4
+ ULONG CodecAutoMode:1; //Bit 5
+ ULONG Unused6:1; //Bit 6
+ ULONG Unused7:1; //Bit 7
+ ULONG SrcSel:1; //Bit 8
+ ULONG Unused9:1; //Bit 9
+ ULONG DataType:2; //Bit[11:10]
+ ULONG Unused12:20;
+} VIDEOM_SEQ_CTL_REG;
+
+typedef union _U_VIDEOM_SEQ_CTL {
+ ULONG Value;
+ VIDEOM_SEQ_CTL_REG SeqCtlReg;
+} U_VIDEOM_SEQ_CTL;
+
+typedef struct _VIDEOM_INFO {
+ BYTE DownScalingMethod;
+ USHORT AnalogDifferentialThreshold; /* BCD tolerance */
+ USHORT DigitalDifferentialThreshold; /* BCD tolerance */
+ USHORT DstWidth;
+ USHORT DstHeight;
+ USHORT SrcWidth;
+ USHORT SrcHeight;
+ BYTE HighLumaTable; /* if High and best Jpeg codec enable, use HighLumaTable and HighChromaTable, otherwise HighDeQuantiValue and BestDequantiValue*/
+ BYTE HighChromaTable;
+ BYTE HighDeQuantiValue;
+ BYTE BestDequantiValue;
+ BYTE PacketSize; //the same as video1 & video2
+ BYTE RingBufNum;
+ BYTE EnableRC4;
+ U_VIDEOM_SEQ_CTL uSeqCtlReg;
+ U_BCD_CTL uBCDCtlReg;
+ U_COMPRESS_CTL uCompressCtlReg;
+ U_QUANTI_TABLE_LOW uQTableLowReg;
+ U_QUANTI_VALUE uQValueReg;
+ U_BSD_PARAM uBSDParamReg;
+} VIDEOM_INFO, *PVIDEOM_INFO ;
+
+typedef struct _VIDEO_MODE_INFO
+{
+ USHORT X;
+ USHORT Y;
+ USHORT ColorDepth;
+ USHORT RefreshRate;
+ BYTE ModeIndex;
+} VIDEO_MODE_INFO, *PVIDEO_MODE_INFO;
+
+#endif
+
diff --git a/board/aspeed/ast2400/vesa.h b/board/aspeed/ast2400/vesa.h
new file mode 100755
index 0000000..69aba90
--- /dev/null
+++ b/board/aspeed/ast2400/vesa.h
@@ -0,0 +1,163 @@
+/*
+ * 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
+ */
+#ifndef _VESA_H_
+#define _VESA_H_
+
+typedef enum
+{
+ VCLK25_175 = 0x00,
+ VCLK28_322 = 0x01,
+ VCLK31_5 = 0x02,
+ VCLK31_574 = 0x03,
+ VCLK32_76 = 0x04,
+ VCLK33_154 = 0x05,
+ VCLK36 = 0x06,
+ VCLK40 = 0x07,
+ VCLK45_978 = 0x08,
+ VCLK49_5 = 0x09,
+ VCLK50 = 0x0A,
+ VCLK52_95 = 0x0B,
+ VCLK56_25 = 0x0C,
+ VCLK65 = 0x0D,
+ VCLK74_48 = 0x0E,
+ VCLK75 = 0x0F,
+ VCLK78_75 = 0x10,
+ VCLK79_373 = 0x11,
+ VCLK81_624 = 0x12,
+ VCLK83_462 = 0x13,
+ VCLK84_715 = 0x14,
+ VCLK94_5 = 0x15,
+ VCLK106_5 = 0x16,
+ VCLK108 = 0x17,
+ VCLK119 = 0x18,
+ VCLK135 = 0x19,
+ VCLK136_358 = 0x1A,
+ VCLK146_25 = 0x1B,
+ VCLK154 = 0x1C,
+ VCLK157_5 = 0x1D,
+ VCLK162 = 0x1E
+} ePIXEL_CLOCK;
+
+typedef struct {
+ USHORT HorizontalTotal;
+ USHORT VerticalTotal;
+ USHORT HorizontalActive;
+ USHORT VerticalActive;
+ BYTE RefreshRate;
+ double HorizontalFrequency;
+ USHORT HSyncTime;
+ USHORT HBackPorch;
+ USHORT VSyncTime;
+ USHORT VBackPorch;
+ USHORT HLeftBorder;
+ USHORT HRightBorder;
+ USHORT VBottomBorder;
+ USHORT VTopBorder;
+ USHORT PixelClock;
+ BOOL HorPolarity;
+ BOOL VerPolarity;
+ BYTE ADCIndex1;
+ BYTE ADCIndex2;
+ BYTE ADCIndex3;
+ BYTE ADCIndex5;
+ BYTE ADCIndex6;
+ BYTE ADCIndex7;
+ BYTE ADCIndex8;
+ BYTE ADCIndex9;
+ BYTE ADCIndexA;
+ BYTE ADCIndexF;
+ BYTE ADCIndex15;
+ int HorizontalShift;
+ int VerticalShift;
+} VESA_MODE;
+
+#define HOR_POSITIVE 0
+#define HOR_NEGATIVE 1
+#define VER_POSITIVE 0
+#define VER_NEGATIVE 1
+
+#ifdef VESA_GLOBALS
+
+// Note: Modified for modes which have border issue
+VESA_MODE vModeTable[] = {
+////////////////////////// 60Hz mode
+// 720x480 done
+ {1056, 497, 720, 480, 60, 29.900, 88, 104, 3, 13, 0, 0, 0, 0, VCLK31_574, HOR_NEGATIVE, VER_NEGATIVE, 0x41, 0xF0, 0x48, 0x05, 0x20, 0x58, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+// 848x480 done
+ {1064, 517, 848, 480, 60, 31.160, 88, 91, 3, 26, 0, 0, 0, 0, VCLK33_154, HOR_NEGATIVE, VER_NEGATIVE, 0x42, 0x70, 0x48, 0x05, 0x20, 0x58, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+ {800, 525, 640, 480, 60, 31.469, 96, 40, 2, 25, 1, 1, 8, 8, VCLK25_175, HOR_NEGATIVE, VER_NEGATIVE, 0x31, 0xF0, 0x48, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+// 720x576
+ {912, 597, 720, 576, 60, 35.920, 72, 88, 3, 17, 0, 0, 0, 0, VCLK32_76, HOR_NEGATIVE, VER_NEGATIVE, 0x38, 0xF0, 0x48, 0x05, 0x20, 0x48, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 2},
+// 960x600 GTF done
+ {1232, 622, 960, 600, 60, 37.320, 96, 136, 3, 18, 0, 0, 0, 0, VCLK45_978, HOR_NEGATIVE, VER_NEGATIVE, 0x4C, 0xF0, 0x60, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1056, 628, 800, 600, 60, 37.879, 128, 88, 4, 23, 0, 0, 0, 0, VCLK40, HOR_POSITIVE, VER_POSITIVE, 0x41, 0xF0, 0x60, 0x05, 0x20, 0x80, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1088x612 GTF done
+ {1392, 634, 1088, 612, 60, 38.04, 112, 152, 3, 18, 0, 0, 0, 0, VCLK52_95, HOR_NEGATIVE, VER_NEGATIVE, 0x56, 0xF0, 0x60, 0x05, 0x20, 0x70, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1280x720 GTF done
+ {1664, 746, 1280, 720, 60, 44.760, 136, 192, 3, 22, 0, 0, 0, 0, VCLK74_48, HOR_NEGATIVE, VER_NEGATIVE, 0x67, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1360x768 GTF done
+ {1776, 795, 1360, 768, 60, 47.700, 144, 208, 3, 23, 0, 0, 0, 0, VCLK84_715, HOR_NEGATIVE, VER_NEGATIVE, 0x6E, 0xF0, 0xA8, 0x05, 0x20, 0x90, 0x60, 0x60, 0x60, 0x5E, 0xFE, 7, 1},
+// 1280x768 done
+ {1664, 798, 1280, 768, 60, 47.700, 128, 184, 7, 20, 0, 0, 0, 0, VCLK79_373, HOR_NEGATIVE, VER_NEGATIVE, 0x67, 0xF0, 0xA8, 0x05, 0x20, 0x80, 0x60, 0x60, 0x60, 0x5E, 0xFE, 7, 1},
+ {1344, 806, 1024, 768, 60, 48.363, 136, 160, 6, 29, 0, 0, 0, 0, VCLK65, HOR_NEGATIVE, VER_NEGATIVE, 0x53, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 7},
+// 1280x800 GTF done
+ {1680, 828, 1280, 800, 60, 49.680, 136, 200, 3, 24, 0, 0, 0, 0, VCLK83_462, HOR_NEGATIVE, VER_NEGATIVE, 0x68, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1152x864 GTF done
+ {1520, 895, 1152, 864, 60, 53.700, 120, 184, 3, 27, 0, 0, 0, 0, VCLK81_624, HOR_NEGATIVE, VER_NEGATIVE, 0x5E, 0xF0, 0xA8, 0x05, 0x20, 0x78, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1600x900 GTF done
+ {2128, 932, 1600, 900, 60, 55.920, 168, 264, 3, 28, 0, 0, 0, 0, VCLK119, HOR_NEGATIVE, VER_NEGATIVE, 0x84, 0xF0, 0xA8, 0x05, 0x20, 0xA8, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1440X900 CVT done
+ {1904, 933, 1440, 900, 60, 55.935, 152, 232, 6, 25, 0, 0, 0, 0, VCLK106_5, HOR_NEGATIVE, VER_POSITIVE, 0x76, 0xF0, 0xA8, 0x05, 0x20, 0x96, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1800, 1000, 1280, 960, 60, 60.000, 112, 312, 3, 36, 0, 0, 0, 0, VCLK108, HOR_POSITIVE, VER_POSITIVE, 0x70, 0x70, 0xA8, 0x05, 0x20, 0x70, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1600x1024 GTF done
+ {2144, 1060, 1600, 1024, 60, 63.600, 168, 272, 3, 32, 0, 0, 0, 0, VCLK136_358, HOR_NEGATIVE, VER_NEGATIVE, 0x85, 0xF0, 0xE8, 0x05, 0x20, 0xA8, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1688, 1066, 1280, 1024, 60, 63.981, 112, 248, 3, 38, 0, 0, 0, 0, VCLK108, HOR_POSITIVE, VER_POSITIVE, 0x69, 0x70, 0xA8, 0x05, 0x20, 0x70, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1680X1050 CVT done Reduced Blanking
+ {1840, 1080, 1680, 1050, 60, 64.674, 32, 80, 6, 21, 0, 0, 0, 0, VCLK119, HOR_POSITIVE, VER_NEGATIVE, 0x72, 0xF0, 0xA8, 0x05, 0x20, 0x20, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+// 1920X1200 CVT done Reduced Blanking
+ {2080, 1235, 1920, 1200, 60, 74.038, 32, 80, 6, 26, 0, 0, 0, 0, VCLK154, HOR_POSITIVE, VER_NEGATIVE, 0x81, 0xF0, 0xA8, 0x05, 0x20, 0x20, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ //{2160, 1250, 1600, 1200, 60,75.000, 192, 304, 3, 46, 0, 0, 0, 0, VCLK162, HOR_POSITIVE, VER_POSITIVE},
+ {2160, 1248, 1600, 1200, 60, 75.000, 192, 304, 3, 46, 0, 0, 0, 0, VCLK162, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xE8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+
+////////////////////// Not 60Hz mode
+ {900, 449, 720, 400, 70, 31.469, 108, 45, 2, 25, 1, 1, 8, 8, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x38, 0x30, 0x48, 0x05, 0x20, 0x6C, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 1},
+ {832, 520, 640, 480, 72, 37.861, 40, 120, 3, 20, 1, 1, 8, 8, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x33, 0xF0, 0x48, 0x05, 0x20, 0x28, 0x60, 0x60, 0x60, 0x5E, 0xFE, 6, 3},
+ {840, 500, 640, 480, 75, 37.500, 64, 120, 3, 16, 0, 0, 0, 0, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x34, 0x70, 0x48, 0x05, 0x20, 0x40, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 3},
+ {832, 509, 640, 480, 85, 43.269, 56, 80, 3, 25, 0, 0, 0, 0, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x33, 0xF0, 0x48, 0x05, 0x20, 0x38, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 3},
+ {1024, 625, 800, 600, 56, 35.156, 72, 128, 2, 22, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x3F, 0xF0, 0x60, 0x05, 0x20, 0x48, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1040, 666, 800, 600, 72, 48.077, 120, 64, 6, 23, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x40, 0xF0, 0x60, 0x05, 0x20, 0x78, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1056, 625, 800, 600, 75, 46.875, 80, 160, 3, 21, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x41, 0xF0, 0x60, 0x05, 0x20, 0x50, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1048, 631, 800, 600, 85, 53.674, 64, 152, 3, 27, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x41, 0x70, 0x60, 0x05, 0x20, 0x40, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1328, 806, 1024, 768, 70, 56.476, 136, 144, 6, 29, 0, 0, 0, 0, 0, HOR_NEGATIVE, VER_NEGATIVE, 0x52, 0xF0, 0xA8, 0x05, 0x20, 0x88, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 7},
+ {1312, 800, 1024, 768, 75, 60.023, 96, 176, 3, 28, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x51, 0xF0, 0xA8, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 1},
+ {1376, 808, 1024, 768, 85, 68.677, 96, 208, 3, 36, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x55, 0xF0, 0xA8, 0x05, 0x20, 0x60, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 1},
+ {1600, 900, 1152, 864, 75, 67.500, 128, 256, 3, 32, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x63, 0xF0, 0xA8, 0x05, 0x20, 0x80, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1728, 1011, 1280, 960, 85, 85.938, 160, 224, 3, 47, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x6B, 0xF0, 0xA8, 0x05, 0x20, 0xA0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1688, 1066, 1280, 1024, 75, 79.976, 144, 248, 3, 38, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x69, 0x70, 0xE8, 0x05, 0x20, 0x90, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {1728, 1072, 1280, 1024, 85, 91.146, 160, 224, 3, 44, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x6B, 0xF0, 0xA8, 0x05, 0x20, 0xA0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 65, 81.250, 192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 70, 87.500, 192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 75, 93.750, 192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0},
+ {2160, 1250, 1600, 1200, 85, 106.250,192, 304, 3, 46, 0, 0, 0, 0, 0, HOR_POSITIVE, VER_POSITIVE, 0x86, 0xF0, 0xA8, 0x05, 0x20, 0xC0, 0x60, 0x60, 0x60, 0x5E, 0xFE, -1, 0}
+};
+
+USHORT ModeNumberCount = sizeof (vModeTable) / sizeof (VESA_MODE);
+USHORT Mode60HZCount = 21;
+
+#else /* NOT VESA_GLOBALS */
+extern VESA_MODE vModeTable[];
+extern USHORT ModeNumberCount;
+extern USHORT Mode60HZCount;
+#endif
+
+#endif /* _VESA_H_ */
+
+
diff --git a/board/aspeed/ast2400/vfun.c b/board/aspeed/ast2400/vfun.c
new file mode 100755
index 0000000..f707e80
--- /dev/null
+++ b/board/aspeed/ast2400/vfun.c
@@ -0,0 +1,545 @@
+/*
+ * 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
+ */
+#define BUF_GLOBALS
+#include "type.h"
+#include "vdef.h"
+#include "vreg.h"
+#include "crt.h"
+#include "vfun.h"
+
+ULONG UnlockSCURegHost(ULONG MMIOBase, ULONG Key)
+{
+ WriteMemoryLongHost(SCU_BASE, SCU_PROTECT_REG, Key);
+ return ReadMemoryLongHost(SCU_BASE,SCU_PROTECT_REG);
+}
+
+void ResetVideoHost(void)
+{
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, VIDEO_RESET_EN << VIDEO_ENGINE_RESET_BIT, VIDEO_ENGINE_RESET_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, VIDEO_RESET_OFF << VIDEO_ENGINE_RESET_BIT, VIDEO_ENGINE_RESET_MASK);
+}
+
+void StartModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, MODE_DETECTION_TRIGGER);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, MODE_DETECTION_TRIGGER, MODE_DETECTION_TRIGGER);
+}
+
+BOOL ReadVideoInterruptHost(ULONG MMIOBase, ULONG value)
+{
+ return ((ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_READ_REG) & value) ? TRUE : FALSE);
+}
+
+ULONG UnlockVideoRegHost(ULONG MMIOBase, ULONG Key)
+{
+ WriteMemoryLongHost(VIDEO_REG_BASE, KEY_CONTROL_REG, Key);
+ return ReadMemoryLongHost(VIDEO_REG_BASE,KEY_CONTROL_REG);
+}
+
+void StartVideoCaptureTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, VIDEO_CAPTURE_TRIGGER);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, VIDEO_CAPTURE_TRIGGER, VIDEO_CAPTURE_TRIGGER);
+}
+
+void StartVideoCodecTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, VIDEO_CODEC_TRIGGER);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, VIDEO_CODEC_TRIGGER, VIDEO_CODEC_TRIGGER);
+}
+
+void StopModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset)
+{
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, offset, 0, MODE_DETECTION_TRIGGER);
+}
+
+void ClearVideoInterruptHost(ULONG MMIOBase, ULONG value)
+{
+ //WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_CLEAR_REG, value, value);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_CLEAR_REG, value);
+}
+
+/* UnLock SCU Host and Reset Engine */
+BOOL CheckOnStartHost(void)
+{
+ int i=0, dwValue=0;
+
+ do
+ {
+ dwValue = UnlockSCURegHost(0, SCU_UNLOCK_KEY);
+ i++;
+ }
+ while ((SCU_WRITE_ENABLE != dwValue) && (i<10));
+
+ //Clear SCU Reset Register
+ WriteMemoryLongHost(SCU_BASE, SCU_CONTROL_REG, 0);
+
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, (EN_ECLK | EN_V1CLK | EN_V2CLK), (STOP_ECLK_MASK | STOP_V1CLK_MASK | STOP_V2CLK_MASK));
+
+#if defined(CONFIG_AST2300)
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x90 + SCU_OFFSET), 0x00000020, 0x00000030); //enable 24bits
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x88 + SCU_OFFSET), 0x000fff00, 0x000fff00); //enable video multi-pins
+#else //AST2100
+ //WriteMemoryLongWithMASKHost(SCU_BASE, SCU_PIN_CTRL1_REG, (VIDEO_PORTA_EN | VIDEO_PORTB_EN | VIDEO_VP1_EN | VIDEO_VP2_EN) ,
+ // (VIDEO_PORTA_MASK | VIDEO_PORTB_MASK | VIDEO_VP1_MASK | VIDEO_VP2_MASK));
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_PIN_CTRL2_REG, (VIDEO_PORTA_SINGLE_EDGE | VIDEO_PORTB_SINGLE_EDGE) ,
+ (VIDEO_PORTA_SINGLE_EDGE_MASK | VIDEO_PORTB_SINGLE_EDGE_MASK));
+#endif
+
+ ResetVideoHost();
+
+ return TRUE;
+}
+
+BOOL CheckOnStartClient(void)
+{
+ int i=0, dwValue=0;
+
+ do
+ {
+ dwValue = UnlockSCURegHost(0, SCU_UNLOCK_KEY);
+ i++;
+ }
+ while ((SCU_WRITE_ENABLE != dwValue) && (i<10));
+
+ //Clear SCU Reset Register
+ WriteMemoryLongClient(SCU_BASE, SCU_CONTROL_REG, 0);
+
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_STOP_REG, (EN_ECLK | EN_V1CLK | EN_D1CLK | EN_D2CLK | EN_V2CLK),
+ (STOP_ECLK_MASK | STOP_D1CLK_MASK | STOP_D2CLK_MASK | STOP_V1CLK_MASK | STOP_V2CLK_MASK));
+
+ //WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_SELECTION_REG, PORTB_FROM_D2CLK | PORTB_CLOCK_INV_DELAY_3NS | PORTA_CLOCK_INV_DELAY_3NS, PORTB_CLOCK_SEL | PORTB_CLOCK_DELAY_MASK | PORTA_CLOCK_DELAY_MASK);
+ //A1EVA
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_SELECTION_REG, (PORTB_FROM_D2CLK | PORTB_CLOCK_INV_DELAY_1NS | PORTA_CLOCK_INV_DELAY_1NS), (PORTB_CLOCK_SEL | PORTB_CLOCK_DELAY_MASK | PORTA_CLOCK_DELAY_MASK));
+ WriteMemoryLongWithMASKClient(SCU_BASE, 0x202C, (0x03<<9), (0x03<<9));
+
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL1_REG, (VIDEO_PORTA_EN | VIDEO_PORTB_EN | VIDEO_VP1_EN | VIDEO_VP2_EN),
+ (VIDEO_PORTA_MASK | VIDEO_PORTB_MASK | VIDEO_VP1_MASK | VIDEO_VP2_MASK));
+
+#if CONFIG_AST3000
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL2_REG, (VIDEO_PORTA_DUAL_EDGE | VIDEO_PORTB_DUAL_EDGE),
+ (VIDEO_PORTA_SINGLE_EDGE_MASK | VIDEO_PORTB_SINGLE_EDGE_MASK));
+#else
+ //2100 is single edge
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL2_REG, (VIDEO_PORTA_SINGLE_EDGE | VIDEO_PORTB_SINGLE_EDGE),
+ (VIDEO_PORTA_SINGLE_EDGE_MASK | VIDEO_PORTB_SINGLE_EDGE_MASK));
+#endif
+
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_CLOCK_STOP_REG, (EN_D1CLK | EN_D2CLK), (STOP_D1CLK_MASK | STOP_D2CLK_MASK));
+ WriteMemoryLongWithMASKClient(SCU_BASE, SCU_PIN_CTRL1_REG, VGA_PIN_OFF, VGA_PIN_MASK);
+
+ //ResetVideoHost();
+
+ return TRUE;
+}
+
+ULONG InitializeVideoEngineHost (ULONG MMIOBase,
+ int nVideo,
+ BOOL HorPolarity,
+ BOOL VerPolarity)
+{
+ //ULONG temp, temp1, temp2;
+ ULONG dwRegOffset = nVideo * 0x100;
+ ULONG dwValue;
+ int i;
+
+
+ /* General Video Control */
+ //LineBufEn 0
+ //dwValue = (COMPRESS_MODE << CODEC_DECOMPRESS_MODE_BIT) | DELAY_VSYNC_EN;
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CONTROL_REG, dwValue);
+ //Video Data Truncation Register
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x328, 0);
+
+ //D2CLK clock must config according to video's line buffer
+ if (VIDEO1 == nVideo)
+ dwValue = LINE_BUFFER_VIDEO1;
+ else
+ dwValue = LINE_BUFFER_VIDEO2;
+
+ //D2CLK clock must config according to video's line buffer
+ switch (dwValue)
+ {
+ case LINE_BUFFER_OFF:
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_SELECTION_REG, NORMAL_CRT1, D2CLK_CLOCK_SELECTION_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, STOP_D2CLK, STOP_D2CLK_MASK);
+ break;
+ case LINE_BUFFER_VIDEO1:
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_SELECTION_REG, V1CLK_VIDEO1 << D2CLK_CLOCK_SELECTION_BIT, D2CLK_CLOCK_SELECTION_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_D2CLK, STOP_D2CLK_MASK);
+ break;
+ case LINE_BUFFER_VIDEO2:
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_SELECTION_REG, V1CLK_VIDEO2 << D2CLK_CLOCK_SELECTION_BIT, D2CLK_CLOCK_SELECTION_MASK);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_D2CLK, STOP_D2CLK_MASK);
+ break;
+ case LINE_BUFFER_VIDEOM:
+ //If select this option, it will config at videoM INIT
+ break;
+ default:
+ break;
+ }
+
+ dwValue = 0;
+ //VR30 now is capture window in the compression
+ dwValue = g_DefHeight << CAPTURE_VER_LINE_BIT |
+ g_DefWidth << CAPTURE_HOR_PIXEL_BIT;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CAPTURE_WINDOWS_REG + dwRegOffset, dwValue);
+
+ dwValue = 0;
+ //VR34 now is destionation window in the compression
+ dwValue = g_DefHeight << COMPRESS_VER_LINE_BIT |
+ g_DefWidth << COMPRESS_HOR_PIXEL_BIT;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_WINDOWS_REG + dwRegOffset, dwValue);
+
+ //BitCOUNT according compress data format
+ dwValue = YUV444_MODE;
+ if (YUV444_MODE == dwValue)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV444, BUF_LINE_OFFSET_MASK);
+ else
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV420, BUF_LINE_OFFSET_MASK);
+
+ // CRC
+ //Disable
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_PRIMARY_REG, 0x0);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_SECOND_REG, 0x0);
+
+ /* Sequence Control register */
+ //Oonly Encoder need to set
+ /* Engine Sequence Contol Register */
+ dwValue = (WATCH_DOG_EN << WATCH_DOG_ENABLE_BIT) |
+ VIDEO_CAPTURE_AUTO_MODE |
+ VIDEO_CODEC_AUTO_MODE;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Control register */
+ dwValue = (HOR_NEGATIVE == HorPolarity) ? NO_INVERSE_POL : INVERSE_POL;
+ dwValue = (((VER_NEGATIVE == VerPolarity) ? NO_INVERSE_POL : INVERSE_POL) << VIDEO_VSYNC_POLARITY_BIT) | dwValue;
+
+ /* HW Recommand*/
+ //dwValue = (TILE_MODE << 9) | dwValue;
+ dwValue = (EXTERNAL_VGA_SOURCE << EXTERNAL_SOURCE_BIT) | dwValue;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* BCD register */
+ //NO BCD
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BCD_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Stream Buffer Size register */
+ dwValue = (YUV_TEST << SKIP_TEST_MODE_BIT) |
+ (PACKET_SIZE_32KB << STREAM_PACKET_SIZE_BIT) |
+ (PACKETS_8 << RING_BUF_PACKET_NUM_BIT);
+ /* the same with Video1, Video2, and VideoM*/
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_STREAM_BUF_SIZE, dwValue);
+
+ /* Comression control register */
+ dwValue = (USE_UV_CIR656 << UV_CIR656_FORMAT_BIT)|
+ (JPEG_MIX_MODE << JPEG_ONLY_BIT)|
+ (VQ_4_COLOR_MODE << VQ_4_COLOR_BIT)|
+ (QUANTI_CODEC_MODE << QUALITY_CODEC_SETTING_BIT)|
+ (7 << NORMAL_QUANTI_CHROMI_TABLE_BIT) |
+ (23 << NORMAL_QUANTI_LUMI_TABLE_BIT);
+
+ //Video2 have same value as video1
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_CONTROL_REG, dwValue);
+
+ /* JPEG Quantization Table register */
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_TABLE_LOW_REG, dwValue);
+
+ /* Quantization value register */
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_VALUE_REG, dwValue);
+
+ //Video BSD Parameter Register
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BSD_PARA_REG, dwValue);
+
+ //no scale
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_REG, 0x10001000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER0_REG, 0x00200000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER1_REG, 0x00200000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER2_REG, 0x00200000);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_SCALE_FACTOR_PARAMETER3_REG, 0x00200000);
+ return TRUE;
+}
+
+ULONG InitializeVideoEngineClient (ULONG MMIOBase,
+ int nVideo)
+{
+ //ULONG temp, temp1, temp2;
+ ULONG dwRegOffset = nVideo * 0x100;
+ ULONG dwValue;
+ int i;
+
+
+ /* General Video Control */
+ //LineBufEn 0
+ dwValue = (DECOMPRESS_MODE << CODEC_DECOMPRESS_MODE_BIT);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CONTROL_REG, dwValue);
+ //Video Data Truncation Register
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x328, 0);
+
+ //VR30 now is capture window in the compression
+ dwValue = g_DefHeight << CAPTURE_VER_LINE_BIT |
+ g_DefWidth << CAPTURE_HOR_PIXEL_BIT;
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CAPTURE_WINDOWS_REG + dwRegOffset, dwValue, CAPTURE_VER_LINE_MASK | CAPTURE_HOR_PIXEL_MASK);
+
+ //VR34 now is destionation window in the compression
+ dwValue = g_DefHeight << COMPRESS_VER_LINE_BIT |
+ g_DefWidth << COMPRESS_HOR_PIXEL_BIT;
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_WINDOWS_REG + dwRegOffset, dwValue, COMPRESS_VER_LINE_MASK | COMPRESS_HOR_PIXEL_MASK);
+
+ //BitCOUNT according compress data format
+ dwValue = YUV444_MODE;
+ if (YUV444_MODE == dwValue)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV444, BUF_LINE_OFFSET_MASK);
+ else
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_LINE_OFFSET_REG + dwRegOffset, g_DefWidth * INPUT_BITCOUNT_YUV420, BUF_LINE_OFFSET_MASK);
+
+ // CRC
+ //Disable
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_PRIMARY_REG, 0x0);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO_CRC_SECOND_REG, 0x0);
+
+ /* Sequence Control register */
+ //Oonly Encoder need to set
+ /* Engine Sequence Contol Register */
+ dwValue = VIDEO_CAPTURE_AUTO_MODE |
+ VIDEO_CODEC_AUTO_MODE;
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Control register */
+ /* HW Recommand*/
+ dwValue = (TILE_MODE << 9);
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* BCD register */
+ //NO BCD
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BCD_CONTROL_REG + dwRegOffset, dwValue);
+
+ /* Stream Buffer Size register */
+ dwValue = (YUV_TEST << SKIP_TEST_MODE_BIT) |
+ (PACKET_SIZE_32KB << STREAM_PACKET_SIZE_BIT) |
+ (PACKETS_8 << RING_BUF_PACKET_NUM_BIT);
+ /* the same with Video1, Video2, and VideoM*/
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_STREAM_BUF_SIZE, dwValue);
+
+
+ /* Comression control register */
+ dwValue = (USE_UV_CIR656 << UV_CIR656_FORMAT_BIT)|
+ (JPEG_MIX_MODE << JPEG_ONLY_BIT)|
+ (VQ_4_COLOR_MODE << VQ_4_COLOR_BIT)|
+ (QUANTI_CODEC_MODE << QUALITY_CODEC_SETTING_BIT)|
+ (7 << NORMAL_QUANTI_CHROMI_TABLE_BIT) |
+ (23 << NORMAL_QUANTI_LUMI_TABLE_BIT);
+
+ //Video2 have same value as video1
+ if (VIDEO1 == nVideo)
+ {
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_CONTROL_REG, dwValue);
+ }
+ else
+ {
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEOM_COMPRESS_CONTROL_REG, dwValue);
+ }
+
+ /* JPEG Quantization Table register */
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_TABLE_LOW_REG, dwValue);
+
+ /* Quantization value register */
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_QUANTI_VALUE_REG, dwValue);
+
+ //Video BSD Parameter Register
+ //Video2 have same value as video1
+ dwValue = 0;
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BSD_PARA_REG, dwValue);
+
+ return TRUE;
+}
+
+BYTE GetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex)
+{
+ BYTE Data;
+ ULONG Status;
+
+// Reset
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 0);
+// Set AC Timing and Speed
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x04, AC_TIMING);
+// Lower Speed
+// WriteMemoryLongWithANDData (VideoEngineInfo->VGAPCIInfo.ulMMIOBaseAddress, I2C_BASE + DeviceSelect * 0x40 + 0x04, 0, 0x33317805);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x08, 0);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Enable Master Mode
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 1);
+// Enable Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0xAF);
+// BYTE I2C Mode
+// Start and Send Device Address
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x3);
+// Wait TX ACK
+ do {
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ } while (Status != 1);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Send Device Register Index
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, RegisterIndex);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x2);
+// Wait Tx ACK
+ do {
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ } while (Status != 1);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Start, Send Device Address + 1(Read Mode), Receive Data
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress + 1);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x1B);
+// Wait Rx Done
+ do {
+ Status = (ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x04) >> 2;
+ } while (Status != 1);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+
+// Enable STOP Interrupt
+ WriteMemoryLongWithMASKClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0x10, 0x10);
+// Issue STOP Command
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x20);
+// Wait STOP
+ do {
+ Status = (ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x10) >> 4;
+ } while (Status != 1);
+// Disable STOP Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0x10);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Read Received Data
+ Data = (BYTE)((ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20) & 0xFF00) >> 8);
+
+ return Data;
+}
+
+ULONG SetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex,
+ BYTE RegisterValue)
+{
+ ULONG Status;
+ ULONG Count = 0;
+
+// Reset
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 0);
+// Set Speed
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x04, AC_TIMING);
+// Lower Speed
+// WriteMemoryLongWithANDData (VideoEngineInfo->VGAPCIInfo.ulMMIOBaseAddress, I2C_BASE + DeviceSelect * 0x40 + 0x04, 0, 0x33317805);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x08, 0);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Enable Master Mode
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x00, 1);
+// Enable Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0xAF);
+// BYTE I2C Mode
+// Start and Send Device Address
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x3);
+// Wait Tx ACK
+ do {
+ Count++;
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+
+ if (2 == Status)
+ {
+ //Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+ //Re-Send Start and Send Device Address while NACK return
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, DeviceAddress);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x3);
+ }
+ //else
+ {
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ }
+ } while (Status != 1);
+ Count = 0;
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Send Device Register Index
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, RegisterIndex);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x2);
+// Wait Tx ACK
+ do {
+ Count++;
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ } while (Status != 1);
+ Count = 0;
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Send Device Register Value and Stop
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x20, RegisterValue);
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x2);
+// Wait Tx ACK
+ do {
+ Count++;
+ Status = ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x03;
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ } while (Status != 1);
+ Count = 0;
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+// Enable STOP Interrupt
+ WriteMemoryLongWithMASKClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0x10, 0x10);
+// Issue STOP Command
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x14, 0x20);
+// Wait STOP
+ do {
+ Count++;
+ Status = (ReadMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10) & 0x10) >> 4;
+ if (Count > LOOP_COUNT) {
+ return CAN_NOT_FIND_DEVICE;
+ }
+ } while (Status != 1);
+// Disable STOP Interrupt
+ WriteMemoryLongWithMASKClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x0C, 0, 0x10);
+// Clear Interrupt
+ WriteMemoryLongClient(APB_BRIDGE_2_BASE, I2C_BASE + DeviceSelect * 0x40 + 0x10, 0xFFFFFFFF);
+
+ return SET_I2C_DONE;
+}
diff --git a/board/aspeed/ast2400/vfun.h b/board/aspeed/ast2400/vfun.h
new file mode 100755
index 0000000..90f9ec4
--- /dev/null
+++ b/board/aspeed/ast2400/vfun.h
@@ -0,0 +1,79 @@
+/*
+ * 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
+ */
+#ifndef _VFUN_H_
+#define _VFUN_H_
+
+//#define vBufAlign(x) ((x + 0x0000007F) & 0xFFFFFF80) //128 byte alignment
+#define vBufAlign(x) ((x + 0x000003FF) & 0xFFFFFC00) //128 byte alignment
+#define vBufAlign2(x) ((x + 0x0000FFFF) & 0xFFFF0000) //128 byte alignment
+#define v16byteAlign(x) ((x + 0x0000000F) & 0xFFFFFFF0)
+#define vBuf_ALIGNMENT 128
+
+#define HOST_TOTAL_SIZE 0x8000000 /* 128M */
+#define STATION_TOTAL_SIZE 0xF800000 /* 120M */
+
+#define VIDEO_SOURCE_SIZE 0x200000 /* 800X600X4 = 0x1D4C00 */
+#define VIDEO_MAX_STREAM_SIZE 0x400000 /* 32X128K = 0x400000 */
+#define VIDEO_FLAG_SIZE 0x5000 /* 1920X1200/128 = 0x4650*/
+#define VIDEO_CRC_SIZE 0x50000 /* 1920/64X1200X8 = 0x46500*/
+
+#define VIDEO1_EN_TOTAL_SIZE (VIDEO_SOURCE_SIZE*2+VIDEO_MAX_STREAM_SIZE+VIDEO_FLAG_SIZE+VIDEO_CRC_SIZE) /* 0x1655000 = about 23M*/
+#define VIDEO2_EN_TOTAL_SIZE VIDEO1_EN_TOTAL_SIZE
+//#define VIDEOM_EN_TOTAL_SIZE (VIDEO_SOURCE_SIZE*2+VIDEO_MAX_STREAM_SIZE+VIDEO_FLAG_SIZE) /* 0x1605000 = about 22.7M */
+//#define VIDEO_HOST_SIZE (VIDEO1_EN_TOTAL_SIZE + VIDEO2_EN_TOTAL_SIZE + VIDEOM_EN_TOTAL_SIZE) /* 0x69922816 = about 70M */
+#define VIDEO_HOST_SIZE (VIDEO1_EN_TOTAL_SIZE + VIDEO2_EN_TOTAL_SIZE) /* NOT NEED VIDEOM */
+
+#define VIDEO1_EN_BASE 0x100000
+#define VIDEO2_EN_BASE (VIDEO1_EN_BASE + VIDEO1_EN_TOTAL_SIZE)
+#define VIDEOM_EN_BASE (VIDEO2_EN_BASE + VIDEO2_EN_TOTAL_SIZE)
+
+#define VIDEO1_DE_TOTAL_SIZE (VIDEO_MAX_STREAM_SIZE + VIDEO_SOURCE_SIZE) /* 0xD00000 = 13M*/
+#define VIDEO2_DE_TOTAL_SIZE (VIDEO1_DE_TOTAL_SIZE)
+#define VIDEO_STATION_SIZE (VIDEO1_DE_TOTAL_SIZE + VIDEO2_DE_TOTAL_SIZE) /* 26M */
+
+#define VIDEO1_DE_BASE VIDEO_HOST_SIZE
+#define VIDEO2_DE_BASE (VIDEO1_DE_BASE + VIDEO1_DE_TOTAL_SIZE)
+#define VIDEO_ALL_SIZE (VIDEO_HOST_SIZE + VIDEO_STATION_SIZE) //Host and Station
+
+#define OutdwmBankModeHost(offset,data) WriteMemoryLongHost(DRAM_BASE,offset,data)
+#define IndwmBankModeHost(offset) ReadMemoryLongHost(DRAM_BASE,offset)
+
+ULONG UnlockVideoRegHost(ULONG MMIOBase, ULONG Key);
+BOOL CheckOnStartHost(void);
+BOOL CheckOnStartClient(void);
+void StartVideoCaptureTriggerHost(ULONG MMIOBase, ULONG offset);
+void StartVideoCaptureTriggerHost(ULONG MMIOBase, ULONG offset);
+void StartVideoCodecTriggerHost(ULONG MMIOBase, ULONG offset);
+ULONG UnlockSCURegHost(ULONG MMIOBase, ULONG Key);
+ULONG UnlockSCURegHost(ULONG MMIOBase, ULONG Key);
+void StartModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset);
+void ClearVideoInterruptHost(ULONG MMIOBase, ULONG value);
+BOOL ReadVideoInterruptHost(ULONG MMIOBase, ULONG value);
+void StopModeDetectionTriggerHost(ULONG MMIOBase, ULONG offset);
+void ResetVideoHost(void);
+ULONG InitializeVideoEngineHost (ULONG MMIOBase,
+ int nVideo,
+ BOOL HorPolarity,
+ BOOL VerPolarity);
+ULONG InitializeVideoEngineClient (ULONG MMIOBase,
+ int nVideo);
+BYTE GetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex);
+
+ULONG SetI2CRegClient(ULONG MMIOBase,
+ BYTE DeviceSelect,
+ BYTE DeviceAddress,
+ BYTE RegisterIndex,
+ BYTE RegisterValue);
+#endif //_VFUN_H_
+
diff --git a/board/aspeed/ast2400/vgahw.h b/board/aspeed/ast2400/vgahw.h
new file mode 100755
index 0000000..7cbba0d
--- /dev/null
+++ b/board/aspeed/ast2400/vgahw.h
@@ -0,0 +1,175 @@
+/*
+ * 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
+ */
+/******************************************************************************
+ * Mode Stuff
+ ******************************************************************************/
+/* Default Settings */
+#define CRT_LOW_THRESHOLD_VALUE 0x12
+#define CRT_HIGH_THRESHOLD_VALUE 0x1E
+
+/* Output Selection */
+#define CRT1 0x00
+#define CRT2 0x01
+#define DVI1 0x10
+#define DVI2 0x11
+#define LVDS1 0x20
+#define LVDS2 0x21
+
+/* Mode Limitation */
+#define MAX_HResolution 1600
+#define MAX_VResolution 1200
+
+/* Std. Table Index Definition */
+#define TextModeIndex 0
+#define EGAModeIndex 1
+#define VGAModeIndex 2
+#define HiCModeIndex 3
+#define TrueCModeIndex 4
+
+/* DCLK Index */
+#define VCLK25_175 0x00
+#define VCLK28_322 0x01
+#define VCLK31_5 0x02
+#define VCLK36 0x03
+#define VCLK40 0x04
+#define VCLK49_5 0x05
+#define VCLK50 0x06
+#define VCLK56_25 0x07
+#define VCLK65 0x08
+#define VCLK75 0x09
+#define VCLK78_75 0x0A
+#define VCLK94_5 0x0B
+#define VCLK108 0x0C
+#define VCLK135 0x0D
+#define VCLK157_5 0x0E
+#define VCLK162 0x0F
+#define VCLK119 0x10
+
+/* Flags Definition */
+#define Charx8Dot 0x00000001
+#define HalfDCLK 0x00000002
+#define DoubleScanMode 0x00000004
+#define LineCompareOff 0x00000008
+#define SyncPP 0x00000000
+#define SyncPN 0x00000040
+#define SyncNP 0x00000080
+#define SyncNN 0x000000C0
+#define HBorder 0x00000020
+#define VBorder 0x00000010
+#define COLORINDEX 0x00000000
+#define MONOINDEX 0x00000100
+
+/* DAC Definition */
+#define DAC_NUM_TEXT 64
+#define DAC_NUM_EGA 64
+#define DAC_NUM_VGA 256
+
+/* AST3000 Reg. Definition */
+#define AST3000_VGAREG_BASE 0x1e6e6000
+#define AST3000_VGA1_CTLREG 0x00
+#define AST3000_VGA1_CTLREG2 0x04
+#define AST3000_VGA1_STATUSREG 0x08
+#define AST3000_VGA1_PLL 0x0C
+#define AST3000_VGA1_HTREG 0x10
+#define AST3000_VGA1_HRREG 0x14
+#define AST3000_VGA1_VTREG 0x18
+#define AST3000_VGA1_VRREG 0x1C
+#define AST3000_VGA1_STARTADDR 0x20
+#define AST3000_VGA1_OFFSETREG 0x24
+#define AST3000_VGA1_THRESHOLD 0x28
+#define AST3000_HWC1_OFFSET 0x30
+#define AST3000_HWC1_XY 0x34
+#define AST3000_HWC1_PBase 0x38
+#define AST3000_OSD1_H 0x40
+#define AST3000_OSD1_V 0x44
+#define AST3000_OSD1_PBase 0x48
+#define AST3000_OSD1_Offset 0x4C
+#define AST3000_OSD1_THRESHOLD 0x50
+
+#define AST3000_VGA2_CTLREG 0x60
+#define AST3000_VGA2_CTLREG2 0x64
+#define AST3000_VGA2_STATUSREG 0x68
+#define AST3000_VGA2_PLL 0x6C
+#define AST3000_VGA2_HTREG 0x70
+#define AST3000_VGA2_HRREG 0x74
+#define AST3000_VGA2_VTREG 0x78
+#define AST3000_VGA2_VRREG 0x7C
+#define AST3000_VGA2_STARTADDR 0x80
+#define AST3000_VGA2_OFFSETREG 0x84
+#define AST3000_VGA2_THRESHOLD 0x88
+#define AST3000_HWC2_OFFSET 0x90
+#define AST3000_HWC2_XY 0x94
+#define AST3000_HWC2_PBase 0x98
+#define AST3000_OSD2_H 0xA0
+#define AST3000_OSD2_V 0xA4
+#define AST3000_OSD2_PBase 0xA8
+#define AST3000_OSD2_Offset 0xAC
+#define AST3000_OSD2_THRESHOLD 0xB0
+
+/* Data Structure */
+typedef struct {
+ UCHAR ModeName[20];
+ USHORT usModeIndex;
+ USHORT usModeID;
+ USHORT usColorIndex;
+ USHORT usRefreshRateIndex;
+ USHORT usWidth;
+ USHORT usHeight;
+ USHORT usBitsPerPlane;
+ USHORT usRefreshRate;
+} ModeInfoStruct;
+
+typedef struct {
+
+ UCHAR MISC;
+ UCHAR SEQ[4];
+ UCHAR CRTC[25];
+ UCHAR AR[20];
+ UCHAR GR[9];
+
+} VBIOS_STDTABLE_STRUCT, *PVBIOS_STDTABLE_STRUCT;
+
+typedef struct {
+
+ ULONG HT;
+ ULONG HDE;
+ ULONG HFP;
+ ULONG HSYNC;
+ ULONG VT;
+ ULONG VDE;
+ ULONG VFP;
+ ULONG VSYNC;
+ ULONG DCLKIndex;
+ ULONG Flags;
+
+ ULONG ulRefreshRate;
+ ULONG ulRefreshRateIndex;
+ ULONG ulModeID;
+
+} VBIOS_ENHTABLE_STRUCT, *PVBIOS_ENHTABLE_STRUCT;
+
+typedef struct {
+ UCHAR Param1;
+ UCHAR Param2;
+ UCHAR Param3;
+} VBIOS_DCLK_INFO, *PVBIOS_DCLK_INFO;
+
+typedef struct {
+ UCHAR DACR;
+ UCHAR DACG;
+ UCHAR DACB;
+} VBIOS_DAC_INFO, *PVBIOS_DAC_INFO;
+
+typedef struct {
+ PVBIOS_STDTABLE_STRUCT pStdTableEntry;
+ PVBIOS_ENHTABLE_STRUCT pEnhTableEntry;
+
+} VBIOS_MODE_INFO, *PVBIOS_MODE_INFO;
diff --git a/board/aspeed/ast2400/vhace.c b/board/aspeed/ast2400/vhace.c
new file mode 100755
index 0000000..d045cbd
--- /dev/null
+++ b/board/aspeed/ast2400/vhace.c
@@ -0,0 +1,66 @@
+/*
+ * 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
+ */
+#define HASH_GLOBALS
+#include "type.h"
+#include "vdef.h"
+#include "vhace.h"
+#include "vfun.h"
+
+void HashAst3000(ULONG ulLength, ULONG *output, ULONG ulHashMode)
+{
+ ULONG i, ulTemp, ulCommand, ulDigestLength;
+ ULONG ulValue;
+
+ /* Get Info */
+ switch (ulHashMode)
+ {
+ case VHASHMODE_MD5:
+ ulCommand = VHASH_ALG_SELECT_MD5;
+ ulDigestLength = 16;
+ break;
+ case VHASHMODE_SHA1:
+ ulCommand = VHASH_ALG_SELECT_SHA1;
+ ulDigestLength = 20;
+ break;
+ case VHASHMODE_SHA256:
+ ulCommand = VHASH_ALG_SELECT_SHA256;
+ ulDigestLength = 32;
+ break;
+ case VHASHMODE_SHA224:
+ ulCommand = VHASH_ALG_SELECT_SHA224;
+ ulDigestLength = 28;
+ break;
+ }
+
+ /* Init. HW */
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_SRC_BASE_OFFSET, g_HashSrcBuffer);
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_DST_BASE_OFFSET, g_HashDstBuffer);
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_LEN_OFFSET, ulLength);
+
+ /* write src */
+ //already fill in g_VIDEO1_COMPRESS_BUF_ADDR
+
+ /* fire cmd */
+ WriteMemoryLongHost(VHAC_REG_BASE, VREG_HASH_CMD_OFFSET, ulCommand);
+
+ /* get digest */
+ do {
+ ulTemp = ReadMemoryLongHost(VHAC_REG_BASE, VREG_HASH_STATUS_OFFSET);
+ } while (ulTemp & VHASH_BUSY);
+
+ for (i=0; i<ulDigestLength/4; i++)
+ {
+ ulValue = *(((ULONG *)g_HashDstBuffer) + i);
+
+ //output is ULONG pointer
+ *(output + i) = ulValue;
+ }
+}
diff --git a/board/aspeed/ast2400/vhace.h b/board/aspeed/ast2400/vhace.h
new file mode 100755
index 0000000..460989b
--- /dev/null
+++ b/board/aspeed/ast2400/vhace.h
@@ -0,0 +1,58 @@
+/*
+ * 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
+ */
+#ifndef _VHACE_H_
+#define _VHACE_H_
+
+#define VHASHMODE_MD5 0x00
+#define VHASHMODE_SHA1 0x01
+#define VHASHMODE_SHA256 0x02
+#define VHASHMODE_SHA224 0x03
+
+#define VHASH_ALG_SELECT_MASK 0x70
+#define VHASH_ALG_SELECT_MD5 0x00
+#define VHASH_ALG_SELECT_SHA1 0x20
+#define VHASH_ALG_SELECT_SHA224 0x40
+#define VHASH_ALG_SELECT_SHA256 0x50
+
+#define VHASH_BUSY 0x01
+
+#define VHAC_REG_BASE 0x1e6e0000
+#define VHAC_REG_OFFSET 0x3000
+
+#define VREG_HASH_SRC_BASE_OFFSET (0x20+VHAC_REG_OFFSET)
+#define VREG_HASH_DST_BASE_OFFSET (0x24+VHAC_REG_OFFSET)
+#define VREG_HASH_KEY_BASE_OFFSET (0x28+VHAC_REG_OFFSET)
+#define VREG_HASH_LEN_OFFSET (0x2C+VHAC_REG_OFFSET)
+#define VREG_HASH_CMD_OFFSET (0x30+VHAC_REG_OFFSET)
+
+#define VREG_HASH_STATUS_OFFSET (0x1C+VHAC_REG_OFFSET)
+
+typedef struct
+{
+ int HashMode;
+ int DigestLen;
+} HASH_METHOD;
+
+
+#ifdef HASH_GLOBALS
+#define HASH_EXT
+#else
+#define HASH_EXT extern
+#endif
+
+HASH_EXT HASH_METHOD g_HashMethod;
+HASH_EXT BYTE g_DigestBuf[32];
+HASH_EXT ULONG g_HashSrcBuffer;
+HASH_EXT ULONG g_HashDstBuffer;
+
+void HashAst3000(ULONG ulLength, ULONG *output, ULONG ulHashMode);
+#endif
+
diff --git a/board/aspeed/ast2400/videotest.c b/board/aspeed/ast2400/videotest.c
new file mode 100755
index 0000000..f2e4953
--- /dev/null
+++ b/board/aspeed/ast2400/videotest.c
@@ -0,0 +1,779 @@
+/*
+ * 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
+ */
+
+/*
+ * Diagnostics support
+ */
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <post.h>
+
+#include "slt.h"
+#define WIN_GLOBALS
+#include "type.h"
+#include "vreg.h"
+#define VESA_GLOBALS
+#include "vesa.h"
+#include "vfun.h"
+#include "vdef.h"
+#include "vhace.h"
+#include "crt.h"
+#include "videotest.h"
+
+#define VHASH_ALIGNMENT 16
+#define VHASH_MAX_DST (32+VHASH_ALIGNMENT)
+
+
+#if ((CFG_CMD_SLT & CFG_CMD_VIDEOTEST) && defined(CONFIG_SLT))
+#include "videotest.h"
+
+#define RAND_MAX 32767 //2^16-1
+
+ULONG randSeed = 1;
+
+void srand(ULONG seed)
+{
+ randSeed = seed;
+}
+
+int rand(void)
+{
+ randSeed = randSeed * 214013 + 2531011;
+ return (int)(randSeed >> 17); //32 -15 = 17
+}
+
+//static unsigned char CaptureVideo1Buf1Addr[VIDEO_SOURCE_SIZE], CaptureVideo1Buf2Addr[VIDEO_SOURCE_SIZE], Video1CompressBufAddr[CRYPTO_MAX_CONTEXT];
+ULONG pCaptureVideo1Buf1Addr[VIDEO_SOURCE_SIZE/4], pCaptureVideo1Buf2Addr[VIDEO_SOURCE_SIZE/4], pVideo1CompressBufAddr[VIDEO_MAX_STREAM_SIZE/4], pVideo1FlagBufAddr[VIDEO_FLAG_SIZE];
+ULONG pCaptureVideo2Buf1Addr[VIDEO_SOURCE_SIZE/4], pCaptureVideo2Buf2Addr[VIDEO_SOURCE_SIZE/4], pVideo2CompressBufAddr[VIDEO_MAX_STREAM_SIZE/4], pVideo2FlagBufAddr[VIDEO_FLAG_SIZE];
+
+ULONG pVHashDstBuffer[VHASH_MAX_DST/4];
+
+ULONG pVideo1DecAddr[VIDEO_SOURCE_SIZE/4];
+ULONG pCrt1Addr[VIDEO_SOURCE_SIZE/4];
+//ULONG pCap1Addr[VIDEO_SOURCE_SIZE/4];
+
+BOOL AllocateEncodeBufHost(ULONG MMIOBase, int nVideo)
+{
+ //ULONG Addr;
+ //ULONG dwRegOffset = nVideo * 0x100;
+
+ if (VIDEO1 == nVideo)
+ {
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo1Buf1Addr = malloc(VIDEO_SOURCE_SIZE);
+
+ g_CAPTURE_VIDEO1_BUF1_ADDR = vBufAlign((ULONG)pCaptureVideo1Buf1Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_1_ADDR_REG, g_CAPTURE_VIDEO1_BUF1_ADDR, BUF_1_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo1Buf2Addr = malloc(VIDEO_SOURCE_SIZE);
+
+ g_CAPTURE_VIDEO1_BUF2_ADDR = vBufAlign((ULONG)pCaptureVideo1Buf2Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, g_CAPTURE_VIDEO1_BUF2_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->uStreamBufSize.StreamBufSize.RingBufNum * pVideoInfo->uStreamBufSize.StreamBufSize.PacketSize)
+ //pVideo1CompressBufAddr = malloc(VIDEO_MAX_STREAM_SIZE);
+ g_VIDEO1_COMPRESS_BUF_ADDR = vBufAlign((ULONG)pVideo1CompressBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_ADDR_REG, g_VIDEO1_COMPRESS_BUF_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc((pVideoInfo->SrcHeigh/64) * pVideoInfo->SrcWidth * 8);
+ //g_VIDEO1_CRC_BUF_ADDR = vBufAlign((ULONG)malloc(VIDEO_MAX_STREAM_SIZE));
+ //WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CRC_BUF_ADDR_REG, g_VIDEO1_CRC_BUF_ADDR, BUF_2_ADDR_MASK);
+
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcHeigh * pVideoInfo->SrcWidth / 128 (/64*4/8));
+ //pVideo1FlagBufAddr = malloc(VIDEO_FLAG_SIZE);
+ g_VIDEO1_FLAG_BUF_ADDR = vBufAlign((ULONG)pVideo1FlagBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_FLAG_BUF_ADDR_REG, g_VIDEO1_FLAG_BUF_ADDR, BUF_2_ADDR_MASK);
+ }
+ else if (VIDEO2 == nVideo)
+ {
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo2Buf1Addr = malloc(VIDEO_SOURCE_SIZE);
+ g_CAPTURE_VIDEO2_BUF1_ADDR = vBufAlign((ULONG)pCaptureVideo2Buf1Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_BUF_1_ADDR_REG, g_CAPTURE_VIDEO2_BUF1_ADDR, BUF_1_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcWidth * pVideoInfo->SrcHeight * 4);
+ //pCaptureVideo2Buf2Addr = malloc(VIDEO_SOURCE_SIZE);
+ g_CAPTURE_VIDEO2_BUF2_ADDR = vBufAlign((ULONG)pCaptureVideo2Buf2Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_BUF_2_ADDR_REG, g_CAPTURE_VIDEO2_BUF2_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(pVideoInfo->uStreamBufSize.StreamBufSize.RingBufNum * pVideoInfo->uStreamBufSize.StreamBufSize.PacketSize)
+ //pVideo2CompressBufAddr = malloc(VIDEO_MAX_STREAM_SIZE);
+ g_VIDEO2_COMPRESS_BUF_ADDR = vBufAlign((ULONG)pVideo2CompressBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_COMPRESS_BUF_ADDR_REG, g_VIDEO2_COMPRESS_BUF_ADDR, BUF_2_ADDR_MASK);
+
+ //Addr = (ULONG)malloc((pVideoInfo->SrcHeigh/64) * pVideoInfo->SrcWidth * 8);
+ //g_VIDEO1_CRC_BUF_ADDR = vBufAlign((ULONG)malloc(VIDEO_MAX_STREAM_SIZE));
+ //WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CRC_BUF_ADDR_REG, g_VIDEO1_CRC_BUF_ADDR, BUF_2_ADDR_MASK);
+
+
+ //Addr = (ULONG)malloc(pVideoInfo->SrcHeigh * pVideoInfo->SrcWidth / 128 (/64*4/8));
+ //pVideo2FlagBufAddr = malloc(VIDEO_FLAG_SIZE);
+ g_VIDEO2_FLAG_BUF_ADDR = vBufAlign((ULONG)pVideo2FlagBufAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO2_FLAG_BUF_ADDR_REG, g_VIDEO2_FLAG_BUF_ADDR, BUF_2_ADDR_MASK);
+ }
+
+}
+
+/********************************************************/
+/* 1. product random data to encode */
+/* 2. use hash to verify encode function */
+/* 3. use encode stream to decompress original data */
+/********************************************************/
+int CodecTest(void)
+{
+ int num, i=0, j=0;
+ ULONG ulTemp = 0, ulTemp2;
+ int dwValue;
+ ULONG ulHWWp;
+ ULONG ulHWPt;
+
+ //max size
+ ULONG tArray[32/4];
+
+ //mode detection
+ BOOL bExternal = TRUE;
+ BOOL bAnalog = TRUE;
+ ULONG Status;
+
+#if defined(CONFIG_AST2300)
+ ULONG ulHashSha1[5] = {0x3f0c2ad6,0xc8eb7074,0xa9929352,0xfcd5b8b0,0x76fa8461};
+ ULONG aHashDecode[5] = {0xb23b62bb,0xd22a602b,0x113038a0,0x7217c6ab,0xcb156f06};
+#else
+ ULONG ulHashSha1[5] = {0x2a19e99f,0x99b1bb2d,0x9ac82862,0x49205e43,0x6bc4b4d7};
+ ULONG aHashDecode[5] = {0x2907a827,0xaf337079,0x47817f1f,0xb0b7cd68,0x8d33bd2};
+#endif
+
+ //Load pattern to src1 & src2 buffer
+ srand(1);
+
+ //Total size : DefWidth*DeHeight*4
+ //rand function: 16 bits one time is equal to 2 bytes
+ //OutdwmBankMode: 32 bits one time is equal to 4 bytes
+ for (i=0; i<g_DefWidth*g_DefHeight*2; i++)
+ {
+ if (i%2)
+ {
+ ulTemp2 = rand();
+ ulTemp = (ulTemp2 << 16) | ulTemp;
+ //WriteMemoryLongHost(DRAM_BASE, g_CAPTURE_VIDEO1_BUF1_ADDR + ((i-1)/2)*4, ulTemp);
+ *(((ULONG *)g_CAPTURE_VIDEO1_BUF1_ADDR) + (i-1)/2) = ulTemp;
+ ulTemp = 0;
+ }
+ else
+ {
+ ulTemp = rand();
+ }
+ }
+
+ /* init encoder engine */
+ InitializeVideoEngineHost (0,
+ VIDEO1,
+ vModeTable[2].HorPolarity,
+ vModeTable[2].VerPolarity);
+
+ /* reset offset pointer register*/
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, 0, VIDEO_CODEC_TRIGGER | VIDEO_CAPTURE_TRIGGER);
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_READ_OFFSET_REG, 0, COMPRESS_BUF_READ_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ, 0, BUF_CODEC_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_PROCESS_OFFSET_REG, 0, COMPRESS_BUF_PROCESS_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_FRAME_END_READ, 0, COMPRESS_FRAME_END_READ_MASK);
+
+ /* start compress stream */
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, MODE_DETECTION_TRIGGER, MODE_DETECTION_TRIGGER);
+ //Stream mode: set CODEC trigger first
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, VIDEO_CODEC_TRIGGER, VIDEO_CODEC_TRIGGER);
+
+ //Stream mode: start trigger (only trigger capture bit)
+ StartVideoCaptureTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+
+ //stop engine
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, 0, 0xFF);
+#if defined(CONFIG_AST2300)
+ do { /* wait compress engine idle */
+ ulTemp = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+ } while (!(ulTemp & 0x40000));
+#endif
+
+ //read 30 times to get HW write pointer
+ for (i=0; i<30000; i++)
+ ulHWWp = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ);
+
+ g_HashSrcBuffer = g_VIDEO1_COMPRESS_BUF_ADDR + 128; //skip encode data 128 byte
+ g_HashDstBuffer = v16byteAlign((unsigned long)pVHashDstBuffer);
+ ulTemp = 300;
+
+ //Enable hash clock
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_HACE, STOP_HACE_MASK);
+ g_HashMethod.HashMode = VHASHMODE_SHA1;
+ g_HashMethod.DigestLen = 20;
+ HashAst3000(ulTemp, tArray, g_HashMethod.HashMode);
+
+ if (strncmp((const char *)tArray, (const char *)ulHashSha1, g_HashMethod.DigestLen))
+ {
+ printf("[VIDEO] Encoder Test: Wrong\n");
+ //ExitVideoTest();
+ return VIDEO_ENCODE_FAIL;
+ }
+ else
+ {
+ printf("[VIDEO] Encoder Test: Pass\n");
+ }
+
+#if 0
+ /******** prepare for next decoding test at the same chip ***********/
+ ResetVideoHost();
+
+ dwValue=0;
+
+ do
+ {
+ dwValue = UnlockVideoRegHost(0, VIDEO_UNLOCK_KEY);
+ i++;
+ }
+ while ((VIDEO_UNLOCK != dwValue) && (i<10));
+
+ if (VIDEO_UNLOCK != dwValue)
+ {
+ printf("[VIDEO] Video register is locked");
+ return VIDEO_UNLOCK_FAIL;
+ }
+
+ // allocate decoding buffer
+ //Use Compress buffer last time, and Don't need to allocate
+ g_VIDEO1_DECODE_BUF_1_ADDR = g_VIDEO1_COMPRESS_BUF_ADDR;
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_1_ADDR_REG, g_VIDEO1_DECODE_BUF_1_ADDR, BUF_1_ADDR_MASK);
+
+ // pVideo1DecAddr = malloc(VIDEO_SOURCE_SIZE);
+ g_VIDEO1_DECOMPRESS_BUF_ADDR = vBufAlign((unsigned long)pVideo1DecAddr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_ADDR_REG, g_VIDEO1_DECOMPRESS_BUF_ADDR, COMPRESS_BUF_ADDR_MASK);
+
+ //Addr = (ULONG)malloc(256);
+ //g_VIDEO1_RC4_BUF_ADDR = Addr;
+ //g_VIDEO1_DECODE_RC4_BUF_ADDR = g_VIDEO1_DECOMPRESS_BUF_ADDR + 0x800000; //assume video size is 8MB for umcompressed buf;
+ //WriteMemoryLongWithMASKClient(VIDEO_REG_BASE, VIDEO1_RC4_TABLE_ADDR, g_VIDEO1_DECODE_RC4_BUF_ADDR, RC4_TABLE_ADDR_MASK);
+
+ //HW recommanded value
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, g_VIDEO1_DECOMPRESS_BUF_ADDR, BUF_2_ADDR_MASK);
+ //WriteMemoryLongWithMASKClient(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, 0, BUF_2_ADDR_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CRC_BUF_ADDR_REG, 0, BUF_2_ADDR_MASK);
+
+ /* init encoder engine */
+ InitializeVideoEngineClient (0, VIDEO1);
+
+ /* reset offset pointer register*/
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, 0, VIDEO_CODEC_TRIGGER | VIDEO_CAPTURE_TRIGGER);
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_READ_OFFSET_REG, 0, COMPRESS_BUF_READ_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ, 0, BUF_CODEC_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_BUF_PROCESS_OFFSET_REG, 0, COMPRESS_BUF_PROCESS_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_COMPRESS_FRAME_END_READ, 0, COMPRESS_FRAME_END_READ_MASK);
+
+ StartVideoCodecTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+
+ //wrtie SW write pointer
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_DECOMPRESS_BUF_PROCESS_OFFSET_REG, ulHWWp, COMPRESS_BUF_READ_OFFSET_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_DECOMPRESS_BUF_WRITE_OFFSET_REG, ulHWWp, COMPRESS_BUF_READ_OFFSET_MASK);
+
+ i = 0;
+
+ do
+ {
+ ulHWPt = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_BUF_CODEC_OFFSET_READ);
+ i++;
+ }while((ulHWPt != ulHWWp) && (i<10000));
+
+ if (10000 > i)
+ {
+ printf("[VIDEO] Decoder Pointer cannot move!!! /n");
+ //ExitVideoTest();
+ return VIDEO_DECODE_FAIL;
+ }
+
+ //8*8 YUVA block
+ for (i=24; i<g_DefWidth*g_DefHeight; i=i+32)
+ {
+ *(((ULONG *)g_VIDEO1_DECOMPRESS_BUF_ADDR) + i) = 0x0;
+ *(((ULONG *)g_VIDEO1_DECOMPRESS_BUF_ADDR) + i+1) = 0x0;
+ }
+
+ g_HashSrcBuffer = g_VIDEO1_DECOMPRESS_BUF_ADDR;
+ //g_HashDstBuffer = VIDEO1_EN_BASE + VIDEO_ALL_SIZE; //config forward
+
+ ulTemp = 300;
+
+ //Enable hash clock
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, EN_HACE, STOP_HACE_MASK);
+ g_HashMethod.HashMode = VHASHMODE_SHA1;
+ g_HashMethod.DigestLen = 20;
+ HashAst3000(ulTemp, tArray, g_HashMethod.HashMode);
+
+ if (strncmp((const char *)tArray, (const char *)aHashDecode, g_HashMethod.DigestLen))
+ {
+ printf("[VIDEO] Decoder Test: Wrong\n");
+ //ExitVideoTest();
+ return VIDEO_DECODE_FAIL;
+ }
+ else
+ {
+ printf("[VIDEO] Decoder Test: Pass\n");
+ }
+#endif
+
+ return VIDEO_TEST_OK;
+}
+
+/********************************************************/
+/* Only used in the host */
+/* test function: Mode detection and Capture pattern */
+/********************************************************/
+int CapTest(void)
+{
+ ULONG dwValue, Status;
+ int i;
+ BOOL bAnalog;
+ ULONG HStart, HEnd, VStart, VEnd;
+ USHORT usCRTHor, usCRTVer;
+ ULONG ulHor, ulVer;
+ ULONG ulVGABaseAddr, ulCapAddr;
+ ULONG ulFlag;
+
+ printf("\n --------- Mode Detection Test --------- \n");
+ //clear clear register
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG, 0);
+ dwValue = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG);
+
+ // Note: Current mode detection procedure has to set signal input 1st
+ //Note: Clear and enable interrupt Encode
+ ClearVideoInterruptHost(0, VIDEO1_MODE_DETECTION_READY_CLEAR);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_INT_CONTROL_EN_REG, VIDEO1_MODE_DETECTION_READY_INT_EN, VIDEO1_MODE_DETECTION_READY_INT_EN);
+ // Set input signal
+ dwValue |= EXTERNAL_VGA_SOURCE;
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_CONTROL_REG, (dwValue <<EXTERNAL_SOURCE_BIT), EXTERNAL_SOURCE_MASK);
+
+// Set H/V stable maximum
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_VERTICAL_STABLE_MAXIMUM << VER_STABLE_MAX_BIT), 0x000F0000);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_HORIZONTAL_STABLE_MAXIMUM << HOR_STABLE_MAX_BIT), HOR_STABLE_MAX_BIT_MASK);
+// Set H/V stable threshold
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_VERTICAL_STABLE_THRESHOLD << VER_STABLE_THRES_BIT), VER_STABLE_THRES_BIT_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO_MODE_DETECTION_PARAM_REG, (MODEDETECTION_HORIZONTAL_STABLE_THRESHOLD << HOR_STABLE_THRES_BIT), HOR_STABLE_THRES_BIT_MASK);
+
+ //Trigger mode detection
+ // turn off WATCH_DOG first
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, (WATCH_DOG_OFF << WATCH_DOG_ENABLE_BIT), WATCH_DOG_EN_MASK);
+
+ // Note: Clear mode detection ready interrupt
+ //ClearVideoInterrupt(MMIOBase, MODE_DETECTION_READY_CLEAR);
+ StartModeDetectionTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+
+
+// Note: Polling mode detection ready interrupt
+ //it sometime take a long time, especially during change mode,
+ //so the loop count must be big, or you can't pull it by timer
+ i = 0;
+ do {
+
+ Status = ReadVideoInterruptHost(0, VIDEO1_MODE_DETECTION_READY_READ);
+ i++;
+ } while ((!Status) & (i<500000));
+
+ if (!Status)
+ {
+ printf("[VIDEO] Mode detection error\n");
+ //ExitVideoTest();
+ return VIDEO_TEST_FAIL;
+ }
+
+ HStart = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_H_REG) & LEFT_EDGE_LOCATION_MASK) >> LEFT_EDGE_LOCATION_BIT;
+ HEnd = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_H_REG) & RIGHT_EDGE_LOCATION_MASK) >> RIGHT_EDGE_LOCATION_BIT;
+
+ VStart = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_V_REG) & TOP_EDGE_LOCATION_MASK) >> TOP_EDGE_LOCATION_BIT;
+ VEnd = (ReadMemoryLongHost(VIDEO_REG_BASE, VIDE1_MODE_DETECTION_EDGE_V_REG) & BOTTOM_EDGE_LOCATION_MASK) >> BOTTOM_EDGE_LOCATION_BIT;
+
+ ulHor = HEnd-HStart+1;
+ ulVer = VEnd-VStart+1;
+
+ printf("[VIDEO] Resolution: H[%d] * V[%d]\n", ulHor, ulVer);
+
+ if ((g_DefWidth == ulHor) & (g_DefHeight == ulVer))
+ {
+ printf("[VIDEO] Mode detection PASS\n");
+ }
+ else
+ {
+ printf("[VIDEO] Mode detection FAIL\n");
+ return VIDEO_TEST_FAIL;
+ }
+
+ if(!((ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_MODE_DETECTION_STATUS_READ_REG) & ANALONG_DIGITAL_READ) >> ANALONG_DIGITAL_READ_BIT))
+ bAnalog = FALSE;
+ else
+ bAnalog = TRUE;
+
+ // Note: Clear mode detection ready interrupt
+ ClearVideoInterruptHost(0, VIDEO1_MODE_DETECTION_READY_CLEAR);
+
+ printf("\n --------- Capture Test --------- \n");
+
+ //capture engine
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_HOR_REG, (HEnd << VIDEO_HDE_END_BIT), VIDEO_HDE_END_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_HOR_REG, (HStart << VIDEO_HDE_START_BIT), VIDEO_HDE_START_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_V_REG, (VEnd << VIDEO_VDE_END_BIT), VIDEO_VDE_END_MASK);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_V_REG, (VStart << VIDEO_VDE_START_BIT), VIDEO_VDE_START_MASK);
+
+ ulCapAddr = vBufAlign2((ULONG)pCaptureVideo1Buf1Addr);
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_1_ADDR_REG, ulCapAddr, BUF_1_ADDR_MASK);
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_BUF_2_ADDR_REG, 0, BUF_2_ADDR_MASK);
+
+ InitializeVideoEngineHost (0,
+ VIDEO1,
+ vModeTable[2].HorPolarity,
+ vModeTable[2].VerPolarity);
+
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x04, 0x01);
+ WriteMemoryLongHost(VIDEO_REG_BASE, 0x300, 0x0);
+#if defined(CONFIG_AST2300)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, 0x8, 0x0880, 0x0ec0);
+#elif defined(CONFIG_AST3000)
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, 0x8, 0x2800, 0x2800);
+#else
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, 0x8, 0xa00, 0x2a80); //tile mode
+#endif
+
+ WriteMemoryLongWithMASKHost(VIDEO_REG_BASE, VIDEO1_TIMEING_GEN_HOR_REG, 0xa0000000, 0xa0000000);
+
+ //only trigger capture, in source buffer (vr44), the front of data is correct.
+ //StartVideoCaptureTriggerHost(0, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG);
+ WriteMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG, VIDEO_CAPTURE_TRIGGER);
+
+ i = 0;
+ do {
+ Status = ReadMemoryLongHost(VIDEO_REG_BASE, VIDEO1_ENGINE_SEQUENCE_CONTROL_REG) & CAPTURE_READY_MASK;
+ i++;
+ } while ((!Status) & (i<500000));
+
+ if (!Status)
+ {
+ printf("[VIDEO] Capture is not READY\n");
+ return VIDEO_TEST_FAIL;
+ }
+
+#if !defined(CONFIG_AST2300)
+ ulVGABaseAddr = ulCapAddr + 0x1000;
+
+ /* check pattern */
+ ulFlag = 0; //no 0 is error
+
+ for (i=0; i<100; i++)
+ {
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32);
+ if (0x32323232 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("[VIDEO]1 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 4);
+ if (0x32323232 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("[VIDEO]2 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 8);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("[VIDEO]3 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 12);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("4 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 16);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("5 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+
+ dwValue = *(ULONG *)(ulVGABaseAddr + i*32 + 20);
+ if (0x80808080 != dwValue)
+ {
+ printf("[VIDEO] Capture Test fail -- capture data doesn't match source \n");
+ printf("6 i=%d value=%x\n", i, dwValue);
+ ulFlag = 1;
+ break;
+ }
+ }
+#endif
+
+ if (!ulFlag)
+ {
+ printf("[VIDEO] Capture Test OK\n");
+ }
+ else
+ {
+ printf("[VIDEO] Capture Test FAIL\n");
+ return VIDEO_TEST_FAIL;
+ }
+
+ return VIDEO_TEST_OK;
+}
+
+/********************************************************/
+/* Only used in the station */
+/********************************************************/
+int CRTTest(void)
+{
+ ULONG ulVGABaseAddr;
+ BYTE btCRTCenterMode, btCRTColorFmt;
+ USHORT usCRTHor, usCRTVer;
+ ULONG ulData;
+
+ int i,j;
+
+ //printf("\n --------- Turn on CRT --------- \n");
+
+ //Enable CRT1 first
+ ulVGABaseAddr = vBufAlign((unsigned long)pCrt1Addr);
+
+ btCRTCenterMode = 0;
+ btCRTColorFmt = YUV_444;
+ usCRTHor = g_DefWidth;
+ usCRTVer = g_DefHeight;
+
+ CheckOnStartClient();
+
+ /* Fill Pattern */
+ for (i=0; i<usCRTHor; i++)
+ {
+ for (j=0; j<usCRTVer/8; j++)
+ {
+ //Y
+ //ulData = 0x10101010;
+ ulData = 0x32323232;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32)) = ulData;
+ //ulData = 0x10101010;
+ ulData = 0x32323232;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +4) = ulData;
+ //U
+ ulData = 0x80808080;
+ //ulData = 0x77777777;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +8) = ulData;
+ ulData = 0x80808080;
+ //ulData = 0x77777777;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +12) = ulData;
+ //V
+ ulData = 0x80808080;
+ //ulData = 0x11111111;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +16) = ulData;
+ ulData = 0x80808080;
+ //ulData = 0x11111111;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +20) = ulData;
+ //A
+ ulData = 0xFFFFFFFFF;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +24) = ulData;
+ ulData = 0xFFFFFFFFF;
+ *(ULONG *)(ulVGABaseAddr + (i*usCRTVer*4+j*32) +28) = ulData;
+ }
+ } /* ~Fill Pattern */
+
+#if defined(CONFIG_AST2300)
+ if(!ASTSetModeV (0, CRT_2, ulVGABaseAddr, usCRTHor, usCRTVer, btCRTColorFmt, btCRTCenterMode))
+#else
+ if(!ASTSetModeV (0, CRT_1, ulVGABaseAddr, usCRTHor, usCRTVer, btCRTColorFmt, btCRTCenterMode))
+#endif
+ {
+ printf("[VIDEO] The resolution is not in mode table list\n");
+ return CRT_FAIL;
+ }
+
+ //printf("[VIDEO] CRT turn on\n");
+
+ return VIDEO_TEST_OK;
+}
+
+int do_videotest (void)
+{
+ int dwValue=0;
+ int i = 0;
+ int iRet;
+ ULONG ulRestore1, ulTemp;
+ BOOL bClient;
+
+
+ //InitVideoTest();
+ g_DefWidth = 640;
+ g_DefHeight= 480;
+
+ printf("\n --------- Codec Test --------- \n");
+
+#if defined(CONFIG_AST2300)
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, 0x00002000, 0x00002000);
+#endif
+
+ CheckOnStartHost();
+
+ do
+ {
+ dwValue = UnlockVideoRegHost(0, VIDEO_UNLOCK_KEY);
+ i++;
+ }
+ while ((VIDEO_UNLOCK != dwValue) && (i<1000));
+
+ if (VIDEO_UNLOCK != dwValue)
+ {
+ printf("[VIDEO] Video register is locked \n");
+ return VIDEO_TEST_FAIL;
+ }
+ AllocateEncodeBufHost(0, VIDEO1);
+
+ iRet = CodecTest();
+ if (iRet)
+ return VIDEO_TEST_FAIL;
+
+#if defined(CONFIG_AST2300)
+ /* Init SCU */
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x2c + SCU_OFFSET), 0x00040000, 0x00040010); /* Enable D2-PLL */
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CLOCK_STOP_REG, 0, 0x00000400); /* Enable D2CLK */
+ udelay(10);
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_CONTROL_REG, 0, 0x00002000);
+
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x90 + SCU_OFFSET), 0x20, 0x00000030); /* enable video mode single edge */
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x84 + SCU_OFFSET), 0xfffe0000, 0xfffe0000); /* multi-pins */
+ WriteMemoryLongWithMASKHost(SCU_BASE, (0x88 + SCU_OFFSET), 0x000fffff, 0x000fffff); /* multi-pins */
+
+ iRet = CRTTest();
+ if (iRet)
+ {
+ printf("[VIDEO] CRT Test Failed \n");
+ return VIDEO_TEST_FAIL;
+ }
+
+ iRet = CapTest();
+ if (iRet)
+ {
+ printf("[VIDEO] Capture Test Failed \n");
+ return VIDEO_TEST_FAIL;
+ }
+#else
+ //Host or Client
+ bClient = ((ReadMemoryLong(SCU_BASE, SCU_HW_TRAPPING_REG) & CLIENT_MODE_EN_MASK)?TRUE:FALSE);
+ //reset video for another testing
+ ResetVideoHost();
+ dwValue=0;
+ i = 0;
+ do
+ {
+ dwValue = UnlockVideoRegHost(0, VIDEO_UNLOCK_KEY);
+ i++;
+ }
+ while ((VIDEO_UNLOCK != dwValue) && (i<10));
+
+ if (VIDEO_UNLOCK != dwValue)
+ {
+ printf("[VIDEO] Video register is locked");
+ return VIDEO_UNLOCK_FAIL;
+ }
+
+ //check if 1e6e0008[3,0] is 0
+ ulRestore1 = ReadMemoryLongHost(0x1e6e0000, 8);
+ dwValue = ReadMemoryLongHost(0x1e6e0000, 8)&0xF;
+
+ //set 1e6e0008[3,0] to 0
+ if (dwValue)
+ {
+ WriteMemoryLongHost(0x1e6e0000, 0, 0xfc600309);
+
+ i=0;
+ do
+ {
+ i++;
+ dwValue = ReadMemoryLongHost(0x1e6e0000,0);
+ }while((1 != dwValue)&& (i<10));
+
+ if (1 != dwValue)
+ {
+ printf("0x1e6e0000 is locked");
+ return VIDEO_UNLOCK_FAIL;
+ }
+ }
+
+ //only clear 1e6e0008[3,0]
+ WriteMemoryLongWithMASKHost(0x1e6e0000, 8, 0, 0xf);
+
+ bClient = 0;
+ if (!bClient)
+ {
+ //To turn on crt, must be the client mode
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_CLIENT_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+
+ iRet = CRTTest();
+
+ if (iRet)
+ {
+ //trapping to host, the Vsync of CRT can't output and the host doesn't have video sync input
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ //restore value
+ WriteMemoryLongHost(0x1e6e0000, 8, ulRestore1);
+ //lock register
+ WriteMemoryLongHost(0x1e6e0000, 0, 0x12345678);
+ return VIDEO_TEST_FAIL;
+ }
+
+ iRet = CapTest();
+
+ if (iRet)
+ {
+ //trapping to host, the Vsync of CRT can't output and the host doesn't have video sync input
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ //restore value
+ WriteMemoryLongHost(0x1e6e0000, 8, ulRestore1);
+ //lock register
+ WriteMemoryLongHost(0x1e6e0000, 0, 0x12345678);
+
+ return VIDEO_TEST_FAIL;
+ }
+ //WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ }
+ //trapping to host, the Vsync of CRT can't output and the host doesn't have video sync input
+ WriteMemoryLongWithMASKHost(SCU_BASE, SCU_HW_TRAPPING_REG, (BE_HOST_CHIP << CLIENT_MODE_EN_BIT), CLIENT_MODE_EN_MASK);
+ //restore value
+ WriteMemoryLongHost(0x1e6e0000, 8, ulRestore1);
+ //lock register
+ WriteMemoryLongHost(0x1e6e0000, 0, 0x12345678);
+#endif
+
+ return VIDEO_TEST_OK;
+}
+#endif /* CONFIG_SLT */
diff --git a/board/aspeed/ast2400/videotest.h b/board/aspeed/ast2400/videotest.h
new file mode 100755
index 0000000..79b8dd9
--- /dev/null
+++ b/board/aspeed/ast2400/videotest.h
@@ -0,0 +1,24 @@
+/*
+ * 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
+ */
+/* VideoTest.h */
+#ifndef _VIDEOTEST_H_
+#define _VIDEOTEST_H_
+
+#define VIDEO_TEST_OK 0
+#define VIDEO_TEST_FAIL 1
+
+#define VIDEO_UNLOCK_FAIL 1
+#define VIDEO_ENCODE_FAIL 2
+#define VIDEO_DECODE_FAIL 3
+#define CRT_FAIL 4
+
+#endif /* _VIDEOTEST_H_ */
+
diff --git a/board/aspeed/ast2400/vreg.h b/board/aspeed/ast2400/vreg.h
new file mode 100755
index 0000000..9738548
--- /dev/null
+++ b/board/aspeed/ast2400/vreg.h
@@ -0,0 +1,845 @@
+/*
+ * 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
+ */
+#ifndef _VREG_H_
+#define _VREG_H_
+
+/********************************************************/
+/* CRT register */
+/********************************************************/
+#define CRT_BASE_ADDRESS 0x000400
+#define VGA_GRAPH_BASE_ADDRESS 0x600000
+#define VGA_CURSOR_BASE_ADDRESS 0x300000
+#define VGA_OSD_BASE_ADDRESS 0x300000
+#define RGB_565 0x0
+#define RGB_888 0x1
+#define YUV_444 0x2
+#define NO_SUPPORTED_CRT_FMT 0x3
+#define CRT_LOW_THRESHOLD_VALUE 0x12
+#define CRT_HIGH_THRESHOLD_VALUE 0x1E
+
+// AST3000's Registers
+#ifdef Watcom
+#define VIDEOBASE_OFFSET 0x10000
+#else
+#define VIDEOBASE_OFFSET 0x0
+#endif
+
+#define KEY_CONTROL_REG 0x00 + VIDEOBASE_OFFSET
+ #define VIDEO_LOCKED 0
+ #define VIDEO_UNLOCK 1
+
+// Registers for video1 and video2
+#define VIDEO1_ENGINE_SEQUENCE_CONTROL_REG 0x04 + VIDEOBASE_OFFSET
+#define VIDEO2_ENGINE_SEQUENCE_CONTROL_REG 0x104 + VIDEOBASE_OFFSET
+ #define MODE_DETECTION_TRIGGER 0x00000001 //Bit[0] trigger HW auto mode detection
+ #define VIDEO_CAPTURE_TRIGGER 0x00000002 //Bit[1] trigger HW to capture video
+ #define FORCE_HW_IDLE_MASK (1<<2) //Bit[2] Force engine into ready(idle) state
+ #define ENGINE_RESET (0<<2)
+ #define ENGINE_IDLE (1<<2)
+ #define VIDEO_CAPTURE_AUTO_MODE 0x00000008 //Bit[3]
+ #define CAPTURE_FRAME_MODE 0
+ #define CAPTURE_AUTO_MODE 1
+ #define CAPTURE_AUTO_MODE_BIT 3
+ #define CAPTURE_AUTO_MODE_MASK 0x00000008
+ #define VIDEO_CODEC_TRIGGER 0x00000010 //Bit[4] trigger HW to compress or decompress video
+ #define CODEC_TRIGGER_BIT 4
+ #define CODEC_TRIGGER_MASK 0x00000010
+ #define CLEAR_CODEC_TRIGGER 0
+ #define EN_CODEC_TRIGGER 1
+ #define VIDEO_CODEC_AUTO_MODE 0x00000020 //Bit[5]
+ #define CODEC_FRAME_MODE 0
+ #define CODEC_AUTO_MODE 1
+ #define CODEC_AUTO_MODE_BIT 5
+ #define CODEC_AUTO_MODE_MASK 0x00000020
+ #define INSERT_FULL_FRAME_MASK (1<<6) //Bit[6] Insert full frame compression
+ #define INSERT_FULL_FRAME_EN (1<<6)
+ #define INSERT_FULL_FRAME_OFF (0<<6)
+ #define WATCH_DOG_ENABLE 0x00000080 //Bit[7] Video Enable watch dog for mode change detection
+ #define WATCH_DOG_ENABLE_BIT 7
+ #define WATCH_DOG_OFF 0
+ #define WATCH_DOG_EN 1
+ #define WATCH_DOG_EN_MASK 0x00000080
+ #define VIDEO_CRT_SELECTION 0x00000100 //Bit[8]
+ #define CRT1 0
+ #define CRT2 1
+ #define ANTI_TEARING_ENABLE 0x00000200 //Bit[9] Anti-tearing mode enable for decoding
+ #define ANTI_TEARING_EN 1
+ #define STREAM_DATA_MODE 0x00000400 //Bit[11:10] Buffer and Stream Data type
+ #define STREAM_DATA_MODE_BIT 10
+ #define STREAM_DATA_MODE_MASK 0x00000C00
+ #define YUV444_MODE 0
+ #define YUV420_MODE 1
+ #define YUV420_MODE_WITH_AST2000 2 //AST2000 compatible
+ #define VIDEO_CAPTURE_READY 0x00010000 //Bit[16] Video capture ready status read back(read only)
+ #define CAPTURE_READY_MASK 0x00010000
+ #define HW_BUSY 0
+ #define HW_IDLE 1
+ #define VIDEO_CODEC_READY 0x00040000 //Bit[18] Video codec ready status read back(read only)
+ #define CODEC_READY_MASK 0x00040000
+ //#define HW_BUSY 0
+ //#define HW_IDLE 1
+
+#define VIDEO1_CONTROL_REG 0x08 + VIDEOBASE_OFFSET
+#define VIDEO2_CONTROL_REG 0x108 + VIDEOBASE_OFFSET
+ #define VIDEO_HSYNC_POLARITY 0x00000001 //Bit[0] Video source hsync polarity
+ #define VIDEO_HSYNC_POLARITY_BIT 0
+ #define NO_INVERSE_POL 0
+ #define INVERSE_POL 1
+ #define VIDEO_VSYNC_POLARITY 0x00000002 //Bit[1] Video source vsync polarity
+ #define VIDEO_VSYNC_POLARITY_BIT 1
+ //Setting defination the same as VIDEO_HSYNC_POLARITY
+ #define VIDEO_EXTERNAL_SOURCE 0x00000004 //Bit[2] Video external source
+ #define EXTERNAL_SOURCE_BIT 2
+ #define INTERNAL_VGA_SOURCE 0
+ #define EXTERNAL_VGA_SOURCE 1
+ #define EXTERNAL_SOURCE_MASK 0x00000004
+ #define VIDEO_ANALONG_EXTERNAL_SOURCE 0x00000008 //Bit[3] Video Analog external source
+ #define ANALONG_EXTERNAL_SOURCE_BIT 3
+ #define DVI_SOURCE 0
+ #define ANALOG_RGB_SOURCE 1
+ #define VIDEO_INTERNAL_TIMING_GEN 0x00000010 //Bit[4] Video Use internal timing generator
+ #define INTERNAL_TIMING_GEN_BIT 4
+ #define EXTERNAL_DE_SIGNAL 0 //DVI only
+ #define VR0C_VR10_DE_SINGAL 1 //use VR0C and VR10 for generate VDE signal
+ /****** Video2 Only from DAC ******/
+ #define VIDEO1_CAPTURE_FROM 0x00000020 //Bit[5] Video1 capture data direct from VGA frame buffer(internal VGA only)
+ #define FROM_DAC_PORT 0
+ #define FROM_FRAME_BUFFER 1
+ #define WRITE_DATA_FORMAT 0x00000040 //Bit[7:6] Write data format
+ #define WRITE_DATA_FORMAT_BIT 6
+ #define WRTIE_DATA_FORMAT_MASK 0x000000C0
+ #define CCIR601_2_YUV_FORMAT 0
+ #define FULL_YUV_FORMAT 1
+ #define RGB_FORMAT 2
+ #define VGA_CURSOR_DISABLE 0x00000100 //Bit[8] External video port slection
+ #define VGA_CURSOR_NORMAL 0
+ #define VGA_CURSOR_OFF 1
+ #define VIDEO_CAPTURE_LINEAR_MODE 0x00000200 //Bit[9] VIDEO_CAPTURE_LINEAR_MODE
+ #define LINEAR_MODE 0
+ #define TILE_MODE 1
+ #define VIDEO_CLOCK_DELAY 0x00000400 //Bit[11:10] Video clock delay control
+ #define VIDEO_CLOCK_DELAY_BIT 10
+ #define VIDEO_CLOCK_DELAY_MASK 0x00000C00
+ #define DELAY_0_NS 0
+ #define DELAY_1_NS 1
+ #define INV_AND_DELAY_0_NS 2
+ #define INV_AND_DELAY_1_NS 3
+ #define VIDEO_CCIR656_SOURCE_MODE 0x00001000 //Bit[12] Video CCIR656 source mode
+ #define RGB_SOURCE_MODE 0
+ #define CCIR656_SOURCE_MODE 1
+ #define SOURCE_PORT_CLOCK_MODE 0x00002000 //Bit[13] Video Source port clock mode
+ #define SINGLE_EDGE_MODE 0
+ #define DUAL_EDGE_MODE 1
+ #define EXTERNAL_PORT_SELECTION 0x00004000 //Bit[14] External video port slection
+ #define VIDEO_PORT_A 0
+ #define VIDEO_PORT_B 1
+ #define VIDEO_CAPTURE_FRAME_RATE 0x00010000 //Bit[23:16] Video capture frame rate control
+ #define VIDEO_CAPTURE_FRAME_RATE_BIT 16
+ #define VIDEO_CAPTURE_FRAME_RATE_MASK 0x00FF0000 //Maximum frame rate = XX * SourceFPS / 60
+
+#define VIDEO1_TIMEING_GEN_HOR_REG 0x0C + VIDEOBASE_OFFSET
+#define VIDEO2_TIMEING_GEN_HOR_REG 0x10C + VIDEOBASE_OFFSET
+ #define VIDEO_HDE_END 0x00000000 //Bit[12:0] Video HDE End timing generator
+ #define VIDEO_HDE_END_BIT 0 //Number of pixels from rising edge of Hsync for first active pixel
+ #define VIDEO_HDE_END_MASK 0x00001FFF
+ #define VIDEO_HDE_START 0x00010000 //Bit[28:16] Video HDE Start timing generator
+ #define VIDEO_HDE_START_BIT 16 //Number of pixels from rising edge of Hsync for last active pixel
+ #define VIDEO_HDE_START_MASK 0x1FFF0000
+ #define FRAME_RATE_OFF 0
+
+#define VIDEO1_TIMEING_GEN_V_REG 0x10 + VIDEOBASE_OFFSET
+#define VIDEO2_TIMEING_GEN_V_REG 0x110 + VIDEOBASE_OFFSET
+ #define VIDEO_VDE_END 0x00000001 //Bit[11:0] Video VDE End timing generator
+ #define VIDEO_VDE_END_BIT 0 //Number of pixels from rising edge of Vsync for first active pixel
+ #define VIDEO_VDE_END_MASK 0x00000FFF
+ #define VIDEO_VDE_START 0x00010000 //Bit[27:16] Video VDE Start timing generator
+ #define VIDEO_VDE_START_BIT 16 //Number of pixels from rising edge of Vsync for last active pixel
+ #define VIDEO_VDE_START_MASK 0x0FFF0000
+
+#define VIDEO1_SCALE_FACTOR_REG 0x14 + VIDEOBASE_OFFSET
+#define VIDEO2_SCALE_FACTOR_REG 0x114 + VIDEOBASE_OFFSET
+ #define HOR_SCALING_FACTOR 0x00000001 //Bit[15:0] Video Horizontal scaling factor
+ #define HOR_SCALING_FACTOR_BIT 0 //The formula=4096/(Horizontal scaling facotr)
+ #define HOR_SCALING_FACTOR_MASK 0x0000FFFF
+ #define VER_SCALING_FACTOR 0x00000000 //Bit[31:16] Video Vertical scaling factor
+ #define VER_SCALING_FACTOR_BIT 16 //The formula=4096/(Vertical scaling facotr)
+ #define VER_SCALING_FACTOR_MASK 0xFFFF0000
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER0_REG 0x18 + VIDEOBASE_OFFSET //Scaling Parameters F00, F01, F02, F03
+#define VIDEO2_SCALE_FACTOR_PARAMETER0_REG 0x118 + VIDEOBASE_OFFSET
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER1_REG 0x1C + VIDEOBASE_OFFSET //Scaling Parameters F10, F11, F12, F13
+#define VIDEO2_SCALE_FACTOR_PARAMETER1_REG 0x11C + VIDEOBASE_OFFSET
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER2_REG 0x20 + VIDEOBASE_OFFSET //Scaling Parameters F20, F21, F22, F23
+#define VIDEO2_SCALE_FACTOR_PARAMETER2_REG 0x120 + VIDEOBASE_OFFSET
+
+#define VIDEO1_SCALE_FACTOR_PARAMETER3_REG 0x24 + VIDEOBASE_OFFSET //Scaling Parameters F30, F31, F32, F33
+#define VIDEO2_SCALE_FACTOR_PARAMETER3_REG 0x124 + VIDEOBASE_OFFSET
+
+#define VIDEO1_BCD_CONTROL_REG 0x2C + VIDEOBASE_OFFSET
+#define VIDEO2_BCD_CONTROL_REG 0x12C + VIDEOBASE_OFFSET
+ #define BCD_ENABLE 0x00000001 //Bit[0] Enable block change detection(BCD)
+ #define BCD_ENABLE_BIT 0
+ #define BCD_ENABLE_MASK 0x00000001
+ #define BCD_TOLERANCE 0x00010000 //Bit[23:16]
+ #define BCD_TOLERANCE_BIT 16 //flag as changed block when the video data difference greater
+ #define BCD_TOLERANCE_MASK 0x00FF0000
+
+#define VIDEO1_CAPTURE_WINDOWS_REG 0x30 + VIDEOBASE_OFFSET
+#define VIDEO2_CAPTURE_WINDOWS_REG 0x130 + VIDEOBASE_OFFSET
+ #define CAPTURE_VER_LINE 0x00000001 //Bit[10:0] Video compression vertical line total
+ #define CAPTURE_VER_LINE_BIT 0
+ #define CAPTURE_VER_LINE_MASK 0x000007FF
+ #define CAPTURE_HOR_PIXEL 0x00010000 //Bit[26:16] Video compression vertical line total
+ #define CAPTURE_HOR_PIXEL_BIT 16
+ #define CAPTURE_HOR_PIXEL_MASK 0x07FF0000
+
+#define VIDEO1_COMPRESS_WINDOWS_REG 0x34 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_WINDOWS_REG 0x134 + VIDEOBASE_OFFSET
+ #define COMPRESS_VER_LINE 0x00000001 //Bit[10:0] Video compression vertical line total
+ #define COMPRESS_VER_LINE_BIT 0
+ #define COMPRESS_VER_LINE_MASK 0x000007FF
+ #define COMPRESS_HOR_PIXEL 0x00010000 //Bit[26:16] Video compression vertical line total
+ #define COMPRESS_HOR_PIXEL_BIT 16
+ #define COMPRESS_HOR_PIXEL_MASK 0x07FF0000
+
+#define VIDEO1_COMPRESS_BUF_PROCESS_OFFSET_REG 0x38
+#define VIDEO2_COMPRESS_BUF_PROCESS_OFFSET_REG 0x138
+ #define COMPRESS_BUF_PROCESS_OFFSET_ALIGN 127 //128 byte alignment
+ #define COMPRESS_BUF_PROCESS_OFFSET_MASK 0xFFFFFF
+
+#define VIDEO1_DECOMPRESS_BUF_PROCESS_OFFSET_REG 0x38
+#define VIDEO2_DECOMPRESS_BUF_PROCESS_OFFSET_REG 0x138
+ #define DECOMPRESS_BUF_PROCESS_OFFSET_ALIGN 127 //128 byte alignment
+ #define DECOMPRESS_BUF_PROCESS_OFFSET_MASK 0xFFFFFF
+
+
+//For Compression
+#define VIDEO1_COMPRESS_BUF_READ_OFFSET_REG 0x3C + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_COMPRESS_BUF_READ_OFFSET_REG 0x13C + VIDEOBASE_OFFSET
+ #define COMPRESS_BUF_READ_OFFSET_ALIGN 127 //128 byte alignment
+ #define COMPRESS_BUF_READ_OFFSET_MASK 0x00FFFFFF
+//For Decompression
+#define VIDEO1_DECOMPRESS_BUF_WRITE_OFFSET_REG 0x3C + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_DECOMPRESS_BUF_WRITE_OFFSET_REG 0x13C + VIDEOBASE_OFFSET
+ #define DECOMPRESS_BUF_WRITE_OFFSET_ALIGN 127 //128 byte alignment
+ #define DECOMPRESS_BUF_WRITE_OFFSET_MASK 0x00FFFFFF
+
+#define VIDEO1_CRC_BUF_ADDR_REG 0x40 + VIDEOBASE_OFFSET
+#define VIDEO2_CRC_BUF_ADDR_REG 0x140 + VIDEOBASE_OFFSET
+ #define CRC_BUF_ADDR_ALIGN 7 //8 byte alignment
+ #define CRC_BUF_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEO1_BUF_1_ADDR_REG 0x44 + VIDEOBASE_OFFSET //For Source Buffer in frame mode
+#define VIDEO2_BUF_1_ADDR_REG 0x144 + VIDEOBASE_OFFSET
+ #define BUF_1_ADDR_ALIGN 255 //256 byte alignment
+ #define BUF_1_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_BUF_LINE_OFFSET_REG 0x48 + VIDEOBASE_OFFSET //Must set both in Frame/Stream mode
+#define VIDEO2_BUF_LINE_OFFSET_REG 0x148 + VIDEOBASE_OFFSET
+ #define BUF_LINE_OFFSET_ALIGN 7 //8 byte alignment
+ #define BUF_LINE_OFFSET_MASK 0x00003FFF
+
+#define VIDEO1_BUF_2_ADDR_REG 0x4C + VIDEOBASE_OFFSET //For BCD Buffer in frame mode
+#define VIDEO2_BUF_2_ADDR_REG 0x14C + VIDEOBASE_OFFSET
+ #define BUF_2_ADDR_ALIGN 255 //256 byte alignment
+ #define BUF_2_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_FLAG_BUF_ADDR_REG 0x50 + VIDEOBASE_OFFSET //For block change flag buffer
+#define VIDEO2_FLAG_BUF_ADDR_REG 0x150 + VIDEOBASE_OFFSET
+ #define FLAG_BUF_ADDR_ALIGN 7 //8 byte alignment
+ #define FLAG_BUF_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_COMPRESS_BUF_ADDR_REG 0x54 + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_COMPRESS_BUF_ADDR_REG 0x154 + VIDEOBASE_OFFSET
+ #define COMPRESS_BUF_ADDR_ALIGN 127 //128 byte alignment
+ #define COMPRESS_BUF_ADDR_MASK 0x1FFFFFFF
+
+#define VIDEO1_STREAM_BUF_SIZE 0x58 + VIDEOBASE_OFFSET //For stream mode
+#define VIDEO2_STREAM_BUF_SIZE 0x158 + VIDEOBASE_OFFSET
+ #define STREAM_PACKET_SIZE 0x00000001
+ #define STREAM_PACKET_SIZE_BIT 0
+ #define STREAM_PACKET_SIZE_MASK 0x00000007
+ #define PACKET_SIZE_1KB 0
+ #define PACKET_SIZE_2KB 1
+ #define PACKET_SIZE_4KB 2
+ #define PACKET_SIZE_8KB 3
+ #define PACKET_SIZE_16KB 4
+ #define PACKET_SIZE_32KB 5
+ #define PACKET_SIZE_64KB 6
+ #define PACKET_SIZE_128KB 7
+ #define RING_BUF_PACKET_NUM 0x00000008
+ #define RING_BUF_PACKET_NUM_BIT 3
+ #define RING_BUF_PACKET_NUM_MASK 0x00000018
+ #define PACKETS_4 0
+ #define PACKETS_8 1
+ #define PACKETS_16 2
+ #define PACKETS_32 3
+ #define SKIP_HIGH_MB_THRES 0x00010000 //Bit[22:16] Skip high quality macro block threshold
+ #define SKIP_HIGH_MB_THRES_BIT 16
+ #define SKIP_HIGH_MB_THRES_MASK 0x007F0000
+ #define SKIP_TEST_MODE 0x00800000 //Bit[24:23] Skip test mode
+ #define SKIP_TEST_MODE_BIT 23
+ #define SKIP_TEST_MODE_MASK 0x01800000
+ #define YUV_TEST 2 //recommend
+
+#define VIDEO1_BUF_CODEC_OFFSET_READ 0x5C + VIDEOBASE_OFFSET //For stream mode,
+#define VIDEO2_BUF_CODEC_OFFSET_READ 0x15C + VIDEOBASE_OFFSET //Video stream buffer offset read back(HW)
+ #define BUF_CODEC_OFFSET_ALIGN 255 //256 byte alignment
+ #define BUF_CODEC_OFFSET_MASK 0x00FFFFFF
+
+#define VIDEO1_COMPRESS_CONTROL_REG 0x60 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_CONTROL_REG 0x160 + VIDEOBASE_OFFSET
+ #define JPEG_ONLY_ENCODE 0x00000001 //Bit[0] JPEG only encoding
+ #define JPEG_ONLY_BIT 0
+ #define JPEG_MIX_MODE 0 //Enable JPEG/VQ mix mode encoding
+ #define JPEG_ONLY_MODE 1 //JPEG encoding mode only
+ #define VQ_4_COLOR_ENCODE 0x00000002 //Bit[1] Enable 4 color VQ encoding
+ #define VQ_4_COLOR_BIT 1
+ #define VQ_1_2_COLOR_MODE 0 //1 and 2 color mode VQ encoding
+ #define VQ_4_COLOR_MODE 1 //1, 2 and 4 color VQ encoding
+ #define QUALITY_CODEC_SETTING 0x00000004 //Bit[2] High and best video quality codec mode setting
+ #define QUALITY_CODEC_SETTING_BIT 2
+ #define JPEG_CODEC_MODE 0 //not supported in best video quality mode
+ #define QUANTI_CODEC_MODE 1
+ #define JPEG_DUAL_QUALITY_EN 0x00000008 //Bit[3] JPEG dual quality mode
+ #define EN_JPEG_DUAL_QUALITY 1 //enable(only for normal video quality mode)
+ #define BEST_QUALITY_EN 0x00000010 //Bit[4] Best quality video mode enable
+ #define BEST_QUALITY_EN_BIT 4
+ #define EN_BEST_QUALITY 1 //enable(only for quantization codec mode)
+ #define RC4_CRYPT_EN 0x00000020 //Bit[5] Enable RC4 encryption/decryption
+ #define RC4_CRYPT_EN_BIT 5
+ #define RC4_CRYPT_EN_MASK 0x00000020
+ #define RC4_CRYPT_ON 1 //enable
+ #define NORMAL_QUANTI_CHROMI_TABLE 0x00000040 //Bit[10:6] Normal video quality mode JPEG DCT chromi quantination table
+ #define NORMAL_QUANTI_CHROMI_TABLE_BIT 6
+ #define NORMAL_QUANTI_CHROMI_TABLE_MASK 0x000007C0
+ #define NORMAL_QUANTI_LUMI_TABLE 0x00000800 //Bit[15:11] Normal video quality mode JPEG DCT lumi quantination table
+ #define NORMAL_QUANTI_LUMI_TABLE_BIT 11
+ #define NORMAL_QUANTI_LUMI_TABLE_MASK 0x0000F800
+ #define HIGH_QUALITY_EN 0x00010000 //Bit[16] High video quality mode enable
+ #define HIGH_QUALITY_EN_BIT 16
+ #define EN_HIGH_QUALITY 1 //Enable
+ #define UV_CIR656_FORMAT 0x00080000 //Bit[19] UV fromat
+ #define UV_CIR656_FORMAT_BIT 19
+ #define USE_UV_CIR656 1 //recommand
+ #define HUFFMAN_TABLE_SELECT 0x00100000 //Bit[20] JPEG Huffman table combination
+ #define DUAL_TABLE 0 //Dual Y, UV table
+ #define SINGLE_TABLE 1 //Single Y table
+ #define SINGLE_UV_TABLE 0x00200000 //1x: Single UV table
+ #define HIGH_QUANTI_CHROMI_TABLE 0x00400000 //Bit[26:22] High quality JPEG DCT chromi quantization table
+ #define HIGH_QUANTI_CHROMI_TABLE_BIT 22
+ #define HIGH_QUANTI_CHROMI_TABLE_MASK 0x07C00000
+ #define HIGH_DEQUANTI_VALUE 0x00400000 //Bit[26:22] High quality de-quantization value
+ #define HIGH_DEQUANTI_VALUE_BIT 22
+ #define HIGH_DEQUANTI_VALUE_MASK 0x07C00000
+ #define HIGH_QUANTI_LUMI_TABLE 0x08000000 //Bit[31:27] High quality JPEG DCT lumi quantization table
+ #define HIGH_QUANTI_LUMI_TABLE_BIT 27
+ #define HIGH_QUANTI_LUMI_TABLE_MASK 0xF8000000
+ #define BEST_DEQUANTI_VALUE 0x08000000 //Bit[31:27] Best quality de-quantization value
+ #define BEST_DEQUANTI_VALUE_BIT 27
+ #define BEST_DEQUANTI_VALUE_MASK 0xF8000000
+
+
+#define VIDEO1_QUANTI_TABLE_LOW_REG 0x64 + VIDEOBASE_OFFSET //Match with 0x60 Bit[10:6], Bit[15:11]
+#define VIDEO2_QUANTI_TABLE_LOW_REG 0x164 + VIDEOBASE_OFFSET
+ #define QUANTI_CHROMI_TABLE_LOW 0x00000001 //Bit[4:0] Normal video low quality block chromi quantization table
+ #define QUANTI_CHROMI_TABLE_LOW_BIT 0
+ #define QUANTI_CHROMI_TABLE_LOW_MASK 0x0000001F
+ #define QUANTI_LUMI_TABLE_LOW 0x00000020 //Bit[9:5] Normal video low quality block lumi quantization table
+ #define QUANTI_LUMI_TABLE_LOW_BIT 5
+ #define QUANTI_LUMI_TABLE_LOW_MASK 0x000003E0
+
+#define VIDEO1_QUANTI_VALUE_REG 0x68 + VIDEOBASE_OFFSET //Match with 0x60 Bit[26:22],Bit[31:27]
+#define VIDEO2_QUANTI_VALUE_REG 0x168 + VIDEOBASE_OFFSET
+ #define HIGH_QUANTI_VALUE 0x00000001 //Bit[14:0] High quality quantization value. Format is 1.14
+ #define HIGH_QUANTI_VALUE_BIT 0
+ #define HIGH_QUANTI_VALUE_MASK 0x00007FFF
+ #define BEST_QUANTI_VALUE 0x00010000 //Bit[30:16] Best quality quantization value. Format is 1.14
+ #define BEST_QUANTI_VALUE_BIT 16
+ #define BEST_QUANTI_VALUE_MASK 0x7FFF0000
+
+#define VIDEO1_BSD_PARA_REG 0x6C + VIDEOBASE_OFFSET //Video BSD Parameters Register
+#define VIDEO2_BSD_PARA_REG 0x16C + VIDEOBASE_OFFSET
+ #define BSD_HIGH_THRES 0x00000001 //Bit[7:0] Block sharpness detection high threshold
+ #define BSD_HIGH_THRES_BIT 0
+ #define BSD_HIGH_THRES_MASK 0x000000FF
+ #define BSD_LOW_THRES 0x00000100 //Bit[15:8] Block shaprpness detection low threshold
+ #define BSD_LOW_THRES_BIT 8
+ #define BSD_LOW_THRES_MASK 0x0000FF00
+ #define BSD_HIGH_COUNTS 0x00010000 //Bit[21:16] Block sharpness detection high counts threshold
+ #define BSD_HIGH_COUNTS_BIT 16
+ #define BSD_HIGH_COUNTS_MASK 0x003F0000
+ #define BSD_LOW_COUNTS 0x00400000 //Bit[27:22] Block sharpness detection low counts threshold
+ #define BSD_LOW_COUNTS_BIT 22
+ #define BSD_LOW_COUNTS_MASK 0x0FC00000
+
+#define VIDEO1_COMPRESS_FRAME_SIZE_REG 0x70 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_FRAME_SIZE_REG 0x170 + VIDEOBASE_OFFSET
+ #define COMPRESS_FRAME_SIZE_READ 0x00000001 //Bit[19:0] Video compression frame size read back(number of DW)
+ #define COMPRESS_FRAME_SIZE_READ_BIT 0
+ #define COMPRESS_FRAME_SIZE_READ_MASK 0x003FFFFF
+
+#define VIDEO1_COMPRESS_BLOCK_COUNT_REG 0x74 + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_BLOCK_COUNT_REG 0x174 + VIDEOBASE_OFFSET
+ #define PROCESS_BLOCK_COUNT_READ_BIT 0
+ #define PROCESS_BLOCK_COUNT_READ_MASK 0x00003FFF //Bit[13:0] Video processed total block counter read back(number of blocks)
+ #define COMPRESS_BLOCK_COUNT_READ_BIT 16
+ #define COMPRESS_BLOCK_COUNT_READ_MASK 0xFFFF0000 //Bit[29:16] Video processed total block counter read back(number of blocks)
+
+#define VIDEO1_COMPRESS_FRAME_END_READ 0x78 + VIDEOBASE_OFFSET //Video compression stream frame end pointer
+#define VIDEO2_COMPRESS_FRAME_END_READ 0x178 + VIDEOBASE_OFFSET
+ #define COMPRESS_FRAME_END_READ_ALIGN 7
+ #define COMPRESS_FRAME_END_READ_MASK 0x00FFFFFF
+
+#define VIDEO1_COMPRESS_FRAME_COUNT_READ 0x7C + VIDEOBASE_OFFSET
+#define VIDEO2_COMPRESS_FRAME_COUNT_READ 0x17C + VIDEOBASE_OFFSET
+ #define COMPRESS_FRAME_COUNT_READ 0x00000001 //Bit[15:0] Video compression frame count read back(number of frame)
+ #define COMPRESS_FRAME_COUNT_READ_BIT 0
+ #define COMPRESS_FRAME_COUNT_READ_MASK 0xFFFFFFFF
+
+#define VIDEO1_USER_DEFINE_HEADER 0x80 + VIDEOBASE_OFFSET
+#define VIDEO2_USER_DEFINE_HEADER 0x180 + VIDEOBASE_OFFSET
+ #define USER_DEFINE_HEADER 0x00000001 //Bit[15:0] Video user defined header parameter
+ #define USER_DEFINE_HEADER_BIT 0
+ #define USER_DEFINE_HEADER_MASK 0x0000FFFF
+
+#define VIDE1_MODE_DETECTION_EDGE_H_REG 0x90 + VIDEOBASE_OFFSET
+#define VIDE2_MODE_DETECTION_EDGE_H_REG 0x190 + VIDEOBASE_OFFSET
+ #define LEFT_EDGE_LOCATION 0x00000001 //Bit[11:0] Video source left edge location from sync rising edge
+ #define LEFT_EDGE_LOCATION_BIT 0
+ #define LEFT_EDGE_LOCATION_MASK 0x00000FFF
+ #define NO_VER_SYNC (1 << 12) //Bit[12] No Vertical sync detected
+ #define NO_HOR_SYNC (1 << 13) //Bit[13] No horizontal sync detected
+ #define NO_ACTIVE_DISP (1 << 14) //Bit[14] No active display detected
+ #define NO_DISP_CLOCK (1 << 15)
+ #define RIGHT_EDGE_LOCATION 0x00010000 //Bit[27:16] Video source right edge location from sync rising edge
+ #define RIGHT_EDGE_LOCATION_BIT 16
+ #define RIGHT_EDGE_LOCATION_MASK 0x0FFF0000
+
+#define VIDE1_MODE_DETECTION_EDGE_V_REG 0x94 + VIDEOBASE_OFFSET
+#define VIDE2_MODE_DETECTION_EDGE_V_REG 0x194 + VIDEOBASE_OFFSET
+ #define TOP_EDGE_LOCATION 0x00000001 //Bit[11:0] Video source top edge location from sync rising edge
+ #define TOP_EDGE_LOCATION_BIT 0
+ #define TOP_EDGE_LOCATION_MASK 0x00000FFF
+ #define BOTTOM_EDGE_LOCATION 0x00010000 //Bit[27:16] Video source bottom edge location from sync rising edge
+ #define BOTTOM_EDGE_LOCATION_BIT 16
+ #define BOTTOM_EDGE_LOCATION_MASK 0x0FFF0000
+
+#define VIDEO1_MODE_DETECTION_STATUS_READ_REG 0x98 + VIDEOBASE_OFFSET
+#define VIDEO2_MODE_DETECTION_STATUS_READ_REG 0x198 + VIDEOBASE_OFFSET
+ #define MODE_DETECTION_HOR_TIME_READ 0x00000001 //Bit[11:0] Mode detection Horizontal time read back (read only)
+ #define MODE_DETECTION_HOR_TIME_READ_BIT 0
+ #define MODE_DETECTION_HOR_TIME_READ_MASK 0x00000FFF
+ #define ANALONG_DIGITAL_READ 0x00001000 //Bit[12] Auto detection for external analog or digital source read back
+ #define ANALONG_DIGITAL_READ_BIT 12
+ #define DVI_SIGNAL 0
+ #define ADC_SIGNAL 1
+ #define MODE_DETECTION_HOR_STABLE_READ 0x00002000 //Bit[13] Mode detection horizontal stable read back
+ #define HOR_STABLE 1
+ #define MODE_DETECTION_VER_STABLE_READ 0x00004000 //Bit[14] Mode detection vertical stable read back
+ #define VER_STABLE 1
+ #define OUT_LOCK_READ 0x00008000 //Bit[15] Mode detection out of lock read back
+ #define SIGNAL_OUT_LOCK 1
+ #define MODE_DETECTION_VER_LINE_READ 0x00010000 //Bit[27:16] Mode detection Vertical lines read back
+ #define MODE_DETECTION_VER_LINE_READ_BIT 16
+ #define MODE_DETECTION_VER_LINE_READ_MASK 0x0FFF0000
+ #define VSYNC_POLARITY_READ 0x10000000 //Bit[28] Vsync polarity read back
+ #define HSYNC_POLARITY_READ 0x20000000 //Bit[29] Hsync polarity read back
+ #define MODE_DETECTION_VSYNC_READY 0x40000000 //Bit[30] Mode detection Vsync ready
+ #define MODE_DETECTION_HSYNC_READY 0x80000000 //Bit[31] Mode detection Hsync ready
+
+/****** VIDEO MEMAGER SETTING ******/
+#define VIDEOM_ENGINE_SEQUENCE_CONTROL_REG 0x204 + VIDEOBASE_OFFSET
+ #define VIDEOM_CAPTURE_TRIGGER 0x00000002 //Bit[1] trigger HW to capture video
+ #define VIDEOM_AUTO_MODE 0x00000008 //Bit[3]
+ #define DISABLE_AUTO_MODE 0
+ #define AUTO_COMPRESS 1
+ #define VIDEOM_CODEC_TRIGGER 0x00000010 //Bit[4] trigger HW to compress or decompress video
+ #define VIDEOM_SOURCE_SELECTION 0x00000100 //Bit[8]
+ #define VIDEO1 0
+ #define VIDEO2 1
+ //#define STREAM_DATA_MODE 0x00000400 //Bit[11:10] Buffer and Stream Data type
+ // #define STREAM_DATA_MODE_BIT 10
+ // #define STREAM_DATA_MODE_MASK 0x00000C00
+ // #define YUV444_MODE 0
+ // #define YUV420_MODE 1
+ // #define YUV420_MODE_WITH_AST2000 2 //AST2000 compatible
+ #define VIDEOM_CAPTURE_READY 0x00010000 //Bit[16] Video capture ready status read back(read only)
+ //#define HW_BUSY 0
+ //#define HW_IDLE 1
+ #define VIDEOM_CODEC_READY 0x00040000 //Bit[18] Video codec ready status read back(read only)
+ //#define HW_BUSY 0
+ //#define HW_IDLE 1
+
+#define VIDEOM_SCALE_FACTOR_REG 0x214 + VIDEOBASE_OFFSET
+// #define HOR_SCALING_FACTOR 0x00000001 //Bit[15:0] Video Horizontal scaling factor
+// #define HOR_SCALING_FACTOR_BIT 0 //The formula=4096/(Horizontal scaling facotr)
+// #define HOR_SCALING_FACTOR_MASK 0x0000FFFF
+// #define VER_SCALING_FACTOR 0x00000000 //Bit[31:16] Video Vertical scaling factor
+// #define VER_SCALING_FACTOR_BIT 16 //The formula=4096/(Vertical scaling facotr)
+// #define VER_SCALING_FACTOR_MASK 0xFFFF0000
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER0_REG 0x218 + VIDEOBASE_OFFSET //Scaling Parameters F00, F01, F02, F03
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER1_REG 0x21C + VIDEOBASE_OFFSET //Scaling Parameters F10, F11, F12, F13
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER2_REG 0x220 + VIDEOBASE_OFFSET //Scaling Parameters F20, F21, F22, F23
+
+#define VIDEOM_SCALE_FACTOR_PARAMETER3_REG 0x224 + VIDEOBASE_OFFSET //Scaling Parameters F30, F31, F32, F33
+
+#define VIDEOM_BCD_CONTROL_REG 0x22C + VIDEOBASE_OFFSET
+ //#define BCD_ENABLE 0x00000001 //Bit[0] Enable block change detection(BCD)
+ //#define BCD_TOLERANCE 0x00010000 //Bit[23:16]
+ // #define BCD_TOLERANCE_BIT 16 //flag as changed block when the video data difference greater
+ // #define BCD_TOLERANCE_MASK 0x00FF0000
+
+#define VIDEOM_CAPTURE_WINDOWS_REG 0x230 + VIDEOBASE_OFFSET
+ //#define RC4_TABLE_ADDR_ALIGN 7 //8 byte alignment
+ //#define RC4_TABLE_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_COMPRESS_WINDOWS_REG 0x234 + VIDEOBASE_OFFSET
+ //#define COMPRESS_VER_LINE 0x00000001 //Bit[12:0] Video compression vertical line total
+ //#define COMPRESS_VER_LINE_BIT 0
+ //#define COMPRESS_VER_LINE_MASK 0x00001FFF
+ //#define COMPRESS_HOR_PIXEL 0x00010000 //Bit[12:0] Video compression vertical line total
+ //#define COMPRESS_HOR_PIXEL_BIT 16
+ //#define COMPRESS_HOR_PIXEL_MASK 0x1FFF0000
+
+#define VIDEOM_COMPRESS_BUF_PROCESS_OFFSET_REG 0x238
+ //#define COMPRESS_BUF_PROCESS_OFFSET_ALIGN 127 //128 byte alignment
+ //#define COMPRESS_BUF_PROCESS_OFFSET_MASK 0x3FFFFF
+
+
+//For Compression
+#define VIDEOM_COMPRESS_BUF_READ_OFFSET_REG 0x23C + VIDEOBASE_OFFSET //For stream mode
+ //#define COMPRESS_BUF_READ_OFFSET_ALIGN 127 //128 byte alignment
+ //#define COMPRESS_BUF_READ_OFFSET_MASK 0x003FFFFF
+//For Decompression
+#define VIDEOM_DECOMPRESS_BUF_WRITE_OFFSET_REG 0x23C + VIDEOBASE_OFFSET //For stream mode
+ //#define DECOMPRESS_BUF_WRITE_OFFSET_ALIGN 127 //128 byte alignment
+ //#define DECOMPRESS_BUF_WRITE_OFFSET_MASK 0x003FFFFF
+
+#define VIDEOM_BUF_1_ADDR_REG 0x244 + VIDEOBASE_OFFSET //For Source Buffer in frame mode
+ //#define BUF_1_ADDR_ALIGN 255 //256 byte alignment
+ //#define BUF_1_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_BUF_LINE_OFFSET_REG 0x248 + VIDEOBASE_OFFSET //Must set both in Frame/Stream mode
+ //#define BUF_LINE_OFFSET_ALIGN 7 //8 byte alignment
+ //#define BUF_LINE_OFFSET_MASK 0x00003FFF
+
+#define VIDEOM_BUF_2_ADDR_REG 0x24C + VIDEOBASE_OFFSET //For BCD Buffer in frame mode
+ //#define BUF_2_ADDR_ALIGN 255 //256 byte alignment
+ //#define BUF_2_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_FLAG_BUF_ADDR_REG 0x250 + VIDEOBASE_OFFSET //For block change flag buffer
+ //#define FLAG_BUF_ADDR_ALIGN 7 //8 byte alignment
+ //#define FLAG_BUF_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_COMPRESS_BUF_ADDR_REG 0x254 + VIDEOBASE_OFFSET //For stream mode
+ //#define FLAG_BUF_ADDR_ALIGN 7 //8 byte alignment
+ //#define FLAG_BUF_ADDR_MASK 0x0FFFFFFF
+
+#define VIDEOM_BUF_CODEC_OFFSET_READ 0x25C + VIDEOBASE_OFFSET //For stream mode,
+ //#define BUF_CODEC_OFFSET_ALIGN 255 //256 byte alignment
+ //#define BUF_CODEC_OFFSET_MASK 0x003FFFFF
+
+#define VIDEOM_COMPRESS_CONTROL_REG 0x260 + VIDEOBASE_OFFSET
+ //#define JPEG_ONLY_ENCODE 0x00000001 //Bit[0] JPEG only encoding
+ // #define JPEG_MIX_MODE 0 //Enable JPEG/VQ mix mode encoding
+ // #define JPEG_ONLY_MODE 1 //JPEG encoding mode only
+ //#define VQ_4_COLOR_ENCODE 0x00000002 //Bit[1] Enable 4 color VQ encoding
+ // #define VQ_1_2_COLOR_MODE 0 //1 and 2 color mode VQ encoding
+ // #define VQ_4_COLOR_MODE 1 //1, 2 and 4 color VQ encoding
+ //#define QUALITY_CODEC_SETTING 0x00000004 //Bit[2] High and best video quality codec mode setting
+ // #define JPEG_CODEC_MODE 0 //not supported in best video quality mode
+ // #define QUANTI_CODEC_MODE 1
+ //#define JPEG_DUAL_QUALITY_EN 0x00000008 //Bit[3] JPEG dual quality mode
+ // #define EN_JPEG_DUAL_QUALITY 1 //enable(only for normal video quality mode)
+ //#define BEST_QUALITY_EN 0x00000010 //Bit[4] Best quality video mode enable
+ // #define EN_BEST_QUALITY 1 //enable(only for quantization codec mode)
+ //#define RC4_CRYPT_EN 0x00000020 //Bit[5] Enable RC4 encryption/decryption
+ // #define EN_RC4_CRYPT 1 //enable
+ //#define NORMAL_QUANTI_CHROMI_TABLE 0x00000040 //Bit[10:6] Normal video quality mode JPEG DCT chromi quantination table
+ // #define NORMAL_QUANTI_CHROMI_TABLE_BIT 6
+ // #define NORMAL_QUANTI_CHROMI_TABLE_MASK 0x000007C0
+ //#define NORMAL_QUANTI_LUMI_TABLE 0x00000800 //Bit[15:11] Normal video quality mode JPEG DCT lumi quantination table
+ // #define NORMAL_QUANTI_LUMI_TABLE_BIT 11
+ // #define NORMAL_QUANTI_LUMI_TABLE_MASK 0x0000F800
+ //#define HIGH_QUALITY_EN 0x00010000 //Bit[16] High video quality mode enable
+ // #define EN_HIGH_QUALITY 1 //Enable
+ //#define UV_CIR656_FORMAT 0x00080000 //Bit[19] UV fromat
+ // #define USE_UV_CIR656 1 //recommand
+ //#define HUFFMAN_TABLE_SELECT 0x00100000 //Bit[20] JPEG Huffman table combination
+ // #define DUAL_TABLE 0 //Dual Y, UV table
+ // #define SINGLE_TABLE 1 //Single Y table
+ // #define SINGLE_UV_TABLE 0x00200000 //1x: Single UV table
+ //#define HIGH_QUANTI_CHROMI_TABLE 0x00400000 //Bit[26:22] High quality JPEG DCT chromi quantization table
+ // #define HIGH_QUANTI_CHROMI_TABLE_BIT 22
+ // #define HIGH_QUANTI_CHROMI_TABLE_MASK 0x07C00000
+ //#define HIGH_DEQUANTI_VALUE 0x00400000 //Bit[26:22] High quality de-quantization value
+ // #define HIGH_DEQUANTI_VALUE_BIT 22
+ // #define HIGH_DEQUANTI_VALUE_MASK 0x07C00000
+ //#define HIGH_QUANTI_LUMI_TABLE 0x08000000 //Bit[31:27] High quality JPEG DCT lumi quantization table
+ // #define HIGH_QUANTI_LUMI_TABLE_BIT 27
+ // #define HIGH_QUANTI_LUMI_TABLE_MASK 0xF8000000
+ //#define BEST_DEQUANTI_VALUE 0x08000000 //Bit[31:27] Best quality de-quantization value
+ // #define BEST_QUANTI_VALUE_BIT 27
+ // #define BEST_QUANTI_VALUE_MASK 0xF8000000
+
+#define VIDEOM_QUANTI_TABLE_LOW_REG 0x264 + VIDEOBASE_OFFSET //Match with 0x60 Bit[10:6], Bit[15:11]
+// #define QUANTI_CHROMI_TABLE_LOW 0x00000001 //Bit[4:0] Normal video low quality block chromi quantization table
+// #define QUANTI_CHROMI_TABLE_LOW_BIT 0
+// #define QUANTI_CHROMI_TABLE_LOW_MASK 0x0000001F
+// #define QUANTI_LUMI_TABLE_LOW 0x00000020 //Bit[9:5] Normal video low quality block lumi quantization table
+// #define QUANTI_CHROMI_TABLE_LOW_BIT 5
+// #define QUANTI_CHROMI_TABLE_LOW_MASK 0x000003E0
+
+#define VIDEOM_QUANTI_VALUE_REG 0x268 + VIDEOBASE_OFFSET //Match with 0x60 Bit[26:22],Bit[31:27]
+// #define HIGH_QUANTI_VALUE 0x00000001 //Bit[14:0] High quality quantization value. Format is 1.14
+// #define HIGH_QUANTI_VALUE_BIT 0
+// #define HIGH_QUANTI_VALUE_MASK 0x00007FFF
+// #define BEST_QUANTI_VALUE 0x00010000 //Bit[30:16] Best quality quantization value. Format is 1.14
+// #define BEST_QUANTI_VALUE_BIT 16
+// #define BEST_QUANTI_VALUE_MASK 0x7FFF0000
+
+#define VIDEOM_BSD_PARA_REG 0x26C + VIDEOBASE_OFFSET //Video BSD Parameters Register
+// #define BSD_HIGH_THRES 0x00000001 //Bit[7:0] Block sharpness detection high threshold
+// #define BSD_HIGH_THRES_BIT 0
+// #define BSD_HIGH_THRES_MASK 0x000000FF
+// #define BSD_LOW_THRES 0x00000100 //Bit[15:8] Block shaprpness detection low threshold
+// #define BSD_LOW_THRES_BIT 8
+// #define BSD_LOW_THRES_MASK 0x0000FF00
+// #define BSD_HIGH_COUNTS 0x00010000 //Bit[21:16] Block sharpness detection high counts threshold
+// #define BSD_HIGH_COUNTS_BIT 16
+// #define BSD_HIGH_COUNTS_MASK 0x003F0000
+// #define BSD_LOW_COUNTS 0x01000000 //Bit[27:24] Block sharpness detection low counts threshold
+// #define BSD_LOW_COUNTS_BIT 24
+// #define BSD_LOW_COUNTS_MASK 0x3F000000
+
+#define VIDEOM_COMPRESS_FRAME_SIZE_REG 0x270 + VIDEOBASE_OFFSET
+// #define COMPRESS_FRAME_SIZE_READ 0x00000001 //Bit[19:0] Video compression frame size read back(number of DW)
+// #define COMPRESS_FRAME_SIZE_READ_BIT 0
+// #define COMPRESS_FRAME_SIZE_READ_MASK 0x000FFFFF
+
+#define VIDEOM_COMPRESS_BLOCK_COUNT_REG 0x274 + VIDEOBASE_OFFSET
+// #define COMPRESS_BLOCK_COUNT_READ 0x00000001 //Bit[15:0] Video compress block counter read back(number of blocks)
+// #define COMPRESS_BLOCK_COUNT_READ_BIT 0
+// #define COMPRESS_BLOCK_COUNT_READ_MASK 0x0000FFFF
+
+#define VIDEOM_COMPRESS_FRAME_END_READ 0x278 + VIDEOBASE_OFFSET //Video compression stream frame end pointer
+ //#define COMPRESS_FRAME_END_READ_ALIGN 7
+ //#define COMPRESS_FRAME_END_READ_MASK 0x003FFFFF
+
+#define VIDEOM_USER_DEFINE_HEADER_REG 0x280 + VIDEOBASE_OFFSET
+// #define USER_DEFINE_HEADER 0x00000001 //Bit[15:0] Video user defined header parameter
+// #define USER_DEFINE_HEADER_BIT 0
+// #define USER_DEFINE_HEADER_MASK 0x0000FFFF
+
+/****** VR300-VR3FC: General Control registers *****/
+#define VIDEO_CONTROL_REG 0x300 + VIDEOBASE_OFFSET
+ #define CODEC_DECOMPRESS_MODE 0x00000001 //Bit[0] Codec in de-compression mode
+ #define CODEC_DECOMPRESS_MODE_BIT 0
+ #define CODEC_DECOMPRESS_MODE_MASK 0x00000001
+ #define COMPRESS_MODE 0
+ #define DECOMPRESS_MODE 1
+ #define VIDEO_SAFE_MODE 0x00000002 //Bit[1] VIDEO SAFE MODE
+ #define VIDEO_SAFE_MODE_BIT 1
+ #define VIDEO_SAFE_MODE_OFF 0
+ #define VIDEO_SAFE_MODE_ON 1
+ #define DELAY_VSYNC 0x00000004 //Bit[2] Delay Internal VSYNC
+ #define DELAY_VSYNC_BIT 2
+ #define DELAY_VSYNC_MASK (1<<2)
+ #define DELAY_VSYNC_OFF (0<<2)
+ #define DELAY_VSYNC_EN (1<<2)
+ #define VER_DOWNSCALING_LINE_BUFFER_EN 0x00000010 //Bit[5:4] Video vertical downscaling line buffer enable
+ #define VER_LINE_BUFFER_MASK (3<<4)
+ #define LINE_BUFFER_OFF (0<<4)
+ #define LINE_BUFFER_VIDEO1 1
+ #define LINE_BUFFER_VIDEO2 2
+ #define LINE_BUFFER_VIDEOM 3
+ #define RC4_KEY_BUFFER_SELECTION (1UL<<6) //Bit[7:6] RC4 Key Buffer Selection
+ #define RC4_KEY_BUFFER_SELECTION_BIT 6
+ #define RC4_KEY_BUFFER_SELECTION_MASK (3UL<<6)
+ #define RC4_KEY_BUFFER_VIDEO1 0
+ #define RC4_KEY_BUFFER_VIDEO2 1
+ #define RC4_KEY_BUFFER_VIDEOM 2
+ #define RC4_INIT_RESET (1UL<<8) //Bit[8] RC4 initial reset
+ #define RC4_INIT_RESET_BIT 8
+ #define RC4_INIT_RESET_MASK (1UL<<8)
+ #define RC4_NORMAL_MODE 0
+ #define RC4_RESET_COUNTER 1
+ #define RC4_TEST_MODE (1UL<<9) //Bit[9] RC4 test mode
+ #define RC4_TEST_MODE_BIT 9
+ #define RC4_TEST_OFF 0
+ #define RC4_TEST_ON 1
+ #define RC4_SAVE_MODE (1UL<<14) //Bit[14] RC4 save mode
+ #define RC4_SAVE_MODE_BIT 14
+ #define RC4_SAVE_MODE_MASK (1UL<<14)
+ #define RC4_SAVE_MODE_OFF 0
+ #define RC4_SAVE_MODE_ON 1
+ #define RC4_NO_RESET_FRAME (1UL<<15) //Bit[15] RC4 no reset when frame completed
+ #define RC4_NO_RESET_FRAME_BIT 15
+ #define RC4_NO_RESET_FRAME_MASK (1UL<<15)
+ #define RC4_NO_RESET_FRAME_OFF 0 //Always reset
+ #define RC4_NO_RESET_FRAME_ON 1
+
+#define VIDEO_INT_CONTROL_EN_REG 0x304 + VIDEOBASE_OFFSET
+ #define VIDEO1_WATCH_DOG_INT_EN 0x00000001 //Bit[0] Enable Video1 mode detection watch dog out of lock interrupt
+ #define VIDEO1_INPUT_COMPLETE_INT_EN 0x00000002 //Bit[1] Enable Video1 video input complete interrupt (frame complete only for frame mode)
+ #define VIDEO1_PACKET_READY_INT_EN 0x00000004 //Bit[2] Enable Video1 packet ready interrupt
+ #define VIDEO1_COMPRESS_COMPLETE_INT_EN 0x00000008 //Bit[3] Enable Video1 compression complete interrupt
+ #define VIDEO1_MODE_DETECTION_READY_INT_EN 0x00000010 //Bit[4] Enable video1 mode detection ready interrupt
+ #define VIDEO1_FRAME_COMPLETE_INT_EN 0x00000020 //Bit[5] Enable Video1 frame complete interrupt (only for stream mode)
+ #define VIDEO1_STREAM_ERR_INT_EN 0x00000040 //Bit[6] Enable Video1 decode stream error interrupt
+ #define VIDEO2_WATCH_DOG_INT_EN 0x00000100 //Bit[8] Enable Video2 mode detection watch dog out of lock interrupt
+ #define VIDEO2_INPUT_COMPLETE_INT_EN 0x00000200 //Bit[9] Enable Video2 video input complete interrupt (frame complete only for frame mode)
+ #define VIDEO2_PACKET_READY_INT_EN 0x00000400 //Bit[10] Enable Video2 packet ready interrupt
+ #define VIDEO2_COMPRESS_COMPLETE_INT_EN 0x00000800 //Bit[11] Enable Video2 compression complete interrupt
+ #define VIDEO2_MODE_DETECTION_READY_INT_EN 0x00001000 //Bit[12] Enable video2 mode detection ready interrupt
+ #define VIDEO2_FRAME_COMPLETE_INT_EN 0x00002000 //Bit[13] Enable Video2 frame complete interrupt (only for stream mode)
+ #define VIDEO2_STREAM_ERR_INT_EN 0x00004000 //Bit[14] Enable Video2 decode stream error interrupt
+ #define VIDEOM_INPUT_COMPLETE_INT_EN 0x00010000 //Bit[16] Enable VideoM video input complete interrupt
+ #define VIDEOM_COMPRESS_COMPLETE_INT_EN 0x00020000 //Bit[17] Enable VideoM compression complete interrupt
+ #define VIDEOM_PACKET_READY_INT_EN 0x00040000 //Bit[18] Enable VideoM packet ready interrupt
+ #define VIDEOM_FRAME_COMPLETE_INT_EN 0x00080000 //Bit[19] Enable VideoM frame complete interrupt (only for stream mode)
+
+#define VIDEO_INT_CONTROL_READ_REG 0x308 + VIDEOBASE_OFFSET //Clear when write 1
+ #define VIDEO1_WATCH_DOG_READ 0x00000001 //Bit[0] Video1 mode detection watch dog out of lock interrupt status read back
+ #define VIDEO1_WATCH_DOG_BIT 0
+ #define VIDEO1_WATCH_DOG_MASK 0x00000001
+ #define VIDEO1_INPUT_COMPLETE_READ 0x00000002 //Bit[1] Video1 video input complete interrupt status read back (frame complete only for frame mode)
+ #define VIDEO1_INPUT_COMPLETE_BIT 1
+ #define VIDEO1_INPUT_COMPLETE_MASK 0x00000002
+ #define VIDEO1_PACKET_READY_READ 0x00000004 //Bit[2] Video1 packet ready interrupt status read back
+ #define VIDEO1_PACKET_READY_BIT 2
+ #define VIDEO1_PACKET_READY_MASK 0x00000004
+ #define VIDEO1_COMPRESS_COMPLETE_READ 0x00000008 //Bit[3] Video1 compression complete interrupt status read back
+ #define VIDEO1_COMPRESS_COMPLETE_BIT 3
+ #define VIDEO1_COMPRESS_COMPLETE_MASK 0x00000008
+ #define VIDEO1_MODE_DETECTION_READY_READ 0x00000010 //Bit[4] Video1 mode detection ready interrupt status read back
+ #define VIDEO1_MODE_DETECTION_READY_BIT 4
+ #define VIDEO1_FRAME_COMPLETE_READ 0x00000020 //Bit[5] Video1 frame complete interrupt status read back
+ #define VIDEO1_FRAME_COMPLETE_BIT 5
+ #define VIDEO1_FRAME_COMPLETE_MASK 0x00000020
+ #define VIDEO1_STREAM_ERR_READ 0x00000040 //Bit[6] Video1 decode stream error interrupt status read back
+ #define VIDEO1_STREAM_ERR_BIT 6
+ #define VIDEO1_STREAM_ERR_MASK 0x00000040
+ #define VIDEO2_WATCH_DOG_READ 0x00000100 //Bit[8] Video2 mode detection watch dog out of lock interrupt status read back
+ #define VIDEO2_WATCH_DOG_BIT 8
+ #define VIDEO2_WATCH_DOG_MASK 0x00000100
+ #define VIDEO2_INPUT_COMPLETE_READ 0x00000200 //Bit[9] Video2 video input complete interrupt status read back (frame complete only for frame mode)
+ #define VIDEO2_INPUT_COMPLETE_BIT 9
+ #define VIDEO2_INPUT_COMPLETE_MASK 0x00000200
+ #define VIDEO2_PACKET_READY_READ 0x00000400 //Bit[10] Video2 packet ready interrupt status read back
+ #define VIDEO2_PACKET_READY_BIT 10
+ #define VIDEO2_PACKET_READY_MASK 0x00000400
+ #define VIDEO2_COMPRESS_COMPLETE_READ 0x00000800 //Bit[11] Video2 compression complete interrupt status read back
+ #define VIDEO2_COMPRESS_COMPLETE_BIT 11
+ #define VIDEO2_COMPRESS_COMPLETE_MASK 0x00000800
+ #define VIDEO2_MODE_DETECTION_READY_READ 0x00001000 //Bit[12] Video2 mode detection ready interrupt status read back
+ #define VIDEO2_MODE_DETECTION_READY_BIT 12
+ #define VIDEO2_FRAME_COMPLETE_READ 0x00002000 //Bit[13] Video2 frame complete interrupt status read back
+ #define VIDEO2_FRAME_COMPLETE_BIT 13
+ #define VIDEO2_FRAME_COMPLETE_MASK 0x00002000
+ #define VIDEO2_STREAM_ERR_READ 0x00004000 //Bit[14] Video2 decode stream error interrupt status read back
+ #define VIDEO2_STREAM_ERR_BIT 14
+ #define VIDEO2_STREAM_ERR_MASK 0x00004000
+ //need check spec
+ #define VIDEOM_INPUT_COMPLETE_READ 0x00010000 //Bit[16] VideoM video input complete interrupt status read back
+ #define VIDEOM_INPUT_COMPLETE_BIT 16
+ #define VIDEOM_INPUT_COMPLETE_MASK 0x00010000
+ #define VIDEOM_COMPRESS_COMPLETE_READ 0x00020000 //Bit[17] VideoM compression complete interrupt status read back
+ #define VIDEOM_COMPRESS_COMPLETE_BIT 17
+ #define VIDEOM_COMPRESS_COMPLETE_MASK 0x00020000
+ #define VIDEOM_PACKET_READY_READ 0x00040000 //Bit[18] Clear Packet ready interrupt when write 1
+ #define VIDEOM_PACKET_READY_BIT 18
+ #define VIDEOM_PACKET_READY_MASK 0x00040000
+ #define VIDEOM_FRAME_COMPLETE_READ 0x00080000 //Bit[19] Clear Frame complete interrupt when write 1
+ #define VIDEOM_FRAME_COMPLETE_BIT 19
+ #define VIDEOM_FRAME_COMPLETE_MASK 0x00080000
+
+#define VIDEO_INT_CONTROL_CLEAR_REG 0x308 + VIDEOBASE_OFFSET //Clear when write 1
+ //Clear when write 1
+ #define VIDEO1_WATCH_DOG_CLEAR 0x00000001 //Bit[0] Clear mode detection watch dog out of lock interrupt when write 1
+ #define VIDEO1_INPUT_COMPLETE_CLEAR 0x00000002 //Bit[1] Clear video input complete interrupt when write 1 (frame complete only for frame mode)
+ #define VIDEO1_PACKET_READY_CLEAR 0x00000004 //Bit[2] Clear Packet ready interrupt when write 1
+ #define VIDEO1_PACKET_READY_CLEAR_BIT 2
+ #define VIDEO1_PACKET_READY_CLEAR_MASK 0x00000004
+ #define VIDEO1_COMPRESS_COMPLETE_CLEAR 0x00000008 //Bit[3] Clear video compression interrupt when write 1
+ #define VIDEO1_MODE_DETECTION_READY_CLEAR 0x00000010 //Bit[4] Clear Video1 Mode detection ready interrupt when write 1
+ #define VIDEO1_FRAME_COMPLETE_CLEAR 0x00000020 //Bit[5] Clear Frame complete interrupt when write 1
+ #define VIDEO1_FRAME_COMPLETE_CLEAR_BIT 5
+ #define VIDEO1_FRAME_COMPLETE_CLEAR_MASK 0x00000020
+ #define VIDEO1_STREAM_ERR_CLEAR 0x00000040 //Bit[6] Clear decode stream error interrupt when write 1
+ #define VIDEO2_WATCH_DOG_CLEAR 0x00000100 //Bit[8] Clear Mode detection interrupt when write 1
+ #define VIDEO2_INPUT_COMPLETE_CLEAR 0x00000200 //Bit[9] Clear video input complete interrupt when write 1
+ #define VIDEO2_PACKET_READY_CLEAR 0x00000400 //Bit[10] Clear packet ready interrupt when write 1
+ #define VIDEO2_COMPRESS_COMPLETE_CLEAR 0x00000800 //Bit[11] Clear video compression complete interrupt when write 1
+ #define VIDEO2_MODE_DETECTION_READY_CLEAR 0x00001000 //Bit[12] Clear Video2 Mode detection ready interrupt when write 1
+ #define VIDEO2_FRAME_COMPLETE_CLEAR 0x00002000 //Bit[13] Clear Frame complete interrupt when write 1 (frame complete only for frame mode)
+ #define VIDEO2_STREAM_ERR_CLEAR 0x00004000 //Bit[14] Clear Decode stream error interrupt when write 1
+ //need check spec
+ #define VIDEOM_INPUT_COMPLETE_CLEAR 0x00010000 //Bit[16] Clear video input complete interrupt when write 1
+ #define VIDEOM_COMPRESS_COMPLETE_CLEAR 0x00020000 //Bit[17] Clear compression complete interrupt when write 1
+ #define VIDEOM_COMPRESS_COMPLETE_CLEAR_BIT 17
+ #define VIDEOM_COMPRESS_COMPLETE_CLEAR_MASK 0x00020000
+ #define VIDEOM_PACKET_READY_CLEAR 0x00040000 //Bit[18] Clear compression complete interrupt when write 1
+ #define VIDEOM_PACKET_READY_CLEAR_BIT 18
+ #define VIDEOM_PACKET_READY_CLEAR_MASK 0x00040000
+ #define VIDEOM_FRAME_COMPLETE_CLEAR 0x00100000 //Bit[20] Clear Frame complete interrupt when write 1
+ #define VIDEOM_FRAME_COMPLETE_CLEAR_BIT 20
+ #define VIDEOM_FRAME_COMPLETE_CLEAR_MASK 0x00100000
+ #define VIDEOM_STREAM_ERR_CLEAR 0x00200000 //Bit[21] Clear decode stream error interrupt when write 1
+
+#define VIDEO_MODE_DETECTION_PARAM_REG 0x30C + VIDEOBASE_OFFSET
+ #define EDGE_PIXEL_THRES_BIT 8 //Bit[15:8] Mode detection edge pixel threshold
+ #define EDGE_PIXEL_THRES_MASK 0x0000FF00
+ #define VER_STABLE_MAX_BIT 16 //Bit[19:16] Mode detection vertical stable maximum
+ #define VER_STABLE_MAX_BIT_MASK 0x000F0000
+ #define HOR_STABLE_MAX_BIT 20 //Bit[23:20] Mode detection horizontal stable maximum
+ #define HOR_STABLE_MAX_BIT_MASK 0x00F00000
+ #define VER_STABLE_THRES_BIT 24 //Bit[27:24] Mode detection vertical stable threshold
+ #define VER_STABLE_THRES_BIT_MASK 0x0F000000
+ #define HOR_STABLE_THRES_BIT 28 //Bit[31:28] Mode detection horizontal stable threshold
+ #define HOR_STABLE_THRES_BIT_MASK 0xF0000000
+
+#define VIDEO_CRC_PRIMARY_REG 0x320 + VIDEOBASE_OFFSET
+ #define CRC_CHECK_EN 0x00000001 //Bit[0] Video port 1/2 Enable video capture write CRC check
+ #define CRC_CHECK_EN_BIT 0
+ #define CRC_CHECK_HIGH 0x00000002 //Bit[1] Video port 1/2 CRC check high bit only
+ #define CRC_CHECK_HIGH_BIT 1
+ #define SKIP_COUNT_MAX 0x00000004 //Bit[7:2] Video port 1/2 Max capture write skip count
+ #define SKIP_COUNT_MAX_BIT 2
+ #define SKIP_COUNT_MAX_MASK 0x000000FC
+ #define CRC_PRIMARY_POLY_LOW 0x00000100 //Bit[15:8] Primary CRC low 8-bit polynomial
+ #define CRC_RIMARY_POLY_LOW_BIT 8
+ #define CRC_RIMARY_POLY_LOW_MASK 0x0000FF00
+ #define CRC_PRIMARY_POLY_HIGH 0x00010000 //Bit[31:16] Primary CRC high 8-bit polynomial
+ #define CRC_RIMARY_POLY_HIGH_BIT 16
+ #define CRC_RIMARY_POLY_HIGH_MASK 0xFFFF0000
+
+
+#define VIDEO_CRC_SECOND_REG 0x324 + VIDEOBASE_OFFSET
+ #define CRC_SECOND_POLY_LOW 0x00000100 //Bit[15:8] Secondary CRC low 8-bit polynomial
+ #define CRC_SECOND_POLY_LOW_BIT 8
+ #define CRC_SECOND_POLY_LOW_MASK 0x0000FF00
+ #define CRC_SECOND_POLY_HIGH 0x00010000 //Bit[31:16] Secondary CRC high 8-bit polynomial
+ #define CRC_SECOND_POLY_HIGH_BIT 16
+ #define CRC_SECOND_POLY_HIGH_MASK 0xFFFF0000
+
+#define VIDEO1_RC4_KEYS_REG 0x400 + VIDEOBASE_OFFSET //Total Video1 RC4 Keys
+#define VIDEO2_RC4_KEYS_REG 0x500 + VIDEOBASE_OFFSET //Total Video2 RC4 Keys
+#define VIDEOM_RC4_KEYS_REG 0x600 + VIDEOBASE_OFFSET //Total VideoM RC4 Keys
+
+#endif /* end of _VREG_H_ */
+
diff --git a/boards.cfg b/boards.cfg
index 6a368de..674896b 100644
--- a/boards.cfg
+++ b/boards.cfg
@@ -72,6 +72,7 @@ mini2440 arm arm920t mini2440 friendl
VCMA9 arm arm920t vcma9 mpl s3c24x0
smdk2410 arm arm920t - samsung s3c24x0
omap1510inn arm arm925t - ti
+ast2400 arm arm926ejs ast2400 aspeed aspeed
integratorap_cm926ejs arm arm926ejs integrator armltd - integratorap:CM926EJ_S
integratorcp_cm926ejs arm arm926ejs integrator armltd - integratorcp:CM924EJ_S
aspenite arm arm926ejs - Marvell armada100
diff --git a/common/Makefile b/common/Makefile
index 53c92ef..6ba5f38 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -190,6 +190,8 @@ COBJS-$(CONFIG_CMD_ZIP) += cmd_zip.o
COBJS-$(CONFIG_CMD_ZFS) += cmd_zfs.o
# others
+OBJS-$(CONFIG_CMD_NETTEST) += cmd_nettest.o
+COBJS-$(CONFIG_CMD_SLT) += cmd_slt.o
COBJS-$(CONFIG_BOOTSTAGE) += bootstage.o
COBJS-$(CONFIG_CONSOLE_MUX) += iomux.o
COBJS-y += flash.o
diff --git a/common/cmd_nettest.c b/common/cmd_nettest.c
new file mode 100644
index 0000000..249d7b6
--- /dev/null
+++ b/common/cmd_nettest.c
@@ -0,0 +1,214 @@
+/*
+ * 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
+*/
+
+#include <common.h>
+#include <command.h>
+#include <COMMINF.H>
+
+#ifdef SLT_UBOOT
+extern int main_function(int argc, char *argv[]);
+
+int do_mactest (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ ModeSwitch = MODE_DEDICATED;
+ return main_function( argc, argv);
+}
+
+int do_ncsitest (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ ModeSwitch = MODE_NSCI;
+ return main_function( argc, argv);
+}
+
+U_BOOT_CMD(
+ mactest, CONFIG_SYS_MAXARGS, 0, do_mactest,
+ "mactest - Dedicated LAN test program \n",
+ NULL
+);
+U_BOOT_CMD(
+ ncsitest, CONFIG_SYS_MAXARGS, 0, do_ncsitest,
+ "ncsitest- Share LAN (NC-SI) test program \n",
+ NULL
+);
+
+// ------------------------------------------------------------------------------
+int do_phyread (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ int MACnum;
+ int PHYreg;
+ ULONG result_data;
+ int ret = 0;
+ int PHYaddr;
+ int timeout = 0;
+
+ do {
+ if ( argc != 4 ) {
+ printf(" Wrong parameter number.\n" );
+ printf(" phyr mac addr reg\n" );
+ printf(" mac : 0 or 1. [hex]\n" );
+ printf(" PHY addr: 0 to 31. [hex]\n" );
+ printf(" register: 0 to 0xFF.[hex]\n" );
+ printf(" example: phyr 0 0 1\n" );
+ ret = -1;
+ break;
+ }
+
+ MACnum = strtoul(argv[1], NULL, 16);
+ PHYaddr = strtoul(argv[2], NULL, 16);
+ PHYreg = strtoul(argv[3], NULL, 16);
+
+ if ( MACnum == 0 ) {
+ // Set MAC 0
+ H_MAC_BASE = MAC_BASE1;
+ }
+ else if ( MACnum == 1 ) {
+ // Set MAC 1
+ H_MAC_BASE = MAC_BASE2;
+ }
+ else {
+ printf("wrong parameter (mac number)\n");
+ ret = -1;
+ break;
+ }
+ MAC_PHYBASE = H_MAC_BASE;
+
+ if ( ( PHYaddr < 0 ) || ( PHYaddr > 31 ) ) {
+ printf("wrong parameter (PHY address)\n");
+ ret = -1;
+ break;
+ }
+
+ MAC_40h_old = ReadSOC_DD( H_MAC_BASE + 0x40 );
+ AST2300_NewMDIO = (MAC_40h_old & 0x80000000) ? 1 : 0;
+
+ if ( AST2300_NewMDIO ) {
+ WriteSOC_DD( MAC_PHYBASE + 0x60, MAC_PHYRd_New | (PHYaddr << 5) | ( PHYreg & 0x1f ) );
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYBusy_New ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+ ret = -1;
+ break;
+ }
+ }
+ DELAY(Delay_PHYRd);
+ result_data = ReadSOC_DD( MAC_PHYBASE + 0x64 ) & 0xffff;
+ }
+ else {
+ WriteSOC_DD( MAC_PHYBASE + 0x60, MDC_Thres | MAC_PHYRd | (PHYaddr << 16) | ((PHYreg & 0x1f) << 21) );
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYRd ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+ ret = -1;
+ break;
+ }
+ }
+ DELAY( Delay_PHYRd );
+ result_data = ReadSOC_DD( MAC_PHYBASE + 0x64 ) >> 16;
+ }
+ printf(" PHY[%d] reg[%2X] = %08lX\n", PHYaddr, PHYreg, result_data );
+ } while ( 0 );
+
+ return ret;
+}
+
+
+int do_phywrite (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ int MACnum;
+ int PHYreg;
+ int PHYaddr;
+ ULONG reg_data;
+ int ret = 0;
+ int timeout = 0;
+
+ do {
+ if ( argc != 5 )
+ {
+ printf(" Wrong parameter number.\n" );
+ printf(" phyw mac addr reg data\n" );
+ printf(" mac : 0 or 1. [hex]\n" );
+ printf(" PHY addr: 0 to 31. [hex]\n" );
+ printf(" register: 0 to 0xFF. [hex]\n" );
+ printf(" data : 0 to 0xFFFF.[hex]\n" );
+ printf(" example: phyw 0 0 0 610\n" );
+ ret = -1;
+ break;
+ }
+
+ MACnum = strtoul(argv[1], NULL, 16);
+ PHYaddr = strtoul(argv[2], NULL, 16);
+ PHYreg = strtoul(argv[3], NULL, 16);
+ reg_data = strtoul(argv[4], NULL, 16);
+
+ if ( MACnum == 0 ) {
+ // Set MAC 0
+ H_MAC_BASE = MAC_BASE1;
+ }
+ else if ( MACnum == 1 ) {
+ // Set MAC 1
+ H_MAC_BASE = MAC_BASE2;
+ }
+ else {
+ printf("wrong parameter (mac number)\n");
+ ret = -1;
+ break;
+ }
+ MAC_PHYBASE = H_MAC_BASE;
+
+ if ( ( PHYaddr < 0 ) || ( PHYaddr > 31 ) ) {
+ printf("wrong parameter (PHY address)\n");
+ ret = -1;
+ break;
+ }
+
+ MAC_40h_old = ReadSOC_DD( H_MAC_BASE + 0x40 );
+ AST2300_NewMDIO = (MAC_40h_old & 0x80000000) ? 1 : 0;
+
+ if (AST2300_NewMDIO) {
+ WriteSOC_DD( MAC_PHYBASE + 0x60, ( reg_data << 16 ) | MAC_PHYWr_New | (PHYaddr<<5) | (PHYreg & 0x1f));
+
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYBusy_New ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+ ret = -1;
+ break;
+ }
+ }
+ }
+ else {
+ WriteSOC_DD( MAC_PHYBASE + 0x64, reg_data );
+ WriteSOC_DD( MAC_PHYBASE + 0x60, MDC_Thres | MAC_PHYWr | (PHYaddr<<16) | ((PHYreg & 0x1f) << 21));
+
+ while ( ReadSOC_DD( MAC_PHYBASE + 0x60 ) & MAC_PHYWr ) {
+ if ( ++timeout > TIME_OUT_PHY_RW ) {
+ ret = -1;
+ break;
+ }
+ }
+ } // End if (AST2300_NewMDIO)
+
+ printf("Write: PHY[%d] reg[%2X] = %08lX\n", PHYaddr, PHYreg, reg_data );
+ } while ( 0 );
+
+ return ret;
+}
+
+U_BOOT_CMD(
+ phyr, CONFIG_SYS_MAXARGS, 0, do_phyread,
+ "phyr - Read PHY register. (phyr mac addr reg)\n",
+ NULL
+);
+
+U_BOOT_CMD(
+ phyw, CONFIG_SYS_MAXARGS, 0, do_phywrite,
+ "phyw - Write PHY register. (phyw mac addr reg data)\n",
+ NULL
+);
+
+#endif // End SLT_UBOOT
+
diff --git a/common/cmd_slt.c b/common/cmd_slt.c
new file mode 100644
index 0000000..9763692
--- /dev/null
+++ b/common/cmd_slt.c
@@ -0,0 +1,49 @@
+/*
+ * 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
+*/
+
+#include <command.h>
+
+extern int pll_function(int argc, char *argv[]);
+extern int trap_function(int argc, char *argv[]);
+extern int dram_stress_function(int argc, char *argv[]);
+
+int do_plltest (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ return pll_function( argc, argv);
+}
+
+U_BOOT_CMD(
+ plltest, CONFIG_SYS_MAXARGS, 0, do_plltest,
+ "plltest - PLLTest [pll mode] [err rate] \n",
+ NULL
+);
+
+int do_traptest (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ return trap_function( argc, argv);
+}
+
+U_BOOT_CMD(
+ traptest, CONFIG_SYS_MAXARGS, 0, do_traptest,
+ "traptest- Check hardware trap for CPU clock and CPU\\AHB ratio.\n",
+ NULL
+);
+
+int do_dramtest (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+ return dram_stress_function( argc, argv);
+}
+
+U_BOOT_CMD(
+ dramtest, CONFIG_SYS_MAXARGS, 0, do_dramtest,
+ "dramtest- Stress DRAM.\n",
+ NULL
+);
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index 72e85a3..2b35587 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -43,6 +43,7 @@ COBJS-$(CONFIG_S3C44B0_I2C) += s3c44b0_i2c.o
COBJS-$(CONFIG_SOFT_I2C) += soft_i2c.o
COBJS-$(CONFIG_TEGRA_I2C) += tegra_i2c.o
COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o
+COBJS-$(CONFIG_DRIVER_ASPEED_I2C) += aspeed_i2c.o
COBJS-$(CONFIG_U8500_I2C) += u8500_i2c.o
COBJS-$(CONFIG_SH_I2C) += sh_i2c.o
COBJS-$(CONFIG_SH_SH7734_I2C) += sh_sh7734_i2c.o
diff --git a/drivers/i2c/aspeed_i2c.c b/drivers/i2c/aspeed_i2c.c
new file mode 100755
index 0000000..ff6c756
--- /dev/null
+++ b/drivers/i2c/aspeed_i2c.c
@@ -0,0 +1,286 @@
+/*
+ * 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
+ */
+
+#include <common.h>
+#include <asm/arch/aspeed_i2c.h>
+
+#ifdef CONFIG_DRIVER_ASPEED_I2C
+
+void i2c_init (int speed, int slaveadd)
+{
+ unsigned long SCURegister;
+//I2C Reset
+ SCURegister = inl (SCU_BASE + SCU_RESET_CONTROL);
+ outl (SCURegister & ~(0x04), SCU_BASE + SCU_RESET_CONTROL);
+//I2C Multi-Pin
+ SCURegister = inl (SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL5_REG);
+ outl ((SCURegister | 0x30000), SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL5_REG);
+//Reset
+ outl (0, I2C_FUNCTION_CONTROL_REGISTER);
+//Set AC Timing, we use fix AC timing for eeprom in u-boot
+ outl (AC_TIMING, I2C_AC_TIMING_REGISTER_1);
+ outl (0, I2C_AC_TIMING_REGISTER_2);
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Enable Master Mode
+ outl (MASTER_ENABLE, I2C_FUNCTION_CONTROL_REGISTER);
+//Enable Interrupt, STOP Interrupt has bug in AST2000
+ outl (0xAF, I2C_INTERRUPT_CONTROL_REGISTER);
+//Set Slave address, should not use for eeprom
+ outl (slaveadd, I2C_DEVICE_ADDRESS_REGISTER);
+}
+
+static int i2c_read_byte (u8 devaddr, u16 regoffset, u8 * value, int alen)
+{
+ int i2c_error = 0;
+ u32 status, count = 0;
+
+//Start and Send Device Address
+ outl (devaddr, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_START_COMMAND | MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Tx ACK
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & (TX_ACK | TX_NACK));
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Start and Send Device Address can't get ACK back\n");
+ return i2c_error;
+ }
+ } while (status != TX_ACK);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Check if address length equals to 16bits
+ if (alen != 1) {
+//Send Device Register Offset (HIGH BYTE)
+ outl ((regoffset & 0xFF00) >> 8, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Tx ACK
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & (TX_ACK | TX_NACK));
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Send Device Register Offset can't get ACK back\n");
+ return i2c_error;
+ }
+ } while (status != TX_ACK);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+ }
+//Send Device Register Offset(LOW)
+ outl (regoffset & 0xFF, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Tx ACK
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & (TX_ACK | TX_NACK));
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Send Device Register Offset can't get ACK back\n");
+ return i2c_error;
+ }
+ } while (status != TX_ACK);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Start, Send Device Address + 1 (Read Mode), Receive Data
+ outl (devaddr + 1, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_START_COMMAND | MASTER_TX_COMMAND | MASTER_RX_COMMAND | RX_COMMAND_LIST, I2C_COMMAND_REGISTER);
+//Wait Rx Done
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & RX_DONE);
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Can't get RX_DONE back\n");
+ return i2c_error;
+ }
+ } while (status != RX_DONE);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Enable Interrupt + Stop Interrupt
+ outl (0xBF, I2C_INTERRUPT_CONTROL_REGISTER);
+//Issue Stop Command
+ outl (MASTER_STOP_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Stop
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & STOP_DONE);
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Can't get STOP back\n");
+ return i2c_error;
+ }
+ } while (status != STOP_DONE);
+//Disable Stop Interrupt
+ outl (0xAF, I2C_INTERRUPT_CONTROL_REGISTER);
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Read Received Data
+ *value = ((inl (I2C_BYTE_BUFFER_REGISTER) & 0xFF00) >> 8);
+
+ return i2c_error;
+}
+
+static int i2c_write_byte (u8 devaddr, u16 regoffset, u8 value, int alen)
+{
+ int i2c_error = 0;
+ u32 status, count = 0;
+
+//Start and Send Device Address
+ outl (devaddr, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_START_COMMAND | MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Tx ACK
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & (TX_ACK | TX_NACK));
+ count++;
+ if (status == TX_NACK) {
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Re-send Start and Send Device Address while NACK return
+ outl (devaddr, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_START_COMMAND | MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+ }
+ else {
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Start and Send Device Address can't get ACK back\n");
+ return i2c_error;
+ }
+ }
+ } while (status != TX_ACK);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Check if address length equals to 16bits
+ if (alen != 1) {
+//Send Device Register Offset (HIGH BYTE)
+ outl ((regoffset & 0xFF00) >> 8, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Tx ACK
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & (TX_ACK | TX_NACK));
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Send Device Register Offset can't get ACK back\n");
+ return i2c_error;
+ }
+ } while (status != TX_ACK);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+ }
+//Send Device Register Offset
+ outl (regoffset & 0xFF, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Tx ACK
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & (TX_ACK | TX_NACK));
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Send Device Register Offset can't get ACK back\n");
+ return i2c_error;
+ }
+ } while (status != TX_ACK);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Send Device Register Value
+ outl (value, I2C_BYTE_BUFFER_REGISTER);
+ outl (MASTER_TX_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Tx ACK
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & (TX_ACK | TX_NACK));
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Send Device Register Value can't get ACK back\n");
+ return i2c_error;
+ }
+ } while (status != TX_ACK);
+ count = 0;
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+//Enable Interrupt + Stop Interrupt
+ outl (0xBF, I2C_INTERRUPT_CONTROL_REGISTER);
+//Issue Stop Command
+ outl (MASTER_STOP_COMMAND, I2C_COMMAND_REGISTER);
+//Wait Stop
+ do {
+ status = (inl (I2C_INTERRUPT_STATUS_REGISTER) & STOP_DONE);
+ count++;
+ if (count == LOOP_COUNT) {
+ i2c_error = 1;
+ printf ("Can't get STOP back\n");
+ return i2c_error;
+ }
+ } while (status != STOP_DONE);
+//Disable Stop Interrupt
+ outl (0xAF, I2C_INTERRUPT_CONTROL_REGISTER);
+//Clear Interrupt
+ outl (ALL_CLEAR, I2C_INTERRUPT_STATUS_REGISTER);
+
+ return i2c_error;
+}
+
+int i2c_probe (uchar chip)
+{
+//Suppose IP is always on chip
+ int res = 0;
+
+ return res;
+}
+
+int i2c_read (uchar device_addr, uint register_offset, int alen, uchar * buffer, int len)
+{
+ int i;
+
+ if ((alen == 1) && ((register_offset + len) > 256)) {
+ printf ("Register index overflow\n");
+ }
+
+ for (i = 0; i < len; i++) {
+ if (i2c_read_byte (device_addr, register_offset + i, &buffer[i], alen)) {
+ printf ("I2C read: I/O error\n");
+ i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+int i2c_write (uchar device_addr, uint register_offset, int alen, uchar * buffer, int len)
+{
+ int i;
+
+ if ((alen == 1) && ((register_offset + len) > 256)) {
+ printf ("Register index overflow\n");
+ }
+
+ for (i = 0; i < len; i++) {
+ if (i2c_write_byte (device_addr, register_offset + i, buffer[i], alen)) {
+ printf ("I2C read: I/O error\n");
+ i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+#endif /* CONFIG_DRIVER_ASPEED_I2C */
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 9cf2983..a1d19ca 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -68,6 +68,7 @@ COBJS-$(CONFIG_PLB2800_ETHER) += plb2800_eth.o
COBJS-$(CONFIG_RTL8139) += rtl8139.o
COBJS-$(CONFIG_RTL8169) += rtl8169.o
COBJS-$(CONFIG_SH_ETHER) += sh_eth.o
+COBJS-$(CONFIG_ASPEEDNIC) += aspeednic.o
COBJS-$(CONFIG_SMC91111) += smc91111.o
COBJS-$(CONFIG_SMC911X) += smc911x.o
COBJS-$(CONFIG_SUNXI_WEMAC) += sunxi_wemac.o
diff --git a/drivers/net/aspeednic.c b/drivers/net/aspeednic.c
new file mode 100644
index 0000000..6b1ce05
--- /dev/null
+++ b/drivers/net/aspeednic.c
@@ -0,0 +1,1528 @@
+/*
+ * 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
+ */
+
+#include <common.h>
+
+#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && defined(CONFIG_ASPEEDNIC)
+
+#include <malloc.h>
+#include <net.h>
+#include <pci.h>
+
+
+/*
+ SCU88 D[31]: MAC1 MDIO
+ SCU88 D[30]: MAC1 MDC
+ SCU90 D[2]: MAC2 MDC/MDIO
+ SCU80 D[0]: MAC1 Link
+ SCU80 D[1]: MAC2 Link
+*/
+#define pci_find_devices NULL
+#define pci_read_config_dword NULL
+#if defined(CONFIG_AST1300)
+#define SCU_BASE CONFIG_SCUREG_BASE
+#else
+#define SCU_BASE 0x1E6E2000
+#endif
+#define SCU_RESET_CONTROL 0x04
+#define SCU_CLOCK_SELECTION 0x08
+#define SCU_CLOCK_CONTROL 0x0C
+#define SCU_MAC_CLOCK_DELAY 0x48
+#define SCU_SCRATCH_REGISTER 0x40
+#define SCU_HARDWARE_TRAPPING 0x70
+#define SCU_PIN_MUX 0x74
+#define SCU_MULTIFUNCTION_PIN_CTL1_REG 0x80
+#define SCU_MULTIFUNCTION_PIN_CTL3_REG 0x88
+#define SCU_MULTIFUNCTION_PIN_CTL5_REG 0x90
+#define MAC_INTERFACE 0x1C0
+#define GMII 0x0
+#define MII 0x40
+#define MAC1_CLOCK_ENABLE (1 << 20)
+#define MAC2_CLOCK_ENABLE (1 << 21)
+#define MAC_AHB_CLOCK_DIVIDER (0x07 << 16)
+#if defined(CONFIG_AST2300_FPGA_2) || defined(CONFIG_AST2300) || defined(CONFIG_AST3100) || defined(CONFIG_AST2400)
+#define MAC1_MDIO (1 << 31)
+#define MAC1_MDC (1 << 30)
+#define MAC1_PHY_LINK (1 << 0)
+#define MAC2_MDC_MDIO (1 << 2)
+#define MAC1_PHY_LINK (1 << 0)
+#define MAC2_PHY_LINK (1 << 1)
+#else
+#define MAC2_MDC_MDIO (1 << 20)
+#define MAC2_MII (1 << 21)
+#define MAC1_PHY_LINK (1 << 25)
+#define MAC2_PHY_LINK (1 << 26)
+#endif
+
+#if defined(CONFIG_AST1300)
+unsigned int aspeednic_iobase[1] = {CONFIG_MACREG_BASE};
+#else
+unsigned int aspeednic_iobase[CONFIG_ASPEED_MAC_NUMBER] = {
+ 0x1E660000, 0x1E680000};
+#endif
+
+#undef DEBUG_SROM
+#undef DEBUG_SROM2
+
+#undef UPDATE_SROM
+
+/* PCI Registers.
+ */
+#define PCI_CFDA_PSM 0x43
+
+#define CFRV_RN 0x000000f0 /* Revision Number */
+
+#define WAKEUP 0x00 /* Power Saving Wakeup */
+#define SLEEP 0x80 /* Power Saving Sleep Mode */
+
+#define DC2114x_BRK 0x0020 /* CFRV break between DC21142 & DC21143 */
+
+/* MAC chip register */
+#define ISR_REG 0x00 // interrups status register
+#define IER_REG 0x04 // interrupt maks register
+#define MAC_MADR_REG 0x08 // MAC address (Most significant)
+#define MAC_LADR_REG 0x0c // MAC address (Least significant)
+
+#define MAHT0_REG 0x10 // Multicast Address Hash Table 0 register
+#define MAHT1_REG 0x14 // Multicast Address Hash Table 1 register
+#define TXPD_REG 0x18 // Transmit Poll Demand register
+#define RXPD_REG 0x1c // Receive Poll Demand register
+#define TXR_BADR_REG 0x20 // Transmit Ring Base Address register
+#define RXR_BADR_REG 0x24 // Receive Ring Base Address register
+
+#define HPTXPD_REG 0x28 //
+#define HPTXR_BADR_REG 0x2c //
+
+#define ITC_REG 0x30 // interrupt timer control register
+#define APTC_REG 0x34 // Automatic Polling Timer control register
+#define DBLAC_REG 0x38 // DMA Burst Length and Arbitration control register
+
+#define DMAFIFOS_REG 0x3c //
+#define FEAR_REG 0x44 //
+#define TPAFCR_REG 0x48 //
+#define RBSR_REG 0x4c //for NC Body
+#define MACCR_REG 0x50 // MAC control register
+#define MACSR_REG 0x54 // MAC status register
+#define PHYCR_REG 0x60 // PHY control register
+#define PHYDATA_REG 0x64 // PHY Write Data register
+#define FCR_REG 0x68 // Flow Control register
+#define BPR_REG 0x6c // back pressure register
+#define WOLCR_REG 0x70 // Wake-On-Lan control register
+#define WOLSR_REG 0x74 // Wake-On-Lan status register
+#define WFCRC_REG 0x78 // Wake-up Frame CRC register
+#define WFBM1_REG 0x80 // wake-up frame byte mask 1st double word register
+#define WFBM2_REG 0x84 // wake-up frame byte mask 2nd double word register
+#define WFBM3_REG 0x88 // wake-up frame byte mask 3rd double word register
+#define WFBM4_REG 0x8c // wake-up frame byte mask 4th double word register
+
+
+// --------------------------------------------------------------------
+// MACCR_REG
+// --------------------------------------------------------------------
+
+#define SW_RST_bit (1UL<<31) // software reset/
+#define DIRPATH_bit (1UL<<21)
+#define RX_IPCS_FAIL_bit (1UL<<20) //
+#define RX_TCPCS_FAIL_bit (1UL<<19) //
+#define SPEED_100M_MODE_bit (1UL<<19)
+#define RX_UDPCS_FAIL_bit (1UL<<18) //
+#define RX_BROADPKT_bit (1UL<<17) // Receiving broadcast packet
+#define RX_MULTIPKT_bit (1UL<<16) // receiving multicast packet
+#define RX_HT_EN_bit (1UL<<15)
+#define RX_ALLADR_bit (1UL<<14) // not check incoming packet's destination address
+#define JUMBO_LF_bit (1UL<<13) //
+#define RX_RUNT_bit (1UL<<12) // Store incoming packet even its length is les than 64 byte
+#define CRC_CHK_bit (1UL<<11) //
+#define CRC_APD_bit (1UL<<10) // append crc to transmit packet
+#define GMAC_MODE_bit (1UL<<9) //
+#define FULLDUP_bit (1UL<<8) // full duplex
+#define ENRX_IN_HALFTX_bit (1UL<<7) //
+#define LOOP_EN_bit (1UL<<6) // Internal loop-back
+#define HPTXR_EN_bit (1UL<<5) //
+#define REMOVE_VLAN_bit (1UL<<4) //
+#define RXMAC_EN_bit (1UL<<3) // receiver enable
+#define TXMAC_EN_bit (1UL<<2) // transmitter enable
+#define RXDMA_EN_bit (1UL<<1) // enable DMA receiving channel
+#define TXDMA_EN_bit (1UL<<0) // enable DMA transmitting channel
+
+//---------------------------------------------------
+// PHY R/W Register Bit
+//---------------------------------------------------
+#define MIIWR (1UL<<27)
+#define MIIRD (1UL<<26)
+#define MDC_CYCTHR 0x34
+#define PHY_SPEED_MASK 0xC000
+#define PHY_DUPLEX_MASK 0x2000
+#define SPEED_1000M 0x02
+#define SPEED_100M 0x01
+#define SPEED_10M 0x00
+#define DUPLEX_FULL 0x01
+#define DUPLEX_HALF 0x00
+#define RESOLVED_BIT 0x800
+
+#define PHY_SPEED_DUPLEX_MASK 0x01E0
+#define PHY_100M_DUPLEX 0x0100
+#define PHY_100M_HALF 0x0080
+#define PHY_10M_DUPLEX 0x0040
+#define PHY_10M_HALF 0x0020
+
+
+
+/* Descriptor bits.
+ */
+#define TXDMA_OWN 0x80000000 /* Own Bit */
+#define RXPKT_RDY 0x00000000
+#define RXPKT_STATUS 0x80000000
+//#define EDORR 0x00008000 /* Receive End Of Ring */
+#define EDORR 0x40000000 /* Receive End Of Ring */
+#define LRS 0x10000000 /* Last Descriptor */
+#define RD_ES 0x00008000 /* Error Summary */
+//#define EDOTR 0x00008000 /* Transmit End Of Ring */
+#define EDOTR 0x40000000 /* Transmit End Of Ring */
+#define T_OWN 0x80000000 /* Own Bit */
+#define LTS 0x10000000 /* Last Segment */
+#define FTS 0x20000000 /* First Segment */
+#define CRC_ERR 0x00080000
+#define TD_ES 0x00008000 /* Error Summary */
+#define TD_SET 0x08000000 /* Setup Packet */
+#define RX_ERR 0x00040000
+#define FTL 0x00100000
+#define RUNT 0x00200000
+#define RX_ODD_NB 0x00400000
+
+#define POLL_DEMAND 1
+#define RESET_DE4X5(dev) { \
+ int i; \
+ i=INL(dev, MACCR_REG); \
+ udelay(1000); \
+ OUTL(dev, i | SW_RST_bit, MACCR_REG); \
+ for (; (INL(dev, MACCR_REG ) & SW_RST_bit) != 0; ) {udelay(1000);} \
+ OUTL(dev, 0, IER_REG ); \
+ }
+
+#define START_MAC(dev) { \
+ s32 omr; \
+ omr = INL(dev, MACCR_REG); \
+ omr |= RXMAC_EN_bit | TXMAC_EN_bit | RXDMA_EN_bit | TXDMA_EN_bit; \
+ OUTL(dev, omr, MACCR_REG); /* Enable the TX and/or RX */ \
+ }
+
+#define STOP_MAC(dev) { \
+ s32 omr; \
+ omr = INL(dev, MACCR_REG); \
+ omr &= ~(RXMAC_EN_bit | TXMAC_EN_bit | RXDMA_EN_bit | TXDMA_EN_bit); \
+ OUTL(dev, omr, MACCR_REG); /* Disable the TX and/or RX */ \
+ }
+
+#define NUM_RX_DESC PKTBUFSRX
+#define NUM_TX_DESC 1 /* Number of TX descriptors */
+#define RX_BUFF_SZ PKTSIZE_ALIGN
+#define TX_BUFF_SZ 1514
+
+#define TOUT_LOOP 1000000
+#define PHY_LOOP 250
+#define ETH_ALEN 6
+#define NCSI_LOOP 1500000
+#define RETRY_COUNT 1
+
+struct de4x5_desc {
+ volatile s32 status;
+ u32 des1;
+ u32 reserved;
+ u32 buf;
+};
+
+//PHY Information
+#define PHYID_VENDOR_MASK 0xfffffc00
+#define PHYID_VENDOR_MODEL_MASK 0xfffffff0
+#define PHYID_VENDOR_MARVELL 0x01410c00
+#define PHYID_VENDOR_BROADCOM 0x00406000
+#define PHYID_VENDOR_REALTEK 0x001cc800
+#define PHYID_RTL8201EL 0x001cc810
+#define PHYID_RTL8211 0x001cc910
+#define PHYID_BCM54612E 0x03625E6A
+
+//NCSI define & structure
+//NC-SI Command Packet
+typedef struct {
+//Ethernet Header
+ unsigned char DA[6];
+ unsigned char SA[6];
+ unsigned short EtherType; //DMTF NC-SI
+//NC-SI Control Packet
+ unsigned char MC_ID; //Management Controller should set this field to 0x00
+ unsigned char Header_Revision; //For NC-SI 1.0 spec, this field has to set 0x01
+ unsigned char Reserved_1; //Reserved has to set to 0x00
+ unsigned char IID; //Instance ID
+ unsigned char Command;
+ unsigned char Channel_ID;
+ unsigned short Payload_Length; //Payload Length = 12 bits, 4 bits are reserved
+ unsigned long Reserved_2;
+ unsigned long Reserved_3;
+} NCSI_Command_Packet;
+
+unsigned char Payload_Data[16];
+unsigned char Payload_Pad[4] = {0x00, 0x00, 0x00, 0x00};
+unsigned long Payload_Checksum = 0x00000000;
+
+
+//Command and Response Type
+#define CLEAR_INITIAL_STATE 0x00 //M
+#define SELECT_PACKAGE 0x01 //M
+#define DESELECT_PACKAGE 0x02 //M
+#define ENABLE_CHANNEL 0x03 //M
+#define DISABLE_CHANNEL 0x04 //M
+#define RESET_CHANNEL 0x05 //M
+#define ENABLE_CHANNEL_NETWORK_TX 0x06 //M
+#define DISABLE_CHANNEL_NETWORK_TX 0x07 //M
+#define AEN_ENABLE 0x08
+#define SET_LINK 0x09 //M
+#define GET_LINK_STATUS 0x0A //M
+#define SET_VLAN_FILTER 0x0B //M
+#define ENABLE_VLAN 0x0C //M
+#define DISABLE_VLAN 0x0D //M
+#define SET_MAC_ADDRESS 0x0E //M
+#define ENABLE_BROADCAST_FILTERING 0x10 //M
+#define DISABLE_BROADCAST_FILTERING 0x11 //M
+#define ENABLE_GLOBAL_MULTICAST_FILTERING 0x12
+#define DISABLE_GLOBAL_MULTICAST_FILTERING 0x13
+#define SET_NCSI_FLOW_CONTROL 0x14
+#define GET_VERSION_ID 0x15 //M
+#define GET_CAPABILITIES 0x16 //M
+#define GET_PARAMETERS 0x17 //M
+#define GET_CONTROLLER_PACKET_STATISTICS 0x18
+#define GET_NCSI_STATISTICS 0x19
+#define GET_NCSI_PASS_THROUGH_STATISTICS 0x1A
+
+//NC-SI Response Packet
+typedef struct {
+ unsigned char DA[6];
+ unsigned char SA[6];
+ unsigned short EtherType; //DMTF NC-SI
+//NC-SI Control Packet
+ unsigned char MC_ID; //Management Controller should set this field to 0x00
+ unsigned char Header_Revision; //For NC-SI 1.0 spec, this field has to set 0x01
+ unsigned char Reserved_1; //Reserved has to set to 0x00
+ unsigned char IID; //Instance ID
+ unsigned char Command;
+ unsigned char Channel_ID;
+ unsigned short Payload_Length; //Payload Length = 12 bits, 4 bits are reserved
+ unsigned short Reserved_2;
+ unsigned short Reserved_3;
+ unsigned short Reserved_4;
+ unsigned short Reserved_5;
+ unsigned short Response_Code;
+ unsigned short Reason_Code;
+ unsigned char Payload_Data[64];
+} NCSI_Response_Packet;
+
+NCSI_Command_Packet NCSI_Request;
+NCSI_Response_Packet NCSI_Respond;
+
+//Standard Response Code
+#define COMMAND_COMPLETED 0x00
+#define COMMAND_FAILED 0x01
+#define COMMAND_UNAVAILABLE 0x02
+#define COMMAND_UNSUPPORTED 0x03
+
+//Standard Reason Code
+#define NO_ERROR 0x0000
+#define INTERFACE_INITIALIZATION_REQUIRED 0x0001
+#define PARAMETER_IS_INVALID 0x0002
+#define CHANNEL_NOT_READY 0x0003
+#define PACKAGE_NOT_READY 0x0004
+#define INVALID_PAYLOAD_LENGTH 0x0005
+#define UNKNOWN_COMMAND_TYPE 0x7FFF
+
+
+struct AEN_Packet {
+//Ethernet Header
+ unsigned char DA[6];
+ unsigned char SA[6]; //Network Controller SA = FF:FF:FF:FF:FF:FF
+ unsigned short EtherType; //DMTF NC-SI
+//AEN Packet Format
+ unsigned char MC_ID; //Network Controller should set this field to 0x00
+ unsigned char Header_Revision; //For NC-SI 1.0 spec, this field has to set 0x01
+ unsigned char Reserved_1; //Reserved has to set to 0x00
+// unsigned char IID = 0x00; //Instance ID = 0 in Network Controller
+// unsigned char Command = 0xFF; //AEN = 0xFF
+ unsigned char Channel_ID;
+// unsigned short Payload_Length = 0x04; //Payload Length = 4 in Network Controller AEN Packet
+ unsigned long Reserved_2;
+ unsigned long Reserved_3;
+ unsigned char AEN_Type;
+// unsigned char Reserved_4[3] = {0x00, 0x00, 0x00};
+ unsigned long Optional_AEN_Data;
+ unsigned long Payload_Checksum;
+};
+
+//AEN Type
+#define LINK_STATUS_CHANGE 0x0
+#define CONFIGURATION_REQUIRED 0x1
+#define HOST_NC_DRIVER_STATUS_CHANGE 0x2
+
+typedef struct {
+ unsigned char Package_ID;
+ unsigned char Channel_ID;
+ unsigned long Capabilities_Flags;
+ unsigned long Broadcast_Packet_Filter_Capabilities;
+ unsigned long Multicast_Packet_Filter_Capabilities;
+ unsigned long Buffering_Capabilities;
+ unsigned long AEN_Control_Support;
+} NCSI_Capability;
+NCSI_Capability NCSI_Cap;
+
+//SET_MAC_ADDRESS
+#define UNICAST (0x00 << 5)
+#define MULTICAST (0x01 << 5)
+#define DISABLE_MAC_ADDRESS_FILTER 0x00
+#define ENABLE_MAC_ADDRESS_FILTER 0x01
+
+//GET_LINK_STATUS
+#define LINK_DOWN 0
+#define LINK_UP 1
+
+static struct de4x5_desc rx_ring[NUM_RX_DESC] __attribute__ ((aligned(32))); /* RX descriptor ring */
+static struct de4x5_desc tx_ring[NUM_TX_DESC] __attribute__ ((aligned(32))); /* TX descriptor ring */
+static int rx_new; /* RX descriptor ring pointer */
+static int tx_new; /* TX descriptor ring pointer */
+static unsigned char tx_buffer[NUM_TX_DESC][TX_BUFF_SZ] __attribute__ ((aligned(32)));
+static unsigned char rx_buffer[NUM_RX_DESC][RX_BUFF_SZ] __attribute__ ((aligned(32)));
+
+
+static char rxRingSize;
+static char txRingSize;
+static unsigned int InstanceID = 0;
+static int Retry = 0;
+
+static int aspeednic_init(struct eth_device* dev, bd_t* bis);
+static int aspeednic_send(struct eth_device* dev, volatile void *packet, int length);
+static int aspeednic_recv(struct eth_device* dev);
+static void aspeednic_halt(struct eth_device* dev);
+static void set_mac_address (struct eth_device* dev, bd_t* bis);
+static void phy_write_register (struct eth_device* dev, u8 PHY_Register, u8 PHY_Address, u16 PHY_Data);
+static u16 phy_read_register (struct eth_device* dev, u8 PHY_Register, u8 PHY_Address);
+static void set_mac_control_register(struct eth_device* dev);
+
+#if defined(CONFIG_E500)
+#define phys_to_bus(a) (a)
+#else
+#define phys_to_bus(a) pci_phys_to_mem((pci_dev_t)dev->priv, a)
+#endif
+
+static int INL(struct eth_device* dev, u_long addr)
+{
+ return le32_to_cpu(*(volatile u_long *)(addr + dev->iobase));
+}
+
+static void OUTL(struct eth_device* dev, int command, u_long addr)
+{
+ *(volatile u_long *)(addr + dev->iobase) = cpu_to_le32(command);
+}
+
+
+struct eth_device aspeednic_device[CONFIG_ASPEED_MAC_NUMBER];
+
+void NCSI_Struct_Initialize(void)
+{
+ unsigned long i;
+
+ for (i = 0; i < 6; i++) {
+ NCSI_Request.DA[i] = 0xFF;
+ NCSI_Respond.DA[i] = 0xFF;
+ NCSI_Respond.SA[i] = 0xFF;
+ }
+ NCSI_Request.EtherType = 0xF888;
+ NCSI_Request.MC_ID = 0;
+ NCSI_Request.Header_Revision = 0x01;
+ NCSI_Request.Reserved_1 = 0;
+ NCSI_Request.Reserved_2 = 0;
+ NCSI_Request.Reserved_3 = 0;
+ NCSI_Respond.EtherType = 0xF888;
+ NCSI_Respond.MC_ID = 0;
+ NCSI_Respond.Header_Revision = 0x01;
+ NCSI_Respond.Reserved_1 = 0;
+ NCSI_Respond.Reserved_2 = 0;
+ NCSI_Respond.Reserved_3 = 0;
+}
+
+int aspeednic_initialize(bd_t *bis)
+{
+ int card_number = 0;
+ unsigned int iobase, SCURegister;
+ struct eth_device* dev;
+
+#if defined(CONFIG_AST2300_FPGA_2) || defined(CONFIG_AST2300) || defined(CONFIG_AST3100) || defined(CONFIG_AST2400)
+//AST2300
+//MAC1 CLOCK/RESET/PHY_LINK/MDC_MDIO in SCU
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL) = cpu_to_le32(SCURegister | 0x800);
+ udelay(100);
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_CLOCK_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_CLOCK_CONTROL) = cpu_to_le32(SCURegister & ~(MAC1_CLOCK_ENABLE));
+ udelay(10000);
+//Add Clock Selection in AST2300 A1, Please check the datasheet for more detail
+//The current sample code uses 0: H-PLL/2 because all EVBs have RGMII interface
+// SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_CLOCK_SELECTION));
+// *(volatile u_long *)(SCU_BASE + SCU_CLOCK_SELECTION) = cpu_to_le32(SCURegister & ~(MAC_AHB_CLOCK_DIVIDER));
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL) = cpu_to_le32(SCURegister & ~(0x800));
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL3_REG));
+ *(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL3_REG) = cpu_to_le32(SCURegister | (MAC1_MDIO | MAC1_MDC));
+// SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_MAC_CLOCK_DELAY));
+//Currently we use fix value in MAC timing on EVB
+// *(volatile u_long *)(SCU_BASE + SCU_MAC_CLOCK_DELAY) = CONFIG_MAC_INTERFACE_CLOCK_DELAY;
+#ifdef CONFIG_MAC1_PHY_LINK_INTERRUPT
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL1_REG));
+ *(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL1_REG) = cpu_to_le32(SCURegister | (MAC1_PHY_LINK));
+#endif
+
+//MAC2 CLOCK/RESET/PHY_LINK/MDC_MDIO
+#ifdef CONFIG_MAC2_ENABLE
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL) = cpu_to_le32(SCURegister | 0x1000);
+ udelay(10);
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_CLOCK_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_CLOCK_CONTROL) = cpu_to_le32(SCURegister & ~(MAC2_CLOCK_ENABLE));
+ udelay(10000);
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL) = cpu_to_le32(SCURegister & ~(0x1000));
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL5_REG));
+ *(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL5_REG) = cpu_to_le32(SCURegister | (MAC2_MDC_MDIO));
+#endif
+#ifdef CONFIG_MAC2_PHY_LINK_INTERRUPT
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL1_REG));
+ *(volatile u_long *)(SCU_BASE + SCU_MULTIFUNCTION_PIN_CTL1_REG) = cpu_to_le32(SCURegister | (MAC2_PHY_LINK));
+#endif
+#else
+//AST1100/AST2050/AST2100
+//MAC1 RESET/PHY_LINK in SCU
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL) = cpu_to_le32(SCURegister & ~(0x800));
+#ifdef CONFIG_MAC1_PHY_LINK_INTERRUPT
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_PIN_MUX));
+ *(volatile u_long *)(SCU_BASE + SCU_PIN_MUX) = cpu_to_le32(SCURegister | (MAC1_PHY_LINK));
+#endif
+
+//MAC2
+#ifdef CONFIG_MAC2_ENABLE
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL));
+ *(volatile u_long *)(SCU_BASE + SCU_RESET_CONTROL) = cpu_to_le32(SCURegister & ~(0x1000));
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_PIN_MUX));
+ *(volatile u_long *)(SCU_BASE + SCU_PIN_MUX) = cpu_to_le32(SCURegister | (MAC2_MDC_MDIO));
+#endif
+#ifdef CONFIG_MAC2_MII_ENABLE
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_PIN_MUX));
+ *(volatile u_long *)(SCU_BASE + SCU_PIN_MUX) = cpu_to_le32(SCURegister | (MAC2_MII));
+#endif
+#ifdef CONFIG_MAC2_PHY_LINK_INTERRUPT
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_PIN_MUX));
+ *(volatile u_long *)(SCU_BASE + SCU_PIN_MUX) = cpu_to_le32(SCURegister | (MAC2_PHY_LINK));
+#endif
+#endif
+
+ iobase = aspeednic_iobase[card_number];
+
+ dev = &aspeednic_device[card_number];
+
+
+ sprintf(dev->name, "aspeednic#%d", card_number);
+
+ dev->iobase = iobase;
+
+ if (CONFIG_MAC1_PHY_SETTING >= 1) {
+//NCSI Struct Initialize
+ NCSI_Struct_Initialize();
+ }
+//Set Scratch register (0x1E6E2040 D[15:14])(0x1E6E2041 D[7:6]) to inform kernel MAC1 driver
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_SCRATCH_REGISTER));
+ *(volatile u_long *)(SCU_BASE + SCU_SCRATCH_REGISTER) = cpu_to_le32((SCURegister & ~(0xc000)) | (CONFIG_MAC1_PHY_SETTING << 14));
+//Set Scratch register (0x1E6E2040 D[13:12])(0x1E6E2041 D[5:4]) to inform kernel MAC2 driver
+ SCURegister = le32_to_cpu(*(volatile u_long *)(SCU_BASE + SCU_SCRATCH_REGISTER));
+ *(volatile u_long *)(SCU_BASE + SCU_SCRATCH_REGISTER) = cpu_to_le32((SCURegister & ~(0x3000)) | (CONFIG_MAC2_PHY_SETTING << 12));
+
+
+ dev->init = aspeednic_init;
+ dev->halt = aspeednic_halt;
+ dev->send = aspeednic_send;
+ dev->recv = aspeednic_recv;
+
+ /* Ensure we're not sleeping. */
+ if (CONFIG_MAC1_PHY_SETTING >= 1) {
+ udelay(2000000); //2.0 sec
+ }
+ else {
+ udelay(10 * 1000);
+ }
+
+
+ dev->init(dev, bis);
+
+ eth_register(dev);
+
+
+ return card_number;
+}
+
+void Calculate_Checksum(unsigned char *buffer_base, int Length)
+{
+ unsigned int i, CheckSum = 0;
+ unsigned int Data, Data1;
+
+ for (i = 0; i < ((Length - 14) / 2); i++) {
+ Data = buffer_base[i * 2];
+ Data1 = buffer_base[i * 2 + 1];
+ CheckSum += ((Data << 8) + Data1);
+ }
+ Payload_Checksum = (~(CheckSum) + 1); //2's complement
+//Inverse for insert into buffer
+ Data = (Payload_Checksum & 0xFF000000) >> 24;
+ Data1 = (Payload_Checksum & 0x000000FF) << 24;
+ Payload_Checksum = (Payload_Checksum & 0x00FFFF00) + Data + Data1;
+ Data = (Payload_Checksum & 0x00FF0000) >> 8;
+ Data1 = (Payload_Checksum & 0x0000FF00) << 8;
+ Payload_Checksum = (Payload_Checksum & 0xFF0000FF) + Data + Data1;
+}
+
+void copy_data (int Length)
+{
+ memcpy ((unsigned char *)(tx_ring[tx_new].buf + 30), &Payload_Data, Length);
+ Calculate_Checksum((unsigned char *)(tx_ring[tx_new].buf + 14), 30 + Length);
+ memcpy ((unsigned char *)(tx_ring[tx_new].buf + 30 + Length), &Payload_Checksum, 4);
+}
+
+void NCSI_Rx (void)
+{
+ unsigned long status, length, i = 0;
+
+ do {
+ status = (s32)le32_to_cpu(rx_ring[rx_new].status);
+ i++;
+ } while (!(((status & RXPKT_STATUS) != 0) || (i >= NCSI_LOOP)));
+
+ if (i < NCSI_LOOP) {
+ if (status & LRS) {
+ length = (le32_to_cpu(rx_ring[rx_new].status) & 0x3FFF);
+ memcpy (&NCSI_Respond, (unsigned char *)rx_ring[rx_new].buf, length);
+ }
+ rx_ring[rx_new].status &= cpu_to_le32(0x7FFFFFFF);
+ rx_new = (rx_new + 1) % rxRingSize;
+ }
+}
+
+void DeSelect_Package (struct eth_device* dev, int Package_ID)
+{
+ unsigned long Combined_Channel_ID;
+
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = DESELECT_PACKAGE;
+ Combined_Channel_ID = (Package_ID << 5) + 0x1F; //Internal Channel ID = 0x1F, 0x1F means all channel
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (DESELECT_PACKAGE | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+int Select_Package (struct eth_device* dev, int Package_ID)
+{
+ unsigned long Combined_Channel_ID, Found = 0;
+
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = SELECT_PACKAGE;
+ Combined_Channel_ID = (Package_ID << 5) + 0x1F; //Internal Channel ID = 0x1F
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = (4 << 8);
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ NCSI_Request.Payload_Length = 4;
+ memset ((void *)Payload_Data, 0, 4);
+ Payload_Data[3] = 1; //Arbitration Disable
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (SELECT_PACKAGE | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ Found = 0;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ Found = 1;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+
+ return Found;
+}
+
+void DeSelect_Active_Package (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = DESELECT_PACKAGE;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + 0x1F; //Internal Channel ID = 0x1F, 0x1F means all channel
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (DESELECT_PACKAGE | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+int Select_Active_Package (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID, Found = 0;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = SELECT_PACKAGE;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + 0x1F; //Internal Channel ID = 0x1F
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = (4 << 8);
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ NCSI_Request.Payload_Length = 4;
+ memset ((void *)Payload_Data, 0, 4);
+ Payload_Data[3] = 1; //Arbitration Disable
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (SELECT_PACKAGE | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ Found = 0;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ Found = 1;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+
+ return Found;
+}
+
+int Clear_Initial_State (struct eth_device* dev, int Channel_ID)
+{
+ unsigned long Combined_Channel_ID, Found = 0;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = CLEAR_INITIAL_STATE;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + Channel_ID; //Internal Channel ID = 0
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (CLEAR_INITIAL_STATE | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ Found = 0;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ Found = 1;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+
+ return Found;
+}
+
+void Get_Version_ID (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = GET_VERSION_ID;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (GET_VERSION_ID | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Get_Capabilities (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = GET_CAPABILITIES;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (GET_CAPABILITIES | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ NCSI_Cap.Capabilities_Flags = NCSI_Respond.Payload_Data[0];
+ NCSI_Cap.Broadcast_Packet_Filter_Capabilities = NCSI_Respond.Payload_Data[1];
+ NCSI_Cap.Multicast_Packet_Filter_Capabilities = NCSI_Respond.Payload_Data[2];
+ NCSI_Cap.Buffering_Capabilities = NCSI_Respond.Payload_Data[3];
+ NCSI_Cap.AEN_Control_Support = NCSI_Respond.Payload_Data[4];
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Enable_Set_MAC_Address (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID, i;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = SET_MAC_ADDRESS;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = (8 << 8);
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ NCSI_Request.Payload_Length = 8;
+ for (i = 0; i < 6; i++) {
+ Payload_Data[i] = NCSI_Request.SA[i];
+ }
+ Payload_Data[6] = 1; //MAC Address Num = 1 --> address filter 1, fixed in sample code
+ Payload_Data[7] = UNICAST + 0 + ENABLE_MAC_ADDRESS_FILTER; //AT + Reserved + E
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (SET_MAC_ADDRESS | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Enable_Broadcast_Filter (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = ENABLE_BROADCAST_FILTERING;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = (4 << 8);
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ NCSI_Request.Payload_Length = 4;
+ memset ((void *)Payload_Data, 0, 4);
+ Payload_Data[3] = 0xF; //ARP, DHCP, NetBIOS
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (ENABLE_BROADCAST_FILTERING | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Enable_AEN (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = AEN_ENABLE;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = (8 << 8);
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ NCSI_Request.Payload_Length = 8;
+ memset ((void *)Payload_Data, 0, 8);
+ Payload_Data[3] = 0x00; //MC ID
+ Payload_Data[7] = 0x01; //Link Status only
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (AEN_ENABLE | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Enable_Network_TX (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = ENABLE_CHANNEL_NETWORK_TX;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (ENABLE_CHANNEL_NETWORK_TX | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Disable_Network_TX (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = DISABLE_CHANNEL_NETWORK_TX;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (DISABLE_CHANNEL_NETWORK_TX | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Enable_Channel (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = ENABLE_CHANNEL;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (ENABLE_CHANNEL | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+void Disable_Channel (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = DISABLE_CHANNEL;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = (4 << 8);
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ NCSI_Request.Payload_Length = 4;
+ memset ((void *)Payload_Data, 0, 4);
+ Payload_Data[3] = 0x1; //ALD
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (DISABLE_CHANNEL | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+int Get_Link_Status (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = GET_LINK_STATUS;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = 0;
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (GET_LINK_STATUS | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+ if (NCSI_Respond.Payload_Data[3] & 0x40) {
+ return (NCSI_Respond.Payload_Data[3] & 0x01); //Link Up or Not
+ }
+ else {
+ return 0; //Auto Negotiate did not finish
+ }
+}
+
+void Set_Link (struct eth_device* dev)
+{
+ unsigned long Combined_Channel_ID;
+//TX
+ do {
+ InstanceID++;
+ NCSI_Request.IID = InstanceID;
+ NCSI_Request.Command = SET_LINK;
+ Combined_Channel_ID = (NCSI_Cap.Package_ID << 5) + NCSI_Cap.Channel_ID;
+ NCSI_Request.Channel_ID = Combined_Channel_ID;
+ NCSI_Request.Payload_Length = (8 << 8);
+ memcpy ((unsigned char *)tx_ring[tx_new].buf, &NCSI_Request, 30);
+ NCSI_Request.Payload_Length = 8;
+ memset ((void *)Payload_Data, 0, 8);
+ Payload_Data[2] = 0x02; //full duplex
+ Payload_Data[3] = 0x04; //100M, auto-disable
+ copy_data (NCSI_Request.Payload_Length);
+ aspeednic_send (dev, (void *)tx_ring[tx_new].buf, 30 + NCSI_Request.Payload_Length + 4);
+//RX
+ NCSI_Rx();
+ if ((NCSI_Respond.IID != InstanceID) || (NCSI_Respond.Command != (SET_LINK | 0x80)) || (NCSI_Respond.Response_Code != COMMAND_COMPLETED)) {
+ printf ("Retry: Command = %x, Response_Code = %x\n", NCSI_Request.Command, NCSI_Respond.Response_Code);
+ Retry++;
+ InstanceID--;
+ }
+ else {
+ Retry = 0;
+ }
+ } while ((Retry != 0) && (Retry <= RETRY_COUNT));
+ Retry = 0;
+}
+
+static int aspeednic_init(struct eth_device* dev, bd_t* bis)
+{
+ unsigned long i, Package_Found = 0, Channel_Found = 0, Re_Send = 0, Link_Status;
+
+ RESET_DE4X5(dev);
+ set_mac_address (dev, bis);
+ set_mac_control_register (dev);
+
+ for (i = 0; i < NUM_RX_DESC; i++) {
+ rx_ring[i].status = cpu_to_le32(RXPKT_RDY + RX_BUFF_SZ);
+ rx_ring[i].buf = (u32)(&rx_buffer[i]);
+ rx_ring[i].reserved = 0;
+ }
+
+ for (i=0; i < NUM_TX_DESC; i++) {
+ tx_ring[i].status = 0;
+ tx_ring[i].des1 = 0;
+ tx_ring[i].buf = (u32)(&tx_buffer[i]);
+ tx_ring[i].reserved = 0;
+ }
+
+ rxRingSize = NUM_RX_DESC;
+ txRingSize = NUM_TX_DESC;
+
+ rx_ring[rxRingSize - 1].status |= cpu_to_le32(EDORR);
+ tx_ring[txRingSize - 1].status |= cpu_to_le32(EDOTR);
+
+ OUTL(dev, ((u32) &tx_ring), TXR_BADR_REG);
+ OUTL(dev, ((u32) &rx_ring), RXR_BADR_REG);
+
+ START_MAC(dev);
+
+ tx_new = 0;
+ rx_new = 0;
+
+ if (CONFIG_MAC1_PHY_SETTING >= 1) {
+//NCSI Start
+//DeSelect Package/ Select Package
+ for (i = 0; i < 4; i++) {
+ DeSelect_Package (dev, i);
+ Package_Found = Select_Package (dev, i);
+ if (Package_Found == 1) {
+//AST2100/AST2050/AST1100 supports 1 package only in current firmware version
+ NCSI_Cap.Package_ID = i;
+// Package_Found = 0;
+ break;
+ }
+ }
+ if (Package_Found != 0) {
+//Initiali State
+ for (i = 0; i < 2; i++) { //Suppose 2 channels in current version, You could modify it to 0x1F to support 31 channels
+ Channel_Found = Clear_Initial_State(dev, i);
+ if (Channel_Found == 1) {
+ NCSI_Cap.Channel_ID = i;
+ printf ("Found NCSI Network Controller at (%d, %d)\n", NCSI_Cap.Package_ID, NCSI_Cap.Channel_ID);
+//Get Version and Capabilities
+ Get_Version_ID(dev);
+ Get_Capabilities(dev);
+ Select_Active_Package(dev);
+//Configuration
+ Enable_Set_MAC_Address(dev);
+ Enable_Broadcast_Filter(dev);
+//Enable TX
+ Enable_Network_TX(dev);
+//Enable Channel
+ Enable_Channel(dev);
+//Get Link Status
+ Re_Get_Link_Status:
+ Link_Status = Get_Link_Status(dev);
+ if (Link_Status == LINK_UP) {
+ printf ("Using NCSI Network Controller (%d, %d)\n", NCSI_Cap.Package_ID, NCSI_Cap.Channel_ID);
+ break;
+ }
+ else if ((Link_Status == LINK_DOWN) && (Re_Send < 2)) {
+ Re_Send++;
+ goto Re_Get_Link_Status;
+ }
+//Disable TX
+ Disable_Network_TX(dev);
+//Disable Channel
+// Disable_Channel(dev);
+ Re_Send = 0;
+ Channel_Found = 0;
+ }
+ }
+ }
+ }
+ return 1;
+}
+
+static int aspeednic_send(struct eth_device* dev, volatile void *packet, int length)
+{
+ int status = -1, oldlength = 0, fail = 0;
+ int i;
+
+ if (length <= 0) {
+ printf("%s: bad packet size: %d\n", dev->name, length);
+ goto Done;
+ }
+
+
+ for(i = 0; (tx_ring[tx_new].status & cpu_to_le32(TXDMA_OWN)) == 0x80000000; i++) {
+ if (i >= TOUT_LOOP) {
+ printf("%s: tx error buffer not ready\n", dev->name);
+ fail = 1;
+ goto Done;
+ }
+ }
+
+
+ if (length < 60) {
+ oldlength = length;
+// memset ((void *)cpu_to_le32((u32) (packet + length)), 0, 60 - length);
+ length = 60;
+ }
+ tx_ring[tx_new].buf = cpu_to_le32(((u32) packet));
+ tx_ring[tx_new].status &= (~(0x3FFF));
+ tx_ring[tx_new].status |= cpu_to_le32(LTS | FTS | length);
+ tx_ring[tx_new].status |= cpu_to_le32(TXDMA_OWN);
+
+ OUTL(dev, POLL_DEMAND, TXPD_REG);
+
+ for (i = 0; (tx_ring[tx_new].status & cpu_to_le32(TXDMA_OWN)) == 0x80000000; i++)
+ {
+ if (i >= TOUT_LOOP)
+ {
+ printf(".%s: tx buffer not ready\n", dev->name);
+ fail = 1;
+ goto Done;
+ }
+ }
+
+ if (fail != 1) {
+ status = oldlength;
+ }
+
+ Done:
+ tx_new = (tx_new+1) % NUM_TX_DESC;
+
+ return status;
+}
+
+static int aspeednic_recv(struct eth_device* dev)
+{
+ s32 status;
+ int length = 0;
+
+ for ( ; ; )
+ {
+ status = (s32)le32_to_cpu(rx_ring[rx_new].status);
+
+ if ((status & RXPKT_STATUS) == 0) {
+ break;
+ }
+
+ if (status & LRS) {
+ /* Valid frame status.
+ */
+ if (status & (RX_ERR | CRC_ERR | FTL | RUNT | RX_ODD_NB)) {
+
+ /* There was an error.
+ */
+ printf("RX error status = 0x%08X\n", status);
+ } else {
+ /* A valid frame received.
+ */
+ length = (le32_to_cpu(rx_ring[rx_new].status) & 0x3FFF);
+ debug("%s(): RX buffer %d, %x received\n",
+ __func__, rx_new, length);
+
+
+ /* Pass the packet up to the protocol
+ * layers.
+ */
+ NetReceive(rx_buffer[rx_new], length - 4);
+ }
+
+ /* Change buffer ownership for this frame, back
+ * to the adapter.
+ */
+ rx_ring[rx_new].status &= cpu_to_le32(0x7FFFFFFF);
+// rx_ring[rx_new].status = cpu_to_le32(RXPKT_RDY);
+ }
+
+ /* Update entry information.
+ */
+ rx_new = (rx_new + 1) % rxRingSize;
+ }
+
+ return length;
+}
+
+static void aspeednic_halt(struct eth_device* dev)
+{
+ STOP_MAC(dev);
+}
+
+static void set_mac_address (struct eth_device* dev, bd_t* bis)
+{
+ unsigned char mac_address[6]; // 6 bytes mac address
+ unsigned char ethaddress[20]; // string for setenv function
+ char *s;
+ int i, env; // env variable 0: eeprom, 1: environment parameters
+
+ s = getenv ("eeprom");
+ env = (s && (*s == 'y')) ? 0 : 1;
+
+ if (env == 0) {
+ env = 1;
+ eeprom_init ();
+ eeprom_read (0xA0, 0, mac_address, 6);
+
+ for (i = 0; i < 6; i++) {
+ if (mac_address[i] != 0xFF) {
+ env = 0; //Suppose not all 0xFF is valid
+ }
+ }
+ }
+
+ if (env == 0) { // EEPROM
+ sprintf (ethaddress, "%02X:%02X:%02X:%02X:%02X:%02X", mac_address[0], mac_address[1], mac_address[2], mac_address[3], mac_address[4], mac_address[5]);
+ setenv ("ethaddr", ethaddress);
+ OUTL(dev, ((mac_address[2] << 24) | (mac_address[3] << 16) | (mac_address[4] << 8) | mac_address[5]), MAC_LADR_REG);
+ OUTL(dev, ((mac_address[0] << 8) | mac_address[1]), MAC_MADR_REG);
+ if (CONFIG_MAC1_PHY_SETTING >= 1) {
+ for (i = 0; i < 6; i++) {
+ NCSI_Request.SA[i] = mac_address[i];
+ }
+ }
+ }
+ else { // Environment Parameters
+ OUTL(dev, ((bis->bi_enetaddr[2] << 24) | (bis->bi_enetaddr[3] << 16) | (bis->bi_enetaddr[4] << 8) | bis->bi_enetaddr[5]), MAC_LADR_REG);
+ OUTL(dev, ((bis->bi_enetaddr[0] << 8) | bis->bi_enetaddr[1]), MAC_MADR_REG);
+ if (CONFIG_MAC1_PHY_SETTING >= 1) {
+ for (i = 0; i < 6; i++) {
+ NCSI_Request.SA[i] = bis->bi_enetaddr[i];
+ }
+ }
+ }
+
+}
+
+
+static u16 phy_read_register (struct eth_device* dev, u8 PHY_Register, u8 PHY_Address)
+{
+ u32 Data, Status = 0, Loop_Count = 0, PHY_Ready = 1;
+ u16 Return_Data;
+
+#ifdef REALTEK_PHY_SUPPORT
+ PHY_Address = 0x01;
+#endif
+//20us * 100 = 2ms > (1 / 2.5Mhz) * 0x34
+ OUTL(dev, (PHY_Register << 21) + (PHY_Address << 16) + MIIRD + MDC_CYCTHR, PHYCR_REG);
+ do {
+ udelay(20);
+ Status = (INL (dev, PHYCR_REG) & MIIRD);
+ Loop_Count++;
+ if (Loop_Count >= 100) {
+ PHY_Ready = 0;
+ break;
+ }
+ } while (Status == MIIRD);
+
+ if (PHY_Ready == 0) {
+ printf ("PHY NOT REDAY ");
+ return 0;
+ }
+ Data = INL (dev, PHYDATA_REG);
+ Return_Data = (Data >> 16);
+
+ return Return_Data;
+}
+
+
+static void phy_write_register (struct eth_device* dev, u8 PHY_Register, u8 PHY_Address, u16 PHY_Data)
+{
+ u32 Status = 0, Loop_Count = 0, PHY_Ready = 1;
+
+#ifdef REALTEK_PHY_SUPPORT
+ PHY_Address = 0x01;
+#endif
+//20us * 100 = 2ms > (1 / 2.5Mhz) * 0x34
+ OUTL(dev, PHY_Data, PHYDATA_REG);
+ OUTL(dev, (PHY_Register << 21) + (PHY_Address << 16) + MIIWR + MDC_CYCTHR, PHYCR_REG);
+ do {
+ udelay(20);
+ Status = (INL (dev, PHYCR_REG) & MIIWR);
+ Loop_Count++;
+ if (Loop_Count >= 100) {
+ PHY_Ready = 0;
+ break;
+ }
+ } while (Status == MIIWR);
+ if (PHY_Ready == 0) {
+ printf ("PHY NOT REDAY ");
+ }
+}
+
+static void set_mac_control_register (struct eth_device* dev)
+{
+ unsigned long MAC_CR_Register = 0;
+ unsigned long Loop_Count = 0, PHY_Ready = 1, Chip_ID;
+ u16 PHY_Status, PHY_Speed, PHY_Duplex, Resolved_Status = 0, Advertise, Link_Partner;
+
+ if (CONFIG_MAC1_PHY_SETTING >= 1) {
+ MAC_CR_Register = SPEED_100M_MODE_bit | RX_BROADPKT_bit | FULLDUP_bit | RXMAC_EN_bit | RXDMA_EN_bit | TXMAC_EN_bit | TXDMA_EN_bit | CRC_APD_bit;
+ }
+ else {
+ MAC_CR_Register = SPEED_100M_MODE_bit | FULLDUP_bit | RXMAC_EN_bit | RXDMA_EN_bit | TXMAC_EN_bit | TXDMA_EN_bit | CRC_APD_bit;
+ }
+
+ if (CONFIG_MAC1_PHY_SETTING != 2) {
+ Chip_ID = ((phy_read_register (dev, 0x02, 0)) << 16);
+ Chip_ID |= (phy_read_register (dev, 0x03, 0) & 0xffff);
+ if (((Chip_ID & PHYID_VENDOR_MASK) == PHYID_VENDOR_BROADCOM) ||
+ ((Chip_ID & PHYID_VENDOR_MODEL_MASK) == PHYID_RTL8201EL)) {
+ Advertise = phy_read_register (dev, 0x04, 0);
+ Link_Partner = phy_read_register (dev, 0x05, 0);
+ Advertise = (Advertise & PHY_SPEED_DUPLEX_MASK);
+ Link_Partner = (Link_Partner & PHY_SPEED_DUPLEX_MASK);
+ if ((Advertise & Link_Partner) & PHY_100M_DUPLEX) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_100M_HALF) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_DUPLEX) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_HALF) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ }
+ else if (((Chip_ID & PHYID_VENDOR_MASK) == PHYID_VENDOR_MARVELL) ||
+ ((Chip_ID & PHYID_VENDOR_MODEL_MASK) == PHYID_RTL8211)) {
+//Max waiting time = (20 + 2)ms * 250(PHY_LOOP) = 5.5s
+ do {
+ udelay (20000);
+ Resolved_Status = (phy_read_register (dev, 0x11, 0) & RESOLVED_BIT);
+ Loop_Count++;
+ if (Loop_Count >= PHY_LOOP) {
+ PHY_Ready = 0;
+ printf ("PHY NOT READY ");
+ break;
+ }
+ } while (Resolved_Status != RESOLVED_BIT);
+
+ if (PHY_Ready == 1) {
+ PHY_Status = phy_read_register (dev, 0x11, 0);
+ PHY_Speed = (PHY_Status & PHY_SPEED_MASK) >> 14;
+ PHY_Duplex = (PHY_Status & PHY_DUPLEX_MASK) >> 13;
+
+ if (PHY_Speed == SPEED_1000M) {
+ MAC_CR_Register |= GMAC_MODE_bit;
+ }
+ else {
+ MAC_CR_Register &= ~GMAC_MODE_bit;
+ if (PHY_Speed == SPEED_10M) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ }
+ }
+ if (PHY_Duplex == DUPLEX_HALF) {
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ }
+//LED Control
+// if (Chip_ID == 0x1C) {
+// PHY_Status = phy_read_register (dev, 0x18, 0);
+// phy_write_register (dev, 0x18, 0, (PHY_Status | 0x09));
+// }
+//LED Control D[0], D[6]
+// if (Chip_ID == 0x141) {
+// PHY_Status = phy_read_register (dev, 0x18, 0);
+// phy_write_register (dev, 0x18, 0, ((PHY_Status & ~(0x41)) | 0x01));
+// }
+ }
+ else if (Chip_ID == PHYID_BCM54612E ) {
+ phy_write_register ( dev, 0x1C, 1, 0x8C00 ); // Disable GTXCLK Clock Delay Enable
+ phy_write_register ( dev, 0x18, 1, 0xF0E7 ); // Disable RGMII RXD to RXC Skew
+
+ Advertise = phy_read_register (dev, 0x04, 1);
+ Link_Partner = phy_read_register (dev, 0x05, 1);
+ Advertise = (Advertise & PHY_SPEED_DUPLEX_MASK);
+ Link_Partner = (Link_Partner & PHY_SPEED_DUPLEX_MASK);
+ if ((Advertise & Link_Partner) & PHY_100M_DUPLEX) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_100M_HALF) {
+ MAC_CR_Register |= SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_DUPLEX) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register |= FULLDUP_bit;
+ }
+ else if ((Advertise & Link_Partner) & PHY_10M_HALF) {
+ MAC_CR_Register &= ~SPEED_100M_MODE_bit;
+ MAC_CR_Register &= ~FULLDUP_bit;
+ }
+ }else {
+ printf("Unknow Chip_ID %x\n",Chip_ID);
+ }
+ }
+ OUTL(dev, MAC_CR_Register, MACCR_REG);
+}
+
+#endif /* CFG_CMD_NET && CONFIG_NET_MULTI && CONFIG_ASPEEDMAC */
diff --git a/include/configs/ast1100.h b/include/configs/ast1100.h
new file mode 100755
index 0000000..dbd656e
--- /dev/null
+++ b/include/configs/ast1100.h
@@ -0,0 +1,257 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * Version Identity
+ */
+#define CONFIG_IDENT_STRING " ASPEED (v.0.12) "
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST1100 1
+//#define CONFIG_AST1100_FPGA
+#undef CONFIG_AST1100_FPGA /* undef if real chip */
+//#define CONFIG_AST1100A2_PATCH
+#undef CONFIG_AST1100A2_PATCH
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */ /* Not ready */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_DDR512_200
+#define CONFIG_DDRII1G_200 1
+#undef CONFIG_ASPEED_SLT
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS1,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#ifdef CONFIG_ASPEED_SLT
+#define CONFIG_BOOTDELAY 1 /* autoboot after 3 seconds */
+#else
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#endif
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 128*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#define __LITTLE_ENDIAN
+#define CONFIG_FLASH_SPI
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+//#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+//#define CONFIG_MAC2_ENABLE
+//#define CONFIG_MAC2_MII_ENABLE
+//#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.188
+#define CONFIG_SERVERIP 192.168.0.126
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_REGTEST | CFG_CMD_MACTEST | CFG_CMD_VIDEOTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2100.h b/include/configs/ast2100.h
new file mode 100644
index 0000000..07733b9
--- /dev/null
+++ b/include/configs/ast2100.h
@@ -0,0 +1,272 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2100 1
+//#define CONFIG_AST2100_FPGA
+#undef CONFIG_AST2100_FPGA /* undef if real chip */
+//#define CONFIG_AST2100A2_PATCH
+#undef CONFIG_AST2100A2_PATCH
+#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+//#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_DDRII1G_266
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS1,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 128*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_MII_ENABLE
+//#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.188
+#define CONFIG_SERVERIP 192.168.0.106
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CONFIG_CMD_SLT (CONFIG_CMD_REGTEST | CONFIG_CMD_MACTEST | CONFIG_CMD_VIDEOTEST | CONFIG_CMD_HACTEST | CONFIG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2300.h b/include/configs/ast2300.h
new file mode 100644
index 0000000..678e7c3
--- /dev/null
+++ b/include/configs/ast2300.h
@@ -0,0 +1,325 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2300 1
+//#define CONFIG_AST1070 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_UPDATE "tftp 40800000 ast2300.scr; so 40800000'"
+
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+//#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 2
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.45
+#define CONFIG_SERVERIP 192.168.0.81
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2300_ast1070.h b/include/configs/ast2300_ast1070.h
new file mode 100644
index 0000000..a7abdf5
--- /dev/null
+++ b/include/configs/ast2300_ast1070.h
@@ -0,0 +1,323 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2300 1
+#define CONFIG_AST1070 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+//#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.45
+#define CONFIG_SERVERIP 192.168.0.81
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2300_nor.h b/include/configs/ast2300_nor.h
new file mode 100644
index 0000000..77b8fe3
--- /dev/null
+++ b/include/configs/ast2300_nor.h
@@ -0,0 +1,322 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2300 1
+#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+//#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+//#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.188
+#define CONFIG_SERVERIP 192.168.0.106
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2300_spi.h b/include/configs/ast2300_spi.h
new file mode 100644
index 0000000..bc65530
--- /dev/null
+++ b/include/configs/ast2300_spi.h
@@ -0,0 +1,322 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2300 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+//#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.188
+#define CONFIG_SERVERIP 192.168.0.106
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2400.h b/include/configs/ast2400.h
new file mode 100644
index 0000000..670fcfd
--- /dev/null
+++ b/include/configs/ast2400.h
@@ -0,0 +1,328 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+//#define CONFIG_FPGA_ASPEED 1
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2400 1
+//#define CONFIG_AST1070 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+//#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_UPDATE "tftp 40800000 ast2400.scr; so 40800000'"
+
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+#define CONFIG_CMD_NETTEST
+#define CONFIG_CMD_SLT
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.45
+#define CONFIG_SERVERIP 192.168.0.81
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2400_ast1070.h b/include/configs/ast2400_ast1070.h
new file mode 100644
index 0000000..df6c44b
--- /dev/null
+++ b/include/configs/ast2400_ast1070.h
@@ -0,0 +1,326 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+//#define CONFIG_FPGA_ASPEED 1
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2400 1
+#define CONFIG_AST1070 1
+//#define CONFIG_CALIBRATION 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+#define CONFIG_CMD_NETTEST
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.41
+#define CONFIG_SERVERIP 192.168.0.81
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2400_ast10701.h b/include/configs/ast2400_ast10701.h
new file mode 100644
index 0000000..4553535
--- /dev/null
+++ b/include/configs/ast2400_ast10701.h
@@ -0,0 +1,327 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+//#define CONFIG_FPGA_ASPEED 1
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2400 1
+#define CONFIG_AST1070 1
+#define CONFIG_LPC_PLUS 1
+//#define CONFIG_CALIBRATION 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+#define CONFIG_CMD_NETTEST
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0xFE0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x020000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.45
+#define CONFIG_SERVERIP 192.168.0.53
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2400_nor.h b/include/configs/ast2400_nor.h
new file mode 100644
index 0000000..5b10b36
--- /dev/null
+++ b/include/configs/ast2400_nor.h
@@ -0,0 +1,322 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2400 1
+#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+//#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.188
+#define CONFIG_SERVERIP 192.168.0.106
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2400_slt.h b/include/configs/ast2400_slt.h
new file mode 100644
index 0000000..cfa1c31
--- /dev/null
+++ b/include/configs/ast2400_slt.h
@@ -0,0 +1,329 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+//#define CONFIG_FPGA_ASPEED 1
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2400 1
+#define CONFIG_SLT_ASPEED 1
+//#define CONFIG_AST1070 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+//#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=32M"
+#define CONFIG_UPDATE "tftp 40800000 ast2400.scr; so 40800000'"
+
+#define CONFIG_BOOTDELAY 0 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "mactest 0 0 24 2 0 0 0; mactest 1 0 24 2 0 0 0; bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+#define CONFIG_CMD_NETTEST
+#define CONFIG_CMD_SLT
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0xFE0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x020000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+/*#define CONFIG_ASPEEDNIC*/
+#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.45
+#define CONFIG_SERVERIP 192.168.0.81
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast2400_spi.h b/include/configs/ast2400_spi.h
new file mode 100644
index 0000000..398e168
--- /dev/null
+++ b/include/configs/ast2400_spi.h
@@ -0,0 +1,322 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+#define CONFIG_AST2400 1
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "all.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (1024) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.45
+#define CONFIG_SERVERIP 192.168.0.81
+#define CONFIG_ETHADDR 00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR 00:C0:A8:12:34:57
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/ast3100.h b/include/configs/ast3100.h
new file mode 100644
index 0000000..f2a2aed
--- /dev/null
+++ b/include/configs/ast3100.h
@@ -0,0 +1,325 @@
+/*
+ * (C) Copyright 2004
+ * Peter Chen <peterc@socle-tech.com.tw>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+//#define CONFIG_INIT_CRITICAL /* define for U-BOOT 1.1.1 */
+#undef CONFIG_INIT_CRITICAL /* undef for U-BOOT 1.1.4 */
+#define CONFIG_ARM926EJS 1 /* This is an arm926ejs CPU */
+#define CONFIG_ASPEED 1
+//#define CONFIG_AST2300 1
+#define CONFIG_AST3100 1
+#define CONFIG_AST3100_D200 1 /* Clientron D200*/
+//#define CONFIG_SYS_FLASH_CFI /* CONFIG_FLASH_CFI, CONFIG_FLASH_SPI is exclusive*/
+#define CONFIG_FLASH_SPI
+//#define CONFIG_2SPIFLASH /* Boot SPI: CS2, 2nd SPI: CS0 */
+#undef CONFIG_2SPIFLASH
+#undef CONFIG_ASPEED_SLT
+#define CONFIG_FLASH_AST2300
+//#define CONFIG_FLASH_AST2300_DMA
+//#define CONFIG_FLASH_SPIx2_Dummy
+//#define CONFIG_FLASH_SPIx4_Dummy
+#define CONFIG_CRT_DISPLAY 1 /* undef if not support CRT */
+
+//#define CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */
+#define CONFIG_MISC_INIT_R
+
+/*
+ * DRAM Config
+ *
+ * 1. DRAM Size //
+ * CONFIG_DRAM_512MBIT // 512M bit
+ * CONFIG_DRAM_1GBIT // 1G bit (default)
+ * CONFIG_DRAM_2GBIT // 2G bit
+ * CONFIG_DRAM_4GBIT // 4G bit
+ * 2. DRAM Speed //
+ * CONFIG_DRAM_336 // 336MHz (DDR-667)
+ * CONFIG_DRAM_408 // 408MHz (DDR-800) (default)
+ * 3. VGA Mode
+ * CONFIG_CRT_DISPLAY // define to disable VGA function
+ * 4. ECC Function enable
+ * CONFIG_DRAM_ECC // define to enable ECC function
+ * 5. UART Debug Message
+ * CONFIG_DRAM_UART_OUT // enable output message at UART5
+ * CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ */
+
+//1. DRAM Size
+//#define CONFIG_DRAM_512MBIT
+#define CONFIG_DRAM_1GBIT
+//#define CONFIG_DRAM_2GBIT
+//#define CONFIG_DRAM_4GBIT
+//2. DRAM Speed
+//#define CONFIG_DRAM_336
+#define CONFIG_DRAM_408
+//3. VGA Mode
+//#define CONFIG_CRT_DISPLAY
+//4. ECC Function enable
+//#define CONFIG_DRAM_ECC
+//5. UART Debug Message
+#define CONFIG_DRAM_UART_OUT
+//#define CONFIG_DRAM_UART_38400
+
+
+
+/*
+ * Environment Config
+ */
+#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS 1
+#define CONFIG_INITRD_TAG 1
+#define CONFIG_BOOTARGS "debug console=ttyS1,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+#define CONFIG_BOOTDELAY 4 /* autoboot after 4 seconds */
+#ifdef CONFIG_FLASH_AST2300
+#define CONFIG_BOOTCOMMAND "bootm 20080000 20300000"
+#else
+#ifdef CONFIG_SYS_FLASH_CFI
+#define CONFIG_BOOTCOMMAND "bootm 10080000 10300000"
+#else
+#define CONFIG_BOOTCOMMAND "bootm 14080000 14300000"
+#endif
+#endif
+#define CONFIG_BOOTFILE "allc.bin"
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_EEPROM
+
+/*
+ * CPU Setting
+ */
+#define CPU_CLOCK_RATE 18000000 /* 16.5 MHz clock for the ARM core */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 768*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Stack sizes, The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
+
+/*
+ * Memory Configuration
+ */
+#define CONFIG_DRAM_528
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0x40000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x4000000 /* 64 MB */
+
+#define CONFIG_SYS_SDRAM_BASE 0x40000000
+
+/*
+ * FLASH Configuration
+ */
+#ifdef CONFIG_SYS_FLASH_CFI /* NOR Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x10000000 /* Flash Bank #1 */
+#endif
+
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (256) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x60000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
+
+#define CONFIG_SYS_FLASH_CFI_AMD_RESET
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+
+#else /* SPI Flash */
+
+#ifdef CONFIG_FLASH_AST2300
+#define PHYS_FLASH_1 0x20000000 /* Flash Bank #1 */
+#else
+#define PHYS_FLASH_1 0x14000000 /* Flash Bank #1 */
+#define PHYS_FLASH_2 0x14800000 /* Flash Bank #2 */
+#define PHYS_FLASH_2_BASE 0x10000000
+#endif
+
+#ifdef CONFIG_2SPIFLASH
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_2_BASE
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1, PHYS_FLASH_2 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 2
+#define CONFIG_SYS_MAX_FLASH_SECT (512) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#else
+#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
+#define CONFIG_FLASH_BANKS_LIST { PHYS_FLASH_1 }
+#define CONFIG_SYS_MAX_FLASH_BANKS 1
+#define CONFIG_SYS_MAX_FLASH_SECT (512) /* max number of sectors on one chip */
+
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_OFFSET 0x7F0000 /* environment starts here */
+#define CONFIG_ENV_SIZE 0x010000 /* Total Size of Environment Sector */
+#endif
+
+#endif
+
+#define __LITTLE_ENDIAN
+
+#define CONFIG_MONITOR_BASE TEXT_BASE
+#define CONFIG_MONITOR_LEN (192 << 10)
+
+/* timeout values are in ticks */
+#define CONFIG_SYS_FLASH_ERASE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
+#define CONFIG_SYS_FLASH_WRITE_TOUT (20*CONFIG_SYS_HZ) /* Timeout for Flash Write */
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP /* undef to save memory */
+
+#define CONFIG_SYS_PROMPT "boot# " /* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0x40000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0x44FFFFFF /* 256 MB in DRAM */
+
+#define CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0x43000000 /* default load address */
+
+#define CONFIG_SYS_TIMERBASE 0x1E782000 /* use timer 1 */
+#define CONFIG_SYS_HZ (1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE 4
+#define CONFIG_SYS_NS16550_CLK 24000000
+#define CONFIG_SYS_NS16550_COM1 0x1e783000
+#define CONFIG_SYS_NS16550_COM2 0x1e784000
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1 1
+#define CONFIG_CONS_INDEX 2
+#define CONFIG_BAUDRATE 115200
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*
+ * USB device configuration
+ */
+/*
+#define CONFIG_USB_DEVICE 1
+#define CONFIG_USB_TTY 1
+
+#define CONFIG_USBD_VENDORID 0x1234
+#define CONFIG_USBD_PRODUCTID 0x5678
+#define CONFIG_USBD_MANUFACTURER "Siemens"
+#define CONFIG_USBD_PRODUCT_NAME "SX1"
+*/
+
+/*
+ * I2C configuration
+ */
+#define CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C_SPEED 100000
+#define CONFIG_SYS_I2C_SLAVE 1
+#define CONFIG_DRIVER_ASPEED_I2C
+
+/*
+* EEPROM configuration
+*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_EEPROM_ADDR 0xa0
+
+/*
+ * NIC configuration
+ */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN_BITFIELD
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ASPEEDNIC
+//#define CONFIG_MAC1_PHY_LINK_INTERRUPT
+#define CONFIG_MAC2_ENABLE
+#define CONFIG_MAC2_PHY_LINK_INTERRUPT
+/*
+*-------------------------------------------------------------------------------
+* NOTICE: MAC1 and MAC2 now have their own seperate PHY configuration.
+* We use 2 bits for each MAC in the scratch register(D[15:11] in 0x1E6E2040) to
+* inform kernel driver.
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*
+* We use CONFIG_MAC1_PHY_SETTING and CONFIG_MAC2_PHY_SETTING in U-Boot
+* 0: Dedicated PHY
+* 1: ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 2: ASPEED's MAC is connected to NC-SI PHY chip directly
+* 3: Reserved
+*-------------------------------------------------------------------------------
+*/
+#define CONFIG_MAC1_PHY_SETTING 0
+#define CONFIG_MAC2_PHY_SETTING 0
+#define CONFIG_MAC_INTERFACE_CLOCK_DELAY 0x2255
+#define CONFIG_NET_MULTI
+#define CONFIG_ETHACT aspeednic#0
+#define CONFIG_GATEWAYIP 192.168.0.1
+#define CONFIG_NETMASK 255.255.255.0
+#define CONFIG_IPADDR 192.168.0.249
+#define CONFIG_SERVERIP 192.168.0.156
+#define CONFIG_ETHADDR 00:D0:A8:12:34:58
+#define CONFIG_ETH1ADDR 00:D0:A8:12:34:59
+
+/*
+ * SLT
+ */
+/*
+#define CONFIG_SLT
+#define CFG_CMD_SLT (CFG_CMD_VIDEOTEST | CFG_CMD_MACTEST | CFG_CMD_HACTEST | CFG_CMD_MICTEST)
+*/
+
+#endif /* __CONFIG_H */
diff --git a/include/flash.h b/include/flash.h
index c7acc97..e77be1f 100644
--- a/include/flash.h
+++ b/include/flash.h
@@ -57,6 +57,21 @@ typedef struct {
ulong addr_unlock2; /* unlock address 2 for AMD flash roms */
const char *name; /* human-readable name */
#endif
+#ifdef CONFIG_FLASH_SPI
+ ulong readcmd;
+ ulong dualport;
+ ulong dummybyte;
+ ulong tCK_Write;
+ ulong tCK_Erase;
+ ulong tCK_Read;
+ ulong CE;
+ ulong iomode;
+ ulong address32;
+ ulong quadport;
+ ulong dummydata;
+ ulong buffersize;
+ ulong specificspi;
+#endif
} flash_info_t;
extern flash_info_t flash_info[]; /* info for FLASH chips */