ast_2dtool.c revision b4d38c65
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 "mibstore.h" 3115fb4814Smrg#include "vgaHW.h" 3215fb4814Smrg#include "mipointer.h" 3315fb4814Smrg#include "micmap.h" 3415fb4814Smrg 3515fb4814Smrg#include "fb.h" 3615fb4814Smrg#include "regionstr.h" 3715fb4814Smrg#include "xf86xv.h" 3815fb4814Smrg#include <X11/extensions/Xv.h> 3915fb4814Smrg#include "vbe.h" 4015fb4814Smrg 4115fb4814Smrg#include "xf86PciInfo.h" 4215fb4814Smrg#include "xf86Pci.h" 4315fb4814Smrg 4415fb4814Smrg/* framebuffer offscreen manager */ 4515fb4814Smrg#include "xf86fbman.h" 4615fb4814Smrg 4715fb4814Smrg#include "xaarop.h" 4815fb4814Smrg 4915fb4814Smrg/* H/W cursor support */ 5015fb4814Smrg#include "xf86Cursor.h" 5115fb4814Smrg 5215fb4814Smrg/* Driver specific headers */ 5315fb4814Smrg#include "ast.h" 5415fb4814Smrg 5515fb4814Smrg#ifdef Accel_2D 56b410ddbeSmrgtypedef Bool (*PFN_bENABLE_CMDQ)(ScrnInfoPtr , ASTRecPtr); 5715fb4814Smrg 5815fb4814Smrg/* Prototype type declaration */ 5915fb4814SmrgBool bInitCMDQInfo(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6015fb4814SmrgBool bEnableCMDQ(ScrnInfoPtr pScrn, ASTRecPtr pAST); 61b410ddbeSmrgBool bEnableCMDQ2300(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6215fb4814SmrgBool bEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6315fb4814Smrgvoid vDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6415fb4814Smrgvoid vWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6515fb4814SmrgUCHAR *pjRequestCMDQ(ASTRecPtr pAST, ULONG ulDataLen); 6615fb4814SmrgBool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam); 6715fb4814Smrg 6815fb4814SmrgBool 6915fb4814SmrgbInitCMDQInfo(ScrnInfoPtr pScrn, ASTRecPtr pAST) 7015fb4814Smrg{ 7115fb4814Smrg 7215fb4814Smrg ScreenPtr pScreen; 7315fb4814Smrg 7415fb4814Smrg pAST->CMDQInfo.pjCmdQBasePort = pAST->MMIOVirtualAddr+ 0x8044; 7515fb4814Smrg pAST->CMDQInfo.pjWritePort = pAST->MMIOVirtualAddr+ 0x8048; 7615fb4814Smrg pAST->CMDQInfo.pjReadPort = pAST->MMIOVirtualAddr+ 0x804C; 7715fb4814Smrg pAST->CMDQInfo.pjEngStatePort = pAST->MMIOVirtualAddr+ 0x804C; 7815fb4814Smrg 7915fb4814Smrg /* CMDQ mode Init */ 8015fb4814Smrg if (!pAST->MMIO2D) { 8115fb4814Smrg pAST->CMDQInfo.ulCMDQType = VM_CMD_QUEUE; 8215fb4814Smrg 83b4d38c65Smrg pScreen = xf86ScrnToScreen(pScrn); 8415fb4814Smrg 8515fb4814Smrg do { 8615fb4814Smrg pAST->pCMDQPtr = xf86AllocateOffscreenLinear (pScreen, pAST->CMDQInfo.ulCMDQSize, 8, NULL, NULL, NULL); 8715fb4814Smrg 8815fb4814Smrg if (pAST->pCMDQPtr) break; 8915fb4814Smrg 9015fb4814Smrg pAST->CMDQInfo.ulCMDQSize >>= 1; 9115fb4814Smrg 9215fb4814Smrg } while (pAST->CMDQInfo.ulCMDQSize >= MIN_CMDQ_SIZE); 9315fb4814Smrg 9415fb4814Smrg if (pAST->pCMDQPtr) 9515fb4814Smrg { 9615fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO,"Allocate CMDQ size is %ld kbyte \n", (unsigned long) (pAST->CMDQInfo.ulCMDQSize/1024)); 9715fb4814Smrg 9815fb4814Smrg pAST->CMDQInfo.ulCMDQOffsetAddr = pAST->pCMDQPtr->offset*((pScrn->bitsPerPixel + 1) / 8); 9915fb4814Smrg pAST->CMDQInfo.pjCMDQVirtualAddr = pAST->FBVirtualAddr + pAST->CMDQInfo.ulCMDQOffsetAddr; 10015fb4814Smrg 10115fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = pAST->CMDQInfo.ulCMDQSize - CMD_QUEUE_GUARD_BAND; 10215fb4814Smrg pAST->CMDQInfo.ulCMDQMask = pAST->CMDQInfo.ulCMDQSize - 1 ; 10315fb4814Smrg 10415fb4814Smrg } 10515fb4814Smrg else 10615fb4814Smrg { 10715fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Allocate CMDQ failed \n"); 10815fb4814Smrg pAST->MMIO2D = TRUE; /* set to MMIO mode if CMDQ allocate failed */ 10915fb4814Smrg } 11015fb4814Smrg 11115fb4814Smrg } 11215fb4814Smrg 11315fb4814Smrg /* MMIO mode init */ 11415fb4814Smrg if (pAST->MMIO2D) { 11515fb4814Smrg pAST->CMDQInfo.ulCMDQType = VM_CMD_MMIO; 11615fb4814Smrg } 11715fb4814Smrg 11815fb4814Smrg return (TRUE); 11915fb4814Smrg} 12015fb4814Smrg 12115fb4814SmrgBool 12215fb4814SmrgbEnableCMDQ(ScrnInfoPtr pScrn, ASTRecPtr pAST) 12315fb4814Smrg{ 12415fb4814Smrg ULONG ulVMCmdQBasePort = 0; 12515fb4814Smrg 12615fb4814Smrg vWaitEngIdle(pScrn, pAST); 12715fb4814Smrg 12815fb4814Smrg /* set DBG Select Info */ 12915fb4814Smrg if (pAST->DBGSelect) 13015fb4814Smrg { 13115fb4814Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x804C) = (ULONG) (pAST->DBGSelect); 13215fb4814Smrg } 13315fb4814Smrg 13415fb4814Smrg /* set CMDQ base */ 13515fb4814Smrg switch (pAST->CMDQInfo.ulCMDQType) 13615fb4814Smrg { 13715fb4814Smrg case VM_CMD_QUEUE: 13815fb4814Smrg ulVMCmdQBasePort = (pAST->CMDQInfo.ulCMDQOffsetAddr - 0) >> 3; 13915fb4814Smrg 14015fb4814Smrg /* set CMDQ Threshold */ 14115fb4814Smrg ulVMCmdQBasePort |= 0xF0000000; 14215fb4814Smrg 14315fb4814Smrg /* set CMDQ Size */ 14415fb4814Smrg switch (pAST->CMDQInfo.ulCMDQSize) 14515fb4814Smrg { 14615fb4814Smrg case CMD_QUEUE_SIZE_256K: 14715fb4814Smrg ulVMCmdQBasePort |= 0x00000000; 14815fb4814Smrg break; 14915fb4814Smrg 15015fb4814Smrg case CMD_QUEUE_SIZE_512K: 15115fb4814Smrg ulVMCmdQBasePort |= 0x04000000; 15215fb4814Smrg break; 15315fb4814Smrg 15415fb4814Smrg case CMD_QUEUE_SIZE_1M: 15515fb4814Smrg ulVMCmdQBasePort |= 0x08000000; 15615fb4814Smrg break; 15715fb4814Smrg 15815fb4814Smrg case CMD_QUEUE_SIZE_2M: 15915fb4814Smrg ulVMCmdQBasePort |= 0x0C000000; 16015fb4814Smrg break; 16115fb4814Smrg 16215fb4814Smrg default: 16315fb4814Smrg return(FALSE); 16415fb4814Smrg break; 16515fb4814Smrg } 16615fb4814Smrg 16715fb4814Smrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 168de78e416Smrg pAST->CMDQInfo.ulWritePointer = *(ULONG *) (pAST->CMDQInfo.pjWritePort) << 3; 16915fb4814Smrg break; 17015fb4814Smrg 17115fb4814Smrg case VM_CMD_MMIO: 17215fb4814Smrg /* set CMDQ Threshold */ 17315fb4814Smrg ulVMCmdQBasePort |= 0xF0000000; 17415fb4814Smrg 17515fb4814Smrg ulVMCmdQBasePort |= 0x02000000; /* MMIO mode */ 17615fb4814Smrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 17715fb4814Smrg break; 17815fb4814Smrg 17915fb4814Smrg default: 18015fb4814Smrg return (FALSE); 18115fb4814Smrg break; 18215fb4814Smrg } 18315fb4814Smrg 18415fb4814Smrg return (TRUE); 18515fb4814Smrg} 18615fb4814Smrg 187b410ddbeSmrgBool 188b410ddbeSmrgbEnableCMDQ2300(ScrnInfoPtr pScrn, ASTRecPtr pAST) 189b410ddbeSmrg{ 190b410ddbeSmrg ULONG ulVMCmdQBasePort = 0, ulNewModeData; 191b410ddbeSmrg 192b410ddbeSmrg vWaitEngIdle(pScrn, pAST); 193b410ddbeSmrg 194b410ddbeSmrg /* set DBG Select Info */ 195b410ddbeSmrg if (pAST->DBGSelect) 196b410ddbeSmrg { 197b410ddbeSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x804C) = (ULONG) (pAST->DBGSelect); 198b410ddbeSmrg } 199b410ddbeSmrg 200b410ddbeSmrg /* set CMDQ base */ 201b410ddbeSmrg switch (pAST->CMDQInfo.ulCMDQType) 202b410ddbeSmrg { 203b410ddbeSmrg case VM_CMD_QUEUE: 204b410ddbeSmrg /* enable new CMDQ mode */ 205b410ddbeSmrg ulNewModeData = 0xc00000f0; 206b410ddbeSmrg /* set CMDQ Size */ 207b410ddbeSmrg switch (pAST->CMDQInfo.ulCMDQSize) 208b410ddbeSmrg { 209b410ddbeSmrg case CMD_QUEUE_SIZE_256K: 210b410ddbeSmrg ulNewModeData |= 0x00000000; 211b410ddbeSmrg break; 212b410ddbeSmrg 213b410ddbeSmrg case CMD_QUEUE_SIZE_512K: 214b410ddbeSmrg ulNewModeData |= 0x00000004; 215b410ddbeSmrg break; 216b410ddbeSmrg 217b410ddbeSmrg case CMD_QUEUE_SIZE_1M: 218b410ddbeSmrg ulNewModeData |= 0x00000008; 219b410ddbeSmrg break; 220b410ddbeSmrg 221b410ddbeSmrg case CMD_QUEUE_SIZE_2M: 222b410ddbeSmrg ulNewModeData |= 0x0000000C; 223b410ddbeSmrg break; 224b410ddbeSmrg 225b410ddbeSmrg default: 226b410ddbeSmrg return(FALSE); 227b410ddbeSmrg break; 228b410ddbeSmrg } 229b410ddbeSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x8060) = ulNewModeData; 230b410ddbeSmrg 231b410ddbeSmrg /* Set CMDQ Base */ 232b410ddbeSmrg ulVMCmdQBasePort = (pAST->CMDQInfo.ulCMDQOffsetAddr - 0) >> 3; 233b410ddbeSmrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 234b410ddbeSmrg pAST->CMDQInfo.ulWritePointer = *(ULONG *) (pAST->CMDQInfo.pjWritePort) << 3; 235b410ddbeSmrg break; 236b410ddbeSmrg 237b410ddbeSmrg case VM_CMD_MMIO: 238b410ddbeSmrg /* enable new CMDQ mode */ 239b410ddbeSmrg ulNewModeData = 0xc00000f2; 240b410ddbeSmrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x8060) = ulNewModeData; 241b410ddbeSmrg break; 242b410ddbeSmrg 243b410ddbeSmrg default: 244b410ddbeSmrg return (FALSE); 245b410ddbeSmrg break; 246b410ddbeSmrg } 247b410ddbeSmrg 248b410ddbeSmrg return (TRUE); 249b410ddbeSmrg 250b410ddbeSmrg} /* bEnableCMDQ2300 */ 251b410ddbeSmrg 25215fb4814SmrgBool 25315fb4814SmrgbEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST) 25415fb4814Smrg{ 255de78e416Smrg ULONG ulData; 256b410ddbeSmrg PFN_bENABLE_CMDQ pfnEnableCMDQ = bEnableCMDQ; 257b410ddbeSmrg 258b410ddbeSmrg if (pAST->jChipType == AST2300) 259b410ddbeSmrg pfnEnableCMDQ = bEnableCMDQ2300; 260b410ddbeSmrg 261de78e416Smrg switch (pAST->jChipType) 262de78e416Smrg { 263de78e416Smrg case AST2100: 264de78e416Smrg case AST1100: 265de78e416Smrg case AST2200: 266b410ddbeSmrg case AST2150: 267b410ddbeSmrg case AST2300: 268de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000; 269de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; 270de78e416Smrg 271de78e416Smrg ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c); 272de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c) = (ulData & 0xFFFFFFFD); 273b534f209Smrg 274b534f209Smrg case AST2000: 275b534f209Smrg SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01); /* enable 2D */ 276b534f209Smrg 277de78e416Smrg break; 278de78e416Smrg } 27915fb4814Smrg 28015fb4814Smrg if (!bInitCMDQInfo(pScrn, pAST)) 28115fb4814Smrg { 28215fb4814Smrg vDisable2D(pScrn, pAST); 28315fb4814Smrg return (FALSE); 28415fb4814Smrg } 28515fb4814Smrg 286b410ddbeSmrg if (!pfnEnableCMDQ(pScrn, pAST)) 28715fb4814Smrg { 28815fb4814Smrg vDisable2D(pScrn, pAST); 28915fb4814Smrg return (FALSE); 29015fb4814Smrg } 29115fb4814Smrg 29215fb4814Smrg return (TRUE); 29315fb4814Smrg} 29415fb4814Smrg 29515fb4814Smrgvoid 29615fb4814SmrgvDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST) 29715fb4814Smrg{ 29815fb4814Smrg 29915fb4814Smrg vWaitEngIdle(pScrn, pAST); 30015fb4814Smrg vWaitEngIdle(pScrn, pAST); 30115fb4814Smrg 302b534f209Smrg if (pAST->jChipType != AST1180) 303b534f209Smrg SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x00); 30415fb4814Smrg 30515fb4814Smrg} 30615fb4814Smrg 30715fb4814Smrg 30815fb4814Smrgvoid 30915fb4814SmrgvWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST) 31015fb4814Smrg{ 31115fb4814Smrg ULONG ulEngState, ulEngState2; 31215fb4814Smrg UCHAR jReg; 31315fb4814Smrg ULONG ulEngCheckSetting; 31415fb4814Smrg 31515fb4814Smrg if (pAST->MMIO2D) 31615fb4814Smrg ulEngCheckSetting = 0x10000000; 31715fb4814Smrg else 31815fb4814Smrg ulEngCheckSetting = 0x80000000; 319b534f209Smrg 320b534f209Smrg if (pAST->jChipType != AST1180) 321b534f209Smrg { 322b534f209Smrg 323b534f209Smrg /* 2D disable if 0xA4 D[0] = 1 */ 324b534f209Smrg GetIndexRegMask(CRTC_PORT, 0xA4, 0x01, jReg); 325b534f209Smrg if (!jReg) goto Exit_vWaitEngIdle; 32615fb4814Smrg 327b534f209Smrg /* 2D not work if in std. mode */ 328b534f209Smrg GetIndexRegMask(CRTC_PORT, 0xA3, 0x0F, jReg); 329b534f209Smrg if (!jReg) goto Exit_vWaitEngIdle; 330b534f209Smrg } 33115fb4814Smrg 33215fb4814Smrg do 33315fb4814Smrg { 33415fb4814Smrg ulEngState = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33515fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33615fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33715fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33815fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 33915fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 34015fb4814Smrg 34115fb4814Smrg } while ((ulEngState & ulEngCheckSetting) || (ulEngState != ulEngState2)); 34215fb4814Smrg 34315fb4814SmrgExit_vWaitEngIdle: 34415fb4814Smrg ; 34515fb4814Smrg} 34615fb4814Smrg 34715fb4814Smrg/* ULONG ulGetCMDQLength() */ 348de78e416Smrgstatic __inline ULONG ulGetCMDQLength(ASTRecPtr pAST, ULONG ulWritePointer, ULONG ulCMDQMask) 34915fb4814Smrg{ 35015fb4814Smrg ULONG ulReadPointer, ulReadPointer2; 35115fb4814Smrg 35215fb4814Smrg do { 35315fb4814Smrg ulReadPointer = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 35415fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 35515fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 35615fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 35715fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 35815fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 35915fb4814Smrg } while (ulReadPointer != ulReadPointer2); 36015fb4814Smrg 36115fb4814Smrg return ((ulReadPointer << 3) - ulWritePointer - CMD_QUEUE_GUARD_BAND) & ulCMDQMask; 36215fb4814Smrg} 36315fb4814Smrg 36415fb4814SmrgUCHAR *pjRequestCMDQ( 36515fb4814SmrgASTRecPtr pAST, ULONG ulDataLen) 36615fb4814Smrg{ 36715fb4814Smrg UCHAR *pjBuffer; 36815fb4814Smrg ULONG i, ulWritePointer, ulCMDQMask, ulCurCMDQLen, ulContinueCMDQLen; 36915fb4814Smrg 37015fb4814Smrg ulWritePointer = pAST->CMDQInfo.ulWritePointer; 37115fb4814Smrg ulContinueCMDQLen = pAST->CMDQInfo.ulCMDQSize - ulWritePointer; 37215fb4814Smrg ulCMDQMask = pAST->CMDQInfo.ulCMDQMask; 37315fb4814Smrg 37415fb4814Smrg if (ulContinueCMDQLen >= ulDataLen) 37515fb4814Smrg { 37615fb4814Smrg /* Get CMDQ Buffer */ 37715fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen) 37815fb4814Smrg { 37915fb4814Smrg ; 38015fb4814Smrg } 38115fb4814Smrg else 38215fb4814Smrg { 38315fb4814Smrg 38415fb4814Smrg do 38515fb4814Smrg { 38615fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 38715fb4814Smrg } while (ulCurCMDQLen < ulDataLen); 38815fb4814Smrg 38915fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 39015fb4814Smrg 39115fb4814Smrg } 39215fb4814Smrg 39315fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 39415fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; 39515fb4814Smrg pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; 39615fb4814Smrg return pjBuffer; 39715fb4814Smrg } 39815fb4814Smrg else 39915fb4814Smrg { 40015fb4814Smrg 40115fb4814Smrg /* Fill NULL CMD to the last of the CMDQ */ 40215fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulContinueCMDQLen) 40315fb4814Smrg { 40415fb4814Smrg ; 40515fb4814Smrg } 40615fb4814Smrg else 40715fb4814Smrg { 40815fb4814Smrg 40915fb4814Smrg do 41015fb4814Smrg { 41115fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 41215fb4814Smrg } while (ulCurCMDQLen < ulContinueCMDQLen); 41315fb4814Smrg 41415fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 41515fb4814Smrg 41615fb4814Smrg } 41715fb4814Smrg 41815fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 41915fb4814Smrg for (i = 0; i<ulContinueCMDQLen/8; i++, pjBuffer+=8) 42015fb4814Smrg { 42115fb4814Smrg *(ULONG *)pjBuffer = (ULONG) PKT_NULL_CMD; 42215fb4814Smrg *(ULONG *) (pjBuffer+4) = 0; 42315fb4814Smrg 42415fb4814Smrg } 42515fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulContinueCMDQLen; 42615fb4814Smrg pAST->CMDQInfo.ulWritePointer = ulWritePointer = 0; 42715fb4814Smrg 42815fb4814Smrg /* Get CMDQ Buffer */ 42915fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen) 43015fb4814Smrg { 43115fb4814Smrg ; 43215fb4814Smrg } 43315fb4814Smrg else 43415fb4814Smrg { 43515fb4814Smrg 43615fb4814Smrg do 43715fb4814Smrg { 43815fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 43915fb4814Smrg } while (ulCurCMDQLen < ulDataLen); 44015fb4814Smrg 44115fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 44215fb4814Smrg 44315fb4814Smrg } 44415fb4814Smrg 44515fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; 44615fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 44715fb4814Smrg pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; 44815fb4814Smrg return pjBuffer; 44915fb4814Smrg 45015fb4814Smrg } 45115fb4814Smrg 45215fb4814Smrg} /* end of pjRequestCmdQ() */ 45315fb4814Smrg 45415fb4814SmrgBool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam) 45515fb4814Smrg{ 45615fb4814Smrg LONG GAbsX, GAbsY, GXInc, GYInc, GXMajor; 45715fb4814Smrg LONG MM, mm, Error0, K1, K2; 45815fb4814Smrg 45915fb4814Smrg /* Init */ 46015fb4814Smrg#ifdef LONG64 46115fb4814Smrg GAbsX = abs (LineInfo->X1 - LineInfo->X2); 46215fb4814Smrg GAbsY = abs (LineInfo->Y1 - LineInfo->Y2); 46315fb4814Smrg#else 46415fb4814Smrg GAbsX = labs (LineInfo->X1 - LineInfo->X2); 46515fb4814Smrg GAbsY = labs (LineInfo->Y1 - LineInfo->Y2); 46615fb4814Smrg#endif 46715fb4814Smrg 46815fb4814Smrg GXInc = (LineInfo->X1 < LineInfo->X2) ? 1:0; 46915fb4814Smrg GYInc = (LineInfo->Y1 < LineInfo->Y2) ? 1:0; 47015fb4814Smrg GXMajor = (GAbsX >= GAbsY) ? 1:0; 47115fb4814Smrg 47215fb4814Smrg /* Calculate */ 47315fb4814Smrg if (GXMajor) 47415fb4814Smrg { 47515fb4814Smrg MM = GAbsX; 47615fb4814Smrg mm = GAbsY; 47715fb4814Smrg } 47815fb4814Smrg else 47915fb4814Smrg { 48015fb4814Smrg MM = GAbsY; 48115fb4814Smrg mm = GAbsX; 48215fb4814Smrg } 48315fb4814Smrg 48415fb4814Smrg Error0 = (signed) (2*mm - MM); 48515fb4814Smrg 48615fb4814Smrg K1 = 2* mm; 48715fb4814Smrg K2 = (signed) (2*mm - 2*MM); 48815fb4814Smrg 48915fb4814Smrg /*save the Param to dsLineParam */ 49015fb4814Smrg dsLineParam->dsLineX = (USHORT) LineInfo->X1; 49115fb4814Smrg dsLineParam->dsLineY = (USHORT) LineInfo->Y1; 49215fb4814Smrg dsLineParam->dsLineWidth = (USHORT) MM; 49315fb4814Smrg dsLineParam->dwErrorTerm = (ULONG) Error0; 49415fb4814Smrg dsLineParam->dwK1Term = K1; 49515fb4814Smrg dsLineParam->dwK2Term = K2; 49615fb4814Smrg 49715fb4814Smrg dsLineParam->dwLineAttributes = 0; 49815fb4814Smrg if (GXMajor) dsLineParam->dwLineAttributes |= LINEPARAM_XM; 49915fb4814Smrg if (!GXInc) dsLineParam->dwLineAttributes |= LINEPARAM_X_DEC; 50015fb4814Smrg if (!GYInc) dsLineParam->dwLineAttributes |= LINEPARAM_Y_DEC; 50115fb4814Smrg 50215fb4814Smrg return(TRUE); 50315fb4814Smrg 50415fb4814Smrg} 50515fb4814Smrg#endif /* end of Accel_2D */ 50615fb4814Smrg 50715fb4814Smrg 508