ast_accel.c revision b4d38c65
115fb4814Smrg/*
215fb4814Smrg * Copyright (c) 2005 ASPEED Technology Inc.
315fb4814Smrg *
415fb4814Smrg * Permission to use, copy, modify, distribute, and sell this software and its
515fb4814Smrg * documentation for any purpose is hereby granted without fee, provided that
615fb4814Smrg * the above copyright notice appear in all copies and that both that
715fb4814Smrg * copyright notice and this permission notice appear in supporting
815fb4814Smrg * documentation, and that the name of the authors not be used in
915fb4814Smrg * advertising or publicity pertaining to distribution of the software without
1015fb4814Smrg * specific, written prior permission.  The authors makes no representations
1115fb4814Smrg * about the suitability of this software for any purpose.  It is provided
1215fb4814Smrg * "as is" without express or implied warranty.
1315fb4814Smrg *
1415fb4814Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1515fb4814Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1615fb4814Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1715fb4814Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1815fb4814Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1915fb4814Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2015fb4814Smrg * PERFORMANCE OF THIS SOFTWARE.
2115fb4814Smrg */
2215fb4814Smrg
2315fb4814Smrg#ifdef HAVE_CONFIG_H
2415fb4814Smrg#include <config.h>
2515fb4814Smrg#endif
2615fb4814Smrg#include "xf86.h"
2715fb4814Smrg#include "xf86_OSproc.h"
2815fb4814Smrg#include "xf86cmap.h"
2915fb4814Smrg#include "compiler.h"
3015fb4814Smrg#include "mibstore.h"
3115fb4814Smrg#include "vgaHW.h"
3215fb4814Smrg#include "mipointer.h"
3315fb4814Smrg#include "micmap.h"
3415fb4814Smrg
3515fb4814Smrg#include "fb.h"
3615fb4814Smrg#include "regionstr.h"
3715fb4814Smrg#include "xf86xv.h"
3815fb4814Smrg#include <X11/extensions/Xv.h>
3915fb4814Smrg#include "vbe.h"
4015fb4814Smrg
4115fb4814Smrg#include "xf86PciInfo.h"
4215fb4814Smrg#include "xf86Pci.h"
4315fb4814Smrg
4415fb4814Smrg/* framebuffer offscreen manager */
4515fb4814Smrg#include "xf86fbman.h"
4615fb4814Smrg
4715fb4814Smrg/* include xaa includes */
48b4d38c65Smrg#ifdef HAVE_XAA_H
4915fb4814Smrg#include "xaa.h"
50b4d38c65Smrg#endif
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/* ROP Translation Table */
6115fb4814Smrgint ASTXAACopyROP[16] =
6215fb4814Smrg{
6315fb4814Smrg   ROP_0,               /* GXclear */
6415fb4814Smrg   ROP_DSa,             /* GXand */
6515fb4814Smrg   ROP_SDna,            /* GXandReverse */
6615fb4814Smrg   ROP_S,               /* GXcopy */
6715fb4814Smrg   ROP_DSna,            /* GXandInverted */
6815fb4814Smrg   ROP_D,               /* GXnoop */
6915fb4814Smrg   ROP_DSx,             /* GXxor */
7015fb4814Smrg   ROP_DSo,             /* GXor */
7115fb4814Smrg   ROP_DSon,            /* GXnor */
7215fb4814Smrg   ROP_DSxn,            /* GXequiv */
7315fb4814Smrg   ROP_Dn,              /* GXinvert*/
7415fb4814Smrg   ROP_SDno,            /* GXorReverse */
7515fb4814Smrg   ROP_Sn,              /* GXcopyInverted */
7615fb4814Smrg   ROP_DSno,            /* GXorInverted */
7715fb4814Smrg   ROP_DSan,            /* GXnand */
7815fb4814Smrg   ROP_1                /* GXset */
7915fb4814Smrg};
8015fb4814Smrg
8115fb4814Smrgint ASTXAAPatternROP[16]=
8215fb4814Smrg{
8315fb4814Smrg   ROP_0,
8415fb4814Smrg   ROP_DPa,
8515fb4814Smrg   ROP_PDna,
8615fb4814Smrg   ROP_P,
8715fb4814Smrg   ROP_DPna,
8815fb4814Smrg   ROP_D,
8915fb4814Smrg   ROP_DPx,
9015fb4814Smrg   ROP_DPo,
9115fb4814Smrg   ROP_DPon,
9215fb4814Smrg   ROP_PDxn,
9315fb4814Smrg   ROP_Dn,
9415fb4814Smrg   ROP_PDno,
9515fb4814Smrg   ROP_Pn,
9615fb4814Smrg   ROP_DPno,
9715fb4814Smrg   ROP_DPan,
9815fb4814Smrg   ROP_1
9915fb4814Smrg};
10015fb4814Smrg
10115fb4814Smrg/* extern function */
10215fb4814Smrgextern void vWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST);
10315fb4814Smrgextern UCHAR *pjRequestCMDQ(ASTRecPtr pAST, ULONG ulDataLen);
10415fb4814Smrgextern Bool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam);
10515fb4814Smrg
10615fb4814Smrg/* Prototype type declaration */
10715fb4814SmrgBool ASTAccelInit(ScreenPtr pScreen);
108b4d38c65Smrg#ifdef HAVE_XAA_H
10915fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn);
11015fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
11115fb4814Smrg                                          int xdir, int ydir, int rop,
11215fb4814Smrg                                          unsigned int planemask, int trans_color);
11315fb4814Smrgstatic void ASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
11415fb4814Smrg                                            int y2, int w, int h);
11515fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn,
11615fb4814Smrg                                 int color, int rop, unsigned int planemask);
11715fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
11815fb4814Smrg                                       int dst_x, int dst_y, int width, int height);
11915fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
12015fb4814Smrg                                 int color, int rop, unsigned int planemask);
12115fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
12215fb4814Smrg                                          int x, int y, int len, int dir);
12315fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
12415fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags);
12515fb4814Smrgstatic void ASTSetupForDashedLine(ScrnInfoPtr pScrn,
12615fb4814Smrg                                  int fg, int bg, int rop, unsigned int planemask,
12715fb4814Smrg                                  int length, UCHAR *pattern);
12815fb4814Smrgstatic void ASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
12915fb4814Smrg                                            int x1, int y1, int x2, int y2,
13015fb4814Smrg                                            int flags, int phase);
13115fb4814Smrgstatic void ASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
13215fb4814Smrg                                       int patx, int paty, int fg, int bg,
13315fb4814Smrg                                       int rop, unsigned int planemask);
13415fb4814Smrgstatic void ASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
13515fb4814Smrg                                         int patx, int paty,
13615fb4814Smrg                                         int x, int y, int w, int h);
13715fb4814Smrgstatic void ASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
13815fb4814Smrg			                   int rop, unsigned int planemask, int trans_col);
13915fb4814Smrgstatic void ASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
14015fb4814Smrg                                                 int x, int y, int w, int h);
14115fb4814Smrgstatic void ASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
14215fb4814Smrg                                                  int fg, int bg,
14315fb4814Smrg                                                  int rop, unsigned int planemask);
14415fb4814Smrgstatic void ASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
14515fb4814Smrg                                                    int x, int y,
14615fb4814Smrg                                                    int width, int height, int skipleft);
14715fb4814Smrgstatic void ASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14815fb4814Smrg                                                     int fg, int bg,
14915fb4814Smrg                                                     int rop, unsigned int planemask);
15015fb4814Smrgstatic void ASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
15115fb4814Smrg                                                       int x, int y, int width, int height,
15215fb4814Smrg                                                       int src_x, int src_y, int offset);
15315fb4814Smrgstatic void ASTSetClippingRectangle(ScrnInfoPtr pScrn,
15415fb4814Smrg                                    int left, int top, int right, int bottom);
15515fb4814Smrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn);
156de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y);
15715fb4814Smrg
158b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
159b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags);
160b410ddbeSmrgstatic void AIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
161b410ddbeSmrg                                            int x1, int y1, int x2, int y2,
162b410ddbeSmrg                                            int flags, int phase);
163b4d38c65Smrg#endif
164b410ddbeSmrg
16515fb4814SmrgBool
16615fb4814SmrgASTAccelInit(ScreenPtr pScreen)
16715fb4814Smrg{
168b4d38c65Smrg#ifdef HAVE_XAA_H
16915fb4814Smrg    XAAInfoRecPtr  infoPtr;
170b4d38c65Smrg    ScrnInfoPtr    pScrn = xf86ScreenToScrn(pScreen);
17115fb4814Smrg    ASTRecPtr      pAST = ASTPTR(pScrn);
17215fb4814Smrg
17315fb4814Smrg    pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec();
17415fb4814Smrg    if (!infoPtr)  return FALSE;
17515fb4814Smrg
17615fb4814Smrg    infoPtr->Flags = LINEAR_FRAMEBUFFER |
17715fb4814Smrg  		     OFFSCREEN_PIXMAPS |
17815fb4814Smrg  		     PIXMAP_CACHE;
17915fb4814Smrg
18015fb4814Smrg    /* Sync */
18115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Sync)
18215fb4814Smrg        infoPtr->Sync = ASTSync;
18315fb4814Smrg
18415fb4814Smrg    /* Screen To Screen copy */
18515fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy)
18615fb4814Smrg    {
18715fb4814Smrg        infoPtr->SetupForScreenToScreenCopy =  ASTSetupForScreenToScreenCopy;
18815fb4814Smrg        infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy;
18915fb4814Smrg        infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK;
19015fb4814Smrg    }
19115fb4814Smrg
19215fb4814Smrg    /* Solid fill */
19315fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidFill)
19415fb4814Smrg    {
19515fb4814Smrg        infoPtr->SetupForSolidFill = ASTSetupForSolidFill;
19615fb4814Smrg        infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect;
19715fb4814Smrg        infoPtr->SolidFillFlags = NO_PLANEMASK;
19815fb4814Smrg    }
19915fb4814Smrg
20015fb4814Smrg    /* Solid Lines */
20115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidLine)
20215fb4814Smrg    {
203b534f209Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) )
204b410ddbeSmrg    	{
205b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine;
206b410ddbeSmrg        }
207b410ddbeSmrg        else
208b410ddbeSmrg    	{
209b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine;
210b410ddbeSmrg        }
211b410ddbeSmrg
212b410ddbeSmrg        infoPtr->SetupForSolidLine = ASTSetupForSolidLine;
21315fb4814Smrg        infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine;
21415fb4814Smrg        infoPtr->SolidLineFlags = NO_PLANEMASK;
21515fb4814Smrg    }
21615fb4814Smrg
21715fb4814Smrg    /* Dashed Lines */
21815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_DashedLine)
219b410ddbeSmrg    {
220b534f209Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) )
221b410ddbeSmrg        {
222b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine;
223b410ddbeSmrg        }
224b410ddbeSmrg        else
225b410ddbeSmrg        {
226b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine;
227b410ddbeSmrg        }
228b410ddbeSmrg
229b410ddbeSmrg        infoPtr->SetupForDashedLine = ASTSetupForDashedLine;
23015fb4814Smrg        infoPtr->DashPatternMaxLength = 64;
23115fb4814Smrg        infoPtr->DashedLineFlags = NO_PLANEMASK |
23215fb4814Smrg			           LINE_PATTERN_MSBFIRST_LSBJUSTIFIED;
23315fb4814Smrg    }
23415fb4814Smrg
23515fb4814Smrg    /* 8x8 mono pattern fill */
23615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill)
23715fb4814Smrg    {
23815fb4814Smrg        infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill;
23915fb4814Smrg        infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill;
24015fb4814Smrg        infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
24115fb4814Smrg                                           NO_TRANSPARENCY |
24215fb4814Smrg				           HARDWARE_PATTERN_SCREEN_ORIGIN |
24315fb4814Smrg				           HARDWARE_PATTERN_PROGRAMMED_BITS |
24415fb4814Smrg				           BIT_ORDER_IN_BYTE_MSBFIRST;
24515fb4814Smrg    }
24615fb4814Smrg
24715fb4814Smrg    /* 8x8 color pattern fill */
24815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill)
24915fb4814Smrg    {
25015fb4814Smrg        infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill;
25115fb4814Smrg        infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect;
25215fb4814Smrg        infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
25315fb4814Smrg					    NO_TRANSPARENCY |
25415fb4814Smrg	 				    HARDWARE_PATTERN_SCREEN_ORIGIN;
25515fb4814Smrg    }
25615fb4814Smrg
25715fb4814Smrg    /* CPU To Screen Color Expand */
25815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand)
25915fb4814Smrg    {
26015fb4814Smrg        infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill;
26115fb4814Smrg        infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill;
26215fb4814Smrg        infoPtr->ColorExpandRange = MAX_PATReg_Size;
26315fb4814Smrg        infoPtr->ColorExpandBase = MMIOREG_PAT;
26415fb4814Smrg        infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
26515fb4814Smrg	   				           BIT_ORDER_IN_BYTE_MSBFIRST;
26615fb4814Smrg    }
26715fb4814Smrg
26815fb4814Smrg    /* Screen To Screen Color Expand */
26915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand)
27015fb4814Smrg    {
27115fb4814Smrg        infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill;
27215fb4814Smrg        infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill;
27315fb4814Smrg        infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK |
27415fb4814Smrg	                                              BIT_ORDER_IN_BYTE_MSBFIRST;
27515fb4814Smrg    }
27615fb4814Smrg
27715fb4814Smrg    /* Clipping */
27815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Clipping)
27915fb4814Smrg    {
28015fb4814Smrg        infoPtr->SetClippingRectangle = ASTSetClippingRectangle;
28115fb4814Smrg        infoPtr->DisableClipping = ASTDisableClipping;
28215fb4814Smrg        infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY 	|
28315fb4814Smrg                		 HARDWARE_CLIP_MONO_8x8_FILL		|
28415fb4814Smrg                		 HARDWARE_CLIP_COLOR_8x8_FILL	 	|
28515fb4814Smrg                		 HARDWARE_CLIP_SOLID_LINE 		|
28615fb4814Smrg                		 HARDWARE_CLIP_DASHED_LINE 		|
28715fb4814Smrg                		 HARDWARE_CLIP_SOLID_LINE;
28815fb4814Smrg    }
28915fb4814Smrg
29015fb4814Smrg    return(XAAInit(pScreen, infoPtr));
291b4d38c65Smrg#else
292b4d38c65Smrg    return TRUE;
293b4d38c65Smrg#endif
29415fb4814Smrg} /* end of ASTAccelInit */
29515fb4814Smrg
296b4d38c65Smrg#ifdef HAVE_XAA_H
29715fb4814Smrgstatic void
29815fb4814SmrgASTSync(ScrnInfoPtr pScrn)
29915fb4814Smrg{
30015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
30115fb4814Smrg
30215fb4814Smrg    /* wait engle idle */
30315fb4814Smrg    vWaitEngIdle(pScrn, pAST);
30415fb4814Smrg
30515fb4814Smrg} /* end of ASTSync */
30615fb4814Smrg
30715fb4814Smrg
30815fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
30915fb4814Smrg                                          int xdir, int ydir, int rop,
31015fb4814Smrg                                          unsigned int planemask, int trans_color)
31115fb4814Smrg{
31215fb4814Smrg
31315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
31415fb4814Smrg    PKT_SC *pSingleCMD;
31515fb4814Smrg    ULONG  cmdreg;
31615fb4814Smrg
31715fb4814Smrg/*
31815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n");
31915fb4814Smrg*/
32015fb4814Smrg    /* Modify Reg. Value */
32115fb4814Smrg    cmdreg = CMD_BITBLT;
32215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
32315fb4814Smrg    {
32415fb4814Smrg    case 8:
32515fb4814Smrg        cmdreg |= CMD_COLOR_08;
32615fb4814Smrg        break;
32715fb4814Smrg    case 15:
32815fb4814Smrg    case 16:
32915fb4814Smrg        cmdreg |= CMD_COLOR_16;
33015fb4814Smrg        break;
33115fb4814Smrg    case 24:
33215fb4814Smrg    case 32:
33315fb4814Smrg        cmdreg |= CMD_COLOR_32;
33415fb4814Smrg        break;
33515fb4814Smrg    }
33615fb4814Smrg    cmdreg |= (ASTXAACopyROP[rop] << 8);
33715fb4814Smrg    pAST->ulCMDReg = cmdreg;
33815fb4814Smrg
33915fb4814Smrg    if (!pAST->MMIO2D)
34015fb4814Smrg    {
34115fb4814Smrg        /* Write to CMDQ */
34215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
34315fb4814Smrg
34415fb4814Smrg        ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch);
34515fb4814Smrg        pSingleCMD++;
34615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
347de78e416Smrg
348de78e416Smrg        /* Update Write Pointer */
349de78e416Smrg        mUpdateWritePointer;
350de78e416Smrg
35115fb4814Smrg    }
35215fb4814Smrg    else
35315fb4814Smrg    {
35415fb4814Smrg        /* Write to MMIO */
35515fb4814Smrg        ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch);
35615fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
35715fb4814Smrg    }
35815fb4814Smrg
35915fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */
36015fb4814Smrg
36115fb4814Smrgstatic void
36215fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
36315fb4814Smrg                                int y2, int width, int height)
36415fb4814Smrg{
36515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
36615fb4814Smrg    PKT_SC *pSingleCMD;
36715fb4814Smrg    int src_x, src_y, dst_x, dst_y;
36815fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
369de78e416Smrg    int delta_y = 0;
37015fb4814Smrg/*
37115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n");
37215fb4814Smrg*/
37315fb4814Smrg
374de78e416Smrg    if ((width != 0) && (height != 0))
375de78e416Smrg    {
376de78e416Smrg        /* Modify Reg. Value */
377de78e416Smrg        cmdreg = pAST->ulCMDReg;
378de78e416Smrg        if (pAST->EnableClip)
379de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
380de78e416Smrg        else
381de78e416Smrg            cmdreg &= ~CMD_ENABLE_CLIP;
382de78e416Smrg        srcbase = dstbase = 0;
383de78e416Smrg
384de78e416Smrg        if (x1 < x2)
385de78e416Smrg            cmdreg |= CMD_X_DEC;
386de78e416Smrg
387de78e416Smrg        if (y1 < y2)
388de78e416Smrg            cmdreg |= CMD_Y_DEC;
38915fb4814Smrg
390de78e416Smrg        if ((y1 + height) >= MAX_SRC_Y)
391de78e416Smrg        {
392de78e416Smrg            srcbase=pAST->VideoModeInfo.ScreenPitch*y1;
393de78e416Smrg            y1 = 0;
394de78e416Smrg        }
395de78e416Smrg
396de78e416Smrg        if ((y2 + height) >= pScrn->virtualY)
397de78e416Smrg        {
398de78e416Smrg            delta_y = y2;
399de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y2;
400de78e416Smrg            y2 = 0;
401de78e416Smrg        }
402de78e416Smrg
403de78e416Smrg        if (cmdreg & CMD_X_DEC)
404de78e416Smrg        {
405de78e416Smrg            src_x = x1 + width - 1;
406de78e416Smrg            dst_x = x2 + width - 1;
407de78e416Smrg        }
408de78e416Smrg        else
409de78e416Smrg        {
410de78e416Smrg            src_x = x1;
411de78e416Smrg            dst_x = x2;
412de78e416Smrg        }
413de78e416Smrg
414de78e416Smrg        if (cmdreg & CMD_Y_DEC)
415de78e416Smrg        {
416de78e416Smrg            src_y = y1 + height - 1;
417de78e416Smrg            dst_y = y2 + height - 1;
418de78e416Smrg        }
419de78e416Smrg        else
420de78e416Smrg        {
421de78e416Smrg            src_y = y1;
422de78e416Smrg            dst_y = y2;
423de78e416Smrg        }
424de78e416Smrg
425de78e416Smrg        if (pAST->EnableClip)
426de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
427de78e416Smrg
428de78e416Smrg        if (!pAST->MMIO2D)
429de78e416Smrg        {
430de78e416Smrg            /* Write to CMDQ */
431de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
43215fb4814Smrg
433de78e416Smrg            ASTSetupSRCBase(pSingleCMD, srcbase);
434de78e416Smrg            pSingleCMD++;
435de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
436de78e416Smrg            pSingleCMD++;
437de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
438de78e416Smrg            pSingleCMD++;
439de78e416Smrg            ASTSetupSRCXY(pSingleCMD, src_x, src_y);
440de78e416Smrg            pSingleCMD++;
441de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
442de78e416Smrg            pSingleCMD++;
443de78e416Smrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
444de78e416Smrg
445de78e416Smrg            /* Update Write Pointer */
446de78e416Smrg            mUpdateWritePointer;
44715fb4814Smrg
448de78e416Smrg        }
449de78e416Smrg        else
450de78e416Smrg        {
451de78e416Smrg            ASTSetupSRCBase_MMIO(srcbase);
452de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
453de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
454de78e416Smrg            ASTSetupSRCXY_MMIO(src_x, src_y);
455de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
456de78e416Smrg            ASTSetupCMDReg_MMIO(cmdreg);
457de78e416Smrg
458de78e416Smrg            vWaitEngIdle(pScrn, pAST);
459de78e416Smrg        }
460de78e416Smrg
461de78e416Smrg    } /* width & height check */
46215fb4814Smrg
46315fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */
46415fb4814Smrg
46515fb4814Smrgstatic void
46615fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn,
46715fb4814Smrg                     int color, int rop, unsigned int planemask)
46815fb4814Smrg{
46915fb4814Smrg
47015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
47115fb4814Smrg    PKT_SC *pSingleCMD;
47215fb4814Smrg    ULONG cmdreg;
47315fb4814Smrg
47415fb4814Smrg/*
47515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n");
47615fb4814Smrg*/
47715fb4814Smrg    /* Modify Reg. Value */
47815fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR;
47915fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
48015fb4814Smrg    {
48115fb4814Smrg    case 8:
48215fb4814Smrg        cmdreg |= CMD_COLOR_08;
48315fb4814Smrg        break;
48415fb4814Smrg    case 15:
48515fb4814Smrg    case 16:
48615fb4814Smrg        cmdreg |= CMD_COLOR_16;
48715fb4814Smrg        break;
48815fb4814Smrg    case 24:
48915fb4814Smrg    case 32:
49015fb4814Smrg        cmdreg |= CMD_COLOR_32;
49115fb4814Smrg        break;
49215fb4814Smrg    }
49315fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
49415fb4814Smrg    pAST->ulCMDReg = cmdreg;
49515fb4814Smrg
49615fb4814Smrg    if (!pAST->MMIO2D)
49715fb4814Smrg    {
49815fb4814Smrg        /* Write to CMDQ */
49915fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
50015fb4814Smrg
50115fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
50215fb4814Smrg        pSingleCMD++;
503de78e416Smrg        ASTSetupFG(pSingleCMD, color);
504de78e416Smrg
505de78e416Smrg        /* Update Write Pointer */
506de78e416Smrg        mUpdateWritePointer;
507de78e416Smrg
50815fb4814Smrg    }
50915fb4814Smrg    else
51015fb4814Smrg    {
51115fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
51215fb4814Smrg        ASTSetupFG_MMIO(color);
51315fb4814Smrg    }
51415fb4814Smrg
51515fb4814Smrg} /* end of ASTSetupForSolidFill */
51615fb4814Smrg
51715fb4814Smrg
51815fb4814Smrgstatic void
51915fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
52015fb4814Smrg                           int dst_x, int dst_y, int width, int height)
52115fb4814Smrg{
52215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
52315fb4814Smrg    PKT_SC *pSingleCMD;
524de78e416Smrg    ULONG dstbase, cmdreg;
525de78e416Smrg    int delta_y = 0;
526de78e416Smrg
52715fb4814Smrg/*
52815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n");
52915fb4814Smrg*/
53015fb4814Smrg
531de78e416Smrg    if ((width != 0) && (height != 0))
532de78e416Smrg    {
533de78e416Smrg        /* Modify Reg. Value */
534de78e416Smrg        cmdreg = pAST->ulCMDReg;
535de78e416Smrg        if (pAST->EnableClip)
536de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
537de78e416Smrg        else
538de78e416Smrg            cmdreg &= ~CMD_ENABLE_CLIP;
539de78e416Smrg        dstbase = 0;
540de78e416Smrg
541de78e416Smrg        if (dst_y >= pScrn->virtualY)
542de78e416Smrg        {
543de78e416Smrg            delta_y = dst_y;
544de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
545de78e416Smrg            dst_y=0;
546de78e416Smrg        }
54715fb4814Smrg
548de78e416Smrg        if (pAST->EnableClip)
549de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
550de78e416Smrg
551de78e416Smrg        if (!pAST->MMIO2D)
552de78e416Smrg        {
553de78e416Smrg            /* Write to CMDQ */
554de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
555de78e416Smrg
556de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
557de78e416Smrg            pSingleCMD++;
558de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
559de78e416Smrg            pSingleCMD++;
560de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
561de78e416Smrg            pSingleCMD++;
562de78e416Smrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
563de78e416Smrg
564de78e416Smrg            /* Update Write Pointer */
565de78e416Smrg            mUpdateWritePointer;
566de78e416Smrg
567de78e416Smrg        }
568de78e416Smrg        else
569de78e416Smrg        {
570de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
571de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
572de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
573de78e416Smrg            ASTSetupCMDReg_MMIO(cmdreg);
574de78e416Smrg
575de78e416Smrg            vWaitEngIdle(pScrn, pAST);
576de78e416Smrg
577de78e416Smrg        }
578de78e416Smrg
579de78e416Smrg    } /* width & height check */
58015fb4814Smrg
58115fb4814Smrg
58215fb4814Smrg} /* end of ASTSubsequentSolidFillRect */
58315fb4814Smrg
58415fb4814Smrg/* Line */
58515fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
58615fb4814Smrg                                 int color, int rop, unsigned int planemask)
58715fb4814Smrg{
58815fb4814Smrg
58915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
59015fb4814Smrg    PKT_SC *pSingleCMD;
59115fb4814Smrg    ULONG  cmdreg;
59215fb4814Smrg/*
59315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n");
59415fb4814Smrg*/
59515fb4814Smrg    /* Modify Reg. Value */
59615fb4814Smrg    cmdreg = CMD_BITBLT;
59715fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
59815fb4814Smrg    {
59915fb4814Smrg    case 8:
60015fb4814Smrg        cmdreg |= CMD_COLOR_08;
60115fb4814Smrg        break;
60215fb4814Smrg    case 15:
60315fb4814Smrg    case 16:
60415fb4814Smrg        cmdreg |= CMD_COLOR_16;
60515fb4814Smrg        break;
60615fb4814Smrg    case 24:
60715fb4814Smrg    case 32:
60815fb4814Smrg        cmdreg |= CMD_COLOR_32;
60915fb4814Smrg        break;
61015fb4814Smrg    }
61115fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
61215fb4814Smrg    pAST->ulCMDReg = cmdreg;
61315fb4814Smrg
61415fb4814Smrg    if (!pAST->MMIO2D)
61515fb4814Smrg    {
61615fb4814Smrg        /* Write to CMDQ */
61715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
61815fb4814Smrg
61915fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
62015fb4814Smrg        pSingleCMD++;
62115fb4814Smrg        ASTSetupFG(pSingleCMD, color);
62215fb4814Smrg        pSingleCMD++;
62315fb4814Smrg        ASTSetupBG(pSingleCMD, 0);
62415fb4814Smrg
625de78e416Smrg        /* Update Write Pointer */
626de78e416Smrg        mUpdateWritePointer;
627de78e416Smrg
62815fb4814Smrg    }
62915fb4814Smrg    else
63015fb4814Smrg    {
63115fb4814Smrg        /* Write to MMIO */
63215fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
63315fb4814Smrg        ASTSetupFG_MMIO(color);
63415fb4814Smrg        ASTSetupBG_MMIO(0);
63515fb4814Smrg    }
63615fb4814Smrg
63715fb4814Smrg} /* end of ASTSetupForSolidLine */
63815fb4814Smrg
63915fb4814Smrg
64015fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
64115fb4814Smrg                                          int x, int y, int len, int dir)
64215fb4814Smrg{
64315fb4814Smrg
64415fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
64515fb4814Smrg    PKT_SC *pSingleCMD;
64615fb4814Smrg    ULONG dstbase, cmdreg;
64715fb4814Smrg    int width, height;
648de78e416Smrg    int delta_y = 0;
64915fb4814Smrg/*
65015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n");
65115fb4814Smrg*/
65215fb4814Smrg
653de78e416Smrg    if (len != 0)
654de78e416Smrg    {
655de78e416Smrg        /* Modify Reg. Value */
656de78e416Smrg        cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT;
657de78e416Smrg        if (pAST->EnableClip)
658de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
659de78e416Smrg        else
660de78e416Smrg            cmdreg &= ~CMD_ENABLE_CLIP;
661de78e416Smrg        dstbase = 0;
662de78e416Smrg
663de78e416Smrg        if(dir == DEGREES_0) {			/* horizontal */
664de78e416Smrg            width  = len;
665de78e416Smrg            height = 1;
666de78e416Smrg        } else {					/* vertical */
667de78e416Smrg            width  = 1;
668de78e416Smrg            height = len;
669de78e416Smrg        }
670de78e416Smrg
671de78e416Smrg        if ((y + height) >= pScrn->virtualY)
672de78e416Smrg        {
673de78e416Smrg            delta_y = y;
674de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y;
675de78e416Smrg            y=0;
676de78e416Smrg        }
677de78e416Smrg
678de78e416Smrg        if (pAST->EnableClip)
679de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
680de78e416Smrg
681de78e416Smrg        if (!pAST->MMIO2D)
682de78e416Smrg        {
683de78e416Smrg            /* Write to CMDQ */
684de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
685de78e416Smrg
686de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
687de78e416Smrg            pSingleCMD++;
688de78e416Smrg            ASTSetupDSTXY(pSingleCMD, x, y);
689de78e416Smrg            pSingleCMD++;
690de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
691de78e416Smrg            pSingleCMD++;
692de78e416Smrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
693de78e416Smrg
694de78e416Smrg            /* Update Write Pointer */
695de78e416Smrg            mUpdateWritePointer;
696de78e416Smrg
697de78e416Smrg        }
698de78e416Smrg        else
699de78e416Smrg        {
700de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
701de78e416Smrg            ASTSetupDSTXY_MMIO(x, y);
702de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
703de78e416Smrg            ASTSetupCMDReg_MMIO(cmdreg);
704de78e416Smrg
705de78e416Smrg            vWaitEngIdle(pScrn, pAST);
706de78e416Smrg
707de78e416Smrg        }
708de78e416Smrg
709de78e416Smrg    } /* len check */
71015fb4814Smrg
71115fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */
71215fb4814Smrg
71315fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
71415fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags)
71515fb4814Smrg{
71615fb4814Smrg
71715fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
71815fb4814Smrg    PKT_SC 	*pSingleCMD;
71915fb4814Smrg    LINEPARAM   dsLineParam;
72015fb4814Smrg    _LINEInfo   LineInfo;
72115fb4814Smrg    ULONG 	dstbase, ulCommand;
72215fb4814Smrg    ULONG	miny, maxy;
72315fb4814Smrg    USHORT      usXM;
724de78e416Smrg    int delta_y = 0;
725de78e416Smrg
72615fb4814Smrg/*
72715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
72815fb4814Smrg*/
72915fb4814Smrg
73015fb4814Smrg    /* Modify Reg. Value */
73115fb4814Smrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW;
73215fb4814Smrg    if(flags & OMIT_LAST)
73315fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
73415fb4814Smrg    else
73515fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
73615fb4814Smrg    if (pAST->EnableClip)
73715fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
738de78e416Smrg    else
739de78e416Smrg        ulCommand &= ~CMD_ENABLE_CLIP;
74015fb4814Smrg    dstbase = 0;
74115fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
74215fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
74315fb4814Smrg    if(maxy >= pScrn->virtualY) {
744de78e416Smrg    	delta_y = miny;
74515fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
74615fb4814Smrg        y1 -= miny;
74715fb4814Smrg        y2 -= miny;
74815fb4814Smrg    }
749de78e416Smrg
75015fb4814Smrg    LineInfo.X1 = x1;
75115fb4814Smrg    LineInfo.Y1 = y1;
75215fb4814Smrg    LineInfo.X2 = x2;
75315fb4814Smrg    LineInfo.Y2 = y2;
75415fb4814Smrg
75515fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
75615fb4814Smrg
75715fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
75815fb4814Smrg        ulCommand |= CMD_X_DEC;
75915fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
76015fb4814Smrg        ulCommand |= CMD_Y_DEC;
76115fb4814Smrg
76215fb4814Smrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
763de78e416Smrg
764de78e416Smrg    if (pAST->EnableClip)
765de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
76615fb4814Smrg
76715fb4814Smrg    if (!pAST->MMIO2D)
76815fb4814Smrg    {
76915fb4814Smrg        /* Write to CMDQ */
77015fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
77115fb4814Smrg
77215fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
77315fb4814Smrg        pSingleCMD++;
77415fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
77515fb4814Smrg        pSingleCMD++;
77615fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
77715fb4814Smrg        pSingleCMD++;
77815fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
77915fb4814Smrg        pSingleCMD++;
78015fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
78115fb4814Smrg        pSingleCMD++;
78215fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
78315fb4814Smrg        pSingleCMD++;
78415fb4814Smrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
78515fb4814Smrg
78615fb4814Smrg        /* Update Write Pointer */
78715fb4814Smrg        mUpdateWritePointer;
788de78e416Smrg
789de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
790de78e416Smrg        vWaitEngIdle(pScrn, pAST);
79115fb4814Smrg
79215fb4814Smrg    }
79315fb4814Smrg    else
79415fb4814Smrg    {
79515fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
79615fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
79715fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
79815fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
79915fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
80015fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
80115fb4814Smrg        ASTSetupCMDReg_MMIO(ulCommand);
80215fb4814Smrg
80315fb4814Smrg        vWaitEngIdle(pScrn, pAST);
80415fb4814Smrg
80515fb4814Smrg    }
80615fb4814Smrg
80715fb4814Smrg
80815fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */
80915fb4814Smrg
81015fb4814Smrg/* Dash Line */
81115fb4814Smrgstatic void
81215fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn,
81315fb4814Smrg                      int fg, int bg, int rop, unsigned int planemask,
81415fb4814Smrg                      int length, UCHAR *pattern)
81515fb4814Smrg{
81615fb4814Smrg
81715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
81815fb4814Smrg    PKT_SC *pSingleCMD;
81915fb4814Smrg    ULONG  cmdreg;
82015fb4814Smrg/*
82115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n");
82215fb4814Smrg*/
82315fb4814Smrg    /* Modify Reg. Value */
82415fb4814Smrg    cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE;
82515fb4814Smrg
82615fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
82715fb4814Smrg    {
82815fb4814Smrg    case 8:
82915fb4814Smrg        cmdreg |= CMD_COLOR_08;
83015fb4814Smrg        break;
83115fb4814Smrg    case 15:
83215fb4814Smrg    case 16:
83315fb4814Smrg        cmdreg |= CMD_COLOR_16;
83415fb4814Smrg        break;
83515fb4814Smrg    case 24:
83615fb4814Smrg    case 32:
83715fb4814Smrg        cmdreg |= CMD_COLOR_32;
83815fb4814Smrg        break;
83915fb4814Smrg    }
84015fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
84115fb4814Smrg    if(bg == -1) {
84215fb4814Smrg        cmdreg |= CMD_TRANSPARENT;
84315fb4814Smrg        bg = 0;
84415fb4814Smrg    }
84515fb4814Smrg    cmdreg |= (((length-1) & 0x3F) << 24);		/* line period */
84615fb4814Smrg    pAST->ulCMDReg = cmdreg;
84715fb4814Smrg
84815fb4814Smrg    if (!pAST->MMIO2D)
84915fb4814Smrg    {
85015fb4814Smrg        /* Write to CMDQ */
85115fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
85215fb4814Smrg
85315fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
85415fb4814Smrg        pSingleCMD++;
85515fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
85615fb4814Smrg        pSingleCMD++;
85715fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
85815fb4814Smrg        pSingleCMD++;
85915fb4814Smrg        ASTSetupLineStyle1(pSingleCMD, *pattern);
86015fb4814Smrg        pSingleCMD++;
861de78e416Smrg        ASTSetupLineStyle2(pSingleCMD, *(pattern+4));
862de78e416Smrg
863de78e416Smrg        /* Update Write Pointer */
864de78e416Smrg        mUpdateWritePointer;
86515fb4814Smrg
86615fb4814Smrg    }
86715fb4814Smrg    else
86815fb4814Smrg    {
86915fb4814Smrg        /* Write to MMIO */
87015fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
87115fb4814Smrg        ASTSetupFG_MMIO(fg);
87215fb4814Smrg        ASTSetupBG_MMIO(bg);
87315fb4814Smrg        ASTSetupLineStyle1_MMIO(*pattern);
87415fb4814Smrg        ASTSetupLineStyle2_MMIO(*(pattern+4));
87515fb4814Smrg
87615fb4814Smrg    }
87715fb4814Smrg
87815fb4814Smrg}
87915fb4814Smrg
88015fb4814Smrgstatic void
88115fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
88215fb4814Smrg                                int x1, int y1, int x2, int y2,
88315fb4814Smrg                                int flags, int phase)
88415fb4814Smrg{
88515fb4814Smrg
88615fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
88715fb4814Smrg    PKT_SC 	*pSingleCMD;
88815fb4814Smrg    LINEPARAM   dsLineParam;
88915fb4814Smrg    _LINEInfo   LineInfo;
89015fb4814Smrg    ULONG 	dstbase, ulCommand;
89115fb4814Smrg    ULONG	miny, maxy;
89215fb4814Smrg    USHORT      usXM;
893de78e416Smrg    int delta_y = 0;
894de78e416Smrg
89515fb4814Smrg/*
89615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
89715fb4814Smrg*/
89815fb4814Smrg
89915fb4814Smrg    /* Modify Reg. Value */
90015fb4814Smrg    ulCommand = pAST->ulCMDReg;
90115fb4814Smrg    if(flags & OMIT_LAST)
90215fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
90315fb4814Smrg    else
90415fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
90515fb4814Smrg    if (pAST->EnableClip)
90615fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
907de78e416Smrg    else
908de78e416Smrg        ulCommand &= ~CMD_ENABLE_CLIP;
90915fb4814Smrg    dstbase = 0;
91015fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
91115fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
91215fb4814Smrg    if(maxy >= pScrn->virtualY) {
913de78e416Smrg    	delta_y = miny;
91415fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
91515fb4814Smrg        y1 -= miny;
91615fb4814Smrg        y2 -= miny;
91715fb4814Smrg    }
918de78e416Smrg
91915fb4814Smrg    LineInfo.X1 = x1;
92015fb4814Smrg    LineInfo.Y1 = y1;
92115fb4814Smrg    LineInfo.X2 = x2;
92215fb4814Smrg    LineInfo.Y2 = y2;
92315fb4814Smrg
92415fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
92515fb4814Smrg
92615fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
92715fb4814Smrg        ulCommand |= CMD_X_DEC;
92815fb4814Smrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
92915fb4814Smrg        ulCommand |= CMD_Y_DEC;
93015fb4814Smrg
93115fb4814Smrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
932de78e416Smrg
933de78e416Smrg    if (pAST->EnableClip)
934de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
93515fb4814Smrg
93615fb4814Smrg    if (!pAST->MMIO2D)
93715fb4814Smrg    {
93815fb4814Smrg        /* Write to CMDQ */
93915fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
94015fb4814Smrg
94115fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
94215fb4814Smrg        pSingleCMD++;
94315fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
94415fb4814Smrg        pSingleCMD++;
94515fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
94615fb4814Smrg        pSingleCMD++;
94715fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
94815fb4814Smrg        pSingleCMD++;
94915fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
95015fb4814Smrg        pSingleCMD++;
95115fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
95215fb4814Smrg        pSingleCMD++;
95315fb4814Smrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
95415fb4814Smrg
95515fb4814Smrg        /* Update Write Pointer */
95615fb4814Smrg        mUpdateWritePointer;
957de78e416Smrg
958de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
959de78e416Smrg        vWaitEngIdle(pScrn, pAST);
96015fb4814Smrg
96115fb4814Smrg    }
96215fb4814Smrg    else
96315fb4814Smrg    {
96415fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
96515fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
96615fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
96715fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
96815fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
96915fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
97015fb4814Smrg        ASTSetupCMDReg_MMIO(ulCommand);
97115fb4814Smrg
97215fb4814Smrg        vWaitEngIdle(pScrn, pAST);
97315fb4814Smrg
97415fb4814Smrg    }
97515fb4814Smrg
97615fb4814Smrg}
97715fb4814Smrg
97815fb4814Smrg/* Mono Pattern Fill */
97915fb4814Smrgstatic void
98015fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
98115fb4814Smrg                           int patx, int paty, int fg, int bg,
98215fb4814Smrg                           int rop, unsigned int planemask)
98315fb4814Smrg{
98415fb4814Smrg
98515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
98615fb4814Smrg    PKT_SC *pSingleCMD;
98715fb4814Smrg    ULONG cmdreg;
98815fb4814Smrg
98915fb4814Smrg/*
99015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n");
99115fb4814Smrg*/
99215fb4814Smrg    /* Modify Reg. Value */
99315fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK;
99415fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
99515fb4814Smrg    {
99615fb4814Smrg    case 8:
99715fb4814Smrg        cmdreg |= CMD_COLOR_08;
99815fb4814Smrg        break;
99915fb4814Smrg    case 15:
100015fb4814Smrg    case 16:
100115fb4814Smrg        cmdreg |= CMD_COLOR_16;
100215fb4814Smrg        break;
100315fb4814Smrg    case 24:
100415fb4814Smrg    case 32:
100515fb4814Smrg        cmdreg |= CMD_COLOR_32;
100615fb4814Smrg        break;
100715fb4814Smrg    }
100815fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
100915fb4814Smrg    pAST->ulCMDReg = cmdreg;
101015fb4814Smrg
101115fb4814Smrg    if (!pAST->MMIO2D)
101215fb4814Smrg    {
101315fb4814Smrg        /* Write to CMDQ */
101415fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
101515fb4814Smrg
101615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
101715fb4814Smrg        pSingleCMD++;
101815fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
101915fb4814Smrg        pSingleCMD++;
102015fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
102115fb4814Smrg        pSingleCMD++;
102215fb4814Smrg        ASTSetupMONO1(pSingleCMD, patx);
102315fb4814Smrg        pSingleCMD++;
1024de78e416Smrg        ASTSetupMONO2(pSingleCMD, paty);
1025de78e416Smrg
1026de78e416Smrg        /* Update Write Pointer */
1027de78e416Smrg        mUpdateWritePointer;
1028de78e416Smrg
102915fb4814Smrg    }
103015fb4814Smrg    else
103115fb4814Smrg    {
103215fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
103315fb4814Smrg        ASTSetupFG_MMIO(fg);
103415fb4814Smrg        ASTSetupBG_MMIO(bg);
103515fb4814Smrg        ASTSetupMONO1_MMIO(patx);
103615fb4814Smrg        ASTSetupMONO2_MMIO(paty);
103715fb4814Smrg    }
103815fb4814Smrg
103915fb4814Smrg} /* end of ASTSetupForMonoPatternFill */
104015fb4814Smrg
104115fb4814Smrg
104215fb4814Smrgstatic void
104315fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
104415fb4814Smrg                             int patx, int paty,
104515fb4814Smrg                             int dst_x, int dst_y, int width, int height)
104615fb4814Smrg{
104715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
104815fb4814Smrg    PKT_SC *pSingleCMD;
1049de78e416Smrg    ULONG dstbase, cmdreg;
1050de78e416Smrg    int delta_y = 0;
1051de78e416Smrg
105215fb4814Smrg/*
105315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n");
105415fb4814Smrg*/
105515fb4814Smrg
105615fb4814Smrg    /* Modify Reg. Value */
105715fb4814Smrg    cmdreg = pAST->ulCMDReg;
105815fb4814Smrg    if (pAST->EnableClip)
1059de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1060de78e416Smrg    else
1061de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
106215fb4814Smrg    dstbase = 0;
106315fb4814Smrg
106415fb4814Smrg    if (dst_y >= pScrn->virtualY)
106515fb4814Smrg    {
1066de78e416Smrg    	delta_y = dst_y;
106715fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
106815fb4814Smrg        dst_y=0;
106915fb4814Smrg    }
1070de78e416Smrg
1071de78e416Smrg    if (pAST->EnableClip)
1072de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
1073de78e416Smrg
107415fb4814Smrg    if (!pAST->MMIO2D)
107515fb4814Smrg    {
107615fb4814Smrg        /* Write to CMDQ */
107715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
107815fb4814Smrg
107915fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
108015fb4814Smrg        pSingleCMD++;
108115fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
108215fb4814Smrg        pSingleCMD++;
108315fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
108415fb4814Smrg        pSingleCMD++;
108515fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
108615fb4814Smrg
108715fb4814Smrg        /* Update Write Pointer */
108815fb4814Smrg        mUpdateWritePointer;
108915fb4814Smrg
109015fb4814Smrg    }
109115fb4814Smrg    else
109215fb4814Smrg    {
109315fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
109415fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
109515fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
109615fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
109715fb4814Smrg
109815fb4814Smrg        vWaitEngIdle(pScrn, pAST);
109915fb4814Smrg    }
110015fb4814Smrg
110115fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */
110215fb4814Smrg
110315fb4814Smrgstatic void
110415fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
110515fb4814Smrg			       int rop, unsigned int planemask, int trans_col)
110615fb4814Smrg{
110715fb4814Smrg
110815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
110915fb4814Smrg    PKT_SC *pSingleCMD;
111015fb4814Smrg    ULONG cmdreg;
111115fb4814Smrg    CARD32 *pataddr;
111215fb4814Smrg    ULONG ulPatSize;
111315fb4814Smrg    int i, j, cpp;
111415fb4814Smrg/*
111515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n");
111615fb4814Smrg*/
111715fb4814Smrg    /* Modify Reg. Value */
111815fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_PATREG;
111915fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
112015fb4814Smrg    {
112115fb4814Smrg    case 8:
112215fb4814Smrg        cmdreg |= CMD_COLOR_08;
112315fb4814Smrg        break;
112415fb4814Smrg    case 15:
112515fb4814Smrg    case 16:
112615fb4814Smrg        cmdreg |= CMD_COLOR_16;
112715fb4814Smrg        break;
112815fb4814Smrg    case 24:
112915fb4814Smrg    case 32:
113015fb4814Smrg        cmdreg |= CMD_COLOR_32;
113115fb4814Smrg        break;
113215fb4814Smrg    }
113315fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
113415fb4814Smrg    pAST->ulCMDReg = cmdreg;
113515fb4814Smrg    cpp = (pScrn->bitsPerPixel + 1) / 8;
113615fb4814Smrg    pataddr = (CARD32 *)(pAST->FBVirtualAddr +
1137b534f209Smrg                        (paty * pAST->VideoModeInfo.ScreenPitch) + (patx * cpp));
113815fb4814Smrg    ulPatSize = 8*8*cpp;
113915fb4814Smrg
114015fb4814Smrg    if (!pAST->MMIO2D)
114115fb4814Smrg    {
114215fb4814Smrg        /* Write to CMDQ */
114315fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4));
114415fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
114515fb4814Smrg        pSingleCMD++;
114615fb4814Smrg        for (i=0; i<8; i++)
114715fb4814Smrg        {
114815fb4814Smrg            for (j=0; j<8*cpp/4; j++)
114915fb4814Smrg            {
115015fb4814Smrg                ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++)));
115115fb4814Smrg                pSingleCMD++;
115215fb4814Smrg            }
1153de78e416Smrg        }
1154de78e416Smrg
1155de78e416Smrg        /* Update Write Pointer */
1156de78e416Smrg        mUpdateWritePointer;
1157de78e416Smrg
115815fb4814Smrg    }
115915fb4814Smrg    else
116015fb4814Smrg    {
116115fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
116215fb4814Smrg        for (i=0; i<8; i++)
116315fb4814Smrg        {
116415fb4814Smrg            for (j=0; j<8*cpp/4; j++)
116515fb4814Smrg            {
116615fb4814Smrg                ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++)));
116715fb4814Smrg            }
116815fb4814Smrg        }
116915fb4814Smrg
117015fb4814Smrg    }
117115fb4814Smrg
117215fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */
117315fb4814Smrg
117415fb4814Smrgstatic void
117515fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
117615fb4814Smrg                                     int dst_x, int dst_y, int width, int height)
117715fb4814Smrg{
117815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
117915fb4814Smrg    PKT_SC *pSingleCMD;
1180de78e416Smrg    ULONG dstbase, cmdreg;
1181de78e416Smrg    int delta_y = 0;
1182de78e416Smrg
118315fb4814Smrg/*
118415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n");
118515fb4814Smrg*/
118615fb4814Smrg
118715fb4814Smrg    /* Modify Reg. Value */
118815fb4814Smrg    cmdreg = pAST->ulCMDReg;
118915fb4814Smrg    if (pAST->EnableClip)
1190de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1191de78e416Smrg    else
1192de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
119315fb4814Smrg    dstbase = 0;
119415fb4814Smrg
119515fb4814Smrg    if (dst_y >= pScrn->virtualY)
119615fb4814Smrg    {
1197de78e416Smrg    	delta_y = dst_y;
119815fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
119915fb4814Smrg        dst_y=0;
120015fb4814Smrg    }
1201de78e416Smrg
1202de78e416Smrg    if (pAST->EnableClip)
1203de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
120415fb4814Smrg
120515fb4814Smrg    if (!pAST->MMIO2D)
120615fb4814Smrg    {
120715fb4814Smrg        /* Write to CMDQ */
120815fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
120915fb4814Smrg
121015fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
121115fb4814Smrg        pSingleCMD++;
121215fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
121315fb4814Smrg        pSingleCMD++;
121415fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
121515fb4814Smrg        pSingleCMD++;
121615fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
121715fb4814Smrg
121815fb4814Smrg        /* Update Write Pointer */
121915fb4814Smrg        mUpdateWritePointer;
122015fb4814Smrg
122115fb4814Smrg    }
122215fb4814Smrg    else
122315fb4814Smrg    {
122415fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
122515fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
122615fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
122715fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
122815fb4814Smrg
122915fb4814Smrg        vWaitEngIdle(pScrn, pAST);
123015fb4814Smrg    }
123115fb4814Smrg
123215fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */
123315fb4814Smrg
123415fb4814Smrg/* CPU to Screen Expand */
123515fb4814Smrgstatic void
123615fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
123715fb4814Smrg                                      int fg, int bg,
123815fb4814Smrg                                      int rop, unsigned int planemask)
123915fb4814Smrg{
124015fb4814Smrg
124115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
124215fb4814Smrg    PKT_SC *pSingleCMD;
124315fb4814Smrg    ULONG cmdreg;
124415fb4814Smrg
124515fb4814Smrg/*
124615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n");
124715fb4814Smrg*/
124815fb4814Smrg    /* Modify Reg. Value */
124915fb4814Smrg    cmdreg = CMD_COLOREXP;
125015fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
125115fb4814Smrg    {
125215fb4814Smrg    case 8:
125315fb4814Smrg        cmdreg |= CMD_COLOR_08;
125415fb4814Smrg        break;
125515fb4814Smrg    case 15:
125615fb4814Smrg    case 16:
125715fb4814Smrg        cmdreg |= CMD_COLOR_16;
125815fb4814Smrg        break;
125915fb4814Smrg    case 24:
126015fb4814Smrg    case 32:
126115fb4814Smrg        cmdreg |= CMD_COLOR_32;
126215fb4814Smrg        break;
126315fb4814Smrg    }
126415fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
126515fb4814Smrg    if(bg == -1) {
126615fb4814Smrg        cmdreg |= CMD_FONT_TRANSPARENT;
126715fb4814Smrg        bg = 0;
126815fb4814Smrg    }
126915fb4814Smrg    pAST->ulCMDReg = cmdreg;
127015fb4814Smrg
127115fb4814Smrg    if (!pAST->MMIO2D)
127215fb4814Smrg    {
127315fb4814Smrg        /* Write to CMDQ */
127415fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
127515fb4814Smrg
127615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
127715fb4814Smrg        pSingleCMD++;
127815fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
127915fb4814Smrg        pSingleCMD++;
128015fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
1281de78e416Smrg
1282de78e416Smrg        /* Update Write Pointer */
1283de78e416Smrg        mUpdateWritePointer;
128415fb4814Smrg
128515fb4814Smrg    }
128615fb4814Smrg    else
128715fb4814Smrg    {
128815fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
128915fb4814Smrg        ASTSetupFG_MMIO(fg);
129015fb4814Smrg        ASTSetupBG_MMIO(bg);
129115fb4814Smrg
129215fb4814Smrg    }
129315fb4814Smrg
129415fb4814Smrg}
129515fb4814Smrg
129615fb4814Smrgstatic void
129715fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
129815fb4814Smrg                                        int dst_x, int dst_y,
129915fb4814Smrg                                        int width, int height, int offset)
130015fb4814Smrg{
130115fb4814Smrg
130215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
130315fb4814Smrg    PKT_SC *pSingleCMD;
130415fb4814Smrg    ULONG dstbase, cmdreg;
1305de78e416Smrg    int delta_y = 0;
130615fb4814Smrg
130715fb4814Smrg/*
130815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n");
130915fb4814Smrg*/
131015fb4814Smrg
131115fb4814Smrg    /* Modify Reg. Value */
131215fb4814Smrg    cmdreg = pAST->ulCMDReg;
131315fb4814Smrg    if (pAST->EnableClip)
1314de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1315de78e416Smrg    else
1316de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
131715fb4814Smrg    dstbase = 0;
131815fb4814Smrg
131915fb4814Smrg    if (dst_y >= pScrn->virtualY)
132015fb4814Smrg    {
1321de78e416Smrg    	delta_y = dst_y;
132215fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
132315fb4814Smrg        dst_y=0;
132415fb4814Smrg    }
1325de78e416Smrg
1326de78e416Smrg    if (pAST->EnableClip)
1327de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
1328de78e416Smrg
132915fb4814Smrg    if (!pAST->MMIO2D)
133015fb4814Smrg    {
133115fb4814Smrg        /* Write to CMDQ */
133215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
133315fb4814Smrg
133415fb4814Smrg        ASTSetupSRCPitch(pSingleCMD, ((width+7)/8));
133515fb4814Smrg        pSingleCMD++;
133615fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
133715fb4814Smrg        pSingleCMD++;
133815fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
133915fb4814Smrg        pSingleCMD++;
134015fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
134115fb4814Smrg        pSingleCMD++;
134215fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
134315fb4814Smrg
134415fb4814Smrg        /* Update Write Pointer */
134515fb4814Smrg        mUpdateWritePointer;
134615fb4814Smrg
134715fb4814Smrg    }
134815fb4814Smrg    else
134915fb4814Smrg    {
135015fb4814Smrg        ASTSetupSRCPitch_MMIO((width+7)/8);
135115fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
135215fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
135315fb4814Smrg        ASTSetupSRCXY_MMIO(0, 0);
135415fb4814Smrg
135515fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
135615fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
135715fb4814Smrg
135815fb4814Smrg        vWaitEngIdle(pScrn, pAST);
135915fb4814Smrg
136015fb4814Smrg    }
136115fb4814Smrg
136215fb4814Smrg}
136315fb4814Smrg
136415fb4814Smrg
136515fb4814Smrg/* Screen to Screen Color Expand */
136615fb4814Smrgstatic void
136715fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
136815fb4814Smrg                                         int fg, int bg,
136915fb4814Smrg                                         int rop, unsigned int planemask)
137015fb4814Smrg{
137115fb4814Smrg
137215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
137315fb4814Smrg    PKT_SC *pSingleCMD;
137415fb4814Smrg    ULONG cmdreg;
137515fb4814Smrg
137615fb4814Smrg/*
137715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n");
137815fb4814Smrg*/
137915fb4814Smrg
138015fb4814Smrg    /* Modify Reg. Value */
138115fb4814Smrg    cmdreg = CMD_ENHCOLOREXP;
138215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
138315fb4814Smrg    {
138415fb4814Smrg    case 8:
138515fb4814Smrg        cmdreg |= CMD_COLOR_08;
138615fb4814Smrg        break;
138715fb4814Smrg    case 15:
138815fb4814Smrg    case 16:
138915fb4814Smrg        cmdreg |= CMD_COLOR_16;
139015fb4814Smrg        break;
139115fb4814Smrg    case 24:
139215fb4814Smrg    case 32:
139315fb4814Smrg        cmdreg |= CMD_COLOR_32;
139415fb4814Smrg        break;
139515fb4814Smrg    }
139615fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
139715fb4814Smrg    if(bg == -1) {
139815fb4814Smrg        cmdreg |= CMD_FONT_TRANSPARENT;
139915fb4814Smrg        bg = 0;
140015fb4814Smrg    }
140115fb4814Smrg    pAST->ulCMDReg = cmdreg;
140215fb4814Smrg
140315fb4814Smrg    if (!pAST->MMIO2D)
140415fb4814Smrg    {
140515fb4814Smrg        /* Write to CMDQ */
140615fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
140715fb4814Smrg
140815fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
140915fb4814Smrg        pSingleCMD++;
141015fb4814Smrg        ASTSetupFG(pSingleCMD, fg);
141115fb4814Smrg        pSingleCMD++;
141215fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
1413de78e416Smrg
1414de78e416Smrg        /* Update Write Pointer */
1415de78e416Smrg        mUpdateWritePointer;
141615fb4814Smrg
141715fb4814Smrg    }
141815fb4814Smrg    else
141915fb4814Smrg    {
142015fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
142115fb4814Smrg        ASTSetupFG_MMIO(fg);
142215fb4814Smrg        ASTSetupBG_MMIO(bg);
142315fb4814Smrg
142415fb4814Smrg    }
142515fb4814Smrg
142615fb4814Smrg}
142715fb4814Smrg
142815fb4814Smrg
142915fb4814Smrg
143015fb4814Smrgstatic void
143115fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
143215fb4814Smrg                                           int dst_x, int dst_y, int width, int height,
143315fb4814Smrg                                           int src_x, int src_y, int offset)
143415fb4814Smrg{
143515fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
143615fb4814Smrg    PKT_SC *pSingleCMD;
143715fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
143815fb4814Smrg    USHORT srcpitch;
1439de78e416Smrg    int delta_y = 0;
144015fb4814Smrg
144115fb4814Smrg/*
144215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n");
144315fb4814Smrg*/
144415fb4814Smrg
144515fb4814Smrg    /* Modify Reg. Value */
144615fb4814Smrg    cmdreg = pAST->ulCMDReg;
144715fb4814Smrg    if (pAST->EnableClip)
1448de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1449de78e416Smrg    else
1450de78e416Smrg        cmdreg &= ~CMD_ENABLE_CLIP;
145115fb4814Smrg    dstbase = 0;
145215fb4814Smrg    if (dst_y >= pScrn->virtualY)
145315fb4814Smrg    {
1454de78e416Smrg    	delta_y = dst_y;
145515fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
145615fb4814Smrg        dst_y=0;
145715fb4814Smrg    }
145815fb4814Smrg    srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x;
145915fb4814Smrg    srcpitch = (pScrn->displayWidth+7)/8;
1460de78e416Smrg
1461de78e416Smrg    if (pAST->EnableClip)
1462de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
146315fb4814Smrg
146415fb4814Smrg    if (!pAST->MMIO2D)
146515fb4814Smrg    {
146615fb4814Smrg        /* Write to CMDQ */
146715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
146815fb4814Smrg
146915fb4814Smrg        ASTSetupSRCBase(pSingleCMD, srcbase);
147015fb4814Smrg        pSingleCMD++;
147115fb4814Smrg        ASTSetupSRCPitch(pSingleCMD,srcpitch);
147215fb4814Smrg        pSingleCMD++;
147315fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
147415fb4814Smrg        pSingleCMD++;
147515fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
147615fb4814Smrg        pSingleCMD++;
147715fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
147815fb4814Smrg        pSingleCMD++;
147915fb4814Smrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
148015fb4814Smrg
148115fb4814Smrg        /* Update Write Pointer */
148215fb4814Smrg        mUpdateWritePointer;
148315fb4814Smrg
148415fb4814Smrg    }
148515fb4814Smrg    else
148615fb4814Smrg    {
148715fb4814Smrg        ASTSetupSRCBase_MMIO(srcbase);
148815fb4814Smrg        ASTSetupSRCPitch_MMIO(srcpitch);
148915fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
149015fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
149115fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
149215fb4814Smrg        ASTSetupCMDReg_MMIO(cmdreg);
149315fb4814Smrg
149415fb4814Smrg        vWaitEngIdle(pScrn, pAST);
149515fb4814Smrg
149615fb4814Smrg    }
149715fb4814Smrg
149815fb4814Smrg}
149915fb4814Smrg
150015fb4814Smrg
150115fb4814Smrg/* Clipping */
150215fb4814Smrgstatic void
1503de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y)
150415fb4814Smrg{
150515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
150615fb4814Smrg    PKT_SC *pSingleCMD;
1507de78e416Smrg
150815fb4814Smrg    if (!pAST->MMIO2D)
150915fb4814Smrg    {
151015fb4814Smrg        /* Write to CMDQ */
151115fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
151215fb4814Smrg
1513de78e416Smrg        ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y);
151415fb4814Smrg        pSingleCMD++;
1515de78e416Smrg        ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
1516de78e416Smrg
1517de78e416Smrg        /* Update Write Pointer */
1518de78e416Smrg        mUpdateWritePointer;
1519de78e416Smrg
152015fb4814Smrg    }
152115fb4814Smrg    else
152215fb4814Smrg    {
1523de78e416Smrg        ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y);
1524de78e416Smrg        ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
152515fb4814Smrg    }
1526de78e416Smrg
1527de78e416Smrg}
1528de78e416Smrg
1529de78e416Smrgstatic void
1530de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn,
1531de78e416Smrg                        int left, int top, int right, int bottom)
1532de78e416Smrg{
1533de78e416Smrg
1534de78e416Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
1535de78e416Smrg    PKT_SC *pSingleCMD;
1536de78e416Smrg/*
1537de78e416Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n");
1538de78e416Smrg*/
1539de78e416Smrg    pAST->EnableClip = TRUE;
1540de78e416Smrg
1541de78e416Smrg    pAST->clip_left   = left;
1542de78e416Smrg    pAST->clip_top    = top;
1543de78e416Smrg    pAST->clip_right  = right;
1544de78e416Smrg    pAST->clip_bottom = bottom;
154515fb4814Smrg
154615fb4814Smrg}
154715fb4814Smrg
154815fb4814Smrgstatic void
154915fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn)
155015fb4814Smrg{
155115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
155215fb4814Smrg/*
155315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n");
155415fb4814Smrg*/
155515fb4814Smrg    pAST->EnableClip = FALSE;
155615fb4814Smrg}
155715fb4814Smrg
1558b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1559b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags)
1560b410ddbeSmrg{
1561b410ddbeSmrg
1562b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1563b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1564b410ddbeSmrg    ULONG 	dstbase, ulCommand;
1565b410ddbeSmrg    ULONG	miny, maxy;
1566b410ddbeSmrg/*
1567b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
1568b410ddbeSmrg*/
1569b410ddbeSmrg
1570b410ddbeSmrg    /* Modify Reg. Value */
1571b410ddbeSmrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE;
1572b410ddbeSmrg    if(flags & OMIT_LAST)
1573b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1574b410ddbeSmrg    else
1575b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1576b410ddbeSmrg    if (pAST->EnableClip)
1577b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1578b410ddbeSmrg    else
1579b410ddbeSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1580b410ddbeSmrg    dstbase = 0;
1581b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1582b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1583b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1584b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1585b410ddbeSmrg        y1 -= miny;
1586b410ddbeSmrg        y2 -= miny;
1587b410ddbeSmrg    }
1588b410ddbeSmrg
1589b410ddbeSmrg    if (!pAST->MMIO2D)
1590b410ddbeSmrg    {
1591b410ddbeSmrg        /* Write to CMDQ */
1592b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1593b410ddbeSmrg
1594b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
1595b410ddbeSmrg        pSingleCMD++;
1596b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1597b410ddbeSmrg        pSingleCMD++;
1598b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1599b410ddbeSmrg        pSingleCMD++;
1600b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
1601b410ddbeSmrg        pSingleCMD++;
1602b410ddbeSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
1603b410ddbeSmrg
1604b410ddbeSmrg        /* Update Write Pointer */
1605b410ddbeSmrg        mUpdateWritePointer;
1606b410ddbeSmrg
1607b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1608b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1609b410ddbeSmrg
1610b410ddbeSmrg    }
1611b410ddbeSmrg    else
1612b410ddbeSmrg    {
1613b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1614b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1615b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1616b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1617b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
1618b410ddbeSmrg
1619b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1620b410ddbeSmrg
1621b410ddbeSmrg    }
1622b410ddbeSmrg
1623b410ddbeSmrg
1624b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */
1625b410ddbeSmrg
1626b410ddbeSmrgstatic void
1627b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
1628b410ddbeSmrg                                int x1, int y1, int x2, int y2,
1629b410ddbeSmrg                                int flags, int phase)
1630b410ddbeSmrg{
1631b410ddbeSmrg
1632b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1633b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1634b410ddbeSmrg    ULONG 	dstbase, ulCommand;
1635b410ddbeSmrg    ULONG	miny, maxy;
1636b410ddbeSmrg/*
1637b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
1638b410ddbeSmrg*/
1639b410ddbeSmrg
1640b410ddbeSmrg    /* Modify Reg. Value */
1641b410ddbeSmrg    ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE;
1642b410ddbeSmrg    if(flags & OMIT_LAST)
1643b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1644b410ddbeSmrg    else
1645b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1646b410ddbeSmrg    if (pAST->EnableClip)
1647b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1648b410ddbeSmrg    else
1649b410ddbeSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1650b410ddbeSmrg    dstbase = 0;
1651b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1652b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1653b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1654b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1655b410ddbeSmrg        y1 -= miny;
1656b410ddbeSmrg        y2 -= miny;
1657b410ddbeSmrg    }
1658b410ddbeSmrg
1659b410ddbeSmrg    if (!pAST->MMIO2D)
1660b410ddbeSmrg    {
1661b410ddbeSmrg        /* Write to CMDQ */
1662b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1663b410ddbeSmrg
1664b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
1665b410ddbeSmrg        pSingleCMD++;
1666b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1667b410ddbeSmrg        pSingleCMD++;
1668b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1669b410ddbeSmrg        pSingleCMD++;
1670b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
1671b410ddbeSmrg        pSingleCMD++;
1672b410ddbeSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
1673b410ddbeSmrg
1674b410ddbeSmrg        /* Update Write Pointer */
1675b410ddbeSmrg        mUpdateWritePointer;
1676b410ddbeSmrg
1677b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1678b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1679b410ddbeSmrg
1680b410ddbeSmrg    }
1681b410ddbeSmrg    else
1682b410ddbeSmrg    {
1683b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1684b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1685b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1686b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1687b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
1688b410ddbeSmrg
1689b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
1690b410ddbeSmrg
1691b410ddbeSmrg    }
1692b410ddbeSmrg
1693b410ddbeSmrg}
1694b4d38c65Smrg#endif
1695b410ddbeSmrg
1696b534f209Smrg#ifdef	AstVideo
1697b534f209Smrg/*
1698b534f209Smrg * Video Part
1699b534f209Smrg * by ic_yang
1700b534f209Smrg */
1701b534f209Smrg#include "fourcc.h"
1702b534f209Smrg
1703b534f209Smrgvoid ASTDisplayVideo(ScrnInfoPtr pScrn, ASTPortPrivPtr pPriv, RegionPtr clipBoxes, int id)
1704b534f209Smrg{
1705b534f209Smrg    ASTPtr              pAST = ASTPTR(pScrn);
1706b534f209Smrg    int                 nBoxs;
1707b534f209Smrg    int                 ScaleFactorH, ScaleFactorV;
1708b534f209Smrg    ULONG               InitScaleFactorH, InitScaleFactorV;
1709b534f209Smrg    BURSTSCALECMD       CopyCmd = {0};
1710b534f209Smrg    PBURSTSCALECMD      pCopyCmd = NULL;
1711b534f209Smrg    float               fScaleX = 0, fScaleY = 0;
1712b534f209Smrg    xRectangle          rect;
1713b534f209Smrg    BoxPtr              pBox = NULL;
1714b534f209Smrg    short               lSrcX, lSrcY;
1715b534f209Smrg    ULONG               dwCmd = 0;
1716b534f209Smrg    int                 i;
1717b534f209Smrg
1718b534f209Smrg    pBox = REGION_RECTS(clipBoxes);
1719b534f209Smrg    nBoxs = REGION_NUM_RECTS(clipBoxes);
1720b534f209Smrg
1721b534f209Smrg    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MMIO=%x,pBox=%x, nBoxs=%x\n", pAST->MMIO2D, pBox, nBoxs);
1722b534f209Smrg
1723b534f209Smrg    if(0==pPriv->drw_w || 0==pPriv->drw_h)
1724b534f209Smrg    {
1725b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drwx=%x, drwy=%x\n", pPriv->drw_w, pPriv->drw_h);
1726b534f209Smrg        return;
1727b534f209Smrg    }
1728b534f209Smrg
1729b534f209Smrg    /* calc scaling factor */
1730b534f209Smrg    fScaleX = (float)pPriv->src_w /(float)pPriv->drw_w;
1731b534f209Smrg    fScaleY = (float)pPriv->src_h /(float)pPriv->drw_h;
1732b534f209Smrg
1733b534f209Smrg    if (pPriv->src_w == pPriv->drw_w)
1734b534f209Smrg        ScaleFactorH = 0x8000;
1735b534f209Smrg    else
1736b534f209Smrg        ScaleFactorH = (ULONG)((pPriv->src_w-1)*0x8000)/pPriv->drw_w;
1737b534f209Smrg
1738b534f209Smrg    if (pPriv->src_h == pPriv->drw_h)
1739b534f209Smrg    {
1740b534f209Smrg        ScaleFactorV = 0x8000;
1741b534f209Smrg		dwCmd |= SCALE_EQUAL_VER; /* Setting it save the bandwidtch */
1742b534f209Smrg   	}
1743b534f209Smrg    else
1744b534f209Smrg   	{
1745b534f209Smrg        ScaleFactorV = (ULONG)((pPriv->src_h-1)*0x8000)/pPriv->drw_h;
1746b534f209Smrg    }
1747b534f209Smrg
1748b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1749b534f209Smrg        InitScaleFactorH = 0;
1750b534f209Smrg    else
1751b534f209Smrg        InitScaleFactorH = 0x4000;
1752b534f209Smrg
1753b534f209Smrg    if (pPriv->drw_h >= pPriv->src_h)
1754b534f209Smrg        InitScaleFactorV = 0;
1755b534f209Smrg    else
1756b534f209Smrg        InitScaleFactorV = 0x4000;
1757b534f209Smrg
1758b534f209Smrg    switch(pScrn->bitsPerPixel)
1759b534f209Smrg    {
1760b534f209Smrg    case 32:
1761b534f209Smrg        dwCmd   = CMD_COLOR_32;
1762b534f209Smrg        break;
1763b534f209Smrg    case 16:
1764b534f209Smrg        dwCmd   = CMD_COLOR_16;
1765b534f209Smrg        break;
1766b534f209Smrg    case  8:
1767b534f209Smrg        dwCmd   = CMD_COLOR_08;
1768b534f209Smrg        break;
1769b534f209Smrg    }
1770b534f209Smrg
1771b534f209Smrg    dwCmd |= CMD_TYPE_SCALE;
1772b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1773b534f209Smrg        dwCmd |= SCALE_SEG_NUM_1;
1774b534f209Smrg    else
1775b534f209Smrg        dwCmd |= SCALE_SEG_NUM_2;
1776b534f209Smrg
1777b534f209Smrg    dwCmd |= SCALE_FORMAT_YUV2RGB;
1778b534f209Smrg    switch(id)
1779b534f209Smrg    {
1780b534f209Smrg    case PIXEL_FMT_YUY2:
1781b534f209Smrg        dwCmd |= YUV_FORMAT_YUYV;
1782b534f209Smrg        break;
1783b534f209Smrg    case PIXEL_FMT_UYVY:
1784b534f209Smrg        dwCmd |= YUV_FORMAT_UYVY;
1785b534f209Smrg        break;
1786b534f209Smrg    default:
1787b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Other pix format:%x\n", id);
1788b534f209Smrg        break;
1789b534f209Smrg    }
1790b534f209Smrg
1791b534f209Smrg    for(i = 0; i < nBoxs; i++, pBox++)
1792b534f209Smrg    {
1793b534f209Smrg        rect.x = pBox->x1 - pPriv->drw_x;
1794b534f209Smrg        rect.y = pBox->y1 - pPriv->drw_y;
1795b534f209Smrg        rect.width = pBox->x2 - pBox->x1;
1796b534f209Smrg        rect.height = pBox->y2 - pBox->y1;
1797b534f209Smrg
1798b534f209Smrg        lSrcX = (ULONG)((float)rect.x * fScaleX + pPriv->src_x + 0.5f);
1799b534f209Smrg        lSrcY = (ULONG)((float)rect.y * fScaleY + pPriv->src_y + 0.5f);
1800b534f209Smrg
1801b534f209Smrg        pCopyCmd = (BURSTSCALECMD*)pjRequestCMDQ(pAST, PKT_TYPESCALE_LENGTH);
1802b534f209Smrg
1803b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pCopyCmd=%p, pBox=%x,%x,%x,%x\n", pCopyCmd, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
1804b534f209Smrg
1805b534f209Smrg        CopyCmd.dwHeader0        = (ULONG)  PKT_BURST_CMD_HEADER0 |
1806b534f209Smrg                                             PKT_TYPESCALE_DATALENGTH |
1807b534f209Smrg                                             PKT_TYPESCALE_ADDRSTART  |
1808b534f209Smrg                                             BURST_FORCE_CMD;
1809b534f209Smrg
1810b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CopyCmd.dwHeader0=%x\n", CopyCmd.dwHeader0);
1811b534f209Smrg
1812b534f209Smrg        CopyCmd.dwSrcPitch       = (ULONG)(pPriv->srcPitch << 16);
1813b534f209Smrg
1814b534f209Smrg        CopyCmd.dwDstHeightPitch = (ULONG)  ((pAST->VideoModeInfo.ScreenPitch << 16) | 0xFFFF);
1815b534f209Smrg
1816b534f209Smrg        CopyCmd.dwDstXY          = (ULONG) ((pBox->x1 << 16) | (pBox->y1 & 0xFFFF));
1817b534f209Smrg        CopyCmd.dwSrcXY          = (ULONG) ((lSrcX << 16) | (lSrcY & 0xFFFF));
1818b534f209Smrg        CopyCmd.dwRecHeightWidth = (ULONG) ((rect.width << 16) | rect.height);
1819b534f209Smrg
1820b534f209Smrg        CopyCmd.dwInitScaleFactorH = InitScaleFactorH;
1821b534f209Smrg        CopyCmd.dwInitScaleFactorV = InitScaleFactorV;
1822b534f209Smrg        CopyCmd.dwScaleFactorH   = ScaleFactorH;
1823b534f209Smrg        CopyCmd.dwScaleFactorV   = ScaleFactorV;
1824b534f209Smrg
1825b534f209Smrg        CopyCmd.dwSrcBaseAddr = pPriv->bufAddr[pPriv->currentBuf];
1826b534f209Smrg        CopyCmd.dwDstBaseAddr = 0;
1827b534f209Smrg        CopyCmd.dwCmd = dwCmd;
1828b534f209Smrg        CopyCmd.NullData[0] = 0;    /* for alignment */
1829b534f209Smrg        memcpy(pCopyCmd, &CopyCmd, sizeof(CopyCmd));
1830b534f209Smrg
1831b534f209Smrg        mUpdateWritePointer;
1832b534f209Smrg
1833b534f209Smrg#if 0
1834b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1835b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8000),
1836b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8004),
1837b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8008),
1838b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x800C));
1839b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1840b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8010),
1841b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8014),
1842b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8018),
1843b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x801C));
1844b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1845b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8020),
1846b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8024),
1847b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8028),
1848b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x802C));
1849b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1850b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8030),
1851b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8034),
1852b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8038),
1853b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x803C));
1854b534f209Smrg#endif
1855b534f209Smrg
1856b534f209Smrg    } /* End of for-loop */
1857b534f209Smrg
1858b534f209Smrg} /* ASTDisplayVideo */
1859b534f209Smrg#endif	/* AstVideo */
1860b534f209Smrg
186115fb4814Smrg#endif	/* end of Accel_2D */
1862