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

📄 cmdlist.cpp

📁 VoyagerGX display driver for Windows CE .NET 5.XX Silicon Motion, Inc. VoyagerGX Driver is architec
💻 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 + -