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
24458e54220Smrg    if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST2500) )
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:
25558e54220Smrg    case AST2500:
256de78e416Smrg       *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000;
2577fe5393cSmrg       *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1;
2587fe5393cSmrg
259de78e416Smrg       ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c);
260de78e416Smrg       *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c) = (ulData & 0xFFFFFFFD);
261b534f209Smrg
2627fe5393cSmrg    case AST2000:
2637fe5393cSmrg       SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01);		/* enable 2D */
2647fe5393cSmrg
265de78e416Smrg       break;
266de78e416Smrg    }
2677fe5393cSmrg
26815fb4814Smrg    if (!bInitCMDQInfo(pScrn, pAST))
26915fb4814Smrg    {
270cf503b78Smrg        vASTDisable2D(pScrn, pAST);
27115fb4814Smrg    	return (FALSE);
27215fb4814Smrg    }
2737fe5393cSmrg
274b410ddbeSmrg    if (!pfnEnableCMDQ(pScrn, pAST))
27515fb4814Smrg    {
276cf503b78Smrg        vASTDisable2D(pScrn, pAST);
27715fb4814Smrg    	return (FALSE);
27815fb4814Smrg    }
2797fe5393cSmrg
2807fe5393cSmrg    return (TRUE);
28115fb4814Smrg}
28215fb4814Smrg
28315fb4814Smrgvoid
284cf503b78SmrgvASTDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST)
28515fb4814Smrg{
2867fe5393cSmrg
287cf503b78Smrg    vASTWaitEngIdle(pScrn, pAST);
288cf503b78Smrg    vASTWaitEngIdle(pScrn, pAST);
28915fb4814Smrg
2907fe5393cSmrg    /* restore 2D settings */
291b534f209Smrg    if (pAST->jChipType != AST1180)
2927fe5393cSmrg    {
2937fe5393cSmrg        if (pAST->SavedReg.REGA4 & 0x01)	/* 2D enabled */
2947fe5393cSmrg        {
2957fe5393cSmrg            SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01);
2967fe5393cSmrg            *(ULONG *) (pAST->MMIOVirtualAddr + 0x8044) = pAST->SavedReg.ENG8044;
2977fe5393cSmrg        }
2987fe5393cSmrg        else								/* 2D disabled */
2997fe5393cSmrg        {
3007fe5393cSmrg            SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x00);
3017fe5393cSmrg        }
3027fe5393cSmrg    }
30315fb4814Smrg}
30415fb4814Smrg
30515fb4814Smrg
30615fb4814Smrgvoid
307cf503b78SmrgvASTWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST)
30815fb4814Smrg{
30915fb4814Smrg    ULONG ulEngState, ulEngState2;
31015fb4814Smrg    UCHAR jReg;
3117fe5393cSmrg    ULONG ulEngCheckSetting = 0x80000000;
312b534f209Smrg
313b534f209Smrg    if (pAST->jChipType != AST1180)
314b534f209Smrg    {
315b534f209Smrg
316b534f209Smrg        /* 2D disable if 0xA4 D[0] = 1 */
3177fe5393cSmrg        GetIndexRegMask(CRTC_PORT, 0xA4, 0x01, jReg);
318cf503b78Smrg        if (!jReg) goto Exit_vASTWaitEngIdle;
3197fe5393cSmrg
320b534f209Smrg        /* 2D not work if in std. mode */
3217fe5393cSmrg        GetIndexRegMask(CRTC_PORT, 0xA3, 0x0F, jReg);
322cf503b78Smrg        if (!jReg) goto Exit_vASTWaitEngIdle;
323b534f209Smrg    }
32415fb4814Smrg
3257fe5393cSmrg    if (*(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) & 0x02000000)	/* MMIO Mode */
3267fe5393cSmrg        ulEngCheckSetting = 0x10000000;
3277fe5393cSmrg
3287fe5393cSmrg    do
32915fb4814Smrg    {
33015fb4814Smrg        ulEngState = (*(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;
33515fb4814Smrg        ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000;
3367fe5393cSmrg
33715fb4814Smrg    } while ((ulEngState & ulEngCheckSetting) || (ulEngState != ulEngState2));
3387fe5393cSmrg
339cf503b78SmrgExit_vASTWaitEngIdle:
3407fe5393cSmrg    ;
3417fe5393cSmrg}
34215fb4814Smrg
34315fb4814Smrg/* ULONG ulGetCMDQLength() */
344de78e416Smrgstatic __inline ULONG ulGetCMDQLength(ASTRecPtr pAST, ULONG ulWritePointer, ULONG ulCMDQMask)
34515fb4814Smrg{
34615fb4814Smrg    ULONG ulReadPointer, ulReadPointer2;
3477fe5393cSmrg
34815fb4814Smrg    do {
3497fe5393cSmrg	ulReadPointer  = *((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	ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort));
3557fe5393cSmrg     } while ( ((ulReadPointer & 0x0003FFFF) != (ulReadPointer2 & 0x0003FFFF)) || (ulReadPointer == 0xFFFFEEEE) );
35615fb4814Smrg
35715fb4814Smrg    return ((ulReadPointer << 3) - ulWritePointer - CMD_QUEUE_GUARD_BAND) & ulCMDQMask;
35815fb4814Smrg}
35915fb4814Smrg
360cf503b78SmrgUCHAR *pASTjRequestCMDQ(
36115fb4814SmrgASTRecPtr pAST, ULONG   ulDataLen)
36215fb4814Smrg{
36315fb4814Smrg    UCHAR   *pjBuffer;
36415fb4814Smrg    ULONG   i, ulWritePointer, ulCMDQMask, ulCurCMDQLen, ulContinueCMDQLen;
36515fb4814Smrg
36615fb4814Smrg    ulWritePointer = pAST->CMDQInfo.ulWritePointer;
36715fb4814Smrg    ulContinueCMDQLen = pAST->CMDQInfo.ulCMDQSize - ulWritePointer;
3687fe5393cSmrg    ulCMDQMask = pAST->CMDQInfo.ulCMDQMask;
3697fe5393cSmrg
37015fb4814Smrg    if (ulContinueCMDQLen >= ulDataLen)
37115fb4814Smrg    {
3727fe5393cSmrg        /* Get CMDQ Buffer */
37315fb4814Smrg        if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen)
37415fb4814Smrg        {
37515fb4814Smrg        	;
37615fb4814Smrg        }
37715fb4814Smrg        else
37815fb4814Smrg        {
3797fe5393cSmrg
38015fb4814Smrg            do
38115fb4814Smrg            {
38215fb4814Smrg                ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask);
38315fb4814Smrg            } while (ulCurCMDQLen < ulDataLen);
3847fe5393cSmrg
38515fb4814Smrg            pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen;
38615fb4814Smrg
38715fb4814Smrg        }
3887fe5393cSmrg
38915fb4814Smrg        pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer;
3907fe5393cSmrg        pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen;
39115fb4814Smrg        pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask;
3927fe5393cSmrg        return pjBuffer;
39315fb4814Smrg    }
39415fb4814Smrg    else
3957fe5393cSmrg    {
39615fb4814Smrg
39715fb4814Smrg        /* Fill NULL CMD to the last of the CMDQ */
39815fb4814Smrg        if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulContinueCMDQLen)
39915fb4814Smrg        {
40015fb4814Smrg        	;
40115fb4814Smrg        }
40215fb4814Smrg        else
40315fb4814Smrg        {
4047fe5393cSmrg
40515fb4814Smrg            do
40615fb4814Smrg            {
40715fb4814Smrg                ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask);
40815fb4814Smrg            } while (ulCurCMDQLen < ulContinueCMDQLen);
4097fe5393cSmrg
41015fb4814Smrg            pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen;
41115fb4814Smrg
41215fb4814Smrg        }
4137fe5393cSmrg
41415fb4814Smrg        pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer;
41515fb4814Smrg        for (i = 0; i<ulContinueCMDQLen/8; i++, pjBuffer+=8)
41615fb4814Smrg        {
41715fb4814Smrg            *(ULONG *)pjBuffer = (ULONG) PKT_NULL_CMD;
41815fb4814Smrg            *(ULONG *) (pjBuffer+4) = 0;
4197fe5393cSmrg
42015fb4814Smrg        }
42115fb4814Smrg        pAST->CMDQInfo.ulCurCMDQueueLen -= ulContinueCMDQLen;
42215fb4814Smrg        pAST->CMDQInfo.ulWritePointer = ulWritePointer = 0;
4237fe5393cSmrg
4247fe5393cSmrg        /* Get CMDQ Buffer */
42515fb4814Smrg        if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen)
42615fb4814Smrg        {
4277fe5393cSmrg	        ;
42815fb4814Smrg        }
42915fb4814Smrg        else
43015fb4814Smrg        {
4317fe5393cSmrg
43215fb4814Smrg            do
43315fb4814Smrg            {
43415fb4814Smrg                ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask);
43515fb4814Smrg            } while (ulCurCMDQLen < ulDataLen);
4367fe5393cSmrg
43715fb4814Smrg            pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen;
43815fb4814Smrg
43915fb4814Smrg        }
4407fe5393cSmrg
44115fb4814Smrg        pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen;
44215fb4814Smrg        pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer;
44315fb4814Smrg        pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask;
4447fe5393cSmrg        return pjBuffer;
4457fe5393cSmrg
44615fb4814Smrg    }
4477fe5393cSmrg
44815fb4814Smrg} /* end of pjRequestCmdQ() */
44915fb4814Smrg
450cf503b78SmrgBool bASTGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam)
45115fb4814Smrg{
45215fb4814Smrg    LONG GAbsX, GAbsY, GXInc, GYInc, GXMajor;
45315fb4814Smrg    LONG MM, mm, Error0, K1, K2;
4547fe5393cSmrg
45515fb4814Smrg    /* Init */
4567fe5393cSmrg#ifdef LONG64
45715fb4814Smrg    GAbsX = abs (LineInfo->X1 - LineInfo->X2);
45815fb4814Smrg    GAbsY = abs (LineInfo->Y1 - LineInfo->Y2);
45915fb4814Smrg#else
46015fb4814Smrg    GAbsX = labs (LineInfo->X1 - LineInfo->X2);
46115fb4814Smrg    GAbsY = labs (LineInfo->Y1 - LineInfo->Y2);
4627fe5393cSmrg#endif
46315fb4814Smrg
46415fb4814Smrg    GXInc = (LineInfo->X1 < LineInfo->X2) ? 1:0;
46515fb4814Smrg    GYInc = (LineInfo->Y1 < LineInfo->Y2) ? 1:0;
46615fb4814Smrg    GXMajor = (GAbsX >= GAbsY) ? 1:0;
4677fe5393cSmrg
46815fb4814Smrg    /* Calculate */
46915fb4814Smrg    if (GXMajor)
47015fb4814Smrg    {
47115fb4814Smrg        MM = GAbsX;
4727fe5393cSmrg        mm = GAbsY;
47315fb4814Smrg    }
47415fb4814Smrg    else
47515fb4814Smrg    {
47615fb4814Smrg        MM = GAbsY;
4777fe5393cSmrg        mm = GAbsX;
47815fb4814Smrg    }
47915fb4814Smrg
48015fb4814Smrg    Error0 = (signed) (2*mm - MM);
4817fe5393cSmrg
48215fb4814Smrg    K1 = 2* mm;
48315fb4814Smrg    K2 = (signed) (2*mm - 2*MM);
4847fe5393cSmrg
48515fb4814Smrg    /*save the Param to dsLineParam */
48615fb4814Smrg    dsLineParam->dsLineX = (USHORT) LineInfo->X1;
48715fb4814Smrg    dsLineParam->dsLineY = (USHORT) LineInfo->Y1;
48815fb4814Smrg    dsLineParam->dsLineWidth = (USHORT) MM;
48915fb4814Smrg    dsLineParam->dwErrorTerm = (ULONG) Error0;
49015fb4814Smrg    dsLineParam->dwK1Term = K1;
49115fb4814Smrg    dsLineParam->dwK2Term = K2;
49215fb4814Smrg
49315fb4814Smrg    dsLineParam->dwLineAttributes = 0;
49415fb4814Smrg    if (GXMajor) dsLineParam->dwLineAttributes |= LINEPARAM_XM;
49515fb4814Smrg    if (!GXInc) dsLineParam->dwLineAttributes |= LINEPARAM_X_DEC;
49615fb4814Smrg    if (!GYInc) dsLineParam->dwLineAttributes |= LINEPARAM_Y_DEC;
4977fe5393cSmrg
49815fb4814Smrg    return(TRUE);
4997fe5393cSmrg
50015fb4814Smrg}
50115fb4814Smrg#endif	/* end of Accel_2D */
50215fb4814Smrg
50315fb4814Smrg
504