ast_accel.c revision 4f73b455
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
574f73b455Smrgextern UCHAR *pjRequestCMDQ(ASTRecPtr pAST, ULONG ulDataLen);
584f73b455Smrg
5915fb4814Smrg#ifdef	Accel_2D
607fe5393cSmrg
617fe5393cSmrg#ifdef HAVE_XAA_H
6215fb4814Smrg/* ROP Translation Table */
6315fb4814Smrgint ASTXAACopyROP[16] =
6415fb4814Smrg{
6515fb4814Smrg   ROP_0,               /* GXclear */
6615fb4814Smrg   ROP_DSa,             /* GXand */
6715fb4814Smrg   ROP_SDna,            /* GXandReverse */
6815fb4814Smrg   ROP_S,               /* GXcopy */
6915fb4814Smrg   ROP_DSna,            /* GXandInverted */
7015fb4814Smrg   ROP_D,               /* GXnoop */
7115fb4814Smrg   ROP_DSx,             /* GXxor */
7215fb4814Smrg   ROP_DSo,             /* GXor */
7315fb4814Smrg   ROP_DSon,            /* GXnor */
7415fb4814Smrg   ROP_DSxn,            /* GXequiv */
7515fb4814Smrg   ROP_Dn,              /* GXinvert*/
7615fb4814Smrg   ROP_SDno,            /* GXorReverse */
7715fb4814Smrg   ROP_Sn,              /* GXcopyInverted */
7815fb4814Smrg   ROP_DSno,            /* GXorInverted */
7915fb4814Smrg   ROP_DSan,            /* GXnand */
8015fb4814Smrg   ROP_1                /* GXset */
8115fb4814Smrg};
8215fb4814Smrg
8315fb4814Smrgint ASTXAAPatternROP[16]=
8415fb4814Smrg{
8515fb4814Smrg   ROP_0,
8615fb4814Smrg   ROP_DPa,
8715fb4814Smrg   ROP_PDna,
8815fb4814Smrg   ROP_P,
8915fb4814Smrg   ROP_DPna,
9015fb4814Smrg   ROP_D,
9115fb4814Smrg   ROP_DPx,
9215fb4814Smrg   ROP_DPo,
9315fb4814Smrg   ROP_DPon,
9415fb4814Smrg   ROP_PDxn,
9515fb4814Smrg   ROP_Dn,
9615fb4814Smrg   ROP_PDno,
9715fb4814Smrg   ROP_Pn,
9815fb4814Smrg   ROP_DPno,
9915fb4814Smrg   ROP_DPan,
10015fb4814Smrg   ROP_1
10115fb4814Smrg};
10215fb4814Smrg
10315fb4814Smrg/* extern function */
10415fb4814Smrgextern void vWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST);
10515fb4814Smrgextern Bool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam);
10615fb4814Smrg
10715fb4814Smrg/* Prototype type declaration */
10815fb4814SmrgBool ASTAccelInit(ScreenPtr pScreen);
10915fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn);
1107fe5393cSmrgstatic 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,
1147fe5393cSmrg                                            int y2, int w, int h);
11515fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn,
11615fb4814Smrg                                 int color, int rop, unsigned int planemask);
11715fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
1187fe5393cSmrg                                       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,
1247fe5393cSmrg                                           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,
1307fe5393cSmrg                                            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);
1557fe5393cSmrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn);
156de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y);
15715fb4814Smrg
158b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1597fe5393cSmrg                                           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);
163b410ddbeSmrg
16415fb4814SmrgBool
16515fb4814SmrgASTAccelInit(ScreenPtr pScreen)
16615fb4814Smrg{
16715fb4814Smrg    XAAInfoRecPtr  infoPtr;
168b4d38c65Smrg    ScrnInfoPtr    pScrn = xf86ScreenToScrn(pScreen);
16915fb4814Smrg    ASTRecPtr      pAST = ASTPTR(pScrn);
17015fb4814Smrg
17115fb4814Smrg    pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec();
17215fb4814Smrg    if (!infoPtr)  return FALSE;
17315fb4814Smrg
17415fb4814Smrg    infoPtr->Flags = LINEAR_FRAMEBUFFER |
17515fb4814Smrg  		     OFFSCREEN_PIXMAPS |
17615fb4814Smrg  		     PIXMAP_CACHE;
17715fb4814Smrg
17815fb4814Smrg    /* Sync */
17915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Sync)
18015fb4814Smrg        infoPtr->Sync = ASTSync;
18115fb4814Smrg
18215fb4814Smrg    /* Screen To Screen copy */
18315fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy)
1847fe5393cSmrg    {
18515fb4814Smrg        infoPtr->SetupForScreenToScreenCopy =  ASTSetupForScreenToScreenCopy;
18615fb4814Smrg        infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy;
18715fb4814Smrg        infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK;
18815fb4814Smrg    }
18915fb4814Smrg
19015fb4814Smrg    /* Solid fill */
19115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidFill)
1927fe5393cSmrg    {
19315fb4814Smrg        infoPtr->SetupForSolidFill = ASTSetupForSolidFill;
19415fb4814Smrg        infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect;
19515fb4814Smrg        infoPtr->SolidFillFlags = NO_PLANEMASK;
1967fe5393cSmrg    }
1977fe5393cSmrg
19815fb4814Smrg    /* Solid Lines */
19915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidLine)
2007fe5393cSmrg    {
201b534f209Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) )
202b410ddbeSmrg    	{
203b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine;
204b410ddbeSmrg        }
205b410ddbeSmrg        else
206b410ddbeSmrg    	{
207b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine;
208b410ddbeSmrg        }
209b410ddbeSmrg
2107fe5393cSmrg        infoPtr->SetupForSolidLine = ASTSetupForSolidLine;
2117fe5393cSmrg        infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine;
21215fb4814Smrg        infoPtr->SolidLineFlags = NO_PLANEMASK;
21315fb4814Smrg    }
21415fb4814Smrg
21515fb4814Smrg    /* Dashed Lines */
21615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_DashedLine)
217b410ddbeSmrg    {
218b534f209Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) )
219b410ddbeSmrg        {
220b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine;
221b410ddbeSmrg        }
222b410ddbeSmrg        else
223b410ddbeSmrg        {
224b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine;
2257fe5393cSmrg        }
226b410ddbeSmrg
2277fe5393cSmrg        infoPtr->SetupForDashedLine = ASTSetupForDashedLine;
22815fb4814Smrg        infoPtr->DashPatternMaxLength = 64;
22915fb4814Smrg        infoPtr->DashedLineFlags = NO_PLANEMASK |
23015fb4814Smrg			           LINE_PATTERN_MSBFIRST_LSBJUSTIFIED;
2317fe5393cSmrg    }
23215fb4814Smrg
23315fb4814Smrg    /* 8x8 mono pattern fill */
23415fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill)
2357fe5393cSmrg    {
23615fb4814Smrg        infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill;
23715fb4814Smrg        infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill;
23815fb4814Smrg        infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
23915fb4814Smrg                                           NO_TRANSPARENCY |
24015fb4814Smrg				           HARDWARE_PATTERN_SCREEN_ORIGIN |
24115fb4814Smrg				           HARDWARE_PATTERN_PROGRAMMED_BITS |
24215fb4814Smrg				           BIT_ORDER_IN_BYTE_MSBFIRST;
2437fe5393cSmrg    }
2447fe5393cSmrg
24515fb4814Smrg    /* 8x8 color pattern fill */
24615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill)
2477fe5393cSmrg    {
24815fb4814Smrg        infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill;
24915fb4814Smrg        infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect;
25015fb4814Smrg        infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
2517fe5393cSmrg					    NO_TRANSPARENCY |
25215fb4814Smrg	 				    HARDWARE_PATTERN_SCREEN_ORIGIN;
2537fe5393cSmrg    }
2547fe5393cSmrg
25515fb4814Smrg    /* CPU To Screen Color Expand */
25615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand)
2577fe5393cSmrg    {
25815fb4814Smrg        infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill;
25915fb4814Smrg        infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill;
26015fb4814Smrg        infoPtr->ColorExpandRange = MAX_PATReg_Size;
26115fb4814Smrg        infoPtr->ColorExpandBase = MMIOREG_PAT;
26215fb4814Smrg        infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
26315fb4814Smrg	   				           BIT_ORDER_IN_BYTE_MSBFIRST;
2647fe5393cSmrg    }
26515fb4814Smrg
26615fb4814Smrg    /* Screen To Screen Color Expand */
26715fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand)
2687fe5393cSmrg    {
26915fb4814Smrg        infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill;
27015fb4814Smrg        infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill;
27115fb4814Smrg        infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK |
27215fb4814Smrg	                                              BIT_ORDER_IN_BYTE_MSBFIRST;
2737fe5393cSmrg    }
2747fe5393cSmrg
27515fb4814Smrg    /* Clipping */
27615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Clipping)
2777fe5393cSmrg    {
27815fb4814Smrg        infoPtr->SetClippingRectangle = ASTSetClippingRectangle;
27915fb4814Smrg        infoPtr->DisableClipping = ASTDisableClipping;
28015fb4814Smrg        infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY 	|
28115fb4814Smrg                		 HARDWARE_CLIP_MONO_8x8_FILL		|
28215fb4814Smrg                		 HARDWARE_CLIP_COLOR_8x8_FILL	 	|
2837fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE 		|
2847fe5393cSmrg                		 HARDWARE_CLIP_DASHED_LINE 		|
2857fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE;
2867fe5393cSmrg    }
28715fb4814Smrg
28815fb4814Smrg    return(XAAInit(pScreen, infoPtr));
2897fe5393cSmrg
29015fb4814Smrg} /* end of ASTAccelInit */
29115fb4814Smrg
29215fb4814Smrgstatic void
29315fb4814SmrgASTSync(ScrnInfoPtr pScrn)
29415fb4814Smrg{
29515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
29615fb4814Smrg
29715fb4814Smrg    /* wait engle idle */
29815fb4814Smrg    vWaitEngIdle(pScrn, pAST);
29915fb4814Smrg
30015fb4814Smrg} /* end of ASTSync */
30115fb4814Smrg
30215fb4814Smrg
30315fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
30415fb4814Smrg                                          int xdir, int ydir, int rop,
30515fb4814Smrg                                          unsigned int planemask, int trans_color)
30615fb4814Smrg{
3077fe5393cSmrg
30815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
30915fb4814Smrg    PKT_SC *pSingleCMD;
31015fb4814Smrg    ULONG  cmdreg;
3117fe5393cSmrg
31215fb4814Smrg/*
31315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n");
3147fe5393cSmrg*/
31515fb4814Smrg    /* Modify Reg. Value */
31615fb4814Smrg    cmdreg = CMD_BITBLT;
31715fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
31815fb4814Smrg    {
31915fb4814Smrg    case 8:
32015fb4814Smrg        cmdreg |= CMD_COLOR_08;
32115fb4814Smrg        break;
32215fb4814Smrg    case 15:
32315fb4814Smrg    case 16:
32415fb4814Smrg        cmdreg |= CMD_COLOR_16;
3257fe5393cSmrg        break;
32615fb4814Smrg    case 24:
32715fb4814Smrg    case 32:
32815fb4814Smrg        cmdreg |= CMD_COLOR_32;
3297fe5393cSmrg        break;
33015fb4814Smrg    }
33115fb4814Smrg    cmdreg |= (ASTXAACopyROP[rop] << 8);
33215fb4814Smrg    pAST->ulCMDReg = cmdreg;
3337fe5393cSmrg
33415fb4814Smrg    if (!pAST->MMIO2D)
3357fe5393cSmrg    {
33615fb4814Smrg        /* Write to CMDQ */
33715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
3387fe5393cSmrg
3397fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch);
34015fb4814Smrg        pSingleCMD++;
34115fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
3427fe5393cSmrg
343de78e416Smrg        /* Update Write Pointer */
344de78e416Smrg        mUpdateWritePointer;
3457fe5393cSmrg
34615fb4814Smrg    }
34715fb4814Smrg    else
34815fb4814Smrg    {
3497fe5393cSmrg        /* Write to MMIO */
3507fe5393cSmrg        ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch);
3517fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
35215fb4814Smrg    }
3537fe5393cSmrg
35415fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */
35515fb4814Smrg
35615fb4814Smrgstatic void
35715fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
35815fb4814Smrg                                int y2, int width, int height)
35915fb4814Smrg{
36015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
36115fb4814Smrg    PKT_SC *pSingleCMD;
36215fb4814Smrg    int src_x, src_y, dst_x, dst_y;
36315fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
364de78e416Smrg    int delta_y = 0;
36515fb4814Smrg/*
36615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n");
36715fb4814Smrg*/
36815fb4814Smrg
369de78e416Smrg    if ((width != 0) && (height != 0))
3707fe5393cSmrg    {
371de78e416Smrg        /* Modify Reg. Value */
372de78e416Smrg        cmdreg = pAST->ulCMDReg;
373de78e416Smrg        if (pAST->EnableClip)
374de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
375de78e416Smrg        else
3767fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
377de78e416Smrg        srcbase = dstbase = 0;
378de78e416Smrg
379de78e416Smrg        if (x1 < x2)
3807fe5393cSmrg            cmdreg |= CMD_X_DEC;
381de78e416Smrg
382de78e416Smrg        if (y1 < y2)
3837fe5393cSmrg            cmdreg |= CMD_Y_DEC;
3847fe5393cSmrg
385de78e416Smrg        if ((y1 + height) >= MAX_SRC_Y)
3867fe5393cSmrg        {
387de78e416Smrg            srcbase=pAST->VideoModeInfo.ScreenPitch*y1;
388de78e416Smrg            y1 = 0;
3897fe5393cSmrg        }
3907fe5393cSmrg
3917fe5393cSmrg        if ((y2 + height) >= pScrn->virtualY)
3927fe5393cSmrg        {
393de78e416Smrg            delta_y = y2;
394de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y2;
395de78e416Smrg            y2 = 0;
396de78e416Smrg        }
3977fe5393cSmrg
398de78e416Smrg        if (cmdreg & CMD_X_DEC)
399de78e416Smrg        {
400de78e416Smrg            src_x = x1 + width - 1;
401de78e416Smrg            dst_x = x2 + width - 1;
402de78e416Smrg        }
403de78e416Smrg        else
404de78e416Smrg        {
405de78e416Smrg            src_x = x1;
4067fe5393cSmrg            dst_x = x2;
407de78e416Smrg        }
4087fe5393cSmrg
409de78e416Smrg        if (cmdreg & CMD_Y_DEC)
4107fe5393cSmrg        {
411de78e416Smrg            src_y = y1 + height - 1;
412de78e416Smrg            dst_y = y2 + height - 1;
413de78e416Smrg        }
414de78e416Smrg        else
415de78e416Smrg        {
416de78e416Smrg            src_y = y1;
4177fe5393cSmrg            dst_y = y2;
418de78e416Smrg        }
4197fe5393cSmrg
4207fe5393cSmrg        if (pAST->EnableClip)
421de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
4227fe5393cSmrg
4237fe5393cSmrg        if (!pAST->MMIO2D)
424de78e416Smrg        {
425de78e416Smrg            /* Write to CMDQ */
426de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
4277fe5393cSmrg
428de78e416Smrg            ASTSetupSRCBase(pSingleCMD, srcbase);
4297fe5393cSmrg            pSingleCMD++;
430de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
4317fe5393cSmrg            pSingleCMD++;
4327fe5393cSmrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
4337fe5393cSmrg            pSingleCMD++;
4347fe5393cSmrg            ASTSetupSRCXY(pSingleCMD, src_x, src_y);
4357fe5393cSmrg            pSingleCMD++;
4367fe5393cSmrg            ASTSetupRECTXY(pSingleCMD, width, height);
4377fe5393cSmrg            pSingleCMD++;
4387fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
4397fe5393cSmrg
440de78e416Smrg            /* Update Write Pointer */
441de78e416Smrg            mUpdateWritePointer;
4427fe5393cSmrg
443de78e416Smrg        }
444de78e416Smrg        else
445de78e416Smrg        {
446de78e416Smrg            ASTSetupSRCBase_MMIO(srcbase);
447de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
4487fe5393cSmrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
4497fe5393cSmrg            ASTSetupSRCXY_MMIO(src_x, src_y);
4507fe5393cSmrg            ASTSetupRECTXY_MMIO(width, height);
4517fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
4527fe5393cSmrg
453de78e416Smrg            vWaitEngIdle(pScrn, pAST);
454de78e416Smrg        }
4557fe5393cSmrg
456de78e416Smrg    } /* width & height check */
45715fb4814Smrg
45815fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */
45915fb4814Smrg
46015fb4814Smrgstatic void
46115fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn,
46215fb4814Smrg                     int color, int rop, unsigned int planemask)
46315fb4814Smrg{
4647fe5393cSmrg
46515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
46615fb4814Smrg    PKT_SC *pSingleCMD;
46715fb4814Smrg    ULONG cmdreg;
46815fb4814Smrg
4697fe5393cSmrg/*
47015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n");
4717fe5393cSmrg*/
47215fb4814Smrg    /* Modify Reg. Value */
47315fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR;
47415fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
47515fb4814Smrg    {
47615fb4814Smrg    case 8:
47715fb4814Smrg        cmdreg |= CMD_COLOR_08;
47815fb4814Smrg        break;
47915fb4814Smrg    case 15:
48015fb4814Smrg    case 16:
48115fb4814Smrg        cmdreg |= CMD_COLOR_16;
4827fe5393cSmrg        break;
48315fb4814Smrg    case 24:
48415fb4814Smrg    case 32:
48515fb4814Smrg        cmdreg |= CMD_COLOR_32;
4867fe5393cSmrg        break;
48715fb4814Smrg    }
48815fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
48915fb4814Smrg    pAST->ulCMDReg = cmdreg;
4907fe5393cSmrg
4917fe5393cSmrg    if (!pAST->MMIO2D)
49215fb4814Smrg    {
49315fb4814Smrg        /* Write to CMDQ */
49415fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
49515fb4814Smrg
49615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
49715fb4814Smrg        pSingleCMD++;
498de78e416Smrg        ASTSetupFG(pSingleCMD, color);
4997fe5393cSmrg
500de78e416Smrg        /* Update Write Pointer */
501de78e416Smrg        mUpdateWritePointer;
5027fe5393cSmrg
50315fb4814Smrg    }
50415fb4814Smrg    else
50515fb4814Smrg    {
50615fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
5077fe5393cSmrg        ASTSetupFG_MMIO(color);
50815fb4814Smrg    }
5097fe5393cSmrg
51015fb4814Smrg} /* end of ASTSetupForSolidFill */
51115fb4814Smrg
51215fb4814Smrg
51315fb4814Smrgstatic void
51415fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
51515fb4814Smrg                           int dst_x, int dst_y, int width, int height)
51615fb4814Smrg{
51715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
51815fb4814Smrg    PKT_SC *pSingleCMD;
5197fe5393cSmrg    ULONG dstbase, cmdreg;
520de78e416Smrg    int delta_y = 0;
5217fe5393cSmrg
5227fe5393cSmrg/*
52315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n");
52415fb4814Smrg*/
52515fb4814Smrg
526de78e416Smrg    if ((width != 0) && (height != 0))
527de78e416Smrg    {
528de78e416Smrg        /* Modify Reg. Value */
529de78e416Smrg        cmdreg = pAST->ulCMDReg;
530de78e416Smrg        if (pAST->EnableClip)
531de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
532de78e416Smrg        else
5337fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
534de78e416Smrg        dstbase = 0;
5357fe5393cSmrg
5367fe5393cSmrg        if (dst_y >= pScrn->virtualY)
537de78e416Smrg        {
5387fe5393cSmrg            delta_y = dst_y;
539de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
540de78e416Smrg            dst_y=0;
541de78e416Smrg        }
54215fb4814Smrg
5437fe5393cSmrg        if (pAST->EnableClip)
544de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
5457fe5393cSmrg
5467fe5393cSmrg        if (!pAST->MMIO2D)
5477fe5393cSmrg        {
5487fe5393cSmrg            /* Write to CMDQ */
549de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
5507fe5393cSmrg
551de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
5527fe5393cSmrg            pSingleCMD++;
553de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
5547fe5393cSmrg            pSingleCMD++;
555de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
5567fe5393cSmrg            pSingleCMD++;
5577fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
5587fe5393cSmrg
559de78e416Smrg            /* Update Write Pointer */
560de78e416Smrg            mUpdateWritePointer;
5617fe5393cSmrg
562de78e416Smrg        }
563de78e416Smrg        else
5647fe5393cSmrg        {
565de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
566de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
567de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
5687fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
5697fe5393cSmrg
570de78e416Smrg            vWaitEngIdle(pScrn, pAST);
5717fe5393cSmrg
572de78e416Smrg        }
5737fe5393cSmrg
574de78e416Smrg    } /* width & height check */
57515fb4814Smrg
57615fb4814Smrg
57715fb4814Smrg} /* end of ASTSubsequentSolidFillRect */
57815fb4814Smrg
57915fb4814Smrg/* Line */
5807fe5393cSmrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
58115fb4814Smrg                                 int color, int rop, unsigned int planemask)
58215fb4814Smrg{
58315fb4814Smrg
58415fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
58515fb4814Smrg    PKT_SC *pSingleCMD;
58615fb4814Smrg    ULONG  cmdreg;
58715fb4814Smrg/*
58815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n");
5897fe5393cSmrg*/
59015fb4814Smrg    /* Modify Reg. Value */
59115fb4814Smrg    cmdreg = CMD_BITBLT;
59215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
59315fb4814Smrg    {
59415fb4814Smrg    case 8:
59515fb4814Smrg        cmdreg |= CMD_COLOR_08;
59615fb4814Smrg        break;
59715fb4814Smrg    case 15:
59815fb4814Smrg    case 16:
59915fb4814Smrg        cmdreg |= CMD_COLOR_16;
6007fe5393cSmrg        break;
60115fb4814Smrg    case 24:
60215fb4814Smrg    case 32:
60315fb4814Smrg        cmdreg |= CMD_COLOR_32;
6047fe5393cSmrg        break;
60515fb4814Smrg    }
6067fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
60715fb4814Smrg    pAST->ulCMDReg = cmdreg;
6087fe5393cSmrg
60915fb4814Smrg    if (!pAST->MMIO2D)
6107fe5393cSmrg    {
61115fb4814Smrg        /* Write to CMDQ */
61215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
61315fb4814Smrg
61415fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
61515fb4814Smrg        pSingleCMD++;
6167fe5393cSmrg        ASTSetupFG(pSingleCMD, color);
61715fb4814Smrg        pSingleCMD++;
61815fb4814Smrg        ASTSetupBG(pSingleCMD, 0);
6197fe5393cSmrg
620de78e416Smrg        /* Update Write Pointer */
6217fe5393cSmrg        mUpdateWritePointer;
6227fe5393cSmrg
62315fb4814Smrg    }
62415fb4814Smrg    else
62515fb4814Smrg    {
6267fe5393cSmrg        /* Write to MMIO */
6277fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
6287fe5393cSmrg        ASTSetupFG_MMIO(color);
6297fe5393cSmrg        ASTSetupBG_MMIO(0);
63015fb4814Smrg    }
6317fe5393cSmrg
63215fb4814Smrg} /* end of ASTSetupForSolidLine */
63315fb4814Smrg
63415fb4814Smrg
63515fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
63615fb4814Smrg                                          int x, int y, int len, int dir)
63715fb4814Smrg{
63815fb4814Smrg
63915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
64015fb4814Smrg    PKT_SC *pSingleCMD;
6417fe5393cSmrg    ULONG dstbase, cmdreg;
64215fb4814Smrg    int width, height;
643de78e416Smrg    int delta_y = 0;
6447fe5393cSmrg/*
64515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n");
64615fb4814Smrg*/
64715fb4814Smrg
648de78e416Smrg    if (len != 0)
649de78e416Smrg    {
650de78e416Smrg        /* Modify Reg. Value */
651de78e416Smrg        cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT;
652de78e416Smrg        if (pAST->EnableClip)
653de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
654de78e416Smrg        else
6557fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
656de78e416Smrg        dstbase = 0;
6577fe5393cSmrg
658de78e416Smrg        if(dir == DEGREES_0) {			/* horizontal */
659de78e416Smrg            width  = len;
6607fe5393cSmrg            height = 1;
661de78e416Smrg        } else {					/* vertical */
662de78e416Smrg            width  = 1;
6637fe5393cSmrg            height = len;
664de78e416Smrg        }
6657fe5393cSmrg
6667fe5393cSmrg        if ((y + height) >= pScrn->virtualY)
6677fe5393cSmrg        {
6687fe5393cSmrg            delta_y = y;
669de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y;
670de78e416Smrg            y=0;
671de78e416Smrg        }
6727fe5393cSmrg
6737fe5393cSmrg        if (pAST->EnableClip)
674de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
6757fe5393cSmrg
6767fe5393cSmrg        if (!pAST->MMIO2D)
6777fe5393cSmrg        {
6787fe5393cSmrg            /* Write to CMDQ */
679de78e416Smrg            pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
6807fe5393cSmrg
681de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
6827fe5393cSmrg            pSingleCMD++;
683de78e416Smrg            ASTSetupDSTXY(pSingleCMD, x, y);
6847fe5393cSmrg            pSingleCMD++;
685de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
6867fe5393cSmrg            pSingleCMD++;
6877fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
6887fe5393cSmrg
689de78e416Smrg            /* Update Write Pointer */
690de78e416Smrg            mUpdateWritePointer;
6917fe5393cSmrg
692de78e416Smrg        }
693de78e416Smrg        else
6947fe5393cSmrg        {
695de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
696de78e416Smrg            ASTSetupDSTXY_MMIO(x, y);
697de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
6987fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
6997fe5393cSmrg
700de78e416Smrg            vWaitEngIdle(pScrn, pAST);
7017fe5393cSmrg
702de78e416Smrg        }
7037fe5393cSmrg
704de78e416Smrg    } /* len check */
7057fe5393cSmrg
70615fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */
70715fb4814Smrg
70815fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
70915fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags)
71015fb4814Smrg{
7117fe5393cSmrg
71215fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
71315fb4814Smrg    PKT_SC 	*pSingleCMD;
71415fb4814Smrg    LINEPARAM   dsLineParam;
7157fe5393cSmrg    _LINEInfo   LineInfo;
71615fb4814Smrg    ULONG 	dstbase, ulCommand;
7177fe5393cSmrg    ULONG	miny, maxy;
71815fb4814Smrg    USHORT      usXM;
719de78e416Smrg    int delta_y = 0;
7207fe5393cSmrg
72115fb4814Smrg/*
72215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
7237fe5393cSmrg*/
72415fb4814Smrg
72515fb4814Smrg    /* Modify Reg. Value */
72615fb4814Smrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW;
72715fb4814Smrg    if(flags & OMIT_LAST)
72815fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
72915fb4814Smrg    else
73015fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
73115fb4814Smrg    if (pAST->EnableClip)
73215fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
733de78e416Smrg    else
7347fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
73515fb4814Smrg    dstbase = 0;
73615fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
73715fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
73815fb4814Smrg    if(maxy >= pScrn->virtualY) {
739de78e416Smrg    	delta_y = miny;
74015fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
74115fb4814Smrg        y1 -= miny;
74215fb4814Smrg        y2 -= miny;
74315fb4814Smrg    }
7447fe5393cSmrg
74515fb4814Smrg    LineInfo.X1 = x1;
74615fb4814Smrg    LineInfo.Y1 = y1;
74715fb4814Smrg    LineInfo.X2 = x2;
74815fb4814Smrg    LineInfo.Y2 = y2;
7497fe5393cSmrg
75015fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
7517fe5393cSmrg
7527fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
7537fe5393cSmrg        ulCommand |= CMD_X_DEC;
7547fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
7557fe5393cSmrg        ulCommand |= CMD_Y_DEC;
7567fe5393cSmrg
7577fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
7587fe5393cSmrg
7597fe5393cSmrg    if (pAST->EnableClip)
760de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
7617fe5393cSmrg
7627fe5393cSmrg    if (!pAST->MMIO2D)
7637fe5393cSmrg    {
7647fe5393cSmrg        /* Write to CMDQ */
76515fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
76615fb4814Smrg
76715fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
7687fe5393cSmrg        pSingleCMD++;
76915fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
7707fe5393cSmrg        pSingleCMD++;
77115fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
7727fe5393cSmrg        pSingleCMD++;
77315fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
7747fe5393cSmrg        pSingleCMD++;
77515fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
7767fe5393cSmrg        pSingleCMD++;
77715fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
7787fe5393cSmrg        pSingleCMD++;
7797fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
7807fe5393cSmrg
78115fb4814Smrg        /* Update Write Pointer */
7827fe5393cSmrg        mUpdateWritePointer;
783de78e416Smrg
784de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
785de78e416Smrg        vWaitEngIdle(pScrn, pAST);
7867fe5393cSmrg
78715fb4814Smrg    }
78815fb4814Smrg    else
7897fe5393cSmrg    {
79015fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
79115fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
79215fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
79315fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
79415fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
79515fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
7967fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
7977fe5393cSmrg
79815fb4814Smrg        vWaitEngIdle(pScrn, pAST);
7997fe5393cSmrg
80015fb4814Smrg    }
80115fb4814Smrg
8027fe5393cSmrg
80315fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */
80415fb4814Smrg
80515fb4814Smrg/* Dash Line */
80615fb4814Smrgstatic void
80715fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn,
80815fb4814Smrg                      int fg, int bg, int rop, unsigned int planemask,
80915fb4814Smrg                      int length, UCHAR *pattern)
81015fb4814Smrg{
81115fb4814Smrg
81215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
81315fb4814Smrg    PKT_SC *pSingleCMD;
81415fb4814Smrg    ULONG  cmdreg;
81515fb4814Smrg/*
81615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n");
8177fe5393cSmrg*/
81815fb4814Smrg    /* Modify Reg. Value */
81915fb4814Smrg    cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE;
8207fe5393cSmrg
82115fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
82215fb4814Smrg    {
82315fb4814Smrg    case 8:
82415fb4814Smrg        cmdreg |= CMD_COLOR_08;
82515fb4814Smrg        break;
82615fb4814Smrg    case 15:
82715fb4814Smrg    case 16:
82815fb4814Smrg        cmdreg |= CMD_COLOR_16;
8297fe5393cSmrg        break;
83015fb4814Smrg    case 24:
83115fb4814Smrg    case 32:
83215fb4814Smrg        cmdreg |= CMD_COLOR_32;
8337fe5393cSmrg        break;
83415fb4814Smrg    }
8357fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
83615fb4814Smrg    if(bg == -1) {
8377fe5393cSmrg        cmdreg |= CMD_TRANSPARENT;
83815fb4814Smrg        bg = 0;
83915fb4814Smrg    }
84015fb4814Smrg    cmdreg |= (((length-1) & 0x3F) << 24);		/* line period */
84115fb4814Smrg    pAST->ulCMDReg = cmdreg;
8427fe5393cSmrg
84315fb4814Smrg    if (!pAST->MMIO2D)
8447fe5393cSmrg    {
84515fb4814Smrg        /* Write to CMDQ */
84615fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
84715fb4814Smrg
84815fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
84915fb4814Smrg        pSingleCMD++;
8507fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
85115fb4814Smrg        pSingleCMD++;
8527fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
85315fb4814Smrg        pSingleCMD++;
85415fb4814Smrg        ASTSetupLineStyle1(pSingleCMD, *pattern);
85515fb4814Smrg        pSingleCMD++;
856de78e416Smrg        ASTSetupLineStyle2(pSingleCMD, *(pattern+4));
8577fe5393cSmrg
858de78e416Smrg        /* Update Write Pointer */
8597fe5393cSmrg        mUpdateWritePointer;
8607fe5393cSmrg
86115fb4814Smrg    }
86215fb4814Smrg    else
86315fb4814Smrg    {
8647fe5393cSmrg        /* Write to MMIO */
86515fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
8667fe5393cSmrg        ASTSetupFG_MMIO(fg);
8677fe5393cSmrg        ASTSetupBG_MMIO(bg);
86815fb4814Smrg        ASTSetupLineStyle1_MMIO(*pattern);
8697fe5393cSmrg        ASTSetupLineStyle2_MMIO(*(pattern+4));
87015fb4814Smrg
87115fb4814Smrg    }
8727fe5393cSmrg
87315fb4814Smrg}
87415fb4814Smrg
87515fb4814Smrgstatic void
87615fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
87715fb4814Smrg                                int x1, int y1, int x2, int y2,
87815fb4814Smrg                                int flags, int phase)
87915fb4814Smrg{
8807fe5393cSmrg
88115fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
88215fb4814Smrg    PKT_SC 	*pSingleCMD;
88315fb4814Smrg    LINEPARAM   dsLineParam;
8847fe5393cSmrg    _LINEInfo   LineInfo;
8857fe5393cSmrg    ULONG 	dstbase, ulCommand;
8867fe5393cSmrg    ULONG	miny, maxy;
88715fb4814Smrg    USHORT      usXM;
888de78e416Smrg    int delta_y = 0;
8897fe5393cSmrg
89015fb4814Smrg/*
89115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
8927fe5393cSmrg*/
89315fb4814Smrg
89415fb4814Smrg    /* Modify Reg. Value */
89515fb4814Smrg    ulCommand = pAST->ulCMDReg;
89615fb4814Smrg    if(flags & OMIT_LAST)
89715fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
89815fb4814Smrg    else
89915fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
90015fb4814Smrg    if (pAST->EnableClip)
90115fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
902de78e416Smrg    else
9037fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
9047fe5393cSmrg    dstbase = 0;
90515fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
90615fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
90715fb4814Smrg    if(maxy >= pScrn->virtualY) {
908de78e416Smrg    	delta_y = miny;
90915fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
91015fb4814Smrg        y1 -= miny;
91115fb4814Smrg        y2 -= miny;
91215fb4814Smrg    }
9137fe5393cSmrg
91415fb4814Smrg    LineInfo.X1 = x1;
91515fb4814Smrg    LineInfo.Y1 = y1;
91615fb4814Smrg    LineInfo.X2 = x2;
91715fb4814Smrg    LineInfo.Y2 = y2;
9187fe5393cSmrg
91915fb4814Smrg    bGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
9207fe5393cSmrg
9217fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
9227fe5393cSmrg        ulCommand |= CMD_X_DEC;
9237fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
9247fe5393cSmrg        ulCommand |= CMD_Y_DEC;
9257fe5393cSmrg
9267fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
9277fe5393cSmrg
9287fe5393cSmrg    if (pAST->EnableClip)
929de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
9307fe5393cSmrg
9317fe5393cSmrg    if (!pAST->MMIO2D)
9327fe5393cSmrg    {
9337fe5393cSmrg        /* Write to CMDQ */
93415fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
93515fb4814Smrg
93615fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
9377fe5393cSmrg        pSingleCMD++;
93815fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
9397fe5393cSmrg        pSingleCMD++;
94015fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
9417fe5393cSmrg        pSingleCMD++;
94215fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
9437fe5393cSmrg        pSingleCMD++;
94415fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
9457fe5393cSmrg        pSingleCMD++;
94615fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
9477fe5393cSmrg        pSingleCMD++;
9487fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
9497fe5393cSmrg
95015fb4814Smrg        /* Update Write Pointer */
95115fb4814Smrg        mUpdateWritePointer;
952de78e416Smrg
953de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
954de78e416Smrg        vWaitEngIdle(pScrn, pAST);
9557fe5393cSmrg
95615fb4814Smrg    }
95715fb4814Smrg    else
9587fe5393cSmrg    {
95915fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
96015fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
96115fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
96215fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
96315fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
96415fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
9657fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
9667fe5393cSmrg
96715fb4814Smrg        vWaitEngIdle(pScrn, pAST);
9687fe5393cSmrg
96915fb4814Smrg    }
9707fe5393cSmrg
97115fb4814Smrg}
97215fb4814Smrg
97315fb4814Smrg/* Mono Pattern Fill */
97415fb4814Smrgstatic void
97515fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
97615fb4814Smrg                           int patx, int paty, int fg, int bg,
97715fb4814Smrg                           int rop, unsigned int planemask)
97815fb4814Smrg{
9797fe5393cSmrg
98015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
98115fb4814Smrg    PKT_SC *pSingleCMD;
98215fb4814Smrg    ULONG cmdreg;
98315fb4814Smrg
9847fe5393cSmrg/*
98515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n");
9867fe5393cSmrg*/
98715fb4814Smrg    /* Modify Reg. Value */
98815fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK;
98915fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
99015fb4814Smrg    {
99115fb4814Smrg    case 8:
99215fb4814Smrg        cmdreg |= CMD_COLOR_08;
99315fb4814Smrg        break;
99415fb4814Smrg    case 15:
99515fb4814Smrg    case 16:
99615fb4814Smrg        cmdreg |= CMD_COLOR_16;
9977fe5393cSmrg        break;
99815fb4814Smrg    case 24:
99915fb4814Smrg    case 32:
100015fb4814Smrg        cmdreg |= CMD_COLOR_32;
10017fe5393cSmrg        break;
100215fb4814Smrg    }
100315fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
100415fb4814Smrg    pAST->ulCMDReg = cmdreg;
10057fe5393cSmrg
10067fe5393cSmrg    if (!pAST->MMIO2D)
100715fb4814Smrg    {
100815fb4814Smrg        /* Write to CMDQ */
100915fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
101015fb4814Smrg
101115fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
101215fb4814Smrg        pSingleCMD++;
10137fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
101415fb4814Smrg        pSingleCMD++;
101515fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
101615fb4814Smrg        pSingleCMD++;
10177fe5393cSmrg        ASTSetupMONO1(pSingleCMD, patx);
101815fb4814Smrg        pSingleCMD++;
1019de78e416Smrg        ASTSetupMONO2(pSingleCMD, paty);
10207fe5393cSmrg
1021de78e416Smrg        /* Update Write Pointer */
1022de78e416Smrg        mUpdateWritePointer;
10237fe5393cSmrg
102415fb4814Smrg    }
102515fb4814Smrg    else
102615fb4814Smrg    {
102715fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
10287fe5393cSmrg        ASTSetupFG_MMIO(fg);
102915fb4814Smrg        ASTSetupBG_MMIO(bg);
10307fe5393cSmrg        ASTSetupMONO1_MMIO(patx);
10317fe5393cSmrg        ASTSetupMONO2_MMIO(paty);
103215fb4814Smrg    }
10337fe5393cSmrg
103415fb4814Smrg} /* end of ASTSetupForMonoPatternFill */
103515fb4814Smrg
10367fe5393cSmrg
103715fb4814Smrgstatic void
103815fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
103915fb4814Smrg                             int patx, int paty,
104015fb4814Smrg                             int dst_x, int dst_y, int width, int height)
104115fb4814Smrg{
104215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
104315fb4814Smrg    PKT_SC *pSingleCMD;
1044de78e416Smrg    ULONG dstbase, cmdreg;
1045de78e416Smrg    int delta_y = 0;
10467fe5393cSmrg
10477fe5393cSmrg/*
104815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n");
10497fe5393cSmrg*/
10507fe5393cSmrg
105115fb4814Smrg    /* Modify Reg. Value */
105215fb4814Smrg    cmdreg = pAST->ulCMDReg;
105315fb4814Smrg    if (pAST->EnableClip)
1054de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1055de78e416Smrg    else
10567fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
105715fb4814Smrg    dstbase = 0;
105815fb4814Smrg
10597fe5393cSmrg    if (dst_y >= pScrn->virtualY)
10607fe5393cSmrg    {
1061de78e416Smrg    	delta_y = dst_y;
106215fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
106315fb4814Smrg        dst_y=0;
106415fb4814Smrg    }
1065de78e416Smrg
10667fe5393cSmrg    if (pAST->EnableClip)
1067de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
10687fe5393cSmrg
10697fe5393cSmrg    if (!pAST->MMIO2D)
10707fe5393cSmrg    {
10717fe5393cSmrg        /* Write to CMDQ */
107215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
107315fb4814Smrg
107415fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
10757fe5393cSmrg        pSingleCMD++;
107615fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
10777fe5393cSmrg        pSingleCMD++;
107815fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
10797fe5393cSmrg        pSingleCMD++;
10807fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
10817fe5393cSmrg
108215fb4814Smrg        /* Update Write Pointer */
108315fb4814Smrg        mUpdateWritePointer;
10847fe5393cSmrg
108515fb4814Smrg    }
108615fb4814Smrg    else
10877fe5393cSmrg    {
108815fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
108915fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
109015fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
10917fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
10927fe5393cSmrg
10937fe5393cSmrg        vWaitEngIdle(pScrn, pAST);
10947fe5393cSmrg    }
109515fb4814Smrg
109615fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */
109715fb4814Smrg
109815fb4814Smrgstatic void
109915fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
110015fb4814Smrg			       int rop, unsigned int planemask, int trans_col)
110115fb4814Smrg{
11027fe5393cSmrg
110315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
110415fb4814Smrg    PKT_SC *pSingleCMD;
110515fb4814Smrg    ULONG cmdreg;
110615fb4814Smrg    CARD32 *pataddr;
110715fb4814Smrg    ULONG ulPatSize;
110815fb4814Smrg    int i, j, cpp;
11097fe5393cSmrg/*
111015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n");
11117fe5393cSmrg*/
111215fb4814Smrg    /* Modify Reg. Value */
111315fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_PATREG;
111415fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
111515fb4814Smrg    {
111615fb4814Smrg    case 8:
111715fb4814Smrg        cmdreg |= CMD_COLOR_08;
111815fb4814Smrg        break;
111915fb4814Smrg    case 15:
112015fb4814Smrg    case 16:
112115fb4814Smrg        cmdreg |= CMD_COLOR_16;
11227fe5393cSmrg        break;
112315fb4814Smrg    case 24:
112415fb4814Smrg    case 32:
112515fb4814Smrg        cmdreg |= CMD_COLOR_32;
11267fe5393cSmrg        break;
112715fb4814Smrg    }
112815fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
112915fb4814Smrg    pAST->ulCMDReg = cmdreg;
113015fb4814Smrg    cpp = (pScrn->bitsPerPixel + 1) / 8;
113115fb4814Smrg    pataddr = (CARD32 *)(pAST->FBVirtualAddr +
11327fe5393cSmrg                        (paty * pAST->VideoModeInfo.ScreenPitch) + (patx * cpp));
113315fb4814Smrg    ulPatSize = 8*8*cpp;
11347fe5393cSmrg
11357fe5393cSmrg    if (!pAST->MMIO2D)
113615fb4814Smrg    {
11377fe5393cSmrg        /* Write to CMDQ */
113815fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4));
113915fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
114015fb4814Smrg        pSingleCMD++;
114115fb4814Smrg        for (i=0; i<8; i++)
114215fb4814Smrg        {
114315fb4814Smrg            for (j=0; j<8*cpp/4; j++)
114415fb4814Smrg            {
114515fb4814Smrg                ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++)));
11467fe5393cSmrg                pSingleCMD++;
11477fe5393cSmrg            }
1148de78e416Smrg        }
11497fe5393cSmrg
1150de78e416Smrg        /* Update Write Pointer */
1151de78e416Smrg        mUpdateWritePointer;
11527fe5393cSmrg
115315fb4814Smrg    }
115415fb4814Smrg    else
11557fe5393cSmrg    {
115615fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
115715fb4814Smrg        for (i=0; i<8; i++)
115815fb4814Smrg        {
115915fb4814Smrg            for (j=0; j<8*cpp/4; j++)
116015fb4814Smrg            {
116115fb4814Smrg                ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++)));
11627fe5393cSmrg            }
11637fe5393cSmrg        }
11647fe5393cSmrg
116515fb4814Smrg    }
116615fb4814Smrg
116715fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */
11687fe5393cSmrg
116915fb4814Smrgstatic void
117015fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
117115fb4814Smrg                                     int dst_x, int dst_y, int width, int height)
117215fb4814Smrg{
117315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
117415fb4814Smrg    PKT_SC *pSingleCMD;
1175de78e416Smrg    ULONG dstbase, cmdreg;
1176de78e416Smrg    int delta_y = 0;
11777fe5393cSmrg
11787fe5393cSmrg/*
117915fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n");
118015fb4814Smrg*/
11817fe5393cSmrg
118215fb4814Smrg    /* Modify Reg. Value */
118315fb4814Smrg    cmdreg = pAST->ulCMDReg;
118415fb4814Smrg    if (pAST->EnableClip)
1185de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1186de78e416Smrg    else
11877fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
118815fb4814Smrg    dstbase = 0;
118915fb4814Smrg
11907fe5393cSmrg    if (dst_y >= pScrn->virtualY)
11917fe5393cSmrg    {
1192de78e416Smrg    	delta_y = dst_y;
119315fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
119415fb4814Smrg        dst_y=0;
119515fb4814Smrg    }
1196de78e416Smrg
11977fe5393cSmrg    if (pAST->EnableClip)
1198de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
11997fe5393cSmrg
12007fe5393cSmrg    if (!pAST->MMIO2D)
12017fe5393cSmrg    {
12027fe5393cSmrg        /* Write to CMDQ */
120315fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
120415fb4814Smrg
120515fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
12067fe5393cSmrg        pSingleCMD++;
120715fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
12087fe5393cSmrg        pSingleCMD++;
120915fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
12107fe5393cSmrg        pSingleCMD++;
12117fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
12127fe5393cSmrg
121315fb4814Smrg        /* Update Write Pointer */
121415fb4814Smrg        mUpdateWritePointer;
12157fe5393cSmrg
121615fb4814Smrg    }
121715fb4814Smrg    else
12187fe5393cSmrg    {
121915fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
122015fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
122115fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
12227fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
12237fe5393cSmrg
12247fe5393cSmrg        vWaitEngIdle(pScrn, pAST);
12257fe5393cSmrg    }
12267fe5393cSmrg
122715fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */
122815fb4814Smrg
122915fb4814Smrg/* CPU to Screen Expand */
123015fb4814Smrgstatic void
123115fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
123215fb4814Smrg                                      int fg, int bg,
123315fb4814Smrg                                      int rop, unsigned int planemask)
123415fb4814Smrg{
123515fb4814Smrg
123615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
123715fb4814Smrg    PKT_SC *pSingleCMD;
123815fb4814Smrg    ULONG cmdreg;
123915fb4814Smrg
12407fe5393cSmrg/*
124115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n");
12427fe5393cSmrg*/
124315fb4814Smrg    /* Modify Reg. Value */
124415fb4814Smrg    cmdreg = CMD_COLOREXP;
124515fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
124615fb4814Smrg    {
124715fb4814Smrg    case 8:
124815fb4814Smrg        cmdreg |= CMD_COLOR_08;
124915fb4814Smrg        break;
125015fb4814Smrg    case 15:
125115fb4814Smrg    case 16:
125215fb4814Smrg        cmdreg |= CMD_COLOR_16;
12537fe5393cSmrg        break;
125415fb4814Smrg    case 24:
125515fb4814Smrg    case 32:
125615fb4814Smrg        cmdreg |= CMD_COLOR_32;
12577fe5393cSmrg        break;
125815fb4814Smrg    }
125915fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
126015fb4814Smrg    if(bg == -1) {
12617fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
126215fb4814Smrg        bg = 0;
12637fe5393cSmrg    }
126415fb4814Smrg    pAST->ulCMDReg = cmdreg;
12657fe5393cSmrg
12667fe5393cSmrg    if (!pAST->MMIO2D)
126715fb4814Smrg    {
126815fb4814Smrg        /* Write to CMDQ */
126915fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
127015fb4814Smrg
127115fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
127215fb4814Smrg        pSingleCMD++;
12737fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
127415fb4814Smrg        pSingleCMD++;
12757fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1276de78e416Smrg
1277de78e416Smrg        /* Update Write Pointer */
1278de78e416Smrg        mUpdateWritePointer;
12797fe5393cSmrg
128015fb4814Smrg    }
128115fb4814Smrg    else
128215fb4814Smrg    {
128315fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
12847fe5393cSmrg        ASTSetupFG_MMIO(fg);
12857fe5393cSmrg        ASTSetupBG_MMIO(bg);
12867fe5393cSmrg
128715fb4814Smrg    }
12887fe5393cSmrg
128915fb4814Smrg}
12907fe5393cSmrg
129115fb4814Smrgstatic void
129215fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
129315fb4814Smrg                                        int dst_x, int dst_y,
129415fb4814Smrg                                        int width, int height, int offset)
129515fb4814Smrg{
129615fb4814Smrg
129715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
129815fb4814Smrg    PKT_SC *pSingleCMD;
129915fb4814Smrg    ULONG dstbase, cmdreg;
1300de78e416Smrg    int delta_y = 0;
130115fb4814Smrg
13027fe5393cSmrg/*
130315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n");
130415fb4814Smrg*/
13057fe5393cSmrg
130615fb4814Smrg    /* Modify Reg. Value */
130715fb4814Smrg    cmdreg = pAST->ulCMDReg;
130815fb4814Smrg    if (pAST->EnableClip)
1309de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1310de78e416Smrg    else
13117fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
131215fb4814Smrg    dstbase = 0;
131315fb4814Smrg
13147fe5393cSmrg    if (dst_y >= pScrn->virtualY)
13157fe5393cSmrg    {
1316de78e416Smrg    	delta_y = dst_y;
131715fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
131815fb4814Smrg        dst_y=0;
131915fb4814Smrg    }
1320de78e416Smrg
13217fe5393cSmrg    if (pAST->EnableClip)
1322de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
13237fe5393cSmrg
13247fe5393cSmrg    if (!pAST->MMIO2D)
13257fe5393cSmrg    {
13267fe5393cSmrg        /* Write to CMDQ */
132715fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
132815fb4814Smrg
13297fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, ((width+7)/8));
13307fe5393cSmrg        pSingleCMD++;
133115fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
13327fe5393cSmrg        pSingleCMD++;
133315fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
13347fe5393cSmrg        pSingleCMD++;
133515fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
13367fe5393cSmrg        pSingleCMD++;
13377fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
13387fe5393cSmrg
133915fb4814Smrg        /* Update Write Pointer */
134015fb4814Smrg        mUpdateWritePointer;
13417fe5393cSmrg
134215fb4814Smrg    }
134315fb4814Smrg    else
13447fe5393cSmrg    {
13457fe5393cSmrg        ASTSetupSRCPitch_MMIO((width+7)/8);
134615fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
134715fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
134815fb4814Smrg        ASTSetupSRCXY_MMIO(0, 0);
13497fe5393cSmrg
135015fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
13517fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
13527fe5393cSmrg
135315fb4814Smrg        vWaitEngIdle(pScrn, pAST);
13547fe5393cSmrg
135515fb4814Smrg    }
13567fe5393cSmrg
135715fb4814Smrg}
135815fb4814Smrg
135915fb4814Smrg
136015fb4814Smrg/* Screen to Screen Color Expand */
136115fb4814Smrgstatic void
136215fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
136315fb4814Smrg                                         int fg, int bg,
136415fb4814Smrg                                         int rop, unsigned int planemask)
136515fb4814Smrg{
136615fb4814Smrg
136715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
136815fb4814Smrg    PKT_SC *pSingleCMD;
136915fb4814Smrg    ULONG cmdreg;
137015fb4814Smrg
13717fe5393cSmrg/*
137215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n");
137315fb4814Smrg*/
13747fe5393cSmrg
137515fb4814Smrg    /* Modify Reg. Value */
137615fb4814Smrg    cmdreg = CMD_ENHCOLOREXP;
137715fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
137815fb4814Smrg    {
137915fb4814Smrg    case 8:
138015fb4814Smrg        cmdreg |= CMD_COLOR_08;
138115fb4814Smrg        break;
138215fb4814Smrg    case 15:
138315fb4814Smrg    case 16:
138415fb4814Smrg        cmdreg |= CMD_COLOR_16;
13857fe5393cSmrg        break;
138615fb4814Smrg    case 24:
138715fb4814Smrg    case 32:
138815fb4814Smrg        cmdreg |= CMD_COLOR_32;
13897fe5393cSmrg        break;
139015fb4814Smrg    }
139115fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
139215fb4814Smrg    if(bg == -1) {
13937fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
139415fb4814Smrg        bg = 0;
13957fe5393cSmrg    }
139615fb4814Smrg    pAST->ulCMDReg = cmdreg;
13977fe5393cSmrg
13987fe5393cSmrg    if (!pAST->MMIO2D)
139915fb4814Smrg    {
140015fb4814Smrg        /* Write to CMDQ */
140115fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
140215fb4814Smrg
140315fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
140415fb4814Smrg        pSingleCMD++;
14057fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
140615fb4814Smrg        pSingleCMD++;
14077fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1408de78e416Smrg
1409de78e416Smrg        /* Update Write Pointer */
1410de78e416Smrg        mUpdateWritePointer;
14117fe5393cSmrg
141215fb4814Smrg    }
141315fb4814Smrg    else
141415fb4814Smrg    {
141515fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
14167fe5393cSmrg        ASTSetupFG_MMIO(fg);
14177fe5393cSmrg        ASTSetupBG_MMIO(bg);
14187fe5393cSmrg
141915fb4814Smrg    }
14207fe5393cSmrg
142115fb4814Smrg}
142215fb4814Smrg
142315fb4814Smrg
142415fb4814Smrg
142515fb4814Smrgstatic void
142615fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
142715fb4814Smrg                                           int dst_x, int dst_y, int width, int height,
142815fb4814Smrg                                           int src_x, int src_y, int offset)
142915fb4814Smrg{
143015fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
143115fb4814Smrg    PKT_SC *pSingleCMD;
143215fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
143315fb4814Smrg    USHORT srcpitch;
1434de78e416Smrg    int delta_y = 0;
143515fb4814Smrg
14367fe5393cSmrg/*
143715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n");
143815fb4814Smrg*/
14397fe5393cSmrg
144015fb4814Smrg    /* Modify Reg. Value */
144115fb4814Smrg    cmdreg = pAST->ulCMDReg;
144215fb4814Smrg    if (pAST->EnableClip)
1443de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1444de78e416Smrg    else
14457fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
144615fb4814Smrg    dstbase = 0;
14477fe5393cSmrg    if (dst_y >= pScrn->virtualY)
14487fe5393cSmrg    {
1449de78e416Smrg    	delta_y = dst_y;
145015fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
145115fb4814Smrg        dst_y=0;
145215fb4814Smrg    }
14537fe5393cSmrg    srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x;
145415fb4814Smrg    srcpitch = (pScrn->displayWidth+7)/8;
1455de78e416Smrg
14567fe5393cSmrg    if (pAST->EnableClip)
1457de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
14587fe5393cSmrg
14597fe5393cSmrg    if (!pAST->MMIO2D)
14607fe5393cSmrg    {
14617fe5393cSmrg        /* Write to CMDQ */
146215fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
146315fb4814Smrg
146415fb4814Smrg        ASTSetupSRCBase(pSingleCMD, srcbase);
14657fe5393cSmrg        pSingleCMD++;
14667fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD,srcpitch);
14677fe5393cSmrg        pSingleCMD++;
146815fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
14697fe5393cSmrg        pSingleCMD++;
147015fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
14717fe5393cSmrg        pSingleCMD++;
147215fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
14737fe5393cSmrg        pSingleCMD++;
14747fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
14757fe5393cSmrg
147615fb4814Smrg        /* Update Write Pointer */
147715fb4814Smrg        mUpdateWritePointer;
14787fe5393cSmrg
147915fb4814Smrg    }
148015fb4814Smrg    else
14817fe5393cSmrg    {
14827fe5393cSmrg        ASTSetupSRCBase_MMIO(srcbase);
14837fe5393cSmrg        ASTSetupSRCPitch_MMIO(srcpitch);
148415fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
148515fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
148615fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
14877fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
14887fe5393cSmrg
148915fb4814Smrg        vWaitEngIdle(pScrn, pAST);
14907fe5393cSmrg
149115fb4814Smrg    }
14927fe5393cSmrg
149315fb4814Smrg}
149415fb4814Smrg
14957fe5393cSmrg
149615fb4814Smrg/* Clipping */
149715fb4814Smrgstatic void
1498de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y)
149915fb4814Smrg{
150015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
150115fb4814Smrg    PKT_SC *pSingleCMD;
1502de78e416Smrg
15037fe5393cSmrg    if (!pAST->MMIO2D)
150415fb4814Smrg    {
150515fb4814Smrg        /* Write to CMDQ */
150615fb4814Smrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
150715fb4814Smrg
1508de78e416Smrg        ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y);
150915fb4814Smrg        pSingleCMD++;
1510de78e416Smrg        ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
15117fe5393cSmrg
1512de78e416Smrg        /* Update Write Pointer */
1513de78e416Smrg        mUpdateWritePointer;
15147fe5393cSmrg
151515fb4814Smrg    }
151615fb4814Smrg    else
151715fb4814Smrg    {
1518de78e416Smrg        ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y);
15197fe5393cSmrg        ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
152015fb4814Smrg    }
15217fe5393cSmrg
15227fe5393cSmrg}
1523de78e416Smrg
1524de78e416Smrgstatic void
1525de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn,
1526de78e416Smrg                        int left, int top, int right, int bottom)
1527de78e416Smrg{
15287fe5393cSmrg
1529de78e416Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
1530de78e416Smrg    PKT_SC *pSingleCMD;
15317fe5393cSmrg/*
1532de78e416Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n");
15337fe5393cSmrg*/
1534de78e416Smrg    pAST->EnableClip = TRUE;
15357fe5393cSmrg
1536de78e416Smrg    pAST->clip_left   = left;
1537de78e416Smrg    pAST->clip_top    = top;
1538de78e416Smrg    pAST->clip_right  = right;
1539de78e416Smrg    pAST->clip_bottom = bottom;
15407fe5393cSmrg
154115fb4814Smrg}
154215fb4814Smrg
154315fb4814Smrgstatic void
154415fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn)
154515fb4814Smrg{
154615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
15477fe5393cSmrg/*
154815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n");
15497fe5393cSmrg*/
155015fb4814Smrg    pAST->EnableClip = FALSE;
155115fb4814Smrg}
155215fb4814Smrg
1553b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1554b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags)
1555b410ddbeSmrg{
15567fe5393cSmrg
1557b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1558b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1559b410ddbeSmrg    ULONG 	dstbase, ulCommand;
15607fe5393cSmrg    ULONG	miny, maxy;
1561b410ddbeSmrg/*
1562b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
15637fe5393cSmrg*/
1564b410ddbeSmrg
1565b410ddbeSmrg    /* Modify Reg. Value */
1566b410ddbeSmrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE;
1567b410ddbeSmrg    if(flags & OMIT_LAST)
1568b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1569b410ddbeSmrg    else
1570b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1571b410ddbeSmrg    if (pAST->EnableClip)
1572b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1573b410ddbeSmrg    else
15747fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1575b410ddbeSmrg    dstbase = 0;
1576b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1577b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1578b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1579b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1580b410ddbeSmrg        y1 -= miny;
1581b410ddbeSmrg        y2 -= miny;
1582b410ddbeSmrg    }
1583b410ddbeSmrg
15847fe5393cSmrg    if (!pAST->MMIO2D)
15857fe5393cSmrg    {
15867fe5393cSmrg        /* Write to CMDQ */
1587b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1588b410ddbeSmrg
1589b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
15907fe5393cSmrg        pSingleCMD++;
1591b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1592b410ddbeSmrg        pSingleCMD++;
1593b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1594b410ddbeSmrg        pSingleCMD++;
1595b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
15967fe5393cSmrg        pSingleCMD++;
15977fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
15987fe5393cSmrg
1599b410ddbeSmrg        /* Update Write Pointer */
16007fe5393cSmrg        mUpdateWritePointer;
1601b410ddbeSmrg
1602b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1603b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16047fe5393cSmrg
1605b410ddbeSmrg    }
1606b410ddbeSmrg    else
16077fe5393cSmrg    {
1608b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1609b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1610b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1611b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
16127fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16137fe5393cSmrg
1614b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16157fe5393cSmrg
1616b410ddbeSmrg    }
1617b410ddbeSmrg
16187fe5393cSmrg
1619b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */
1620b410ddbeSmrg
1621b410ddbeSmrgstatic void
1622b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
1623b410ddbeSmrg                                int x1, int y1, int x2, int y2,
1624b410ddbeSmrg                                int flags, int phase)
1625b410ddbeSmrg{
16267fe5393cSmrg
1627b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1628b410ddbeSmrg    PKT_SC 	*pSingleCMD;
16297fe5393cSmrg    ULONG 	dstbase, ulCommand;
16307fe5393cSmrg    ULONG	miny, maxy;
1631b410ddbeSmrg/*
1632b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
16337fe5393cSmrg*/
1634b410ddbeSmrg
1635b410ddbeSmrg    /* Modify Reg. Value */
1636b410ddbeSmrg    ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE;
1637b410ddbeSmrg    if(flags & OMIT_LAST)
1638b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1639b410ddbeSmrg    else
1640b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1641b410ddbeSmrg    if (pAST->EnableClip)
1642b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1643b410ddbeSmrg    else
16447fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
16457fe5393cSmrg    dstbase = 0;
1646b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1647b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1648b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1649b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1650b410ddbeSmrg        y1 -= miny;
1651b410ddbeSmrg        y2 -= miny;
1652b410ddbeSmrg    }
1653b410ddbeSmrg
16547fe5393cSmrg    if (!pAST->MMIO2D)
16557fe5393cSmrg    {
16567fe5393cSmrg        /* Write to CMDQ */
1657b410ddbeSmrg        pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1658b410ddbeSmrg
1659b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
16607fe5393cSmrg        pSingleCMD++;
1661b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1662b410ddbeSmrg        pSingleCMD++;
1663b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1664b410ddbeSmrg        pSingleCMD++;
1665b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
16667fe5393cSmrg        pSingleCMD++;
16677fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
16687fe5393cSmrg
1669b410ddbeSmrg        /* Update Write Pointer */
1670b410ddbeSmrg        mUpdateWritePointer;
1671b410ddbeSmrg
1672b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1673b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16747fe5393cSmrg
1675b410ddbeSmrg    }
1676b410ddbeSmrg    else
16777fe5393cSmrg    {
1678b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1679b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1680b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1681b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1682b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16837fe5393cSmrg
1684b410ddbeSmrg        vWaitEngIdle(pScrn, pAST);
16857fe5393cSmrg
1686b410ddbeSmrg    }
16877fe5393cSmrg
1688b410ddbeSmrg}
16897fe5393cSmrg#endif	/* HAVE_XAA_H */
1690b410ddbeSmrg
1691b534f209Smrg#ifdef	AstVideo
1692b534f209Smrg/*
1693b534f209Smrg * Video Part
1694b534f209Smrg * by ic_yang
1695b534f209Smrg */
1696b534f209Smrg#include "fourcc.h"
1697b534f209Smrg
1698b534f209Smrgvoid ASTDisplayVideo(ScrnInfoPtr pScrn, ASTPortPrivPtr pPriv, RegionPtr clipBoxes, int id)
1699b534f209Smrg{
1700b534f209Smrg    ASTPtr              pAST = ASTPTR(pScrn);
17017fe5393cSmrg    int                 nBoxs;
1702b534f209Smrg    int                 ScaleFactorH, ScaleFactorV;
1703b534f209Smrg    ULONG               InitScaleFactorH, InitScaleFactorV;
1704b534f209Smrg    BURSTSCALECMD       CopyCmd = {0};
1705b534f209Smrg    PBURSTSCALECMD      pCopyCmd = NULL;
1706b534f209Smrg    float               fScaleX = 0, fScaleY = 0;
1707b534f209Smrg    xRectangle          rect;
1708b534f209Smrg    BoxPtr              pBox = NULL;
1709b534f209Smrg    short               lSrcX, lSrcY;
1710b534f209Smrg    ULONG               dwCmd = 0;
1711b534f209Smrg    int                 i;
17127fe5393cSmrg
1713b534f209Smrg    pBox = REGION_RECTS(clipBoxes);
1714b534f209Smrg    nBoxs = REGION_NUM_RECTS(clipBoxes);
1715b534f209Smrg
1716b534f209Smrg    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MMIO=%x,pBox=%x, nBoxs=%x\n", pAST->MMIO2D, pBox, nBoxs);
17177fe5393cSmrg
1718b534f209Smrg    if(0==pPriv->drw_w || 0==pPriv->drw_h)
1719b534f209Smrg    {
1720b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drwx=%x, drwy=%x\n", pPriv->drw_w, pPriv->drw_h);
1721b534f209Smrg        return;
1722b534f209Smrg    }
1723b534f209Smrg
1724b534f209Smrg    /* calc scaling factor */
1725b534f209Smrg    fScaleX = (float)pPriv->src_w /(float)pPriv->drw_w;
1726b534f209Smrg    fScaleY = (float)pPriv->src_h /(float)pPriv->drw_h;
17277fe5393cSmrg
1728b534f209Smrg    if (pPriv->src_w == pPriv->drw_w)
1729b534f209Smrg        ScaleFactorH = 0x8000;
1730b534f209Smrg    else
1731b534f209Smrg        ScaleFactorH = (ULONG)((pPriv->src_w-1)*0x8000)/pPriv->drw_w;
1732b534f209Smrg
1733b534f209Smrg    if (pPriv->src_h == pPriv->drw_h)
1734b534f209Smrg    {
1735b534f209Smrg        ScaleFactorV = 0x8000;
1736b534f209Smrg		dwCmd |= SCALE_EQUAL_VER; /* Setting it save the bandwidtch */
1737b534f209Smrg   	}
1738b534f209Smrg    else
1739b534f209Smrg   	{
1740b534f209Smrg        ScaleFactorV = (ULONG)((pPriv->src_h-1)*0x8000)/pPriv->drw_h;
1741b534f209Smrg    }
1742b534f209Smrg
1743b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1744b534f209Smrg        InitScaleFactorH = 0;
1745b534f209Smrg    else
1746b534f209Smrg        InitScaleFactorH = 0x4000;
1747b534f209Smrg
1748b534f209Smrg    if (pPriv->drw_h >= pPriv->src_h)
1749b534f209Smrg        InitScaleFactorV = 0;
1750b534f209Smrg    else
1751b534f209Smrg        InitScaleFactorV = 0x4000;
1752b534f209Smrg
17537fe5393cSmrg    switch(pScrn->bitsPerPixel)
1754b534f209Smrg    {
1755b534f209Smrg    case 32:
1756b534f209Smrg        dwCmd   = CMD_COLOR_32;
1757b534f209Smrg        break;
1758b534f209Smrg    case 16:
1759b534f209Smrg        dwCmd   = CMD_COLOR_16;
1760b534f209Smrg        break;
1761b534f209Smrg    case  8:
1762b534f209Smrg        dwCmd   = CMD_COLOR_08;
1763b534f209Smrg        break;
1764b534f209Smrg    }
1765b534f209Smrg
1766b534f209Smrg    dwCmd |= CMD_TYPE_SCALE;
1767b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1768b534f209Smrg        dwCmd |= SCALE_SEG_NUM_1;
1769b534f209Smrg    else
1770b534f209Smrg        dwCmd |= SCALE_SEG_NUM_2;
1771b534f209Smrg
1772b534f209Smrg    dwCmd |= SCALE_FORMAT_YUV2RGB;
1773b534f209Smrg    switch(id)
1774b534f209Smrg    {
1775b534f209Smrg    case PIXEL_FMT_YUY2:
17767fe5393cSmrg        dwCmd |= YUV_FORMAT_YUYV;
1777b534f209Smrg        break;
17787fe5393cSmrg    case PIXEL_FMT_UYVY:
17797fe5393cSmrg        dwCmd |= YUV_FORMAT_UYVY;
1780b534f209Smrg        break;
1781b534f209Smrg    default:
1782b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Other pix format:%x\n", id);
1783b534f209Smrg        break;
1784b534f209Smrg    }
17857fe5393cSmrg
1786b534f209Smrg    for(i = 0; i < nBoxs; i++, pBox++)
1787b534f209Smrg    {
1788b534f209Smrg        rect.x = pBox->x1 - pPriv->drw_x;
1789b534f209Smrg        rect.y = pBox->y1 - pPriv->drw_y;
1790b534f209Smrg        rect.width = pBox->x2 - pBox->x1;
17917fe5393cSmrg        rect.height = pBox->y2 - pBox->y1;
17927fe5393cSmrg
1793b534f209Smrg        lSrcX = (ULONG)((float)rect.x * fScaleX + pPriv->src_x + 0.5f);
1794b534f209Smrg        lSrcY = (ULONG)((float)rect.y * fScaleY + pPriv->src_y + 0.5f);
17957fe5393cSmrg
17967fe5393cSmrg        pCopyCmd = (BURSTSCALECMD*)pjRequestCMDQ(pAST, PKT_TYPESCALE_LENGTH);
17977fe5393cSmrg
17987fe5393cSmrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pCopyCmd=%p, pBox=%x,%x,%x,%x\n", pCopyCmd, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
17997fe5393cSmrg
1800b534f209Smrg        CopyCmd.dwHeader0        = (ULONG)  PKT_BURST_CMD_HEADER0 |
1801b534f209Smrg                                             PKT_TYPESCALE_DATALENGTH |
1802b534f209Smrg                                             PKT_TYPESCALE_ADDRSTART  |
1803b534f209Smrg                                             BURST_FORCE_CMD;
1804b534f209Smrg
1805b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CopyCmd.dwHeader0=%x\n", CopyCmd.dwHeader0);
1806b534f209Smrg
1807b534f209Smrg        CopyCmd.dwSrcPitch       = (ULONG)(pPriv->srcPitch << 16);
18087fe5393cSmrg
1809b534f209Smrg        CopyCmd.dwDstHeightPitch = (ULONG)  ((pAST->VideoModeInfo.ScreenPitch << 16) | 0xFFFF);
18107fe5393cSmrg
18117fe5393cSmrg        CopyCmd.dwDstXY          = (ULONG) ((pBox->x1 << 16) | (pBox->y1 & 0xFFFF));
18127fe5393cSmrg        CopyCmd.dwSrcXY          = (ULONG) ((lSrcX << 16) | (lSrcY & 0xFFFF));
18137fe5393cSmrg        CopyCmd.dwRecHeightWidth = (ULONG) ((rect.width << 16) | rect.height);
18147fe5393cSmrg
1815b534f209Smrg        CopyCmd.dwInitScaleFactorH = InitScaleFactorH;
1816b534f209Smrg        CopyCmd.dwInitScaleFactorV = InitScaleFactorV;
18177fe5393cSmrg        CopyCmd.dwScaleFactorH   = ScaleFactorH;
1818b534f209Smrg        CopyCmd.dwScaleFactorV   = ScaleFactorV;
1819b534f209Smrg
1820b534f209Smrg        CopyCmd.dwSrcBaseAddr = pPriv->bufAddr[pPriv->currentBuf];
1821b534f209Smrg        CopyCmd.dwDstBaseAddr = 0;
1822b534f209Smrg        CopyCmd.dwCmd = dwCmd;
1823b534f209Smrg        CopyCmd.NullData[0] = 0;    /* for alignment */
1824b534f209Smrg        memcpy(pCopyCmd, &CopyCmd, sizeof(CopyCmd));
18257fe5393cSmrg
1826b534f209Smrg        mUpdateWritePointer;
18277fe5393cSmrg
18287fe5393cSmrg#if 0
1829b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1830b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8000),
1831b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8004),
1832b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8008),
1833b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x800C));
1834b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1835b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8010),
1836b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8014),
1837b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8018),
1838b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x801C));
1839b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1840b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8020),
1841b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8024),
1842b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8028),
1843b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x802C));
1844b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1845b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8030),
1846b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8034),
1847b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8038),
1848b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x803C));
1849b534f209Smrg#endif
1850b534f209Smrg
1851b534f209Smrg    } /* End of for-loop */
18527fe5393cSmrg
1853b534f209Smrg} /* ASTDisplayVideo */
1854b534f209Smrg#endif	/* AstVideo */
1855b534f209Smrg
185615fb4814Smrg#endif	/* end of Accel_2D */
1857