diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/xgi_cmdlist.c | 49 | ||||
| -rw-r--r-- | linux-core/xgi_cmdlist.h | 1 | 
2 files changed, 19 insertions, 31 deletions
diff --git a/linux-core/xgi_cmdlist.c b/linux-core/xgi_cmdlist.c index 6cc4c142..682c4ac1 100644 --- a/linux-core/xgi_cmdlist.c +++ b/linux-core/xgi_cmdlist.c @@ -84,8 +84,15 @@ static void xgi_submit_cmdlist(struct xgi_info * info,  			       const struct xgi_cmd_info * pCmdInfo)  {  	const unsigned int cmd = get_batch_command(pCmdInfo->_firstBeginType); +	u32 begin[4]; +	begin[0] = (cmd << 24) | (BEGIN_VALID_MASK) | +		(BEGIN_BEGIN_IDENTIFICATION_MASK & pCmdInfo->_curDebugID); +	begin[1] = BEGIN_LINK_ENABLE_MASK | pCmdInfo->_firstSize; +	begin[2] = pCmdInfo->_firstBeginAddr >> 4; +	begin[3] = 0; +  	if (s_cmdring._lastBatchStartAddr == 0) {  		const unsigned int portOffset = BASE_3D_ENG + (cmd << 2); @@ -111,17 +118,10 @@ static void xgi_submit_cmdlist(struct xgi_info * info,  		DRM_INFO("portOffset=%d, beginPort=%d\n",  			 portOffset, cmd << 2); -		dwWriteReg(info->mmio_map, portOffset, -			   (cmd << 24) + (BEGIN_VALID_MASK) + -			   pCmdInfo->_curDebugID); - -		dwWriteReg(info->mmio_map, portOffset + 4, -			   BEGIN_LINK_ENABLE_MASK + pCmdInfo->_firstSize); - -		dwWriteReg(info->mmio_map, portOffset + 8,  -			   (pCmdInfo->_firstBeginAddr >> 4)); - -		dwWriteReg(info->mmio_map, portOffset + 12, 0); +		dwWriteReg(info->mmio_map, portOffset,      begin[0]); +		dwWriteReg(info->mmio_map, portOffset +  4, begin[1]); +		dwWriteReg(info->mmio_map, portOffset +  8, begin[2]); +		dwWriteReg(info->mmio_map, portOffset + 12, begin[3]);  	} else {  		u32 *lastBatchVirtAddr; @@ -135,26 +135,13 @@ static void xgi_submit_cmdlist(struct xgi_info * info,  			xgi_find_pcie_virt(info,  					   s_cmdring._lastBatchStartAddr); -		/* lastBatchVirtAddr should *never* be NULL.  However, there -		 * are currently some bugs that cause this to happen.  The -		 * if-statement here prevents some fatal (i.e., hard lock -		 * requiring the reset button) oopses. -		 */ -		if (lastBatchVirtAddr) { -			lastBatchVirtAddr[1] = -				BEGIN_LINK_ENABLE_MASK + pCmdInfo->_firstSize; -			lastBatchVirtAddr[2] = pCmdInfo->_firstBeginAddr >> 4; -			lastBatchVirtAddr[3] = 0; -			//barrier(); -			lastBatchVirtAddr[0] = -				(cmd << 24) + (BEGIN_VALID_MASK) + -				(0xffff & pCmdInfo->_curDebugID); - -			/* Jong 06/12/2006; system hang; marked for test */ -			triggerHWCommandList(info, pCmdInfo->_beginCount); -		} else { -			DRM_ERROR("lastBatchVirtAddr is NULL\n"); -		} +		lastBatchVirtAddr[1] = begin[1]; +		lastBatchVirtAddr[2] = begin[2]; +		lastBatchVirtAddr[3] = begin[3]; +		wmb(); +		lastBatchVirtAddr[0] = begin[0]; + +		triggerHWCommandList(info, pCmdInfo->_beginCount);  	}  	s_cmdring._lastBatchStartAddr = pCmdInfo->_lastBeginAddr; diff --git a/linux-core/xgi_cmdlist.h b/linux-core/xgi_cmdlist.h index 4bc56ec1..08029386 100644 --- a/linux-core/xgi_cmdlist.h +++ b/linux-core/xgi_cmdlist.h @@ -40,6 +40,7 @@  #define 	M2REG_PCI_TRIGGER_MODE_MASK				(ONE_BIT_MASK<<1)  #define 	BEGIN_VALID_MASK                        (ONE_BIT_MASK<<20)  #define 	BEGIN_LINK_ENABLE_MASK                  (ONE_BIT_MASK<<31) +#define 	BEGIN_BEGIN_IDENTIFICATION_MASK         (TWENTY_BIT_MASK<<0)  #define     M2REG_PCI_TRIGGER_REGISTER_ADDRESS      0x14  typedef enum {  | 
