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