ast_accel.c revision b4d38c65
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 "mibstore.h" 3115fb4814Smrg#include "vgaHW.h" 3215fb4814Smrg#include "mipointer.h" 3315fb4814Smrg#include "micmap.h" 3415fb4814Smrg 3515fb4814Smrg#include "fb.h" 3615fb4814Smrg#include "regionstr.h" 3715fb4814Smrg#include "xf86xv.h" 3815fb4814Smrg#include <X11/extensions/Xv.h> 3915fb4814Smrg#include "vbe.h" 4015fb4814Smrg 4115fb4814Smrg#include "xf86PciInfo.h" 4215fb4814Smrg#include "xf86Pci.h" 4315fb4814Smrg 4415fb4814Smrg/* framebuffer offscreen manager */ 4515fb4814Smrg#include "xf86fbman.h" 4615fb4814Smrg 4715fb4814Smrg/* include xaa includes */ 48b4d38c65Smrg#ifdef HAVE_XAA_H 4915fb4814Smrg#include "xaa.h" 50b4d38c65Smrg#endif 5115fb4814Smrg#include "xaarop.h" 5215fb4814Smrg 5315fb4814Smrg/* H/W cursor support */ 5415fb4814Smrg#include "xf86Cursor.h" 5515fb4814Smrg 5615fb4814Smrg/* Driver specific headers */ 5715fb4814Smrg#include "ast.h" 5815fb4814Smrg 5915fb4814Smrg#ifdef Accel_2D 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); 108b4d38c65Smrg#ifdef HAVE_XAA_H 10915fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn); 11015fb4814Smrgstatic 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, 11415fb4814Smrg int y2, int w, int h); 11515fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn, 11615fb4814Smrg int color, int rop, unsigned int planemask); 11715fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn, 11815fb4814Smrg 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, 12415fb4814Smrg 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, 13015fb4814Smrg 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); 15515fb4814Smrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn); 156de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y); 15715fb4814Smrg 158b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 159b410ddbeSmrg 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); 163b4d38c65Smrg#endif 164b410ddbeSmrg 16515fb4814SmrgBool 16615fb4814SmrgASTAccelInit(ScreenPtr pScreen) 16715fb4814Smrg{ 168b4d38c65Smrg#ifdef HAVE_XAA_H 16915fb4814Smrg XAAInfoRecPtr infoPtr; 170b4d38c65Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 17115fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 17215fb4814Smrg 17315fb4814Smrg pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec(); 17415fb4814Smrg if (!infoPtr) return FALSE; 17515fb4814Smrg 17615fb4814Smrg infoPtr->Flags = LINEAR_FRAMEBUFFER | 17715fb4814Smrg OFFSCREEN_PIXMAPS | 17815fb4814Smrg PIXMAP_CACHE; 17915fb4814Smrg 18015fb4814Smrg /* Sync */ 18115fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Sync) 18215fb4814Smrg infoPtr->Sync = ASTSync; 18315fb4814Smrg 18415fb4814Smrg /* Screen To Screen copy */ 18515fb4814Smrg if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy) 18615fb4814Smrg { 18715fb4814Smrg infoPtr->SetupForScreenToScreenCopy = ASTSetupForScreenToScreenCopy; 18815fb4814Smrg infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy; 18915fb4814Smrg infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK; 19015fb4814Smrg } 19115fb4814Smrg 19215fb4814Smrg /* Solid fill */ 19315fb4814Smrg if (pAST->ENGCaps & ENG_CAP_SolidFill) 19415fb4814Smrg { 19515fb4814Smrg infoPtr->SetupForSolidFill = ASTSetupForSolidFill; 19615fb4814Smrg infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect; 19715fb4814Smrg infoPtr->SolidFillFlags = NO_PLANEMASK; 19815fb4814Smrg } 19915fb4814Smrg 20015fb4814Smrg /* Solid Lines */ 20115fb4814Smrg if (pAST->ENGCaps & ENG_CAP_SolidLine) 20215fb4814Smrg { 203b534f209Smrg if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) ) 204b410ddbeSmrg { 205b410ddbeSmrg infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine; 206b410ddbeSmrg } 207b410ddbeSmrg else 208b410ddbeSmrg { 209b410ddbeSmrg infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine; 210b410ddbeSmrg } 211b410ddbeSmrg 212b410ddbeSmrg infoPtr->SetupForSolidLine = ASTSetupForSolidLine; 21315fb4814Smrg infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine; 21415fb4814Smrg infoPtr->SolidLineFlags = NO_PLANEMASK; 21515fb4814Smrg } 21615fb4814Smrg 21715fb4814Smrg /* Dashed Lines */ 21815fb4814Smrg if (pAST->ENGCaps & ENG_CAP_DashedLine) 219b410ddbeSmrg { 220b534f209Smrg if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST1180) ) 221b410ddbeSmrg { 222b410ddbeSmrg infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine; 223b410ddbeSmrg } 224b410ddbeSmrg else 225b410ddbeSmrg { 226b410ddbeSmrg infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine; 227b410ddbeSmrg } 228b410ddbeSmrg 229b410ddbeSmrg infoPtr->SetupForDashedLine = ASTSetupForDashedLine; 23015fb4814Smrg infoPtr->DashPatternMaxLength = 64; 23115fb4814Smrg infoPtr->DashedLineFlags = NO_PLANEMASK | 23215fb4814Smrg LINE_PATTERN_MSBFIRST_LSBJUSTIFIED; 23315fb4814Smrg } 23415fb4814Smrg 23515fb4814Smrg /* 8x8 mono pattern fill */ 23615fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill) 23715fb4814Smrg { 23815fb4814Smrg infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill; 23915fb4814Smrg infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill; 24015fb4814Smrg infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | 24115fb4814Smrg NO_TRANSPARENCY | 24215fb4814Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 24315fb4814Smrg HARDWARE_PATTERN_PROGRAMMED_BITS | 24415fb4814Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 24515fb4814Smrg } 24615fb4814Smrg 24715fb4814Smrg /* 8x8 color pattern fill */ 24815fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill) 24915fb4814Smrg { 25015fb4814Smrg infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill; 25115fb4814Smrg infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect; 25215fb4814Smrg infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK | 25315fb4814Smrg NO_TRANSPARENCY | 25415fb4814Smrg HARDWARE_PATTERN_SCREEN_ORIGIN; 25515fb4814Smrg } 25615fb4814Smrg 25715fb4814Smrg /* CPU To Screen Color Expand */ 25815fb4814Smrg if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand) 25915fb4814Smrg { 26015fb4814Smrg infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill; 26115fb4814Smrg infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill; 26215fb4814Smrg infoPtr->ColorExpandRange = MAX_PATReg_Size; 26315fb4814Smrg infoPtr->ColorExpandBase = MMIOREG_PAT; 26415fb4814Smrg infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK | 26515fb4814Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 26615fb4814Smrg } 26715fb4814Smrg 26815fb4814Smrg /* Screen To Screen Color Expand */ 26915fb4814Smrg if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand) 27015fb4814Smrg { 27115fb4814Smrg infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill; 27215fb4814Smrg infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill; 27315fb4814Smrg infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK | 27415fb4814Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 27515fb4814Smrg } 27615fb4814Smrg 27715fb4814Smrg /* Clipping */ 27815fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Clipping) 27915fb4814Smrg { 28015fb4814Smrg infoPtr->SetClippingRectangle = ASTSetClippingRectangle; 28115fb4814Smrg infoPtr->DisableClipping = ASTDisableClipping; 28215fb4814Smrg infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | 28315fb4814Smrg HARDWARE_CLIP_MONO_8x8_FILL | 28415fb4814Smrg HARDWARE_CLIP_COLOR_8x8_FILL | 28515fb4814Smrg HARDWARE_CLIP_SOLID_LINE | 28615fb4814Smrg HARDWARE_CLIP_DASHED_LINE | 28715fb4814Smrg HARDWARE_CLIP_SOLID_LINE; 28815fb4814Smrg } 28915fb4814Smrg 29015fb4814Smrg return(XAAInit(pScreen, infoPtr)); 291b4d38c65Smrg#else 292b4d38c65Smrg return TRUE; 293b4d38c65Smrg#endif 29415fb4814Smrg} /* end of ASTAccelInit */ 29515fb4814Smrg 296b4d38c65Smrg#ifdef HAVE_XAA_H 29715fb4814Smrgstatic void 29815fb4814SmrgASTSync(ScrnInfoPtr pScrn) 29915fb4814Smrg{ 30015fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 30115fb4814Smrg 30215fb4814Smrg /* wait engle idle */ 30315fb4814Smrg vWaitEngIdle(pScrn, pAST); 30415fb4814Smrg 30515fb4814Smrg} /* end of ASTSync */ 30615fb4814Smrg 30715fb4814Smrg 30815fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 30915fb4814Smrg int xdir, int ydir, int rop, 31015fb4814Smrg unsigned int planemask, int trans_color) 31115fb4814Smrg{ 31215fb4814Smrg 31315fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 31415fb4814Smrg PKT_SC *pSingleCMD; 31515fb4814Smrg ULONG cmdreg; 31615fb4814Smrg 31715fb4814Smrg/* 31815fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n"); 31915fb4814Smrg*/ 32015fb4814Smrg /* Modify Reg. Value */ 32115fb4814Smrg cmdreg = CMD_BITBLT; 32215fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 32315fb4814Smrg { 32415fb4814Smrg case 8: 32515fb4814Smrg cmdreg |= CMD_COLOR_08; 32615fb4814Smrg break; 32715fb4814Smrg case 15: 32815fb4814Smrg case 16: 32915fb4814Smrg cmdreg |= CMD_COLOR_16; 33015fb4814Smrg break; 33115fb4814Smrg case 24: 33215fb4814Smrg case 32: 33315fb4814Smrg cmdreg |= CMD_COLOR_32; 33415fb4814Smrg break; 33515fb4814Smrg } 33615fb4814Smrg cmdreg |= (ASTXAACopyROP[rop] << 8); 33715fb4814Smrg pAST->ulCMDReg = cmdreg; 33815fb4814Smrg 33915fb4814Smrg if (!pAST->MMIO2D) 34015fb4814Smrg { 34115fb4814Smrg /* Write to CMDQ */ 34215fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2); 34315fb4814Smrg 34415fb4814Smrg ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch); 34515fb4814Smrg pSingleCMD++; 34615fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 347de78e416Smrg 348de78e416Smrg /* Update Write Pointer */ 349de78e416Smrg mUpdateWritePointer; 350de78e416Smrg 35115fb4814Smrg } 35215fb4814Smrg else 35315fb4814Smrg { 35415fb4814Smrg /* Write to MMIO */ 35515fb4814Smrg ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch); 35615fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 35715fb4814Smrg } 35815fb4814Smrg 35915fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */ 36015fb4814Smrg 36115fb4814Smrgstatic void 36215fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, 36315fb4814Smrg int y2, int width, int height) 36415fb4814Smrg{ 36515fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 36615fb4814Smrg PKT_SC *pSingleCMD; 36715fb4814Smrg int src_x, src_y, dst_x, dst_y; 36815fb4814Smrg ULONG srcbase, dstbase, cmdreg; 369de78e416Smrg int delta_y = 0; 37015fb4814Smrg/* 37115fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n"); 37215fb4814Smrg*/ 37315fb4814Smrg 374de78e416Smrg if ((width != 0) && (height != 0)) 375de78e416Smrg { 376de78e416Smrg /* Modify Reg. Value */ 377de78e416Smrg cmdreg = pAST->ulCMDReg; 378de78e416Smrg if (pAST->EnableClip) 379de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 380de78e416Smrg else 381de78e416Smrg cmdreg &= ~CMD_ENABLE_CLIP; 382de78e416Smrg srcbase = dstbase = 0; 383de78e416Smrg 384de78e416Smrg if (x1 < x2) 385de78e416Smrg cmdreg |= CMD_X_DEC; 386de78e416Smrg 387de78e416Smrg if (y1 < y2) 388de78e416Smrg cmdreg |= CMD_Y_DEC; 38915fb4814Smrg 390de78e416Smrg if ((y1 + height) >= MAX_SRC_Y) 391de78e416Smrg { 392de78e416Smrg srcbase=pAST->VideoModeInfo.ScreenPitch*y1; 393de78e416Smrg y1 = 0; 394de78e416Smrg } 395de78e416Smrg 396de78e416Smrg if ((y2 + height) >= pScrn->virtualY) 397de78e416Smrg { 398de78e416Smrg delta_y = y2; 399de78e416Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*y2; 400de78e416Smrg y2 = 0; 401de78e416Smrg } 402de78e416Smrg 403de78e416Smrg if (cmdreg & CMD_X_DEC) 404de78e416Smrg { 405de78e416Smrg src_x = x1 + width - 1; 406de78e416Smrg dst_x = x2 + width - 1; 407de78e416Smrg } 408de78e416Smrg else 409de78e416Smrg { 410de78e416Smrg src_x = x1; 411de78e416Smrg dst_x = x2; 412de78e416Smrg } 413de78e416Smrg 414de78e416Smrg if (cmdreg & CMD_Y_DEC) 415de78e416Smrg { 416de78e416Smrg src_y = y1 + height - 1; 417de78e416Smrg dst_y = y2 + height - 1; 418de78e416Smrg } 419de78e416Smrg else 420de78e416Smrg { 421de78e416Smrg src_y = y1; 422de78e416Smrg dst_y = y2; 423de78e416Smrg } 424de78e416Smrg 425de78e416Smrg if (pAST->EnableClip) 426de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 427de78e416Smrg 428de78e416Smrg if (!pAST->MMIO2D) 429de78e416Smrg { 430de78e416Smrg /* Write to CMDQ */ 431de78e416Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6); 43215fb4814Smrg 433de78e416Smrg ASTSetupSRCBase(pSingleCMD, srcbase); 434de78e416Smrg pSingleCMD++; 435de78e416Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 436de78e416Smrg pSingleCMD++; 437de78e416Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 438de78e416Smrg pSingleCMD++; 439de78e416Smrg ASTSetupSRCXY(pSingleCMD, src_x, src_y); 440de78e416Smrg pSingleCMD++; 441de78e416Smrg ASTSetupRECTXY(pSingleCMD, width, height); 442de78e416Smrg pSingleCMD++; 443de78e416Smrg ASTSetupCMDReg(pSingleCMD, cmdreg); 444de78e416Smrg 445de78e416Smrg /* Update Write Pointer */ 446de78e416Smrg mUpdateWritePointer; 44715fb4814Smrg 448de78e416Smrg } 449de78e416Smrg else 450de78e416Smrg { 451de78e416Smrg ASTSetupSRCBase_MMIO(srcbase); 452de78e416Smrg ASTSetupDSTBase_MMIO(dstbase); 453de78e416Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 454de78e416Smrg ASTSetupSRCXY_MMIO(src_x, src_y); 455de78e416Smrg ASTSetupRECTXY_MMIO(width, height); 456de78e416Smrg ASTSetupCMDReg_MMIO(cmdreg); 457de78e416Smrg 458de78e416Smrg vWaitEngIdle(pScrn, pAST); 459de78e416Smrg } 460de78e416Smrg 461de78e416Smrg } /* width & height check */ 46215fb4814Smrg 46315fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */ 46415fb4814Smrg 46515fb4814Smrgstatic void 46615fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn, 46715fb4814Smrg int color, int rop, unsigned int planemask) 46815fb4814Smrg{ 46915fb4814Smrg 47015fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 47115fb4814Smrg PKT_SC *pSingleCMD; 47215fb4814Smrg ULONG cmdreg; 47315fb4814Smrg 47415fb4814Smrg/* 47515fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n"); 47615fb4814Smrg*/ 47715fb4814Smrg /* Modify Reg. Value */ 47815fb4814Smrg cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR; 47915fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 48015fb4814Smrg { 48115fb4814Smrg case 8: 48215fb4814Smrg cmdreg |= CMD_COLOR_08; 48315fb4814Smrg break; 48415fb4814Smrg case 15: 48515fb4814Smrg case 16: 48615fb4814Smrg cmdreg |= CMD_COLOR_16; 48715fb4814Smrg break; 48815fb4814Smrg case 24: 48915fb4814Smrg case 32: 49015fb4814Smrg cmdreg |= CMD_COLOR_32; 49115fb4814Smrg break; 49215fb4814Smrg } 49315fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 49415fb4814Smrg pAST->ulCMDReg = cmdreg; 49515fb4814Smrg 49615fb4814Smrg if (!pAST->MMIO2D) 49715fb4814Smrg { 49815fb4814Smrg /* Write to CMDQ */ 49915fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2); 50015fb4814Smrg 50115fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 50215fb4814Smrg pSingleCMD++; 503de78e416Smrg ASTSetupFG(pSingleCMD, color); 504de78e416Smrg 505de78e416Smrg /* Update Write Pointer */ 506de78e416Smrg mUpdateWritePointer; 507de78e416Smrg 50815fb4814Smrg } 50915fb4814Smrg else 51015fb4814Smrg { 51115fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 51215fb4814Smrg ASTSetupFG_MMIO(color); 51315fb4814Smrg } 51415fb4814Smrg 51515fb4814Smrg} /* end of ASTSetupForSolidFill */ 51615fb4814Smrg 51715fb4814Smrg 51815fb4814Smrgstatic void 51915fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn, 52015fb4814Smrg int dst_x, int dst_y, int width, int height) 52115fb4814Smrg{ 52215fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 52315fb4814Smrg PKT_SC *pSingleCMD; 524de78e416Smrg ULONG dstbase, cmdreg; 525de78e416Smrg int delta_y = 0; 526de78e416Smrg 52715fb4814Smrg/* 52815fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n"); 52915fb4814Smrg*/ 53015fb4814Smrg 531de78e416Smrg if ((width != 0) && (height != 0)) 532de78e416Smrg { 533de78e416Smrg /* Modify Reg. Value */ 534de78e416Smrg cmdreg = pAST->ulCMDReg; 535de78e416Smrg if (pAST->EnableClip) 536de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 537de78e416Smrg else 538de78e416Smrg cmdreg &= ~CMD_ENABLE_CLIP; 539de78e416Smrg dstbase = 0; 540de78e416Smrg 541de78e416Smrg if (dst_y >= pScrn->virtualY) 542de78e416Smrg { 543de78e416Smrg delta_y = dst_y; 544de78e416Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 545de78e416Smrg dst_y=0; 546de78e416Smrg } 54715fb4814Smrg 548de78e416Smrg if (pAST->EnableClip) 549de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 550de78e416Smrg 551de78e416Smrg if (!pAST->MMIO2D) 552de78e416Smrg { 553de78e416Smrg /* Write to CMDQ */ 554de78e416Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 555de78e416Smrg 556de78e416Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 557de78e416Smrg pSingleCMD++; 558de78e416Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 559de78e416Smrg pSingleCMD++; 560de78e416Smrg ASTSetupRECTXY(pSingleCMD, width, height); 561de78e416Smrg pSingleCMD++; 562de78e416Smrg ASTSetupCMDReg(pSingleCMD, cmdreg); 563de78e416Smrg 564de78e416Smrg /* Update Write Pointer */ 565de78e416Smrg mUpdateWritePointer; 566de78e416Smrg 567de78e416Smrg } 568de78e416Smrg else 569de78e416Smrg { 570de78e416Smrg ASTSetupDSTBase_MMIO(dstbase); 571de78e416Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 572de78e416Smrg ASTSetupRECTXY_MMIO(width, height); 573de78e416Smrg ASTSetupCMDReg_MMIO(cmdreg); 574de78e416Smrg 575de78e416Smrg vWaitEngIdle(pScrn, pAST); 576de78e416Smrg 577de78e416Smrg } 578de78e416Smrg 579de78e416Smrg } /* width & height check */ 58015fb4814Smrg 58115fb4814Smrg 58215fb4814Smrg} /* end of ASTSubsequentSolidFillRect */ 58315fb4814Smrg 58415fb4814Smrg/* Line */ 58515fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn, 58615fb4814Smrg int color, int rop, unsigned int planemask) 58715fb4814Smrg{ 58815fb4814Smrg 58915fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 59015fb4814Smrg PKT_SC *pSingleCMD; 59115fb4814Smrg ULONG cmdreg; 59215fb4814Smrg/* 59315fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n"); 59415fb4814Smrg*/ 59515fb4814Smrg /* Modify Reg. Value */ 59615fb4814Smrg cmdreg = CMD_BITBLT; 59715fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 59815fb4814Smrg { 59915fb4814Smrg case 8: 60015fb4814Smrg cmdreg |= CMD_COLOR_08; 60115fb4814Smrg break; 60215fb4814Smrg case 15: 60315fb4814Smrg case 16: 60415fb4814Smrg cmdreg |= CMD_COLOR_16; 60515fb4814Smrg break; 60615fb4814Smrg case 24: 60715fb4814Smrg case 32: 60815fb4814Smrg cmdreg |= CMD_COLOR_32; 60915fb4814Smrg break; 61015fb4814Smrg } 61115fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 61215fb4814Smrg pAST->ulCMDReg = cmdreg; 61315fb4814Smrg 61415fb4814Smrg if (!pAST->MMIO2D) 61515fb4814Smrg { 61615fb4814Smrg /* Write to CMDQ */ 61715fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3); 61815fb4814Smrg 61915fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 62015fb4814Smrg pSingleCMD++; 62115fb4814Smrg ASTSetupFG(pSingleCMD, color); 62215fb4814Smrg pSingleCMD++; 62315fb4814Smrg ASTSetupBG(pSingleCMD, 0); 62415fb4814Smrg 625de78e416Smrg /* Update Write Pointer */ 626de78e416Smrg mUpdateWritePointer; 627de78e416Smrg 62815fb4814Smrg } 62915fb4814Smrg else 63015fb4814Smrg { 63115fb4814Smrg /* Write to MMIO */ 63215fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 63315fb4814Smrg ASTSetupFG_MMIO(color); 63415fb4814Smrg ASTSetupBG_MMIO(0); 63515fb4814Smrg } 63615fb4814Smrg 63715fb4814Smrg} /* end of ASTSetupForSolidLine */ 63815fb4814Smrg 63915fb4814Smrg 64015fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, 64115fb4814Smrg int x, int y, int len, int dir) 64215fb4814Smrg{ 64315fb4814Smrg 64415fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 64515fb4814Smrg PKT_SC *pSingleCMD; 64615fb4814Smrg ULONG dstbase, cmdreg; 64715fb4814Smrg int width, height; 648de78e416Smrg int delta_y = 0; 64915fb4814Smrg/* 65015fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n"); 65115fb4814Smrg*/ 65215fb4814Smrg 653de78e416Smrg if (len != 0) 654de78e416Smrg { 655de78e416Smrg /* Modify Reg. Value */ 656de78e416Smrg cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT; 657de78e416Smrg if (pAST->EnableClip) 658de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 659de78e416Smrg else 660de78e416Smrg cmdreg &= ~CMD_ENABLE_CLIP; 661de78e416Smrg dstbase = 0; 662de78e416Smrg 663de78e416Smrg if(dir == DEGREES_0) { /* horizontal */ 664de78e416Smrg width = len; 665de78e416Smrg height = 1; 666de78e416Smrg } else { /* vertical */ 667de78e416Smrg width = 1; 668de78e416Smrg height = len; 669de78e416Smrg } 670de78e416Smrg 671de78e416Smrg if ((y + height) >= pScrn->virtualY) 672de78e416Smrg { 673de78e416Smrg delta_y = y; 674de78e416Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*y; 675de78e416Smrg y=0; 676de78e416Smrg } 677de78e416Smrg 678de78e416Smrg if (pAST->EnableClip) 679de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 680de78e416Smrg 681de78e416Smrg if (!pAST->MMIO2D) 682de78e416Smrg { 683de78e416Smrg /* Write to CMDQ */ 684de78e416Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 685de78e416Smrg 686de78e416Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 687de78e416Smrg pSingleCMD++; 688de78e416Smrg ASTSetupDSTXY(pSingleCMD, x, y); 689de78e416Smrg pSingleCMD++; 690de78e416Smrg ASTSetupRECTXY(pSingleCMD, width, height); 691de78e416Smrg pSingleCMD++; 692de78e416Smrg ASTSetupCMDReg(pSingleCMD, cmdreg); 693de78e416Smrg 694de78e416Smrg /* Update Write Pointer */ 695de78e416Smrg mUpdateWritePointer; 696de78e416Smrg 697de78e416Smrg } 698de78e416Smrg else 699de78e416Smrg { 700de78e416Smrg ASTSetupDSTBase_MMIO(dstbase); 701de78e416Smrg ASTSetupDSTXY_MMIO(x, y); 702de78e416Smrg ASTSetupRECTXY_MMIO(width, height); 703de78e416Smrg ASTSetupCMDReg_MMIO(cmdreg); 704de78e416Smrg 705de78e416Smrg vWaitEngIdle(pScrn, pAST); 706de78e416Smrg 707de78e416Smrg } 708de78e416Smrg 709de78e416Smrg } /* len check */ 71015fb4814Smrg 71115fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */ 71215fb4814Smrg 71315fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 71415fb4814Smrg int x1, int y1, int x2, int y2, int flags) 71515fb4814Smrg{ 71615fb4814Smrg 71715fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 71815fb4814Smrg PKT_SC *pSingleCMD; 71915fb4814Smrg LINEPARAM dsLineParam; 72015fb4814Smrg _LINEInfo LineInfo; 72115fb4814Smrg ULONG dstbase, ulCommand; 72215fb4814Smrg ULONG miny, maxy; 72315fb4814Smrg USHORT usXM; 724de78e416Smrg int delta_y = 0; 725de78e416Smrg 72615fb4814Smrg/* 72715fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n"); 72815fb4814Smrg*/ 72915fb4814Smrg 73015fb4814Smrg /* Modify Reg. Value */ 73115fb4814Smrg ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW; 73215fb4814Smrg if(flags & OMIT_LAST) 73315fb4814Smrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 73415fb4814Smrg else 73515fb4814Smrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 73615fb4814Smrg if (pAST->EnableClip) 73715fb4814Smrg ulCommand |= CMD_ENABLE_CLIP; 738de78e416Smrg else 739de78e416Smrg ulCommand &= ~CMD_ENABLE_CLIP; 74015fb4814Smrg dstbase = 0; 74115fb4814Smrg miny = (y1 > y2) ? y2 : y1; 74215fb4814Smrg maxy = (y1 > y2) ? y1 : y2; 74315fb4814Smrg if(maxy >= pScrn->virtualY) { 744de78e416Smrg delta_y = miny; 74515fb4814Smrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 74615fb4814Smrg y1 -= miny; 74715fb4814Smrg y2 -= miny; 74815fb4814Smrg } 749de78e416Smrg 75015fb4814Smrg LineInfo.X1 = x1; 75115fb4814Smrg LineInfo.Y1 = y1; 75215fb4814Smrg LineInfo.X2 = x2; 75315fb4814Smrg LineInfo.Y2 = y2; 75415fb4814Smrg 75515fb4814Smrg bGetLineTerm(&LineInfo, &dsLineParam); /* Get Line Parameter */ 75615fb4814Smrg 75715fb4814Smrg if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC) 75815fb4814Smrg ulCommand |= CMD_X_DEC; 75915fb4814Smrg if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC) 76015fb4814Smrg ulCommand |= CMD_Y_DEC; 76115fb4814Smrg 76215fb4814Smrg usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0; 763de78e416Smrg 764de78e416Smrg if (pAST->EnableClip) 765de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 76615fb4814Smrg 76715fb4814Smrg if (!pAST->MMIO2D) 76815fb4814Smrg { 76915fb4814Smrg /* Write to CMDQ */ 77015fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7); 77115fb4814Smrg 77215fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 77315fb4814Smrg pSingleCMD++; 77415fb4814Smrg ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY); 77515fb4814Smrg pSingleCMD++; 77615fb4814Smrg ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm); 77715fb4814Smrg pSingleCMD++; 77815fb4814Smrg ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth); 77915fb4814Smrg pSingleCMD++; 78015fb4814Smrg ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term); 78115fb4814Smrg pSingleCMD++; 78215fb4814Smrg ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term); 78315fb4814Smrg pSingleCMD++; 78415fb4814Smrg ASTSetupCMDReg(pSingleCMD, ulCommand); 78515fb4814Smrg 78615fb4814Smrg /* Update Write Pointer */ 78715fb4814Smrg mUpdateWritePointer; 788de78e416Smrg 789de78e416Smrg /* Patch KDE pass abnormal point, ycchen@052507 */ 790de78e416Smrg vWaitEngIdle(pScrn, pAST); 79115fb4814Smrg 79215fb4814Smrg } 79315fb4814Smrg else 79415fb4814Smrg { 79515fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 79615fb4814Smrg ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY); 79715fb4814Smrg ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm); 79815fb4814Smrg ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth); 79915fb4814Smrg ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term); 80015fb4814Smrg ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term); 80115fb4814Smrg ASTSetupCMDReg_MMIO(ulCommand); 80215fb4814Smrg 80315fb4814Smrg vWaitEngIdle(pScrn, pAST); 80415fb4814Smrg 80515fb4814Smrg } 80615fb4814Smrg 80715fb4814Smrg 80815fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */ 80915fb4814Smrg 81015fb4814Smrg/* Dash Line */ 81115fb4814Smrgstatic void 81215fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn, 81315fb4814Smrg int fg, int bg, int rop, unsigned int planemask, 81415fb4814Smrg int length, UCHAR *pattern) 81515fb4814Smrg{ 81615fb4814Smrg 81715fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 81815fb4814Smrg PKT_SC *pSingleCMD; 81915fb4814Smrg ULONG cmdreg; 82015fb4814Smrg/* 82115fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n"); 82215fb4814Smrg*/ 82315fb4814Smrg /* Modify Reg. Value */ 82415fb4814Smrg cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE; 82515fb4814Smrg 82615fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 82715fb4814Smrg { 82815fb4814Smrg case 8: 82915fb4814Smrg cmdreg |= CMD_COLOR_08; 83015fb4814Smrg break; 83115fb4814Smrg case 15: 83215fb4814Smrg case 16: 83315fb4814Smrg cmdreg |= CMD_COLOR_16; 83415fb4814Smrg break; 83515fb4814Smrg case 24: 83615fb4814Smrg case 32: 83715fb4814Smrg cmdreg |= CMD_COLOR_32; 83815fb4814Smrg break; 83915fb4814Smrg } 84015fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 84115fb4814Smrg if(bg == -1) { 84215fb4814Smrg cmdreg |= CMD_TRANSPARENT; 84315fb4814Smrg bg = 0; 84415fb4814Smrg } 84515fb4814Smrg cmdreg |= (((length-1) & 0x3F) << 24); /* line period */ 84615fb4814Smrg pAST->ulCMDReg = cmdreg; 84715fb4814Smrg 84815fb4814Smrg if (!pAST->MMIO2D) 84915fb4814Smrg { 85015fb4814Smrg /* Write to CMDQ */ 85115fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 85215fb4814Smrg 85315fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 85415fb4814Smrg pSingleCMD++; 85515fb4814Smrg ASTSetupFG(pSingleCMD, fg); 85615fb4814Smrg pSingleCMD++; 85715fb4814Smrg ASTSetupBG(pSingleCMD, bg); 85815fb4814Smrg pSingleCMD++; 85915fb4814Smrg ASTSetupLineStyle1(pSingleCMD, *pattern); 86015fb4814Smrg pSingleCMD++; 861de78e416Smrg ASTSetupLineStyle2(pSingleCMD, *(pattern+4)); 862de78e416Smrg 863de78e416Smrg /* Update Write Pointer */ 864de78e416Smrg mUpdateWritePointer; 86515fb4814Smrg 86615fb4814Smrg } 86715fb4814Smrg else 86815fb4814Smrg { 86915fb4814Smrg /* Write to MMIO */ 87015fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 87115fb4814Smrg ASTSetupFG_MMIO(fg); 87215fb4814Smrg ASTSetupBG_MMIO(bg); 87315fb4814Smrg ASTSetupLineStyle1_MMIO(*pattern); 87415fb4814Smrg ASTSetupLineStyle2_MMIO(*(pattern+4)); 87515fb4814Smrg 87615fb4814Smrg } 87715fb4814Smrg 87815fb4814Smrg} 87915fb4814Smrg 88015fb4814Smrgstatic void 88115fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 88215fb4814Smrg int x1, int y1, int x2, int y2, 88315fb4814Smrg int flags, int phase) 88415fb4814Smrg{ 88515fb4814Smrg 88615fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 88715fb4814Smrg PKT_SC *pSingleCMD; 88815fb4814Smrg LINEPARAM dsLineParam; 88915fb4814Smrg _LINEInfo LineInfo; 89015fb4814Smrg ULONG dstbase, ulCommand; 89115fb4814Smrg ULONG miny, maxy; 89215fb4814Smrg USHORT usXM; 893de78e416Smrg int delta_y = 0; 894de78e416Smrg 89515fb4814Smrg/* 89615fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n"); 89715fb4814Smrg*/ 89815fb4814Smrg 89915fb4814Smrg /* Modify Reg. Value */ 90015fb4814Smrg ulCommand = pAST->ulCMDReg; 90115fb4814Smrg if(flags & OMIT_LAST) 90215fb4814Smrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 90315fb4814Smrg else 90415fb4814Smrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 90515fb4814Smrg if (pAST->EnableClip) 90615fb4814Smrg ulCommand |= CMD_ENABLE_CLIP; 907de78e416Smrg else 908de78e416Smrg ulCommand &= ~CMD_ENABLE_CLIP; 90915fb4814Smrg dstbase = 0; 91015fb4814Smrg miny = (y1 > y2) ? y2 : y1; 91115fb4814Smrg maxy = (y1 > y2) ? y1 : y2; 91215fb4814Smrg if(maxy >= pScrn->virtualY) { 913de78e416Smrg delta_y = miny; 91415fb4814Smrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 91515fb4814Smrg y1 -= miny; 91615fb4814Smrg y2 -= miny; 91715fb4814Smrg } 918de78e416Smrg 91915fb4814Smrg LineInfo.X1 = x1; 92015fb4814Smrg LineInfo.Y1 = y1; 92115fb4814Smrg LineInfo.X2 = x2; 92215fb4814Smrg LineInfo.Y2 = y2; 92315fb4814Smrg 92415fb4814Smrg bGetLineTerm(&LineInfo, &dsLineParam); /* Get Line Parameter */ 92515fb4814Smrg 92615fb4814Smrg if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC) 92715fb4814Smrg ulCommand |= CMD_X_DEC; 92815fb4814Smrg if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC) 92915fb4814Smrg ulCommand |= CMD_Y_DEC; 93015fb4814Smrg 93115fb4814Smrg usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0; 932de78e416Smrg 933de78e416Smrg if (pAST->EnableClip) 934de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 93515fb4814Smrg 93615fb4814Smrg if (!pAST->MMIO2D) 93715fb4814Smrg { 93815fb4814Smrg /* Write to CMDQ */ 93915fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7); 94015fb4814Smrg 94115fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 94215fb4814Smrg pSingleCMD++; 94315fb4814Smrg ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY); 94415fb4814Smrg pSingleCMD++; 94515fb4814Smrg ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm); 94615fb4814Smrg pSingleCMD++; 94715fb4814Smrg ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth); 94815fb4814Smrg pSingleCMD++; 94915fb4814Smrg ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term); 95015fb4814Smrg pSingleCMD++; 95115fb4814Smrg ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term); 95215fb4814Smrg pSingleCMD++; 95315fb4814Smrg ASTSetupCMDReg(pSingleCMD, ulCommand); 95415fb4814Smrg 95515fb4814Smrg /* Update Write Pointer */ 95615fb4814Smrg mUpdateWritePointer; 957de78e416Smrg 958de78e416Smrg /* Patch KDE pass abnormal point, ycchen@052507 */ 959de78e416Smrg vWaitEngIdle(pScrn, pAST); 96015fb4814Smrg 96115fb4814Smrg } 96215fb4814Smrg else 96315fb4814Smrg { 96415fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 96515fb4814Smrg ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY); 96615fb4814Smrg ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm); 96715fb4814Smrg ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth); 96815fb4814Smrg ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term); 96915fb4814Smrg ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term); 97015fb4814Smrg ASTSetupCMDReg_MMIO(ulCommand); 97115fb4814Smrg 97215fb4814Smrg vWaitEngIdle(pScrn, pAST); 97315fb4814Smrg 97415fb4814Smrg } 97515fb4814Smrg 97615fb4814Smrg} 97715fb4814Smrg 97815fb4814Smrg/* Mono Pattern Fill */ 97915fb4814Smrgstatic void 98015fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn, 98115fb4814Smrg int patx, int paty, int fg, int bg, 98215fb4814Smrg int rop, unsigned int planemask) 98315fb4814Smrg{ 98415fb4814Smrg 98515fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 98615fb4814Smrg PKT_SC *pSingleCMD; 98715fb4814Smrg ULONG cmdreg; 98815fb4814Smrg 98915fb4814Smrg/* 99015fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n"); 99115fb4814Smrg*/ 99215fb4814Smrg /* Modify Reg. Value */ 99315fb4814Smrg cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK; 99415fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 99515fb4814Smrg { 99615fb4814Smrg case 8: 99715fb4814Smrg cmdreg |= CMD_COLOR_08; 99815fb4814Smrg break; 99915fb4814Smrg case 15: 100015fb4814Smrg case 16: 100115fb4814Smrg cmdreg |= CMD_COLOR_16; 100215fb4814Smrg break; 100315fb4814Smrg case 24: 100415fb4814Smrg case 32: 100515fb4814Smrg cmdreg |= CMD_COLOR_32; 100615fb4814Smrg break; 100715fb4814Smrg } 100815fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 100915fb4814Smrg pAST->ulCMDReg = cmdreg; 101015fb4814Smrg 101115fb4814Smrg if (!pAST->MMIO2D) 101215fb4814Smrg { 101315fb4814Smrg /* Write to CMDQ */ 101415fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 101515fb4814Smrg 101615fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 101715fb4814Smrg pSingleCMD++; 101815fb4814Smrg ASTSetupFG(pSingleCMD, fg); 101915fb4814Smrg pSingleCMD++; 102015fb4814Smrg ASTSetupBG(pSingleCMD, bg); 102115fb4814Smrg pSingleCMD++; 102215fb4814Smrg ASTSetupMONO1(pSingleCMD, patx); 102315fb4814Smrg pSingleCMD++; 1024de78e416Smrg ASTSetupMONO2(pSingleCMD, paty); 1025de78e416Smrg 1026de78e416Smrg /* Update Write Pointer */ 1027de78e416Smrg mUpdateWritePointer; 1028de78e416Smrg 102915fb4814Smrg } 103015fb4814Smrg else 103115fb4814Smrg { 103215fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 103315fb4814Smrg ASTSetupFG_MMIO(fg); 103415fb4814Smrg ASTSetupBG_MMIO(bg); 103515fb4814Smrg ASTSetupMONO1_MMIO(patx); 103615fb4814Smrg ASTSetupMONO2_MMIO(paty); 103715fb4814Smrg } 103815fb4814Smrg 103915fb4814Smrg} /* end of ASTSetupForMonoPatternFill */ 104015fb4814Smrg 104115fb4814Smrg 104215fb4814Smrgstatic void 104315fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn, 104415fb4814Smrg int patx, int paty, 104515fb4814Smrg int dst_x, int dst_y, int width, int height) 104615fb4814Smrg{ 104715fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 104815fb4814Smrg PKT_SC *pSingleCMD; 1049de78e416Smrg ULONG dstbase, cmdreg; 1050de78e416Smrg int delta_y = 0; 1051de78e416Smrg 105215fb4814Smrg/* 105315fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n"); 105415fb4814Smrg*/ 105515fb4814Smrg 105615fb4814Smrg /* Modify Reg. Value */ 105715fb4814Smrg cmdreg = pAST->ulCMDReg; 105815fb4814Smrg if (pAST->EnableClip) 1059de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1060de78e416Smrg else 1061de78e416Smrg cmdreg &= ~CMD_ENABLE_CLIP; 106215fb4814Smrg dstbase = 0; 106315fb4814Smrg 106415fb4814Smrg if (dst_y >= pScrn->virtualY) 106515fb4814Smrg { 1066de78e416Smrg delta_y = dst_y; 106715fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 106815fb4814Smrg dst_y=0; 106915fb4814Smrg } 1070de78e416Smrg 1071de78e416Smrg if (pAST->EnableClip) 1072de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 1073de78e416Smrg 107415fb4814Smrg if (!pAST->MMIO2D) 107515fb4814Smrg { 107615fb4814Smrg /* Write to CMDQ */ 107715fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 107815fb4814Smrg 107915fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 108015fb4814Smrg pSingleCMD++; 108115fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 108215fb4814Smrg pSingleCMD++; 108315fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 108415fb4814Smrg pSingleCMD++; 108515fb4814Smrg ASTSetupCMDReg(pSingleCMD, cmdreg); 108615fb4814Smrg 108715fb4814Smrg /* Update Write Pointer */ 108815fb4814Smrg mUpdateWritePointer; 108915fb4814Smrg 109015fb4814Smrg } 109115fb4814Smrg else 109215fb4814Smrg { 109315fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 109415fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 109515fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 109615fb4814Smrg ASTSetupCMDReg_MMIO(cmdreg); 109715fb4814Smrg 109815fb4814Smrg vWaitEngIdle(pScrn, pAST); 109915fb4814Smrg } 110015fb4814Smrg 110115fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */ 110215fb4814Smrg 110315fb4814Smrgstatic void 110415fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, 110515fb4814Smrg int rop, unsigned int planemask, int trans_col) 110615fb4814Smrg{ 110715fb4814Smrg 110815fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 110915fb4814Smrg PKT_SC *pSingleCMD; 111015fb4814Smrg ULONG cmdreg; 111115fb4814Smrg CARD32 *pataddr; 111215fb4814Smrg ULONG ulPatSize; 111315fb4814Smrg int i, j, cpp; 111415fb4814Smrg/* 111515fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n"); 111615fb4814Smrg*/ 111715fb4814Smrg /* Modify Reg. Value */ 111815fb4814Smrg cmdreg = CMD_BITBLT | CMD_PAT_PATREG; 111915fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 112015fb4814Smrg { 112115fb4814Smrg case 8: 112215fb4814Smrg cmdreg |= CMD_COLOR_08; 112315fb4814Smrg break; 112415fb4814Smrg case 15: 112515fb4814Smrg case 16: 112615fb4814Smrg cmdreg |= CMD_COLOR_16; 112715fb4814Smrg break; 112815fb4814Smrg case 24: 112915fb4814Smrg case 32: 113015fb4814Smrg cmdreg |= CMD_COLOR_32; 113115fb4814Smrg break; 113215fb4814Smrg } 113315fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 113415fb4814Smrg pAST->ulCMDReg = cmdreg; 113515fb4814Smrg cpp = (pScrn->bitsPerPixel + 1) / 8; 113615fb4814Smrg pataddr = (CARD32 *)(pAST->FBVirtualAddr + 1137b534f209Smrg (paty * pAST->VideoModeInfo.ScreenPitch) + (patx * cpp)); 113815fb4814Smrg ulPatSize = 8*8*cpp; 113915fb4814Smrg 114015fb4814Smrg if (!pAST->MMIO2D) 114115fb4814Smrg { 114215fb4814Smrg /* Write to CMDQ */ 114315fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4)); 114415fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 114515fb4814Smrg pSingleCMD++; 114615fb4814Smrg for (i=0; i<8; i++) 114715fb4814Smrg { 114815fb4814Smrg for (j=0; j<8*cpp/4; j++) 114915fb4814Smrg { 115015fb4814Smrg ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++))); 115115fb4814Smrg pSingleCMD++; 115215fb4814Smrg } 1153de78e416Smrg } 1154de78e416Smrg 1155de78e416Smrg /* Update Write Pointer */ 1156de78e416Smrg mUpdateWritePointer; 1157de78e416Smrg 115815fb4814Smrg } 115915fb4814Smrg else 116015fb4814Smrg { 116115fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 116215fb4814Smrg for (i=0; i<8; i++) 116315fb4814Smrg { 116415fb4814Smrg for (j=0; j<8*cpp/4; j++) 116515fb4814Smrg { 116615fb4814Smrg ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++))); 116715fb4814Smrg } 116815fb4814Smrg } 116915fb4814Smrg 117015fb4814Smrg } 117115fb4814Smrg 117215fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */ 117315fb4814Smrg 117415fb4814Smrgstatic void 117515fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty, 117615fb4814Smrg int dst_x, int dst_y, int width, int height) 117715fb4814Smrg{ 117815fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 117915fb4814Smrg PKT_SC *pSingleCMD; 1180de78e416Smrg ULONG dstbase, cmdreg; 1181de78e416Smrg int delta_y = 0; 1182de78e416Smrg 118315fb4814Smrg/* 118415fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n"); 118515fb4814Smrg*/ 118615fb4814Smrg 118715fb4814Smrg /* Modify Reg. Value */ 118815fb4814Smrg cmdreg = pAST->ulCMDReg; 118915fb4814Smrg if (pAST->EnableClip) 1190de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1191de78e416Smrg else 1192de78e416Smrg cmdreg &= ~CMD_ENABLE_CLIP; 119315fb4814Smrg dstbase = 0; 119415fb4814Smrg 119515fb4814Smrg if (dst_y >= pScrn->virtualY) 119615fb4814Smrg { 1197de78e416Smrg delta_y = dst_y; 119815fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 119915fb4814Smrg dst_y=0; 120015fb4814Smrg } 1201de78e416Smrg 1202de78e416Smrg if (pAST->EnableClip) 1203de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 120415fb4814Smrg 120515fb4814Smrg if (!pAST->MMIO2D) 120615fb4814Smrg { 120715fb4814Smrg /* Write to CMDQ */ 120815fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 120915fb4814Smrg 121015fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 121115fb4814Smrg pSingleCMD++; 121215fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 121315fb4814Smrg pSingleCMD++; 121415fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 121515fb4814Smrg pSingleCMD++; 121615fb4814Smrg ASTSetupCMDReg(pSingleCMD, cmdreg); 121715fb4814Smrg 121815fb4814Smrg /* Update Write Pointer */ 121915fb4814Smrg mUpdateWritePointer; 122015fb4814Smrg 122115fb4814Smrg } 122215fb4814Smrg else 122315fb4814Smrg { 122415fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 122515fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 122615fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 122715fb4814Smrg ASTSetupCMDReg_MMIO(cmdreg); 122815fb4814Smrg 122915fb4814Smrg vWaitEngIdle(pScrn, pAST); 123015fb4814Smrg } 123115fb4814Smrg 123215fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */ 123315fb4814Smrg 123415fb4814Smrg/* CPU to Screen Expand */ 123515fb4814Smrgstatic void 123615fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 123715fb4814Smrg int fg, int bg, 123815fb4814Smrg int rop, unsigned int planemask) 123915fb4814Smrg{ 124015fb4814Smrg 124115fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 124215fb4814Smrg PKT_SC *pSingleCMD; 124315fb4814Smrg ULONG cmdreg; 124415fb4814Smrg 124515fb4814Smrg/* 124615fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n"); 124715fb4814Smrg*/ 124815fb4814Smrg /* Modify Reg. Value */ 124915fb4814Smrg cmdreg = CMD_COLOREXP; 125015fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 125115fb4814Smrg { 125215fb4814Smrg case 8: 125315fb4814Smrg cmdreg |= CMD_COLOR_08; 125415fb4814Smrg break; 125515fb4814Smrg case 15: 125615fb4814Smrg case 16: 125715fb4814Smrg cmdreg |= CMD_COLOR_16; 125815fb4814Smrg break; 125915fb4814Smrg case 24: 126015fb4814Smrg case 32: 126115fb4814Smrg cmdreg |= CMD_COLOR_32; 126215fb4814Smrg break; 126315fb4814Smrg } 126415fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 126515fb4814Smrg if(bg == -1) { 126615fb4814Smrg cmdreg |= CMD_FONT_TRANSPARENT; 126715fb4814Smrg bg = 0; 126815fb4814Smrg } 126915fb4814Smrg pAST->ulCMDReg = cmdreg; 127015fb4814Smrg 127115fb4814Smrg if (!pAST->MMIO2D) 127215fb4814Smrg { 127315fb4814Smrg /* Write to CMDQ */ 127415fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3); 127515fb4814Smrg 127615fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 127715fb4814Smrg pSingleCMD++; 127815fb4814Smrg ASTSetupFG(pSingleCMD, fg); 127915fb4814Smrg pSingleCMD++; 128015fb4814Smrg ASTSetupBG(pSingleCMD, bg); 1281de78e416Smrg 1282de78e416Smrg /* Update Write Pointer */ 1283de78e416Smrg mUpdateWritePointer; 128415fb4814Smrg 128515fb4814Smrg } 128615fb4814Smrg else 128715fb4814Smrg { 128815fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 128915fb4814Smrg ASTSetupFG_MMIO(fg); 129015fb4814Smrg ASTSetupBG_MMIO(bg); 129115fb4814Smrg 129215fb4814Smrg } 129315fb4814Smrg 129415fb4814Smrg} 129515fb4814Smrg 129615fb4814Smrgstatic void 129715fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 129815fb4814Smrg int dst_x, int dst_y, 129915fb4814Smrg int width, int height, int offset) 130015fb4814Smrg{ 130115fb4814Smrg 130215fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 130315fb4814Smrg PKT_SC *pSingleCMD; 130415fb4814Smrg ULONG dstbase, cmdreg; 1305de78e416Smrg int delta_y = 0; 130615fb4814Smrg 130715fb4814Smrg/* 130815fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n"); 130915fb4814Smrg*/ 131015fb4814Smrg 131115fb4814Smrg /* Modify Reg. Value */ 131215fb4814Smrg cmdreg = pAST->ulCMDReg; 131315fb4814Smrg if (pAST->EnableClip) 1314de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1315de78e416Smrg else 1316de78e416Smrg cmdreg &= ~CMD_ENABLE_CLIP; 131715fb4814Smrg dstbase = 0; 131815fb4814Smrg 131915fb4814Smrg if (dst_y >= pScrn->virtualY) 132015fb4814Smrg { 1321de78e416Smrg delta_y = dst_y; 132215fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 132315fb4814Smrg dst_y=0; 132415fb4814Smrg } 1325de78e416Smrg 1326de78e416Smrg if (pAST->EnableClip) 1327de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 1328de78e416Smrg 132915fb4814Smrg if (!pAST->MMIO2D) 133015fb4814Smrg { 133115fb4814Smrg /* Write to CMDQ */ 133215fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 133315fb4814Smrg 133415fb4814Smrg ASTSetupSRCPitch(pSingleCMD, ((width+7)/8)); 133515fb4814Smrg pSingleCMD++; 133615fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 133715fb4814Smrg pSingleCMD++; 133815fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 133915fb4814Smrg pSingleCMD++; 134015fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 134115fb4814Smrg pSingleCMD++; 134215fb4814Smrg ASTSetupCMDReg(pSingleCMD, cmdreg); 134315fb4814Smrg 134415fb4814Smrg /* Update Write Pointer */ 134515fb4814Smrg mUpdateWritePointer; 134615fb4814Smrg 134715fb4814Smrg } 134815fb4814Smrg else 134915fb4814Smrg { 135015fb4814Smrg ASTSetupSRCPitch_MMIO((width+7)/8); 135115fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 135215fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 135315fb4814Smrg ASTSetupSRCXY_MMIO(0, 0); 135415fb4814Smrg 135515fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 135615fb4814Smrg ASTSetupCMDReg_MMIO(cmdreg); 135715fb4814Smrg 135815fb4814Smrg vWaitEngIdle(pScrn, pAST); 135915fb4814Smrg 136015fb4814Smrg } 136115fb4814Smrg 136215fb4814Smrg} 136315fb4814Smrg 136415fb4814Smrg 136515fb4814Smrg/* Screen to Screen Color Expand */ 136615fb4814Smrgstatic void 136715fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 136815fb4814Smrg int fg, int bg, 136915fb4814Smrg int rop, unsigned int planemask) 137015fb4814Smrg{ 137115fb4814Smrg 137215fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 137315fb4814Smrg PKT_SC *pSingleCMD; 137415fb4814Smrg ULONG cmdreg; 137515fb4814Smrg 137615fb4814Smrg/* 137715fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n"); 137815fb4814Smrg*/ 137915fb4814Smrg 138015fb4814Smrg /* Modify Reg. Value */ 138115fb4814Smrg cmdreg = CMD_ENHCOLOREXP; 138215fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 138315fb4814Smrg { 138415fb4814Smrg case 8: 138515fb4814Smrg cmdreg |= CMD_COLOR_08; 138615fb4814Smrg break; 138715fb4814Smrg case 15: 138815fb4814Smrg case 16: 138915fb4814Smrg cmdreg |= CMD_COLOR_16; 139015fb4814Smrg break; 139115fb4814Smrg case 24: 139215fb4814Smrg case 32: 139315fb4814Smrg cmdreg |= CMD_COLOR_32; 139415fb4814Smrg break; 139515fb4814Smrg } 139615fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 139715fb4814Smrg if(bg == -1) { 139815fb4814Smrg cmdreg |= CMD_FONT_TRANSPARENT; 139915fb4814Smrg bg = 0; 140015fb4814Smrg } 140115fb4814Smrg pAST->ulCMDReg = cmdreg; 140215fb4814Smrg 140315fb4814Smrg if (!pAST->MMIO2D) 140415fb4814Smrg { 140515fb4814Smrg /* Write to CMDQ */ 140615fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3); 140715fb4814Smrg 140815fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 140915fb4814Smrg pSingleCMD++; 141015fb4814Smrg ASTSetupFG(pSingleCMD, fg); 141115fb4814Smrg pSingleCMD++; 141215fb4814Smrg ASTSetupBG(pSingleCMD, bg); 1413de78e416Smrg 1414de78e416Smrg /* Update Write Pointer */ 1415de78e416Smrg mUpdateWritePointer; 141615fb4814Smrg 141715fb4814Smrg } 141815fb4814Smrg else 141915fb4814Smrg { 142015fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 142115fb4814Smrg ASTSetupFG_MMIO(fg); 142215fb4814Smrg ASTSetupBG_MMIO(bg); 142315fb4814Smrg 142415fb4814Smrg } 142515fb4814Smrg 142615fb4814Smrg} 142715fb4814Smrg 142815fb4814Smrg 142915fb4814Smrg 143015fb4814Smrgstatic void 143115fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 143215fb4814Smrg int dst_x, int dst_y, int width, int height, 143315fb4814Smrg int src_x, int src_y, int offset) 143415fb4814Smrg{ 143515fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 143615fb4814Smrg PKT_SC *pSingleCMD; 143715fb4814Smrg ULONG srcbase, dstbase, cmdreg; 143815fb4814Smrg USHORT srcpitch; 1439de78e416Smrg int delta_y = 0; 144015fb4814Smrg 144115fb4814Smrg/* 144215fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n"); 144315fb4814Smrg*/ 144415fb4814Smrg 144515fb4814Smrg /* Modify Reg. Value */ 144615fb4814Smrg cmdreg = pAST->ulCMDReg; 144715fb4814Smrg if (pAST->EnableClip) 1448de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1449de78e416Smrg else 1450de78e416Smrg cmdreg &= ~CMD_ENABLE_CLIP; 145115fb4814Smrg dstbase = 0; 145215fb4814Smrg if (dst_y >= pScrn->virtualY) 145315fb4814Smrg { 1454de78e416Smrg delta_y = dst_y; 145515fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 145615fb4814Smrg dst_y=0; 145715fb4814Smrg } 145815fb4814Smrg srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x; 145915fb4814Smrg srcpitch = (pScrn->displayWidth+7)/8; 1460de78e416Smrg 1461de78e416Smrg if (pAST->EnableClip) 1462de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 146315fb4814Smrg 146415fb4814Smrg if (!pAST->MMIO2D) 146515fb4814Smrg { 146615fb4814Smrg /* Write to CMDQ */ 146715fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6); 146815fb4814Smrg 146915fb4814Smrg ASTSetupSRCBase(pSingleCMD, srcbase); 147015fb4814Smrg pSingleCMD++; 147115fb4814Smrg ASTSetupSRCPitch(pSingleCMD,srcpitch); 147215fb4814Smrg pSingleCMD++; 147315fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 147415fb4814Smrg pSingleCMD++; 147515fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 147615fb4814Smrg pSingleCMD++; 147715fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 147815fb4814Smrg pSingleCMD++; 147915fb4814Smrg ASTSetupCMDReg(pSingleCMD, cmdreg); 148015fb4814Smrg 148115fb4814Smrg /* Update Write Pointer */ 148215fb4814Smrg mUpdateWritePointer; 148315fb4814Smrg 148415fb4814Smrg } 148515fb4814Smrg else 148615fb4814Smrg { 148715fb4814Smrg ASTSetupSRCBase_MMIO(srcbase); 148815fb4814Smrg ASTSetupSRCPitch_MMIO(srcpitch); 148915fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 149015fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 149115fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 149215fb4814Smrg ASTSetupCMDReg_MMIO(cmdreg); 149315fb4814Smrg 149415fb4814Smrg vWaitEngIdle(pScrn, pAST); 149515fb4814Smrg 149615fb4814Smrg } 149715fb4814Smrg 149815fb4814Smrg} 149915fb4814Smrg 150015fb4814Smrg 150115fb4814Smrg/* Clipping */ 150215fb4814Smrgstatic void 1503de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y) 150415fb4814Smrg{ 150515fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 150615fb4814Smrg PKT_SC *pSingleCMD; 1507de78e416Smrg 150815fb4814Smrg if (!pAST->MMIO2D) 150915fb4814Smrg { 151015fb4814Smrg /* Write to CMDQ */ 151115fb4814Smrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2); 151215fb4814Smrg 1513de78e416Smrg ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y); 151415fb4814Smrg pSingleCMD++; 1515de78e416Smrg ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1); 1516de78e416Smrg 1517de78e416Smrg /* Update Write Pointer */ 1518de78e416Smrg mUpdateWritePointer; 1519de78e416Smrg 152015fb4814Smrg } 152115fb4814Smrg else 152215fb4814Smrg { 1523de78e416Smrg ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y); 1524de78e416Smrg ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1); 152515fb4814Smrg } 1526de78e416Smrg 1527de78e416Smrg} 1528de78e416Smrg 1529de78e416Smrgstatic void 1530de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn, 1531de78e416Smrg int left, int top, int right, int bottom) 1532de78e416Smrg{ 1533de78e416Smrg 1534de78e416Smrg ASTRecPtr pAST = ASTPTR(pScrn); 1535de78e416Smrg PKT_SC *pSingleCMD; 1536de78e416Smrg/* 1537de78e416Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n"); 1538de78e416Smrg*/ 1539de78e416Smrg pAST->EnableClip = TRUE; 1540de78e416Smrg 1541de78e416Smrg pAST->clip_left = left; 1542de78e416Smrg pAST->clip_top = top; 1543de78e416Smrg pAST->clip_right = right; 1544de78e416Smrg pAST->clip_bottom = bottom; 154515fb4814Smrg 154615fb4814Smrg} 154715fb4814Smrg 154815fb4814Smrgstatic void 154915fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn) 155015fb4814Smrg{ 155115fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 155215fb4814Smrg/* 155315fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n"); 155415fb4814Smrg*/ 155515fb4814Smrg pAST->EnableClip = FALSE; 155615fb4814Smrg} 155715fb4814Smrg 1558b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 1559b410ddbeSmrg int x1, int y1, int x2, int y2, int flags) 1560b410ddbeSmrg{ 1561b410ddbeSmrg 1562b410ddbeSmrg ASTRecPtr pAST = ASTPTR(pScrn); 1563b410ddbeSmrg PKT_SC *pSingleCMD; 1564b410ddbeSmrg ULONG dstbase, ulCommand; 1565b410ddbeSmrg ULONG miny, maxy; 1566b410ddbeSmrg/* 1567b410ddbeSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n"); 1568b410ddbeSmrg*/ 1569b410ddbeSmrg 1570b410ddbeSmrg /* Modify Reg. Value */ 1571b410ddbeSmrg ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE; 1572b410ddbeSmrg if(flags & OMIT_LAST) 1573b410ddbeSmrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 1574b410ddbeSmrg else 1575b410ddbeSmrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 1576b410ddbeSmrg if (pAST->EnableClip) 1577b410ddbeSmrg ulCommand |= CMD_ENABLE_CLIP; 1578b410ddbeSmrg else 1579b410ddbeSmrg ulCommand &= ~CMD_ENABLE_CLIP; 1580b410ddbeSmrg dstbase = 0; 1581b410ddbeSmrg miny = (y1 > y2) ? y2 : y1; 1582b410ddbeSmrg maxy = (y1 > y2) ? y1 : y2; 1583b410ddbeSmrg if(maxy >= pScrn->virtualY) { 1584b410ddbeSmrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 1585b410ddbeSmrg y1 -= miny; 1586b410ddbeSmrg y2 -= miny; 1587b410ddbeSmrg } 1588b410ddbeSmrg 1589b410ddbeSmrg if (!pAST->MMIO2D) 1590b410ddbeSmrg { 1591b410ddbeSmrg /* Write to CMDQ */ 1592b410ddbeSmrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 1593b410ddbeSmrg 1594b410ddbeSmrg ASTSetupDSTBase(pSingleCMD, dstbase); 1595b410ddbeSmrg pSingleCMD++; 1596b410ddbeSmrg AIPSetupLineXY(pSingleCMD, x1, y1); 1597b410ddbeSmrg pSingleCMD++; 1598b410ddbeSmrg AIPSetupLineXY2(pSingleCMD, x2, y2); 1599b410ddbeSmrg pSingleCMD++; 1600b410ddbeSmrg AIPSetupLineNumber(pSingleCMD, 0); 1601b410ddbeSmrg pSingleCMD++; 1602b410ddbeSmrg ASTSetupCMDReg(pSingleCMD, ulCommand); 1603b410ddbeSmrg 1604b410ddbeSmrg /* Update Write Pointer */ 1605b410ddbeSmrg mUpdateWritePointer; 1606b410ddbeSmrg 1607b410ddbeSmrg /* Patch KDE pass abnormal point, ycchen@052507 */ 1608b410ddbeSmrg vWaitEngIdle(pScrn, pAST); 1609b410ddbeSmrg 1610b410ddbeSmrg } 1611b410ddbeSmrg else 1612b410ddbeSmrg { 1613b410ddbeSmrg ASTSetupDSTBase_MMIO(dstbase); 1614b410ddbeSmrg AIPSetupLineXY_MMIO(x1, y1); 1615b410ddbeSmrg AIPSetupLineXY2_MMIO(x2, y2); 1616b410ddbeSmrg AIPSetupLineNumber_MMIO(0); 1617b410ddbeSmrg ASTSetupCMDReg_MMIO(ulCommand); 1618b410ddbeSmrg 1619b410ddbeSmrg vWaitEngIdle(pScrn, pAST); 1620b410ddbeSmrg 1621b410ddbeSmrg } 1622b410ddbeSmrg 1623b410ddbeSmrg 1624b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */ 1625b410ddbeSmrg 1626b410ddbeSmrgstatic void 1627b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 1628b410ddbeSmrg int x1, int y1, int x2, int y2, 1629b410ddbeSmrg int flags, int phase) 1630b410ddbeSmrg{ 1631b410ddbeSmrg 1632b410ddbeSmrg ASTRecPtr pAST = ASTPTR(pScrn); 1633b410ddbeSmrg PKT_SC *pSingleCMD; 1634b410ddbeSmrg ULONG dstbase, ulCommand; 1635b410ddbeSmrg ULONG miny, maxy; 1636b410ddbeSmrg/* 1637b410ddbeSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n"); 1638b410ddbeSmrg*/ 1639b410ddbeSmrg 1640b410ddbeSmrg /* Modify Reg. Value */ 1641b410ddbeSmrg ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE; 1642b410ddbeSmrg if(flags & OMIT_LAST) 1643b410ddbeSmrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 1644b410ddbeSmrg else 1645b410ddbeSmrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 1646b410ddbeSmrg if (pAST->EnableClip) 1647b410ddbeSmrg ulCommand |= CMD_ENABLE_CLIP; 1648b410ddbeSmrg else 1649b410ddbeSmrg ulCommand &= ~CMD_ENABLE_CLIP; 1650b410ddbeSmrg dstbase = 0; 1651b410ddbeSmrg miny = (y1 > y2) ? y2 : y1; 1652b410ddbeSmrg maxy = (y1 > y2) ? y1 : y2; 1653b410ddbeSmrg if(maxy >= pScrn->virtualY) { 1654b410ddbeSmrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 1655b410ddbeSmrg y1 -= miny; 1656b410ddbeSmrg y2 -= miny; 1657b410ddbeSmrg } 1658b410ddbeSmrg 1659b410ddbeSmrg if (!pAST->MMIO2D) 1660b410ddbeSmrg { 1661b410ddbeSmrg /* Write to CMDQ */ 1662b410ddbeSmrg pSingleCMD = (PKT_SC *) pjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 1663b410ddbeSmrg 1664b410ddbeSmrg ASTSetupDSTBase(pSingleCMD, dstbase); 1665b410ddbeSmrg pSingleCMD++; 1666b410ddbeSmrg AIPSetupLineXY(pSingleCMD, x1, y1); 1667b410ddbeSmrg pSingleCMD++; 1668b410ddbeSmrg AIPSetupLineXY2(pSingleCMD, x2, y2); 1669b410ddbeSmrg pSingleCMD++; 1670b410ddbeSmrg AIPSetupLineNumber(pSingleCMD, 0); 1671b410ddbeSmrg pSingleCMD++; 1672b410ddbeSmrg ASTSetupCMDReg(pSingleCMD, ulCommand); 1673b410ddbeSmrg 1674b410ddbeSmrg /* Update Write Pointer */ 1675b410ddbeSmrg mUpdateWritePointer; 1676b410ddbeSmrg 1677b410ddbeSmrg /* Patch KDE pass abnormal point, ycchen@052507 */ 1678b410ddbeSmrg vWaitEngIdle(pScrn, pAST); 1679b410ddbeSmrg 1680b410ddbeSmrg } 1681b410ddbeSmrg else 1682b410ddbeSmrg { 1683b410ddbeSmrg ASTSetupDSTBase_MMIO(dstbase); 1684b410ddbeSmrg AIPSetupLineXY_MMIO(x1, y1); 1685b410ddbeSmrg AIPSetupLineXY2_MMIO(x2, y2); 1686b410ddbeSmrg AIPSetupLineNumber_MMIO(0); 1687b410ddbeSmrg ASTSetupCMDReg_MMIO(ulCommand); 1688b410ddbeSmrg 1689b410ddbeSmrg vWaitEngIdle(pScrn, pAST); 1690b410ddbeSmrg 1691b410ddbeSmrg } 1692b410ddbeSmrg 1693b410ddbeSmrg} 1694b4d38c65Smrg#endif 1695b410ddbeSmrg 1696b534f209Smrg#ifdef AstVideo 1697b534f209Smrg/* 1698b534f209Smrg * Video Part 1699b534f209Smrg * by ic_yang 1700b534f209Smrg */ 1701b534f209Smrg#include "fourcc.h" 1702b534f209Smrg 1703b534f209Smrgvoid ASTDisplayVideo(ScrnInfoPtr pScrn, ASTPortPrivPtr pPriv, RegionPtr clipBoxes, int id) 1704b534f209Smrg{ 1705b534f209Smrg ASTPtr pAST = ASTPTR(pScrn); 1706b534f209Smrg int nBoxs; 1707b534f209Smrg int ScaleFactorH, ScaleFactorV; 1708b534f209Smrg ULONG InitScaleFactorH, InitScaleFactorV; 1709b534f209Smrg BURSTSCALECMD CopyCmd = {0}; 1710b534f209Smrg PBURSTSCALECMD pCopyCmd = NULL; 1711b534f209Smrg float fScaleX = 0, fScaleY = 0; 1712b534f209Smrg xRectangle rect; 1713b534f209Smrg BoxPtr pBox = NULL; 1714b534f209Smrg short lSrcX, lSrcY; 1715b534f209Smrg ULONG dwCmd = 0; 1716b534f209Smrg int i; 1717b534f209Smrg 1718b534f209Smrg pBox = REGION_RECTS(clipBoxes); 1719b534f209Smrg nBoxs = REGION_NUM_RECTS(clipBoxes); 1720b534f209Smrg 1721b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MMIO=%x,pBox=%x, nBoxs=%x\n", pAST->MMIO2D, pBox, nBoxs); 1722b534f209Smrg 1723b534f209Smrg if(0==pPriv->drw_w || 0==pPriv->drw_h) 1724b534f209Smrg { 1725b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drwx=%x, drwy=%x\n", pPriv->drw_w, pPriv->drw_h); 1726b534f209Smrg return; 1727b534f209Smrg } 1728b534f209Smrg 1729b534f209Smrg /* calc scaling factor */ 1730b534f209Smrg fScaleX = (float)pPriv->src_w /(float)pPriv->drw_w; 1731b534f209Smrg fScaleY = (float)pPriv->src_h /(float)pPriv->drw_h; 1732b534f209Smrg 1733b534f209Smrg if (pPriv->src_w == pPriv->drw_w) 1734b534f209Smrg ScaleFactorH = 0x8000; 1735b534f209Smrg else 1736b534f209Smrg ScaleFactorH = (ULONG)((pPriv->src_w-1)*0x8000)/pPriv->drw_w; 1737b534f209Smrg 1738b534f209Smrg if (pPriv->src_h == pPriv->drw_h) 1739b534f209Smrg { 1740b534f209Smrg ScaleFactorV = 0x8000; 1741b534f209Smrg dwCmd |= SCALE_EQUAL_VER; /* Setting it save the bandwidtch */ 1742b534f209Smrg } 1743b534f209Smrg else 1744b534f209Smrg { 1745b534f209Smrg ScaleFactorV = (ULONG)((pPriv->src_h-1)*0x8000)/pPriv->drw_h; 1746b534f209Smrg } 1747b534f209Smrg 1748b534f209Smrg if (pPriv->drw_w >= pPriv->src_w) 1749b534f209Smrg InitScaleFactorH = 0; 1750b534f209Smrg else 1751b534f209Smrg InitScaleFactorH = 0x4000; 1752b534f209Smrg 1753b534f209Smrg if (pPriv->drw_h >= pPriv->src_h) 1754b534f209Smrg InitScaleFactorV = 0; 1755b534f209Smrg else 1756b534f209Smrg InitScaleFactorV = 0x4000; 1757b534f209Smrg 1758b534f209Smrg switch(pScrn->bitsPerPixel) 1759b534f209Smrg { 1760b534f209Smrg case 32: 1761b534f209Smrg dwCmd = CMD_COLOR_32; 1762b534f209Smrg break; 1763b534f209Smrg case 16: 1764b534f209Smrg dwCmd = CMD_COLOR_16; 1765b534f209Smrg break; 1766b534f209Smrg case 8: 1767b534f209Smrg dwCmd = CMD_COLOR_08; 1768b534f209Smrg break; 1769b534f209Smrg } 1770b534f209Smrg 1771b534f209Smrg dwCmd |= CMD_TYPE_SCALE; 1772b534f209Smrg if (pPriv->drw_w >= pPriv->src_w) 1773b534f209Smrg dwCmd |= SCALE_SEG_NUM_1; 1774b534f209Smrg else 1775b534f209Smrg dwCmd |= SCALE_SEG_NUM_2; 1776b534f209Smrg 1777b534f209Smrg dwCmd |= SCALE_FORMAT_YUV2RGB; 1778b534f209Smrg switch(id) 1779b534f209Smrg { 1780b534f209Smrg case PIXEL_FMT_YUY2: 1781b534f209Smrg dwCmd |= YUV_FORMAT_YUYV; 1782b534f209Smrg break; 1783b534f209Smrg case PIXEL_FMT_UYVY: 1784b534f209Smrg dwCmd |= YUV_FORMAT_UYVY; 1785b534f209Smrg break; 1786b534f209Smrg default: 1787b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Other pix format:%x\n", id); 1788b534f209Smrg break; 1789b534f209Smrg } 1790b534f209Smrg 1791b534f209Smrg for(i = 0; i < nBoxs; i++, pBox++) 1792b534f209Smrg { 1793b534f209Smrg rect.x = pBox->x1 - pPriv->drw_x; 1794b534f209Smrg rect.y = pBox->y1 - pPriv->drw_y; 1795b534f209Smrg rect.width = pBox->x2 - pBox->x1; 1796b534f209Smrg rect.height = pBox->y2 - pBox->y1; 1797b534f209Smrg 1798b534f209Smrg lSrcX = (ULONG)((float)rect.x * fScaleX + pPriv->src_x + 0.5f); 1799b534f209Smrg lSrcY = (ULONG)((float)rect.y * fScaleY + pPriv->src_y + 0.5f); 1800b534f209Smrg 1801b534f209Smrg pCopyCmd = (BURSTSCALECMD*)pjRequestCMDQ(pAST, PKT_TYPESCALE_LENGTH); 1802b534f209Smrg 1803b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pCopyCmd=%p, pBox=%x,%x,%x,%x\n", pCopyCmd, pBox->x1, pBox->y1, pBox->x2, pBox->y2); 1804b534f209Smrg 1805b534f209Smrg CopyCmd.dwHeader0 = (ULONG) PKT_BURST_CMD_HEADER0 | 1806b534f209Smrg PKT_TYPESCALE_DATALENGTH | 1807b534f209Smrg PKT_TYPESCALE_ADDRSTART | 1808b534f209Smrg BURST_FORCE_CMD; 1809b534f209Smrg 1810b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CopyCmd.dwHeader0=%x\n", CopyCmd.dwHeader0); 1811b534f209Smrg 1812b534f209Smrg CopyCmd.dwSrcPitch = (ULONG)(pPriv->srcPitch << 16); 1813b534f209Smrg 1814b534f209Smrg CopyCmd.dwDstHeightPitch = (ULONG) ((pAST->VideoModeInfo.ScreenPitch << 16) | 0xFFFF); 1815b534f209Smrg 1816b534f209Smrg CopyCmd.dwDstXY = (ULONG) ((pBox->x1 << 16) | (pBox->y1 & 0xFFFF)); 1817b534f209Smrg CopyCmd.dwSrcXY = (ULONG) ((lSrcX << 16) | (lSrcY & 0xFFFF)); 1818b534f209Smrg CopyCmd.dwRecHeightWidth = (ULONG) ((rect.width << 16) | rect.height); 1819b534f209Smrg 1820b534f209Smrg CopyCmd.dwInitScaleFactorH = InitScaleFactorH; 1821b534f209Smrg CopyCmd.dwInitScaleFactorV = InitScaleFactorV; 1822b534f209Smrg CopyCmd.dwScaleFactorH = ScaleFactorH; 1823b534f209Smrg CopyCmd.dwScaleFactorV = ScaleFactorV; 1824b534f209Smrg 1825b534f209Smrg CopyCmd.dwSrcBaseAddr = pPriv->bufAddr[pPriv->currentBuf]; 1826b534f209Smrg CopyCmd.dwDstBaseAddr = 0; 1827b534f209Smrg CopyCmd.dwCmd = dwCmd; 1828b534f209Smrg CopyCmd.NullData[0] = 0; /* for alignment */ 1829b534f209Smrg memcpy(pCopyCmd, &CopyCmd, sizeof(CopyCmd)); 1830b534f209Smrg 1831b534f209Smrg mUpdateWritePointer; 1832b534f209Smrg 1833b534f209Smrg#if 0 1834b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1835b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8000), 1836b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8004), 1837b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8008), 1838b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x800C)); 1839b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1840b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8010), 1841b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8014), 1842b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8018), 1843b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x801C)); 1844b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1845b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8020), 1846b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8024), 1847b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8028), 1848b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x802C)); 1849b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1850b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8030), 1851b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8034), 1852b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8038), 1853b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x803C)); 1854b534f209Smrg#endif 1855b534f209Smrg 1856b534f209Smrg } /* End of for-loop */ 1857b534f209Smrg 1858b534f209Smrg} /* ASTDisplayVideo */ 1859b534f209Smrg#endif /* AstVideo */ 1860b534f209Smrg 186115fb4814Smrg#endif /* end of Accel_2D */ 1862