ast_2dtool.c revision de78e416
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 "xf86Resources.h"
2915fb4814Smrg#include "xf86RAC.h"
3015fb4814Smrg#include "xf86cmap.h"
3115fb4814Smrg#include "compiler.h"
3215fb4814Smrg#include "mibstore.h"
3315fb4814Smrg#include "vgaHW.h"
3415fb4814Smrg#include "mipointer.h"
3515fb4814Smrg#include "micmap.h"
3615fb4814Smrg
3715fb4814Smrg#include "fb.h"
3815fb4814Smrg#include "regionstr.h"
3915fb4814Smrg#include "xf86xv.h"
4015fb4814Smrg#include <X11/extensions/Xv.h>
4115fb4814Smrg#include "vbe.h"
4215fb4814Smrg
4315fb4814Smrg#include "xf86PciInfo.h"
4415fb4814Smrg#include "xf86Pci.h"
4515fb4814Smrg
4615fb4814Smrg/* framebuffer offscreen manager */
4715fb4814Smrg#include "xf86fbman.h"
4815fb4814Smrg
4915fb4814Smrg/* include xaa includes */
5015fb4814Smrg#include "xaa.h"
5115fb4814Smrg#include "xaarop.h"
5215fb4814Smrg
5315fb4814Smrg/* H/W cursor support */
5415fb4814Smrg#include "xf86Cursor.h"
5515fb4814Smrg
5615fb4814Smrg/* Driver specific headers */
5715fb4814Smrg#include "ast.h"
5815fb4814Smrg
5915fb4814Smrg#ifdef	Accel_2D
6015fb4814Smrg
6115fb4814Smrg/* Prototype type declaration */
6215fb4814SmrgBool bInitCMDQInfo(ScrnInfoPtr pScrn, ASTRecPtr pAST);
6315fb4814SmrgBool bEnableCMDQ(ScrnInfoPtr pScrn, ASTRecPtr pAST);
6415fb4814SmrgBool bEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST);
6515fb4814Smrgvoid vDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST);
6615fb4814Smrgvoid vWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST);
6715fb4814SmrgUCHAR *pjRequestCMDQ(ASTRecPtr pAST, ULONG   ulDataLen);
6815fb4814SmrgBool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam);
6915fb4814Smrg
7015fb4814SmrgBool
7115fb4814SmrgbInitCMDQInfo(ScrnInfoPtr pScrn, ASTRecPtr pAST)
7215fb4814Smrg{
7315fb4814Smrg
7415fb4814Smrg    ScreenPtr pScreen;
7515fb4814Smrg
7615fb4814Smrg    pAST->CMDQInfo.pjCmdQBasePort    = pAST->MMIOVirtualAddr+ 0x8044;
7715fb4814Smrg    pAST->CMDQInfo.pjWritePort       = pAST->MMIOVirtualAddr+ 0x8048;
7815fb4814Smrg    pAST->CMDQInfo.pjReadPort        = pAST->MMIOVirtualAddr+ 0x804C;
7915fb4814Smrg    pAST->CMDQInfo.pjEngStatePort    = pAST->MMIOVirtualAddr+ 0x804C;
8015fb4814Smrg
8115fb4814Smrg    /* CMDQ mode Init */
8215fb4814Smrg    if (!pAST->MMIO2D) {
8315fb4814Smrg        pAST->CMDQInfo.ulCMDQType = VM_CMD_QUEUE;
8415fb4814Smrg
8515fb4814Smrg        pScreen = screenInfo.screens[pScrn->scrnIndex];
8615fb4814Smrg
8715fb4814Smrg        do {
8815fb4814Smrg            pAST->pCMDQPtr = xf86AllocateOffscreenLinear (pScreen, pAST->CMDQInfo.ulCMDQSize, 8, NULL, NULL, NULL);
8915fb4814Smrg
9015fb4814Smrg            if (pAST->pCMDQPtr) break;
9115fb4814Smrg
9215fb4814Smrg            pAST->CMDQInfo.ulCMDQSize >>= 1;
9315fb4814Smrg
9415fb4814Smrg        } while (pAST->CMDQInfo.ulCMDQSize >= MIN_CMDQ_SIZE);
9515fb4814Smrg
9615fb4814Smrg        if (pAST->pCMDQPtr)
9715fb4814Smrg        {
9815fb4814Smrg           xf86DrvMsg(pScrn->scrnIndex, X_INFO,"Allocate CMDQ size is %ld kbyte \n", (unsigned long) (pAST->CMDQInfo.ulCMDQSize/1024));
9915fb4814Smrg
10015fb4814Smrg           pAST->CMDQInfo.ulCMDQOffsetAddr  = pAST->pCMDQPtr->offset*((pScrn->bitsPerPixel + 1) / 8);
10115fb4814Smrg           pAST->CMDQInfo.pjCMDQVirtualAddr = pAST->FBVirtualAddr + pAST->CMDQInfo.ulCMDQOffsetAddr;
10215fb4814Smrg
10315fb4814Smrg           pAST->CMDQInfo.ulCurCMDQueueLen = pAST->CMDQInfo.ulCMDQSize - CMD_QUEUE_GUARD_BAND;
10415fb4814Smrg           pAST->CMDQInfo.ulCMDQMask = pAST->CMDQInfo.ulCMDQSize - 1 ;
10515fb4814Smrg
10615fb4814Smrg        }
10715fb4814Smrg        else
10815fb4814Smrg        {
10915fb4814Smrg           xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Allocate CMDQ failed \n");
11015fb4814Smrg           pAST->MMIO2D = TRUE;		/* set to MMIO mode if CMDQ allocate failed */
11115fb4814Smrg        }
11215fb4814Smrg
11315fb4814Smrg    }
11415fb4814Smrg
11515fb4814Smrg    /* MMIO mode init */
11615fb4814Smrg    if (pAST->MMIO2D) {
11715fb4814Smrg        pAST->CMDQInfo.ulCMDQType = VM_CMD_MMIO;
11815fb4814Smrg    }
11915fb4814Smrg
12015fb4814Smrg    return (TRUE);
12115fb4814Smrg}
12215fb4814Smrg
12315fb4814SmrgBool
12415fb4814SmrgbEnableCMDQ(ScrnInfoPtr pScrn, ASTRecPtr pAST)
12515fb4814Smrg{
12615fb4814Smrg    ULONG ulVMCmdQBasePort = 0;
12715fb4814Smrg
12815fb4814Smrg    vWaitEngIdle(pScrn, pAST);
12915fb4814Smrg
13015fb4814Smrg    /* set DBG Select Info */
13115fb4814Smrg    if (pAST->DBGSelect)
13215fb4814Smrg    {
13315fb4814Smrg        *(ULONG *) (pAST->MMIOVirtualAddr + 0x804C) = (ULONG) (pAST->DBGSelect);
13415fb4814Smrg    }
13515fb4814Smrg
13615fb4814Smrg    /* set CMDQ base */
13715fb4814Smrg    switch (pAST->CMDQInfo.ulCMDQType)
13815fb4814Smrg    {
13915fb4814Smrg    case VM_CMD_QUEUE:
14015fb4814Smrg        ulVMCmdQBasePort  = (pAST->CMDQInfo.ulCMDQOffsetAddr - 0) >> 3;
14115fb4814Smrg
14215fb4814Smrg        /* set CMDQ Threshold */
14315fb4814Smrg        ulVMCmdQBasePort |= 0xF0000000;
14415fb4814Smrg
14515fb4814Smrg        /* set CMDQ Size */
14615fb4814Smrg        switch (pAST->CMDQInfo.ulCMDQSize)
14715fb4814Smrg        {
14815fb4814Smrg        case CMD_QUEUE_SIZE_256K:
14915fb4814Smrg            ulVMCmdQBasePort |= 0x00000000;
15015fb4814Smrg            break;
15115fb4814Smrg
15215fb4814Smrg        case CMD_QUEUE_SIZE_512K:
15315fb4814Smrg            ulVMCmdQBasePort |= 0x04000000;
15415fb4814Smrg            break;
15515fb4814Smrg
15615fb4814Smrg        case CMD_QUEUE_SIZE_1M:
15715fb4814Smrg            ulVMCmdQBasePort |= 0x08000000;
15815fb4814Smrg            break;
15915fb4814Smrg
16015fb4814Smrg        case CMD_QUEUE_SIZE_2M:
16115fb4814Smrg            ulVMCmdQBasePort |= 0x0C000000;
16215fb4814Smrg            break;
16315fb4814Smrg
16415fb4814Smrg        default:
16515fb4814Smrg            return(FALSE);
16615fb4814Smrg            break;
16715fb4814Smrg        }
16815fb4814Smrg
16915fb4814Smrg        *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort;
170de78e416Smrg        pAST->CMDQInfo.ulWritePointer = *(ULONG *) (pAST->CMDQInfo.pjWritePort) << 3;
17115fb4814Smrg        break;
17215fb4814Smrg
17315fb4814Smrg    case VM_CMD_MMIO:
17415fb4814Smrg        /* set CMDQ Threshold */
17515fb4814Smrg        ulVMCmdQBasePort |= 0xF0000000;
17615fb4814Smrg
17715fb4814Smrg        ulVMCmdQBasePort |= 0x02000000;			/* MMIO mode */
17815fb4814Smrg        *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort;
17915fb4814Smrg        break;
18015fb4814Smrg
18115fb4814Smrg    default:
18215fb4814Smrg        return (FALSE);
18315fb4814Smrg        break;
18415fb4814Smrg    }
18515fb4814Smrg
18615fb4814Smrg    return (TRUE);
18715fb4814Smrg}
18815fb4814Smrg
18915fb4814SmrgBool
19015fb4814SmrgbEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST)
19115fb4814Smrg{
192de78e416Smrg    ULONG ulData;
193de78e416Smrg
194de78e416Smrg    switch (pAST->jChipType)
195de78e416Smrg    {
196de78e416Smrg    case AST2100:
197de78e416Smrg    case AST1100:
198de78e416Smrg    case AST2200:
199de78e416Smrg    case AST2150:
200de78e416Smrg       *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000;
201de78e416Smrg       *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1;
202de78e416Smrg
203de78e416Smrg       ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c);
204de78e416Smrg       *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c) = (ulData & 0xFFFFFFFD);
205de78e416Smrg       break;
206de78e416Smrg    }
207de78e416Smrg
20815fb4814Smrg    SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01);		/* enable 2D */
20915fb4814Smrg
21015fb4814Smrg    if (!bInitCMDQInfo(pScrn, pAST))
21115fb4814Smrg    {
21215fb4814Smrg        vDisable2D(pScrn, pAST);
21315fb4814Smrg    	return (FALSE);
21415fb4814Smrg    }
21515fb4814Smrg
21615fb4814Smrg    if (!bEnableCMDQ(pScrn, pAST))
21715fb4814Smrg    {
21815fb4814Smrg        vDisable2D(pScrn, pAST);
21915fb4814Smrg    	return (FALSE);
22015fb4814Smrg    }
22115fb4814Smrg
22215fb4814Smrg    return (TRUE);
22315fb4814Smrg}
22415fb4814Smrg
22515fb4814Smrgvoid
22615fb4814SmrgvDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST)
22715fb4814Smrg{
22815fb4814Smrg
22915fb4814Smrg    vWaitEngIdle(pScrn, pAST);
23015fb4814Smrg    vWaitEngIdle(pScrn, pAST);
23115fb4814Smrg
23215fb4814Smrg    SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x00);
23315fb4814Smrg
23415fb4814Smrg}
23515fb4814Smrg
23615fb4814Smrg
23715fb4814Smrgvoid
23815fb4814SmrgvWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST)
23915fb4814Smrg{
24015fb4814Smrg    ULONG ulEngState, ulEngState2;
24115fb4814Smrg    UCHAR jReg;
24215fb4814Smrg    ULONG ulEngCheckSetting;
24315fb4814Smrg
24415fb4814Smrg    if (pAST->MMIO2D)
24515fb4814Smrg        ulEngCheckSetting = 0x10000000;
24615fb4814Smrg    else
24715fb4814Smrg        ulEngCheckSetting = 0x80000000;
24815fb4814Smrg
24915fb4814Smrg    /* 2D disable if 0xA4 D[0] = 1 */
25015fb4814Smrg    GetIndexRegMask(CRTC_PORT, 0xA4, 0x01, jReg);
25115fb4814Smrg    if (!jReg) goto Exit_vWaitEngIdle;
25215fb4814Smrg
25315fb4814Smrg    /* 2D not work if in std. mode */
25415fb4814Smrg    GetIndexRegMask(CRTC_PORT, 0xA3, 0x0F, jReg);
25515fb4814Smrg    if (!jReg) goto Exit_vWaitEngIdle;
25615fb4814Smrg
25715fb4814Smrg    do
25815fb4814Smrg    {
25915fb4814Smrg        ulEngState = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000;
26015fb4814Smrg        ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000;
26115fb4814Smrg        ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000;
26215fb4814Smrg        ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000;
26315fb4814Smrg        ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000;
26415fb4814Smrg        ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000;
26515fb4814Smrg
26615fb4814Smrg    } while ((ulEngState & ulEngCheckSetting) || (ulEngState != ulEngState2));
26715fb4814Smrg
26815fb4814SmrgExit_vWaitEngIdle:
26915fb4814Smrg    ;
27015fb4814Smrg}
27115fb4814Smrg
27215fb4814Smrg/* ULONG ulGetCMDQLength() */
273de78e416Smrgstatic __inline ULONG ulGetCMDQLength(ASTRecPtr pAST, ULONG ulWritePointer, ULONG ulCMDQMask)
27415fb4814Smrg{
27515fb4814Smrg    ULONG ulReadPointer, ulReadPointer2;
27615fb4814Smrg
27715fb4814Smrg    do {
27815fb4814Smrg        ulReadPointer  = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF;
27915fb4814Smrg        ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF;
28015fb4814Smrg        ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF;
28115fb4814Smrg        ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF;
28215fb4814Smrg        ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF;
28315fb4814Smrg        ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF;
28415fb4814Smrg     } while (ulReadPointer != ulReadPointer2);
28515fb4814Smrg
28615fb4814Smrg    return ((ulReadPointer << 3) - ulWritePointer - CMD_QUEUE_GUARD_BAND) & ulCMDQMask;
28715fb4814Smrg}
28815fb4814Smrg
28915fb4814SmrgUCHAR *pjRequestCMDQ(
29015fb4814SmrgASTRecPtr pAST, ULONG   ulDataLen)
29115fb4814Smrg{
29215fb4814Smrg    UCHAR   *pjBuffer;
29315fb4814Smrg    ULONG   i, ulWritePointer, ulCMDQMask, ulCurCMDQLen, ulContinueCMDQLen;
29415fb4814Smrg
29515fb4814Smrg    ulWritePointer = pAST->CMDQInfo.ulWritePointer;
29615fb4814Smrg    ulContinueCMDQLen = pAST->CMDQInfo.ulCMDQSize - ulWritePointer;
29715fb4814Smrg    ulCMDQMask = pAST->CMDQInfo.ulCMDQMask;
29815fb4814Smrg
29915fb4814Smrg    if (ulContinueCMDQLen >= ulDataLen)
30015fb4814Smrg    {
30115fb4814Smrg        /* Get CMDQ Buffer */
30215fb4814Smrg        if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen)
30315fb4814Smrg        {
30415fb4814Smrg        	;
30515fb4814Smrg        }
30615fb4814Smrg        else
30715fb4814Smrg        {
30815fb4814Smrg
30915fb4814Smrg            do
31015fb4814Smrg            {
31115fb4814Smrg                ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask);
31215fb4814Smrg            } while (ulCurCMDQLen < ulDataLen);
31315fb4814Smrg
31415fb4814Smrg            pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen;
31515fb4814Smrg
31615fb4814Smrg        }
31715fb4814Smrg
31815fb4814Smrg        pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer;
31915fb4814Smrg        pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen;
32015fb4814Smrg        pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask;
32115fb4814Smrg        return pjBuffer;
32215fb4814Smrg    }
32315fb4814Smrg    else
32415fb4814Smrg    {
32515fb4814Smrg
32615fb4814Smrg        /* Fill NULL CMD to the last of the CMDQ */
32715fb4814Smrg        if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulContinueCMDQLen)
32815fb4814Smrg        {
32915fb4814Smrg        	;
33015fb4814Smrg        }
33115fb4814Smrg        else
33215fb4814Smrg        {
33315fb4814Smrg
33415fb4814Smrg            do
33515fb4814Smrg            {
33615fb4814Smrg                ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask);
33715fb4814Smrg            } while (ulCurCMDQLen < ulContinueCMDQLen);
33815fb4814Smrg
33915fb4814Smrg            pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen;
34015fb4814Smrg
34115fb4814Smrg        }
34215fb4814Smrg
34315fb4814Smrg        pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer;
34415fb4814Smrg        for (i = 0; i<ulContinueCMDQLen/8; i++, pjBuffer+=8)
34515fb4814Smrg        {
34615fb4814Smrg            *(ULONG *)pjBuffer = (ULONG) PKT_NULL_CMD;
34715fb4814Smrg            *(ULONG *) (pjBuffer+4) = 0;
34815fb4814Smrg
34915fb4814Smrg        }
35015fb4814Smrg        pAST->CMDQInfo.ulCurCMDQueueLen -= ulContinueCMDQLen;
35115fb4814Smrg        pAST->CMDQInfo.ulWritePointer = ulWritePointer = 0;
35215fb4814Smrg
35315fb4814Smrg        /* Get CMDQ Buffer */
35415fb4814Smrg        if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen)
35515fb4814Smrg        {
35615fb4814Smrg	        ;
35715fb4814Smrg        }
35815fb4814Smrg        else
35915fb4814Smrg        {
36015fb4814Smrg
36115fb4814Smrg            do
36215fb4814Smrg            {
36315fb4814Smrg                ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask);
36415fb4814Smrg            } while (ulCurCMDQLen < ulDataLen);
36515fb4814Smrg
36615fb4814Smrg            pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen;
36715fb4814Smrg
36815fb4814Smrg        }
36915fb4814Smrg
37015fb4814Smrg        pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen;
37115fb4814Smrg        pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer;
37215fb4814Smrg        pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask;
37315fb4814Smrg        return pjBuffer;
37415fb4814Smrg
37515fb4814Smrg    }
37615fb4814Smrg
37715fb4814Smrg} /* end of pjRequestCmdQ() */
37815fb4814Smrg
37915fb4814SmrgBool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam)
38015fb4814Smrg{
38115fb4814Smrg    LONG GAbsX, GAbsY, GXInc, GYInc, GXMajor;
38215fb4814Smrg    LONG MM, mm, Error0, K1, K2;
38315fb4814Smrg
38415fb4814Smrg    /* Init */
38515fb4814Smrg#ifdef LONG64
38615fb4814Smrg    GAbsX = abs (LineInfo->X1 - LineInfo->X2);
38715fb4814Smrg    GAbsY = abs (LineInfo->Y1 - LineInfo->Y2);
38815fb4814Smrg#else
38915fb4814Smrg    GAbsX = labs (LineInfo->X1 - LineInfo->X2);
39015fb4814Smrg    GAbsY = labs (LineInfo->Y1 - LineInfo->Y2);
39115fb4814Smrg#endif
39215fb4814Smrg
39315fb4814Smrg    GXInc = (LineInfo->X1 < LineInfo->X2) ? 1:0;
39415fb4814Smrg    GYInc = (LineInfo->Y1 < LineInfo->Y2) ? 1:0;
39515fb4814Smrg    GXMajor = (GAbsX >= GAbsY) ? 1:0;
39615fb4814Smrg
39715fb4814Smrg    /* Calculate */
39815fb4814Smrg    if (GXMajor)
39915fb4814Smrg    {
40015fb4814Smrg        MM = GAbsX;
40115fb4814Smrg        mm = GAbsY;
40215fb4814Smrg    }
40315fb4814Smrg    else
40415fb4814Smrg    {
40515fb4814Smrg        MM = GAbsY;
40615fb4814Smrg        mm = GAbsX;
40715fb4814Smrg    }
40815fb4814Smrg
40915fb4814Smrg    Error0 = (signed) (2*mm - MM);
41015fb4814Smrg
41115fb4814Smrg    K1 = 2* mm;
41215fb4814Smrg    K2 = (signed) (2*mm - 2*MM);
41315fb4814Smrg
41415fb4814Smrg    /*save the Param to dsLineParam */
41515fb4814Smrg    dsLineParam->dsLineX = (USHORT) LineInfo->X1;
41615fb4814Smrg    dsLineParam->dsLineY = (USHORT) LineInfo->Y1;
41715fb4814Smrg    dsLineParam->dsLineWidth = (USHORT) MM;
41815fb4814Smrg    dsLineParam->dwErrorTerm = (ULONG) Error0;
41915fb4814Smrg    dsLineParam->dwK1Term = K1;
42015fb4814Smrg    dsLineParam->dwK2Term = K2;
42115fb4814Smrg
42215fb4814Smrg    dsLineParam->dwLineAttributes = 0;
42315fb4814Smrg    if (GXMajor) dsLineParam->dwLineAttributes |= LINEPARAM_XM;
42415fb4814Smrg    if (!GXInc) dsLineParam->dwLineAttributes |= LINEPARAM_X_DEC;
42515fb4814Smrg    if (!GYInc) dsLineParam->dwLineAttributes |= LINEPARAM_Y_DEC;
42615fb4814Smrg
42715fb4814Smrg    return(TRUE);
42815fb4814Smrg
42915fb4814Smrg}
43015fb4814Smrg#endif	/* end of Accel_2D */
43115fb4814Smrg
43215fb4814Smrg
433