?? cmdlist.cpp
字號:
#include "precomp.h"
#ifdef CMDLIST
DWORD *cmd_ptr;
DWORD *g_cmd_start_buf;
DWORD last_stop_address;
DWORD *last_finish_ptr;
DWORD physical_frame_number[4];
ULONG g_CmdBuffer_offset; // Cmd List buffer offset
ULONG g_CmdBuffer_start_address; // Cmd List buffer start address
ULONG g_CmdBuffer_end_address; // Cmd List buffer end address
ULONG g_CmdBuffer_base[4]; // Cmd List buffer base. dummy Cmd List buffer base for DMA write back is 128-bit (4 dword)
ULONG g_CmdBuffer_base_phys; // Cmd List buffer base physcial address
SYSTEM_INFO g_SysInfo;
DWORD g_pagesize;
DWORD g_dwFlush; //dummy read to flush CMD to video memory
DWORD g_dwVGXstatus;
DWORD g_flush_read1, g_flush_read2;
DWORD g_bXscaleNormalMode=TRUE;
#if TRACE_CMD
DWORD dwCount=0;
#endif
extern PUCHAR g_pREG;
void SMI::SetupCmdListBuffer(void)
{
ULONG value=0;
#if CMDLIST_IN_SYS_MEM
POKE_32(PCI_MASTER_BASE,
FIELD_INIT_VAL(PCI_MASTER_BASE, ADDRESS, 0)
);
POKE_32(SYSTEM_CTRL,
FIELD_INIT(SYSTEM_CTRL, PCI_MASTER, START )
);
#if CMDLIST_CEPC //{
#else //}{
if (g_bXscaleNormalMode)
{
value = peekRegisterDWord(MISC_CTRL);
POKE_32(MISC_CTRL, value |
FIELD_INIT(MISC_CTRL, BURST_LENGTH, 1 )
);
value = peekRegisterDWord(DRAM_CTRL);
value &= 0xFFFF;
value |=
FIELD_INIT(DRAM_CTRL, CPU_BURST, 4 ) |
FIELD_INIT(DRAM_CTRL, CPU_CAS_LATENCY, 2) |
FIELD_INIT(DRAM_CTRL, CPU_SIZE, 64) |
FIELD_INIT(DRAM_CTRL, CPU_COLUMN_SIZE, 512) |
FIELD_INIT(DRAM_CTRL, CPU_ACTIVE_PRECHARGE, 7) |
FIELD_INIT(DRAM_CTRL, CPU_RESET, DISABLE) |
FIELD_INIT(DRAM_CTRL, CPU_BANKS, 4);
pokeRegisterDWord(DRAM_CTRL, value); //value = 24B827C0 ;//0x2CB827C0;
}
#endif //}
POKE_32(POWER_MODE0_CLOCK,
FIELD_INIT(POWER_MODE0_CLOCK, P2XCLK_SELECT, 288 ) |
FIELD_INIT(POWER_MODE0_CLOCK, P2XCLK_DIVIDER, 1) |
FIELD_INIT(POWER_MODE0_CLOCK, P2XCLK_SHIFT, 2) |
FIELD_INIT(POWER_MODE0_CLOCK, V2XCLK_SELECT, 288) |
FIELD_INIT(POWER_MODE0_CLOCK, V2XCLK_DIVIDER, 1) |
FIELD_INIT(POWER_MODE0_CLOCK, V2XCLK_SHIFT, 2) |
FIELD_INIT(POWER_MODE0_CLOCK, MCLK_SELECT, 288) |
FIELD_INIT(POWER_MODE0_CLOCK, MCLK_DIVIDER, 1) |
FIELD_INIT(POWER_MODE0_CLOCK, MCLK_SHIFT, 2) |
FIELD_INIT(POWER_MODE0_CLOCK, M2XCLK_SELECT, 288) |
FIELD_INIT(POWER_MODE0_CLOCK, M2XCLK_DIVIDER, 1) |
FIELD_INIT(POWER_MODE0_CLOCK, M2XCLK_SHIFT, 1)
); //0x02020201, PCI Bus master only works on Engine clock 72MHz on RevAA.
g_CmdBuffer_start_address = (DWORD)VirtualAlloc(0, m_cmdlist_size, MEM_RESERVE, PAGE_NOACCESS);
VirtualCopy((void *)g_CmdBuffer_start_address, (void *)m_cmdlist_address, m_cmdlist_size, PAGE_READWRITE | PAGE_NOCACHE);
g_CmdBuffer_offset = m_cmdlist_address - m_sdrambase;
#else
g_CmdBuffer_offset = m_nVideoMemoryAvail + CURSUR_IMAGE_SIZE;
g_CmdBuffer_start_address = (ULONG)m_pLAW + g_CmdBuffer_offset; //Cmd list buffer is located after cursor image
#endif
g_CmdBuffer_end_address = g_CmdBuffer_start_address + m_cmdlist_size-2*CMD_STRIDE_BYTE; //Cmd list buffer is located after cursor image, reserved space for GOTO (wrap around)
cmd_ptr = (DWORD *)g_CmdBuffer_start_address; //set up command list buffer in video memory at this time.
g_cmd_start_buf = cmd_ptr +m_cmdlist_size/2/4; //debug start address
g_CmdBuffer_base[0] = 0;
#if CMDLIST_WRITEBACK
GetSystemInfo(&g_SysInfo);
g_pagesize= g_SysInfo.dwPageSize;
if (LockPages( g_CmdBuffer_base, 1024*8, physical_frame_number, LOCKFLAG_READ))
g_CmdBuffer_base_phys = physical_frame_number[0] | ((ULONG)g_CmdBuffer_base & (g_pagesize-1));
//LPVOID AllocPhysMem(DWORD cbSize, DWORD fdwProtect, DWORD dwAlignmentMask, DWORD dwFlags,PULONG pPhysicalAddress);
#endif
memset(cmd_ptr, 0x80000080, m_cmdlist_size); //init to finish cmd
//Init start CI
POKE_32(CMD_INTPR_CONDITIONS, FIELD_INIT(CMD_INTPR_CONDITIONS, CMDPTR, NOWRAP)); //Clear ptr wrap flag
INSERTCMD_FINISH(cmd_ptr, 0);
last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
#if CMDLIST_IN_SYS_MEM
POKE_32(CMD_INTPR_CTRL,
FIELD_INIT(CMD_INTPR_CTRL, STATUS, RUNNING ) |
FIELD_INIT(CMD_INTPR_CTRL, EXT, EXTERNAL) |
g_CmdBuffer_offset);
#else
POKE_32(CMD_INTPR_CTRL, FIELD_INIT(CMD_INTPR_CTRL, STATUS, RUNNING ) | g_CmdBuffer_offset);
#endif
while (FIELD_GET(PEEK_32(CMD_INTPR_CTRL), CMD_INTPR_CTRL, STATUS) == CMD_INTPR_CTRL_STATUS_RUNNING);
}
#if 0
void VALIDATE_SLOT(DWORD *cmdptr, DWORD 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)-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)-CMD_STRIDE_BYTE );
INSERTCMD_LOADREG_D(cmd_ptr, REG(CMD_INTPR_CONDITIONS), FIELD_INIT(CMD_INTPR_CONDITIONS, CMDPTR, NOWRAP)); /* clear ptr wrap flag*/
}
}
#endif
#if CMDLIST_IN_SYS_MEM
#if CMDLIST_CEPC
void FLUSH_CMD()
{ _asm
{
push edi
push esi
push eax
mov esi, last_finish_ptr
xor eax, eax
lock or [esi], eax ;// flush the begin
add esi, 4
lock or [esi], eax ;// flush the end part
pop eax
pop esi
pop edi
}
}
#endif //CMDLIST_CEPC
#endif //CMDLIST_IN_SYS_MEM
#else //CMDLIST
/* ----------------------------------------
Do nothing if not CMDLIST driver
---------------------------------------- */
#endif //CMDLIST
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -