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