📄 cmdlist.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 + -