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 "xf86Pci.h"
4015fb4814Smrg
4115fb4814Smrg/* framebuffer offscreen manager */
4215fb4814Smrg#include "xf86fbman.h"
4315fb4814Smrg
4415fb4814Smrg/* include xaa includes */
45b4d38c65Smrg#ifdef HAVE_XAA_H
4615fb4814Smrg#include "xaa.h"
4715fb4814Smrg#include "xaarop.h"
487fe5393cSmrg#endif
4915fb4814Smrg
5015fb4814Smrg/* H/W cursor support */
5115fb4814Smrg#include "xf86Cursor.h"
5215fb4814Smrg
5315fb4814Smrg/* Driver specific headers */
5415fb4814Smrg#include "ast.h"
55621ff18cSmrg#include "ast_2dtool.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/* Prototype type declaration */
10215fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn);
1037fe5393cSmrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
10415fb4814Smrg                                          int xdir, int ydir, int rop,
10515fb4814Smrg                                          unsigned int planemask, int trans_color);
10615fb4814Smrgstatic void ASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
1077fe5393cSmrg                                            int y2, int w, int h);
10815fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn,
10915fb4814Smrg                                 int color, int rop, unsigned int planemask);
11015fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
1117fe5393cSmrg                                       int dst_x, int dst_y, int width, int height);
11215fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
11315fb4814Smrg                                 int color, int rop, unsigned int planemask);
11415fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
11515fb4814Smrg                                          int x, int y, int len, int dir);
11615fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1177fe5393cSmrg                                           int x1, int y1, int x2, int y2, int flags);
11815fb4814Smrgstatic void ASTSetupForDashedLine(ScrnInfoPtr pScrn,
11915fb4814Smrg                                  int fg, int bg, int rop, unsigned int planemask,
12015fb4814Smrg                                  int length, UCHAR *pattern);
12115fb4814Smrgstatic void ASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
12215fb4814Smrg                                            int x1, int y1, int x2, int y2,
1237fe5393cSmrg                                            int flags, int phase);
12415fb4814Smrgstatic void ASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
12515fb4814Smrg                                       int patx, int paty, int fg, int bg,
12615fb4814Smrg                                       int rop, unsigned int planemask);
12715fb4814Smrgstatic void ASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
12815fb4814Smrg                                         int patx, int paty,
12915fb4814Smrg                                         int x, int y, int w, int h);
13015fb4814Smrgstatic void ASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
13115fb4814Smrg			                   int rop, unsigned int planemask, int trans_col);
13215fb4814Smrgstatic void ASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
13315fb4814Smrg                                                 int x, int y, int w, int h);
13415fb4814Smrgstatic void ASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
13515fb4814Smrg                                                  int fg, int bg,
13615fb4814Smrg                                                  int rop, unsigned int planemask);
13715fb4814Smrgstatic void ASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
13815fb4814Smrg                                                    int x, int y,
13915fb4814Smrg                                                    int width, int height, int skipleft);
14015fb4814Smrgstatic void ASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14115fb4814Smrg                                                     int fg, int bg,
14215fb4814Smrg                                                     int rop, unsigned int planemask);
14315fb4814Smrgstatic void ASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14415fb4814Smrg                                                       int x, int y, int width, int height,
14515fb4814Smrg                                                       int src_x, int src_y, int offset);
14615fb4814Smrgstatic void ASTSetClippingRectangle(ScrnInfoPtr pScrn,
14715fb4814Smrg                                    int left, int top, int right, int bottom);
1487fe5393cSmrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn);
149de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y);
15015fb4814Smrg
151b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1527fe5393cSmrg                                           int x1, int y1, int x2, int y2, int flags);
153b410ddbeSmrgstatic void AIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
154b410ddbeSmrg                                            int x1, int y1, int x2, int y2,
155b410ddbeSmrg                                            int flags, int phase);
156b410ddbeSmrg
15715fb4814SmrgBool
15815fb4814SmrgASTAccelInit(ScreenPtr pScreen)
15915fb4814Smrg{
16015fb4814Smrg    XAAInfoRecPtr  infoPtr;
161b4d38c65Smrg    ScrnInfoPtr    pScrn = xf86ScreenToScrn(pScreen);
16215fb4814Smrg    ASTRecPtr      pAST = ASTPTR(pScrn);
16315fb4814Smrg
16415fb4814Smrg    pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec();
16515fb4814Smrg    if (!infoPtr)  return FALSE;
16615fb4814Smrg
16715fb4814Smrg    infoPtr->Flags = LINEAR_FRAMEBUFFER |
16815fb4814Smrg  		     OFFSCREEN_PIXMAPS |
16915fb4814Smrg  		     PIXMAP_CACHE;
17015fb4814Smrg
17115fb4814Smrg    /* Sync */
17215fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Sync)
17315fb4814Smrg        infoPtr->Sync = ASTSync;
17415fb4814Smrg
17515fb4814Smrg    /* Screen To Screen copy */
17615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy)
1777fe5393cSmrg    {
17815fb4814Smrg        infoPtr->SetupForScreenToScreenCopy =  ASTSetupForScreenToScreenCopy;
17915fb4814Smrg        infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy;
18015fb4814Smrg        infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK;
18115fb4814Smrg    }
18215fb4814Smrg
18315fb4814Smrg    /* Solid fill */
18415fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidFill)
1857fe5393cSmrg    {
18615fb4814Smrg        infoPtr->SetupForSolidFill = ASTSetupForSolidFill;
18715fb4814Smrg        infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect;
18815fb4814Smrg        infoPtr->SolidFillFlags = NO_PLANEMASK;
1897fe5393cSmrg    }
1907fe5393cSmrg
19115fb4814Smrg    /* Solid Lines */
19215fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidLine)
1937fe5393cSmrg    {
194cc47c849Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST2500) || (pAST->jChipType == AST1180) )
195b410ddbeSmrg    	{
196b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine;
197b410ddbeSmrg        }
198b410ddbeSmrg        else
199b410ddbeSmrg    	{
200b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine;
201b410ddbeSmrg        }
202b410ddbeSmrg
2037fe5393cSmrg        infoPtr->SetupForSolidLine = ASTSetupForSolidLine;
2047fe5393cSmrg        infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine;
20515fb4814Smrg        infoPtr->SolidLineFlags = NO_PLANEMASK;
20615fb4814Smrg    }
20715fb4814Smrg
20815fb4814Smrg    /* Dashed Lines */
20915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_DashedLine)
210b410ddbeSmrg    {
211cc47c849Smrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST2500) || (pAST->jChipType == AST1180) )
212b410ddbeSmrg        {
213b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine;
214b410ddbeSmrg        }
215b410ddbeSmrg        else
216b410ddbeSmrg        {
217b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine;
2187fe5393cSmrg        }
219b410ddbeSmrg
2207fe5393cSmrg        infoPtr->SetupForDashedLine = ASTSetupForDashedLine;
22115fb4814Smrg        infoPtr->DashPatternMaxLength = 64;
22215fb4814Smrg        infoPtr->DashedLineFlags = NO_PLANEMASK |
22315fb4814Smrg			           LINE_PATTERN_MSBFIRST_LSBJUSTIFIED;
2247fe5393cSmrg    }
22515fb4814Smrg
22615fb4814Smrg    /* 8x8 mono pattern fill */
22715fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill)
2287fe5393cSmrg    {
22915fb4814Smrg        infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill;
23015fb4814Smrg        infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill;
23115fb4814Smrg        infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
23215fb4814Smrg                                           NO_TRANSPARENCY |
23315fb4814Smrg				           HARDWARE_PATTERN_SCREEN_ORIGIN |
23415fb4814Smrg				           HARDWARE_PATTERN_PROGRAMMED_BITS |
23515fb4814Smrg				           BIT_ORDER_IN_BYTE_MSBFIRST;
2367fe5393cSmrg    }
2377fe5393cSmrg
23815fb4814Smrg    /* 8x8 color pattern fill */
23915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill)
2407fe5393cSmrg    {
24115fb4814Smrg        infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill;
24215fb4814Smrg        infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect;
24315fb4814Smrg        infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
2447fe5393cSmrg					    NO_TRANSPARENCY |
24515fb4814Smrg	 				    HARDWARE_PATTERN_SCREEN_ORIGIN;
2467fe5393cSmrg    }
2477fe5393cSmrg
24815fb4814Smrg    /* CPU To Screen Color Expand */
24915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand)
2507fe5393cSmrg    {
25115fb4814Smrg        infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill;
25215fb4814Smrg        infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill;
25315fb4814Smrg        infoPtr->ColorExpandRange = MAX_PATReg_Size;
25415fb4814Smrg        infoPtr->ColorExpandBase = MMIOREG_PAT;
25515fb4814Smrg        infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
25615fb4814Smrg	   				           BIT_ORDER_IN_BYTE_MSBFIRST;
2577fe5393cSmrg    }
25815fb4814Smrg
25915fb4814Smrg    /* Screen To Screen Color Expand */
26015fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand)
2617fe5393cSmrg    {
26215fb4814Smrg        infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill;
26315fb4814Smrg        infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill;
26415fb4814Smrg        infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK |
26515fb4814Smrg	                                              BIT_ORDER_IN_BYTE_MSBFIRST;
2667fe5393cSmrg    }
2677fe5393cSmrg
26815fb4814Smrg    /* Clipping */
26915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Clipping)
2707fe5393cSmrg    {
27115fb4814Smrg        infoPtr->SetClippingRectangle = ASTSetClippingRectangle;
27215fb4814Smrg        infoPtr->DisableClipping = ASTDisableClipping;
27315fb4814Smrg        infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY 	|
27415fb4814Smrg                		 HARDWARE_CLIP_MONO_8x8_FILL		|
27515fb4814Smrg                		 HARDWARE_CLIP_COLOR_8x8_FILL	 	|
2767fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE 		|
2777fe5393cSmrg                		 HARDWARE_CLIP_DASHED_LINE 		|
2787fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE;
2797fe5393cSmrg    }
28015fb4814Smrg
28115fb4814Smrg    return(XAAInit(pScreen, infoPtr));
2827fe5393cSmrg
28315fb4814Smrg} /* end of ASTAccelInit */
28415fb4814Smrg
28515fb4814Smrgstatic void
28615fb4814SmrgASTSync(ScrnInfoPtr pScrn)
28715fb4814Smrg{
28815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
28915fb4814Smrg
29015fb4814Smrg    /* wait engle idle */
291621ff18cSmrg    vASTWaitEngIdle(pScrn, pAST);
29215fb4814Smrg
29315fb4814Smrg} /* end of ASTSync */
29415fb4814Smrg
29515fb4814Smrg
29615fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
29715fb4814Smrg                                          int xdir, int ydir, int rop,
29815fb4814Smrg                                          unsigned int planemask, int trans_color)
29915fb4814Smrg{
3007fe5393cSmrg
30115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
30215fb4814Smrg    PKT_SC *pSingleCMD;
30315fb4814Smrg    ULONG  cmdreg;
3047fe5393cSmrg
30515fb4814Smrg/*
30615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n");
3077fe5393cSmrg*/
30815fb4814Smrg    /* Modify Reg. Value */
30915fb4814Smrg    cmdreg = CMD_BITBLT;
31015fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
31115fb4814Smrg    {
31215fb4814Smrg    case 8:
31315fb4814Smrg        cmdreg |= CMD_COLOR_08;
31415fb4814Smrg        break;
31515fb4814Smrg    case 15:
31615fb4814Smrg    case 16:
31715fb4814Smrg        cmdreg |= CMD_COLOR_16;
3187fe5393cSmrg        break;
31915fb4814Smrg    case 24:
32015fb4814Smrg    case 32:
32115fb4814Smrg        cmdreg |= CMD_COLOR_32;
3227fe5393cSmrg        break;
32315fb4814Smrg    }
32415fb4814Smrg    cmdreg |= (ASTXAACopyROP[rop] << 8);
32515fb4814Smrg    pAST->ulCMDReg = cmdreg;
3267fe5393cSmrg
32715fb4814Smrg    if (!pAST->MMIO2D)
3287fe5393cSmrg    {
32915fb4814Smrg        /* Write to CMDQ */
330621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
3317fe5393cSmrg
3327fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch);
33315fb4814Smrg        pSingleCMD++;
33415fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
3357fe5393cSmrg
336de78e416Smrg        /* Update Write Pointer */
337de78e416Smrg        mUpdateWritePointer;
3387fe5393cSmrg
33915fb4814Smrg    }
34015fb4814Smrg    else
34115fb4814Smrg    {
3427fe5393cSmrg        /* Write to MMIO */
3437fe5393cSmrg        ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch);
3447fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
34515fb4814Smrg    }
3467fe5393cSmrg
34715fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */
34815fb4814Smrg
34915fb4814Smrgstatic void
35015fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
35115fb4814Smrg                                int y2, int width, int height)
35215fb4814Smrg{
35315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
35415fb4814Smrg    PKT_SC *pSingleCMD;
35515fb4814Smrg    int src_x, src_y, dst_x, dst_y;
35615fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
357de78e416Smrg    int delta_y = 0;
35815fb4814Smrg/*
35915fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n");
36015fb4814Smrg*/
36115fb4814Smrg
362de78e416Smrg    if ((width != 0) && (height != 0))
3637fe5393cSmrg    {
364de78e416Smrg        /* Modify Reg. Value */
365de78e416Smrg        cmdreg = pAST->ulCMDReg;
366de78e416Smrg        if (pAST->EnableClip)
367de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
368de78e416Smrg        else
3697fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
370de78e416Smrg        srcbase = dstbase = 0;
371de78e416Smrg
372de78e416Smrg        if (x1 < x2)
3737fe5393cSmrg            cmdreg |= CMD_X_DEC;
374de78e416Smrg
375de78e416Smrg        if (y1 < y2)
3767fe5393cSmrg            cmdreg |= CMD_Y_DEC;
3777fe5393cSmrg
378de78e416Smrg        if ((y1 + height) >= MAX_SRC_Y)
3797fe5393cSmrg        {
380de78e416Smrg            srcbase=pAST->VideoModeInfo.ScreenPitch*y1;
381de78e416Smrg            y1 = 0;
3827fe5393cSmrg        }
3837fe5393cSmrg
3847fe5393cSmrg        if ((y2 + height) >= pScrn->virtualY)
3857fe5393cSmrg        {
386de78e416Smrg            delta_y = y2;
387de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y2;
388de78e416Smrg            y2 = 0;
389de78e416Smrg        }
3907fe5393cSmrg
391de78e416Smrg        if (cmdreg & CMD_X_DEC)
392de78e416Smrg        {
393de78e416Smrg            src_x = x1 + width - 1;
394de78e416Smrg            dst_x = x2 + width - 1;
395de78e416Smrg        }
396de78e416Smrg        else
397de78e416Smrg        {
398de78e416Smrg            src_x = x1;
3997fe5393cSmrg            dst_x = x2;
400de78e416Smrg        }
4017fe5393cSmrg
402de78e416Smrg        if (cmdreg & CMD_Y_DEC)
4037fe5393cSmrg        {
404de78e416Smrg            src_y = y1 + height - 1;
405de78e416Smrg            dst_y = y2 + height - 1;
406de78e416Smrg        }
407de78e416Smrg        else
408de78e416Smrg        {
409de78e416Smrg            src_y = y1;
4107fe5393cSmrg            dst_y = y2;
411de78e416Smrg        }
4127fe5393cSmrg
4137fe5393cSmrg        if (pAST->EnableClip)
414de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
4157fe5393cSmrg
4167fe5393cSmrg        if (!pAST->MMIO2D)
417de78e416Smrg        {
418de78e416Smrg            /* Write to CMDQ */
419621ff18cSmrg            pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
4207fe5393cSmrg
421de78e416Smrg            ASTSetupSRCBase(pSingleCMD, srcbase);
4227fe5393cSmrg            pSingleCMD++;
423de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
4247fe5393cSmrg            pSingleCMD++;
4257fe5393cSmrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
4267fe5393cSmrg            pSingleCMD++;
4277fe5393cSmrg            ASTSetupSRCXY(pSingleCMD, src_x, src_y);
4287fe5393cSmrg            pSingleCMD++;
4297fe5393cSmrg            ASTSetupRECTXY(pSingleCMD, width, height);
4307fe5393cSmrg            pSingleCMD++;
4317fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
4327fe5393cSmrg
433de78e416Smrg            /* Update Write Pointer */
434de78e416Smrg            mUpdateWritePointer;
4357fe5393cSmrg
436de78e416Smrg        }
437de78e416Smrg        else
438de78e416Smrg        {
439de78e416Smrg            ASTSetupSRCBase_MMIO(srcbase);
440de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
4417fe5393cSmrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
4427fe5393cSmrg            ASTSetupSRCXY_MMIO(src_x, src_y);
4437fe5393cSmrg            ASTSetupRECTXY_MMIO(width, height);
4447fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
4457fe5393cSmrg
446621ff18cSmrg            vASTWaitEngIdle(pScrn, pAST);
447de78e416Smrg        }
4487fe5393cSmrg
449de78e416Smrg    } /* width & height check */
45015fb4814Smrg
45115fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */
45215fb4814Smrg
45315fb4814Smrgstatic void
45415fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn,
45515fb4814Smrg                     int color, int rop, unsigned int planemask)
45615fb4814Smrg{
4577fe5393cSmrg
45815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
45915fb4814Smrg    PKT_SC *pSingleCMD;
46015fb4814Smrg    ULONG cmdreg;
46115fb4814Smrg
4627fe5393cSmrg/*
46315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n");
4647fe5393cSmrg*/
46515fb4814Smrg    /* Modify Reg. Value */
46615fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR;
46715fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
46815fb4814Smrg    {
46915fb4814Smrg    case 8:
47015fb4814Smrg        cmdreg |= CMD_COLOR_08;
47115fb4814Smrg        break;
47215fb4814Smrg    case 15:
47315fb4814Smrg    case 16:
47415fb4814Smrg        cmdreg |= CMD_COLOR_16;
4757fe5393cSmrg        break;
47615fb4814Smrg    case 24:
47715fb4814Smrg    case 32:
47815fb4814Smrg        cmdreg |= CMD_COLOR_32;
4797fe5393cSmrg        break;
48015fb4814Smrg    }
48115fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
48215fb4814Smrg    pAST->ulCMDReg = cmdreg;
4837fe5393cSmrg
4847fe5393cSmrg    if (!pAST->MMIO2D)
48515fb4814Smrg    {
48615fb4814Smrg        /* Write to CMDQ */
487621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
48815fb4814Smrg
48915fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
49015fb4814Smrg        pSingleCMD++;
491de78e416Smrg        ASTSetupFG(pSingleCMD, color);
4927fe5393cSmrg
493de78e416Smrg        /* Update Write Pointer */
494de78e416Smrg        mUpdateWritePointer;
4957fe5393cSmrg
49615fb4814Smrg    }
49715fb4814Smrg    else
49815fb4814Smrg    {
49915fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
5007fe5393cSmrg        ASTSetupFG_MMIO(color);
50115fb4814Smrg    }
5027fe5393cSmrg
50315fb4814Smrg} /* end of ASTSetupForSolidFill */
50415fb4814Smrg
50515fb4814Smrg
50615fb4814Smrgstatic void
50715fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
50815fb4814Smrg                           int dst_x, int dst_y, int width, int height)
50915fb4814Smrg{
51015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
51115fb4814Smrg    PKT_SC *pSingleCMD;
5127fe5393cSmrg    ULONG dstbase, cmdreg;
513de78e416Smrg    int delta_y = 0;
5147fe5393cSmrg
5157fe5393cSmrg/*
51615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n");
51715fb4814Smrg*/
51815fb4814Smrg
519de78e416Smrg    if ((width != 0) && (height != 0))
520de78e416Smrg    {
521de78e416Smrg        /* Modify Reg. Value */
522de78e416Smrg        cmdreg = pAST->ulCMDReg;
523de78e416Smrg        if (pAST->EnableClip)
524de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
525de78e416Smrg        else
5267fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
527de78e416Smrg        dstbase = 0;
5287fe5393cSmrg
5297fe5393cSmrg        if (dst_y >= pScrn->virtualY)
530de78e416Smrg        {
5317fe5393cSmrg            delta_y = dst_y;
532de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
533de78e416Smrg            dst_y=0;
534de78e416Smrg        }
53515fb4814Smrg
5367fe5393cSmrg        if (pAST->EnableClip)
537de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
5387fe5393cSmrg
5397fe5393cSmrg        if (!pAST->MMIO2D)
5407fe5393cSmrg        {
5417fe5393cSmrg            /* Write to CMDQ */
542621ff18cSmrg            pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
5437fe5393cSmrg
544de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
5457fe5393cSmrg            pSingleCMD++;
546de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
5477fe5393cSmrg            pSingleCMD++;
548de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
5497fe5393cSmrg            pSingleCMD++;
5507fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
5517fe5393cSmrg
552de78e416Smrg            /* Update Write Pointer */
553de78e416Smrg            mUpdateWritePointer;
5547fe5393cSmrg
555de78e416Smrg        }
556de78e416Smrg        else
5577fe5393cSmrg        {
558de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
559de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
560de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
5617fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
5627fe5393cSmrg
563621ff18cSmrg            vASTWaitEngIdle(pScrn, pAST);
5647fe5393cSmrg
565de78e416Smrg        }
5667fe5393cSmrg
567de78e416Smrg    } /* width & height check */
56815fb4814Smrg
56915fb4814Smrg
57015fb4814Smrg} /* end of ASTSubsequentSolidFillRect */
57115fb4814Smrg
57215fb4814Smrg/* Line */
5737fe5393cSmrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
57415fb4814Smrg                                 int color, int rop, unsigned int planemask)
57515fb4814Smrg{
57615fb4814Smrg
57715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
57815fb4814Smrg    PKT_SC *pSingleCMD;
57915fb4814Smrg    ULONG  cmdreg;
58015fb4814Smrg/*
58115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n");
5827fe5393cSmrg*/
58315fb4814Smrg    /* Modify Reg. Value */
58415fb4814Smrg    cmdreg = CMD_BITBLT;
58515fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
58615fb4814Smrg    {
58715fb4814Smrg    case 8:
58815fb4814Smrg        cmdreg |= CMD_COLOR_08;
58915fb4814Smrg        break;
59015fb4814Smrg    case 15:
59115fb4814Smrg    case 16:
59215fb4814Smrg        cmdreg |= CMD_COLOR_16;
5937fe5393cSmrg        break;
59415fb4814Smrg    case 24:
59515fb4814Smrg    case 32:
59615fb4814Smrg        cmdreg |= CMD_COLOR_32;
5977fe5393cSmrg        break;
59815fb4814Smrg    }
5997fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
60015fb4814Smrg    pAST->ulCMDReg = cmdreg;
6017fe5393cSmrg
60215fb4814Smrg    if (!pAST->MMIO2D)
6037fe5393cSmrg    {
60415fb4814Smrg        /* Write to CMDQ */
605621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
60615fb4814Smrg
60715fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
60815fb4814Smrg        pSingleCMD++;
6097fe5393cSmrg        ASTSetupFG(pSingleCMD, color);
61015fb4814Smrg        pSingleCMD++;
61115fb4814Smrg        ASTSetupBG(pSingleCMD, 0);
6127fe5393cSmrg
613de78e416Smrg        /* Update Write Pointer */
6147fe5393cSmrg        mUpdateWritePointer;
6157fe5393cSmrg
61615fb4814Smrg    }
61715fb4814Smrg    else
61815fb4814Smrg    {
6197fe5393cSmrg        /* Write to MMIO */
6207fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
6217fe5393cSmrg        ASTSetupFG_MMIO(color);
6227fe5393cSmrg        ASTSetupBG_MMIO(0);
62315fb4814Smrg    }
6247fe5393cSmrg
62515fb4814Smrg} /* end of ASTSetupForSolidLine */
62615fb4814Smrg
62715fb4814Smrg
62815fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
62915fb4814Smrg                                          int x, int y, int len, int dir)
63015fb4814Smrg{
63115fb4814Smrg
63215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
63315fb4814Smrg    PKT_SC *pSingleCMD;
6347fe5393cSmrg    ULONG dstbase, cmdreg;
63515fb4814Smrg    int width, height;
636de78e416Smrg    int delta_y = 0;
6377fe5393cSmrg/*
63815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n");
63915fb4814Smrg*/
64015fb4814Smrg
641de78e416Smrg    if (len != 0)
642de78e416Smrg    {
643de78e416Smrg        /* Modify Reg. Value */
644de78e416Smrg        cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT;
645de78e416Smrg        if (pAST->EnableClip)
646de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
647de78e416Smrg        else
6487fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
649de78e416Smrg        dstbase = 0;
6507fe5393cSmrg
651de78e416Smrg        if(dir == DEGREES_0) {			/* horizontal */
652de78e416Smrg            width  = len;
6537fe5393cSmrg            height = 1;
654de78e416Smrg        } else {					/* vertical */
655de78e416Smrg            width  = 1;
6567fe5393cSmrg            height = len;
657de78e416Smrg        }
6587fe5393cSmrg
6597fe5393cSmrg        if ((y + height) >= pScrn->virtualY)
6607fe5393cSmrg        {
6617fe5393cSmrg            delta_y = y;
662de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y;
663de78e416Smrg            y=0;
664de78e416Smrg        }
6657fe5393cSmrg
6667fe5393cSmrg        if (pAST->EnableClip)
667de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
6687fe5393cSmrg
6697fe5393cSmrg        if (!pAST->MMIO2D)
6707fe5393cSmrg        {
6717fe5393cSmrg            /* Write to CMDQ */
672621ff18cSmrg            pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
6737fe5393cSmrg
674de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
6757fe5393cSmrg            pSingleCMD++;
676de78e416Smrg            ASTSetupDSTXY(pSingleCMD, x, y);
6777fe5393cSmrg            pSingleCMD++;
678de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
6797fe5393cSmrg            pSingleCMD++;
6807fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
6817fe5393cSmrg
682de78e416Smrg            /* Update Write Pointer */
683de78e416Smrg            mUpdateWritePointer;
6847fe5393cSmrg
685de78e416Smrg        }
686de78e416Smrg        else
6877fe5393cSmrg        {
688de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
689de78e416Smrg            ASTSetupDSTXY_MMIO(x, y);
690de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
6917fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
6927fe5393cSmrg
693621ff18cSmrg            vASTWaitEngIdle(pScrn, pAST);
6947fe5393cSmrg
695de78e416Smrg        }
6967fe5393cSmrg
697de78e416Smrg    } /* len check */
6987fe5393cSmrg
69915fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */
70015fb4814Smrg
70115fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
70215fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags)
70315fb4814Smrg{
7047fe5393cSmrg
70515fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
70615fb4814Smrg    PKT_SC 	*pSingleCMD;
70715fb4814Smrg    LINEPARAM   dsLineParam;
7087fe5393cSmrg    _LINEInfo   LineInfo;
70915fb4814Smrg    ULONG 	dstbase, ulCommand;
7107fe5393cSmrg    ULONG	miny, maxy;
71115fb4814Smrg    USHORT      usXM;
712de78e416Smrg    int delta_y = 0;
7137fe5393cSmrg
71415fb4814Smrg/*
71515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
7167fe5393cSmrg*/
71715fb4814Smrg
71815fb4814Smrg    /* Modify Reg. Value */
71915fb4814Smrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW;
72015fb4814Smrg    if(flags & OMIT_LAST)
72115fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
72215fb4814Smrg    else
72315fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
72415fb4814Smrg    if (pAST->EnableClip)
72515fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
726de78e416Smrg    else
7277fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
72815fb4814Smrg    dstbase = 0;
72915fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
73015fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
73115fb4814Smrg    if(maxy >= pScrn->virtualY) {
732de78e416Smrg    	delta_y = miny;
73315fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
73415fb4814Smrg        y1 -= miny;
73515fb4814Smrg        y2 -= miny;
73615fb4814Smrg    }
7377fe5393cSmrg
73815fb4814Smrg    LineInfo.X1 = x1;
73915fb4814Smrg    LineInfo.Y1 = y1;
74015fb4814Smrg    LineInfo.X2 = x2;
74115fb4814Smrg    LineInfo.Y2 = y2;
7427fe5393cSmrg
743621ff18cSmrg    bASTGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
7447fe5393cSmrg
7457fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
7467fe5393cSmrg        ulCommand |= CMD_X_DEC;
7477fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
7487fe5393cSmrg        ulCommand |= CMD_Y_DEC;
7497fe5393cSmrg
7507fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
7517fe5393cSmrg
7527fe5393cSmrg    if (pAST->EnableClip)
753de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
7547fe5393cSmrg
7557fe5393cSmrg    if (!pAST->MMIO2D)
7567fe5393cSmrg    {
7577fe5393cSmrg        /* Write to CMDQ */
758621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
75915fb4814Smrg
76015fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
7617fe5393cSmrg        pSingleCMD++;
76215fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
7637fe5393cSmrg        pSingleCMD++;
76415fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
7657fe5393cSmrg        pSingleCMD++;
76615fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
7677fe5393cSmrg        pSingleCMD++;
76815fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
7697fe5393cSmrg        pSingleCMD++;
77015fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
7717fe5393cSmrg        pSingleCMD++;
7727fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
7737fe5393cSmrg
77415fb4814Smrg        /* Update Write Pointer */
7757fe5393cSmrg        mUpdateWritePointer;
776de78e416Smrg
777de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
778621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
7797fe5393cSmrg
78015fb4814Smrg    }
78115fb4814Smrg    else
7827fe5393cSmrg    {
78315fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
78415fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
78515fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
78615fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
78715fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
78815fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
7897fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
7907fe5393cSmrg
791621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
7927fe5393cSmrg
79315fb4814Smrg    }
79415fb4814Smrg
7957fe5393cSmrg
79615fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */
79715fb4814Smrg
79815fb4814Smrg/* Dash Line */
79915fb4814Smrgstatic void
80015fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn,
80115fb4814Smrg                      int fg, int bg, int rop, unsigned int planemask,
80215fb4814Smrg                      int length, UCHAR *pattern)
80315fb4814Smrg{
80415fb4814Smrg
80515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
80615fb4814Smrg    PKT_SC *pSingleCMD;
80715fb4814Smrg    ULONG  cmdreg;
80815fb4814Smrg/*
80915fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n");
8107fe5393cSmrg*/
81115fb4814Smrg    /* Modify Reg. Value */
81215fb4814Smrg    cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE;
8137fe5393cSmrg
81415fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
81515fb4814Smrg    {
81615fb4814Smrg    case 8:
81715fb4814Smrg        cmdreg |= CMD_COLOR_08;
81815fb4814Smrg        break;
81915fb4814Smrg    case 15:
82015fb4814Smrg    case 16:
82115fb4814Smrg        cmdreg |= CMD_COLOR_16;
8227fe5393cSmrg        break;
82315fb4814Smrg    case 24:
82415fb4814Smrg    case 32:
82515fb4814Smrg        cmdreg |= CMD_COLOR_32;
8267fe5393cSmrg        break;
82715fb4814Smrg    }
8287fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
82915fb4814Smrg    if(bg == -1) {
8307fe5393cSmrg        cmdreg |= CMD_TRANSPARENT;
83115fb4814Smrg        bg = 0;
83215fb4814Smrg    }
83315fb4814Smrg    cmdreg |= (((length-1) & 0x3F) << 24);		/* line period */
83415fb4814Smrg    pAST->ulCMDReg = cmdreg;
8357fe5393cSmrg
83615fb4814Smrg    if (!pAST->MMIO2D)
8377fe5393cSmrg    {
83815fb4814Smrg        /* Write to CMDQ */
839621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
84015fb4814Smrg
84115fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
84215fb4814Smrg        pSingleCMD++;
8437fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
84415fb4814Smrg        pSingleCMD++;
8457fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
84615fb4814Smrg        pSingleCMD++;
84715fb4814Smrg        ASTSetupLineStyle1(pSingleCMD, *pattern);
84815fb4814Smrg        pSingleCMD++;
849de78e416Smrg        ASTSetupLineStyle2(pSingleCMD, *(pattern+4));
8507fe5393cSmrg
851de78e416Smrg        /* Update Write Pointer */
8527fe5393cSmrg        mUpdateWritePointer;
8537fe5393cSmrg
85415fb4814Smrg    }
85515fb4814Smrg    else
85615fb4814Smrg    {
8577fe5393cSmrg        /* Write to MMIO */
85815fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
8597fe5393cSmrg        ASTSetupFG_MMIO(fg);
8607fe5393cSmrg        ASTSetupBG_MMIO(bg);
86115fb4814Smrg        ASTSetupLineStyle1_MMIO(*pattern);
8627fe5393cSmrg        ASTSetupLineStyle2_MMIO(*(pattern+4));
86315fb4814Smrg
86415fb4814Smrg    }
8657fe5393cSmrg
86615fb4814Smrg}
86715fb4814Smrg
86815fb4814Smrgstatic void
86915fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
87015fb4814Smrg                                int x1, int y1, int x2, int y2,
87115fb4814Smrg                                int flags, int phase)
87215fb4814Smrg{
8737fe5393cSmrg
87415fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
87515fb4814Smrg    PKT_SC 	*pSingleCMD;
87615fb4814Smrg    LINEPARAM   dsLineParam;
8777fe5393cSmrg    _LINEInfo   LineInfo;
8787fe5393cSmrg    ULONG 	dstbase, ulCommand;
8797fe5393cSmrg    ULONG	miny, maxy;
88015fb4814Smrg    USHORT      usXM;
881de78e416Smrg    int delta_y = 0;
8827fe5393cSmrg
88315fb4814Smrg/*
88415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
8857fe5393cSmrg*/
88615fb4814Smrg
88715fb4814Smrg    /* Modify Reg. Value */
88815fb4814Smrg    ulCommand = pAST->ulCMDReg;
88915fb4814Smrg    if(flags & OMIT_LAST)
89015fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
89115fb4814Smrg    else
89215fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
89315fb4814Smrg    if (pAST->EnableClip)
89415fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
895de78e416Smrg    else
8967fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
8977fe5393cSmrg    dstbase = 0;
89815fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
89915fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
90015fb4814Smrg    if(maxy >= pScrn->virtualY) {
901de78e416Smrg    	delta_y = miny;
90215fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
90315fb4814Smrg        y1 -= miny;
90415fb4814Smrg        y2 -= miny;
90515fb4814Smrg    }
9067fe5393cSmrg
90715fb4814Smrg    LineInfo.X1 = x1;
90815fb4814Smrg    LineInfo.Y1 = y1;
90915fb4814Smrg    LineInfo.X2 = x2;
91015fb4814Smrg    LineInfo.Y2 = y2;
9117fe5393cSmrg
912621ff18cSmrg    bASTGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
9137fe5393cSmrg
9147fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
9157fe5393cSmrg        ulCommand |= CMD_X_DEC;
9167fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
9177fe5393cSmrg        ulCommand |= CMD_Y_DEC;
9187fe5393cSmrg
9197fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
9207fe5393cSmrg
9217fe5393cSmrg    if (pAST->EnableClip)
922de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
9237fe5393cSmrg
9247fe5393cSmrg    if (!pAST->MMIO2D)
9257fe5393cSmrg    {
9267fe5393cSmrg        /* Write to CMDQ */
927621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
92815fb4814Smrg
92915fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
9307fe5393cSmrg        pSingleCMD++;
93115fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
9327fe5393cSmrg        pSingleCMD++;
93315fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
9347fe5393cSmrg        pSingleCMD++;
93515fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
9367fe5393cSmrg        pSingleCMD++;
93715fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
9387fe5393cSmrg        pSingleCMD++;
93915fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
9407fe5393cSmrg        pSingleCMD++;
9417fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
9427fe5393cSmrg
94315fb4814Smrg        /* Update Write Pointer */
94415fb4814Smrg        mUpdateWritePointer;
945de78e416Smrg
946de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
947621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
9487fe5393cSmrg
94915fb4814Smrg    }
95015fb4814Smrg    else
9517fe5393cSmrg    {
95215fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
95315fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
95415fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
95515fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
95615fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
95715fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
9587fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
9597fe5393cSmrg
960621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
9617fe5393cSmrg
96215fb4814Smrg    }
9637fe5393cSmrg
96415fb4814Smrg}
96515fb4814Smrg
96615fb4814Smrg/* Mono Pattern Fill */
96715fb4814Smrgstatic void
96815fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
96915fb4814Smrg                           int patx, int paty, int fg, int bg,
97015fb4814Smrg                           int rop, unsigned int planemask)
97115fb4814Smrg{
9727fe5393cSmrg
97315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
97415fb4814Smrg    PKT_SC *pSingleCMD;
97515fb4814Smrg    ULONG cmdreg;
97615fb4814Smrg
9777fe5393cSmrg/*
97815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n");
9797fe5393cSmrg*/
98015fb4814Smrg    /* Modify Reg. Value */
98115fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK;
98215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
98315fb4814Smrg    {
98415fb4814Smrg    case 8:
98515fb4814Smrg        cmdreg |= CMD_COLOR_08;
98615fb4814Smrg        break;
98715fb4814Smrg    case 15:
98815fb4814Smrg    case 16:
98915fb4814Smrg        cmdreg |= CMD_COLOR_16;
9907fe5393cSmrg        break;
99115fb4814Smrg    case 24:
99215fb4814Smrg    case 32:
99315fb4814Smrg        cmdreg |= CMD_COLOR_32;
9947fe5393cSmrg        break;
99515fb4814Smrg    }
99615fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
99715fb4814Smrg    pAST->ulCMDReg = cmdreg;
9987fe5393cSmrg
9997fe5393cSmrg    if (!pAST->MMIO2D)
100015fb4814Smrg    {
100115fb4814Smrg        /* Write to CMDQ */
1002621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
100315fb4814Smrg
100415fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
100515fb4814Smrg        pSingleCMD++;
10067fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
100715fb4814Smrg        pSingleCMD++;
100815fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
100915fb4814Smrg        pSingleCMD++;
10107fe5393cSmrg        ASTSetupMONO1(pSingleCMD, patx);
101115fb4814Smrg        pSingleCMD++;
1012de78e416Smrg        ASTSetupMONO2(pSingleCMD, paty);
10137fe5393cSmrg
1014de78e416Smrg        /* Update Write Pointer */
1015de78e416Smrg        mUpdateWritePointer;
10167fe5393cSmrg
101715fb4814Smrg    }
101815fb4814Smrg    else
101915fb4814Smrg    {
102015fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
10217fe5393cSmrg        ASTSetupFG_MMIO(fg);
102215fb4814Smrg        ASTSetupBG_MMIO(bg);
10237fe5393cSmrg        ASTSetupMONO1_MMIO(patx);
10247fe5393cSmrg        ASTSetupMONO2_MMIO(paty);
102515fb4814Smrg    }
10267fe5393cSmrg
102715fb4814Smrg} /* end of ASTSetupForMonoPatternFill */
102815fb4814Smrg
10297fe5393cSmrg
103015fb4814Smrgstatic void
103115fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
103215fb4814Smrg                             int patx, int paty,
103315fb4814Smrg                             int dst_x, int dst_y, int width, int height)
103415fb4814Smrg{
103515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
103615fb4814Smrg    PKT_SC *pSingleCMD;
1037de78e416Smrg    ULONG dstbase, cmdreg;
1038de78e416Smrg    int delta_y = 0;
10397fe5393cSmrg
10407fe5393cSmrg/*
104115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n");
10427fe5393cSmrg*/
10437fe5393cSmrg
104415fb4814Smrg    /* Modify Reg. Value */
104515fb4814Smrg    cmdreg = pAST->ulCMDReg;
104615fb4814Smrg    if (pAST->EnableClip)
1047de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1048de78e416Smrg    else
10497fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
105015fb4814Smrg    dstbase = 0;
105115fb4814Smrg
10527fe5393cSmrg    if (dst_y >= pScrn->virtualY)
10537fe5393cSmrg    {
1054de78e416Smrg    	delta_y = dst_y;
105515fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
105615fb4814Smrg        dst_y=0;
105715fb4814Smrg    }
1058de78e416Smrg
10597fe5393cSmrg    if (pAST->EnableClip)
1060de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
10617fe5393cSmrg
10627fe5393cSmrg    if (!pAST->MMIO2D)
10637fe5393cSmrg    {
10647fe5393cSmrg        /* Write to CMDQ */
1065621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
106615fb4814Smrg
106715fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
10687fe5393cSmrg        pSingleCMD++;
106915fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
10707fe5393cSmrg        pSingleCMD++;
107115fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
10727fe5393cSmrg        pSingleCMD++;
10737fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
10747fe5393cSmrg
107515fb4814Smrg        /* Update Write Pointer */
107615fb4814Smrg        mUpdateWritePointer;
10777fe5393cSmrg
107815fb4814Smrg    }
107915fb4814Smrg    else
10807fe5393cSmrg    {
108115fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
108215fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
108315fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
10847fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
10857fe5393cSmrg
1086621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
10877fe5393cSmrg    }
108815fb4814Smrg
108915fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */
109015fb4814Smrg
109115fb4814Smrgstatic void
109215fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
109315fb4814Smrg			       int rop, unsigned int planemask, int trans_col)
109415fb4814Smrg{
10957fe5393cSmrg
109615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
109715fb4814Smrg    PKT_SC *pSingleCMD;
109815fb4814Smrg    ULONG cmdreg;
109915fb4814Smrg    CARD32 *pataddr;
110015fb4814Smrg    ULONG ulPatSize;
110115fb4814Smrg    int i, j, cpp;
11027fe5393cSmrg/*
110315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n");
11047fe5393cSmrg*/
110515fb4814Smrg    /* Modify Reg. Value */
110615fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_PATREG;
110715fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
110815fb4814Smrg    {
110915fb4814Smrg    case 8:
111015fb4814Smrg        cmdreg |= CMD_COLOR_08;
111115fb4814Smrg        break;
111215fb4814Smrg    case 15:
111315fb4814Smrg    case 16:
111415fb4814Smrg        cmdreg |= CMD_COLOR_16;
11157fe5393cSmrg        break;
111615fb4814Smrg    case 24:
111715fb4814Smrg    case 32:
111815fb4814Smrg        cmdreg |= CMD_COLOR_32;
11197fe5393cSmrg        break;
112015fb4814Smrg    }
112115fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
112215fb4814Smrg    pAST->ulCMDReg = cmdreg;
112315fb4814Smrg    cpp = (pScrn->bitsPerPixel + 1) / 8;
112415fb4814Smrg    pataddr = (CARD32 *)(pAST->FBVirtualAddr +
11257fe5393cSmrg                        (paty * pAST->VideoModeInfo.ScreenPitch) + (patx * cpp));
112615fb4814Smrg    ulPatSize = 8*8*cpp;
11277fe5393cSmrg
11287fe5393cSmrg    if (!pAST->MMIO2D)
112915fb4814Smrg    {
11307fe5393cSmrg        /* Write to CMDQ */
1131621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4));
113215fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
113315fb4814Smrg        pSingleCMD++;
113415fb4814Smrg        for (i=0; i<8; i++)
113515fb4814Smrg        {
113615fb4814Smrg            for (j=0; j<8*cpp/4; j++)
113715fb4814Smrg            {
113815fb4814Smrg                ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++)));
11397fe5393cSmrg                pSingleCMD++;
11407fe5393cSmrg            }
1141de78e416Smrg        }
11427fe5393cSmrg
1143de78e416Smrg        /* Update Write Pointer */
1144de78e416Smrg        mUpdateWritePointer;
11457fe5393cSmrg
114615fb4814Smrg    }
114715fb4814Smrg    else
11487fe5393cSmrg    {
114915fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
115015fb4814Smrg        for (i=0; i<8; i++)
115115fb4814Smrg        {
115215fb4814Smrg            for (j=0; j<8*cpp/4; j++)
115315fb4814Smrg            {
115415fb4814Smrg                ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++)));
11557fe5393cSmrg            }
11567fe5393cSmrg        }
11577fe5393cSmrg
115815fb4814Smrg    }
115915fb4814Smrg
116015fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */
11617fe5393cSmrg
116215fb4814Smrgstatic void
116315fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
116415fb4814Smrg                                     int dst_x, int dst_y, int width, int height)
116515fb4814Smrg{
116615fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
116715fb4814Smrg    PKT_SC *pSingleCMD;
1168de78e416Smrg    ULONG dstbase, cmdreg;
1169de78e416Smrg    int delta_y = 0;
11707fe5393cSmrg
11717fe5393cSmrg/*
117215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n");
117315fb4814Smrg*/
11747fe5393cSmrg
117515fb4814Smrg    /* Modify Reg. Value */
117615fb4814Smrg    cmdreg = pAST->ulCMDReg;
117715fb4814Smrg    if (pAST->EnableClip)
1178de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1179de78e416Smrg    else
11807fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
118115fb4814Smrg    dstbase = 0;
118215fb4814Smrg
11837fe5393cSmrg    if (dst_y >= pScrn->virtualY)
11847fe5393cSmrg    {
1185de78e416Smrg    	delta_y = dst_y;
118615fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
118715fb4814Smrg        dst_y=0;
118815fb4814Smrg    }
1189de78e416Smrg
11907fe5393cSmrg    if (pAST->EnableClip)
1191de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
11927fe5393cSmrg
11937fe5393cSmrg    if (!pAST->MMIO2D)
11947fe5393cSmrg    {
11957fe5393cSmrg        /* Write to CMDQ */
1196621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
119715fb4814Smrg
119815fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
11997fe5393cSmrg        pSingleCMD++;
120015fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
12017fe5393cSmrg        pSingleCMD++;
120215fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
12037fe5393cSmrg        pSingleCMD++;
12047fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
12057fe5393cSmrg
120615fb4814Smrg        /* Update Write Pointer */
120715fb4814Smrg        mUpdateWritePointer;
12087fe5393cSmrg
120915fb4814Smrg    }
121015fb4814Smrg    else
12117fe5393cSmrg    {
121215fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
121315fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
121415fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
12157fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
12167fe5393cSmrg
1217621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
12187fe5393cSmrg    }
12197fe5393cSmrg
122015fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */
122115fb4814Smrg
122215fb4814Smrg/* CPU to Screen Expand */
122315fb4814Smrgstatic void
122415fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
122515fb4814Smrg                                      int fg, int bg,
122615fb4814Smrg                                      int rop, unsigned int planemask)
122715fb4814Smrg{
122815fb4814Smrg
122915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
123015fb4814Smrg    PKT_SC *pSingleCMD;
123115fb4814Smrg    ULONG cmdreg;
123215fb4814Smrg
12337fe5393cSmrg/*
123415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n");
12357fe5393cSmrg*/
123615fb4814Smrg    /* Modify Reg. Value */
123715fb4814Smrg    cmdreg = CMD_COLOREXP;
123815fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
123915fb4814Smrg    {
124015fb4814Smrg    case 8:
124115fb4814Smrg        cmdreg |= CMD_COLOR_08;
124215fb4814Smrg        break;
124315fb4814Smrg    case 15:
124415fb4814Smrg    case 16:
124515fb4814Smrg        cmdreg |= CMD_COLOR_16;
12467fe5393cSmrg        break;
124715fb4814Smrg    case 24:
124815fb4814Smrg    case 32:
124915fb4814Smrg        cmdreg |= CMD_COLOR_32;
12507fe5393cSmrg        break;
125115fb4814Smrg    }
125215fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
125315fb4814Smrg    if(bg == -1) {
12547fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
125515fb4814Smrg        bg = 0;
12567fe5393cSmrg    }
125715fb4814Smrg    pAST->ulCMDReg = cmdreg;
12587fe5393cSmrg
12597fe5393cSmrg    if (!pAST->MMIO2D)
126015fb4814Smrg    {
126115fb4814Smrg        /* Write to CMDQ */
1262621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
126315fb4814Smrg
126415fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
126515fb4814Smrg        pSingleCMD++;
12667fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
126715fb4814Smrg        pSingleCMD++;
12687fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1269de78e416Smrg
1270de78e416Smrg        /* Update Write Pointer */
1271de78e416Smrg        mUpdateWritePointer;
12727fe5393cSmrg
127315fb4814Smrg    }
127415fb4814Smrg    else
127515fb4814Smrg    {
127615fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
12777fe5393cSmrg        ASTSetupFG_MMIO(fg);
12787fe5393cSmrg        ASTSetupBG_MMIO(bg);
12797fe5393cSmrg
128015fb4814Smrg    }
12817fe5393cSmrg
128215fb4814Smrg}
12837fe5393cSmrg
128415fb4814Smrgstatic void
128515fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
128615fb4814Smrg                                        int dst_x, int dst_y,
128715fb4814Smrg                                        int width, int height, int offset)
128815fb4814Smrg{
128915fb4814Smrg
129015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
129115fb4814Smrg    PKT_SC *pSingleCMD;
129215fb4814Smrg    ULONG dstbase, cmdreg;
1293de78e416Smrg    int delta_y = 0;
129415fb4814Smrg
12957fe5393cSmrg/*
129615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n");
129715fb4814Smrg*/
12987fe5393cSmrg
129915fb4814Smrg    /* Modify Reg. Value */
130015fb4814Smrg    cmdreg = pAST->ulCMDReg;
130115fb4814Smrg    if (pAST->EnableClip)
1302de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1303de78e416Smrg    else
13047fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
130515fb4814Smrg    dstbase = 0;
130615fb4814Smrg
13077fe5393cSmrg    if (dst_y >= pScrn->virtualY)
13087fe5393cSmrg    {
1309de78e416Smrg    	delta_y = dst_y;
131015fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
131115fb4814Smrg        dst_y=0;
131215fb4814Smrg    }
1313de78e416Smrg
13147fe5393cSmrg    if (pAST->EnableClip)
1315de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
13167fe5393cSmrg
13177fe5393cSmrg    if (!pAST->MMIO2D)
13187fe5393cSmrg    {
13197fe5393cSmrg        /* Write to CMDQ */
1320621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
132115fb4814Smrg
13227fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, ((width+7)/8));
13237fe5393cSmrg        pSingleCMD++;
132415fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
13257fe5393cSmrg        pSingleCMD++;
132615fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
13277fe5393cSmrg        pSingleCMD++;
132815fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
13297fe5393cSmrg        pSingleCMD++;
13307fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
13317fe5393cSmrg
133215fb4814Smrg        /* Update Write Pointer */
133315fb4814Smrg        mUpdateWritePointer;
13347fe5393cSmrg
133515fb4814Smrg    }
133615fb4814Smrg    else
13377fe5393cSmrg    {
13387fe5393cSmrg        ASTSetupSRCPitch_MMIO((width+7)/8);
133915fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
134015fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
134115fb4814Smrg        ASTSetupSRCXY_MMIO(0, 0);
13427fe5393cSmrg
134315fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
13447fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
13457fe5393cSmrg
1346621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
13477fe5393cSmrg
134815fb4814Smrg    }
13497fe5393cSmrg
135015fb4814Smrg}
135115fb4814Smrg
135215fb4814Smrg
135315fb4814Smrg/* Screen to Screen Color Expand */
135415fb4814Smrgstatic void
135515fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
135615fb4814Smrg                                         int fg, int bg,
135715fb4814Smrg                                         int rop, unsigned int planemask)
135815fb4814Smrg{
135915fb4814Smrg
136015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
136115fb4814Smrg    PKT_SC *pSingleCMD;
136215fb4814Smrg    ULONG cmdreg;
136315fb4814Smrg
13647fe5393cSmrg/*
136515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n");
136615fb4814Smrg*/
13677fe5393cSmrg
136815fb4814Smrg    /* Modify Reg. Value */
136915fb4814Smrg    cmdreg = CMD_ENHCOLOREXP;
137015fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
137115fb4814Smrg    {
137215fb4814Smrg    case 8:
137315fb4814Smrg        cmdreg |= CMD_COLOR_08;
137415fb4814Smrg        break;
137515fb4814Smrg    case 15:
137615fb4814Smrg    case 16:
137715fb4814Smrg        cmdreg |= CMD_COLOR_16;
13787fe5393cSmrg        break;
137915fb4814Smrg    case 24:
138015fb4814Smrg    case 32:
138115fb4814Smrg        cmdreg |= CMD_COLOR_32;
13827fe5393cSmrg        break;
138315fb4814Smrg    }
138415fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
138515fb4814Smrg    if(bg == -1) {
13867fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
138715fb4814Smrg        bg = 0;
13887fe5393cSmrg    }
138915fb4814Smrg    pAST->ulCMDReg = cmdreg;
13907fe5393cSmrg
13917fe5393cSmrg    if (!pAST->MMIO2D)
139215fb4814Smrg    {
139315fb4814Smrg        /* Write to CMDQ */
1394621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
139515fb4814Smrg
139615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
139715fb4814Smrg        pSingleCMD++;
13987fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
139915fb4814Smrg        pSingleCMD++;
14007fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1401de78e416Smrg
1402de78e416Smrg        /* Update Write Pointer */
1403de78e416Smrg        mUpdateWritePointer;
14047fe5393cSmrg
140515fb4814Smrg    }
140615fb4814Smrg    else
140715fb4814Smrg    {
140815fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
14097fe5393cSmrg        ASTSetupFG_MMIO(fg);
14107fe5393cSmrg        ASTSetupBG_MMIO(bg);
14117fe5393cSmrg
141215fb4814Smrg    }
14137fe5393cSmrg
141415fb4814Smrg}
141515fb4814Smrg
141615fb4814Smrg
141715fb4814Smrg
141815fb4814Smrgstatic void
141915fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
142015fb4814Smrg                                           int dst_x, int dst_y, int width, int height,
142115fb4814Smrg                                           int src_x, int src_y, int offset)
142215fb4814Smrg{
142315fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
142415fb4814Smrg    PKT_SC *pSingleCMD;
142515fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
142615fb4814Smrg    USHORT srcpitch;
1427de78e416Smrg    int delta_y = 0;
142815fb4814Smrg
14297fe5393cSmrg/*
143015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n");
143115fb4814Smrg*/
14327fe5393cSmrg
143315fb4814Smrg    /* Modify Reg. Value */
143415fb4814Smrg    cmdreg = pAST->ulCMDReg;
143515fb4814Smrg    if (pAST->EnableClip)
1436de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1437de78e416Smrg    else
14387fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
143915fb4814Smrg    dstbase = 0;
14407fe5393cSmrg    if (dst_y >= pScrn->virtualY)
14417fe5393cSmrg    {
1442de78e416Smrg    	delta_y = dst_y;
144315fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
144415fb4814Smrg        dst_y=0;
144515fb4814Smrg    }
14467fe5393cSmrg    srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x;
144715fb4814Smrg    srcpitch = (pScrn->displayWidth+7)/8;
1448de78e416Smrg
14497fe5393cSmrg    if (pAST->EnableClip)
1450de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
14517fe5393cSmrg
14527fe5393cSmrg    if (!pAST->MMIO2D)
14537fe5393cSmrg    {
14547fe5393cSmrg        /* Write to CMDQ */
1455621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
145615fb4814Smrg
145715fb4814Smrg        ASTSetupSRCBase(pSingleCMD, srcbase);
14587fe5393cSmrg        pSingleCMD++;
14597fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD,srcpitch);
14607fe5393cSmrg        pSingleCMD++;
146115fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
14627fe5393cSmrg        pSingleCMD++;
146315fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
14647fe5393cSmrg        pSingleCMD++;
146515fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
14667fe5393cSmrg        pSingleCMD++;
14677fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
14687fe5393cSmrg
146915fb4814Smrg        /* Update Write Pointer */
147015fb4814Smrg        mUpdateWritePointer;
14717fe5393cSmrg
147215fb4814Smrg    }
147315fb4814Smrg    else
14747fe5393cSmrg    {
14757fe5393cSmrg        ASTSetupSRCBase_MMIO(srcbase);
14767fe5393cSmrg        ASTSetupSRCPitch_MMIO(srcpitch);
147715fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
147815fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
147915fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
14807fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
14817fe5393cSmrg
1482621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
14837fe5393cSmrg
148415fb4814Smrg    }
14857fe5393cSmrg
148615fb4814Smrg}
148715fb4814Smrg
14887fe5393cSmrg
148915fb4814Smrg/* Clipping */
149015fb4814Smrgstatic void
1491de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y)
149215fb4814Smrg{
149315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
149415fb4814Smrg    PKT_SC *pSingleCMD;
1495de78e416Smrg
14967fe5393cSmrg    if (!pAST->MMIO2D)
149715fb4814Smrg    {
149815fb4814Smrg        /* Write to CMDQ */
1499621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
150015fb4814Smrg
1501de78e416Smrg        ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y);
150215fb4814Smrg        pSingleCMD++;
1503de78e416Smrg        ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
15047fe5393cSmrg
1505de78e416Smrg        /* Update Write Pointer */
1506de78e416Smrg        mUpdateWritePointer;
15077fe5393cSmrg
150815fb4814Smrg    }
150915fb4814Smrg    else
151015fb4814Smrg    {
1511de78e416Smrg        ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y);
15127fe5393cSmrg        ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
151315fb4814Smrg    }
15147fe5393cSmrg
15157fe5393cSmrg}
1516de78e416Smrg
1517de78e416Smrgstatic void
1518de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn,
1519de78e416Smrg                        int left, int top, int right, int bottom)
1520de78e416Smrg{
15217fe5393cSmrg
1522de78e416Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
1523de78e416Smrg    PKT_SC *pSingleCMD;
15247fe5393cSmrg/*
1525de78e416Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n");
15267fe5393cSmrg*/
1527de78e416Smrg    pAST->EnableClip = TRUE;
15287fe5393cSmrg
1529de78e416Smrg    pAST->clip_left   = left;
1530de78e416Smrg    pAST->clip_top    = top;
1531de78e416Smrg    pAST->clip_right  = right;
1532de78e416Smrg    pAST->clip_bottom = bottom;
15337fe5393cSmrg
153415fb4814Smrg}
153515fb4814Smrg
153615fb4814Smrgstatic void
153715fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn)
153815fb4814Smrg{
153915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
15407fe5393cSmrg/*
154115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n");
15427fe5393cSmrg*/
154315fb4814Smrg    pAST->EnableClip = FALSE;
154415fb4814Smrg}
154515fb4814Smrg
1546b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1547b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags)
1548b410ddbeSmrg{
15497fe5393cSmrg
1550b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1551b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1552b410ddbeSmrg    ULONG 	dstbase, ulCommand;
15537fe5393cSmrg    ULONG	miny, maxy;
1554b410ddbeSmrg/*
1555b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
15567fe5393cSmrg*/
1557b410ddbeSmrg
1558b410ddbeSmrg    /* Modify Reg. Value */
1559b410ddbeSmrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE;
1560b410ddbeSmrg    if(flags & OMIT_LAST)
1561b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1562b410ddbeSmrg    else
1563b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1564b410ddbeSmrg    if (pAST->EnableClip)
1565b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1566b410ddbeSmrg    else
15677fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1568b410ddbeSmrg    dstbase = 0;
1569b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1570b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1571b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1572b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1573b410ddbeSmrg        y1 -= miny;
1574b410ddbeSmrg        y2 -= miny;
1575b410ddbeSmrg    }
1576b410ddbeSmrg
15777fe5393cSmrg    if (!pAST->MMIO2D)
15787fe5393cSmrg    {
15797fe5393cSmrg        /* Write to CMDQ */
1580621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1581b410ddbeSmrg
1582b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
15837fe5393cSmrg        pSingleCMD++;
1584b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1585b410ddbeSmrg        pSingleCMD++;
1586b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1587b410ddbeSmrg        pSingleCMD++;
1588b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
15897fe5393cSmrg        pSingleCMD++;
15907fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
15917fe5393cSmrg
1592b410ddbeSmrg        /* Update Write Pointer */
15937fe5393cSmrg        mUpdateWritePointer;
1594b410ddbeSmrg
1595b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1596621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
15977fe5393cSmrg
1598b410ddbeSmrg    }
1599b410ddbeSmrg    else
16007fe5393cSmrg    {
1601b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1602b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1603b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1604b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
16057fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16067fe5393cSmrg
1607621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
16087fe5393cSmrg
1609b410ddbeSmrg    }
1610b410ddbeSmrg
16117fe5393cSmrg
1612b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */
1613b410ddbeSmrg
1614b410ddbeSmrgstatic void
1615b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
1616b410ddbeSmrg                                int x1, int y1, int x2, int y2,
1617b410ddbeSmrg                                int flags, int phase)
1618b410ddbeSmrg{
16197fe5393cSmrg
1620b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1621b410ddbeSmrg    PKT_SC 	*pSingleCMD;
16227fe5393cSmrg    ULONG 	dstbase, ulCommand;
16237fe5393cSmrg    ULONG	miny, maxy;
1624b410ddbeSmrg/*
1625b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
16267fe5393cSmrg*/
1627b410ddbeSmrg
1628b410ddbeSmrg    /* Modify Reg. Value */
1629b410ddbeSmrg    ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE;
1630b410ddbeSmrg    if(flags & OMIT_LAST)
1631b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1632b410ddbeSmrg    else
1633b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1634b410ddbeSmrg    if (pAST->EnableClip)
1635b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1636b410ddbeSmrg    else
16377fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
16387fe5393cSmrg    dstbase = 0;
1639b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1640b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1641b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1642b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1643b410ddbeSmrg        y1 -= miny;
1644b410ddbeSmrg        y2 -= miny;
1645b410ddbeSmrg    }
1646b410ddbeSmrg
16477fe5393cSmrg    if (!pAST->MMIO2D)
16487fe5393cSmrg    {
16497fe5393cSmrg        /* Write to CMDQ */
1650621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1651b410ddbeSmrg
1652b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
16537fe5393cSmrg        pSingleCMD++;
1654b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1655b410ddbeSmrg        pSingleCMD++;
1656b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1657b410ddbeSmrg        pSingleCMD++;
1658b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
16597fe5393cSmrg        pSingleCMD++;
16607fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
16617fe5393cSmrg
1662b410ddbeSmrg        /* Update Write Pointer */
1663b410ddbeSmrg        mUpdateWritePointer;
1664b410ddbeSmrg
1665b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1666621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
16677fe5393cSmrg
1668b410ddbeSmrg    }
1669b410ddbeSmrg    else
16707fe5393cSmrg    {
1671b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1672b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1673b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1674b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1675b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16767fe5393cSmrg
1677621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
16787fe5393cSmrg
1679b410ddbeSmrg    }
16807fe5393cSmrg
1681b410ddbeSmrg}
16827fe5393cSmrg#endif	/* HAVE_XAA_H */
1683b410ddbeSmrg
1684b534f209Smrg#ifdef	AstVideo
1685b534f209Smrg/*
1686b534f209Smrg * Video Part
1687b534f209Smrg * by ic_yang
1688b534f209Smrg */
1689b534f209Smrg#include "fourcc.h"
1690b534f209Smrg
1691b534f209Smrgvoid ASTDisplayVideo(ScrnInfoPtr pScrn, ASTPortPrivPtr pPriv, RegionPtr clipBoxes, int id)
1692b534f209Smrg{
1693b534f209Smrg    ASTPtr              pAST = ASTPTR(pScrn);
16947fe5393cSmrg    int                 nBoxs;
1695b534f209Smrg    int                 ScaleFactorH, ScaleFactorV;
1696b534f209Smrg    ULONG               InitScaleFactorH, InitScaleFactorV;
1697b534f209Smrg    BURSTSCALECMD       CopyCmd = {0};
1698b534f209Smrg    PBURSTSCALECMD      pCopyCmd = NULL;
1699b534f209Smrg    float               fScaleX = 0, fScaleY = 0;
1700b534f209Smrg    xRectangle          rect;
1701b534f209Smrg    BoxPtr              pBox = NULL;
1702b534f209Smrg    short               lSrcX, lSrcY;
1703b534f209Smrg    ULONG               dwCmd = 0;
1704b534f209Smrg    int                 i;
17057fe5393cSmrg
1706b534f209Smrg    pBox = REGION_RECTS(clipBoxes);
1707b534f209Smrg    nBoxs = REGION_NUM_RECTS(clipBoxes);
1708b534f209Smrg
1709b534f209Smrg    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MMIO=%x,pBox=%x, nBoxs=%x\n", pAST->MMIO2D, pBox, nBoxs);
17107fe5393cSmrg
1711b534f209Smrg    if(0==pPriv->drw_w || 0==pPriv->drw_h)
1712b534f209Smrg    {
1713b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drwx=%x, drwy=%x\n", pPriv->drw_w, pPriv->drw_h);
1714b534f209Smrg        return;
1715b534f209Smrg    }
1716b534f209Smrg
1717b534f209Smrg    /* calc scaling factor */
1718b534f209Smrg    fScaleX = (float)pPriv->src_w /(float)pPriv->drw_w;
1719b534f209Smrg    fScaleY = (float)pPriv->src_h /(float)pPriv->drw_h;
17207fe5393cSmrg
1721b534f209Smrg    if (pPriv->src_w == pPriv->drw_w)
1722b534f209Smrg        ScaleFactorH = 0x8000;
1723b534f209Smrg    else
1724b534f209Smrg        ScaleFactorH = (ULONG)((pPriv->src_w-1)*0x8000)/pPriv->drw_w;
1725b534f209Smrg
1726b534f209Smrg    if (pPriv->src_h == pPriv->drw_h)
1727b534f209Smrg    {
1728b534f209Smrg        ScaleFactorV = 0x8000;
1729b534f209Smrg		dwCmd |= SCALE_EQUAL_VER; /* Setting it save the bandwidtch */
1730b534f209Smrg   	}
1731b534f209Smrg    else
1732b534f209Smrg   	{
1733b534f209Smrg        ScaleFactorV = (ULONG)((pPriv->src_h-1)*0x8000)/pPriv->drw_h;
1734b534f209Smrg    }
1735b534f209Smrg
1736b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1737b534f209Smrg        InitScaleFactorH = 0;
1738b534f209Smrg    else
1739b534f209Smrg        InitScaleFactorH = 0x4000;
1740b534f209Smrg
1741b534f209Smrg    if (pPriv->drw_h >= pPriv->src_h)
1742b534f209Smrg        InitScaleFactorV = 0;
1743b534f209Smrg    else
1744b534f209Smrg        InitScaleFactorV = 0x4000;
1745b534f209Smrg
17467fe5393cSmrg    switch(pScrn->bitsPerPixel)
1747b534f209Smrg    {
1748b534f209Smrg    case 32:
1749b534f209Smrg        dwCmd   = CMD_COLOR_32;
1750b534f209Smrg        break;
1751b534f209Smrg    case 16:
1752b534f209Smrg        dwCmd   = CMD_COLOR_16;
1753b534f209Smrg        break;
1754b534f209Smrg    case  8:
1755b534f209Smrg        dwCmd   = CMD_COLOR_08;
1756b534f209Smrg        break;
1757b534f209Smrg    }
1758b534f209Smrg
1759b534f209Smrg    dwCmd |= CMD_TYPE_SCALE;
1760b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1761b534f209Smrg        dwCmd |= SCALE_SEG_NUM_1;
1762b534f209Smrg    else
1763b534f209Smrg        dwCmd |= SCALE_SEG_NUM_2;
1764b534f209Smrg
1765b534f209Smrg    dwCmd |= SCALE_FORMAT_YUV2RGB;
1766b534f209Smrg    switch(id)
1767b534f209Smrg    {
1768b534f209Smrg    case PIXEL_FMT_YUY2:
17697fe5393cSmrg        dwCmd |= YUV_FORMAT_YUYV;
1770b534f209Smrg        break;
17717fe5393cSmrg    case PIXEL_FMT_UYVY:
17727fe5393cSmrg        dwCmd |= YUV_FORMAT_UYVY;
1773b534f209Smrg        break;
1774b534f209Smrg    default:
1775b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Other pix format:%x\n", id);
1776b534f209Smrg        break;
1777b534f209Smrg    }
17787fe5393cSmrg
1779b534f209Smrg    for(i = 0; i < nBoxs; i++, pBox++)
1780b534f209Smrg    {
1781b534f209Smrg        rect.x = pBox->x1 - pPriv->drw_x;
1782b534f209Smrg        rect.y = pBox->y1 - pPriv->drw_y;
1783b534f209Smrg        rect.width = pBox->x2 - pBox->x1;
17847fe5393cSmrg        rect.height = pBox->y2 - pBox->y1;
17857fe5393cSmrg
1786b534f209Smrg        lSrcX = (ULONG)((float)rect.x * fScaleX + pPriv->src_x + 0.5f);
1787b534f209Smrg        lSrcY = (ULONG)((float)rect.y * fScaleY + pPriv->src_y + 0.5f);
17887fe5393cSmrg
1789621ff18cSmrg        pCopyCmd = (BURSTSCALECMD*)pASTjRequestCMDQ(pAST, PKT_TYPESCALE_LENGTH);
17907fe5393cSmrg
17917fe5393cSmrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pCopyCmd=%p, pBox=%x,%x,%x,%x\n", pCopyCmd, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
17927fe5393cSmrg
1793b534f209Smrg        CopyCmd.dwHeader0        = (ULONG)  PKT_BURST_CMD_HEADER0 |
1794b534f209Smrg                                             PKT_TYPESCALE_DATALENGTH |
1795b534f209Smrg                                             PKT_TYPESCALE_ADDRSTART  |
1796b534f209Smrg                                             BURST_FORCE_CMD;
1797b534f209Smrg
1798b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CopyCmd.dwHeader0=%x\n", CopyCmd.dwHeader0);
1799b534f209Smrg
1800b534f209Smrg        CopyCmd.dwSrcPitch       = (ULONG)(pPriv->srcPitch << 16);
18017fe5393cSmrg
1802b534f209Smrg        CopyCmd.dwDstHeightPitch = (ULONG)  ((pAST->VideoModeInfo.ScreenPitch << 16) | 0xFFFF);
18037fe5393cSmrg
18047fe5393cSmrg        CopyCmd.dwDstXY          = (ULONG) ((pBox->x1 << 16) | (pBox->y1 & 0xFFFF));
18057fe5393cSmrg        CopyCmd.dwSrcXY          = (ULONG) ((lSrcX << 16) | (lSrcY & 0xFFFF));
18067fe5393cSmrg        CopyCmd.dwRecHeightWidth = (ULONG) ((rect.width << 16) | rect.height);
18077fe5393cSmrg
1808b534f209Smrg        CopyCmd.dwInitScaleFactorH = InitScaleFactorH;
1809b534f209Smrg        CopyCmd.dwInitScaleFactorV = InitScaleFactorV;
18107fe5393cSmrg        CopyCmd.dwScaleFactorH   = ScaleFactorH;
1811b534f209Smrg        CopyCmd.dwScaleFactorV   = ScaleFactorV;
1812b534f209Smrg
1813b534f209Smrg        CopyCmd.dwSrcBaseAddr = pPriv->bufAddr[pPriv->currentBuf];
1814b534f209Smrg        CopyCmd.dwDstBaseAddr = 0;
1815b534f209Smrg        CopyCmd.dwCmd = dwCmd;
1816b534f209Smrg        CopyCmd.NullData[0] = 0;    /* for alignment */
1817b534f209Smrg        memcpy(pCopyCmd, &CopyCmd, sizeof(CopyCmd));
18187fe5393cSmrg
1819b534f209Smrg        mUpdateWritePointer;
18207fe5393cSmrg
18217fe5393cSmrg#if 0
1822b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1823b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8000),
1824b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8004),
1825b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8008),
1826b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x800C));
1827b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1828b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8010),
1829b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8014),
1830b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8018),
1831b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x801C));
1832b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1833b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8020),
1834b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8024),
1835b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8028),
1836b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x802C));
1837b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1838b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8030),
1839b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8034),
1840b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8038),
1841b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x803C));
1842b534f209Smrg#endif
1843b534f209Smrg
1844b534f209Smrg    } /* End of for-loop */
18457fe5393cSmrg
1846b534f209Smrg} /* ASTDisplayVideo */
1847b534f209Smrg#endif	/* AstVideo */
1848b534f209Smrg
184915fb4814Smrg#endif	/* end of Accel_2D */
1850