ast_2dtool.c revision cf503b78
115fb4814Smrg/* 215fb4814Smrg * Copyright (c) 2005 ASPEED Technology Inc. 315fb4814Smrg * 415fb4814Smrg * Permission to use, copy, modify, distribute, and sell this software and its 515fb4814Smrg * documentation for any purpose is hereby granted without fee, provided that 615fb4814Smrg * the above copyright notice appear in all copies and that both that 715fb4814Smrg * copyright notice and this permission notice appear in supporting 815fb4814Smrg * documentation, and that the name of the authors not be used in 915fb4814Smrg * advertising or publicity pertaining to distribution of the software without 1015fb4814Smrg * specific, written prior permission. The authors makes no representations 1115fb4814Smrg * about the suitability of this software for any purpose. It is provided 1215fb4814Smrg * "as is" without express or implied warranty. 1315fb4814Smrg * 1415fb4814Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1515fb4814Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 1615fb4814Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1715fb4814Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1815fb4814Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1915fb4814Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2015fb4814Smrg * PERFORMANCE OF THIS SOFTWARE. 2115fb4814Smrg */ 2215fb4814Smrg 2315fb4814Smrg#ifdef HAVE_CONFIG_H 2415fb4814Smrg#include <config.h> 2515fb4814Smrg#endif 2615fb4814Smrg#include "xf86.h" 2715fb4814Smrg#include "xf86_OSproc.h" 2815fb4814Smrg#include "xf86cmap.h" 2915fb4814Smrg#include "compiler.h" 3015fb4814Smrg#include "vgaHW.h" 3115fb4814Smrg#include "mipointer.h" 3215fb4814Smrg#include "micmap.h" 3315fb4814Smrg 3415fb4814Smrg#include "fb.h" 3515fb4814Smrg#include "regionstr.h" 3615fb4814Smrg#include "xf86xv.h" 3715fb4814Smrg#include <X11/extensions/Xv.h> 3815fb4814Smrg 3915fb4814Smrg#include "xf86Pci.h" 4015fb4814Smrg 4115fb4814Smrg/* framebuffer offscreen manager */ 4215fb4814Smrg#include "xf86fbman.h" 4315fb4814Smrg 4415fb4814Smrg#include "xaarop.h" 4515fb4814Smrg 4615fb4814Smrg/* H/W cursor support */ 4715fb4814Smrg#include "xf86Cursor.h" 4815fb4814Smrg 4915fb4814Smrg/* Driver specific headers */ 5015fb4814Smrg#include "ast.h" 51cf503b78Smrg#include "ast_vgatool.h" 52cf503b78Smrg#include "ast_2dtool.h" 5315fb4814Smrg 5415fb4814Smrg#ifdef Accel_2D 55b410ddbeSmrgtypedef Bool (*PFN_bENABLE_CMDQ)(ScrnInfoPtr , ASTRecPtr); 5615fb4814Smrg 5715fb4814Smrg/* Prototype type declaration */ 5815fb4814Smrg 59cf503b78Smrgstatic Bool 6015fb4814SmrgbInitCMDQInfo(ScrnInfoPtr pScrn, ASTRecPtr pAST) 6115fb4814Smrg{ 6215fb4814Smrg 6315fb4814Smrg ScreenPtr pScreen; 6415fb4814Smrg 6515fb4814Smrg /* CMDQ mode Init */ 6615fb4814Smrg if (!pAST->MMIO2D) { 677fe5393cSmrg pAST->CMDQInfo.ulCMDQType = VM_CMD_QUEUE; 687fe5393cSmrg 69b4d38c65Smrg pScreen = xf86ScrnToScreen(pScrn); 707fe5393cSmrg 7115fb4814Smrg do { 7215fb4814Smrg pAST->pCMDQPtr = xf86AllocateOffscreenLinear (pScreen, pAST->CMDQInfo.ulCMDQSize, 8, NULL, NULL, NULL); 737fe5393cSmrg 7415fb4814Smrg if (pAST->pCMDQPtr) break; 757fe5393cSmrg 7615fb4814Smrg pAST->CMDQInfo.ulCMDQSize >>= 1; 777fe5393cSmrg 7815fb4814Smrg } while (pAST->CMDQInfo.ulCMDQSize >= MIN_CMDQ_SIZE); 797fe5393cSmrg 8015fb4814Smrg if (pAST->pCMDQPtr) 8115fb4814Smrg { 8215fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO,"Allocate CMDQ size is %ld kbyte \n", (unsigned long) (pAST->CMDQInfo.ulCMDQSize/1024)); 837fe5393cSmrg 8415fb4814Smrg pAST->CMDQInfo.ulCMDQOffsetAddr = pAST->pCMDQPtr->offset*((pScrn->bitsPerPixel + 1) / 8); 8515fb4814Smrg pAST->CMDQInfo.pjCMDQVirtualAddr = pAST->FBVirtualAddr + pAST->CMDQInfo.ulCMDQOffsetAddr; 867fe5393cSmrg 8715fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = pAST->CMDQInfo.ulCMDQSize - CMD_QUEUE_GUARD_BAND; 887fe5393cSmrg pAST->CMDQInfo.ulCMDQMask = pAST->CMDQInfo.ulCMDQSize - 1 ; 897fe5393cSmrg 907fe5393cSmrg } 9115fb4814Smrg else 927fe5393cSmrg { 9315fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Allocate CMDQ failed \n"); 9415fb4814Smrg pAST->MMIO2D = TRUE; /* set to MMIO mode if CMDQ allocate failed */ 957fe5393cSmrg } 967fe5393cSmrg 9715fb4814Smrg } 987fe5393cSmrg 997fe5393cSmrg /* MMIO mode init */ 1007fe5393cSmrg if (pAST->MMIO2D) { 1017fe5393cSmrg pAST->CMDQInfo.ulCMDQType = VM_CMD_MMIO; 10215fb4814Smrg } 1037fe5393cSmrg 1047fe5393cSmrg return (TRUE); 10515fb4814Smrg} 10615fb4814Smrg 107cf503b78Smrgstatic Bool 10815fb4814SmrgbEnableCMDQ(ScrnInfoPtr pScrn, ASTRecPtr pAST) 10915fb4814Smrg{ 11015fb4814Smrg ULONG ulVMCmdQBasePort = 0; 11115fb4814Smrg 112cf503b78Smrg vASTWaitEngIdle(pScrn, pAST); 11315fb4814Smrg 11415fb4814Smrg /* set DBG Select Info */ 11515fb4814Smrg if (pAST->DBGSelect) 11615fb4814Smrg { 1177fe5393cSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x804C) = (ULONG) (pAST->DBGSelect); 11815fb4814Smrg } 1197fe5393cSmrg 12015fb4814Smrg /* set CMDQ base */ 12115fb4814Smrg switch (pAST->CMDQInfo.ulCMDQType) 12215fb4814Smrg { 12315fb4814Smrg case VM_CMD_QUEUE: 12415fb4814Smrg ulVMCmdQBasePort = (pAST->CMDQInfo.ulCMDQOffsetAddr - 0) >> 3; 1257fe5393cSmrg 12615fb4814Smrg /* set CMDQ Threshold */ 1277fe5393cSmrg ulVMCmdQBasePort |= 0xF0000000; 12815fb4814Smrg 12915fb4814Smrg /* set CMDQ Size */ 13015fb4814Smrg switch (pAST->CMDQInfo.ulCMDQSize) 13115fb4814Smrg { 13215fb4814Smrg case CMD_QUEUE_SIZE_256K: 1337fe5393cSmrg ulVMCmdQBasePort |= 0x00000000; 13415fb4814Smrg break; 1357fe5393cSmrg 13615fb4814Smrg case CMD_QUEUE_SIZE_512K: 1377fe5393cSmrg ulVMCmdQBasePort |= 0x04000000; 13815fb4814Smrg break; 1397fe5393cSmrg 14015fb4814Smrg case CMD_QUEUE_SIZE_1M: 1417fe5393cSmrg ulVMCmdQBasePort |= 0x08000000; 14215fb4814Smrg break; 1437fe5393cSmrg 14415fb4814Smrg case CMD_QUEUE_SIZE_2M: 1457fe5393cSmrg ulVMCmdQBasePort |= 0x0C000000; 1467fe5393cSmrg break; 1477fe5393cSmrg 14815fb4814Smrg default: 14915fb4814Smrg return(FALSE); 15015fb4814Smrg break; 1517fe5393cSmrg } 1527fe5393cSmrg 1537fe5393cSmrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 154de78e416Smrg pAST->CMDQInfo.ulWritePointer = *(ULONG *) (pAST->CMDQInfo.pjWritePort) << 3; 15515fb4814Smrg break; 1567fe5393cSmrg 15715fb4814Smrg case VM_CMD_MMIO: 15815fb4814Smrg /* set CMDQ Threshold */ 1597fe5393cSmrg ulVMCmdQBasePort |= 0xF0000000; 1607fe5393cSmrg 16115fb4814Smrg ulVMCmdQBasePort |= 0x02000000; /* MMIO mode */ 1627fe5393cSmrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 16315fb4814Smrg break; 1647fe5393cSmrg 16515fb4814Smrg default: 16615fb4814Smrg return (FALSE); 16715fb4814Smrg break; 16815fb4814Smrg } 16915fb4814Smrg 1707fe5393cSmrg return (TRUE); 17115fb4814Smrg} 17215fb4814Smrg 173cf503b78Smrgstatic Bool 174b410ddbeSmrgbEnableCMDQ2300(ScrnInfoPtr pScrn, ASTRecPtr pAST) 175b410ddbeSmrg{ 176b410ddbeSmrg ULONG ulVMCmdQBasePort = 0, ulNewModeData; 177b410ddbeSmrg 178cf503b78Smrg vASTWaitEngIdle(pScrn, pAST); 179b410ddbeSmrg 180b410ddbeSmrg /* set DBG Select Info */ 181b410ddbeSmrg if (pAST->DBGSelect) 182b410ddbeSmrg { 1837fe5393cSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x804C) = (ULONG) (pAST->DBGSelect); 184b410ddbeSmrg } 1857fe5393cSmrg 186b410ddbeSmrg /* set CMDQ base */ 187b410ddbeSmrg switch (pAST->CMDQInfo.ulCMDQType) 188b410ddbeSmrg { 189b410ddbeSmrg case VM_CMD_QUEUE: 190b410ddbeSmrg /* enable new CMDQ mode */ 191b410ddbeSmrg ulNewModeData = 0xc00000f0; 192b410ddbeSmrg /* set CMDQ Size */ 193b410ddbeSmrg switch (pAST->CMDQInfo.ulCMDQSize) 194b410ddbeSmrg { 195b410ddbeSmrg case CMD_QUEUE_SIZE_256K: 1967fe5393cSmrg ulNewModeData |= 0x00000000; 197b410ddbeSmrg break; 1987fe5393cSmrg 199b410ddbeSmrg case CMD_QUEUE_SIZE_512K: 2007fe5393cSmrg ulNewModeData |= 0x00000004; 201b410ddbeSmrg break; 2027fe5393cSmrg 203b410ddbeSmrg case CMD_QUEUE_SIZE_1M: 2047fe5393cSmrg ulNewModeData |= 0x00000008; 205b410ddbeSmrg break; 2067fe5393cSmrg 207b410ddbeSmrg case CMD_QUEUE_SIZE_2M: 2087fe5393cSmrg ulNewModeData |= 0x0000000C; 2097fe5393cSmrg break; 2107fe5393cSmrg 211b410ddbeSmrg default: 212b410ddbeSmrg return(FALSE); 213b410ddbeSmrg break; 2147fe5393cSmrg } 215b410ddbeSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x8060) = ulNewModeData; 216b410ddbeSmrg 2177fe5393cSmrg /* Set CMDQ Base */ 2187fe5393cSmrg ulVMCmdQBasePort = (pAST->CMDQInfo.ulCMDQOffsetAddr - 0) >> 3; 2197fe5393cSmrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 2207fe5393cSmrg pAST->CMDQInfo.ulWritePointer = *(ULONG *) (pAST->CMDQInfo.pjWritePort) << 3; 221b410ddbeSmrg break; 2227fe5393cSmrg 223b410ddbeSmrg case VM_CMD_MMIO: 224b410ddbeSmrg /* enable new CMDQ mode */ 225b410ddbeSmrg ulNewModeData = 0xc00000f2; 226b410ddbeSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x8060) = ulNewModeData; 227b410ddbeSmrg break; 2287fe5393cSmrg 229b410ddbeSmrg default: 230b410ddbeSmrg return (FALSE); 231b410ddbeSmrg break; 232b410ddbeSmrg } 233b410ddbeSmrg 234b410ddbeSmrg return (TRUE); 2357fe5393cSmrg 236b410ddbeSmrg} /* bEnableCMDQ2300 */ 237b410ddbeSmrg 23815fb4814SmrgBool 239cf503b78SmrgbASTEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST) 24015fb4814Smrg{ 241de78e416Smrg ULONG ulData; 242b410ddbeSmrg PFN_bENABLE_CMDQ pfnEnableCMDQ = bEnableCMDQ; 2437fe5393cSmrg 244cf503b78Smrg if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) ) 245b410ddbeSmrg pfnEnableCMDQ = bEnableCMDQ2300; 2467fe5393cSmrg 247de78e416Smrg switch (pAST->jChipType) 248de78e416Smrg { 249de78e416Smrg case AST2100: 250de78e416Smrg case AST1100: 251de78e416Smrg case AST2200: 252b410ddbeSmrg case AST2150: 2537fe5393cSmrg case AST2300: 254cf503b78Smrg case AST2400: 255de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000; 2567fe5393cSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; 2577fe5393cSmrg 258de78e416Smrg ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c); 259de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c) = (ulData & 0xFFFFFFFD); 260b534f209Smrg 2617fe5393cSmrg case AST2000: 2627fe5393cSmrg SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01); /* enable 2D */ 2637fe5393cSmrg 264de78e416Smrg break; 265de78e416Smrg } 2667fe5393cSmrg 26715fb4814Smrg if (!bInitCMDQInfo(pScrn, pAST)) 26815fb4814Smrg { 269cf503b78Smrg vASTDisable2D(pScrn, pAST); 27015fb4814Smrg return (FALSE); 27115fb4814Smrg } 2727fe5393cSmrg 273b410ddbeSmrg if (!pfnEnableCMDQ(pScrn, pAST)) 27415fb4814Smrg { 275cf503b78Smrg vASTDisable2D(pScrn, pAST); 27615fb4814Smrg return (FALSE); 27715fb4814Smrg } 2787fe5393cSmrg 2797fe5393cSmrg return (TRUE); 28015fb4814Smrg} 28115fb4814Smrg 28215fb4814Smrgvoid 283cf503b78SmrgvASTDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST) 28415fb4814Smrg{ 2857fe5393cSmrg 286cf503b78Smrg vASTWaitEngIdle(pScrn, pAST); 287cf503b78Smrg vASTWaitEngIdle(pScrn, pAST); 28815fb4814Smrg 2897fe5393cSmrg /* restore 2D settings */ 290b534f209Smrg if (pAST->jChipType != AST1180) 2917fe5393cSmrg { 2927fe5393cSmrg if (pAST->SavedReg.REGA4 & 0x01) /* 2D enabled */ 2937fe5393cSmrg { 2947fe5393cSmrg SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01); 2957fe5393cSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x8044) = pAST->SavedReg.ENG8044; 2967fe5393cSmrg } 2977fe5393cSmrg else /* 2D disabled */ 2987fe5393cSmrg { 2997fe5393cSmrg SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x00); 3007fe5393cSmrg } 3017fe5393cSmrg } 30215fb4814Smrg} 30315fb4814Smrg 30415fb4814Smrg 30515fb4814Smrgvoid 306cf503b78SmrgvASTWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST) 30715fb4814Smrg{ 30815fb4814Smrg ULONG ulEngState, ulEngState2; 30915fb4814Smrg UCHAR jReg; 3107fe5393cSmrg ULONG ulEngCheckSetting = 0x80000000; 311b534f209Smrg 312b534f209Smrg if (pAST->jChipType != AST1180) 313b534f209Smrg { 314b534f209Smrg 315b534f209Smrg /* 2D disable if 0xA4 D[0] = 1 */ 3167fe5393cSmrg GetIndexRegMask(CRTC_PORT, 0xA4, 0x01, jReg); 317cf503b78Smrg if (!jReg) goto Exit_vASTWaitEngIdle; 3187fe5393cSmrg 319b534f209Smrg /* 2D not work if in std. mode */ 3207fe5393cSmrg GetIndexRegMask(CRTC_PORT, 0xA3, 0x0F, jReg); 321cf503b78Smrg if (!jReg) goto Exit_vASTWaitEngIdle; 322b534f209Smrg } 32315fb4814Smrg 3247fe5393cSmrg if (*(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) & 0x02000000) /* MMIO Mode */ 3257fe5393cSmrg ulEngCheckSetting = 0x10000000; 3267fe5393cSmrg 3277fe5393cSmrg do 32815fb4814Smrg { 32915fb4814Smrg ulEngState = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33015fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33115fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33215fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33315fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33415fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 3357fe5393cSmrg 33615fb4814Smrg } while ((ulEngState & ulEngCheckSetting) || (ulEngState != ulEngState2)); 3377fe5393cSmrg 338cf503b78SmrgExit_vASTWaitEngIdle: 3397fe5393cSmrg ; 3407fe5393cSmrg} 34115fb4814Smrg 34215fb4814Smrg/* ULONG ulGetCMDQLength() */ 343de78e416Smrgstatic __inline ULONG ulGetCMDQLength(ASTRecPtr pAST, ULONG ulWritePointer, ULONG ulCMDQMask) 34415fb4814Smrg{ 34515fb4814Smrg ULONG ulReadPointer, ulReadPointer2; 3467fe5393cSmrg 34715fb4814Smrg do { 3487fe5393cSmrg ulReadPointer = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)); 3497fe5393cSmrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)); 3507fe5393cSmrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)); 3517fe5393cSmrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)); 3527fe5393cSmrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)); 3537fe5393cSmrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)); 3547fe5393cSmrg } while ( ((ulReadPointer & 0x0003FFFF) != (ulReadPointer2 & 0x0003FFFF)) || (ulReadPointer == 0xFFFFEEEE) ); 35515fb4814Smrg 35615fb4814Smrg return ((ulReadPointer << 3) - ulWritePointer - CMD_QUEUE_GUARD_BAND) & ulCMDQMask; 35715fb4814Smrg} 35815fb4814Smrg 359cf503b78SmrgUCHAR *pASTjRequestCMDQ( 36015fb4814SmrgASTRecPtr pAST, ULONG ulDataLen) 36115fb4814Smrg{ 36215fb4814Smrg UCHAR *pjBuffer; 36315fb4814Smrg ULONG i, ulWritePointer, ulCMDQMask, ulCurCMDQLen, ulContinueCMDQLen; 36415fb4814Smrg 36515fb4814Smrg ulWritePointer = pAST->CMDQInfo.ulWritePointer; 36615fb4814Smrg ulContinueCMDQLen = pAST->CMDQInfo.ulCMDQSize - ulWritePointer; 3677fe5393cSmrg ulCMDQMask = pAST->CMDQInfo.ulCMDQMask; 3687fe5393cSmrg 36915fb4814Smrg if (ulContinueCMDQLen >= ulDataLen) 37015fb4814Smrg { 3717fe5393cSmrg /* Get CMDQ Buffer */ 37215fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen) 37315fb4814Smrg { 37415fb4814Smrg ; 37515fb4814Smrg } 37615fb4814Smrg else 37715fb4814Smrg { 3787fe5393cSmrg 37915fb4814Smrg do 38015fb4814Smrg { 38115fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 38215fb4814Smrg } while (ulCurCMDQLen < ulDataLen); 3837fe5393cSmrg 38415fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 38515fb4814Smrg 38615fb4814Smrg } 3877fe5393cSmrg 38815fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 3897fe5393cSmrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; 39015fb4814Smrg pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; 3917fe5393cSmrg return pjBuffer; 39215fb4814Smrg } 39315fb4814Smrg else 3947fe5393cSmrg { 39515fb4814Smrg 39615fb4814Smrg /* Fill NULL CMD to the last of the CMDQ */ 39715fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulContinueCMDQLen) 39815fb4814Smrg { 39915fb4814Smrg ; 40015fb4814Smrg } 40115fb4814Smrg else 40215fb4814Smrg { 4037fe5393cSmrg 40415fb4814Smrg do 40515fb4814Smrg { 40615fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 40715fb4814Smrg } while (ulCurCMDQLen < ulContinueCMDQLen); 4087fe5393cSmrg 40915fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 41015fb4814Smrg 41115fb4814Smrg } 4127fe5393cSmrg 41315fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 41415fb4814Smrg for (i = 0; i<ulContinueCMDQLen/8; i++, pjBuffer+=8) 41515fb4814Smrg { 41615fb4814Smrg *(ULONG *)pjBuffer = (ULONG) PKT_NULL_CMD; 41715fb4814Smrg *(ULONG *) (pjBuffer+4) = 0; 4187fe5393cSmrg 41915fb4814Smrg } 42015fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulContinueCMDQLen; 42115fb4814Smrg pAST->CMDQInfo.ulWritePointer = ulWritePointer = 0; 4227fe5393cSmrg 4237fe5393cSmrg /* Get CMDQ Buffer */ 42415fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen) 42515fb4814Smrg { 4267fe5393cSmrg ; 42715fb4814Smrg } 42815fb4814Smrg else 42915fb4814Smrg { 4307fe5393cSmrg 43115fb4814Smrg do 43215fb4814Smrg { 43315fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 43415fb4814Smrg } while (ulCurCMDQLen < ulDataLen); 4357fe5393cSmrg 43615fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 43715fb4814Smrg 43815fb4814Smrg } 4397fe5393cSmrg 44015fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; 44115fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 44215fb4814Smrg pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; 4437fe5393cSmrg return pjBuffer; 4447fe5393cSmrg 44515fb4814Smrg } 4467fe5393cSmrg 44715fb4814Smrg} /* end of pjRequestCmdQ() */ 44815fb4814Smrg 449cf503b78SmrgBool bASTGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam) 45015fb4814Smrg{ 45115fb4814Smrg LONG GAbsX, GAbsY, GXInc, GYInc, GXMajor; 45215fb4814Smrg LONG MM, mm, Error0, K1, K2; 4537fe5393cSmrg 45415fb4814Smrg /* Init */ 4557fe5393cSmrg#ifdef LONG64 45615fb4814Smrg GAbsX = abs (LineInfo->X1 - LineInfo->X2); 45715fb4814Smrg GAbsY = abs (LineInfo->Y1 - LineInfo->Y2); 45815fb4814Smrg#else 45915fb4814Smrg GAbsX = labs (LineInfo->X1 - LineInfo->X2); 46015fb4814Smrg GAbsY = labs (LineInfo->Y1 - LineInfo->Y2); 4617fe5393cSmrg#endif 46215fb4814Smrg 46315fb4814Smrg GXInc = (LineInfo->X1 < LineInfo->X2) ? 1:0; 46415fb4814Smrg GYInc = (LineInfo->Y1 < LineInfo->Y2) ? 1:0; 46515fb4814Smrg GXMajor = (GAbsX >= GAbsY) ? 1:0; 4667fe5393cSmrg 46715fb4814Smrg /* Calculate */ 46815fb4814Smrg if (GXMajor) 46915fb4814Smrg { 47015fb4814Smrg MM = GAbsX; 4717fe5393cSmrg mm = GAbsY; 47215fb4814Smrg } 47315fb4814Smrg else 47415fb4814Smrg { 47515fb4814Smrg MM = GAbsY; 4767fe5393cSmrg mm = GAbsX; 47715fb4814Smrg } 47815fb4814Smrg 47915fb4814Smrg Error0 = (signed) (2*mm - MM); 4807fe5393cSmrg 48115fb4814Smrg K1 = 2* mm; 48215fb4814Smrg K2 = (signed) (2*mm - 2*MM); 4837fe5393cSmrg 48415fb4814Smrg /*save the Param to dsLineParam */ 48515fb4814Smrg dsLineParam->dsLineX = (USHORT) LineInfo->X1; 48615fb4814Smrg dsLineParam->dsLineY = (USHORT) LineInfo->Y1; 48715fb4814Smrg dsLineParam->dsLineWidth = (USHORT) MM; 48815fb4814Smrg dsLineParam->dwErrorTerm = (ULONG) Error0; 48915fb4814Smrg dsLineParam->dwK1Term = K1; 49015fb4814Smrg dsLineParam->dwK2Term = K2; 49115fb4814Smrg 49215fb4814Smrg dsLineParam->dwLineAttributes = 0; 49315fb4814Smrg if (GXMajor) dsLineParam->dwLineAttributes |= LINEPARAM_XM; 49415fb4814Smrg if (!GXInc) dsLineParam->dwLineAttributes |= LINEPARAM_X_DEC; 49515fb4814Smrg if (!GYInc) dsLineParam->dwLineAttributes |= LINEPARAM_Y_DEC; 4967fe5393cSmrg 49715fb4814Smrg return(TRUE); 4987fe5393cSmrg 49915fb4814Smrg} 50015fb4814Smrg#endif /* end of Accel_2D */ 50115fb4814Smrg 50215fb4814Smrg 503