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