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