ast_accel.c revision 621ff18c
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
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/* Prototype type declaration */
10415fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn);
1057fe5393cSmrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
10615fb4814Smrg                                          int xdir, int ydir, int rop,
10715fb4814Smrg                                          unsigned int planemask, int trans_color);
10815fb4814Smrgstatic void ASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
1097fe5393cSmrg                                            int y2, int w, int h);
11015fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn,
11115fb4814Smrg                                 int color, int rop, unsigned int planemask);
11215fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
1137fe5393cSmrg                                       int dst_x, int dst_y, int width, int height);
11415fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
11515fb4814Smrg                                 int color, int rop, unsigned int planemask);
11615fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
11715fb4814Smrg                                          int x, int y, int len, int dir);
11815fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1197fe5393cSmrg                                           int x1, int y1, int x2, int y2, int flags);
12015fb4814Smrgstatic void ASTSetupForDashedLine(ScrnInfoPtr pScrn,
12115fb4814Smrg                                  int fg, int bg, int rop, unsigned int planemask,
12215fb4814Smrg                                  int length, UCHAR *pattern);
12315fb4814Smrgstatic void ASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
12415fb4814Smrg                                            int x1, int y1, int x2, int y2,
1257fe5393cSmrg                                            int flags, int phase);
12615fb4814Smrgstatic void ASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
12715fb4814Smrg                                       int patx, int paty, int fg, int bg,
12815fb4814Smrg                                       int rop, unsigned int planemask);
12915fb4814Smrgstatic void ASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
13015fb4814Smrg                                         int patx, int paty,
13115fb4814Smrg                                         int x, int y, int w, int h);
13215fb4814Smrgstatic void ASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
13315fb4814Smrg			                   int rop, unsigned int planemask, int trans_col);
13415fb4814Smrgstatic void ASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
13515fb4814Smrg                                                 int x, int y, int w, int h);
13615fb4814Smrgstatic void ASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
13715fb4814Smrg                                                  int fg, int bg,
13815fb4814Smrg                                                  int rop, unsigned int planemask);
13915fb4814Smrgstatic void ASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
14015fb4814Smrg                                                    int x, int y,
14115fb4814Smrg                                                    int width, int height, int skipleft);
14215fb4814Smrgstatic void ASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14315fb4814Smrg                                                     int fg, int bg,
14415fb4814Smrg                                                     int rop, unsigned int planemask);
14515fb4814Smrgstatic void ASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
14615fb4814Smrg                                                       int x, int y, int width, int height,
14715fb4814Smrg                                                       int src_x, int src_y, int offset);
14815fb4814Smrgstatic void ASTSetClippingRectangle(ScrnInfoPtr pScrn,
14915fb4814Smrg                                    int left, int top, int right, int bottom);
1507fe5393cSmrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn);
151de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y);
15215fb4814Smrg
153b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1547fe5393cSmrg                                           int x1, int y1, int x2, int y2, int flags);
155b410ddbeSmrgstatic void AIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
156b410ddbeSmrg                                            int x1, int y1, int x2, int y2,
157b410ddbeSmrg                                            int flags, int phase);
158b410ddbeSmrg
15915fb4814SmrgBool
16015fb4814SmrgASTAccelInit(ScreenPtr pScreen)
16115fb4814Smrg{
16215fb4814Smrg    XAAInfoRecPtr  infoPtr;
163b4d38c65Smrg    ScrnInfoPtr    pScrn = xf86ScreenToScrn(pScreen);
16415fb4814Smrg    ASTRecPtr      pAST = ASTPTR(pScrn);
16515fb4814Smrg
16615fb4814Smrg    pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec();
16715fb4814Smrg    if (!infoPtr)  return FALSE;
16815fb4814Smrg
16915fb4814Smrg    infoPtr->Flags = LINEAR_FRAMEBUFFER |
17015fb4814Smrg  		     OFFSCREEN_PIXMAPS |
17115fb4814Smrg  		     PIXMAP_CACHE;
17215fb4814Smrg
17315fb4814Smrg    /* Sync */
17415fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Sync)
17515fb4814Smrg        infoPtr->Sync = ASTSync;
17615fb4814Smrg
17715fb4814Smrg    /* Screen To Screen copy */
17815fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy)
1797fe5393cSmrg    {
18015fb4814Smrg        infoPtr->SetupForScreenToScreenCopy =  ASTSetupForScreenToScreenCopy;
18115fb4814Smrg        infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy;
18215fb4814Smrg        infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK;
18315fb4814Smrg    }
18415fb4814Smrg
18515fb4814Smrg    /* Solid fill */
18615fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidFill)
1877fe5393cSmrg    {
18815fb4814Smrg        infoPtr->SetupForSolidFill = ASTSetupForSolidFill;
18915fb4814Smrg        infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect;
19015fb4814Smrg        infoPtr->SolidFillFlags = NO_PLANEMASK;
1917fe5393cSmrg    }
1927fe5393cSmrg
19315fb4814Smrg    /* Solid Lines */
19415fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_SolidLine)
1957fe5393cSmrg    {
196621ff18cSmrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST1180) )
197b410ddbeSmrg    	{
198b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine;
199b410ddbeSmrg        }
200b410ddbeSmrg        else
201b410ddbeSmrg    	{
202b410ddbeSmrg            infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine;
203b410ddbeSmrg        }
204b410ddbeSmrg
2057fe5393cSmrg        infoPtr->SetupForSolidLine = ASTSetupForSolidLine;
2067fe5393cSmrg        infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine;
20715fb4814Smrg        infoPtr->SolidLineFlags = NO_PLANEMASK;
20815fb4814Smrg    }
20915fb4814Smrg
21015fb4814Smrg    /* Dashed Lines */
21115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_DashedLine)
212b410ddbeSmrg    {
213621ff18cSmrg        if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST1180) )
214b410ddbeSmrg        {
215b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine;
216b410ddbeSmrg        }
217b410ddbeSmrg        else
218b410ddbeSmrg        {
219b410ddbeSmrg            infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine;
2207fe5393cSmrg        }
221b410ddbeSmrg
2227fe5393cSmrg        infoPtr->SetupForDashedLine = ASTSetupForDashedLine;
22315fb4814Smrg        infoPtr->DashPatternMaxLength = 64;
22415fb4814Smrg        infoPtr->DashedLineFlags = NO_PLANEMASK |
22515fb4814Smrg			           LINE_PATTERN_MSBFIRST_LSBJUSTIFIED;
2267fe5393cSmrg    }
22715fb4814Smrg
22815fb4814Smrg    /* 8x8 mono pattern fill */
22915fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill)
2307fe5393cSmrg    {
23115fb4814Smrg        infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill;
23215fb4814Smrg        infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill;
23315fb4814Smrg        infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
23415fb4814Smrg                                           NO_TRANSPARENCY |
23515fb4814Smrg				           HARDWARE_PATTERN_SCREEN_ORIGIN |
23615fb4814Smrg				           HARDWARE_PATTERN_PROGRAMMED_BITS |
23715fb4814Smrg				           BIT_ORDER_IN_BYTE_MSBFIRST;
2387fe5393cSmrg    }
2397fe5393cSmrg
24015fb4814Smrg    /* 8x8 color pattern fill */
24115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill)
2427fe5393cSmrg    {
24315fb4814Smrg        infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill;
24415fb4814Smrg        infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect;
24515fb4814Smrg        infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
2467fe5393cSmrg					    NO_TRANSPARENCY |
24715fb4814Smrg	 				    HARDWARE_PATTERN_SCREEN_ORIGIN;
2487fe5393cSmrg    }
2497fe5393cSmrg
25015fb4814Smrg    /* CPU To Screen Color Expand */
25115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand)
2527fe5393cSmrg    {
25315fb4814Smrg        infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill;
25415fb4814Smrg        infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill;
25515fb4814Smrg        infoPtr->ColorExpandRange = MAX_PATReg_Size;
25615fb4814Smrg        infoPtr->ColorExpandBase = MMIOREG_PAT;
25715fb4814Smrg        infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
25815fb4814Smrg	   				           BIT_ORDER_IN_BYTE_MSBFIRST;
2597fe5393cSmrg    }
26015fb4814Smrg
26115fb4814Smrg    /* Screen To Screen Color Expand */
26215fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand)
2637fe5393cSmrg    {
26415fb4814Smrg        infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill;
26515fb4814Smrg        infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill;
26615fb4814Smrg        infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK |
26715fb4814Smrg	                                              BIT_ORDER_IN_BYTE_MSBFIRST;
2687fe5393cSmrg    }
2697fe5393cSmrg
27015fb4814Smrg    /* Clipping */
27115fb4814Smrg    if (pAST->ENGCaps & ENG_CAP_Clipping)
2727fe5393cSmrg    {
27315fb4814Smrg        infoPtr->SetClippingRectangle = ASTSetClippingRectangle;
27415fb4814Smrg        infoPtr->DisableClipping = ASTDisableClipping;
27515fb4814Smrg        infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY 	|
27615fb4814Smrg                		 HARDWARE_CLIP_MONO_8x8_FILL		|
27715fb4814Smrg                		 HARDWARE_CLIP_COLOR_8x8_FILL	 	|
2787fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE 		|
2797fe5393cSmrg                		 HARDWARE_CLIP_DASHED_LINE 		|
2807fe5393cSmrg                		 HARDWARE_CLIP_SOLID_LINE;
2817fe5393cSmrg    }
28215fb4814Smrg
28315fb4814Smrg    return(XAAInit(pScreen, infoPtr));
2847fe5393cSmrg
28515fb4814Smrg} /* end of ASTAccelInit */
28615fb4814Smrg
28715fb4814Smrgstatic void
28815fb4814SmrgASTSync(ScrnInfoPtr pScrn)
28915fb4814Smrg{
29015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
29115fb4814Smrg
29215fb4814Smrg    /* wait engle idle */
293621ff18cSmrg    vASTWaitEngIdle(pScrn, pAST);
29415fb4814Smrg
29515fb4814Smrg} /* end of ASTSync */
29615fb4814Smrg
29715fb4814Smrg
29815fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
29915fb4814Smrg                                          int xdir, int ydir, int rop,
30015fb4814Smrg                                          unsigned int planemask, int trans_color)
30115fb4814Smrg{
3027fe5393cSmrg
30315fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
30415fb4814Smrg    PKT_SC *pSingleCMD;
30515fb4814Smrg    ULONG  cmdreg;
3067fe5393cSmrg
30715fb4814Smrg/*
30815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n");
3097fe5393cSmrg*/
31015fb4814Smrg    /* Modify Reg. Value */
31115fb4814Smrg    cmdreg = CMD_BITBLT;
31215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
31315fb4814Smrg    {
31415fb4814Smrg    case 8:
31515fb4814Smrg        cmdreg |= CMD_COLOR_08;
31615fb4814Smrg        break;
31715fb4814Smrg    case 15:
31815fb4814Smrg    case 16:
31915fb4814Smrg        cmdreg |= CMD_COLOR_16;
3207fe5393cSmrg        break;
32115fb4814Smrg    case 24:
32215fb4814Smrg    case 32:
32315fb4814Smrg        cmdreg |= CMD_COLOR_32;
3247fe5393cSmrg        break;
32515fb4814Smrg    }
32615fb4814Smrg    cmdreg |= (ASTXAACopyROP[rop] << 8);
32715fb4814Smrg    pAST->ulCMDReg = cmdreg;
3287fe5393cSmrg
32915fb4814Smrg    if (!pAST->MMIO2D)
3307fe5393cSmrg    {
33115fb4814Smrg        /* Write to CMDQ */
332621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
3337fe5393cSmrg
3347fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch);
33515fb4814Smrg        pSingleCMD++;
33615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
3377fe5393cSmrg
338de78e416Smrg        /* Update Write Pointer */
339de78e416Smrg        mUpdateWritePointer;
3407fe5393cSmrg
34115fb4814Smrg    }
34215fb4814Smrg    else
34315fb4814Smrg    {
3447fe5393cSmrg        /* Write to MMIO */
3457fe5393cSmrg        ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch);
3467fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
34715fb4814Smrg    }
3487fe5393cSmrg
34915fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */
35015fb4814Smrg
35115fb4814Smrgstatic void
35215fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
35315fb4814Smrg                                int y2, int width, int height)
35415fb4814Smrg{
35515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
35615fb4814Smrg    PKT_SC *pSingleCMD;
35715fb4814Smrg    int src_x, src_y, dst_x, dst_y;
35815fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
359de78e416Smrg    int delta_y = 0;
36015fb4814Smrg/*
36115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n");
36215fb4814Smrg*/
36315fb4814Smrg
364de78e416Smrg    if ((width != 0) && (height != 0))
3657fe5393cSmrg    {
366de78e416Smrg        /* Modify Reg. Value */
367de78e416Smrg        cmdreg = pAST->ulCMDReg;
368de78e416Smrg        if (pAST->EnableClip)
369de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
370de78e416Smrg        else
3717fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
372de78e416Smrg        srcbase = dstbase = 0;
373de78e416Smrg
374de78e416Smrg        if (x1 < x2)
3757fe5393cSmrg            cmdreg |= CMD_X_DEC;
376de78e416Smrg
377de78e416Smrg        if (y1 < y2)
3787fe5393cSmrg            cmdreg |= CMD_Y_DEC;
3797fe5393cSmrg
380de78e416Smrg        if ((y1 + height) >= MAX_SRC_Y)
3817fe5393cSmrg        {
382de78e416Smrg            srcbase=pAST->VideoModeInfo.ScreenPitch*y1;
383de78e416Smrg            y1 = 0;
3847fe5393cSmrg        }
3857fe5393cSmrg
3867fe5393cSmrg        if ((y2 + height) >= pScrn->virtualY)
3877fe5393cSmrg        {
388de78e416Smrg            delta_y = y2;
389de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y2;
390de78e416Smrg            y2 = 0;
391de78e416Smrg        }
3927fe5393cSmrg
393de78e416Smrg        if (cmdreg & CMD_X_DEC)
394de78e416Smrg        {
395de78e416Smrg            src_x = x1 + width - 1;
396de78e416Smrg            dst_x = x2 + width - 1;
397de78e416Smrg        }
398de78e416Smrg        else
399de78e416Smrg        {
400de78e416Smrg            src_x = x1;
4017fe5393cSmrg            dst_x = x2;
402de78e416Smrg        }
4037fe5393cSmrg
404de78e416Smrg        if (cmdreg & CMD_Y_DEC)
4057fe5393cSmrg        {
406de78e416Smrg            src_y = y1 + height - 1;
407de78e416Smrg            dst_y = y2 + height - 1;
408de78e416Smrg        }
409de78e416Smrg        else
410de78e416Smrg        {
411de78e416Smrg            src_y = y1;
4127fe5393cSmrg            dst_y = y2;
413de78e416Smrg        }
4147fe5393cSmrg
4157fe5393cSmrg        if (pAST->EnableClip)
416de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
4177fe5393cSmrg
4187fe5393cSmrg        if (!pAST->MMIO2D)
419de78e416Smrg        {
420de78e416Smrg            /* Write to CMDQ */
421621ff18cSmrg            pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
4227fe5393cSmrg
423de78e416Smrg            ASTSetupSRCBase(pSingleCMD, srcbase);
4247fe5393cSmrg            pSingleCMD++;
425de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
4267fe5393cSmrg            pSingleCMD++;
4277fe5393cSmrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
4287fe5393cSmrg            pSingleCMD++;
4297fe5393cSmrg            ASTSetupSRCXY(pSingleCMD, src_x, src_y);
4307fe5393cSmrg            pSingleCMD++;
4317fe5393cSmrg            ASTSetupRECTXY(pSingleCMD, width, height);
4327fe5393cSmrg            pSingleCMD++;
4337fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
4347fe5393cSmrg
435de78e416Smrg            /* Update Write Pointer */
436de78e416Smrg            mUpdateWritePointer;
4377fe5393cSmrg
438de78e416Smrg        }
439de78e416Smrg        else
440de78e416Smrg        {
441de78e416Smrg            ASTSetupSRCBase_MMIO(srcbase);
442de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
4437fe5393cSmrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
4447fe5393cSmrg            ASTSetupSRCXY_MMIO(src_x, src_y);
4457fe5393cSmrg            ASTSetupRECTXY_MMIO(width, height);
4467fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
4477fe5393cSmrg
448621ff18cSmrg            vASTWaitEngIdle(pScrn, pAST);
449de78e416Smrg        }
4507fe5393cSmrg
451de78e416Smrg    } /* width & height check */
45215fb4814Smrg
45315fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */
45415fb4814Smrg
45515fb4814Smrgstatic void
45615fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn,
45715fb4814Smrg                     int color, int rop, unsigned int planemask)
45815fb4814Smrg{
4597fe5393cSmrg
46015fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
46115fb4814Smrg    PKT_SC *pSingleCMD;
46215fb4814Smrg    ULONG cmdreg;
46315fb4814Smrg
4647fe5393cSmrg/*
46515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n");
4667fe5393cSmrg*/
46715fb4814Smrg    /* Modify Reg. Value */
46815fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR;
46915fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
47015fb4814Smrg    {
47115fb4814Smrg    case 8:
47215fb4814Smrg        cmdreg |= CMD_COLOR_08;
47315fb4814Smrg        break;
47415fb4814Smrg    case 15:
47515fb4814Smrg    case 16:
47615fb4814Smrg        cmdreg |= CMD_COLOR_16;
4777fe5393cSmrg        break;
47815fb4814Smrg    case 24:
47915fb4814Smrg    case 32:
48015fb4814Smrg        cmdreg |= CMD_COLOR_32;
4817fe5393cSmrg        break;
48215fb4814Smrg    }
48315fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
48415fb4814Smrg    pAST->ulCMDReg = cmdreg;
4857fe5393cSmrg
4867fe5393cSmrg    if (!pAST->MMIO2D)
48715fb4814Smrg    {
48815fb4814Smrg        /* Write to CMDQ */
489621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
49015fb4814Smrg
49115fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
49215fb4814Smrg        pSingleCMD++;
493de78e416Smrg        ASTSetupFG(pSingleCMD, color);
4947fe5393cSmrg
495de78e416Smrg        /* Update Write Pointer */
496de78e416Smrg        mUpdateWritePointer;
4977fe5393cSmrg
49815fb4814Smrg    }
49915fb4814Smrg    else
50015fb4814Smrg    {
50115fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
5027fe5393cSmrg        ASTSetupFG_MMIO(color);
50315fb4814Smrg    }
5047fe5393cSmrg
50515fb4814Smrg} /* end of ASTSetupForSolidFill */
50615fb4814Smrg
50715fb4814Smrg
50815fb4814Smrgstatic void
50915fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn,
51015fb4814Smrg                           int dst_x, int dst_y, int width, int height)
51115fb4814Smrg{
51215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
51315fb4814Smrg    PKT_SC *pSingleCMD;
5147fe5393cSmrg    ULONG dstbase, cmdreg;
515de78e416Smrg    int delta_y = 0;
5167fe5393cSmrg
5177fe5393cSmrg/*
51815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n");
51915fb4814Smrg*/
52015fb4814Smrg
521de78e416Smrg    if ((width != 0) && (height != 0))
522de78e416Smrg    {
523de78e416Smrg        /* Modify Reg. Value */
524de78e416Smrg        cmdreg = pAST->ulCMDReg;
525de78e416Smrg        if (pAST->EnableClip)
526de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
527de78e416Smrg        else
5287fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
529de78e416Smrg        dstbase = 0;
5307fe5393cSmrg
5317fe5393cSmrg        if (dst_y >= pScrn->virtualY)
532de78e416Smrg        {
5337fe5393cSmrg            delta_y = dst_y;
534de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
535de78e416Smrg            dst_y=0;
536de78e416Smrg        }
53715fb4814Smrg
5387fe5393cSmrg        if (pAST->EnableClip)
539de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
5407fe5393cSmrg
5417fe5393cSmrg        if (!pAST->MMIO2D)
5427fe5393cSmrg        {
5437fe5393cSmrg            /* Write to CMDQ */
544621ff18cSmrg            pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
5457fe5393cSmrg
546de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
5477fe5393cSmrg            pSingleCMD++;
548de78e416Smrg            ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
5497fe5393cSmrg            pSingleCMD++;
550de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
5517fe5393cSmrg            pSingleCMD++;
5527fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
5537fe5393cSmrg
554de78e416Smrg            /* Update Write Pointer */
555de78e416Smrg            mUpdateWritePointer;
5567fe5393cSmrg
557de78e416Smrg        }
558de78e416Smrg        else
5597fe5393cSmrg        {
560de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
561de78e416Smrg            ASTSetupDSTXY_MMIO(dst_x, dst_y);
562de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
5637fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
5647fe5393cSmrg
565621ff18cSmrg            vASTWaitEngIdle(pScrn, pAST);
5667fe5393cSmrg
567de78e416Smrg        }
5687fe5393cSmrg
569de78e416Smrg    } /* width & height check */
57015fb4814Smrg
57115fb4814Smrg
57215fb4814Smrg} /* end of ASTSubsequentSolidFillRect */
57315fb4814Smrg
57415fb4814Smrg/* Line */
5757fe5393cSmrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn,
57615fb4814Smrg                                 int color, int rop, unsigned int planemask)
57715fb4814Smrg{
57815fb4814Smrg
57915fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
58015fb4814Smrg    PKT_SC *pSingleCMD;
58115fb4814Smrg    ULONG  cmdreg;
58215fb4814Smrg/*
58315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n");
5847fe5393cSmrg*/
58515fb4814Smrg    /* Modify Reg. Value */
58615fb4814Smrg    cmdreg = CMD_BITBLT;
58715fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
58815fb4814Smrg    {
58915fb4814Smrg    case 8:
59015fb4814Smrg        cmdreg |= CMD_COLOR_08;
59115fb4814Smrg        break;
59215fb4814Smrg    case 15:
59315fb4814Smrg    case 16:
59415fb4814Smrg        cmdreg |= CMD_COLOR_16;
5957fe5393cSmrg        break;
59615fb4814Smrg    case 24:
59715fb4814Smrg    case 32:
59815fb4814Smrg        cmdreg |= CMD_COLOR_32;
5997fe5393cSmrg        break;
60015fb4814Smrg    }
6017fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
60215fb4814Smrg    pAST->ulCMDReg = cmdreg;
6037fe5393cSmrg
60415fb4814Smrg    if (!pAST->MMIO2D)
6057fe5393cSmrg    {
60615fb4814Smrg        /* Write to CMDQ */
607621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
60815fb4814Smrg
60915fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
61015fb4814Smrg        pSingleCMD++;
6117fe5393cSmrg        ASTSetupFG(pSingleCMD, color);
61215fb4814Smrg        pSingleCMD++;
61315fb4814Smrg        ASTSetupBG(pSingleCMD, 0);
6147fe5393cSmrg
615de78e416Smrg        /* Update Write Pointer */
6167fe5393cSmrg        mUpdateWritePointer;
6177fe5393cSmrg
61815fb4814Smrg    }
61915fb4814Smrg    else
62015fb4814Smrg    {
6217fe5393cSmrg        /* Write to MMIO */
6227fe5393cSmrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
6237fe5393cSmrg        ASTSetupFG_MMIO(color);
6247fe5393cSmrg        ASTSetupBG_MMIO(0);
62515fb4814Smrg    }
6267fe5393cSmrg
62715fb4814Smrg} /* end of ASTSetupForSolidLine */
62815fb4814Smrg
62915fb4814Smrg
63015fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
63115fb4814Smrg                                          int x, int y, int len, int dir)
63215fb4814Smrg{
63315fb4814Smrg
63415fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
63515fb4814Smrg    PKT_SC *pSingleCMD;
6367fe5393cSmrg    ULONG dstbase, cmdreg;
63715fb4814Smrg    int width, height;
638de78e416Smrg    int delta_y = 0;
6397fe5393cSmrg/*
64015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n");
64115fb4814Smrg*/
64215fb4814Smrg
643de78e416Smrg    if (len != 0)
644de78e416Smrg    {
645de78e416Smrg        /* Modify Reg. Value */
646de78e416Smrg        cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT;
647de78e416Smrg        if (pAST->EnableClip)
648de78e416Smrg            cmdreg |= CMD_ENABLE_CLIP;
649de78e416Smrg        else
6507fe5393cSmrg            cmdreg &= ~CMD_ENABLE_CLIP;
651de78e416Smrg        dstbase = 0;
6527fe5393cSmrg
653de78e416Smrg        if(dir == DEGREES_0) {			/* horizontal */
654de78e416Smrg            width  = len;
6557fe5393cSmrg            height = 1;
656de78e416Smrg        } else {					/* vertical */
657de78e416Smrg            width  = 1;
6587fe5393cSmrg            height = len;
659de78e416Smrg        }
6607fe5393cSmrg
6617fe5393cSmrg        if ((y + height) >= pScrn->virtualY)
6627fe5393cSmrg        {
6637fe5393cSmrg            delta_y = y;
664de78e416Smrg            dstbase=pAST->VideoModeInfo.ScreenPitch*y;
665de78e416Smrg            y=0;
666de78e416Smrg        }
6677fe5393cSmrg
6687fe5393cSmrg        if (pAST->EnableClip)
669de78e416Smrg            ASTSetHWClipping(pScrn, delta_y);
6707fe5393cSmrg
6717fe5393cSmrg        if (!pAST->MMIO2D)
6727fe5393cSmrg        {
6737fe5393cSmrg            /* Write to CMDQ */
674621ff18cSmrg            pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
6757fe5393cSmrg
676de78e416Smrg            ASTSetupDSTBase(pSingleCMD, dstbase);
6777fe5393cSmrg            pSingleCMD++;
678de78e416Smrg            ASTSetupDSTXY(pSingleCMD, x, y);
6797fe5393cSmrg            pSingleCMD++;
680de78e416Smrg            ASTSetupRECTXY(pSingleCMD, width, height);
6817fe5393cSmrg            pSingleCMD++;
6827fe5393cSmrg            ASTSetupCMDReg(pSingleCMD, cmdreg);
6837fe5393cSmrg
684de78e416Smrg            /* Update Write Pointer */
685de78e416Smrg            mUpdateWritePointer;
6867fe5393cSmrg
687de78e416Smrg        }
688de78e416Smrg        else
6897fe5393cSmrg        {
690de78e416Smrg            ASTSetupDSTBase_MMIO(dstbase);
691de78e416Smrg            ASTSetupDSTXY_MMIO(x, y);
692de78e416Smrg            ASTSetupRECTXY_MMIO(width, height);
6937fe5393cSmrg            ASTSetupCMDReg_MMIO(cmdreg);
6947fe5393cSmrg
695621ff18cSmrg            vASTWaitEngIdle(pScrn, pAST);
6967fe5393cSmrg
697de78e416Smrg        }
6987fe5393cSmrg
699de78e416Smrg    } /* len check */
7007fe5393cSmrg
70115fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */
70215fb4814Smrg
70315fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
70415fb4814Smrg                                           int x1, int y1, int x2, int y2, int flags)
70515fb4814Smrg{
7067fe5393cSmrg
70715fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
70815fb4814Smrg    PKT_SC 	*pSingleCMD;
70915fb4814Smrg    LINEPARAM   dsLineParam;
7107fe5393cSmrg    _LINEInfo   LineInfo;
71115fb4814Smrg    ULONG 	dstbase, ulCommand;
7127fe5393cSmrg    ULONG	miny, maxy;
71315fb4814Smrg    USHORT      usXM;
714de78e416Smrg    int delta_y = 0;
7157fe5393cSmrg
71615fb4814Smrg/*
71715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
7187fe5393cSmrg*/
71915fb4814Smrg
72015fb4814Smrg    /* Modify Reg. Value */
72115fb4814Smrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW;
72215fb4814Smrg    if(flags & OMIT_LAST)
72315fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
72415fb4814Smrg    else
72515fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
72615fb4814Smrg    if (pAST->EnableClip)
72715fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
728de78e416Smrg    else
7297fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
73015fb4814Smrg    dstbase = 0;
73115fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
73215fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
73315fb4814Smrg    if(maxy >= pScrn->virtualY) {
734de78e416Smrg    	delta_y = miny;
73515fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
73615fb4814Smrg        y1 -= miny;
73715fb4814Smrg        y2 -= miny;
73815fb4814Smrg    }
7397fe5393cSmrg
74015fb4814Smrg    LineInfo.X1 = x1;
74115fb4814Smrg    LineInfo.Y1 = y1;
74215fb4814Smrg    LineInfo.X2 = x2;
74315fb4814Smrg    LineInfo.Y2 = y2;
7447fe5393cSmrg
745621ff18cSmrg    bASTGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
7467fe5393cSmrg
7477fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
7487fe5393cSmrg        ulCommand |= CMD_X_DEC;
7497fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
7507fe5393cSmrg        ulCommand |= CMD_Y_DEC;
7517fe5393cSmrg
7527fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
7537fe5393cSmrg
7547fe5393cSmrg    if (pAST->EnableClip)
755de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
7567fe5393cSmrg
7577fe5393cSmrg    if (!pAST->MMIO2D)
7587fe5393cSmrg    {
7597fe5393cSmrg        /* Write to CMDQ */
760621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
76115fb4814Smrg
76215fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
7637fe5393cSmrg        pSingleCMD++;
76415fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
7657fe5393cSmrg        pSingleCMD++;
76615fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
7677fe5393cSmrg        pSingleCMD++;
76815fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
7697fe5393cSmrg        pSingleCMD++;
77015fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
7717fe5393cSmrg        pSingleCMD++;
77215fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
7737fe5393cSmrg        pSingleCMD++;
7747fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
7757fe5393cSmrg
77615fb4814Smrg        /* Update Write Pointer */
7777fe5393cSmrg        mUpdateWritePointer;
778de78e416Smrg
779de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
780621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
7817fe5393cSmrg
78215fb4814Smrg    }
78315fb4814Smrg    else
7847fe5393cSmrg    {
78515fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
78615fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
78715fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
78815fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
78915fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
79015fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
7917fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
7927fe5393cSmrg
793621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
7947fe5393cSmrg
79515fb4814Smrg    }
79615fb4814Smrg
7977fe5393cSmrg
79815fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */
79915fb4814Smrg
80015fb4814Smrg/* Dash Line */
80115fb4814Smrgstatic void
80215fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn,
80315fb4814Smrg                      int fg, int bg, int rop, unsigned int planemask,
80415fb4814Smrg                      int length, UCHAR *pattern)
80515fb4814Smrg{
80615fb4814Smrg
80715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
80815fb4814Smrg    PKT_SC *pSingleCMD;
80915fb4814Smrg    ULONG  cmdreg;
81015fb4814Smrg/*
81115fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n");
8127fe5393cSmrg*/
81315fb4814Smrg    /* Modify Reg. Value */
81415fb4814Smrg    cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE;
8157fe5393cSmrg
81615fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
81715fb4814Smrg    {
81815fb4814Smrg    case 8:
81915fb4814Smrg        cmdreg |= CMD_COLOR_08;
82015fb4814Smrg        break;
82115fb4814Smrg    case 15:
82215fb4814Smrg    case 16:
82315fb4814Smrg        cmdreg |= CMD_COLOR_16;
8247fe5393cSmrg        break;
82515fb4814Smrg    case 24:
82615fb4814Smrg    case 32:
82715fb4814Smrg        cmdreg |= CMD_COLOR_32;
8287fe5393cSmrg        break;
82915fb4814Smrg    }
8307fe5393cSmrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
83115fb4814Smrg    if(bg == -1) {
8327fe5393cSmrg        cmdreg |= CMD_TRANSPARENT;
83315fb4814Smrg        bg = 0;
83415fb4814Smrg    }
83515fb4814Smrg    cmdreg |= (((length-1) & 0x3F) << 24);		/* line period */
83615fb4814Smrg    pAST->ulCMDReg = cmdreg;
8377fe5393cSmrg
83815fb4814Smrg    if (!pAST->MMIO2D)
8397fe5393cSmrg    {
84015fb4814Smrg        /* Write to CMDQ */
841621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
84215fb4814Smrg
84315fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
84415fb4814Smrg        pSingleCMD++;
8457fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
84615fb4814Smrg        pSingleCMD++;
8477fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
84815fb4814Smrg        pSingleCMD++;
84915fb4814Smrg        ASTSetupLineStyle1(pSingleCMD, *pattern);
85015fb4814Smrg        pSingleCMD++;
851de78e416Smrg        ASTSetupLineStyle2(pSingleCMD, *(pattern+4));
8527fe5393cSmrg
853de78e416Smrg        /* Update Write Pointer */
8547fe5393cSmrg        mUpdateWritePointer;
8557fe5393cSmrg
85615fb4814Smrg    }
85715fb4814Smrg    else
85815fb4814Smrg    {
8597fe5393cSmrg        /* Write to MMIO */
86015fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
8617fe5393cSmrg        ASTSetupFG_MMIO(fg);
8627fe5393cSmrg        ASTSetupBG_MMIO(bg);
86315fb4814Smrg        ASTSetupLineStyle1_MMIO(*pattern);
8647fe5393cSmrg        ASTSetupLineStyle2_MMIO(*(pattern+4));
86515fb4814Smrg
86615fb4814Smrg    }
8677fe5393cSmrg
86815fb4814Smrg}
86915fb4814Smrg
87015fb4814Smrgstatic void
87115fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
87215fb4814Smrg                                int x1, int y1, int x2, int y2,
87315fb4814Smrg                                int flags, int phase)
87415fb4814Smrg{
8757fe5393cSmrg
87615fb4814Smrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
87715fb4814Smrg    PKT_SC 	*pSingleCMD;
87815fb4814Smrg    LINEPARAM   dsLineParam;
8797fe5393cSmrg    _LINEInfo   LineInfo;
8807fe5393cSmrg    ULONG 	dstbase, ulCommand;
8817fe5393cSmrg    ULONG	miny, maxy;
88215fb4814Smrg    USHORT      usXM;
883de78e416Smrg    int delta_y = 0;
8847fe5393cSmrg
88515fb4814Smrg/*
88615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
8877fe5393cSmrg*/
88815fb4814Smrg
88915fb4814Smrg    /* Modify Reg. Value */
89015fb4814Smrg    ulCommand = pAST->ulCMDReg;
89115fb4814Smrg    if(flags & OMIT_LAST)
89215fb4814Smrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
89315fb4814Smrg    else
89415fb4814Smrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
89515fb4814Smrg    if (pAST->EnableClip)
89615fb4814Smrg        ulCommand |= CMD_ENABLE_CLIP;
897de78e416Smrg    else
8987fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
8997fe5393cSmrg    dstbase = 0;
90015fb4814Smrg    miny = (y1 > y2) ? y2 : y1;
90115fb4814Smrg    maxy = (y1 > y2) ? y1 : y2;
90215fb4814Smrg    if(maxy >= pScrn->virtualY) {
903de78e416Smrg    	delta_y = miny;
90415fb4814Smrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
90515fb4814Smrg        y1 -= miny;
90615fb4814Smrg        y2 -= miny;
90715fb4814Smrg    }
9087fe5393cSmrg
90915fb4814Smrg    LineInfo.X1 = x1;
91015fb4814Smrg    LineInfo.Y1 = y1;
91115fb4814Smrg    LineInfo.X2 = x2;
91215fb4814Smrg    LineInfo.Y2 = y2;
9137fe5393cSmrg
914621ff18cSmrg    bASTGetLineTerm(&LineInfo, &dsLineParam);		/* Get Line Parameter */
9157fe5393cSmrg
9167fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC)
9177fe5393cSmrg        ulCommand |= CMD_X_DEC;
9187fe5393cSmrg    if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC)
9197fe5393cSmrg        ulCommand |= CMD_Y_DEC;
9207fe5393cSmrg
9217fe5393cSmrg    usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0;
9227fe5393cSmrg
9237fe5393cSmrg    if (pAST->EnableClip)
924de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
9257fe5393cSmrg
9267fe5393cSmrg    if (!pAST->MMIO2D)
9277fe5393cSmrg    {
9287fe5393cSmrg        /* Write to CMDQ */
929621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7);
93015fb4814Smrg
93115fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
9327fe5393cSmrg        pSingleCMD++;
93315fb4814Smrg        ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY);
9347fe5393cSmrg        pSingleCMD++;
93515fb4814Smrg        ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm);
9367fe5393cSmrg        pSingleCMD++;
93715fb4814Smrg        ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth);
9387fe5393cSmrg        pSingleCMD++;
93915fb4814Smrg        ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term);
9407fe5393cSmrg        pSingleCMD++;
94115fb4814Smrg        ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term);
9427fe5393cSmrg        pSingleCMD++;
9437fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
9447fe5393cSmrg
94515fb4814Smrg        /* Update Write Pointer */
94615fb4814Smrg        mUpdateWritePointer;
947de78e416Smrg
948de78e416Smrg        /* Patch KDE pass abnormal point, ycchen@052507 */
949621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
9507fe5393cSmrg
95115fb4814Smrg    }
95215fb4814Smrg    else
9537fe5393cSmrg    {
95415fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
95515fb4814Smrg        ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY);
95615fb4814Smrg        ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm);
95715fb4814Smrg        ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth);
95815fb4814Smrg        ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term);
95915fb4814Smrg        ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term);
9607fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
9617fe5393cSmrg
962621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
9637fe5393cSmrg
96415fb4814Smrg    }
9657fe5393cSmrg
96615fb4814Smrg}
96715fb4814Smrg
96815fb4814Smrg/* Mono Pattern Fill */
96915fb4814Smrgstatic void
97015fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn,
97115fb4814Smrg                           int patx, int paty, int fg, int bg,
97215fb4814Smrg                           int rop, unsigned int planemask)
97315fb4814Smrg{
9747fe5393cSmrg
97515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
97615fb4814Smrg    PKT_SC *pSingleCMD;
97715fb4814Smrg    ULONG cmdreg;
97815fb4814Smrg
9797fe5393cSmrg/*
98015fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n");
9817fe5393cSmrg*/
98215fb4814Smrg    /* Modify Reg. Value */
98315fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK;
98415fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
98515fb4814Smrg    {
98615fb4814Smrg    case 8:
98715fb4814Smrg        cmdreg |= CMD_COLOR_08;
98815fb4814Smrg        break;
98915fb4814Smrg    case 15:
99015fb4814Smrg    case 16:
99115fb4814Smrg        cmdreg |= CMD_COLOR_16;
9927fe5393cSmrg        break;
99315fb4814Smrg    case 24:
99415fb4814Smrg    case 32:
99515fb4814Smrg        cmdreg |= CMD_COLOR_32;
9967fe5393cSmrg        break;
99715fb4814Smrg    }
99815fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
99915fb4814Smrg    pAST->ulCMDReg = cmdreg;
10007fe5393cSmrg
10017fe5393cSmrg    if (!pAST->MMIO2D)
100215fb4814Smrg    {
100315fb4814Smrg        /* Write to CMDQ */
1004621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
100515fb4814Smrg
100615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
100715fb4814Smrg        pSingleCMD++;
10087fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
100915fb4814Smrg        pSingleCMD++;
101015fb4814Smrg        ASTSetupBG(pSingleCMD, bg);
101115fb4814Smrg        pSingleCMD++;
10127fe5393cSmrg        ASTSetupMONO1(pSingleCMD, patx);
101315fb4814Smrg        pSingleCMD++;
1014de78e416Smrg        ASTSetupMONO2(pSingleCMD, paty);
10157fe5393cSmrg
1016de78e416Smrg        /* Update Write Pointer */
1017de78e416Smrg        mUpdateWritePointer;
10187fe5393cSmrg
101915fb4814Smrg    }
102015fb4814Smrg    else
102115fb4814Smrg    {
102215fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
10237fe5393cSmrg        ASTSetupFG_MMIO(fg);
102415fb4814Smrg        ASTSetupBG_MMIO(bg);
10257fe5393cSmrg        ASTSetupMONO1_MMIO(patx);
10267fe5393cSmrg        ASTSetupMONO2_MMIO(paty);
102715fb4814Smrg    }
10287fe5393cSmrg
102915fb4814Smrg} /* end of ASTSetupForMonoPatternFill */
103015fb4814Smrg
10317fe5393cSmrg
103215fb4814Smrgstatic void
103315fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
103415fb4814Smrg                             int patx, int paty,
103515fb4814Smrg                             int dst_x, int dst_y, int width, int height)
103615fb4814Smrg{
103715fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
103815fb4814Smrg    PKT_SC *pSingleCMD;
1039de78e416Smrg    ULONG dstbase, cmdreg;
1040de78e416Smrg    int delta_y = 0;
10417fe5393cSmrg
10427fe5393cSmrg/*
104315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n");
10447fe5393cSmrg*/
10457fe5393cSmrg
104615fb4814Smrg    /* Modify Reg. Value */
104715fb4814Smrg    cmdreg = pAST->ulCMDReg;
104815fb4814Smrg    if (pAST->EnableClip)
1049de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1050de78e416Smrg    else
10517fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
105215fb4814Smrg    dstbase = 0;
105315fb4814Smrg
10547fe5393cSmrg    if (dst_y >= pScrn->virtualY)
10557fe5393cSmrg    {
1056de78e416Smrg    	delta_y = dst_y;
105715fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
105815fb4814Smrg        dst_y=0;
105915fb4814Smrg    }
1060de78e416Smrg
10617fe5393cSmrg    if (pAST->EnableClip)
1062de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
10637fe5393cSmrg
10647fe5393cSmrg    if (!pAST->MMIO2D)
10657fe5393cSmrg    {
10667fe5393cSmrg        /* Write to CMDQ */
1067621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
106815fb4814Smrg
106915fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
10707fe5393cSmrg        pSingleCMD++;
107115fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
10727fe5393cSmrg        pSingleCMD++;
107315fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
10747fe5393cSmrg        pSingleCMD++;
10757fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
10767fe5393cSmrg
107715fb4814Smrg        /* Update Write Pointer */
107815fb4814Smrg        mUpdateWritePointer;
10797fe5393cSmrg
108015fb4814Smrg    }
108115fb4814Smrg    else
10827fe5393cSmrg    {
108315fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
108415fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
108515fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
10867fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
10877fe5393cSmrg
1088621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
10897fe5393cSmrg    }
109015fb4814Smrg
109115fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */
109215fb4814Smrg
109315fb4814Smrgstatic void
109415fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
109515fb4814Smrg			       int rop, unsigned int planemask, int trans_col)
109615fb4814Smrg{
10977fe5393cSmrg
109815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
109915fb4814Smrg    PKT_SC *pSingleCMD;
110015fb4814Smrg    ULONG cmdreg;
110115fb4814Smrg    CARD32 *pataddr;
110215fb4814Smrg    ULONG ulPatSize;
110315fb4814Smrg    int i, j, cpp;
11047fe5393cSmrg/*
110515fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n");
11067fe5393cSmrg*/
110715fb4814Smrg    /* Modify Reg. Value */
110815fb4814Smrg    cmdreg = CMD_BITBLT | CMD_PAT_PATREG;
110915fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
111015fb4814Smrg    {
111115fb4814Smrg    case 8:
111215fb4814Smrg        cmdreg |= CMD_COLOR_08;
111315fb4814Smrg        break;
111415fb4814Smrg    case 15:
111515fb4814Smrg    case 16:
111615fb4814Smrg        cmdreg |= CMD_COLOR_16;
11177fe5393cSmrg        break;
111815fb4814Smrg    case 24:
111915fb4814Smrg    case 32:
112015fb4814Smrg        cmdreg |= CMD_COLOR_32;
11217fe5393cSmrg        break;
112215fb4814Smrg    }
112315fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
112415fb4814Smrg    pAST->ulCMDReg = cmdreg;
112515fb4814Smrg    cpp = (pScrn->bitsPerPixel + 1) / 8;
112615fb4814Smrg    pataddr = (CARD32 *)(pAST->FBVirtualAddr +
11277fe5393cSmrg                        (paty * pAST->VideoModeInfo.ScreenPitch) + (patx * cpp));
112815fb4814Smrg    ulPatSize = 8*8*cpp;
11297fe5393cSmrg
11307fe5393cSmrg    if (!pAST->MMIO2D)
113115fb4814Smrg    {
11327fe5393cSmrg        /* Write to CMDQ */
1133621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4));
113415fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
113515fb4814Smrg        pSingleCMD++;
113615fb4814Smrg        for (i=0; i<8; i++)
113715fb4814Smrg        {
113815fb4814Smrg            for (j=0; j<8*cpp/4; j++)
113915fb4814Smrg            {
114015fb4814Smrg                ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++)));
11417fe5393cSmrg                pSingleCMD++;
11427fe5393cSmrg            }
1143de78e416Smrg        }
11447fe5393cSmrg
1145de78e416Smrg        /* Update Write Pointer */
1146de78e416Smrg        mUpdateWritePointer;
11477fe5393cSmrg
114815fb4814Smrg    }
114915fb4814Smrg    else
11507fe5393cSmrg    {
115115fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
115215fb4814Smrg        for (i=0; i<8; i++)
115315fb4814Smrg        {
115415fb4814Smrg            for (j=0; j<8*cpp/4; j++)
115515fb4814Smrg            {
115615fb4814Smrg                ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++)));
11577fe5393cSmrg            }
11587fe5393cSmrg        }
11597fe5393cSmrg
116015fb4814Smrg    }
116115fb4814Smrg
116215fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */
11637fe5393cSmrg
116415fb4814Smrgstatic void
116515fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
116615fb4814Smrg                                     int dst_x, int dst_y, int width, int height)
116715fb4814Smrg{
116815fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
116915fb4814Smrg    PKT_SC *pSingleCMD;
1170de78e416Smrg    ULONG dstbase, cmdreg;
1171de78e416Smrg    int delta_y = 0;
11727fe5393cSmrg
11737fe5393cSmrg/*
117415fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n");
117515fb4814Smrg*/
11767fe5393cSmrg
117715fb4814Smrg    /* Modify Reg. Value */
117815fb4814Smrg    cmdreg = pAST->ulCMDReg;
117915fb4814Smrg    if (pAST->EnableClip)
1180de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1181de78e416Smrg    else
11827fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
118315fb4814Smrg    dstbase = 0;
118415fb4814Smrg
11857fe5393cSmrg    if (dst_y >= pScrn->virtualY)
11867fe5393cSmrg    {
1187de78e416Smrg    	delta_y = dst_y;
118815fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
118915fb4814Smrg        dst_y=0;
119015fb4814Smrg    }
1191de78e416Smrg
11927fe5393cSmrg    if (pAST->EnableClip)
1193de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
11947fe5393cSmrg
11957fe5393cSmrg    if (!pAST->MMIO2D)
11967fe5393cSmrg    {
11977fe5393cSmrg        /* Write to CMDQ */
1198621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4);
119915fb4814Smrg
120015fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
12017fe5393cSmrg        pSingleCMD++;
120215fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
12037fe5393cSmrg        pSingleCMD++;
120415fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
12057fe5393cSmrg        pSingleCMD++;
12067fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
12077fe5393cSmrg
120815fb4814Smrg        /* Update Write Pointer */
120915fb4814Smrg        mUpdateWritePointer;
12107fe5393cSmrg
121115fb4814Smrg    }
121215fb4814Smrg    else
12137fe5393cSmrg    {
121415fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
121515fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
121615fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
12177fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
12187fe5393cSmrg
1219621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
12207fe5393cSmrg    }
12217fe5393cSmrg
122215fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */
122315fb4814Smrg
122415fb4814Smrg/* CPU to Screen Expand */
122515fb4814Smrgstatic void
122615fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
122715fb4814Smrg                                      int fg, int bg,
122815fb4814Smrg                                      int rop, unsigned int planemask)
122915fb4814Smrg{
123015fb4814Smrg
123115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
123215fb4814Smrg    PKT_SC *pSingleCMD;
123315fb4814Smrg    ULONG cmdreg;
123415fb4814Smrg
12357fe5393cSmrg/*
123615fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n");
12377fe5393cSmrg*/
123815fb4814Smrg    /* Modify Reg. Value */
123915fb4814Smrg    cmdreg = CMD_COLOREXP;
124015fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
124115fb4814Smrg    {
124215fb4814Smrg    case 8:
124315fb4814Smrg        cmdreg |= CMD_COLOR_08;
124415fb4814Smrg        break;
124515fb4814Smrg    case 15:
124615fb4814Smrg    case 16:
124715fb4814Smrg        cmdreg |= CMD_COLOR_16;
12487fe5393cSmrg        break;
124915fb4814Smrg    case 24:
125015fb4814Smrg    case 32:
125115fb4814Smrg        cmdreg |= CMD_COLOR_32;
12527fe5393cSmrg        break;
125315fb4814Smrg    }
125415fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
125515fb4814Smrg    if(bg == -1) {
12567fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
125715fb4814Smrg        bg = 0;
12587fe5393cSmrg    }
125915fb4814Smrg    pAST->ulCMDReg = cmdreg;
12607fe5393cSmrg
12617fe5393cSmrg    if (!pAST->MMIO2D)
126215fb4814Smrg    {
126315fb4814Smrg        /* Write to CMDQ */
1264621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
126515fb4814Smrg
126615fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
126715fb4814Smrg        pSingleCMD++;
12687fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
126915fb4814Smrg        pSingleCMD++;
12707fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1271de78e416Smrg
1272de78e416Smrg        /* Update Write Pointer */
1273de78e416Smrg        mUpdateWritePointer;
12747fe5393cSmrg
127515fb4814Smrg    }
127615fb4814Smrg    else
127715fb4814Smrg    {
127815fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
12797fe5393cSmrg        ASTSetupFG_MMIO(fg);
12807fe5393cSmrg        ASTSetupBG_MMIO(bg);
12817fe5393cSmrg
128215fb4814Smrg    }
12837fe5393cSmrg
128415fb4814Smrg}
12857fe5393cSmrg
128615fb4814Smrgstatic void
128715fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
128815fb4814Smrg                                        int dst_x, int dst_y,
128915fb4814Smrg                                        int width, int height, int offset)
129015fb4814Smrg{
129115fb4814Smrg
129215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
129315fb4814Smrg    PKT_SC *pSingleCMD;
129415fb4814Smrg    ULONG dstbase, cmdreg;
1295de78e416Smrg    int delta_y = 0;
129615fb4814Smrg
12977fe5393cSmrg/*
129815fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n");
129915fb4814Smrg*/
13007fe5393cSmrg
130115fb4814Smrg    /* Modify Reg. Value */
130215fb4814Smrg    cmdreg = pAST->ulCMDReg;
130315fb4814Smrg    if (pAST->EnableClip)
1304de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1305de78e416Smrg    else
13067fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
130715fb4814Smrg    dstbase = 0;
130815fb4814Smrg
13097fe5393cSmrg    if (dst_y >= pScrn->virtualY)
13107fe5393cSmrg    {
1311de78e416Smrg    	delta_y = dst_y;
131215fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
131315fb4814Smrg        dst_y=0;
131415fb4814Smrg    }
1315de78e416Smrg
13167fe5393cSmrg    if (pAST->EnableClip)
1317de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
13187fe5393cSmrg
13197fe5393cSmrg    if (!pAST->MMIO2D)
13207fe5393cSmrg    {
13217fe5393cSmrg        /* Write to CMDQ */
1322621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
132315fb4814Smrg
13247fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD, ((width+7)/8));
13257fe5393cSmrg        pSingleCMD++;
132615fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
13277fe5393cSmrg        pSingleCMD++;
132815fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
13297fe5393cSmrg        pSingleCMD++;
133015fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
13317fe5393cSmrg        pSingleCMD++;
13327fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
13337fe5393cSmrg
133415fb4814Smrg        /* Update Write Pointer */
133515fb4814Smrg        mUpdateWritePointer;
13367fe5393cSmrg
133715fb4814Smrg    }
133815fb4814Smrg    else
13397fe5393cSmrg    {
13407fe5393cSmrg        ASTSetupSRCPitch_MMIO((width+7)/8);
134115fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
134215fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
134315fb4814Smrg        ASTSetupSRCXY_MMIO(0, 0);
13447fe5393cSmrg
134515fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
13467fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
13477fe5393cSmrg
1348621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
13497fe5393cSmrg
135015fb4814Smrg    }
13517fe5393cSmrg
135215fb4814Smrg}
135315fb4814Smrg
135415fb4814Smrg
135515fb4814Smrg/* Screen to Screen Color Expand */
135615fb4814Smrgstatic void
135715fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
135815fb4814Smrg                                         int fg, int bg,
135915fb4814Smrg                                         int rop, unsigned int planemask)
136015fb4814Smrg{
136115fb4814Smrg
136215fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
136315fb4814Smrg    PKT_SC *pSingleCMD;
136415fb4814Smrg    ULONG cmdreg;
136515fb4814Smrg
13667fe5393cSmrg/*
136715fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n");
136815fb4814Smrg*/
13697fe5393cSmrg
137015fb4814Smrg    /* Modify Reg. Value */
137115fb4814Smrg    cmdreg = CMD_ENHCOLOREXP;
137215fb4814Smrg    switch (pAST->VideoModeInfo.bitsPerPixel)
137315fb4814Smrg    {
137415fb4814Smrg    case 8:
137515fb4814Smrg        cmdreg |= CMD_COLOR_08;
137615fb4814Smrg        break;
137715fb4814Smrg    case 15:
137815fb4814Smrg    case 16:
137915fb4814Smrg        cmdreg |= CMD_COLOR_16;
13807fe5393cSmrg        break;
138115fb4814Smrg    case 24:
138215fb4814Smrg    case 32:
138315fb4814Smrg        cmdreg |= CMD_COLOR_32;
13847fe5393cSmrg        break;
138515fb4814Smrg    }
138615fb4814Smrg    cmdreg |= (ASTXAAPatternROP[rop] << 8);
138715fb4814Smrg    if(bg == -1) {
13887fe5393cSmrg        cmdreg |= CMD_FONT_TRANSPARENT;
138915fb4814Smrg        bg = 0;
13907fe5393cSmrg    }
139115fb4814Smrg    pAST->ulCMDReg = cmdreg;
13927fe5393cSmrg
13937fe5393cSmrg    if (!pAST->MMIO2D)
139415fb4814Smrg    {
139515fb4814Smrg        /* Write to CMDQ */
1396621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3);
139715fb4814Smrg
139815fb4814Smrg        ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1);
139915fb4814Smrg        pSingleCMD++;
14007fe5393cSmrg        ASTSetupFG(pSingleCMD, fg);
140115fb4814Smrg        pSingleCMD++;
14027fe5393cSmrg        ASTSetupBG(pSingleCMD, bg);
1403de78e416Smrg
1404de78e416Smrg        /* Update Write Pointer */
1405de78e416Smrg        mUpdateWritePointer;
14067fe5393cSmrg
140715fb4814Smrg    }
140815fb4814Smrg    else
140915fb4814Smrg    {
141015fb4814Smrg        ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1);
14117fe5393cSmrg        ASTSetupFG_MMIO(fg);
14127fe5393cSmrg        ASTSetupBG_MMIO(bg);
14137fe5393cSmrg
141415fb4814Smrg    }
14157fe5393cSmrg
141615fb4814Smrg}
141715fb4814Smrg
141815fb4814Smrg
141915fb4814Smrg
142015fb4814Smrgstatic void
142115fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn,
142215fb4814Smrg                                           int dst_x, int dst_y, int width, int height,
142315fb4814Smrg                                           int src_x, int src_y, int offset)
142415fb4814Smrg{
142515fb4814Smrg   ASTRecPtr pAST = ASTPTR(pScrn);
142615fb4814Smrg    PKT_SC *pSingleCMD;
142715fb4814Smrg    ULONG srcbase, dstbase, cmdreg;
142815fb4814Smrg    USHORT srcpitch;
1429de78e416Smrg    int delta_y = 0;
143015fb4814Smrg
14317fe5393cSmrg/*
143215fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n");
143315fb4814Smrg*/
14347fe5393cSmrg
143515fb4814Smrg    /* Modify Reg. Value */
143615fb4814Smrg    cmdreg = pAST->ulCMDReg;
143715fb4814Smrg    if (pAST->EnableClip)
1438de78e416Smrg        cmdreg |= CMD_ENABLE_CLIP;
1439de78e416Smrg    else
14407fe5393cSmrg        cmdreg &= ~CMD_ENABLE_CLIP;
144115fb4814Smrg    dstbase = 0;
14427fe5393cSmrg    if (dst_y >= pScrn->virtualY)
14437fe5393cSmrg    {
1444de78e416Smrg    	delta_y = dst_y;
144515fb4814Smrg        dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y;
144615fb4814Smrg        dst_y=0;
144715fb4814Smrg    }
14487fe5393cSmrg    srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x;
144915fb4814Smrg    srcpitch = (pScrn->displayWidth+7)/8;
1450de78e416Smrg
14517fe5393cSmrg    if (pAST->EnableClip)
1452de78e416Smrg        ASTSetHWClipping(pScrn, delta_y);
14537fe5393cSmrg
14547fe5393cSmrg    if (!pAST->MMIO2D)
14557fe5393cSmrg    {
14567fe5393cSmrg        /* Write to CMDQ */
1457621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6);
145815fb4814Smrg
145915fb4814Smrg        ASTSetupSRCBase(pSingleCMD, srcbase);
14607fe5393cSmrg        pSingleCMD++;
14617fe5393cSmrg        ASTSetupSRCPitch(pSingleCMD,srcpitch);
14627fe5393cSmrg        pSingleCMD++;
146315fb4814Smrg        ASTSetupDSTBase(pSingleCMD, dstbase);
14647fe5393cSmrg        pSingleCMD++;
146515fb4814Smrg        ASTSetupDSTXY(pSingleCMD, dst_x, dst_y);
14667fe5393cSmrg        pSingleCMD++;
146715fb4814Smrg        ASTSetupRECTXY(pSingleCMD, width, height);
14687fe5393cSmrg        pSingleCMD++;
14697fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, cmdreg);
14707fe5393cSmrg
147115fb4814Smrg        /* Update Write Pointer */
147215fb4814Smrg        mUpdateWritePointer;
14737fe5393cSmrg
147415fb4814Smrg    }
147515fb4814Smrg    else
14767fe5393cSmrg    {
14777fe5393cSmrg        ASTSetupSRCBase_MMIO(srcbase);
14787fe5393cSmrg        ASTSetupSRCPitch_MMIO(srcpitch);
147915fb4814Smrg        ASTSetupDSTBase_MMIO(dstbase);
148015fb4814Smrg        ASTSetupDSTXY_MMIO(dst_x, dst_y);
148115fb4814Smrg        ASTSetupRECTXY_MMIO(width, height);
14827fe5393cSmrg        ASTSetupCMDReg_MMIO(cmdreg);
14837fe5393cSmrg
1484621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
14857fe5393cSmrg
148615fb4814Smrg    }
14877fe5393cSmrg
148815fb4814Smrg}
148915fb4814Smrg
14907fe5393cSmrg
149115fb4814Smrg/* Clipping */
149215fb4814Smrgstatic void
1493de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y)
149415fb4814Smrg{
149515fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
149615fb4814Smrg    PKT_SC *pSingleCMD;
1497de78e416Smrg
14987fe5393cSmrg    if (!pAST->MMIO2D)
149915fb4814Smrg    {
150015fb4814Smrg        /* Write to CMDQ */
1501621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2);
150215fb4814Smrg
1503de78e416Smrg        ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y);
150415fb4814Smrg        pSingleCMD++;
1505de78e416Smrg        ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
15067fe5393cSmrg
1507de78e416Smrg        /* Update Write Pointer */
1508de78e416Smrg        mUpdateWritePointer;
15097fe5393cSmrg
151015fb4814Smrg    }
151115fb4814Smrg    else
151215fb4814Smrg    {
1513de78e416Smrg        ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y);
15147fe5393cSmrg        ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1);
151515fb4814Smrg    }
15167fe5393cSmrg
15177fe5393cSmrg}
1518de78e416Smrg
1519de78e416Smrgstatic void
1520de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn,
1521de78e416Smrg                        int left, int top, int right, int bottom)
1522de78e416Smrg{
15237fe5393cSmrg
1524de78e416Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
1525de78e416Smrg    PKT_SC *pSingleCMD;
15267fe5393cSmrg/*
1527de78e416Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n");
15287fe5393cSmrg*/
1529de78e416Smrg    pAST->EnableClip = TRUE;
15307fe5393cSmrg
1531de78e416Smrg    pAST->clip_left   = left;
1532de78e416Smrg    pAST->clip_top    = top;
1533de78e416Smrg    pAST->clip_right  = right;
1534de78e416Smrg    pAST->clip_bottom = bottom;
15357fe5393cSmrg
153615fb4814Smrg}
153715fb4814Smrg
153815fb4814Smrgstatic void
153915fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn)
154015fb4814Smrg{
154115fb4814Smrg    ASTRecPtr pAST = ASTPTR(pScrn);
15427fe5393cSmrg/*
154315fb4814Smrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n");
15447fe5393cSmrg*/
154515fb4814Smrg    pAST->EnableClip = FALSE;
154615fb4814Smrg}
154715fb4814Smrg
1548b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
1549b410ddbeSmrg                                           int x1, int y1, int x2, int y2, int flags)
1550b410ddbeSmrg{
15517fe5393cSmrg
1552b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1553b410ddbeSmrg    PKT_SC 	*pSingleCMD;
1554b410ddbeSmrg    ULONG 	dstbase, ulCommand;
15557fe5393cSmrg    ULONG	miny, maxy;
1556b410ddbeSmrg/*
1557b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n");
15587fe5393cSmrg*/
1559b410ddbeSmrg
1560b410ddbeSmrg    /* Modify Reg. Value */
1561b410ddbeSmrg    ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE;
1562b410ddbeSmrg    if(flags & OMIT_LAST)
1563b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1564b410ddbeSmrg    else
1565b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1566b410ddbeSmrg    if (pAST->EnableClip)
1567b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1568b410ddbeSmrg    else
15697fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
1570b410ddbeSmrg    dstbase = 0;
1571b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1572b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1573b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1574b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1575b410ddbeSmrg        y1 -= miny;
1576b410ddbeSmrg        y2 -= miny;
1577b410ddbeSmrg    }
1578b410ddbeSmrg
15797fe5393cSmrg    if (!pAST->MMIO2D)
15807fe5393cSmrg    {
15817fe5393cSmrg        /* Write to CMDQ */
1582621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1583b410ddbeSmrg
1584b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
15857fe5393cSmrg        pSingleCMD++;
1586b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1587b410ddbeSmrg        pSingleCMD++;
1588b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1589b410ddbeSmrg        pSingleCMD++;
1590b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
15917fe5393cSmrg        pSingleCMD++;
15927fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
15937fe5393cSmrg
1594b410ddbeSmrg        /* Update Write Pointer */
15957fe5393cSmrg        mUpdateWritePointer;
1596b410ddbeSmrg
1597b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1598621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
15997fe5393cSmrg
1600b410ddbeSmrg    }
1601b410ddbeSmrg    else
16027fe5393cSmrg    {
1603b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1604b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1605b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1606b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
16077fe5393cSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16087fe5393cSmrg
1609621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
16107fe5393cSmrg
1611b410ddbeSmrg    }
1612b410ddbeSmrg
16137fe5393cSmrg
1614b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */
1615b410ddbeSmrg
1616b410ddbeSmrgstatic void
1617b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
1618b410ddbeSmrg                                int x1, int y1, int x2, int y2,
1619b410ddbeSmrg                                int flags, int phase)
1620b410ddbeSmrg{
16217fe5393cSmrg
1622b410ddbeSmrg    ASTRecPtr 	pAST = ASTPTR(pScrn);
1623b410ddbeSmrg    PKT_SC 	*pSingleCMD;
16247fe5393cSmrg    ULONG 	dstbase, ulCommand;
16257fe5393cSmrg    ULONG	miny, maxy;
1626b410ddbeSmrg/*
1627b410ddbeSmrg    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n");
16287fe5393cSmrg*/
1629b410ddbeSmrg
1630b410ddbeSmrg    /* Modify Reg. Value */
1631b410ddbeSmrg    ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE;
1632b410ddbeSmrg    if(flags & OMIT_LAST)
1633b410ddbeSmrg        ulCommand |= CMD_NOT_DRAW_LAST_PIXEL;
1634b410ddbeSmrg    else
1635b410ddbeSmrg        ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL;
1636b410ddbeSmrg    if (pAST->EnableClip)
1637b410ddbeSmrg        ulCommand |= CMD_ENABLE_CLIP;
1638b410ddbeSmrg    else
16397fe5393cSmrg        ulCommand &= ~CMD_ENABLE_CLIP;
16407fe5393cSmrg    dstbase = 0;
1641b410ddbeSmrg    miny = (y1 > y2) ? y2 : y1;
1642b410ddbeSmrg    maxy = (y1 > y2) ? y1 : y2;
1643b410ddbeSmrg    if(maxy >= pScrn->virtualY) {
1644b410ddbeSmrg        dstbase = pAST->VideoModeInfo.ScreenPitch * miny;
1645b410ddbeSmrg        y1 -= miny;
1646b410ddbeSmrg        y2 -= miny;
1647b410ddbeSmrg    }
1648b410ddbeSmrg
16497fe5393cSmrg    if (!pAST->MMIO2D)
16507fe5393cSmrg    {
16517fe5393cSmrg        /* Write to CMDQ */
1652621ff18cSmrg        pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5);
1653b410ddbeSmrg
1654b410ddbeSmrg        ASTSetupDSTBase(pSingleCMD, dstbase);
16557fe5393cSmrg        pSingleCMD++;
1656b410ddbeSmrg        AIPSetupLineXY(pSingleCMD, x1, y1);
1657b410ddbeSmrg        pSingleCMD++;
1658b410ddbeSmrg        AIPSetupLineXY2(pSingleCMD, x2, y2);
1659b410ddbeSmrg        pSingleCMD++;
1660b410ddbeSmrg        AIPSetupLineNumber(pSingleCMD, 0);
16617fe5393cSmrg        pSingleCMD++;
16627fe5393cSmrg        ASTSetupCMDReg(pSingleCMD, ulCommand);
16637fe5393cSmrg
1664b410ddbeSmrg        /* Update Write Pointer */
1665b410ddbeSmrg        mUpdateWritePointer;
1666b410ddbeSmrg
1667b410ddbeSmrg        /* Patch KDE pass abnormal point, ycchen@052507 */
1668621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
16697fe5393cSmrg
1670b410ddbeSmrg    }
1671b410ddbeSmrg    else
16727fe5393cSmrg    {
1673b410ddbeSmrg        ASTSetupDSTBase_MMIO(dstbase);
1674b410ddbeSmrg        AIPSetupLineXY_MMIO(x1, y1);
1675b410ddbeSmrg        AIPSetupLineXY2_MMIO(x2, y2);
1676b410ddbeSmrg        AIPSetupLineNumber_MMIO(0);
1677b410ddbeSmrg        ASTSetupCMDReg_MMIO(ulCommand);
16787fe5393cSmrg
1679621ff18cSmrg        vASTWaitEngIdle(pScrn, pAST);
16807fe5393cSmrg
1681b410ddbeSmrg    }
16827fe5393cSmrg
1683b410ddbeSmrg}
16847fe5393cSmrg#endif	/* HAVE_XAA_H */
1685b410ddbeSmrg
1686b534f209Smrg#ifdef	AstVideo
1687b534f209Smrg/*
1688b534f209Smrg * Video Part
1689b534f209Smrg * by ic_yang
1690b534f209Smrg */
1691b534f209Smrg#include "fourcc.h"
1692b534f209Smrg
1693b534f209Smrgvoid ASTDisplayVideo(ScrnInfoPtr pScrn, ASTPortPrivPtr pPriv, RegionPtr clipBoxes, int id)
1694b534f209Smrg{
1695b534f209Smrg    ASTPtr              pAST = ASTPTR(pScrn);
16967fe5393cSmrg    int                 nBoxs;
1697b534f209Smrg    int                 ScaleFactorH, ScaleFactorV;
1698b534f209Smrg    ULONG               InitScaleFactorH, InitScaleFactorV;
1699b534f209Smrg    BURSTSCALECMD       CopyCmd = {0};
1700b534f209Smrg    PBURSTSCALECMD      pCopyCmd = NULL;
1701b534f209Smrg    float               fScaleX = 0, fScaleY = 0;
1702b534f209Smrg    xRectangle          rect;
1703b534f209Smrg    BoxPtr              pBox = NULL;
1704b534f209Smrg    short               lSrcX, lSrcY;
1705b534f209Smrg    ULONG               dwCmd = 0;
1706b534f209Smrg    int                 i;
17077fe5393cSmrg
1708b534f209Smrg    pBox = REGION_RECTS(clipBoxes);
1709b534f209Smrg    nBoxs = REGION_NUM_RECTS(clipBoxes);
1710b534f209Smrg
1711b534f209Smrg    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MMIO=%x,pBox=%x, nBoxs=%x\n", pAST->MMIO2D, pBox, nBoxs);
17127fe5393cSmrg
1713b534f209Smrg    if(0==pPriv->drw_w || 0==pPriv->drw_h)
1714b534f209Smrg    {
1715b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drwx=%x, drwy=%x\n", pPriv->drw_w, pPriv->drw_h);
1716b534f209Smrg        return;
1717b534f209Smrg    }
1718b534f209Smrg
1719b534f209Smrg    /* calc scaling factor */
1720b534f209Smrg    fScaleX = (float)pPriv->src_w /(float)pPriv->drw_w;
1721b534f209Smrg    fScaleY = (float)pPriv->src_h /(float)pPriv->drw_h;
17227fe5393cSmrg
1723b534f209Smrg    if (pPriv->src_w == pPriv->drw_w)
1724b534f209Smrg        ScaleFactorH = 0x8000;
1725b534f209Smrg    else
1726b534f209Smrg        ScaleFactorH = (ULONG)((pPriv->src_w-1)*0x8000)/pPriv->drw_w;
1727b534f209Smrg
1728b534f209Smrg    if (pPriv->src_h == pPriv->drw_h)
1729b534f209Smrg    {
1730b534f209Smrg        ScaleFactorV = 0x8000;
1731b534f209Smrg		dwCmd |= SCALE_EQUAL_VER; /* Setting it save the bandwidtch */
1732b534f209Smrg   	}
1733b534f209Smrg    else
1734b534f209Smrg   	{
1735b534f209Smrg        ScaleFactorV = (ULONG)((pPriv->src_h-1)*0x8000)/pPriv->drw_h;
1736b534f209Smrg    }
1737b534f209Smrg
1738b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1739b534f209Smrg        InitScaleFactorH = 0;
1740b534f209Smrg    else
1741b534f209Smrg        InitScaleFactorH = 0x4000;
1742b534f209Smrg
1743b534f209Smrg    if (pPriv->drw_h >= pPriv->src_h)
1744b534f209Smrg        InitScaleFactorV = 0;
1745b534f209Smrg    else
1746b534f209Smrg        InitScaleFactorV = 0x4000;
1747b534f209Smrg
17487fe5393cSmrg    switch(pScrn->bitsPerPixel)
1749b534f209Smrg    {
1750b534f209Smrg    case 32:
1751b534f209Smrg        dwCmd   = CMD_COLOR_32;
1752b534f209Smrg        break;
1753b534f209Smrg    case 16:
1754b534f209Smrg        dwCmd   = CMD_COLOR_16;
1755b534f209Smrg        break;
1756b534f209Smrg    case  8:
1757b534f209Smrg        dwCmd   = CMD_COLOR_08;
1758b534f209Smrg        break;
1759b534f209Smrg    }
1760b534f209Smrg
1761b534f209Smrg    dwCmd |= CMD_TYPE_SCALE;
1762b534f209Smrg    if (pPriv->drw_w >= pPriv->src_w)
1763b534f209Smrg        dwCmd |= SCALE_SEG_NUM_1;
1764b534f209Smrg    else
1765b534f209Smrg        dwCmd |= SCALE_SEG_NUM_2;
1766b534f209Smrg
1767b534f209Smrg    dwCmd |= SCALE_FORMAT_YUV2RGB;
1768b534f209Smrg    switch(id)
1769b534f209Smrg    {
1770b534f209Smrg    case PIXEL_FMT_YUY2:
17717fe5393cSmrg        dwCmd |= YUV_FORMAT_YUYV;
1772b534f209Smrg        break;
17737fe5393cSmrg    case PIXEL_FMT_UYVY:
17747fe5393cSmrg        dwCmd |= YUV_FORMAT_UYVY;
1775b534f209Smrg        break;
1776b534f209Smrg    default:
1777b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Other pix format:%x\n", id);
1778b534f209Smrg        break;
1779b534f209Smrg    }
17807fe5393cSmrg
1781b534f209Smrg    for(i = 0; i < nBoxs; i++, pBox++)
1782b534f209Smrg    {
1783b534f209Smrg        rect.x = pBox->x1 - pPriv->drw_x;
1784b534f209Smrg        rect.y = pBox->y1 - pPriv->drw_y;
1785b534f209Smrg        rect.width = pBox->x2 - pBox->x1;
17867fe5393cSmrg        rect.height = pBox->y2 - pBox->y1;
17877fe5393cSmrg
1788b534f209Smrg        lSrcX = (ULONG)((float)rect.x * fScaleX + pPriv->src_x + 0.5f);
1789b534f209Smrg        lSrcY = (ULONG)((float)rect.y * fScaleY + pPriv->src_y + 0.5f);
17907fe5393cSmrg
1791621ff18cSmrg        pCopyCmd = (BURSTSCALECMD*)pASTjRequestCMDQ(pAST, PKT_TYPESCALE_LENGTH);
17927fe5393cSmrg
17937fe5393cSmrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pCopyCmd=%p, pBox=%x,%x,%x,%x\n", pCopyCmd, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
17947fe5393cSmrg
1795b534f209Smrg        CopyCmd.dwHeader0        = (ULONG)  PKT_BURST_CMD_HEADER0 |
1796b534f209Smrg                                             PKT_TYPESCALE_DATALENGTH |
1797b534f209Smrg                                             PKT_TYPESCALE_ADDRSTART  |
1798b534f209Smrg                                             BURST_FORCE_CMD;
1799b534f209Smrg
1800b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CopyCmd.dwHeader0=%x\n", CopyCmd.dwHeader0);
1801b534f209Smrg
1802b534f209Smrg        CopyCmd.dwSrcPitch       = (ULONG)(pPriv->srcPitch << 16);
18037fe5393cSmrg
1804b534f209Smrg        CopyCmd.dwDstHeightPitch = (ULONG)  ((pAST->VideoModeInfo.ScreenPitch << 16) | 0xFFFF);
18057fe5393cSmrg
18067fe5393cSmrg        CopyCmd.dwDstXY          = (ULONG) ((pBox->x1 << 16) | (pBox->y1 & 0xFFFF));
18077fe5393cSmrg        CopyCmd.dwSrcXY          = (ULONG) ((lSrcX << 16) | (lSrcY & 0xFFFF));
18087fe5393cSmrg        CopyCmd.dwRecHeightWidth = (ULONG) ((rect.width << 16) | rect.height);
18097fe5393cSmrg
1810b534f209Smrg        CopyCmd.dwInitScaleFactorH = InitScaleFactorH;
1811b534f209Smrg        CopyCmd.dwInitScaleFactorV = InitScaleFactorV;
18127fe5393cSmrg        CopyCmd.dwScaleFactorH   = ScaleFactorH;
1813b534f209Smrg        CopyCmd.dwScaleFactorV   = ScaleFactorV;
1814b534f209Smrg
1815b534f209Smrg        CopyCmd.dwSrcBaseAddr = pPriv->bufAddr[pPriv->currentBuf];
1816b534f209Smrg        CopyCmd.dwDstBaseAddr = 0;
1817b534f209Smrg        CopyCmd.dwCmd = dwCmd;
1818b534f209Smrg        CopyCmd.NullData[0] = 0;    /* for alignment */
1819b534f209Smrg        memcpy(pCopyCmd, &CopyCmd, sizeof(CopyCmd));
18207fe5393cSmrg
1821b534f209Smrg        mUpdateWritePointer;
18227fe5393cSmrg
18237fe5393cSmrg#if 0
1824b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1825b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8000),
1826b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8004),
1827b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8008),
1828b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x800C));
1829b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1830b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8010),
1831b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8014),
1832b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8018),
1833b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x801C));
1834b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1835b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8020),
1836b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8024),
1837b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8028),
1838b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x802C));
1839b534f209Smrg        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n",
1840b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8030),
1841b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8034),
1842b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x8038),
1843b534f209Smrg                        *(ULONG *)(pAST->MMIOVirtualAddr+0x803C));
1844b534f209Smrg#endif
1845b534f209Smrg
1846b534f209Smrg    } /* End of for-loop */
18477fe5393cSmrg
1848b534f209Smrg} /* ASTDisplayVideo */
1849b534f209Smrg#endif	/* AstVideo */
1850b534f209Smrg
185115fb4814Smrg#endif	/* end of Accel_2D */
1852