⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdlist.h

📁 SM501基于ARMV4/ARMV4I平台
💻 H
字号:
/**********************************************************************
 *
 * cmdlist.h
 *
 * This include file defines macros for Command List
 *
 * (C) 2003 Silicon Motion, Inc.
 *
 *  History:
 *   Date       By         Reason
 *   ====       ==         ======
 *   2/14/2003  Ge Wang    initial implementation
 **********************************************************************/
#ifndef __CMDLIST_H //{
#define __CMDLIST_H

#define CMDLIST_WRITEBACK   0
#define TRACE_CMD           0


extern DWORD *cmd_ptr;
extern DWORD *g_cmd_start_buf;
extern DWORD last_stop_address;
extern DWORD *last_finish_ptr;

extern ULONG			g_CmdBuffer_offset;    		// Cmd List buffer offset 
extern ULONG			g_CmdBuffer_start_address;  // Cmd List buffer start address 
extern ULONG			g_CmdBuffer_end_address;    // Cmd List buffer end address
extern ULONG			g_CmdBuffer_base[4];        // Cmd List buffer base. dummy Cmd List buffer base for DMA write back is 128-bit (4 dword)
extern ULONG			g_CmdBuffer_base_phys;      // Cmd List buffer base physcial address
extern DWORD            g_dwFlush; //dummy read to flush CMD to video memory
extern DWORD            g_dwVGXstatus;
extern DWORD            g_flush_read1, g_flush_read2;
extern DWORD            g_bXscaleNormalMode;

typedef struct tagCMDLIST
{
   volatile struct
   {
      DWORD busy : 1;       // TRUE if current buffer is busy.
   } dwFlags;

    DWORD   dwSize;     // Current buffer size
	DWORD	dwCMDLISTBufferLinearAddr;
	DWORD	dwCMDLISTBufferPhysicalAddr;
}   CMDLIST_INFO, *LPCMDLIST_INFO;

#if TRACE_CMD //{
extern DWORD dwCount;
#if CMDLIST_CEPC //{
#define START_CI(function_name) \
{\
    last_stop_address = PEEK_32(CMD_INTPR_CTRL);\
    dwCount ++; \
    DEBUGMSG(GPE_ZONE_INIT, (TEXT("last_stop_address = 0x%08X, count=0x%08X\r\n"),last_stop_address, dwCount));\
    DEBUGMSG(GPE_ZONE_INIT, (TEXT(function_name)));\
    if (FIELD_GET(last_stop_address, CMD_INTPR_CTRL, STATUS) == CMD_INTPR_CTRL_STATUS_STOPPED) \
        POKE_32(CMD_INTPR_CTRL, FIELD_INIT(CMD_INTPR_CTRL, STATUS, RUNNING ) | last_stop_address); \
}
#else //}{
#define START_CI(function_name) \
{\
    last_stop_address = PEEK_32(CMD_INTPR_CTRL);\
    dwCount ++; \
    RETAILMSG(1, (TEXT("last_stop_address = 0x%08X, count=0x%08X\r\n"),last_stop_address, dwCount));\
    RETAILMSG(1, (TEXT(function_name)));\
    if (FIELD_GET(last_stop_address, CMD_INTPR_CTRL, STATUS) == CMD_INTPR_CTRL_STATUS_STOPPED) \
        POKE_32(CMD_INTPR_CTRL, FIELD_INIT(CMD_INTPR_CTRL, STATUS, RUNNING ) | last_stop_address); \
}
#endif //CMDLIST_CEPC }
#else  //TRACE_CMD }{
#if CMDLIST_CEPC //{
#if CMDLIST_IN_SYS_MEM //{
#define START_CI(function_name) \
{\
    last_stop_address = PEEK_32(CMD_INTPR_CTRL);\
    if (FIELD_GET(last_stop_address, CMD_INTPR_CTRL, STATUS) == CMD_INTPR_CTRL_STATUS_STOPPED && FIELD_GET(last_stop_address, CMD_INTPR_CTRL, HARDWARE) == CMD_INTPR_CTRL_HARDWARE_STOPPED) { \
    POKE_32(CMD_INTPR_CTRL, FIELD_INIT(CMD_INTPR_CTRL, STATUS, RUNNING ) | last_stop_address); \
    /* debug purpose, buffer may overflow *g_cmd_start_buf++ = last_stop_address; */}  \
}
#else //CMDLIST_IN_SYS_MEM //{
#define START_CI(function_name) \
{\
    last_stop_address = PEEK_32(CMD_INTPR_CTRL);\
    POKE_32(CMD_INTPR_CTRL, FIELD_INIT(CMD_INTPR_CTRL, STATUS, RUNNING ) | last_stop_address); \
}
#endif //CMDLIST_IN_SYS_MEM //{
#else //CMDLIST_CEPC }{
#define START_CI(function_name) \
{\
    last_stop_address = PEEK_32(CMD_INTPR_CTRL);\
    if (FIELD_GET(last_stop_address, CMD_INTPR_CTRL, STATUS) == CMD_INTPR_CTRL_STATUS_STOPPED && FIELD_GET(last_stop_address, CMD_INTPR_CTRL, HARDWARE) == CMD_INTPR_CTRL_HARDWARE_STOPPED) { \
    POKE_32(CMD_INTPR_CTRL, FIELD_INIT(CMD_INTPR_CTRL, STATUS, RUNNING ) | last_stop_address); \
    }  \
}
#endif //}
#endif //}

