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