ast_accel.c revision 7fe5393c
115fb4814Smrg/*
215fb4814Smrg * Copyright (c) 2005 ASPEED Technology Inc.
315fb4814Smrg *
415fb4814Smrg * Permission to use, copy, modify, distribute, and sell this software and its
515fb4814Smrg * documentation for any purpose is hereby granted without fee, provided that
615fb4814Smrg * the above copyright notice appear in all copies and that both that
715fb4814Smrg * copyright notice and this permission notice appear in supporting
815fb4814Smrg * documentation, and that the name of the authors not be used in
915fb4814Smrg * advertising or publicity pertaining to distribution of the software without
1015fb4814Smrg * specific, written prior permission.  The authors makes no representations
1115fb4814Smrg * about the suitability of this software for any purpose.  It is provided
1215fb4814Smrg * "as is" without express or implied warranty.
1315fb4814Smrg *
1415fb4814Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1515fb4814Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1615fb4814Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1715fb4814Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1815fb4814Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1915fb4814Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2015fb4814Smrg * PERFORMANCE OF THIS SOFTWARE.
2115fb4814Smrg */
2215fb4814Smrg
2315fb4814Smrg#ifdef HAVE_CONFIG_H
2415fb4814Smrg#include <config.h>
2515fb4814Smrg#endif
2615fb4814Smrg#include "xf86.h"
2715fb4814Smrg#include "xf86_OSproc.h"
2815fb4814Smrg#include "xf86cmap.h"
2915fb4814Smrg#include "compiler.h"
3015fb4814Smrg#include "vgaHW.h"
3115fb4814Smrg#include "mipointer.h"
3215fb4814Smrg#include "micmap.h"
3315fb4814Smrg
3415fb4814Smrg#include "fb.h"
3515fb4814Smrg#include "regionstr.h"
3615fb4814Smrg#include "xf86xv.h"
3715fb4814Smrg#include <X11/extensions/Xv.h>
3815fb4814Smrg
3915fb4814Smrg#include "xf86PciInfo.h"
4015fb4814Smrg#include "xf86Pci.h"
4115fb4814Smrg
4215fb4814Smrg/* framebuffer offscreen manager */
4315fb4814Smrg#include "xf86fbman.h"
4415fb4814Smrg
4515fb4814Smrg/* include xaa includes */
46b4d38c65Smrg#ifdef HAVE_XAA_H
4715fb4814Smrg#include "xaa.h"
4815fb4814Smrg#include "xaarop.h"
497fe5393cSmrg#endif
5015fb4814Smrg
5115fb4814Smrg/* H/W cursor support */
5215fb4814Smrg#include "xf86Cursor.h"
5315fb4814Smrg
5415fb4814Smrg/* Driver specific headers */
5515fb4814Smrg#include "ast.h"
5615fb4814Smrg
5715fb4814Smrg#ifdef	Accel_2D
587fe5393cSmrg
597fe5393cSmrg#ifdef HAVE_XAA_H
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);
10815fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn);
1097fe5393cSmrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
11015fb4814Smrg                                          int xdir, int ydir, int rop,
11115fb4814Smrg                                          unsigned int planemask, int trans_color);
11215fb4814Smrgstatic void ASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
1137fe5393cSmrg                                            int y2, int w, int h);
11415fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn,
11515fb4814Smrg                                 int color, int rop, unsigned int planemask);
11615fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
1177fe5393cSmrg                                       int dst_x, int dst_y, int width, int height);
11815fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
11915fb4814Smrg                                 int color, int rop, unsigned int planemask);
12015fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
12115fb4814Smrg                                          int x, int y, int len, int dir);
12215fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1237fe5393cSmrg                                           int x1, int y1, int x2, int y2, int flags);
12415fb4814Smrgstatic void ASTSetupForDashedLine(ScrnInfoPtr pScrn,
12515fb4814Smrg                                  int fg, int bg, int rop, unsigned int planemask,
12615fb4814Smrg                                  int length, UCHAR *pattern);
12715fb4814Smrgstatic void ASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
12815fb4814Smrg                                            int x1, int y1, int x2, int y2,
1297fe5393cSmrg                                            int flags, int phase);
13015fb4814Smrgstatic void ASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
13115fb4814Smrg                                       int patx, int paty, int fg, int bg,
13215fb4814Smrg                                       int rop, unsigned int planemask);
13315fb4814Smrgstatic void ASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
13415fb4814Smrg                                         int patx, int paty,
13515fb4814Smrg                                         int x, int y, int w, int h);
13615fb4814Smrgstatic void ASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
13715fb4814Smrg			                   int rop, unsigned int planemask, int trans_col);
13815fb4814Smrgstatic void ASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
13915fb4814Smrg                                                 int x, int y, int w, int h);
14015fb4814Smrgstatic void ASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
14115fb4814Smrg                                                  int fg, int bg,
14215fb4814Smrg                                                  int rop, unsigned int planemask);
14315fb4814Smrgstatic void ASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
14415fb4814Smrg                                                    int x, int y,
14515fb4814Smrg                                                    int width, int height, int skipleft);
14615fb4814Smrgstatic void ASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14715fb4814Smrg                                                     int fg, int bg,
14815fb4814Smrg                                                     int rop, unsigned int planemask);
14915fb4814Smrgstatic void ASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
15015fb4814Smrg                                                       int x, int y, int width, int height,
15115fb4814Smrg                                                       int src_x, int src_y, int offset);
15215fb4814Smrgstatic void ASTSetClippingRectangle(ScrnInfoPtr pScrn,
15315fb4814Smrg                                    int left, int top, int right, int bottom);
1547fe5393cSmrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn);
155de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y);
15615fb4814Smrg
157b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1587fe5393cSmrg                                           int x1, int y1, int x2, int y2, int flags);
159b410ddbeSmrgstatic void AIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
160b410ddbeSmrg                                            int x1, int y1, int x2, int y2,
161b410ddbeSmrg                                            int flags, int phase);
162b410ddbeSmrg
16315fb4814SmrgBool
16415fb4814SmrgASTAccelInit(ScreenPtr pScreen)
16515fb4814Smrg{
16615fb4814Smrg    XAAInfoRecPtr  infoPtr;
167b4d38c65Smrg    ScrnInfoPtr    pScrn = xf86ScreenToScrn(pScreen);
16815fb4814Smrg    ASTRecPtr      pAST = ASTPTR(pScrn);
16915fb4814Smrg
17015fb4814Smrg    pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec();
17115fb4814Smrg    if (!infoPtr)  return FALSE;
17215fb4814Smrg
17315fb4814Smrg    infoPtr->Flags = LINEAR_FRAMEBUFFER |
17415fb4814Smrg  		     OFFSCREEN_PIXMAPS |
17515fb4814Smrg  		     PIXMAP_CACHE;
17615fb4814Smrg
17715fb4814Smrg    /* Sync */
17815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Sync)
17915fb4814Smrg        infoPtr->Sync = ASTSync;
18015fb4814Smrg
18115fb4814Smrg    /* Screen To Screen copy */
18215fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy)
1837fe5393cSmrg    {
18415fb4814Smrg        infoPtr->SetupForScreenToScreenCopy =  ASTSetupForScreenToScreenCopy;
18515fb4814Smrg        infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy;
18615fb4814Smrg        infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK;
18715fb4814Smrg    }
18815fb4814Smrg
18915fb4814Smrg    /* Solid fill */
19015fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidFill)
1917fe5393cSmrg    {
19215fb4814Smrg        infoPtr->SetupForSolidFill = ASTSetupForSolidFill;
19315fb4814Smrg        infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect;
19415fb4814Smrg        infoPtr->SolidFillFlags = NO_PLANEMASK;
1957fe5393cSmrg    }
1967fe5393cSmrg
19715fb4814Smrg    /* Solid Lines */
19815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidLine)
1997fe5393cSmrg    {
200b534f209Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) )
201b410ddbeSmrg    	{
202b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine;
203b410ddbeSmrg        }
204b410ddbeSmrg        else
205b410ddbeSmrg    	{
206b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine;
207b410ddbeSmrg        }
208b410ddbeSmrg
2097fe5393cSmrg        infoPtr->SetupForSolidLine = ASTSetupForSolidLine;
2107fe5393cSmrg        infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine;
21115fb4814Smrg        infoPtr->SolidLineFlags = NO_PLANEMASK;
21215fb4814Smrg    }
21315fb4814Smrg
21415fb4814Smrg    /* Dashed Lines */
21515fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_DashedLine)
216b410ddbeSmrg    {
217b534f209Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) )
218b410ddbeSmrg        {
219b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine;
220b410ddbeSmrg        }
221b410ddbeSmrg        else
222b410ddbeSmrg        {
223b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine;
2247fe5393cSmrg        }
225b410ddbeSmrg
2267fe5393cSmrg        infoPtr->SetupForDashedLine = ASTSetupForDashedLine;
22715fb4814Smrg        infoPtr->DashPatternMaxLength = 64;
22815fb4814Smrg        infoPtr->DashedLineFlags = NO_PLANEMASK |
22915fb4814Smrg			           LINE_PATTERN_MSBFIRST_LSBJUSTIFIED;
2307fe5393cSmrg    }
23115fb4814Smrg
23215fb4814Smrg    /* 8x8 mono pattern fill */
23315fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill)
2347fe5393cSmrg    {
23515fb4814Smrg        infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill;
23615fb4814Smrg        infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill;
23715fb4814Smrg        infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
23815fb4814Smrg                                           NO_TRANSPARENCY |
23915fb4814Smrg				           HARDWARE_PATTERN_SCREEN_ORIGIN |
24015fb4814Smrg				           HARDWARE_PATTERN_PROGRAMMED_BITS |
24115fb4814Smrg				           BIT_ORDER_IN_BYTE_MSBFIRST;
2427fe5393cSmrg    }
2437fe5393cSmrg
24415fb4814Smrg    /* 8x8 color pattern fill */
24515fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill)
2467fe5393cSmrg    {
24715fb4814Smrg        infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill;
24815fb4814Smrg        infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect;
24915fb4814Smrg        infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
2507fe5393cSmrg					    NO_TRANSPARENCY |
25115fb4814Smrg	 				    HARDWARE_PATTERN_SCREEN_ORIGIN;
2527fe5393cSmrg    }
2537fe5393cSmrg
25415fb4814Smrg    /* CPU To Screen Color Expand */
25515fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand)
2567fe5393cSmrg    {
25715fb4814Smrg        infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill;
25815fb4814Smrg        infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill;
25915fb4814Smrg        infoPtr->ColorExpandRange = MAX_PATReg_Size;
26015fb4814Smrg        infoPtr->ColorExpandBase = MMIOREG_PAT;
26115fb4814Smrg        infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
26215fb4814Smrg	   				           BIT_ORDER_IN_BYTE_MSBFIRST;
2637fe5393cSmrg    }
26415fb4814Smrg
26515fb4814Smrg    /* Screen To Screen Color Expand */
26615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand)
2677fe5393cSmrg    {
26815fb4814Smrg        infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill;
26915fb4814Smrg        infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill;
27015fb4814Smrg        infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK |
27115fb4814Smrg	                                              BIT_ORDER_IN_BYTE_MSBFIRST;
2727fe5393cSmrg    }
2737fe5393cSmrg
27415fb4814Smrg    /* Clipping */
27515fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Clipping)
2767fe5393cSmrg    {
27715fb4814Smrg        infoPtr->SetClippingRectangle = ASTSetClippingRectangle;
27815fb4814Smrg        infoPtr->DisableClipping = ASTDisableClipping;
27915fb4814Smrg        infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY 	|
28015fb4814Smrg                		 HARDWARE_CLIP_MONO_8x8_FILL		|
28115fb4814Smrg                		 HARDWARE_CLIP_COLOR_8x8_FILL	 	|
2827fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE 		|
2837fe5393cSmrg                		 HARDWARE_CLIP_DASHED_LINE 		|
2847fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE;
2857fe5393cSmrg    }
28615fb4814Smrg
28715fb4814Smrg    return(XAAInit(pScreen, infoPtr));
2887fe5393cSmrg
28915fb4814Smrg} /* end of ASTAccelInit */
29015fb4814Smrg
29115fb4814Smrgstatic void
29215fb4814SmrgASTSync(ScrnInfoPtr pScrn)
29315fb4814Smrg{
29415fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
29515fb4814Smrg
29615fb4814Smrg    /* wait engle idle */
29715fb4814Smrg    vWaitEngIdle(pScrn, pAST);
29815fb4814Smrg
29915fb4814Smrg} /* end of ASTSync */
30015fb4814Smrg
30115fb4814Smrg
30215fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
30315fb4814Smrg                                          int xdir, int ydir, int rop,
30415fb4814Smrg                                          unsigned int planemask, int trans_color)
30515fb4814Smrg{
3067fe5393cSmrg
30715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
30815fb4814Smrg    PKT_SC *pSingleCMD;
30915fb4814Smrg    ULONG  cmdreg;
3107fe5393cSmrg
31115fb4814Smrg/*
31215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n");
3137fe5393cSmrg*/
31415fb4814Smrg    /* Modify Reg. Value */
31515fb4814Smrg    cmdreg = CMD_BITBLT;
31615fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
31715fb4814Smrg    {
31815fb4814Smrg    case 8:
31915fb4814Smrg        cmdreg |= CMD_COLOR_08;
32015fb4814Smrg        break;
32115fb4814Smrg    case 15:
32215fb4814Smrg    case 16:
32315fb4814Smrg        cmdreg |= CMD_COLOR_16;
3247fe5393cSmrg        break;
32515fb4814Smrg    case 24:
32615fb4814Smrg    case 32:
32715fb4814Smrg        cmdreg |= CMD_COLOR_32;
3287fe5393cSmrg        break;
32915fb4814Smrg    }
33015fb4814Smrg    cmdreg |= (ASTXAACopyROP[rop] << 8);
33115fb4814Smrg    pAST->ulCMDReg = cmdreg;
3327fe5393cSmrg
33315fb4814Smrg    if (!pAST->MMIO2D)
3347fe5393cSmrg    {
33515fb4814Smrg        /* Write to CMDQ */
33615fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
3377fe5393cSmrg
3387fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch);
33915fb4814Smrg        pSingleCMD++;
34015fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
3417fe5393cSmrg
342de78e416Smrg        /* Update Write Pointer */
343de78e416Smrg        mUpdateWritePointer;
3447fe5393cSmrg
34515fb4814Smrg    }
34615fb4814Smrg    else
34715fb4814Smrg    {
3487fe5393cSmrg        /* Write to MMIO */
3497fe5393cSmrg        ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch);
3507fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
35115fb4814Smrg    }
3527fe5393cSmrg
35315fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */
35415fb4814Smrg
35515fb4814Smrgstatic void
35615fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
35715fb4814Smrg                                int y2, int width, int height)
35815fb4814Smrg{
35915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
36015fb4814Smrg    PKT_SC *pSingleCMD;
36115fb4814Smrg    int src_x, src_y, dst_x, dst_y;
36215fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
363de78e416Smrg    int delta_y = 0;
36415fb4814Smrg/*
36515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n");
36615fb4814Smrg*/
36715fb4814Smrg
368de78e416Smrg    if ((width != 0) && (height != 0))
3697fe5393cSmrg    {
370de78e416Smrg        /* Modify Reg. Value */
371de78e416Smrg        cmdreg = pAST->ulCMDReg;
372de78e416Smrg        if (pAST->EnableClip)
373de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
374de78e416Smrg        else
3757fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
376de78e416Smrg        srcbase = dstbase = 0;
377de78e416Smrg
378de78e416Smrg        if (x1 < x2)
3797fe5393cSmrg            cmdreg |= CMD_X_DEC;
380de78e416Smrg
381de78e416Smrg        if (y1 < y2)
3827fe5393cSmrg            cmdreg |= CMD_Y_DEC;
3837fe5393cSmrg
384de78e416Smrg        if ((y1 + height) >= MAX_SRC_Y)
3857fe5393cSmrg        {
386de78e416Smrg            srcbase=pAST->VideoModeInfo.ScreenPitch*y1;
387de78e416Smrg            y1 = 0;
3887fe5393cSmrg        }
3897fe5393cSmrg
3907fe5393cSmrg        if ((y2 + height) >= pScrn->virtualY)
3917fe5393cSmrg        {
392de78e416Smrg            delta_y = y2;
393de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y2;
394de78e416Smrg            y2 = 0;
395de78e416Smrg        }
3967fe5393cSmrg
397de78e416Smrg        if (cmdreg & CMD_X_DEC)
398de78e416Smrg        {
399de78e416Smrg            src_x = x1 + width - 1;
400de78e416Smrg            dst_x = x2 + width - 1;
401de78e416Smrg        }
402de78e416Smrg        else
403de78e416Smrg        {
404de78e416Smrg            src_x = x1;
4057fe5393cSmrg            dst_x = x2;
406de78e416Smrg        }
4077fe5393cSmrg
408de78e416Smrg        if (cmdreg & CMD_Y_DEC)
4097fe5393cSmrg        {
410de78e416Smrg            src_y = y1 + height - 1;
411de78e416Smrg            dst_y = y2 + height - 1;
412de78e416Smrg        }
413de78e416Smrg        else
414de78e416Smrg        {
415de78e416Smrg            src_y = y1;
4167fe5393cSmrg            dst_y = y2;
417de78e416Smrg        }
4187fe5393cSmrg
4197fe5393cSmrg        if (pAST->EnableClip)
420de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
4217fe5393cSmrg
4227fe5393cSmrg        if (!pAST->MMIO2D)
423de78e416Smrg        {
424de78e416Smrg            /* Write to CMDQ */
425de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
4267fe5393cSmrg
427de78e416Smrg            ASTSetupSRCBase(pSingleCMD, srcbase);
4287fe5393cSmrg            pSingleCMD++;
429de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
4307fe5393cSmrg            pSingleCMD++;
4317fe5393cSmrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
4327fe5393cSmrg            pSingleCMD++;
4337fe5393cSmrg            ASTSetupSRCXY(pSingleCMD, src_x, src_y);
4347fe5393cSmrg            pSingleCMD++;
4357fe5393cSmrg            ASTSetupRECTXY(pSingleCMD, width, height);
4367fe5393cSmrg            pSingleCMD++;
4377fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
4387fe5393cSmrg
439de78e416Smrg            /* Update Write Pointer */
440de78e416Smrg            mUpdateWritePointer;
4417fe5393cSmrg
442de78e416Smrg        }
443de78e416Smrg        else
444de78e416Smrg        {
445de78e416Smrg            ASTSetupSRCBase_MMIO(srcbase);
446de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
4477fe5393cSmrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
4487fe5393cSmrg            ASTSetupSRCXY_MMIO(src_x, src_y);
4497fe5393cSmrg            ASTSetupRECTXY_MMIO(width, height);
4507fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
4517fe5393cSmrg
452de78e416Smrg            vWaitEngIdle(pScrn, pAST);
453de78e416Smrg        }
4547fe5393cSmrg
455de78e416Smrg    } /* width & height check */
45615fb4814Smrg
45715fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */
45815fb4814Smrg
45915fb4814Smrgstatic void
46015fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn,
46115fb4814Smrg                     int color, int rop, unsigned int planemask)
46215fb4814Smrg{
4637fe5393cSmrg
46415fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
46515fb4814Smrg    PKT_SC *pSingleCMD;
46615fb4814Smrg    ULONG cmdreg;
46715fb4814Smrg
4687fe5393cSmrg/*
46915fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n");
4707fe5393cSmrg*/
47115fb4814Smrg    /* Modify Reg. Value */
47215fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR;
47315fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
47415fb4814Smrg    {
47515fb4814Smrg    case 8:
47615fb4814Smrg        cmdreg |= CMD_COLOR_08;
47715fb4814Smrg        break;
47815fb4814Smrg    case 15:
47915fb4814Smrg    case 16:
48015fb4814Smrg        cmdreg |= CMD_COLOR_16;
4817fe5393cSmrg        break;
48215fb4814Smrg    case 24:
48315fb4814Smrg    case 32:
48415fb4814Smrg        cmdreg |= CMD_COLOR_32;
4857fe5393cSmrg        break;
48615fb4814Smrg    }
48715fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
48815fb4814Smrg    pAST->ulCMDReg = cmdreg;
4897fe5393cSmrg
4907fe5393cSmrg    if (!pAST->MMIO2D)
49115fb4814Smrg    {
49215fb4814Smrg        /* Write to CMDQ */
49315fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
49415fb4814Smrg
49515fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
49615fb4814Smrg        pSingleCMD++;
497de78e416Smrg        ASTSetupFG(pSingleCMD, color);
4987fe5393cSmrg
499de78e416Smrg        /* Update Write Pointer */
500de78e416Smrg        mUpdateWritePointer;
5017fe5393cSmrg
50215fb4814Smrg    }
50315fb4814Smrg    else
50415fb4814Smrg    {
50515fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
5067fe5393cSmrg        ASTSetupFG_MMIO(color);
50715fb4814Smrg    }
5087fe5393cSmrg
50915fb4814Smrg} /* end of ASTSetupForSolidFill */
51015fb4814Smrg
51115fb4814Smrg
51215fb4814Smrgstatic void
51315fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
51415fb4814Smrg                           int dst_x, int dst_y, int width, int height)
51515fb4814Smrg{
51615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
51715fb4814Smrg    PKT_SC *pSingleCMD;
5187fe5393cSmrg    ULONG dstbase, cmdreg;
519de78e416Smrg    int delta_y = 0;
5207fe5393cSmrg
5217fe5393cSmrg/*
52215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n");
52315fb4814Smrg*/
52415fb4814Smrg
525de78e416Smrg    if ((width != 0) && (height != 0))
526de78e416Smrg    {
527de78e416Smrg        /* Modify Reg. Value */
528de78e416Smrg        cmdreg = pAST->ulCMDReg;
529de78e416Smrg        if (pAST->EnableClip)
530de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
531de78e416Smrg        else
5327fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
533de78e416Smrg        dstbase = 0;
5347fe5393cSmrg
5357fe5393cSmrg        if (dst_y >= pScrn->virtualY)
536de78e416Smrg        {
5377fe5393cSmrg            delta_y = dst_y;
538de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
539de78e416Smrg            dst_y=0;
540de78e416Smrg        }
54115fb4814Smrg
5427fe5393cSmrg        if (pAST->EnableClip)
543de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
5447fe5393cSmrg
5457fe5393cSmrg        if (!pAST->MMIO2D)
5467fe5393cSmrg        {
5477fe5393cSmrg            /* Write to CMDQ */
548de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
5497fe5393cSmrg
550de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
5517fe5393cSmrg            pSingleCMD++;
552de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
5537fe5393cSmrg            pSingleCMD++;
554de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
5557fe5393cSmrg            pSingleCMD++;
5567fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
5577fe5393cSmrg
558de78e416Smrg            /* Update Write Pointer */
559de78e416Smrg            mUpdateWritePointer;
5607fe5393cSmrg
561de78e416Smrg        }
562de78e416Smrg        else
5637fe5393cSmrg        {
564de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
565de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
566de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
5677fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
5687fe5393cSmrg
569de78e416Smrg            vWaitEngIdle(pScrn, pAST);
5707fe5393cSmrg
571de78e416Smrg        }
5727fe5393cSmrg
573de78e416Smrg    } /* width & height check */
57415fb4814Smrg
57515fb4814Smrg
57615fb4814Smrg} /* end of ASTSubsequentSolidFillRect */
57715fb4814Smrg
57815fb4814Smrg/* Line */
5797fe5393cSmrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
58015fb4814Smrg                                 int color, int rop, unsigned int planemask)
58115fb4814Smrg{
58215fb4814Smrg
58315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
58415fb4814Smrg    PKT_SC *pSingleCMD;
58515fb4814Smrg    ULONG  cmdreg;
58615fb4814Smrg/*
58715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n");
5887fe5393cSmrg*/
58915fb4814Smrg    /* Modify Reg. Value */
59015fb4814Smrg    cmdreg = CMD_BITBLT;
59115fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
59215fb4814Smrg    {
59315fb4814Smrg    case 8:
59415fb4814Smrg        cmdreg |= CMD_COLOR_08;
59515fb4814Smrg        break;
59615fb4814Smrg    case 15:
59715fb4814Smrg    case 16:
59815fb4814Smrg        cmdreg |= CMD_COLOR_16;
5997fe5393cSmrg        break;
60015fb4814Smrg    case 24:
60115fb4814Smrg    case 32:
60215fb4814Smrg        cmdreg |= CMD_COLOR_32;
6037fe5393cSmrg        break;
60415fb4814Smrg    }
6057fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
60615fb4814Smrg    pAST->ulCMDReg = cmdreg;
6077fe5393cSmrg
60815fb4814Smrg    if (!pAST->MMIO2D)
6097fe5393cSmrg    {
61015fb4814Smrg        /* Write to CMDQ */
61115fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
61215fb4814Smrg
61315fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
61415fb4814Smrg        pSingleCMD++;
6157fe5393cSmrg        ASTSetupFG(pSingleCMD, color);
61615fb4814Smrg        pSingleCMD++;
61715fb4814Smrg        ASTSetupBG(pSingleCMD, 0);
6187fe5393cSmrg
619de78e416Smrg        /* Update Write Pointer */
6207fe5393cSmrg        mUpdateWritePointer;
6217fe5393cSmrg
62215fb4814Smrg    }
62315fb4814Smrg    else
62415fb4814Smrg    {
6257fe5393cSmrg        /* Write to MMIO */
6267fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
6277fe5393cSmrg        ASTSetupFG_MMIO(color);
6287fe5393cSmrg        ASTSetupBG_MMIO(0);
62915fb4814Smrg    }
6307fe5393cSmrg
63115fb4814Smrg} /* end of ASTSetupForSolidLine */
63215fb4814Smrg
63315fb4814Smrg
63415fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
63515fb4814Smrg                                          int x, int y, int len, int dir)
63615fb4814Smrg{
63715fb4814Smrg
63815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
63915fb4814Smrg    PKT_SC *pSingleCMD;
6407fe5393cSmrg    ULONG dstbase, cmdreg;
64115fb4814Smrg    int width, height;
642de78e416Smrg    int delta_y = 0;
6437fe5393cSmrg/*
64415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n");
64515fb4814Smrg*/
64615fb4814Smrg
647de78e416Smrg    if (len != 0)
648de78e416Smrg    {
649de78e416Smrg        /* Modify Reg. Value */
650de78e416Smrg        cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT;
651de78e416Smrg        if (pAST->EnableClip)
652de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
653de78e416Smrg        else
6547fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
655de78e416Smrg        dstbase = 0;
6567fe5393cSmrg
657de78e416Smrg        if(dir == DEGREES_0) {			/* horizontal */
658de78e416Smrg            width  = len;
6597fe5393cSmrg            height = 1;
660de78e416Smrg        } else {					/* vertical */
661de78e416Smrg            width  = 1;
6627fe5393cSmrg            height = len;
663de78e416Smrg        }
6647fe5393cSmrg
6657fe5393cSmrg        if ((y + height) >= pScrn->virtualY)
6667fe5393cSmrg        {
6677fe5393cSmrg            delta_y = y;
668de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y;
669de78e416Smrg            y=0;
670de78e416Smrg        }
6717fe5393cSmrg
6727fe5393cSmrg        if (pAST->EnableClip)
673de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
6747fe5393cSmrg
6757fe5393cSmrg        if (!pAST->MMIO2D)
6767fe5393cSmrg        {
6777fe5393cSmrg            /* Write to CMDQ */
678de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
6797fe5393cSmrg
680de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
6817fe5393cSmrg            pSingleCMD++;
682de78e416Smrg            ASTSetupDSTXY(pSingleCMD, x, y);
6837fe5393cSmrg            pSingleCMD++;
684de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
6857fe5393cSmrg            pSingleCMD++;
6867fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
6877fe5393cSmrg
688de78e416Smrg            /* Update Write Pointer */
689de78e416Smrg            mUpdateWritePointer;
6907fe5393cSmrg
691de78e416Smrg        }
692de78e416Smrg        else
6937fe5393cSmrg        {
694de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
695de78e416Smrg            ASTSetupDSTXY_MMIO(x, y);
696de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
6977fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
6987fe5393cSmrg
699de78e416Smrg            vWaitEngIdle(pScrn, pAST);
7007fe5393cSmrg
701de78e416Smrg        }
7027fe5393cSmrg
703de78e416Smrg    } /* len check */
7047fe5393cSmrg
70515fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */
70615fb4814Smrg
70715fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
70815fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags)
70915fb4814Smrg{
7107fe5393cSmrg
71115fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
71215fb4814Smrg    PKT_SC 	*pSingleCMD;
71315fb4814Smrg    LINEPARAM   dsLineParam;
7147fe5393cSmrg    _LINEInfo   LineInfo;
71515fb4814Smrg    ULONG 	dstbase, ulCommand;
7167fe5393cSmrg    ULONG	miny, maxy;
71715fb4814Smrg    USHORT      usXM;
718de78e416Smrg    int delta_y = 0;
7197fe5393cSmrg
72015fb4814Smrg/*
72115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
7227fe5393cSmrg*/
72315fb4814Smrg
72415fb4814Smrg    /* Modify Reg. Value */
72515fb4814Smrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW;
72615fb4814Smrg    if(flags & OMIT_LAST)
72715fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
72815fb4814Smrg    else
72915fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
73015fb4814Smrg    if (pAST->EnableClip)
73115fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
732de78e416Smrg    else
7337fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
73415fb4814Smrg    dstbase = 0;
73515fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
73615fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
73715fb4814Smrg    if(maxy >= pScrn->virtualY) {
738de78e416Smrg    	delta_y = miny;
73915fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
74015fb4814Smrg        y1 -= miny;
74115fb4814Smrg        y2 -= miny;
74215fb4814Smrg    }
7437fe5393cSmrg
74415fb4814Smrg    LineInfo.X1 = x1;
74515fb4814Smrg    LineInfo.Y1 = y1;
74615fb4814Smrg    LineInfo.X2 = x2;
74715fb4814Smrg    LineInfo.Y2 = y2;
7487fe5393cSmrg
74915fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
7507fe5393cSmrg
7517fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
7527fe5393cSmrg        ulCommand |= CMD_X_DEC;
7537fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
7547fe5393cSmrg        ulCommand |= CMD_Y_DEC;
7557fe5393cSmrg
7567fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
7577fe5393cSmrg
7587fe5393cSmrg    if (pAST->EnableClip)
759de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
7607fe5393cSmrg
7617fe5393cSmrg    if (!pAST->MMIO2D)
7627fe5393cSmrg    {
7637fe5393cSmrg        /* Write to CMDQ */
76415fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
76515fb4814Smrg
76615fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
7677fe5393cSmrg        pSingleCMD++;
76815fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
7697fe5393cSmrg        pSingleCMD++;
77015fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
7717fe5393cSmrg        pSingleCMD++;
77215fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
7737fe5393cSmrg        pSingleCMD++;
77415fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
7757fe5393cSmrg        pSingleCMD++;
77615fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
7777fe5393cSmrg        pSingleCMD++;
7787fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
7797fe5393cSmrg
78015fb4814Smrg        /* Update Write Pointer */
7817fe5393cSmrg        mUpdateWritePointer;
782de78e416Smrg
783de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
784de78e416Smrg        vWaitEngIdle(pScrn, pAST);
7857fe5393cSmrg
78615fb4814Smrg    }
78715fb4814Smrg    else
7887fe5393cSmrg    {
78915fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
79015fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
79115fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
79215fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
79315fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
79415fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
7957fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
7967fe5393cSmrg
79715fb4814Smrg        vWaitEngIdle(pScrn, pAST);
7987fe5393cSmrg
79915fb4814Smrg    }
80015fb4814Smrg
8017fe5393cSmrg
80215fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */
80315fb4814Smrg
80415fb4814Smrg/* Dash Line */
80515fb4814Smrgstatic void
80615fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn,
80715fb4814Smrg                      int fg, int bg, int rop, unsigned int planemask,
80815fb4814Smrg                      int length, UCHAR *pattern)
80915fb4814Smrg{
81015fb4814Smrg
81115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
81215fb4814Smrg    PKT_SC *pSingleCMD;
81315fb4814Smrg    ULONG  cmdreg;
81415fb4814Smrg/*
81515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n");
8167fe5393cSmrg*/
81715fb4814Smrg    /* Modify Reg. Value */
81815fb4814Smrg    cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE;
8197fe5393cSmrg
82015fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
82115fb4814Smrg    {
82215fb4814Smrg    case 8:
82315fb4814Smrg        cmdreg |= CMD_COLOR_08;
82415fb4814Smrg        break;
82515fb4814Smrg    case 15:
82615fb4814Smrg    case 16:
82715fb4814Smrg        cmdreg |= CMD_COLOR_16;
8287fe5393cSmrg        break;
82915fb4814Smrg    case 24:
83015fb4814Smrg    case 32:
83115fb4814Smrg        cmdreg |= CMD_COLOR_32;
8327fe5393cSmrg        break;
83315fb4814Smrg    }
8347fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
83515fb4814Smrg    if(bg == -1) {
8367fe5393cSmrg        cmdreg |= CMD_TRANSPARENT;
83715fb4814Smrg        bg = 0;
83815fb4814Smrg    }
83915fb4814Smrg    cmdreg |= (((length-1) & 0x3F) << 24);		/* line period */
84015fb4814Smrg    pAST->ulCMDReg = cmdreg;
8417fe5393cSmrg
84215fb4814Smrg    if (!pAST->MMIO2D)
8437fe5393cSmrg    {
84415fb4814Smrg        /* Write to CMDQ */
84515fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
84615fb4814Smrg
84715fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
84815fb4814Smrg        pSingleCMD++;
8497fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
85015fb4814Smrg        pSingleCMD++;
8517fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
85215fb4814Smrg        pSingleCMD++;
85315fb4814Smrg        ASTSetupLineStyle1(pSingleCMD, *pattern);
85415fb4814Smrg        pSingleCMD++;
855de78e416Smrg        ASTSetupLineStyle2(pSingleCMD, *(pattern+4));
8567fe5393cSmrg
857de78e416Smrg        /* Update Write Pointer */
8587fe5393cSmrg        mUpdateWritePointer;
8597fe5393cSmrg
86015fb4814Smrg    }
86115fb4814Smrg    else
86215fb4814Smrg    {
8637fe5393cSmrg        /* Write to MMIO */
86415fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
8657fe5393cSmrg        ASTSetupFG_MMIO(fg);
8667fe5393cSmrg        ASTSetupBG_MMIO(bg);
86715fb4814Smrg        ASTSetupLineStyle1_MMIO(*pattern);
8687fe5393cSmrg        ASTSetupLineStyle2_MMIO(*(pattern+4));
86915fb4814Smrg
87015fb4814Smrg    }
8717fe5393cSmrg
87215fb4814Smrg}
87315fb4814Smrg
87415fb4814Smrgstatic void
87515fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
87615fb4814Smrg                                int x1, int y1, int x2, int y2,
87715fb4814Smrg                                int flags, int phase)
87815fb4814Smrg{
8797fe5393cSmrg
88015fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
88115fb4814Smrg    PKT_SC 	*pSingleCMD;
88215fb4814Smrg    LINEPARAM   dsLineParam;
8837fe5393cSmrg    _LINEInfo   LineInfo;
8847fe5393cSmrg    ULONG 	dstbase, ulCommand;
8857fe5393cSmrg    ULONG	miny, maxy;
88615fb4814Smrg    USHORT      usXM;
887de78e416Smrg    int delta_y = 0;
8887fe5393cSmrg
88915fb4814Smrg/*
89015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
8917fe5393cSmrg*/
89215fb4814Smrg
89315fb4814Smrg    /* Modify Reg. Value */
89415fb4814Smrg    ulCommand = pAST->ulCMDReg;
89515fb4814Smrg    if(flags & OMIT_LAST)
89615fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
89715fb4814Smrg    else
89815fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
89915fb4814Smrg    if (pAST->EnableClip)
90015fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
901de78e416Smrg    else
9027fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
9037fe5393cSmrg    dstbase = 0;
90415fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
90515fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
90615fb4814Smrg    if(maxy >= pScrn->virtualY) {
907de78e416Smrg    	delta_y = miny;
90815fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
90915fb4814Smrg        y1 -= miny;
91015fb4814Smrg        y2 -= miny;
91115fb4814Smrg    }
9127fe5393cSmrg
91315fb4814Smrg    LineInfo.X1 = x1;
91415fb4814Smrg    LineInfo.Y1 = y1;
91515fb4814Smrg    LineInfo.X2 = x2;
91615fb4814Smrg    LineInfo.Y2 = y2;
9177fe5393cSmrg
91815fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
9197fe5393cSmrg
9207fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
9217fe5393cSmrg        ulCommand |= CMD_X_DEC;
9227fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
9237fe5393cSmrg        ulCommand |= CMD_Y_DEC;
9247fe5393cSmrg
9257fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
9267fe5393cSmrg
9277fe5393cSmrg    if (pAST->EnableClip)
928de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
9297fe5393cSmrg
9307fe5393cSmrg    if (!pAST->MMIO2D)
9317fe5393cSmrg    {
9327fe5393cSmrg        /* Write to CMDQ */
93315fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
93415fb4814Smrg
93515fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
9367fe5393cSmrg        pSingleCMD++;
93715fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
9387fe5393cSmrg        pSingleCMD++;
93915fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
9407fe5393cSmrg        pSingleCMD++;
94115fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
9427fe5393cSmrg        pSingleCMD++;
94315fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
9447fe5393cSmrg        pSingleCMD++;
94515fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
9467fe5393cSmrg        pSingleCMD++;
9477fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
9487fe5393cSmrg
94915fb4814Smrg        /* Update Write Pointer */
95015fb4814Smrg        mUpdateWritePointer;
951de78e416Smrg
952de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
953de78e416Smrg        vWaitEngIdle(pScrn, pAST);
9547fe5393cSmrg
95515fb4814Smrg    }
95615fb4814Smrg    else
9577fe5393cSmrg    {
95815fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
95915fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
96015fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
96115fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
96215fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
96315fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
9647fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
9657fe5393cSmrg
96615fb4814Smrg        vWaitEngIdle(pScrn, pAST);
9677fe5393cSmrg
96815fb4814Smrg    }
9697fe5393cSmrg
97015fb4814Smrg}
97115fb4814Smrg
97215fb4814Smrg/* Mono Pattern Fill */
97315fb4814Smrgstatic void
97415fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
97515fb4814Smrg                           int patx, int paty, int fg, int bg,
97615fb4814Smrg                           int rop, unsigned int planemask)
97715fb4814Smrg{
9787fe5393cSmrg
97915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
98015fb4814Smrg    PKT_SC *pSingleCMD;
98115fb4814Smrg    ULONG cmdreg;
98215fb4814Smrg
9837fe5393cSmrg/*
98415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n");
9857fe5393cSmrg*/
98615fb4814Smrg    /* Modify Reg. Value */
98715fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK;
98815fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
98915fb4814Smrg    {
99015fb4814Smrg    case 8:
99115fb4814Smrg        cmdreg |= CMD_COLOR_08;
99215fb4814Smrg        break;
99315fb4814Smrg    case 15:
99415fb4814Smrg    case 16:
99515fb4814Smrg        cmdreg |= CMD_COLOR_16;
9967fe5393cSmrg        break;
99715fb4814Smrg    case 24:
99815fb4814Smrg    case 32:
99915fb4814Smrg        cmdreg |= CMD_COLOR_32;
10007fe5393cSmrg        break;
100115fb4814Smrg    }
100215fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
100315fb4814Smrg    pAST->ulCMDReg = cmdreg;
10047fe5393cSmrg
10057fe5393cSmrg    if (!pAST->MMIO2D)
100615fb4814Smrg    {
100715fb4814Smrg        /* Write to CMDQ */
100815fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
100915fb4814Smrg
101015fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
101115fb4814Smrg        pSingleCMD++;
10127fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
101315fb4814Smrg        pSingleCMD++;
101415fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
101515fb4814Smrg        pSingleCMD++;
10167fe5393cSmrg        ASTSetupMONO1(pSingleCMD, patx);
101715fb4814Smrg        pSingleCMD++;
1018de78e416Smrg        ASTSetupMONO2(pSingleCMD, paty);
10197fe5393cSmrg
1020de78e416Smrg        /* Update Write Pointer */
1021de78e416Smrg        mUpdateWritePointer;
10227fe5393cSmrg
102315fb4814Smrg    }
102415fb4814Smrg    else
102515fb4814Smrg    {
102615fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
10277fe5393cSmrg        ASTSetupFG_MMIO(fg);
102815fb4814Smrg        ASTSetupBG_MMIO(bg);
10297fe5393cSmrg        ASTSetupMONO1_MMIO(patx);
10307fe5393cSmrg        ASTSetupMONO2_MMIO(paty);
103115fb4814Smrg    }
10327fe5393cSmrg
103315fb4814Smrg} /* end of ASTSetupForMonoPatternFill */
103415fb4814Smrg
10357fe5393cSmrg
103615fb4814Smrgstatic void
103715fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
103815fb4814Smrg                             int patx, int paty,
103915fb4814Smrg                             int dst_x, int dst_y, int width, int height)
104015fb4814Smrg{
104115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
104215fb4814Smrg    PKT_SC *pSingleCMD;
1043de78e416Smrg    ULONG dstbase, cmdreg;
1044de78e416Smrg    int delta_y = 0;
10457fe5393cSmrg
10467fe5393cSmrg/*
104715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n");
10487fe5393cSmrg*/
10497fe5393cSmrg
105015fb4814Smrg    /* Modify Reg. Value */
105115fb4814Smrg    cmdreg = pAST->ulCMDReg;
105215fb4814Smrg    if (pAST->EnableClip)
1053de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1054de78e416Smrg    else
10557fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
105615fb4814Smrg    dstbase = 0;
105715fb4814Smrg
10587fe5393cSmrg    if (dst_y >= pScrn->virtualY)
10597fe5393cSmrg    {
1060de78e416Smrg    	delta_y = dst_y;
106115fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
106215fb4814Smrg        dst_y=0;
106315fb4814Smrg    }
1064de78e416Smrg
10657fe5393cSmrg    if (pAST->EnableClip)
1066de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
10677fe5393cSmrg
10687fe5393cSmrg    if (!pAST->MMIO2D)
10697fe5393cSmrg    {
10707fe5393cSmrg        /* Write to CMDQ */
107115fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
107215fb4814Smrg
107315fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
10747fe5393cSmrg        pSingleCMD++;
107515fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
10767fe5393cSmrg        pSingleCMD++;
107715fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
10787fe5393cSmrg        pSingleCMD++;
10797fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
10807fe5393cSmrg
108115fb4814Smrg        /* Update Write Pointer */
108215fb4814Smrg        mUpdateWritePointer;
10837fe5393cSmrg
108415fb4814Smrg    }
108515fb4814Smrg    else
10867fe5393cSmrg    {
108715fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
108815fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
108915fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
10907fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
10917fe5393cSmrg
10927fe5393cSmrg        vWaitEngIdle(pScrn, pAST);
10937fe5393cSmrg    }
109415fb4814Smrg
109515fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */
109615fb4814Smrg
109715fb4814Smrgstatic void
109815fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
109915fb4814Smrg			       int rop, unsigned int planemask, int trans_col)
110015fb4814Smrg{
11017fe5393cSmrg
110215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
110315fb4814Smrg    PKT_SC *pSingleCMD;
110415fb4814Smrg    ULONG cmdreg;
110515fb4814Smrg    CARD32 *pataddr;
110615fb4814Smrg    ULONG ulPatSize;
110715fb4814Smrg    int i, j, cpp;
11087fe5393cSmrg/*
110915fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n");
11107fe5393cSmrg*/
111115fb4814Smrg    /* Modify Reg. Value */
111215fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_PATREG;
111315fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
111415fb4814Smrg    {
111515fb4814Smrg    case 8:
111615fb4814Smrg        cmdreg |= CMD_COLOR_08;
111715fb4814Smrg        break;
111815fb4814Smrg    case 15:
111915fb4814Smrg    case 16:
112015fb4814Smrg        cmdreg |= CMD_COLOR_16;
11217fe5393cSmrg        break;
112215fb4814Smrg    case 24:
112315fb4814Smrg    case 32:
112415fb4814Smrg        cmdreg |= CMD_COLOR_32;
11257fe5393cSmrg        break;
112615fb4814Smrg    }
112715fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
112815fb4814Smrg    pAST->ulCMDReg = cmdreg;
112915fb4814Smrg    cpp = (pScrn->bitsPerPixel + 1) / 8;
113015fb4814Smrg    pataddr = (CARD32 *)(pAST->FBVirtualAddr +
11317fe5393cSmrg                        (paty * pAST->VideoModeInfo.ScreenPitch) + (patx * cpp));
113215fb4814Smrg    ulPatSize = 8*8*cpp;
11337fe5393cSmrg
11347fe5393cSmrg    if (!pAST->MMIO2D)
113515fb4814Smrg    {
11367fe5393cSmrg        /* Write to CMDQ */
113715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4));
113815fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
113915fb4814Smrg        pSingleCMD++;
114015fb4814Smrg        for (i=0; i<8; i++)
114115fb4814Smrg        {
114215fb4814Smrg            for (j=0; j<8*cpp/4; j++)
114315fb4814Smrg            {
114415fb4814Smrg                ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++)));
11457fe5393cSmrg                pSingleCMD++;
11467fe5393cSmrg            }
1147de78e416Smrg        }
11487fe5393cSmrg
1149de78e416Smrg        /* Update Write Pointer */
1150de78e416Smrg        mUpdateWritePointer;
11517fe5393cSmrg
115215fb4814Smrg    }
115315fb4814Smrg    else
11547fe5393cSmrg    {
115515fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
115615fb4814Smrg        for (i=0; i<8; i++)
115715fb4814Smrg        {
115815fb4814Smrg            for (j=0; j<8*cpp/4; j++)
115915fb4814Smrg            {
116015fb4814Smrg                ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++)));
11617fe5393cSmrg            }
11627fe5393cSmrg        }
11637fe5393cSmrg
116415fb4814Smrg    }
116515fb4814Smrg
116615fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */
11677fe5393cSmrg
116815fb4814Smrgstatic void
116915fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
117015fb4814Smrg                                     int dst_x, int dst_y, int width, int height)
117115fb4814Smrg{
117215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
117315fb4814Smrg    PKT_SC *pSingleCMD;
1174de78e416Smrg    ULONG dstbase, cmdreg;
1175de78e416Smrg    int delta_y = 0;
11767fe5393cSmrg
11777fe5393cSmrg/*
117815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n");
117915fb4814Smrg*/
11807fe5393cSmrg
118115fb4814Smrg    /* Modify Reg. Value */
118215fb4814Smrg    cmdreg = pAST->ulCMDReg;
118315fb4814Smrg    if (pAST->EnableClip)
1184de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1185de78e416Smrg    else
11867fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
118715fb4814Smrg    dstbase = 0;
118815fb4814Smrg
11897fe5393cSmrg    if (dst_y >= pScrn->virtualY)
11907fe5393cSmrg    {
1191de78e416Smrg    	delta_y = dst_y;
119215fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
119315fb4814Smrg        dst_y=0;
119415fb4814Smrg    }
1195de78e416Smrg
11967fe5393cSmrg    if (pAST->EnableClip)
1197de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
11987fe5393cSmrg
11997fe5393cSmrg    if (!pAST->MMIO2D)
12007fe5393cSmrg    {
12017fe5393cSmrg        /* Write to CMDQ */
120215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
120315fb4814Smrg
120415fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
12057fe5393cSmrg        pSingleCMD++;
120615fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
12077fe5393cSmrg        pSingleCMD++;
120815fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
12097fe5393cSmrg        pSingleCMD++;
12107fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
12117fe5393cSmrg
121215fb4814Smrg        /* Update Write Pointer */
121315fb4814Smrg        mUpdateWritePointer;
12147fe5393cSmrg
121515fb4814Smrg    }
121615fb4814Smrg    else
12177fe5393cSmrg    {
121815fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
121915fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
122015fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
12217fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
12227fe5393cSmrg
12237fe5393cSmrg        vWaitEngIdle(pScrn, pAST);
12247fe5393cSmrg    }
12257fe5393cSmrg
122615fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */
122715fb4814Smrg
122815fb4814Smrg/* CPU to Screen Expand */
122915fb4814Smrgstatic void
123015fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
123115fb4814Smrg                                      int fg, int bg,
123215fb4814Smrg                                      int rop, unsigned int planemask)
123315fb4814Smrg{
123415fb4814Smrg
123515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
123615fb4814Smrg    PKT_SC *pSingleCMD;
123715fb4814Smrg    ULONG cmdreg;
123815fb4814Smrg
12397fe5393cSmrg/*
124015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n");
12417fe5393cSmrg*/
124215fb4814Smrg    /* Modify Reg. Value */
124315fb4814Smrg    cmdreg = CMD_COLOREXP;
124415fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
124515fb4814Smrg    {
124615fb4814Smrg    case 8:
124715fb4814Smrg        cmdreg |= CMD_COLOR_08;
124815fb4814Smrg        break;
124915fb4814Smrg    case 15:
125015fb4814Smrg    case 16:
125115fb4814Smrg        cmdreg |= CMD_COLOR_16;
12527fe5393cSmrg        break;
125315fb4814Smrg    case 24:
125415fb4814Smrg    case 32:
125515fb4814Smrg        cmdreg |= CMD_COLOR_32;
12567fe5393cSmrg        break;
125715fb4814Smrg    }
125815fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
125915fb4814Smrg    if(bg == -1) {
12607fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
126115fb4814Smrg        bg = 0;
12627fe5393cSmrg    }
126315fb4814Smrg    pAST->ulCMDReg = cmdreg;
12647fe5393cSmrg
12657fe5393cSmrg    if (!pAST->MMIO2D)
126615fb4814Smrg    {
126715fb4814Smrg        /* Write to CMDQ */
126815fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
126915fb4814Smrg
127015fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
127115fb4814Smrg        pSingleCMD++;
12727fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
127315fb4814Smrg        pSingleCMD++;
12747fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1275de78e416Smrg
1276de78e416Smrg        /* Update Write Pointer */
1277de78e416Smrg        mUpdateWritePointer;
12787fe5393cSmrg
127915fb4814Smrg    }
128015fb4814Smrg    else
128115fb4814Smrg    {
128215fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
12837fe5393cSmrg        ASTSetupFG_MMIO(fg);
12847fe5393cSmrg        ASTSetupBG_MMIO(bg);
12857fe5393cSmrg
128615fb4814Smrg    }
12877fe5393cSmrg
128815fb4814Smrg}
12897fe5393cSmrg
129015fb4814Smrgstatic void
129115fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
129215fb4814Smrg                                        int dst_x, int dst_y,
129315fb4814Smrg                                        int width, int height, int offset)
129415fb4814Smrg{
129515fb4814Smrg
129615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
129715fb4814Smrg    PKT_SC *pSingleCMD;
129815fb4814Smrg    ULONG dstbase, cmdreg;
1299de78e416Smrg    int delta_y = 0;
130015fb4814Smrg
13017fe5393cSmrg/*
130215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n");
130315fb4814Smrg*/
13047fe5393cSmrg
130515fb4814Smrg    /* Modify Reg. Value */
130615fb4814Smrg    cmdreg = pAST->ulCMDReg;
130715fb4814Smrg    if (pAST->EnableClip)
1308de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1309de78e416Smrg    else
13107fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
131115fb4814Smrg    dstbase = 0;
131215fb4814Smrg
13137fe5393cSmrg    if (dst_y >= pScrn->virtualY)
13147fe5393cSmrg    {
1315de78e416Smrg    	delta_y = dst_y;
131615fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
131715fb4814Smrg        dst_y=0;
131815fb4814Smrg    }
1319de78e416Smrg
13207fe5393cSmrg    if (pAST->EnableClip)
1321de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
13227fe5393cSmrg
13237fe5393cSmrg    if (!pAST->MMIO2D)
13247fe5393cSmrg    {
13257fe5393cSmrg        /* Write to CMDQ */
132615fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
132715fb4814Smrg
13287fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, ((width+7)/8));
13297fe5393cSmrg        pSingleCMD++;
133015fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
13317fe5393cSmrg        pSingleCMD++;
133215fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
13337fe5393cSmrg        pSingleCMD++;
133415fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
13357fe5393cSmrg        pSingleCMD++;
13367fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
13377fe5393cSmrg
133815fb4814Smrg        /* Update Write Pointer */
133915fb4814Smrg        mUpdateWritePointer;
13407fe5393cSmrg
134115fb4814Smrg    }
134215fb4814Smrg    else
13437fe5393cSmrg    {
13447fe5393cSmrg        ASTSetupSRCPitch_MMIO((width+7)/8);
134515fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
134615fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
134715fb4814Smrg        ASTSetupSRCXY_MMIO(0, 0);
13487fe5393cSmrg
134915fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
13507fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
13517fe5393cSmrg
135215fb4814Smrg        vWaitEngIdle(pScrn, pAST);
13537fe5393cSmrg
135415fb4814Smrg    }
13557fe5393cSmrg
135615fb4814Smrg}
135715fb4814Smrg
135815fb4814Smrg
135915fb4814Smrg/* Screen to Screen Color Expand */
136015fb4814Smrgstatic void
136115fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
136215fb4814Smrg                                         int fg, int bg,
136315fb4814Smrg                                         int rop, unsigned int planemask)
136415fb4814Smrg{
136515fb4814Smrg
136615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
136715fb4814Smrg    PKT_SC *pSingleCMD;
136815fb4814Smrg    ULONG cmdreg;
136915fb4814Smrg
13707fe5393cSmrg/*
137115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n");
137215fb4814Smrg*/
13737fe5393cSmrg
137415fb4814Smrg    /* Modify Reg. Value */
137515fb4814Smrg    cmdreg = CMD_ENHCOLOREXP;
137615fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
137715fb4814Smrg    {
137815fb4814Smrg    case 8:
137915fb4814Smrg        cmdreg |= CMD_COLOR_08;
138015fb4814Smrg        break;
138115fb4814Smrg    case 15:
138215fb4814Smrg    case 16:
138315fb4814Smrg        cmdreg |= CMD_COLOR_16;
13847fe5393cSmrg        break;
138515fb4814Smrg    case 24:
138615fb4814Smrg    case 32:
138715fb4814Smrg        cmdreg |= CMD_COLOR_32;
13887fe5393cSmrg        break;
138915fb4814Smrg    }
139015fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
139115fb4814Smrg    if(bg == -1) {
13927fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
139315fb4814Smrg        bg = 0;
13947fe5393cSmrg    }
139515fb4814Smrg    pAST->ulCMDReg = cmdreg;
13967fe5393cSmrg
13977fe5393cSmrg    if (!pAST->MMIO2D)
139815fb4814Smrg    {
139915fb4814Smrg        /* Write to CMDQ */
140015fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
140115fb4814Smrg
140215fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
140315fb4814Smrg        pSingleCMD++;
14047fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
140515fb4814Smrg        pSingleCMD++;
14067fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1407de78e416Smrg
1408de78e416Smrg        /* Update Write Pointer */
1409de78e416Smrg        mUpdateWritePointer;
14107fe5393cSmrg
141115fb4814Smrg    }
141215fb4814Smrg    else
141315fb4814Smrg    {
141415fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
14157fe5393cSmrg        ASTSetupFG_MMIO(fg);
14167fe5393cSmrg        ASTSetupBG_MMIO(bg);
14177fe5393cSmrg
141815fb4814Smrg    }
14197fe5393cSmrg
142015fb4814Smrg}
142115fb4814Smrg
142215fb4814Smrg
142315fb4814Smrg
142415fb4814Smrgstatic void
142515fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
142615fb4814Smrg                                           int dst_x, int dst_y, int width, int height,
142715fb4814Smrg                                           int src_x, int src_y, int offset)
142815fb4814Smrg{
142915fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
143015fb4814Smrg    PKT_SC *pSingleCMD;
143115fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
143215fb4814Smrg    USHORT srcpitch;
1433de78e416Smrg    int delta_y = 0;
143415fb4814Smrg
14357fe5393cSmrg/*
143615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n");
143715fb4814Smrg*/
14387fe5393cSmrg
143915fb4814Smrg    /* Modify Reg. Value */
144015fb4814Smrg    cmdreg = pAST->ulCMDReg;
144115fb4814Smrg    if (pAST->EnableClip)
1442de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1443de78e416Smrg    else
14447fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
144515fb4814Smrg    dstbase = 0;
14467fe5393cSmrg    if (dst_y >= pScrn->virtualY)
14477fe5393cSmrg    {
1448de78e416Smrg    	delta_y = dst_y;
144915fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
145015fb4814Smrg        dst_y=0;
145115fb4814Smrg    }
14527fe5393cSmrg    srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x;
145315fb4814Smrg    srcpitch = (pScrn->displayWidth+7)/8;
1454de78e416Smrg
14557fe5393cSmrg    if (pAST->EnableClip)
1456de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
14577fe5393cSmrg
14587fe5393cSmrg    if (!pAST->MMIO2D)
14597fe5393cSmrg    {
14607fe5393cSmrg        /* Write to CMDQ */
146115fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
146215fb4814Smrg
146315fb4814Smrg        ASTSetupSRCBase(pSingleCMD, srcbase);
14647fe5393cSmrg        pSingleCMD++;
14657fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD,srcpitch);
14667fe5393cSmrg        pSingleCMD++;
146715fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
14687fe5393cSmrg        pSingleCMD++;
146915fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
14707fe5393cSmrg        pSingleCMD++;
147115fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
14727fe5393cSmrg        pSingleCMD++;
14737fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
14747fe5393cSmrg
147515fb4814Smrg        /* Update Write Pointer */
147615fb4814Smrg        mUpdateWritePointer;
14777fe5393cSmrg
147815fb4814Smrg    }
147915fb4814Smrg    else
14807fe5393cSmrg    {
14817fe5393cSmrg        ASTSetupSRCBase_MMIO(srcbase);
14827fe5393cSmrg        ASTSetupSRCPitch_MMIO(srcpitch);
148315fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
148415fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
148515fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
14867fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
14877fe5393cSmrg
148815fb4814Smrg        vWaitEngIdle(pScrn, pAST);
14897fe5393cSmrg
149015fb4814Smrg    }
14917fe5393cSmrg
149215fb4814Smrg}
149315fb4814Smrg
14947fe5393cSmrg
149515fb4814Smrg/* Clipping */
149615fb4814Smrgstatic void
1497de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y)
149815fb4814Smrg{
149915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
150015fb4814Smrg    PKT_SC *pSingleCMD;
1501de78e416Smrg
15027fe5393cSmrg    if (!pAST->MMIO2D)
150315fb4814Smrg    {
150415fb4814Smrg        /* Write to CMDQ */
150515fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
150615fb4814Smrg
1507de78e416Smrg        ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y);
150815fb4814Smrg        pSingleCMD++;
1509de78e416Smrg        ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
15107fe5393cSmrg
1511de78e416Smrg        /* Update Write Pointer */
1512de78e416Smrg        mUpdateWritePointer;
15137fe5393cSmrg
151415fb4814Smrg    }
151515fb4814Smrg    else
151615fb4814Smrg    {
1517de78e416Smrg        ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y);
15187fe5393cSmrg        ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
151915fb4814Smrg    }
15207fe5393cSmrg
15217fe5393cSmrg}
1522de78e416Smrg
1523de78e416Smrgstatic void
1524de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn,
1525de78e416Smrg                        int left, int top, int right, int bottom)
1526de78e416Smrg{
15277fe5393cSmrg
1528de78e416Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
1529de78e416Smrg    PKT_SC *pSingleCMD;
15307fe5393cSmrg/*
1531de78e416Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n");
15327fe5393cSmrg*/
1533de78e416Smrg    pAST->EnableClip = TRUE;
15347fe5393cSmrg
1535de78e416Smrg    pAST->clip_left   = left;
1536de78e416Smrg    pAST->clip_top    = top;
1537de78e416Smrg    pAST->clip_right  = right;
1538de78e416Smrg    pAST->clip_bottom = bottom;
15397fe5393cSmrg
154015fb4814Smrg}
154115fb4814Smrg
154215fb4814Smrgstatic void
154315fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn)
154415fb4814Smrg{
154515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
15467fe5393cSmrg/*
154715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n");
15487fe5393cSmrg*/
154915fb4814Smrg    pAST->EnableClip = FALSE;
155015fb4814Smrg}
155115fb4814Smrg
1552b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1553b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags)
1554b410ddbeSmrg{
15557fe5393cSmrg
1556b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1557b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1558b410ddbeSmrg    ULONG 	dstbase, ulCommand;
15597fe5393cSmrg    ULONG	miny, maxy;
1560b410ddbeSmrg/*
1561b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
15627fe5393cSmrg*/
1563b410ddbeSmrg
1564b410ddbeSmrg    /* Modify Reg. Value */
1565b410ddbeSmrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE;
1566b410ddbeSmrg    if(flags & OMIT_LAST)
1567b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1568b410ddbeSmrg    else
1569b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1570b410ddbeSmrg    if (pAST->EnableClip)
1571b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1572b410ddbeSmrg    else
15737fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1574b410ddbeSmrg    dstbase = 0;
1575b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1576b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1577b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1578b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1579b410ddbeSmrg        y1 -= miny;
1580b410ddbeSmrg        y2 -= miny;
1581b410ddbeSmrg    }
1582b410ddbeSmrg
15837fe5393cSmrg    if (!pAST->MMIO2D)
15847fe5393cSmrg    {
15857fe5393cSmrg        /* Write to CMDQ */
1586b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1587b410ddbeSmrg
1588b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
15897fe5393cSmrg        pSingleCMD++;
1590b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1591b410ddbeSmrg        pSingleCMD++;
1592b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1593b410ddbeSmrg        pSingleCMD++;
1594b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
15957fe5393cSmrg        pSingleCMD++;
15967fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
15977fe5393cSmrg
1598b410ddbeSmrg        /* Update Write Pointer */
15997fe5393cSmrg        mUpdateWritePointer;
1600b410ddbeSmrg
1601b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1602b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16037fe5393cSmrg
1604b410ddbeSmrg    }
1605b410ddbeSmrg    else
16067fe5393cSmrg    {
1607b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1608b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1609b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1610b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
16117fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16127fe5393cSmrg
1613b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16147fe5393cSmrg
1615b410ddbeSmrg    }
1616b410ddbeSmrg
16177fe5393cSmrg
1618b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */
1619b410ddbeSmrg
1620b410ddbeSmrgstatic void
1621b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
1622b410ddbeSmrg                                int x1, int y1, int x2, int y2,
1623b410ddbeSmrg                                int flags, int phase)
1624b410ddbeSmrg{
16257fe5393cSmrg
1626b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1627b410ddbeSmrg    PKT_SC 	*pSingleCMD;
16287fe5393cSmrg    ULONG 	dstbase, ulCommand;
16297fe5393cSmrg    ULONG	miny, maxy;
1630b410ddbeSmrg/*
1631b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
16327fe5393cSmrg*/
1633b410ddbeSmrg
1634b410ddbeSmrg    /* Modify Reg. Value */
1635b410ddbeSmrg    ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE;
1636b410ddbeSmrg    if(flags & OMIT_LAST)
1637b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1638b410ddbeSmrg    else
1639b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1640b410ddbeSmrg    if (pAST->EnableClip)
1641b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1642b410ddbeSmrg    else
16437fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
16447fe5393cSmrg    dstbase = 0;
1645b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1646b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1647b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1648b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1649b410ddbeSmrg        y1 -= miny;
1650b410ddbeSmrg        y2 -= miny;
1651b410ddbeSmrg    }
1652b410ddbeSmrg
16537fe5393cSmrg    if (!pAST->MMIO2D)
16547fe5393cSmrg    {
16557fe5393cSmrg        /* Write to CMDQ */
1656b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1657b410ddbeSmrg
1658b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
16597fe5393cSmrg        pSingleCMD++;
1660b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1661b410ddbeSmrg        pSingleCMD++;
1662b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1663b410ddbeSmrg        pSingleCMD++;
1664b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
16657fe5393cSmrg        pSingleCMD++;
16667fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
16677fe5393cSmrg
1668b410ddbeSmrg        /* Update Write Pointer */
1669b410ddbeSmrg        mUpdateWritePointer;
1670b410ddbeSmrg
1671b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1672b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16737fe5393cSmrg
1674b410ddbeSmrg    }
1675b410ddbeSmrg    else
16767fe5393cSmrg    {
1677b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1678b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1679b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1680b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1681b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16827fe5393cSmrg
1683b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16847fe5393cSmrg
1685b410ddbeSmrg    }
16867fe5393cSmrg
1687b410ddbeSmrg}
16887fe5393cSmrg#endif	/* HAVE_XAA_H */
1689b410ddbeSmrg
1690b534f209Smrg#ifdef	AstVideo
1691b534f209Smrg/*
1692b534f209Smrg * Video Part
1693b534f209Smrg * by ic_yang
1694b534f209Smrg */
1695b534f209Smrg#include "fourcc.h"
1696b534f209Smrg
1697b534f209Smrgvoid ASTDisplayVideo(ScrnInfoPtr pScrn, ASTPortPrivPtr pPriv, RegionPtr clipBoxes, int id)
1698b534f209Smrg{
1699b534f209Smrg    ASTPtr              pAST = ASTPTR(pScrn);
17007fe5393cSmrg    int                 nBoxs;
1701b534f209Smrg    int                 ScaleFactorH, ScaleFactorV;
1702b534f209Smrg    ULONG               InitScaleFactorH, InitScaleFactorV;
1703b534f209Smrg    BURSTSCALECMD       CopyCmd = {0};
1704b534f209Smrg    PBURSTSCALECMD      pCopyCmd = NULL;
1705b534f209Smrg    float               fScaleX = 0, fScaleY = 0;
1706b534f209Smrg    xRectangle          rect;
1707b534f209Smrg    BoxPtr              pBox = NULL;
1708b534f209Smrg    short               lSrcX, lSrcY;
1709b534f209Smrg    ULONG               dwCmd = 0;
1710b534f209Smrg    int                 i;
17117fe5393cSmrg
1712b534f209Smrg    pBox = REGION_RECTS(clipBoxes);
1713b534f209Smrg    nBoxs = REGION_NUM_RECTS(clipBoxes);
1714b534f209Smrg
1715b534f209Smrg    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MMIO=%x,pBox=%x, nBoxs=%x\n", pAST->MMIO2D, pBox, nBoxs);
17167fe5393cSmrg
1717b534f209Smrg    if(0==pPriv->drw_w || 0==pPriv->drw_h)
1718b534f209Smrg    {
1719b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drwx=%x, drwy=%x\n", pPriv->drw_w, pPriv->drw_h);
1720b534f209Smrg        return;
1721b534f209Smrg    }
1722b534f209Smrg
1723b534f209Smrg    /* calc scaling factor */
1724b534f209Smrg    fScaleX = (float)pPriv->src_w /(float)pPriv->drw_w;
1725b534f209Smrg    fScaleY = (float)pPriv->src_h /(float)pPriv->drw_h;
17267fe5393cSmrg
1727b534f209Smrg    if (pPriv->src_w == pPriv->drw_w)
1728b534f209Smrg        ScaleFactorH = 0x8000;
1729b534f209Smrg    else
1730b534f209Smrg        ScaleFactorH = (ULONG)((pPriv->src_w-1)*0x8000)/pPriv->drw_w;
1731b534f209Smrg
1732b534f209Smrg    if (pPriv->src_h == pPriv->drw_h)
1733b534f209Smrg    {
1734b534f209Smrg        ScaleFactorV = 0x8000;
1735b534f209Smrg		dwCmd |= SCALE_EQUAL_VER; /* Setting it save the bandwidtch */
1736b534f209Smrg   	}
1737b534f209Smrg    else
1738b534f209Smrg   	{
1739b534f209Smrg        ScaleFactorV = (ULONG)((pPriv->src_h-1)*0x8000)/pPriv->drw_h;
1740b534f209Smrg    }
1741b534f209Smrg
1742b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1743b534f209Smrg        InitScaleFactorH = 0;
1744b534f209Smrg    else
1745b534f209Smrg        InitScaleFactorH = 0x4000;
1746b534f209Smrg
1747b534f209Smrg    if (pPriv->drw_h >= pPriv->src_h)
1748b534f209Smrg        InitScaleFactorV = 0;
1749b534f209Smrg    else
1750b534f209Smrg        InitScaleFactorV = 0x4000;
1751b534f209Smrg
17527fe5393cSmrg    switch(pScrn->bitsPerPixel)
1753b534f209Smrg    {
1754b534f209Smrg    case 32:
1755b534f209Smrg        dwCmd   = CMD_COLOR_32;
1756b534f209Smrg        break;
1757b534f209Smrg    case 16:
1758b534f209Smrg        dwCmd   = CMD_COLOR_16;
1759b534f209Smrg        break;
1760b534f209Smrg    case  8:
1761b534f209Smrg        dwCmd   = CMD_COLOR_08;
1762b534f209Smrg        break;
1763b534f209Smrg    }
1764b534f209Smrg
1765b534f209Smrg    dwCmd |= CMD_TYPE_SCALE;
1766b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1767b534f209Smrg        dwCmd |= SCALE_SEG_NUM_1;
1768b534f209Smrg    else
1769b534f209Smrg        dwCmd |= SCALE_SEG_NUM_2;
1770b534f209Smrg
1771b534f209Smrg    dwCmd |= SCALE_FORMAT_YUV2RGB;
1772b534f209Smrg    switch(id)
1773b534f209Smrg    {
1774b534f209Smrg    case PIXEL_FMT_YUY2:
17757fe5393cSmrg        dwCmd |= YUV_FORMAT_YUYV;
1776b534f209Smrg        break;
17777fe5393cSmrg    case PIXEL_FMT_UYVY:
17787fe5393cSmrg        dwCmd |= YUV_FORMAT_UYVY;
1779b534f209Smrg        break;
1780b534f209Smrg    default:
1781b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Other pix format:%x\n", id);
1782b534f209Smrg        break;
1783b534f209Smrg    }
17847fe5393cSmrg
1785b534f209Smrg    for(i = 0; i < nBoxs; i++, pBox++)
1786b534f209Smrg    {
1787b534f209Smrg        rect.x = pBox->x1 - pPriv->drw_x;
1788b534f209Smrg        rect.y = pBox->y1 - pPriv->drw_y;
1789b534f209Smrg        rect.width = pBox->x2 - pBox->x1;
17907fe5393cSmrg        rect.height = pBox->y2 - pBox->y1;
17917fe5393cSmrg
1792b534f209Smrg        lSrcX = (ULONG)((float)rect.x * fScaleX + pPriv->src_x + 0.5f);
1793b534f209Smrg        lSrcY = (ULONG)((float)rect.y * fScaleY + pPriv->src_y + 0.5f);
17947fe5393cSmrg
17957fe5393cSmrg        pCopyCmd = (BURSTSCALECMD*)pjRequestCMDQ(pAST, PKT_TYPESCALE_LENGTH);
17967fe5393cSmrg
17977fe5393cSmrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pCopyCmd=%p, pBox=%x,%x,%x,%x\n", pCopyCmd, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
17987fe5393cSmrg
1799b534f209Smrg        CopyCmd.dwHeader0        = (ULONG)  PKT_BURST_CMD_HEADER0 |
1800b534f209Smrg                                             PKT_TYPESCALE_DATALENGTH |
1801b534f209Smrg                                             PKT_TYPESCALE_ADDRSTART  |
1802b534f209Smrg                                             BURST_FORCE_CMD;
1803b534f209Smrg
1804b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CopyCmd.dwHeader0=%x\n", CopyCmd.dwHeader0);
1805b534f209Smrg
1806b534f209Smrg        CopyCmd.dwSrcPitch       = (ULONG)(pPriv->srcPitch << 16);
18077fe5393cSmrg
1808b534f209Smrg        CopyCmd.dwDstHeightPitch = (ULONG)  ((pAST->VideoModeInfo.ScreenPitch << 16) | 0xFFFF);
18097fe5393cSmrg
18107fe5393cSmrg        CopyCmd.dwDstXY          = (ULONG) ((pBox->x1 << 16) | (pBox->y1 & 0xFFFF));
18117fe5393cSmrg        CopyCmd.dwSrcXY          = (ULONG) ((lSrcX << 16) | (lSrcY & 0xFFFF));
18127fe5393cSmrg        CopyCmd.dwRecHeightWidth = (ULONG) ((rect.width << 16) | rect.height);
18137fe5393cSmrg
1814b534f209Smrg        CopyCmd.dwInitScaleFactorH = InitScaleFactorH;
1815b534f209Smrg        CopyCmd.dwInitScaleFactorV = InitScaleFactorV;
18167fe5393cSmrg        CopyCmd.dwScaleFactorH   = ScaleFactorH;
1817b534f209Smrg        CopyCmd.dwScaleFactorV   = ScaleFactorV;
1818b534f209Smrg
1819b534f209Smrg        CopyCmd.dwSrcBaseAddr = pPriv->bufAddr[pPriv->currentBuf];
1820b534f209Smrg        CopyCmd.dwDstBaseAddr = 0;
1821b534f209Smrg        CopyCmd.dwCmd = dwCmd;
1822b534f209Smrg        CopyCmd.NullData[0] = 0;    /* for alignment */
1823b534f209Smrg        memcpy(pCopyCmd, &CopyCmd, sizeof(CopyCmd));
18247fe5393cSmrg
1825b534f209Smrg        mUpdateWritePointer;
18267fe5393cSmrg
18277fe5393cSmrg#if 0
1828b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1829b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8000),
1830b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8004),
1831b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8008),
1832b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x800C));
1833b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1834b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8010),
1835b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8014),
1836b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8018),
1837b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x801C));
1838b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1839b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8020),
1840b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8024),
1841b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8028),
1842b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x802C));
1843b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1844b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8030),
1845b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8034),
1846b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8038),
1847b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x803C));
1848b534f209Smrg#endif
1849b534f209Smrg
1850b534f209Smrg    } /* End of for-loop */
18517fe5393cSmrg
1852b534f209Smrg} /* ASTDisplayVideo */
1853b534f209Smrg#endif	/* AstVideo */
1854b534f209Smrg
185515fb4814Smrg#endif	/* end of Accel_2D */
1856