#if CMDLIST_CEPC
#define CMDLISTBUF_SIZE      (2*1024*1024)
#define CMDLISTBUF_ADDR      0x80400000 /* CEPC system memory address */
#define ROMOFFSET 0x80000000
#else
#define CMDLISTBUF_SIZE      (0xE0000)
#define CMDLISTBUF_ADDR      0x84040000/* Stellcom system memory address */
#define ROMOFFSET 0x84000000
#endif
#define CMD_STRIDE_BYTE  8   //8 bytes
#define CMD_STRIDE_DWORD  2   //2 dwords
#define HOST_DATAPORT_SIZE (DE_DATAPORT_END-DE_DATAPORT)

// Insert Command Interpreter commands into CMD list buffer
#define INSERTCMD_LOADMEM_D(cmdptr, adr, value)           {*cmdptr++=(0x00000000 | (adr)); *cmdptr++= (value);}
#define INSERTCMD_LOADMEM_E(cmdptr, adr, count)           {*cmdptr++=(0x20000000 | (adr)); *cmdptr++= (count);}
#define INSERTCMD_LOADMEM_I(cmdptr, adr, src, count)      {*cmdptr++=(0x40000000 | (adr)); *cmdptr++= (count); *cmdptr++= (src); *cmdptr++= 0;}
#define INSERTCMD_LOADREG_D(cmdptr, reg, value)           {*cmdptr++=(0x10000000 | REG(reg)); *cmdptr++= (value);}
#define INSERTCMD_LOADREG_E(cmdptr, reg, count)           {*cmdptr++=(0x30000000 | REG(reg)); *cmdptr++= (count);}
#define INSERTCMD_LOADREG_I(cmdptr, reg, src, count)      {*cmdptr++=(0x50000000 | REG(reg)); *cmdptr++= (count); *cmdptr++= (src); *cmdptr++= 0;}
#define INSERTCMD_STATUS(cmdptr, mask, value)             {*cmdptr++=(0x60000000 | (mask)); *cmdptr++= (value);}
//#define INSERTCMD_FINISH(cmdptr, int)                     {if (((ULONG)cmdptr & 0x08)==0) INSERTCMD_NOP(cmdptr); *cmdptr++=(0x80000000 | ((int) ? 1 : 0)); *cmdptr++= 0;}
#define INSERTCMD_FINISH(cmdptr, int)                     {*cmdptr++=(0x80000000 | ((int) ? 1 : 0)); *cmdptr++= 0;}
#define INSERTCMD_GOTO(cmdptr, pc, rel)                   {*cmdptr++=(0x90000000 | (pc)); *cmdptr++= ((rel) ? 1 : 0);}
#define INSERTCMD_GOSUB(cmdptr, pc, rel)                  {*cmdptr++=(0xA0000000 | (pc)); *cmdptr++= ((rel) ? 1 : 0);}
#define INSERTCMD_RETURN(cmdptr)                          {*cmdptr++=(0xB0000000); *cmdptr++= 0;}
#define INSERTCMD_COND_JUMP(cmdptr, cond, pc)             {*cmdptr++=(0xC0000000 | (pc)); *cmdptr++= (cond);}
#define INSERTCMD_NOP(cmdptr)                             {*cmdptr++=(0xC0000000); *cmdptr++= 0;}
#define INSERTCMD_LOADDATA(cmdptr, data)                  {*cmdptr++=(data); }
#define INSERTCMD_PADQWORD(cmdptr, data)                  {if ((data) & 1) *cmdptr++=0x12345678; }

#if CMDLIST_IN_SYS_MEM //{
#if CMDLIST_CEPC       //{
//#define FLUSH_CMD() {g_flush_read1 = *last_finish_ptr; g_flush_read2 = *(last_finish_ptr+1);}
extern void FLUSH_CMD();
#else //}{
#define FLUSH_CMD() 
#endif //}
#else //}{in video memory
//#define FLUSH_CMD()     {g_dwFlush = * (DWORD *) g_CmdBuffer_end_address;} /*dummy read to flush CMD to video memory*/
  #define FLUSH_CMD()      \
   do 	g_dwVGXstatus = PEEK_32(CMD_INTPR_STATUS); \
   while ((FIELD_GET(g_dwVGXstatus, CMD_INTPR_STATUS, 2D_MEMORY_FIFO) == CMD_INTPR_STATUS_2D_MEMORY_FIFO_NOT_EMPTY) \
         || (FIELD_GET(g_dwVGXstatus, CMD_INTPR_STATUS, COMMAND_FIFO) == CMD_INTPR_STATUS_COMMAND_FIFO_NOT_EMPTY))
