ast_accel.c revision b410ddbe
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 xaa includes */
4815fb4814Smrg#include "xaa.h"
4915fb4814Smrg#include "xaarop.h"
5015fb4814Smrg
5115fb4814Smrg/* H/W cursor support */
5215fb4814Smrg#include "xf86Cursor.h"
5315fb4814Smrg
5415fb4814Smrg/* Driver specific headers */
5515fb4814Smrg#include "ast.h"
5615fb4814Smrg
5715fb4814Smrg#ifdef	Accel_2D
5815fb4814Smrg/* ROP Translation Table */
5915fb4814Smrgint ASTXAACopyROP[16] =
6015fb4814Smrg{
6115fb4814Smrg   ROP_0,               /* GXclear */
6215fb4814Smrg   ROP_DSa,             /* GXand */
6315fb4814Smrg   ROP_SDna,            /* GXandReverse */
6415fb4814Smrg   ROP_S,               /* GXcopy */
6515fb4814Smrg   ROP_DSna,            /* GXandInverted */
6615fb4814Smrg   ROP_D,               /* GXnoop */
6715fb4814Smrg   ROP_DSx,             /* GXxor */
6815fb4814Smrg   ROP_DSo,             /* GXor */
6915fb4814Smrg   ROP_DSon,            /* GXnor */
7015fb4814Smrg   ROP_DSxn,            /* GXequiv */
7115fb4814Smrg   ROP_Dn,              /* GXinvert*/
7215fb4814Smrg   ROP_SDno,            /* GXorReverse */
7315fb4814Smrg   ROP_Sn,              /* GXcopyInverted */
7415fb4814Smrg   ROP_DSno,            /* GXorInverted */
7515fb4814Smrg   ROP_DSan,            /* GXnand */
7615fb4814Smrg   ROP_1                /* GXset */
7715fb4814Smrg};
7815fb4814Smrg
7915fb4814Smrgint ASTXAAPatternROP[16]=
8015fb4814Smrg{
8115fb4814Smrg   ROP_0,
8215fb4814Smrg   ROP_DPa,
8315fb4814Smrg   ROP_PDna,
8415fb4814Smrg   ROP_P,
8515fb4814Smrg   ROP_DPna,
8615fb4814Smrg   ROP_D,
8715fb4814Smrg   ROP_DPx,
8815fb4814Smrg   ROP_DPo,
8915fb4814Smrg   ROP_DPon,
9015fb4814Smrg   ROP_PDxn,
9115fb4814Smrg   ROP_Dn,
9215fb4814Smrg   ROP_PDno,
9315fb4814Smrg   ROP_Pn,
9415fb4814Smrg   ROP_DPno,
9515fb4814Smrg   ROP_DPan,
9615fb4814Smrg   ROP_1
9715fb4814Smrg};
9815fb4814Smrg
9915fb4814Smrg/* extern function */
10015fb4814Smrgextern void vWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST);
10115fb4814Smrgextern UCHAR *pjRequestCMDQ(ASTRecPtr pAST, ULONG ulDataLen);
10215fb4814Smrgextern Bool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam);
10315fb4814Smrg
10415fb4814Smrg/* Prototype type declaration */
10515fb4814SmrgBool ASTAccelInit(ScreenPtr pScreen);
10615fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn);
10715fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
10815fb4814Smrg                                          int xdir, int ydir, int rop,
10915fb4814Smrg                                          unsigned int planemask, int trans_color);
11015fb4814Smrgstatic void ASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
11115fb4814Smrg                                            int y2, int w, int h);
11215fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn,
11315fb4814Smrg                                 int color, int rop, unsigned int planemask);
11415fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
11515fb4814Smrg                                       int dst_x, int dst_y, int width, int height);
11615fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
11715fb4814Smrg                                 int color, int rop, unsigned int planemask);
11815fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
11915fb4814Smrg                                          int x, int y, int len, int dir);
12015fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
12115fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags);
12215fb4814Smrgstatic void ASTSetupForDashedLine(ScrnInfoPtr pScrn,
12315fb4814Smrg                                  int fg, int bg, int rop, unsigned int planemask,
12415fb4814Smrg                                  int length, UCHAR *pattern);
12515fb4814Smrgstatic void ASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
12615fb4814Smrg                                            int x1, int y1, int x2, int y2,
12715fb4814Smrg                                            int flags, int phase);
12815fb4814Smrgstatic void ASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
12915fb4814Smrg                                       int patx, int paty, int fg, int bg,
13015fb4814Smrg                                       int rop, unsigned int planemask);
13115fb4814Smrgstatic void ASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
13215fb4814Smrg                                         int patx, int paty,
13315fb4814Smrg                                         int x, int y, int w, int h);
13415fb4814Smrgstatic void ASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
13515fb4814Smrg			                   int rop, unsigned int planemask, int trans_col);
13615fb4814Smrgstatic void ASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
13715fb4814Smrg                                                 int x, int y, int w, int h);
13815fb4814Smrgstatic void ASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
13915fb4814Smrg                                                  int fg, int bg,
14015fb4814Smrg                                                  int rop, unsigned int planemask);
14115fb4814Smrgstatic void ASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
14215fb4814Smrg                                                    int x, int y,
14315fb4814Smrg                                                    int width, int height, int skipleft);
14415fb4814Smrgstatic void ASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14515fb4814Smrg                                                     int fg, int bg,
14615fb4814Smrg                                                     int rop, unsigned int planemask);
14715fb4814Smrgstatic void ASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14815fb4814Smrg                                                       int x, int y, int width, int height,
14915fb4814Smrg                                                       int src_x, int src_y, int offset);
15015fb4814Smrgstatic void ASTSetClippingRectangle(ScrnInfoPtr pScrn,
15115fb4814Smrg                                    int left, int top, int right, int bottom);
15215fb4814Smrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn);
153de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y);
15415fb4814Smrg
155b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
156b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags);
157b410ddbeSmrgstatic void AIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
158b410ddbeSmrg                                            int x1, int y1, int x2, int y2,
159b410ddbeSmrg                                            int flags, int phase);
160b410ddbeSmrg
16115fb4814SmrgBool
16215fb4814SmrgASTAccelInit(ScreenPtr pScreen)
16315fb4814Smrg{
16415fb4814Smrg    XAAInfoRecPtr  infoPtr;
16515fb4814Smrg    ScrnInfoPtr    pScrn = xf86Screens[pScreen->myNum];
16615fb4814Smrg    ASTRecPtr      pAST = ASTPTR(pScrn);
16715fb4814Smrg
16815fb4814Smrg    pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec();
16915fb4814Smrg    if (!infoPtr)  return FALSE;
17015fb4814Smrg
17115fb4814Smrg    infoPtr->Flags = LINEAR_FRAMEBUFFER |
17215fb4814Smrg  		     OFFSCREEN_PIXMAPS |
17315fb4814Smrg  		     PIXMAP_CACHE;
17415fb4814Smrg
17515fb4814Smrg    /* Sync */
17615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Sync)
17715fb4814Smrg        infoPtr->Sync = ASTSync;
17815fb4814Smrg
17915fb4814Smrg    /* Screen To Screen copy */
18015fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy)
18115fb4814Smrg    {
18215fb4814Smrg        infoPtr->SetupForScreenToScreenCopy =  ASTSetupForScreenToScreenCopy;
18315fb4814Smrg        infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy;
18415fb4814Smrg        infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK;
18515fb4814Smrg    }
18615fb4814Smrg
18715fb4814Smrg    /* Solid fill */
18815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidFill)
18915fb4814Smrg    {
19015fb4814Smrg        infoPtr->SetupForSolidFill = ASTSetupForSolidFill;
19115fb4814Smrg        infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect;
19215fb4814Smrg        infoPtr->SolidFillFlags = NO_PLANEMASK;
19315fb4814Smrg    }
19415fb4814Smrg
19515fb4814Smrg    /* Solid Lines */
19615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidLine)
19715fb4814Smrg    {
198b410ddbeSmrg        if (pAST->jChipType == AST2300)
199b410ddbeSmrg    	{
200b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine;
201b410ddbeSmrg        }
202b410ddbeSmrg        else
203b410ddbeSmrg    	{
204b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine;
205b410ddbeSmrg        }
206b410ddbeSmrg
207b410ddbeSmrg        infoPtr->SetupForSolidLine = ASTSetupForSolidLine;
20815fb4814Smrg        infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine;
20915fb4814Smrg        infoPtr->SolidLineFlags = NO_PLANEMASK;
21015fb4814Smrg    }
21115fb4814Smrg
21215fb4814Smrg    /* Dashed Lines */
21315fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_DashedLine)
214b410ddbeSmrg    {
215b410ddbeSmrg        if (pAST->jChipType == AST2300)
216b410ddbeSmrg        {
217b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine;
218b410ddbeSmrg        }
219b410ddbeSmrg        else
220b410ddbeSmrg        {
221b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine;
222b410ddbeSmrg        }
223b410ddbeSmrg
224b410ddbeSmrg        infoPtr->SetupForDashedLine = ASTSetupForDashedLine;
22515fb4814Smrg        infoPtr->DashPatternMaxLength = 64;
22615fb4814Smrg        infoPtr->DashedLineFlags = NO_PLANEMASK |
22715fb4814Smrg			           LINE_PATTERN_MSBFIRST_LSBJUSTIFIED;
22815fb4814Smrg    }
22915fb4814Smrg
23015fb4814Smrg    /* 8x8 mono pattern fill */
23115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill)
23215fb4814Smrg    {
23315fb4814Smrg        infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill;
23415fb4814Smrg        infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill;
23515fb4814Smrg        infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
23615fb4814Smrg                                           NO_TRANSPARENCY |
23715fb4814Smrg				           HARDWARE_PATTERN_SCREEN_ORIGIN |
23815fb4814Smrg				           HARDWARE_PATTERN_PROGRAMMED_BITS |
23915fb4814Smrg				           BIT_ORDER_IN_BYTE_MSBFIRST;
24015fb4814Smrg    }
24115fb4814Smrg
24215fb4814Smrg    /* 8x8 color pattern fill */
24315fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill)
24415fb4814Smrg    {
24515fb4814Smrg        infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill;
24615fb4814Smrg        infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect;
24715fb4814Smrg        infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
24815fb4814Smrg					    NO_TRANSPARENCY |
24915fb4814Smrg	 				    HARDWARE_PATTERN_SCREEN_ORIGIN;
25015fb4814Smrg    }
25115fb4814Smrg
25215fb4814Smrg    /* CPU To Screen Color Expand */
25315fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand)
25415fb4814Smrg    {
25515fb4814Smrg        infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill;
25615fb4814Smrg        infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill;
25715fb4814Smrg        infoPtr->ColorExpandRange = MAX_PATReg_Size;
25815fb4814Smrg        infoPtr->ColorExpandBase = MMIOREG_PAT;
25915fb4814Smrg        infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
26015fb4814Smrg	   				           BIT_ORDER_IN_BYTE_MSBFIRST;
26115fb4814Smrg    }
26215fb4814Smrg
26315fb4814Smrg    /* Screen To Screen Color Expand */
26415fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand)
26515fb4814Smrg    {
26615fb4814Smrg        infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill;
26715fb4814Smrg        infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill;
26815fb4814Smrg        infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK |
26915fb4814Smrg	                                              BIT_ORDER_IN_BYTE_MSBFIRST;
27015fb4814Smrg    }
27115fb4814Smrg
27215fb4814Smrg    /* Clipping */
27315fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Clipping)
27415fb4814Smrg    {
27515fb4814Smrg        infoPtr->SetClippingRectangle = ASTSetClippingRectangle;
27615fb4814Smrg        infoPtr->DisableClipping = ASTDisableClipping;
27715fb4814Smrg        infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY 	|
27815fb4814Smrg                		 HARDWARE_CLIP_MONO_8x8_FILL		|
27915fb4814Smrg                		 HARDWARE_CLIP_COLOR_8x8_FILL	 	|
28015fb4814Smrg                		 HARDWARE_CLIP_SOLID_LINE 		|
28115fb4814Smrg                		 HARDWARE_CLIP_DASHED_LINE 		|
28215fb4814Smrg                		 HARDWARE_CLIP_SOLID_LINE;
28315fb4814Smrg    }
28415fb4814Smrg
28515fb4814Smrg    return(XAAInit(pScreen, infoPtr));
28615fb4814Smrg
28715fb4814Smrg} /* end of ASTAccelInit */
28815fb4814Smrg
28915fb4814Smrg
29015fb4814Smrgstatic void
29115fb4814SmrgASTSync(ScrnInfoPtr pScrn)
29215fb4814Smrg{
29315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
29415fb4814Smrg
29515fb4814Smrg    /* wait engle idle */
29615fb4814Smrg    vWaitEngIdle(pScrn, pAST);
29715fb4814Smrg
29815fb4814Smrg} /* end of ASTSync */
29915fb4814Smrg
30015fb4814Smrg
30115fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
30215fb4814Smrg                                          int xdir, int ydir, int rop,
30315fb4814Smrg                                          unsigned int planemask, int trans_color)
30415fb4814Smrg{
30515fb4814Smrg
30615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
30715fb4814Smrg    PKT_SC *pSingleCMD;
30815fb4814Smrg    ULONG  cmdreg;
30915fb4814Smrg
31015fb4814Smrg/*
31115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n");
31215fb4814Smrg*/
31315fb4814Smrg    /* Modify Reg. Value */
31415fb4814Smrg    cmdreg = CMD_BITBLT;
31515fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
31615fb4814Smrg    {
31715fb4814Smrg    case 8:
31815fb4814Smrg        cmdreg |= CMD_COLOR_08;
31915fb4814Smrg        break;
32015fb4814Smrg    case 15:
32115fb4814Smrg    case 16:
32215fb4814Smrg        cmdreg |= CMD_COLOR_16;
32315fb4814Smrg        break;
32415fb4814Smrg    case 24:
32515fb4814Smrg    case 32:
32615fb4814Smrg        cmdreg |= CMD_COLOR_32;
32715fb4814Smrg        break;
32815fb4814Smrg    }
32915fb4814Smrg    cmdreg |= (ASTXAACopyROP[rop] << 8);
33015fb4814Smrg    pAST->ulCMDReg = cmdreg;
33115fb4814Smrg
33215fb4814Smrg    if (!pAST->MMIO2D)
33315fb4814Smrg    {
33415fb4814Smrg        /* Write to CMDQ */
33515fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
33615fb4814Smrg
33715fb4814Smrg        ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch);
33815fb4814Smrg        pSingleCMD++;
33915fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
340de78e416Smrg
341de78e416Smrg        /* Update Write Pointer */
342de78e416Smrg        mUpdateWritePointer;
343de78e416Smrg
34415fb4814Smrg    }
34515fb4814Smrg    else
34615fb4814Smrg    {
34715fb4814Smrg        /* Write to MMIO */
34815fb4814Smrg        ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch);
34915fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
35015fb4814Smrg    }
35115fb4814Smrg
35215fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */
35315fb4814Smrg
35415fb4814Smrgstatic void
35515fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
35615fb4814Smrg                                int y2, int width, int height)
35715fb4814Smrg{
35815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
35915fb4814Smrg    PKT_SC *pSingleCMD;
36015fb4814Smrg    int src_x, src_y, dst_x, dst_y;
36115fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
362de78e416Smrg    int delta_y = 0;
36315fb4814Smrg/*
36415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n");
36515fb4814Smrg*/
36615fb4814Smrg
367de78e416Smrg    if ((width != 0) && (height != 0))
368de78e416Smrg    {
369de78e416Smrg        /* Modify Reg. Value */
370de78e416Smrg        cmdreg = pAST->ulCMDReg;
371de78e416Smrg        if (pAST->EnableClip)
372de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
373de78e416Smrg        else
374de78e416Smrg            cmdreg &= ~CMD_ENABLE_CLIP;
375de78e416Smrg        srcbase = dstbase = 0;
376de78e416Smrg
377de78e416Smrg        if (x1 < x2)
378de78e416Smrg            cmdreg |= CMD_X_DEC;
379de78e416Smrg
380de78e416Smrg        if (y1 < y2)
381de78e416Smrg            cmdreg |= CMD_Y_DEC;
38215fb4814Smrg
383de78e416Smrg        if ((y1 + height) >= MAX_SRC_Y)
384de78e416Smrg        {
385de78e416Smrg            srcbase=pAST->VideoModeInfo.ScreenPitch*y1;
386de78e416Smrg            y1 = 0;
387de78e416Smrg        }
388de78e416Smrg
389de78e416Smrg        if ((y2 + height) >= pScrn->virtualY)
390de78e416Smrg        {
391de78e416Smrg            delta_y = y2;
392de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y2;
393de78e416Smrg            y2 = 0;
394de78e416Smrg        }
395de78e416Smrg
396de78e416Smrg        if (cmdreg & CMD_X_DEC)
397de78e416Smrg        {
398de78e416Smrg            src_x = x1 + width - 1;
399de78e416Smrg            dst_x = x2 + width - 1;
400de78e416Smrg        }
401de78e416Smrg        else
402de78e416Smrg        {
403de78e416Smrg            src_x = x1;
404de78e416Smrg            dst_x = x2;
405de78e416Smrg        }
406de78e416Smrg
407de78e416Smrg        if (cmdreg & CMD_Y_DEC)
408de78e416Smrg        {
409de78e416Smrg            src_y = y1 + height - 1;
410de78e416Smrg            dst_y = y2 + height - 1;
411de78e416Smrg        }
412de78e416Smrg        else
413de78e416Smrg        {
414de78e416Smrg            src_y = y1;
415de78e416Smrg            dst_y = y2;
416de78e416Smrg        }
417de78e416Smrg
418de78e416Smrg        if (pAST->EnableClip)
419de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
420de78e416Smrg
421de78e416Smrg        if (!pAST->MMIO2D)
422de78e416Smrg        {
423de78e416Smrg            /* Write to CMDQ */
424de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
42515fb4814Smrg
426de78e416Smrg            ASTSetupSRCBase(pSingleCMD, srcbase);
427de78e416Smrg            pSingleCMD++;
428de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
429de78e416Smrg            pSingleCMD++;
430de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
431de78e416Smrg            pSingleCMD++;
432de78e416Smrg            ASTSetupSRCXY(pSingleCMD, src_x, src_y);
433de78e416Smrg            pSingleCMD++;
434de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
435de78e416Smrg            pSingleCMD++;
436de78e416Smrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
437de78e416Smrg
438de78e416Smrg            /* Update Write Pointer */
439de78e416Smrg            mUpdateWritePointer;
44015fb4814Smrg
441de78e416Smrg        }
442de78e416Smrg        else
443de78e416Smrg        {
444de78e416Smrg            ASTSetupSRCBase_MMIO(srcbase);
445de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
446de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
447de78e416Smrg            ASTSetupSRCXY_MMIO(src_x, src_y);
448de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
449de78e416Smrg            ASTSetupCMDReg_MMIO(cmdreg);
450de78e416Smrg
451de78e416Smrg            vWaitEngIdle(pScrn, pAST);
452de78e416Smrg        }
453de78e416Smrg
454de78e416Smrg    } /* width & height check */
45515fb4814Smrg
45615fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */
45715fb4814Smrg
45815fb4814Smrgstatic void
45915fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn,
46015fb4814Smrg                     int color, int rop, unsigned int planemask)
46115fb4814Smrg{
46215fb4814Smrg
46315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
46415fb4814Smrg    PKT_SC *pSingleCMD;
46515fb4814Smrg    ULONG cmdreg;
46615fb4814Smrg
46715fb4814Smrg/*
46815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n");
46915fb4814Smrg*/
47015fb4814Smrg    /* Modify Reg. Value */
47115fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR;
47215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
47315fb4814Smrg    {
47415fb4814Smrg    case 8:
47515fb4814Smrg        cmdreg |= CMD_COLOR_08;
47615fb4814Smrg        break;
47715fb4814Smrg    case 15:
47815fb4814Smrg    case 16:
47915fb4814Smrg        cmdreg |= CMD_COLOR_16;
48015fb4814Smrg        break;
48115fb4814Smrg    case 24:
48215fb4814Smrg    case 32:
48315fb4814Smrg        cmdreg |= CMD_COLOR_32;
48415fb4814Smrg        break;
48515fb4814Smrg    }
48615fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
48715fb4814Smrg    pAST->ulCMDReg = cmdreg;
48815fb4814Smrg
48915fb4814Smrg    if (!pAST->MMIO2D)
49015fb4814Smrg    {
49115fb4814Smrg        /* Write to CMDQ */
49215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
49315fb4814Smrg
49415fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
49515fb4814Smrg        pSingleCMD++;
496de78e416Smrg        ASTSetupFG(pSingleCMD, color);
497de78e416Smrg
498de78e416Smrg        /* Update Write Pointer */
499de78e416Smrg        mUpdateWritePointer;
500de78e416Smrg
50115fb4814Smrg    }
50215fb4814Smrg    else
50315fb4814Smrg    {
50415fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
50515fb4814Smrg        ASTSetupFG_MMIO(color);
50615fb4814Smrg    }
50715fb4814Smrg
50815fb4814Smrg} /* end of ASTSetupForSolidFill */
50915fb4814Smrg
51015fb4814Smrg
51115fb4814Smrgstatic void
51215fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
51315fb4814Smrg                           int dst_x, int dst_y, int width, int height)
51415fb4814Smrg{
51515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
51615fb4814Smrg    PKT_SC *pSingleCMD;
517de78e416Smrg    ULONG dstbase, cmdreg;
518de78e416Smrg    int delta_y = 0;
519de78e416Smrg
52015fb4814Smrg/*
52115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n");
52215fb4814Smrg*/
52315fb4814Smrg
524de78e416Smrg    if ((width != 0) && (height != 0))
525de78e416Smrg    {
526de78e416Smrg        /* Modify Reg. Value */
527de78e416Smrg        cmdreg = pAST->ulCMDReg;
528de78e416Smrg        if (pAST->EnableClip)
529de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
530de78e416Smrg        else
531de78e416Smrg            cmdreg &= ~CMD_ENABLE_CLIP;
532de78e416Smrg        dstbase = 0;
533de78e416Smrg
534de78e416Smrg        if (dst_y >= pScrn->virtualY)
535de78e416Smrg        {
536de78e416Smrg            delta_y = dst_y;
537de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
538de78e416Smrg            dst_y=0;
539de78e416Smrg        }
54015fb4814Smrg
541de78e416Smrg        if (pAST->EnableClip)
542de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
543de78e416Smrg
544de78e416Smrg        if (!pAST->MMIO2D)
545de78e416Smrg        {
546de78e416Smrg            /* Write to CMDQ */
547de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
548de78e416Smrg
549de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
550de78e416Smrg            pSingleCMD++;
551de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
552de78e416Smrg            pSingleCMD++;
553de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
554de78e416Smrg            pSingleCMD++;
555de78e416Smrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
556de78e416Smrg
557de78e416Smrg            /* Update Write Pointer */
558de78e416Smrg            mUpdateWritePointer;
559de78e416Smrg
560de78e416Smrg        }
561de78e416Smrg        else
562de78e416Smrg        {
563de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
564de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
565de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
566de78e416Smrg            ASTSetupCMDReg_MMIO(cmdreg);
567de78e416Smrg
568de78e416Smrg            vWaitEngIdle(pScrn, pAST);
569de78e416Smrg
570de78e416Smrg        }
571de78e416Smrg
572de78e416Smrg    } /* width & height check */
57315fb4814Smrg
57415fb4814Smrg
57515fb4814Smrg} /* end of ASTSubsequentSolidFillRect */
57615fb4814Smrg
57715fb4814Smrg/* Line */
57815fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
57915fb4814Smrg                                 int color, int rop, unsigned int planemask)
58015fb4814Smrg{
58115fb4814Smrg
58215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
58315fb4814Smrg    PKT_SC *pSingleCMD;
58415fb4814Smrg    ULONG  cmdreg;
58515fb4814Smrg/*
58615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n");
58715fb4814Smrg*/
58815fb4814Smrg    /* Modify Reg. Value */
58915fb4814Smrg    cmdreg = CMD_BITBLT;
59015fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
59115fb4814Smrg    {
59215fb4814Smrg    case 8:
59315fb4814Smrg        cmdreg |= CMD_COLOR_08;
59415fb4814Smrg        break;
59515fb4814Smrg    case 15:
59615fb4814Smrg    case 16:
59715fb4814Smrg        cmdreg |= CMD_COLOR_16;
59815fb4814Smrg        break;
59915fb4814Smrg    case 24:
60015fb4814Smrg    case 32:
60115fb4814Smrg        cmdreg |= CMD_COLOR_32;
60215fb4814Smrg        break;
60315fb4814Smrg    }
60415fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
60515fb4814Smrg    pAST->ulCMDReg = cmdreg;
60615fb4814Smrg
60715fb4814Smrg    if (!pAST->MMIO2D)
60815fb4814Smrg    {
60915fb4814Smrg        /* Write to CMDQ */
61015fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
61115fb4814Smrg
61215fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
61315fb4814Smrg        pSingleCMD++;
61415fb4814Smrg        ASTSetupFG(pSingleCMD, color);
61515fb4814Smrg        pSingleCMD++;
61615fb4814Smrg        ASTSetupBG(pSingleCMD, 0);
61715fb4814Smrg
618de78e416Smrg        /* Update Write Pointer */
619de78e416Smrg        mUpdateWritePointer;
620de78e416Smrg
62115fb4814Smrg    }
62215fb4814Smrg    else
62315fb4814Smrg    {
62415fb4814Smrg        /* Write to MMIO */
62515fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
62615fb4814Smrg        ASTSetupFG_MMIO(color);
62715fb4814Smrg        ASTSetupBG_MMIO(0);
62815fb4814Smrg    }
62915fb4814Smrg
63015fb4814Smrg} /* end of ASTSetupForSolidLine */
63115fb4814Smrg
63215fb4814Smrg
63315fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
63415fb4814Smrg                                          int x, int y, int len, int dir)
63515fb4814Smrg{
63615fb4814Smrg
63715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
63815fb4814Smrg    PKT_SC *pSingleCMD;
63915fb4814Smrg    ULONG dstbase, cmdreg;
64015fb4814Smrg    int width, height;
641de78e416Smrg    int delta_y = 0;
64215fb4814Smrg/*
64315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n");
64415fb4814Smrg*/
64515fb4814Smrg
646de78e416Smrg    if (len != 0)
647de78e416Smrg    {
648de78e416Smrg        /* Modify Reg. Value */
649de78e416Smrg        cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT;
650de78e416Smrg        if (pAST->EnableClip)
651de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
652de78e416Smrg        else
653de78e416Smrg            cmdreg &= ~CMD_ENABLE_CLIP;
654de78e416Smrg        dstbase = 0;
655de78e416Smrg
656de78e416Smrg        if(dir == DEGREES_0) {			/* horizontal */
657de78e416Smrg            width  = len;
658de78e416Smrg            height = 1;
659de78e416Smrg        } else {					/* vertical */
660de78e416Smrg            width  = 1;
661de78e416Smrg            height = len;
662de78e416Smrg        }
663de78e416Smrg
664de78e416Smrg        if ((y + height) >= pScrn->virtualY)
665de78e416Smrg        {
666de78e416Smrg            delta_y = y;
667de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y;
668de78e416Smrg            y=0;
669de78e416Smrg        }
670de78e416Smrg
671de78e416Smrg        if (pAST->EnableClip)
672de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
673de78e416Smrg
674de78e416Smrg        if (!pAST->MMIO2D)
675de78e416Smrg        {
676de78e416Smrg            /* Write to CMDQ */
677de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
678de78e416Smrg
679de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
680de78e416Smrg            pSingleCMD++;
681de78e416Smrg            ASTSetupDSTXY(pSingleCMD, x, y);
682de78e416Smrg            pSingleCMD++;
683de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
684de78e416Smrg            pSingleCMD++;
685de78e416Smrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
686de78e416Smrg
687de78e416Smrg            /* Update Write Pointer */
688de78e416Smrg            mUpdateWritePointer;
689de78e416Smrg
690de78e416Smrg        }
691de78e416Smrg        else
692de78e416Smrg        {
693de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
694de78e416Smrg            ASTSetupDSTXY_MMIO(x, y);
695de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
696de78e416Smrg            ASTSetupCMDReg_MMIO(cmdreg);
697de78e416Smrg
698de78e416Smrg            vWaitEngIdle(pScrn, pAST);
699de78e416Smrg
700de78e416Smrg        }
701de78e416Smrg
702de78e416Smrg    } /* len check */
70315fb4814Smrg
70415fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */
70515fb4814Smrg
70615fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
70715fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags)
70815fb4814Smrg{
70915fb4814Smrg
71015fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
71115fb4814Smrg    PKT_SC 	*pSingleCMD;
71215fb4814Smrg    LINEPARAM   dsLineParam;
71315fb4814Smrg    _LINEInfo   LineInfo;
71415fb4814Smrg    ULONG 	dstbase, ulCommand;
71515fb4814Smrg    ULONG	miny, maxy;
71615fb4814Smrg    USHORT      usXM;
717de78e416Smrg    int delta_y = 0;
718de78e416Smrg
71915fb4814Smrg/*
72015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
72115fb4814Smrg*/
72215fb4814Smrg
72315fb4814Smrg    /* Modify Reg. Value */
72415fb4814Smrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW;
72515fb4814Smrg    if(flags & OMIT_LAST)
72615fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
72715fb4814Smrg    else
72815fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
72915fb4814Smrg    if (pAST->EnableClip)
73015fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
731de78e416Smrg    else
732de78e416Smrg        ulCommand &= ~CMD_ENABLE_CLIP;
73315fb4814Smrg    dstbase = 0;
73415fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
73515fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
73615fb4814Smrg    if(maxy >= pScrn->virtualY) {
737de78e416Smrg    	delta_y = miny;
73815fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
73915fb4814Smrg        y1 -= miny;
74015fb4814Smrg        y2 -= miny;
74115fb4814Smrg    }
742de78e416Smrg
74315fb4814Smrg    LineInfo.X1 = x1;
74415fb4814Smrg    LineInfo.Y1 = y1;
74515fb4814Smrg    LineInfo.X2 = x2;
74615fb4814Smrg    LineInfo.Y2 = y2;
74715fb4814Smrg
74815fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
74915fb4814Smrg
75015fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
75115fb4814Smrg        ulCommand |= CMD_X_DEC;
75215fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
75315fb4814Smrg        ulCommand |= CMD_Y_DEC;
75415fb4814Smrg
75515fb4814Smrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
756de78e416Smrg
757de78e416Smrg    if (pAST->EnableClip)
758de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
75915fb4814Smrg
76015fb4814Smrg    if (!pAST->MMIO2D)
76115fb4814Smrg    {
76215fb4814Smrg        /* Write to CMDQ */
76315fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
76415fb4814Smrg
76515fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
76615fb4814Smrg        pSingleCMD++;
76715fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
76815fb4814Smrg        pSingleCMD++;
76915fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
77015fb4814Smrg        pSingleCMD++;
77115fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
77215fb4814Smrg        pSingleCMD++;
77315fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
77415fb4814Smrg        pSingleCMD++;
77515fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
77615fb4814Smrg        pSingleCMD++;
77715fb4814Smrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
77815fb4814Smrg
77915fb4814Smrg        /* Update Write Pointer */
78015fb4814Smrg        mUpdateWritePointer;
781de78e416Smrg
782de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
783de78e416Smrg        vWaitEngIdle(pScrn, pAST);
78415fb4814Smrg
78515fb4814Smrg    }
78615fb4814Smrg    else
78715fb4814Smrg    {
78815fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
78915fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
79015fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
79115fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
79215fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
79315fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
79415fb4814Smrg        ASTSetupCMDReg_MMIO(ulCommand);
79515fb4814Smrg
79615fb4814Smrg        vWaitEngIdle(pScrn, pAST);
79715fb4814Smrg
79815fb4814Smrg    }
79915fb4814Smrg
80015fb4814Smrg
80115fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */
80215fb4814Smrg
80315fb4814Smrg/* Dash Line */
80415fb4814Smrgstatic void
80515fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn,
80615fb4814Smrg                      int fg, int bg, int rop, unsigned int planemask,
80715fb4814Smrg                      int length, UCHAR *pattern)
80815fb4814Smrg{
80915fb4814Smrg
81015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
81115fb4814Smrg    PKT_SC *pSingleCMD;
81215fb4814Smrg    ULONG  cmdreg;
81315fb4814Smrg/*
81415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n");
81515fb4814Smrg*/
81615fb4814Smrg    /* Modify Reg. Value */
81715fb4814Smrg    cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE;
81815fb4814Smrg
81915fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
82015fb4814Smrg    {
82115fb4814Smrg    case 8:
82215fb4814Smrg        cmdreg |= CMD_COLOR_08;
82315fb4814Smrg        break;
82415fb4814Smrg    case 15:
82515fb4814Smrg    case 16:
82615fb4814Smrg        cmdreg |= CMD_COLOR_16;
82715fb4814Smrg        break;
82815fb4814Smrg    case 24:
82915fb4814Smrg    case 32:
83015fb4814Smrg        cmdreg |= CMD_COLOR_32;
83115fb4814Smrg        break;
83215fb4814Smrg    }
83315fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
83415fb4814Smrg    if(bg == -1) {
83515fb4814Smrg        cmdreg |= CMD_TRANSPARENT;
83615fb4814Smrg        bg = 0;
83715fb4814Smrg    }
83815fb4814Smrg    cmdreg |= (((length-1) & 0x3F) << 24);		/* line period */
83915fb4814Smrg    pAST->ulCMDReg = cmdreg;
84015fb4814Smrg
84115fb4814Smrg    if (!pAST->MMIO2D)
84215fb4814Smrg    {
84315fb4814Smrg        /* Write to CMDQ */
84415fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
84515fb4814Smrg
84615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
84715fb4814Smrg        pSingleCMD++;
84815fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
84915fb4814Smrg        pSingleCMD++;
85015fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
85115fb4814Smrg        pSingleCMD++;
85215fb4814Smrg        ASTSetupLineStyle1(pSingleCMD, *pattern);
85315fb4814Smrg        pSingleCMD++;
854de78e416Smrg        ASTSetupLineStyle2(pSingleCMD, *(pattern+4));
855de78e416Smrg
856de78e416Smrg        /* Update Write Pointer */
857de78e416Smrg        mUpdateWritePointer;
85815fb4814Smrg
85915fb4814Smrg    }
86015fb4814Smrg    else
86115fb4814Smrg    {
86215fb4814Smrg        /* Write to MMIO */
86315fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
86415fb4814Smrg        ASTSetupFG_MMIO(fg);
86515fb4814Smrg        ASTSetupBG_MMIO(bg);
86615fb4814Smrg        ASTSetupLineStyle1_MMIO(*pattern);
86715fb4814Smrg        ASTSetupLineStyle2_MMIO(*(pattern+4));
86815fb4814Smrg
86915fb4814Smrg    }
87015fb4814Smrg
87115fb4814Smrg}
87215fb4814Smrg
87315fb4814Smrgstatic void
87415fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
87515fb4814Smrg                                int x1, int y1, int x2, int y2,
87615fb4814Smrg                                int flags, int phase)
87715fb4814Smrg{
87815fb4814Smrg
87915fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
88015fb4814Smrg    PKT_SC 	*pSingleCMD;
88115fb4814Smrg    LINEPARAM   dsLineParam;
88215fb4814Smrg    _LINEInfo   LineInfo;
88315fb4814Smrg    ULONG 	dstbase, ulCommand;
88415fb4814Smrg    ULONG	miny, maxy;
88515fb4814Smrg    USHORT      usXM;
886de78e416Smrg    int delta_y = 0;
887de78e416Smrg
88815fb4814Smrg/*
88915fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
89015fb4814Smrg*/
89115fb4814Smrg
89215fb4814Smrg    /* Modify Reg. Value */
89315fb4814Smrg    ulCommand = pAST->ulCMDReg;
89415fb4814Smrg    if(flags & OMIT_LAST)
89515fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
89615fb4814Smrg    else
89715fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
89815fb4814Smrg    if (pAST->EnableClip)
89915fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
900de78e416Smrg    else
901de78e416Smrg        ulCommand &= ~CMD_ENABLE_CLIP;
90215fb4814Smrg    dstbase = 0;
90315fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
90415fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
90515fb4814Smrg    if(maxy >= pScrn->virtualY) {
906de78e416Smrg    	delta_y = miny;
90715fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
90815fb4814Smrg        y1 -= miny;
90915fb4814Smrg        y2 -= miny;
91015fb4814Smrg    }
911de78e416Smrg
91215fb4814Smrg    LineInfo.X1 = x1;
91315fb4814Smrg    LineInfo.Y1 = y1;
91415fb4814Smrg    LineInfo.X2 = x2;
91515fb4814Smrg    LineInfo.Y2 = y2;
91615fb4814Smrg
91715fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
91815fb4814Smrg
91915fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
92015fb4814Smrg        ulCommand |= CMD_X_DEC;
92115fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
92215fb4814Smrg        ulCommand |= CMD_Y_DEC;
92315fb4814Smrg
92415fb4814Smrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
925de78e416Smrg
926de78e416Smrg    if (pAST->EnableClip)
927de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
92815fb4814Smrg
92915fb4814Smrg    if (!pAST->MMIO2D)
93015fb4814Smrg    {
93115fb4814Smrg        /* Write to CMDQ */
93215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
93315fb4814Smrg
93415fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
93515fb4814Smrg        pSingleCMD++;
93615fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
93715fb4814Smrg        pSingleCMD++;
93815fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
93915fb4814Smrg        pSingleCMD++;
94015fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
94115fb4814Smrg        pSingleCMD++;
94215fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
94315fb4814Smrg        pSingleCMD++;
94415fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
94515fb4814Smrg        pSingleCMD++;
94615fb4814Smrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
94715fb4814Smrg
94815fb4814Smrg        /* Update Write Pointer */
94915fb4814Smrg        mUpdateWritePointer;
950de78e416Smrg
951de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
952de78e416Smrg        vWaitEngIdle(pScrn, pAST);
95315fb4814Smrg
95415fb4814Smrg    }
95515fb4814Smrg    else
95615fb4814Smrg    {
95715fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
95815fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
95915fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
96015fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
96115fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
96215fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
96315fb4814Smrg        ASTSetupCMDReg_MMIO(ulCommand);
96415fb4814Smrg
96515fb4814Smrg        vWaitEngIdle(pScrn, pAST);
96615fb4814Smrg
96715fb4814Smrg    }
96815fb4814Smrg
96915fb4814Smrg}
97015fb4814Smrg
97115fb4814Smrg/* Mono Pattern Fill */
97215fb4814Smrgstatic void
97315fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
97415fb4814Smrg                           int patx, int paty, int fg, int bg,
97515fb4814Smrg                           int rop, unsigned int planemask)
97615fb4814Smrg{
97715fb4814Smrg
97815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
97915fb4814Smrg    PKT_SC *pSingleCMD;
98015fb4814Smrg    ULONG cmdreg;
98115fb4814Smrg
98215fb4814Smrg/*
98315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n");
98415fb4814Smrg*/
98515fb4814Smrg    /* Modify Reg. Value */
98615fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK;
98715fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
98815fb4814Smrg    {
98915fb4814Smrg    case 8:
99015fb4814Smrg        cmdreg |= CMD_COLOR_08;
99115fb4814Smrg        break;
99215fb4814Smrg    case 15:
99315fb4814Smrg    case 16:
99415fb4814Smrg        cmdreg |= CMD_COLOR_16;
99515fb4814Smrg        break;
99615fb4814Smrg    case 24:
99715fb4814Smrg    case 32:
99815fb4814Smrg        cmdreg |= CMD_COLOR_32;
99915fb4814Smrg        break;
100015fb4814Smrg    }
100115fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
100215fb4814Smrg    pAST->ulCMDReg = cmdreg;
100315fb4814Smrg
100415fb4814Smrg    if (!pAST->MMIO2D)
100515fb4814Smrg    {
100615fb4814Smrg        /* Write to CMDQ */
100715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
100815fb4814Smrg
100915fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
101015fb4814Smrg        pSingleCMD++;
101115fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
101215fb4814Smrg        pSingleCMD++;
101315fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
101415fb4814Smrg        pSingleCMD++;
101515fb4814Smrg        ASTSetupMONO1(pSingleCMD, patx);
101615fb4814Smrg        pSingleCMD++;
1017de78e416Smrg        ASTSetupMONO2(pSingleCMD, paty);
1018de78e416Smrg
1019de78e416Smrg        /* Update Write Pointer */
1020de78e416Smrg        mUpdateWritePointer;
1021de78e416Smrg
102215fb4814Smrg    }
102315fb4814Smrg    else
102415fb4814Smrg    {
102515fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
102615fb4814Smrg        ASTSetupFG_MMIO(fg);
102715fb4814Smrg        ASTSetupBG_MMIO(bg);
102815fb4814Smrg        ASTSetupMONO1_MMIO(patx);
102915fb4814Smrg        ASTSetupMONO2_MMIO(paty);
103015fb4814Smrg    }
103115fb4814Smrg
103215fb4814Smrg} /* end of ASTSetupForMonoPatternFill */
103315fb4814Smrg
103415fb4814Smrg
103515fb4814Smrgstatic void
103615fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
103715fb4814Smrg                             int patx, int paty,
103815fb4814Smrg                             int dst_x, int dst_y, int width, int height)
103915fb4814Smrg{
104015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
104115fb4814Smrg    PKT_SC *pSingleCMD;
1042de78e416Smrg    ULONG dstbase, cmdreg;
1043de78e416Smrg    int delta_y = 0;
1044de78e416Smrg
104515fb4814Smrg/*
104615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n");
104715fb4814Smrg*/
104815fb4814Smrg
104915fb4814Smrg    /* Modify Reg. Value */
105015fb4814Smrg    cmdreg = pAST->ulCMDReg;
105115fb4814Smrg    if (pAST->EnableClip)
1052de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1053de78e416Smrg    else
1054de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
105515fb4814Smrg    dstbase = 0;
105615fb4814Smrg
105715fb4814Smrg    if (dst_y >= pScrn->virtualY)
105815fb4814Smrg    {
1059de78e416Smrg    	delta_y = dst_y;
106015fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
106115fb4814Smrg        dst_y=0;
106215fb4814Smrg    }
1063de78e416Smrg
1064de78e416Smrg    if (pAST->EnableClip)
1065de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
1066de78e416Smrg
106715fb4814Smrg    if (!pAST->MMIO2D)
106815fb4814Smrg    {
106915fb4814Smrg        /* Write to CMDQ */
107015fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
107115fb4814Smrg
107215fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
107315fb4814Smrg        pSingleCMD++;
107415fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
107515fb4814Smrg        pSingleCMD++;
107615fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
107715fb4814Smrg        pSingleCMD++;
107815fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
107915fb4814Smrg
108015fb4814Smrg        /* Update Write Pointer */
108115fb4814Smrg        mUpdateWritePointer;
108215fb4814Smrg
108315fb4814Smrg    }
108415fb4814Smrg    else
108515fb4814Smrg    {
108615fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
108715fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
108815fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
108915fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
109015fb4814Smrg
109115fb4814Smrg        vWaitEngIdle(pScrn, pAST);
109215fb4814Smrg    }
109315fb4814Smrg
109415fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */
109515fb4814Smrg
109615fb4814Smrgstatic void
109715fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
109815fb4814Smrg			       int rop, unsigned int planemask, int trans_col)
109915fb4814Smrg{
110015fb4814Smrg
110115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
110215fb4814Smrg    PKT_SC *pSingleCMD;
110315fb4814Smrg    ULONG cmdreg;
110415fb4814Smrg    CARD32 *pataddr;
110515fb4814Smrg    ULONG ulPatSize;
110615fb4814Smrg    int i, j, cpp;
110715fb4814Smrg/*
110815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n");
110915fb4814Smrg*/
111015fb4814Smrg    /* Modify Reg. Value */
111115fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_PATREG;
111215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
111315fb4814Smrg    {
111415fb4814Smrg    case 8:
111515fb4814Smrg        cmdreg |= CMD_COLOR_08;
111615fb4814Smrg        break;
111715fb4814Smrg    case 15:
111815fb4814Smrg    case 16:
111915fb4814Smrg        cmdreg |= CMD_COLOR_16;
112015fb4814Smrg        break;
112115fb4814Smrg    case 24:
112215fb4814Smrg    case 32:
112315fb4814Smrg        cmdreg |= CMD_COLOR_32;
112415fb4814Smrg        break;
112515fb4814Smrg    }
112615fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
112715fb4814Smrg    pAST->ulCMDReg = cmdreg;
112815fb4814Smrg    cpp = (pScrn->bitsPerPixel + 1) / 8;
112915fb4814Smrg    pataddr = (CARD32 *)(pAST->FBVirtualAddr +
113015fb4814Smrg                        (paty * pAST->VideoModeInfo.ScreenWidth) + (patx * cpp));
113115fb4814Smrg    ulPatSize = 8*8*cpp;
113215fb4814Smrg
113315fb4814Smrg    if (!pAST->MMIO2D)
113415fb4814Smrg    {
113515fb4814Smrg        /* Write to CMDQ */
113615fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4));
113715fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
113815fb4814Smrg        pSingleCMD++;
113915fb4814Smrg        for (i=0; i<8; i++)
114015fb4814Smrg        {
114115fb4814Smrg            for (j=0; j<8*cpp/4; j++)
114215fb4814Smrg            {
114315fb4814Smrg                ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++)));
114415fb4814Smrg                pSingleCMD++;
114515fb4814Smrg            }
1146de78e416Smrg        }
1147de78e416Smrg
1148de78e416Smrg        /* Update Write Pointer */
1149de78e416Smrg        mUpdateWritePointer;
1150de78e416Smrg
115115fb4814Smrg    }
115215fb4814Smrg    else
115315fb4814Smrg    {
115415fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
115515fb4814Smrg        for (i=0; i<8; i++)
115615fb4814Smrg        {
115715fb4814Smrg            for (j=0; j<8*cpp/4; j++)
115815fb4814Smrg            {
115915fb4814Smrg                ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++)));
116015fb4814Smrg            }
116115fb4814Smrg        }
116215fb4814Smrg
116315fb4814Smrg    }
116415fb4814Smrg
116515fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */
116615fb4814Smrg
116715fb4814Smrgstatic void
116815fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
116915fb4814Smrg                                     int dst_x, int dst_y, int width, int height)
117015fb4814Smrg{
117115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
117215fb4814Smrg    PKT_SC *pSingleCMD;
1173de78e416Smrg    ULONG dstbase, cmdreg;
1174de78e416Smrg    int delta_y = 0;
1175de78e416Smrg
117615fb4814Smrg/*
117715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n");
117815fb4814Smrg*/
117915fb4814Smrg
118015fb4814Smrg    /* Modify Reg. Value */
118115fb4814Smrg    cmdreg = pAST->ulCMDReg;
118215fb4814Smrg    if (pAST->EnableClip)
1183de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1184de78e416Smrg    else
1185de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
118615fb4814Smrg    dstbase = 0;
118715fb4814Smrg
118815fb4814Smrg    if (dst_y >= pScrn->virtualY)
118915fb4814Smrg    {
1190de78e416Smrg    	delta_y = dst_y;
119115fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
119215fb4814Smrg        dst_y=0;
119315fb4814Smrg    }
1194de78e416Smrg
1195de78e416Smrg    if (pAST->EnableClip)
1196de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
119715fb4814Smrg
119815fb4814Smrg    if (!pAST->MMIO2D)
119915fb4814Smrg    {
120015fb4814Smrg        /* Write to CMDQ */
120115fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
120215fb4814Smrg
120315fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
120415fb4814Smrg        pSingleCMD++;
120515fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
120615fb4814Smrg        pSingleCMD++;
120715fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
120815fb4814Smrg        pSingleCMD++;
120915fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
121015fb4814Smrg
121115fb4814Smrg        /* Update Write Pointer */
121215fb4814Smrg        mUpdateWritePointer;
121315fb4814Smrg
121415fb4814Smrg    }
121515fb4814Smrg    else
121615fb4814Smrg    {
121715fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
121815fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
121915fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
122015fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
122115fb4814Smrg
122215fb4814Smrg        vWaitEngIdle(pScrn, pAST);
122315fb4814Smrg    }
122415fb4814Smrg
122515fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */
122615fb4814Smrg
122715fb4814Smrg/* CPU to Screen Expand */
122815fb4814Smrgstatic void
122915fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
123015fb4814Smrg                                      int fg, int bg,
123115fb4814Smrg                                      int rop, unsigned int planemask)
123215fb4814Smrg{
123315fb4814Smrg
123415fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
123515fb4814Smrg    PKT_SC *pSingleCMD;
123615fb4814Smrg    ULONG cmdreg;
123715fb4814Smrg
123815fb4814Smrg/*
123915fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n");
124015fb4814Smrg*/
124115fb4814Smrg    /* Modify Reg. Value */
124215fb4814Smrg    cmdreg = CMD_COLOREXP;
124315fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
124415fb4814Smrg    {
124515fb4814Smrg    case 8:
124615fb4814Smrg        cmdreg |= CMD_COLOR_08;
124715fb4814Smrg        break;
124815fb4814Smrg    case 15:
124915fb4814Smrg    case 16:
125015fb4814Smrg        cmdreg |= CMD_COLOR_16;
125115fb4814Smrg        break;
125215fb4814Smrg    case 24:
125315fb4814Smrg    case 32:
125415fb4814Smrg        cmdreg |= CMD_COLOR_32;
125515fb4814Smrg        break;
125615fb4814Smrg    }
125715fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
125815fb4814Smrg    if(bg == -1) {
125915fb4814Smrg        cmdreg |= CMD_FONT_TRANSPARENT;
126015fb4814Smrg        bg = 0;
126115fb4814Smrg    }
126215fb4814Smrg    pAST->ulCMDReg = cmdreg;
126315fb4814Smrg
126415fb4814Smrg    if (!pAST->MMIO2D)
126515fb4814Smrg    {
126615fb4814Smrg        /* Write to CMDQ */
126715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
126815fb4814Smrg
126915fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
127015fb4814Smrg        pSingleCMD++;
127115fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
127215fb4814Smrg        pSingleCMD++;
127315fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
1274de78e416Smrg
1275de78e416Smrg        /* Update Write Pointer */
1276de78e416Smrg        mUpdateWritePointer;
127715fb4814Smrg
127815fb4814Smrg    }
127915fb4814Smrg    else
128015fb4814Smrg    {
128115fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
128215fb4814Smrg        ASTSetupFG_MMIO(fg);
128315fb4814Smrg        ASTSetupBG_MMIO(bg);
128415fb4814Smrg
128515fb4814Smrg    }
128615fb4814Smrg
128715fb4814Smrg}
128815fb4814Smrg
128915fb4814Smrgstatic void
129015fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
129115fb4814Smrg                                        int dst_x, int dst_y,
129215fb4814Smrg                                        int width, int height, int offset)
129315fb4814Smrg{
129415fb4814Smrg
129515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
129615fb4814Smrg    PKT_SC *pSingleCMD;
129715fb4814Smrg    ULONG dstbase, cmdreg;
1298de78e416Smrg    int delta_y = 0;
129915fb4814Smrg
130015fb4814Smrg/*
130115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n");
130215fb4814Smrg*/
130315fb4814Smrg
130415fb4814Smrg    /* Modify Reg. Value */
130515fb4814Smrg    cmdreg = pAST->ulCMDReg;
130615fb4814Smrg    if (pAST->EnableClip)
1307de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1308de78e416Smrg    else
1309de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
131015fb4814Smrg    dstbase = 0;
131115fb4814Smrg
131215fb4814Smrg    if (dst_y >= pScrn->virtualY)
131315fb4814Smrg    {
1314de78e416Smrg    	delta_y = dst_y;
131515fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
131615fb4814Smrg        dst_y=0;
131715fb4814Smrg    }
1318de78e416Smrg
1319de78e416Smrg    if (pAST->EnableClip)
1320de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
1321de78e416Smrg
132215fb4814Smrg    if (!pAST->MMIO2D)
132315fb4814Smrg    {
132415fb4814Smrg        /* Write to CMDQ */
132515fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
132615fb4814Smrg
132715fb4814Smrg        ASTSetupSRCPitch(pSingleCMD, ((width+7)/8));
132815fb4814Smrg        pSingleCMD++;
132915fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
133015fb4814Smrg        pSingleCMD++;
133115fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
133215fb4814Smrg        pSingleCMD++;
133315fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
133415fb4814Smrg        pSingleCMD++;
133515fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
133615fb4814Smrg
133715fb4814Smrg        /* Update Write Pointer */
133815fb4814Smrg        mUpdateWritePointer;
133915fb4814Smrg
134015fb4814Smrg    }
134115fb4814Smrg    else
134215fb4814Smrg    {
134315fb4814Smrg        ASTSetupSRCPitch_MMIO((width+7)/8);
134415fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
134515fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
134615fb4814Smrg        ASTSetupSRCXY_MMIO(0, 0);
134715fb4814Smrg
134815fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
134915fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
135015fb4814Smrg
135115fb4814Smrg        vWaitEngIdle(pScrn, pAST);
135215fb4814Smrg
135315fb4814Smrg    }
135415fb4814Smrg
135515fb4814Smrg}
135615fb4814Smrg
135715fb4814Smrg
135815fb4814Smrg/* Screen to Screen Color Expand */
135915fb4814Smrgstatic void
136015fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
136115fb4814Smrg                                         int fg, int bg,
136215fb4814Smrg                                         int rop, unsigned int planemask)
136315fb4814Smrg{
136415fb4814Smrg
136515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
136615fb4814Smrg    PKT_SC *pSingleCMD;
136715fb4814Smrg    ULONG cmdreg;
136815fb4814Smrg
136915fb4814Smrg/*
137015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n");
137115fb4814Smrg*/
137215fb4814Smrg
137315fb4814Smrg    /* Modify Reg. Value */
137415fb4814Smrg    cmdreg = CMD_ENHCOLOREXP;
137515fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
137615fb4814Smrg    {
137715fb4814Smrg    case 8:
137815fb4814Smrg        cmdreg |= CMD_COLOR_08;
137915fb4814Smrg        break;
138015fb4814Smrg    case 15:
138115fb4814Smrg    case 16:
138215fb4814Smrg        cmdreg |= CMD_COLOR_16;
138315fb4814Smrg        break;
138415fb4814Smrg    case 24:
138515fb4814Smrg    case 32:
138615fb4814Smrg        cmdreg |= CMD_COLOR_32;
138715fb4814Smrg        break;
138815fb4814Smrg    }
138915fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
139015fb4814Smrg    if(bg == -1) {
139115fb4814Smrg        cmdreg |= CMD_FONT_TRANSPARENT;
139215fb4814Smrg        bg = 0;
139315fb4814Smrg    }
139415fb4814Smrg    pAST->ulCMDReg = cmdreg;
139515fb4814Smrg
139615fb4814Smrg    if (!pAST->MMIO2D)
139715fb4814Smrg    {
139815fb4814Smrg        /* Write to CMDQ */
139915fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
140015fb4814Smrg
140115fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
140215fb4814Smrg        pSingleCMD++;
140315fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
140415fb4814Smrg        pSingleCMD++;
140515fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
1406de78e416Smrg
1407de78e416Smrg        /* Update Write Pointer */
1408de78e416Smrg        mUpdateWritePointer;
140915fb4814Smrg
141015fb4814Smrg    }
141115fb4814Smrg    else
141215fb4814Smrg    {
141315fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
141415fb4814Smrg        ASTSetupFG_MMIO(fg);
141515fb4814Smrg        ASTSetupBG_MMIO(bg);
141615fb4814Smrg
141715fb4814Smrg    }
141815fb4814Smrg
141915fb4814Smrg}
142015fb4814Smrg
142115fb4814Smrg
142215fb4814Smrg
142315fb4814Smrgstatic void
142415fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
142515fb4814Smrg                                           int dst_x, int dst_y, int width, int height,
142615fb4814Smrg                                           int src_x, int src_y, int offset)
142715fb4814Smrg{
142815fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
142915fb4814Smrg    PKT_SC *pSingleCMD;
143015fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
143115fb4814Smrg    USHORT srcpitch;
1432de78e416Smrg    int delta_y = 0;
143315fb4814Smrg
143415fb4814Smrg/*
143515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n");
143615fb4814Smrg*/
143715fb4814Smrg
143815fb4814Smrg    /* Modify Reg. Value */
143915fb4814Smrg    cmdreg = pAST->ulCMDReg;
144015fb4814Smrg    if (pAST->EnableClip)
1441de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1442de78e416Smrg    else
1443de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
144415fb4814Smrg    dstbase = 0;
144515fb4814Smrg    if (dst_y >= pScrn->virtualY)
144615fb4814Smrg    {
1447de78e416Smrg    	delta_y = dst_y;
144815fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
144915fb4814Smrg        dst_y=0;
145015fb4814Smrg    }
145115fb4814Smrg    srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x;
145215fb4814Smrg    srcpitch = (pScrn->displayWidth+7)/8;
1453de78e416Smrg
1454de78e416Smrg    if (pAST->EnableClip)
1455de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
145615fb4814Smrg
145715fb4814Smrg    if (!pAST->MMIO2D)
145815fb4814Smrg    {
145915fb4814Smrg        /* Write to CMDQ */
146015fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
146115fb4814Smrg
146215fb4814Smrg        ASTSetupSRCBase(pSingleCMD, srcbase);
146315fb4814Smrg        pSingleCMD++;
146415fb4814Smrg        ASTSetupSRCPitch(pSingleCMD,srcpitch);
146515fb4814Smrg        pSingleCMD++;
146615fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
146715fb4814Smrg        pSingleCMD++;
146815fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
146915fb4814Smrg        pSingleCMD++;
147015fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
147115fb4814Smrg        pSingleCMD++;
147215fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
147315fb4814Smrg
147415fb4814Smrg        /* Update Write Pointer */
147515fb4814Smrg        mUpdateWritePointer;
147615fb4814Smrg
147715fb4814Smrg    }
147815fb4814Smrg    else
147915fb4814Smrg    {
148015fb4814Smrg        ASTSetupSRCBase_MMIO(srcbase);
148115fb4814Smrg        ASTSetupSRCPitch_MMIO(srcpitch);
148215fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
148315fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
148415fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
148515fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
148615fb4814Smrg
148715fb4814Smrg        vWaitEngIdle(pScrn, pAST);
148815fb4814Smrg
148915fb4814Smrg    }
149015fb4814Smrg
149115fb4814Smrg}
149215fb4814Smrg
149315fb4814Smrg
149415fb4814Smrg/* Clipping */
149515fb4814Smrgstatic void
1496de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y)
149715fb4814Smrg{
149815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
149915fb4814Smrg    PKT_SC *pSingleCMD;
1500de78e416Smrg
150115fb4814Smrg    if (!pAST->MMIO2D)
150215fb4814Smrg    {
150315fb4814Smrg        /* Write to CMDQ */
150415fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
150515fb4814Smrg
1506de78e416Smrg        ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y);
150715fb4814Smrg        pSingleCMD++;
1508de78e416Smrg        ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
1509de78e416Smrg
1510de78e416Smrg        /* Update Write Pointer */
1511de78e416Smrg        mUpdateWritePointer;
1512de78e416Smrg
151315fb4814Smrg    }
151415fb4814Smrg    else
151515fb4814Smrg    {
1516de78e416Smrg        ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y);
1517de78e416Smrg        ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
151815fb4814Smrg    }
1519de78e416Smrg
1520de78e416Smrg}
1521de78e416Smrg
1522de78e416Smrgstatic void
1523de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn,
1524de78e416Smrg                        int left, int top, int right, int bottom)
1525de78e416Smrg{
1526de78e416Smrg
1527de78e416Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
1528de78e416Smrg    PKT_SC *pSingleCMD;
1529de78e416Smrg/*
1530de78e416Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n");
1531de78e416Smrg*/
1532de78e416Smrg    pAST->EnableClip = TRUE;
1533de78e416Smrg
1534de78e416Smrg    pAST->clip_left   = left;
1535de78e416Smrg    pAST->clip_top    = top;
1536de78e416Smrg    pAST->clip_right  = right;
1537de78e416Smrg    pAST->clip_bottom = bottom;
153815fb4814Smrg
153915fb4814Smrg}
154015fb4814Smrg
154115fb4814Smrgstatic void
154215fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn)
154315fb4814Smrg{
154415fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
154515fb4814Smrg/*
154615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n");
154715fb4814Smrg*/
154815fb4814Smrg    pAST->EnableClip = FALSE;
154915fb4814Smrg}
155015fb4814Smrg
1551b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1552b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags)
1553b410ddbeSmrg{
1554b410ddbeSmrg
1555b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1556b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1557b410ddbeSmrg    ULONG 	dstbase, ulCommand;
1558b410ddbeSmrg    ULONG	miny, maxy;
1559b410ddbeSmrg/*
1560b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
1561b410ddbeSmrg*/
1562b410ddbeSmrg
1563b410ddbeSmrg    /* Modify Reg. Value */
1564b410ddbeSmrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE;
1565b410ddbeSmrg    if(flags & OMIT_LAST)
1566b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1567b410ddbeSmrg    else
1568b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1569b410ddbeSmrg    if (pAST->EnableClip)
1570b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1571b410ddbeSmrg    else
1572b410ddbeSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1573b410ddbeSmrg    dstbase = 0;
1574b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1575b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1576b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1577b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1578b410ddbeSmrg        y1 -= miny;
1579b410ddbeSmrg        y2 -= miny;
1580b410ddbeSmrg    }
1581b410ddbeSmrg
1582b410ddbeSmrg    if (!pAST->MMIO2D)
1583b410ddbeSmrg    {
1584b410ddbeSmrg        /* Write to CMDQ */
1585b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1586b410ddbeSmrg
1587b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
1588b410ddbeSmrg        pSingleCMD++;
1589b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1590b410ddbeSmrg        pSingleCMD++;
1591b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1592b410ddbeSmrg        pSingleCMD++;
1593b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
1594b410ddbeSmrg        pSingleCMD++;
1595b410ddbeSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
1596b410ddbeSmrg
1597b410ddbeSmrg        /* Update Write Pointer */
1598b410ddbeSmrg        mUpdateWritePointer;
1599b410ddbeSmrg
1600b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1601b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1602b410ddbeSmrg
1603b410ddbeSmrg    }
1604b410ddbeSmrg    else
1605b410ddbeSmrg    {
1606b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1607b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1608b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1609b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1610b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
1611b410ddbeSmrg
1612b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1613b410ddbeSmrg
1614b410ddbeSmrg    }
1615b410ddbeSmrg
1616b410ddbeSmrg
1617b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */
1618b410ddbeSmrg
1619b410ddbeSmrgstatic void
1620b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
1621b410ddbeSmrg                                int x1, int y1, int x2, int y2,
1622b410ddbeSmrg                                int flags, int phase)
1623b410ddbeSmrg{
1624b410ddbeSmrg
1625b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1626b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1627b410ddbeSmrg    ULONG 	dstbase, ulCommand;
1628b410ddbeSmrg    ULONG	miny, maxy;
1629b410ddbeSmrg/*
1630b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
1631b410ddbeSmrg*/
1632b410ddbeSmrg
1633b410ddbeSmrg    /* Modify Reg. Value */
1634b410ddbeSmrg    ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE;
1635b410ddbeSmrg    if(flags & OMIT_LAST)
1636b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1637b410ddbeSmrg    else
1638b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1639b410ddbeSmrg    if (pAST->EnableClip)
1640b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1641b410ddbeSmrg    else
1642b410ddbeSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1643b410ddbeSmrg    dstbase = 0;
1644b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1645b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1646b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1647b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1648b410ddbeSmrg        y1 -= miny;
1649b410ddbeSmrg        y2 -= miny;
1650b410ddbeSmrg    }
1651b410ddbeSmrg
1652b410ddbeSmrg    if (!pAST->MMIO2D)
1653b410ddbeSmrg    {
1654b410ddbeSmrg        /* Write to CMDQ */
1655b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1656b410ddbeSmrg
1657b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
1658b410ddbeSmrg        pSingleCMD++;
1659b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1660b410ddbeSmrg        pSingleCMD++;
1661b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1662b410ddbeSmrg        pSingleCMD++;
1663b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
1664b410ddbeSmrg        pSingleCMD++;
1665b410ddbeSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
1666b410ddbeSmrg
1667b410ddbeSmrg        /* Update Write Pointer */
1668b410ddbeSmrg        mUpdateWritePointer;
1669b410ddbeSmrg
1670b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1671b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1672b410ddbeSmrg
1673b410ddbeSmrg    }
1674b410ddbeSmrg    else
1675b410ddbeSmrg    {
1676b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1677b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1678b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1679b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1680b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
1681b410ddbeSmrg
1682b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1683b410ddbeSmrg
1684b410ddbeSmrg    }
1685b410ddbeSmrg
1686b410ddbeSmrg}
1687b410ddbeSmrg
168815fb4814Smrg#endif	/* end of Accel_2D */
1689