#endif //}

#if CMDLIST_IN_SYS_MEM //{turn it to 1 if Rev AA
//#define WAIT_CI_STOP() while (FIELD_GET(PEEK_32(CMD_INTPR_CTRL), CMD_INTPR_CTRL, HARDWARE) == CMD_INTPR_CTRL_HARDWARE_RUNNING)
#define WAIT_CI_STOP() 
#define STOP_CI()   
// POKE_32(CMD_INTPR_CTRL, FIELD_INIT(CMD_INTPR_CTRL, STATUS, STOPPED))
#else //}{work around RevB stop CI do not flush FIFO, wait CI naturally finished
#define WAIT_CI_STOP() while (FIELD_GET(PEEK_32(CMD_INTPR_CTRL), CMD_INTPR_CTRL, STATUS) == CMD_INTPR_CTRL_STATUS_RUNNING)
#define STOP_CI()     
#endif //}

#if CMDLIST_IN_SYS_MEM //{
#define  VALIDATE_SLOT(cmdptr, req_dword)   \
{ \
    while ((ULONG)cmdptr - g_CmdBuffer_start_address + (req_dword)*sizeof(DWORD) \
                  + FIELD_GET(PEEK_32(CMD_INTPR_CONDITIONS),CMD_INTPR_CONDITIONS,CMDPTR)*m_cmdlist_size \
                  >=  \
                  FIELD_GET(PEEK_32(CMD_INTPR_CTRL), CMD_INTPR_CTRL, ADDRESS)-g_CmdBuffer_offset-CMD_STRIDE_BYTE + m_cmdlist_size);   \
    if ((ULONG)cmdptr + (req_dword)*sizeof(DWORD) > g_CmdBuffer_end_address) \
    { \
        POKE_32(CMD_INTPR_CONDITIONS, FIELD_INIT(CMD_INTPR_CONDITIONS, CMDPTR, WRAP)); \
        INSERTCMD_GOTO(cmdptr,         FIELD_INIT(CMD_INTPR_CTRL, EXT, EXTERNAL) |g_CmdBuffer_offset, 0); /*jump to start of CMD list buffer*/ \
        cmdptr=(DWORD *)g_CmdBuffer_start_address; \
        while ( (req_dword+1)*sizeof(DWORD) >=  /*wait for requested free slots */\
                  FIELD_GET(PEEK_32(CMD_INTPR_CTRL), CMD_INTPR_CTRL, ADDRESS)-g_CmdBuffer_offset-CMD_STRIDE_BYTE );   \
        INSERTCMD_LOADREG_D(cmdptr, REG(CMD_INTPR_CONDITIONS),  FIELD_INIT(CMD_INTPR_CONDITIONS, CMDPTR, NOWRAP)); /* clear ptr wrap  flag*/ \
    } \
}
#else //}{CMDLIST_IN_SYS_MEM
#define  VALIDATE_SLOT(cmdptr, req_dword)   \
{ \
    while ((ULONG)cmdptr - g_CmdBuffer_start_address + (req_dword)*sizeof(DWORD) \
                  + FIELD_GET(PEEK_32(CMD_INTPR_CONDITIONS),CMD_INTPR_CONDITIONS,CMDPTR)*m_cmdlist_size \
                  >=  \
                  FIELD_GET(PEEK_32(CMD_INTPR_CTRL), CMD_INTPR_CTRL, ADDRESS)-g_CmdBuffer_offset-CMD_STRIDE_BYTE + m_cmdlist_size);   \
    if ((ULONG)cmdptr + (req_dword)*sizeof(DWORD) > g_CmdBuffer_end_address) \
    { \
        POKE_32(CMD_INTPR_CONDITIONS, FIELD_INIT(CMD_INTPR_CONDITIONS, CMDPTR, WRAP)); \
        INSERTCMD_GOTO(cmdptr, g_CmdBuffer_offset, 0); /*jump to start of CMD list buffer*/ \
        cmdptr=(DWORD *)g_CmdBuffer_start_address; \
        while ( (req_dword+1)*sizeof(DWORD) >=  /*wait for requested free slots */\
                  FIELD_GET(PEEK_32(CMD_INTPR_CTRL), CMD_INTPR_CTRL, ADDRESS)-g_CmdBuffer_offset-CMD_STRIDE_BYTE );   \
        INSERTCMD_LOADREG_D(cmdptr, REG(CMD_INTPR_CONDITIONS),  FIELD_INIT(CMD_INTPR_CONDITIONS, CMDPTR, NOWRAP)); /* clear ptr wrap  flag*/ \
    } \
}
#endif //}CMDLIST_IN_SYS_MEM
#endif //}__CMDLIST_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -