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 5715fb4814Smrg#ifdef Accel_2D 587fe5393cSmrg 597fe5393cSmrg#ifdef HAVE_XAA_H 6015fb4814Smrg/* ROP Translation Table */ 6115fb4814Smrgint ASTXAACopyROP[16] = 6215fb4814Smrg{ 6315fb4814Smrg ROP_0, /* GXclear */ 6415fb4814Smrg ROP_DSa, /* GXand */ 6515fb4814Smrg ROP_SDna, /* GXandReverse */ 6615fb4814Smrg ROP_S, /* GXcopy */ 6715fb4814Smrg ROP_DSna, /* GXandInverted */ 6815fb4814Smrg ROP_D, /* GXnoop */ 6915fb4814Smrg ROP_DSx, /* GXxor */ 7015fb4814Smrg ROP_DSo, /* GXor */ 7115fb4814Smrg ROP_DSon, /* GXnor */ 7215fb4814Smrg ROP_DSxn, /* GXequiv */ 7315fb4814Smrg ROP_Dn, /* GXinvert*/ 7415fb4814Smrg ROP_SDno, /* GXorReverse */ 7515fb4814Smrg ROP_Sn, /* GXcopyInverted */ 7615fb4814Smrg ROP_DSno, /* GXorInverted */ 7715fb4814Smrg ROP_DSan, /* GXnand */ 7815fb4814Smrg ROP_1 /* GXset */ 7915fb4814Smrg}; 8015fb4814Smrg 8115fb4814Smrgint ASTXAAPatternROP[16]= 8215fb4814Smrg{ 8315fb4814Smrg ROP_0, 8415fb4814Smrg ROP_DPa, 8515fb4814Smrg ROP_PDna, 8615fb4814Smrg ROP_P, 8715fb4814Smrg ROP_DPna, 8815fb4814Smrg ROP_D, 8915fb4814Smrg ROP_DPx, 9015fb4814Smrg ROP_DPo, 9115fb4814Smrg ROP_DPon, 9215fb4814Smrg ROP_PDxn, 9315fb4814Smrg ROP_Dn, 9415fb4814Smrg ROP_PDno, 9515fb4814Smrg ROP_Pn, 9615fb4814Smrg ROP_DPno, 9715fb4814Smrg ROP_DPan, 9815fb4814Smrg ROP_1 9915fb4814Smrg}; 10015fb4814Smrg 10115fb4814Smrg/* Prototype type declaration */ 10215fb4814Smrgstatic void ASTSync(ScrnInfoPtr pScrn); 1037fe5393cSmrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 10415fb4814Smrg int xdir, int ydir, int rop, 10515fb4814Smrg unsigned int planemask, int trans_color); 10615fb4814Smrgstatic void ASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, 1077fe5393cSmrg int y2, int w, int h); 10815fb4814Smrgstatic void ASTSetupForSolidFill(ScrnInfoPtr pScrn, 10915fb4814Smrg int color, int rop, unsigned int planemask); 11015fb4814Smrgstatic void ASTSubsequentSolidFillRect(ScrnInfoPtr pScrn, 1117fe5393cSmrg int dst_x, int dst_y, int width, int height); 11215fb4814Smrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn, 11315fb4814Smrg int color, int rop, unsigned int planemask); 11415fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, 11515fb4814Smrg int x, int y, int len, int dir); 11615fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 1177fe5393cSmrg int x1, int y1, int x2, int y2, int flags); 11815fb4814Smrgstatic void ASTSetupForDashedLine(ScrnInfoPtr pScrn, 11915fb4814Smrg int fg, int bg, int rop, unsigned int planemask, 12015fb4814Smrg int length, UCHAR *pattern); 12115fb4814Smrgstatic void ASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 12215fb4814Smrg int x1, int y1, int x2, int y2, 1237fe5393cSmrg int flags, int phase); 12415fb4814Smrgstatic void ASTSetupForMonoPatternFill(ScrnInfoPtr pScrn, 12515fb4814Smrg int patx, int paty, int fg, int bg, 12615fb4814Smrg int rop, unsigned int planemask); 12715fb4814Smrgstatic void ASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn, 12815fb4814Smrg int patx, int paty, 12915fb4814Smrg int x, int y, int w, int h); 13015fb4814Smrgstatic void ASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, 13115fb4814Smrg int rop, unsigned int planemask, int trans_col); 13215fb4814Smrgstatic void ASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty, 13315fb4814Smrg int x, int y, int w, int h); 13415fb4814Smrgstatic void ASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 13515fb4814Smrg int fg, int bg, 13615fb4814Smrg int rop, unsigned int planemask); 13715fb4814Smrgstatic void ASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 13815fb4814Smrg int x, int y, 13915fb4814Smrg int width, int height, int skipleft); 14015fb4814Smrgstatic void ASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 14115fb4814Smrg int fg, int bg, 14215fb4814Smrg int rop, unsigned int planemask); 14315fb4814Smrgstatic void ASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 14415fb4814Smrg int x, int y, int width, int height, 14515fb4814Smrg int src_x, int src_y, int offset); 14615fb4814Smrgstatic void ASTSetClippingRectangle(ScrnInfoPtr pScrn, 14715fb4814Smrg int left, int top, int right, int bottom); 1487fe5393cSmrgstatic void ASTDisableClipping(ScrnInfoPtr pScrn); 149de78e416Smrgstatic void ASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y); 15015fb4814Smrg 151b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 1527fe5393cSmrg int x1, int y1, int x2, int y2, int flags); 153b410ddbeSmrgstatic void AIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 154b410ddbeSmrg int x1, int y1, int x2, int y2, 155b410ddbeSmrg int flags, int phase); 156b410ddbeSmrg 15715fb4814SmrgBool 15815fb4814SmrgASTAccelInit(ScreenPtr pScreen) 15915fb4814Smrg{ 16015fb4814Smrg XAAInfoRecPtr infoPtr; 161b4d38c65Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 16215fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 16315fb4814Smrg 16415fb4814Smrg pAST->AccelInfoPtr = infoPtr = XAACreateInfoRec(); 16515fb4814Smrg if (!infoPtr) return FALSE; 16615fb4814Smrg 16715fb4814Smrg infoPtr->Flags = LINEAR_FRAMEBUFFER | 16815fb4814Smrg OFFSCREEN_PIXMAPS | 16915fb4814Smrg PIXMAP_CACHE; 17015fb4814Smrg 17115fb4814Smrg /* Sync */ 17215fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Sync) 17315fb4814Smrg infoPtr->Sync = ASTSync; 17415fb4814Smrg 17515fb4814Smrg /* Screen To Screen copy */ 17615fb4814Smrg if (pAST->ENGCaps & ENG_CAP_ScreenToScreenCopy) 1777fe5393cSmrg { 17815fb4814Smrg infoPtr->SetupForScreenToScreenCopy = ASTSetupForScreenToScreenCopy; 17915fb4814Smrg infoPtr->SubsequentScreenToScreenCopy = ASTSubsequentScreenToScreenCopy; 18015fb4814Smrg infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK; 18115fb4814Smrg } 18215fb4814Smrg 18315fb4814Smrg /* Solid fill */ 18415fb4814Smrg if (pAST->ENGCaps & ENG_CAP_SolidFill) 1857fe5393cSmrg { 18615fb4814Smrg infoPtr->SetupForSolidFill = ASTSetupForSolidFill; 18715fb4814Smrg infoPtr->SubsequentSolidFillRect = ASTSubsequentSolidFillRect; 18815fb4814Smrg infoPtr->SolidFillFlags = NO_PLANEMASK; 1897fe5393cSmrg } 1907fe5393cSmrg 19115fb4814Smrg /* Solid Lines */ 19215fb4814Smrg if (pAST->ENGCaps & ENG_CAP_SolidLine) 1937fe5393cSmrg { 194cc47c849Smrg if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST2500) || (pAST->jChipType == AST1180) ) 195b410ddbeSmrg { 196b410ddbeSmrg infoPtr->SubsequentSolidTwoPointLine = AIPSubsequentSolidTwoPointLine; 197b410ddbeSmrg } 198b410ddbeSmrg else 199b410ddbeSmrg { 200b410ddbeSmrg infoPtr->SubsequentSolidTwoPointLine = ASTSubsequentSolidTwoPointLine; 201b410ddbeSmrg } 202b410ddbeSmrg 2037fe5393cSmrg infoPtr->SetupForSolidLine = ASTSetupForSolidLine; 2047fe5393cSmrg infoPtr->SubsequentSolidHorVertLine = ASTSubsequentSolidHorVertLine; 20515fb4814Smrg infoPtr->SolidLineFlags = NO_PLANEMASK; 20615fb4814Smrg } 20715fb4814Smrg 20815fb4814Smrg /* Dashed Lines */ 20915fb4814Smrg if (pAST->ENGCaps & ENG_CAP_DashedLine) 210b410ddbeSmrg { 211cc47c849Smrg if ( (pAST->jChipType == AST2300) || (pAST->jChipType == AST2400) || (pAST->jChipType == AST2500) || (pAST->jChipType == AST1180) ) 212b410ddbeSmrg { 213b410ddbeSmrg infoPtr->SubsequentDashedTwoPointLine = AIPSubsequentDashedTwoPointLine; 214b410ddbeSmrg } 215b410ddbeSmrg else 216b410ddbeSmrg { 217b410ddbeSmrg infoPtr->SubsequentDashedTwoPointLine = ASTSubsequentDashedTwoPointLine; 2187fe5393cSmrg } 219b410ddbeSmrg 2207fe5393cSmrg infoPtr->SetupForDashedLine = ASTSetupForDashedLine; 22115fb4814Smrg infoPtr->DashPatternMaxLength = 64; 22215fb4814Smrg infoPtr->DashedLineFlags = NO_PLANEMASK | 22315fb4814Smrg LINE_PATTERN_MSBFIRST_LSBJUSTIFIED; 2247fe5393cSmrg } 22515fb4814Smrg 22615fb4814Smrg /* 8x8 mono pattern fill */ 22715fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Mono8x8PatternFill) 2287fe5393cSmrg { 22915fb4814Smrg infoPtr->SetupForMono8x8PatternFill = ASTSetupForMonoPatternFill; 23015fb4814Smrg infoPtr->SubsequentMono8x8PatternFillRect = ASTSubsequentMonoPatternFill; 23115fb4814Smrg infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | 23215fb4814Smrg NO_TRANSPARENCY | 23315fb4814Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 23415fb4814Smrg HARDWARE_PATTERN_PROGRAMMED_BITS | 23515fb4814Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 2367fe5393cSmrg } 2377fe5393cSmrg 23815fb4814Smrg /* 8x8 color pattern fill */ 23915fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Color8x8PatternFill) 2407fe5393cSmrg { 24115fb4814Smrg infoPtr->SetupForColor8x8PatternFill = ASTSetupForColor8x8PatternFill; 24215fb4814Smrg infoPtr->SubsequentColor8x8PatternFillRect = ASTSubsequentColor8x8PatternFillRect; 24315fb4814Smrg infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK | 2447fe5393cSmrg NO_TRANSPARENCY | 24515fb4814Smrg HARDWARE_PATTERN_SCREEN_ORIGIN; 2467fe5393cSmrg } 2477fe5393cSmrg 24815fb4814Smrg /* CPU To Screen Color Expand */ 24915fb4814Smrg if (pAST->ENGCaps & ENG_CAP_CPUToScreenColorExpand) 2507fe5393cSmrg { 25115fb4814Smrg infoPtr->SetupForCPUToScreenColorExpandFill = ASTSetupForCPUToScreenColorExpandFill; 25215fb4814Smrg infoPtr->SubsequentCPUToScreenColorExpandFill = ASTSubsequentCPUToScreenColorExpandFill; 25315fb4814Smrg infoPtr->ColorExpandRange = MAX_PATReg_Size; 25415fb4814Smrg infoPtr->ColorExpandBase = MMIOREG_PAT; 25515fb4814Smrg infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK | 25615fb4814Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 2577fe5393cSmrg } 25815fb4814Smrg 25915fb4814Smrg /* Screen To Screen Color Expand */ 26015fb4814Smrg if (pAST->ENGCaps & ENG_CAP_ScreenToScreenColorExpand) 2617fe5393cSmrg { 26215fb4814Smrg infoPtr->SetupForScreenToScreenColorExpandFill = ASTSetupForScreenToScreenColorExpandFill; 26315fb4814Smrg infoPtr->SubsequentScreenToScreenColorExpandFill = ASTSubsequentScreenToScreenColorExpandFill; 26415fb4814Smrg infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK | 26515fb4814Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 2667fe5393cSmrg } 2677fe5393cSmrg 26815fb4814Smrg /* Clipping */ 26915fb4814Smrg if (pAST->ENGCaps & ENG_CAP_Clipping) 2707fe5393cSmrg { 27115fb4814Smrg infoPtr->SetClippingRectangle = ASTSetClippingRectangle; 27215fb4814Smrg infoPtr->DisableClipping = ASTDisableClipping; 27315fb4814Smrg infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | 27415fb4814Smrg HARDWARE_CLIP_MONO_8x8_FILL | 27515fb4814Smrg HARDWARE_CLIP_COLOR_8x8_FILL | 2767fe5393cSmrg HARDWARE_CLIP_SOLID_LINE | 2777fe5393cSmrg HARDWARE_CLIP_DASHED_LINE | 2787fe5393cSmrg HARDWARE_CLIP_SOLID_LINE; 2797fe5393cSmrg } 28015fb4814Smrg 28115fb4814Smrg return(XAAInit(pScreen, infoPtr)); 2827fe5393cSmrg 28315fb4814Smrg} /* end of ASTAccelInit */ 28415fb4814Smrg 28515fb4814Smrgstatic void 28615fb4814SmrgASTSync(ScrnInfoPtr pScrn) 28715fb4814Smrg{ 28815fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 28915fb4814Smrg 29015fb4814Smrg /* wait engle idle */ 291621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 29215fb4814Smrg 29315fb4814Smrg} /* end of ASTSync */ 29415fb4814Smrg 29515fb4814Smrg 29615fb4814Smrgstatic void ASTSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 29715fb4814Smrg int xdir, int ydir, int rop, 29815fb4814Smrg unsigned int planemask, int trans_color) 29915fb4814Smrg{ 3007fe5393cSmrg 30115fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 30215fb4814Smrg PKT_SC *pSingleCMD; 30315fb4814Smrg ULONG cmdreg; 3047fe5393cSmrg 30515fb4814Smrg/* 30615fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenCopy\n"); 3077fe5393cSmrg*/ 30815fb4814Smrg /* Modify Reg. Value */ 30915fb4814Smrg cmdreg = CMD_BITBLT; 31015fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 31115fb4814Smrg { 31215fb4814Smrg case 8: 31315fb4814Smrg cmdreg |= CMD_COLOR_08; 31415fb4814Smrg break; 31515fb4814Smrg case 15: 31615fb4814Smrg case 16: 31715fb4814Smrg cmdreg |= CMD_COLOR_16; 3187fe5393cSmrg break; 31915fb4814Smrg case 24: 32015fb4814Smrg case 32: 32115fb4814Smrg cmdreg |= CMD_COLOR_32; 3227fe5393cSmrg break; 32315fb4814Smrg } 32415fb4814Smrg cmdreg |= (ASTXAACopyROP[rop] << 8); 32515fb4814Smrg pAST->ulCMDReg = cmdreg; 3267fe5393cSmrg 32715fb4814Smrg if (!pAST->MMIO2D) 3287fe5393cSmrg { 32915fb4814Smrg /* Write to CMDQ */ 330621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2); 3317fe5393cSmrg 3327fe5393cSmrg ASTSetupSRCPitch(pSingleCMD, pAST->VideoModeInfo.ScreenPitch); 33315fb4814Smrg pSingleCMD++; 33415fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 3357fe5393cSmrg 336de78e416Smrg /* Update Write Pointer */ 337de78e416Smrg mUpdateWritePointer; 3387fe5393cSmrg 33915fb4814Smrg } 34015fb4814Smrg else 34115fb4814Smrg { 3427fe5393cSmrg /* Write to MMIO */ 3437fe5393cSmrg ASTSetupSRCPitch_MMIO(pAST->VideoModeInfo.ScreenPitch); 3447fe5393cSmrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 34515fb4814Smrg } 3467fe5393cSmrg 34715fb4814Smrg} /* end of ASTSetupForScreenToScreenCopy */ 34815fb4814Smrg 34915fb4814Smrgstatic void 35015fb4814SmrgASTSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, 35115fb4814Smrg int y2, int width, int height) 35215fb4814Smrg{ 35315fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 35415fb4814Smrg PKT_SC *pSingleCMD; 35515fb4814Smrg int src_x, src_y, dst_x, dst_y; 35615fb4814Smrg ULONG srcbase, dstbase, cmdreg; 357de78e416Smrg int delta_y = 0; 35815fb4814Smrg/* 35915fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenCopy\n"); 36015fb4814Smrg*/ 36115fb4814Smrg 362de78e416Smrg if ((width != 0) && (height != 0)) 3637fe5393cSmrg { 364de78e416Smrg /* Modify Reg. Value */ 365de78e416Smrg cmdreg = pAST->ulCMDReg; 366de78e416Smrg if (pAST->EnableClip) 367de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 368de78e416Smrg else 3697fe5393cSmrg cmdreg &= ~CMD_ENABLE_CLIP; 370de78e416Smrg srcbase = dstbase = 0; 371de78e416Smrg 372de78e416Smrg if (x1 < x2) 3737fe5393cSmrg cmdreg |= CMD_X_DEC; 374de78e416Smrg 375de78e416Smrg if (y1 < y2) 3767fe5393cSmrg cmdreg |= CMD_Y_DEC; 3777fe5393cSmrg 378de78e416Smrg if ((y1 + height) >= MAX_SRC_Y) 3797fe5393cSmrg { 380de78e416Smrg srcbase=pAST->VideoModeInfo.ScreenPitch*y1; 381de78e416Smrg y1 = 0; 3827fe5393cSmrg } 3837fe5393cSmrg 3847fe5393cSmrg if ((y2 + height) >= pScrn->virtualY) 3857fe5393cSmrg { 386de78e416Smrg delta_y = y2; 387de78e416Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*y2; 388de78e416Smrg y2 = 0; 389de78e416Smrg } 3907fe5393cSmrg 391de78e416Smrg if (cmdreg & CMD_X_DEC) 392de78e416Smrg { 393de78e416Smrg src_x = x1 + width - 1; 394de78e416Smrg dst_x = x2 + width - 1; 395de78e416Smrg } 396de78e416Smrg else 397de78e416Smrg { 398de78e416Smrg src_x = x1; 3997fe5393cSmrg dst_x = x2; 400de78e416Smrg } 4017fe5393cSmrg 402de78e416Smrg if (cmdreg & CMD_Y_DEC) 4037fe5393cSmrg { 404de78e416Smrg src_y = y1 + height - 1; 405de78e416Smrg dst_y = y2 + height - 1; 406de78e416Smrg } 407de78e416Smrg else 408de78e416Smrg { 409de78e416Smrg src_y = y1; 4107fe5393cSmrg dst_y = y2; 411de78e416Smrg } 4127fe5393cSmrg 4137fe5393cSmrg if (pAST->EnableClip) 414de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 4157fe5393cSmrg 4167fe5393cSmrg if (!pAST->MMIO2D) 417de78e416Smrg { 418de78e416Smrg /* Write to CMDQ */ 419621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6); 4207fe5393cSmrg 421de78e416Smrg ASTSetupSRCBase(pSingleCMD, srcbase); 4227fe5393cSmrg pSingleCMD++; 423de78e416Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 4247fe5393cSmrg pSingleCMD++; 4257fe5393cSmrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 4267fe5393cSmrg pSingleCMD++; 4277fe5393cSmrg ASTSetupSRCXY(pSingleCMD, src_x, src_y); 4287fe5393cSmrg pSingleCMD++; 4297fe5393cSmrg ASTSetupRECTXY(pSingleCMD, width, height); 4307fe5393cSmrg pSingleCMD++; 4317fe5393cSmrg ASTSetupCMDReg(pSingleCMD, cmdreg); 4327fe5393cSmrg 433de78e416Smrg /* Update Write Pointer */ 434de78e416Smrg mUpdateWritePointer; 4357fe5393cSmrg 436de78e416Smrg } 437de78e416Smrg else 438de78e416Smrg { 439de78e416Smrg ASTSetupSRCBase_MMIO(srcbase); 440de78e416Smrg ASTSetupDSTBase_MMIO(dstbase); 4417fe5393cSmrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 4427fe5393cSmrg ASTSetupSRCXY_MMIO(src_x, src_y); 4437fe5393cSmrg ASTSetupRECTXY_MMIO(width, height); 4447fe5393cSmrg ASTSetupCMDReg_MMIO(cmdreg); 4457fe5393cSmrg 446621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 447de78e416Smrg } 4487fe5393cSmrg 449de78e416Smrg } /* width & height check */ 45015fb4814Smrg 45115fb4814Smrg} /* end of ASTSubsequentScreenToScreenCopy */ 45215fb4814Smrg 45315fb4814Smrgstatic void 45415fb4814SmrgASTSetupForSolidFill(ScrnInfoPtr pScrn, 45515fb4814Smrg int color, int rop, unsigned int planemask) 45615fb4814Smrg{ 4577fe5393cSmrg 45815fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 45915fb4814Smrg PKT_SC *pSingleCMD; 46015fb4814Smrg ULONG cmdreg; 46115fb4814Smrg 4627fe5393cSmrg/* 46315fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidFill\n"); 4647fe5393cSmrg*/ 46515fb4814Smrg /* Modify Reg. Value */ 46615fb4814Smrg cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR; 46715fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 46815fb4814Smrg { 46915fb4814Smrg case 8: 47015fb4814Smrg cmdreg |= CMD_COLOR_08; 47115fb4814Smrg break; 47215fb4814Smrg case 15: 47315fb4814Smrg case 16: 47415fb4814Smrg cmdreg |= CMD_COLOR_16; 4757fe5393cSmrg break; 47615fb4814Smrg case 24: 47715fb4814Smrg case 32: 47815fb4814Smrg cmdreg |= CMD_COLOR_32; 4797fe5393cSmrg break; 48015fb4814Smrg } 48115fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 48215fb4814Smrg pAST->ulCMDReg = cmdreg; 4837fe5393cSmrg 4847fe5393cSmrg if (!pAST->MMIO2D) 48515fb4814Smrg { 48615fb4814Smrg /* Write to CMDQ */ 487621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2); 48815fb4814Smrg 48915fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 49015fb4814Smrg pSingleCMD++; 491de78e416Smrg ASTSetupFG(pSingleCMD, color); 4927fe5393cSmrg 493de78e416Smrg /* Update Write Pointer */ 494de78e416Smrg mUpdateWritePointer; 4957fe5393cSmrg 49615fb4814Smrg } 49715fb4814Smrg else 49815fb4814Smrg { 49915fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 5007fe5393cSmrg ASTSetupFG_MMIO(color); 50115fb4814Smrg } 5027fe5393cSmrg 50315fb4814Smrg} /* end of ASTSetupForSolidFill */ 50415fb4814Smrg 50515fb4814Smrg 50615fb4814Smrgstatic void 50715fb4814SmrgASTSubsequentSolidFillRect(ScrnInfoPtr pScrn, 50815fb4814Smrg int dst_x, int dst_y, int width, int height) 50915fb4814Smrg{ 51015fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 51115fb4814Smrg PKT_SC *pSingleCMD; 5127fe5393cSmrg ULONG dstbase, cmdreg; 513de78e416Smrg int delta_y = 0; 5147fe5393cSmrg 5157fe5393cSmrg/* 51615fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidFillRect\n"); 51715fb4814Smrg*/ 51815fb4814Smrg 519de78e416Smrg if ((width != 0) && (height != 0)) 520de78e416Smrg { 521de78e416Smrg /* Modify Reg. Value */ 522de78e416Smrg cmdreg = pAST->ulCMDReg; 523de78e416Smrg if (pAST->EnableClip) 524de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 525de78e416Smrg else 5267fe5393cSmrg cmdreg &= ~CMD_ENABLE_CLIP; 527de78e416Smrg dstbase = 0; 5287fe5393cSmrg 5297fe5393cSmrg if (dst_y >= pScrn->virtualY) 530de78e416Smrg { 5317fe5393cSmrg delta_y = dst_y; 532de78e416Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 533de78e416Smrg dst_y=0; 534de78e416Smrg } 53515fb4814Smrg 5367fe5393cSmrg if (pAST->EnableClip) 537de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 5387fe5393cSmrg 5397fe5393cSmrg if (!pAST->MMIO2D) 5407fe5393cSmrg { 5417fe5393cSmrg /* Write to CMDQ */ 542621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 5437fe5393cSmrg 544de78e416Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 5457fe5393cSmrg pSingleCMD++; 546de78e416Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 5477fe5393cSmrg pSingleCMD++; 548de78e416Smrg ASTSetupRECTXY(pSingleCMD, width, height); 5497fe5393cSmrg pSingleCMD++; 5507fe5393cSmrg ASTSetupCMDReg(pSingleCMD, cmdreg); 5517fe5393cSmrg 552de78e416Smrg /* Update Write Pointer */ 553de78e416Smrg mUpdateWritePointer; 5547fe5393cSmrg 555de78e416Smrg } 556de78e416Smrg else 5577fe5393cSmrg { 558de78e416Smrg ASTSetupDSTBase_MMIO(dstbase); 559de78e416Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 560de78e416Smrg ASTSetupRECTXY_MMIO(width, height); 5617fe5393cSmrg ASTSetupCMDReg_MMIO(cmdreg); 5627fe5393cSmrg 563621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 5647fe5393cSmrg 565de78e416Smrg } 5667fe5393cSmrg 567de78e416Smrg } /* width & height check */ 56815fb4814Smrg 56915fb4814Smrg 57015fb4814Smrg} /* end of ASTSubsequentSolidFillRect */ 57115fb4814Smrg 57215fb4814Smrg/* Line */ 5737fe5393cSmrgstatic void ASTSetupForSolidLine(ScrnInfoPtr pScrn, 57415fb4814Smrg int color, int rop, unsigned int planemask) 57515fb4814Smrg{ 57615fb4814Smrg 57715fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 57815fb4814Smrg PKT_SC *pSingleCMD; 57915fb4814Smrg ULONG cmdreg; 58015fb4814Smrg/* 58115fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForSolidLine\n"); 5827fe5393cSmrg*/ 58315fb4814Smrg /* Modify Reg. Value */ 58415fb4814Smrg cmdreg = CMD_BITBLT; 58515fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 58615fb4814Smrg { 58715fb4814Smrg case 8: 58815fb4814Smrg cmdreg |= CMD_COLOR_08; 58915fb4814Smrg break; 59015fb4814Smrg case 15: 59115fb4814Smrg case 16: 59215fb4814Smrg cmdreg |= CMD_COLOR_16; 5937fe5393cSmrg break; 59415fb4814Smrg case 24: 59515fb4814Smrg case 32: 59615fb4814Smrg cmdreg |= CMD_COLOR_32; 5977fe5393cSmrg break; 59815fb4814Smrg } 5997fe5393cSmrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 60015fb4814Smrg pAST->ulCMDReg = cmdreg; 6017fe5393cSmrg 60215fb4814Smrg if (!pAST->MMIO2D) 6037fe5393cSmrg { 60415fb4814Smrg /* Write to CMDQ */ 605621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3); 60615fb4814Smrg 60715fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 60815fb4814Smrg pSingleCMD++; 6097fe5393cSmrg ASTSetupFG(pSingleCMD, color); 61015fb4814Smrg pSingleCMD++; 61115fb4814Smrg ASTSetupBG(pSingleCMD, 0); 6127fe5393cSmrg 613de78e416Smrg /* Update Write Pointer */ 6147fe5393cSmrg mUpdateWritePointer; 6157fe5393cSmrg 61615fb4814Smrg } 61715fb4814Smrg else 61815fb4814Smrg { 6197fe5393cSmrg /* Write to MMIO */ 6207fe5393cSmrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 6217fe5393cSmrg ASTSetupFG_MMIO(color); 6227fe5393cSmrg ASTSetupBG_MMIO(0); 62315fb4814Smrg } 6247fe5393cSmrg 62515fb4814Smrg} /* end of ASTSetupForSolidLine */ 62615fb4814Smrg 62715fb4814Smrg 62815fb4814Smrgstatic void ASTSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, 62915fb4814Smrg int x, int y, int len, int dir) 63015fb4814Smrg{ 63115fb4814Smrg 63215fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 63315fb4814Smrg PKT_SC *pSingleCMD; 6347fe5393cSmrg ULONG dstbase, cmdreg; 63515fb4814Smrg int width, height; 636de78e416Smrg int delta_y = 0; 6377fe5393cSmrg/* 63815fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidHorVertLine\n"); 63915fb4814Smrg*/ 64015fb4814Smrg 641de78e416Smrg if (len != 0) 642de78e416Smrg { 643de78e416Smrg /* Modify Reg. Value */ 644de78e416Smrg cmdreg = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT; 645de78e416Smrg if (pAST->EnableClip) 646de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 647de78e416Smrg else 6487fe5393cSmrg cmdreg &= ~CMD_ENABLE_CLIP; 649de78e416Smrg dstbase = 0; 6507fe5393cSmrg 651de78e416Smrg if(dir == DEGREES_0) { /* horizontal */ 652de78e416Smrg width = len; 6537fe5393cSmrg height = 1; 654de78e416Smrg } else { /* vertical */ 655de78e416Smrg width = 1; 6567fe5393cSmrg height = len; 657de78e416Smrg } 6587fe5393cSmrg 6597fe5393cSmrg if ((y + height) >= pScrn->virtualY) 6607fe5393cSmrg { 6617fe5393cSmrg delta_y = y; 662de78e416Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*y; 663de78e416Smrg y=0; 664de78e416Smrg } 6657fe5393cSmrg 6667fe5393cSmrg if (pAST->EnableClip) 667de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 6687fe5393cSmrg 6697fe5393cSmrg if (!pAST->MMIO2D) 6707fe5393cSmrg { 6717fe5393cSmrg /* Write to CMDQ */ 672621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 6737fe5393cSmrg 674de78e416Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 6757fe5393cSmrg pSingleCMD++; 676de78e416Smrg ASTSetupDSTXY(pSingleCMD, x, y); 6777fe5393cSmrg pSingleCMD++; 678de78e416Smrg ASTSetupRECTXY(pSingleCMD, width, height); 6797fe5393cSmrg pSingleCMD++; 6807fe5393cSmrg ASTSetupCMDReg(pSingleCMD, cmdreg); 6817fe5393cSmrg 682de78e416Smrg /* Update Write Pointer */ 683de78e416Smrg mUpdateWritePointer; 6847fe5393cSmrg 685de78e416Smrg } 686de78e416Smrg else 6877fe5393cSmrg { 688de78e416Smrg ASTSetupDSTBase_MMIO(dstbase); 689de78e416Smrg ASTSetupDSTXY_MMIO(x, y); 690de78e416Smrg ASTSetupRECTXY_MMIO(width, height); 6917fe5393cSmrg ASTSetupCMDReg_MMIO(cmdreg); 6927fe5393cSmrg 693621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 6947fe5393cSmrg 695de78e416Smrg } 6967fe5393cSmrg 697de78e416Smrg } /* len check */ 6987fe5393cSmrg 69915fb4814Smrg} /* end of ASTSubsequentSolidHorVertLine */ 70015fb4814Smrg 70115fb4814Smrgstatic void ASTSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 70215fb4814Smrg int x1, int y1, int x2, int y2, int flags) 70315fb4814Smrg{ 7047fe5393cSmrg 70515fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 70615fb4814Smrg PKT_SC *pSingleCMD; 70715fb4814Smrg LINEPARAM dsLineParam; 7087fe5393cSmrg _LINEInfo LineInfo; 70915fb4814Smrg ULONG dstbase, ulCommand; 7107fe5393cSmrg ULONG miny, maxy; 71115fb4814Smrg USHORT usXM; 712de78e416Smrg int delta_y = 0; 7137fe5393cSmrg 71415fb4814Smrg/* 71515fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n"); 7167fe5393cSmrg*/ 71715fb4814Smrg 71815fb4814Smrg /* Modify Reg. Value */ 71915fb4814Smrg ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW; 72015fb4814Smrg if(flags & OMIT_LAST) 72115fb4814Smrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 72215fb4814Smrg else 72315fb4814Smrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 72415fb4814Smrg if (pAST->EnableClip) 72515fb4814Smrg ulCommand |= CMD_ENABLE_CLIP; 726de78e416Smrg else 7277fe5393cSmrg ulCommand &= ~CMD_ENABLE_CLIP; 72815fb4814Smrg dstbase = 0; 72915fb4814Smrg miny = (y1 > y2) ? y2 : y1; 73015fb4814Smrg maxy = (y1 > y2) ? y1 : y2; 73115fb4814Smrg if(maxy >= pScrn->virtualY) { 732de78e416Smrg delta_y = miny; 73315fb4814Smrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 73415fb4814Smrg y1 -= miny; 73515fb4814Smrg y2 -= miny; 73615fb4814Smrg } 7377fe5393cSmrg 73815fb4814Smrg LineInfo.X1 = x1; 73915fb4814Smrg LineInfo.Y1 = y1; 74015fb4814Smrg LineInfo.X2 = x2; 74115fb4814Smrg LineInfo.Y2 = y2; 7427fe5393cSmrg 743621ff18cSmrg bASTGetLineTerm(&LineInfo, &dsLineParam); /* Get Line Parameter */ 7447fe5393cSmrg 7457fe5393cSmrg if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC) 7467fe5393cSmrg ulCommand |= CMD_X_DEC; 7477fe5393cSmrg if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC) 7487fe5393cSmrg ulCommand |= CMD_Y_DEC; 7497fe5393cSmrg 7507fe5393cSmrg usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0; 7517fe5393cSmrg 7527fe5393cSmrg if (pAST->EnableClip) 753de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 7547fe5393cSmrg 7557fe5393cSmrg if (!pAST->MMIO2D) 7567fe5393cSmrg { 7577fe5393cSmrg /* Write to CMDQ */ 758621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7); 75915fb4814Smrg 76015fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 7617fe5393cSmrg pSingleCMD++; 76215fb4814Smrg ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY); 7637fe5393cSmrg pSingleCMD++; 76415fb4814Smrg ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm); 7657fe5393cSmrg pSingleCMD++; 76615fb4814Smrg ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth); 7677fe5393cSmrg pSingleCMD++; 76815fb4814Smrg ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term); 7697fe5393cSmrg pSingleCMD++; 77015fb4814Smrg ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term); 7717fe5393cSmrg pSingleCMD++; 7727fe5393cSmrg ASTSetupCMDReg(pSingleCMD, ulCommand); 7737fe5393cSmrg 77415fb4814Smrg /* Update Write Pointer */ 7757fe5393cSmrg mUpdateWritePointer; 776de78e416Smrg 777de78e416Smrg /* Patch KDE pass abnormal point, ycchen@052507 */ 778621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 7797fe5393cSmrg 78015fb4814Smrg } 78115fb4814Smrg else 7827fe5393cSmrg { 78315fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 78415fb4814Smrg ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY); 78515fb4814Smrg ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm); 78615fb4814Smrg ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth); 78715fb4814Smrg ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term); 78815fb4814Smrg ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term); 7897fe5393cSmrg ASTSetupCMDReg_MMIO(ulCommand); 7907fe5393cSmrg 791621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 7927fe5393cSmrg 79315fb4814Smrg } 79415fb4814Smrg 7957fe5393cSmrg 79615fb4814Smrg} /* end of ASTSubsequentSolidTwoPointLine */ 79715fb4814Smrg 79815fb4814Smrg/* Dash Line */ 79915fb4814Smrgstatic void 80015fb4814SmrgASTSetupForDashedLine(ScrnInfoPtr pScrn, 80115fb4814Smrg int fg, int bg, int rop, unsigned int planemask, 80215fb4814Smrg int length, UCHAR *pattern) 80315fb4814Smrg{ 80415fb4814Smrg 80515fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 80615fb4814Smrg PKT_SC *pSingleCMD; 80715fb4814Smrg ULONG cmdreg; 80815fb4814Smrg/* 80915fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForDashedLine\n"); 8107fe5393cSmrg*/ 81115fb4814Smrg /* Modify Reg. Value */ 81215fb4814Smrg cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE; 8137fe5393cSmrg 81415fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 81515fb4814Smrg { 81615fb4814Smrg case 8: 81715fb4814Smrg cmdreg |= CMD_COLOR_08; 81815fb4814Smrg break; 81915fb4814Smrg case 15: 82015fb4814Smrg case 16: 82115fb4814Smrg cmdreg |= CMD_COLOR_16; 8227fe5393cSmrg break; 82315fb4814Smrg case 24: 82415fb4814Smrg case 32: 82515fb4814Smrg cmdreg |= CMD_COLOR_32; 8267fe5393cSmrg break; 82715fb4814Smrg } 8287fe5393cSmrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 82915fb4814Smrg if(bg == -1) { 8307fe5393cSmrg cmdreg |= CMD_TRANSPARENT; 83115fb4814Smrg bg = 0; 83215fb4814Smrg } 83315fb4814Smrg cmdreg |= (((length-1) & 0x3F) << 24); /* line period */ 83415fb4814Smrg pAST->ulCMDReg = cmdreg; 8357fe5393cSmrg 83615fb4814Smrg if (!pAST->MMIO2D) 8377fe5393cSmrg { 83815fb4814Smrg /* Write to CMDQ */ 839621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 84015fb4814Smrg 84115fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 84215fb4814Smrg pSingleCMD++; 8437fe5393cSmrg ASTSetupFG(pSingleCMD, fg); 84415fb4814Smrg pSingleCMD++; 8457fe5393cSmrg ASTSetupBG(pSingleCMD, bg); 84615fb4814Smrg pSingleCMD++; 84715fb4814Smrg ASTSetupLineStyle1(pSingleCMD, *pattern); 84815fb4814Smrg pSingleCMD++; 849de78e416Smrg ASTSetupLineStyle2(pSingleCMD, *(pattern+4)); 8507fe5393cSmrg 851de78e416Smrg /* Update Write Pointer */ 8527fe5393cSmrg mUpdateWritePointer; 8537fe5393cSmrg 85415fb4814Smrg } 85515fb4814Smrg else 85615fb4814Smrg { 8577fe5393cSmrg /* Write to MMIO */ 85815fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 8597fe5393cSmrg ASTSetupFG_MMIO(fg); 8607fe5393cSmrg ASTSetupBG_MMIO(bg); 86115fb4814Smrg ASTSetupLineStyle1_MMIO(*pattern); 8627fe5393cSmrg ASTSetupLineStyle2_MMIO(*(pattern+4)); 86315fb4814Smrg 86415fb4814Smrg } 8657fe5393cSmrg 86615fb4814Smrg} 86715fb4814Smrg 86815fb4814Smrgstatic void 86915fb4814SmrgASTSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 87015fb4814Smrg int x1, int y1, int x2, int y2, 87115fb4814Smrg int flags, int phase) 87215fb4814Smrg{ 8737fe5393cSmrg 87415fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 87515fb4814Smrg PKT_SC *pSingleCMD; 87615fb4814Smrg LINEPARAM dsLineParam; 8777fe5393cSmrg _LINEInfo LineInfo; 8787fe5393cSmrg ULONG dstbase, ulCommand; 8797fe5393cSmrg ULONG miny, maxy; 88015fb4814Smrg USHORT usXM; 881de78e416Smrg int delta_y = 0; 8827fe5393cSmrg 88315fb4814Smrg/* 88415fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n"); 8857fe5393cSmrg*/ 88615fb4814Smrg 88715fb4814Smrg /* Modify Reg. Value */ 88815fb4814Smrg ulCommand = pAST->ulCMDReg; 88915fb4814Smrg if(flags & OMIT_LAST) 89015fb4814Smrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 89115fb4814Smrg else 89215fb4814Smrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 89315fb4814Smrg if (pAST->EnableClip) 89415fb4814Smrg ulCommand |= CMD_ENABLE_CLIP; 895de78e416Smrg else 8967fe5393cSmrg ulCommand &= ~CMD_ENABLE_CLIP; 8977fe5393cSmrg dstbase = 0; 89815fb4814Smrg miny = (y1 > y2) ? y2 : y1; 89915fb4814Smrg maxy = (y1 > y2) ? y1 : y2; 90015fb4814Smrg if(maxy >= pScrn->virtualY) { 901de78e416Smrg delta_y = miny; 90215fb4814Smrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 90315fb4814Smrg y1 -= miny; 90415fb4814Smrg y2 -= miny; 90515fb4814Smrg } 9067fe5393cSmrg 90715fb4814Smrg LineInfo.X1 = x1; 90815fb4814Smrg LineInfo.Y1 = y1; 90915fb4814Smrg LineInfo.X2 = x2; 91015fb4814Smrg LineInfo.Y2 = y2; 9117fe5393cSmrg 912621ff18cSmrg bASTGetLineTerm(&LineInfo, &dsLineParam); /* Get Line Parameter */ 9137fe5393cSmrg 9147fe5393cSmrg if (dsLineParam.dwLineAttributes & LINEPARAM_X_DEC) 9157fe5393cSmrg ulCommand |= CMD_X_DEC; 9167fe5393cSmrg if (dsLineParam.dwLineAttributes & LINEPARAM_Y_DEC) 9177fe5393cSmrg ulCommand |= CMD_Y_DEC; 9187fe5393cSmrg 9197fe5393cSmrg usXM = (dsLineParam.dwLineAttributes & LINEPARAM_XM) ? 1:0; 9207fe5393cSmrg 9217fe5393cSmrg if (pAST->EnableClip) 922de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 9237fe5393cSmrg 9247fe5393cSmrg if (!pAST->MMIO2D) 9257fe5393cSmrg { 9267fe5393cSmrg /* Write to CMDQ */ 927621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*7); 92815fb4814Smrg 92915fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 9307fe5393cSmrg pSingleCMD++; 93115fb4814Smrg ASTSetupLineXY(pSingleCMD, dsLineParam.dsLineX, dsLineParam.dsLineY); 9327fe5393cSmrg pSingleCMD++; 93315fb4814Smrg ASTSetupLineXMErrTerm(pSingleCMD, usXM , dsLineParam.dwErrorTerm); 9347fe5393cSmrg pSingleCMD++; 93515fb4814Smrg ASTSetupLineWidth(pSingleCMD, dsLineParam.dsLineWidth); 9367fe5393cSmrg pSingleCMD++; 93715fb4814Smrg ASTSetupLineK1Term(pSingleCMD, dsLineParam.dwK1Term); 9387fe5393cSmrg pSingleCMD++; 93915fb4814Smrg ASTSetupLineK2Term(pSingleCMD, dsLineParam.dwK2Term); 9407fe5393cSmrg pSingleCMD++; 9417fe5393cSmrg ASTSetupCMDReg(pSingleCMD, ulCommand); 9427fe5393cSmrg 94315fb4814Smrg /* Update Write Pointer */ 94415fb4814Smrg mUpdateWritePointer; 945de78e416Smrg 946de78e416Smrg /* Patch KDE pass abnormal point, ycchen@052507 */ 947621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 9487fe5393cSmrg 94915fb4814Smrg } 95015fb4814Smrg else 9517fe5393cSmrg { 95215fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 95315fb4814Smrg ASTSetupLineXY_MMIO(dsLineParam.dsLineX, dsLineParam.dsLineY); 95415fb4814Smrg ASTSetupLineXMErrTerm_MMIO( usXM , dsLineParam.dwErrorTerm); 95515fb4814Smrg ASTSetupLineWidth_MMIO(dsLineParam.dsLineWidth); 95615fb4814Smrg ASTSetupLineK1Term_MMIO(dsLineParam.dwK1Term); 95715fb4814Smrg ASTSetupLineK2Term_MMIO(dsLineParam.dwK2Term); 9587fe5393cSmrg ASTSetupCMDReg_MMIO(ulCommand); 9597fe5393cSmrg 960621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 9617fe5393cSmrg 96215fb4814Smrg } 9637fe5393cSmrg 96415fb4814Smrg} 96515fb4814Smrg 96615fb4814Smrg/* Mono Pattern Fill */ 96715fb4814Smrgstatic void 96815fb4814SmrgASTSetupForMonoPatternFill(ScrnInfoPtr pScrn, 96915fb4814Smrg int patx, int paty, int fg, int bg, 97015fb4814Smrg int rop, unsigned int planemask) 97115fb4814Smrg{ 9727fe5393cSmrg 97315fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 97415fb4814Smrg PKT_SC *pSingleCMD; 97515fb4814Smrg ULONG cmdreg; 97615fb4814Smrg 9777fe5393cSmrg/* 97815fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForMonoPatternFill\n"); 9797fe5393cSmrg*/ 98015fb4814Smrg /* Modify Reg. Value */ 98115fb4814Smrg cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK; 98215fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 98315fb4814Smrg { 98415fb4814Smrg case 8: 98515fb4814Smrg cmdreg |= CMD_COLOR_08; 98615fb4814Smrg break; 98715fb4814Smrg case 15: 98815fb4814Smrg case 16: 98915fb4814Smrg cmdreg |= CMD_COLOR_16; 9907fe5393cSmrg break; 99115fb4814Smrg case 24: 99215fb4814Smrg case 32: 99315fb4814Smrg cmdreg |= CMD_COLOR_32; 9947fe5393cSmrg break; 99515fb4814Smrg } 99615fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 99715fb4814Smrg pAST->ulCMDReg = cmdreg; 9987fe5393cSmrg 9997fe5393cSmrg if (!pAST->MMIO2D) 100015fb4814Smrg { 100115fb4814Smrg /* Write to CMDQ */ 1002621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 100315fb4814Smrg 100415fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 100515fb4814Smrg pSingleCMD++; 10067fe5393cSmrg ASTSetupFG(pSingleCMD, fg); 100715fb4814Smrg pSingleCMD++; 100815fb4814Smrg ASTSetupBG(pSingleCMD, bg); 100915fb4814Smrg pSingleCMD++; 10107fe5393cSmrg ASTSetupMONO1(pSingleCMD, patx); 101115fb4814Smrg pSingleCMD++; 1012de78e416Smrg ASTSetupMONO2(pSingleCMD, paty); 10137fe5393cSmrg 1014de78e416Smrg /* Update Write Pointer */ 1015de78e416Smrg mUpdateWritePointer; 10167fe5393cSmrg 101715fb4814Smrg } 101815fb4814Smrg else 101915fb4814Smrg { 102015fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 10217fe5393cSmrg ASTSetupFG_MMIO(fg); 102215fb4814Smrg ASTSetupBG_MMIO(bg); 10237fe5393cSmrg ASTSetupMONO1_MMIO(patx); 10247fe5393cSmrg ASTSetupMONO2_MMIO(paty); 102515fb4814Smrg } 10267fe5393cSmrg 102715fb4814Smrg} /* end of ASTSetupForMonoPatternFill */ 102815fb4814Smrg 10297fe5393cSmrg 103015fb4814Smrgstatic void 103115fb4814SmrgASTSubsequentMonoPatternFill(ScrnInfoPtr pScrn, 103215fb4814Smrg int patx, int paty, 103315fb4814Smrg int dst_x, int dst_y, int width, int height) 103415fb4814Smrg{ 103515fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 103615fb4814Smrg PKT_SC *pSingleCMD; 1037de78e416Smrg ULONG dstbase, cmdreg; 1038de78e416Smrg int delta_y = 0; 10397fe5393cSmrg 10407fe5393cSmrg/* 104115fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentMonoPatternFill\n"); 10427fe5393cSmrg*/ 10437fe5393cSmrg 104415fb4814Smrg /* Modify Reg. Value */ 104515fb4814Smrg cmdreg = pAST->ulCMDReg; 104615fb4814Smrg if (pAST->EnableClip) 1047de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1048de78e416Smrg else 10497fe5393cSmrg cmdreg &= ~CMD_ENABLE_CLIP; 105015fb4814Smrg dstbase = 0; 105115fb4814Smrg 10527fe5393cSmrg if (dst_y >= pScrn->virtualY) 10537fe5393cSmrg { 1054de78e416Smrg delta_y = dst_y; 105515fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 105615fb4814Smrg dst_y=0; 105715fb4814Smrg } 1058de78e416Smrg 10597fe5393cSmrg if (pAST->EnableClip) 1060de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 10617fe5393cSmrg 10627fe5393cSmrg if (!pAST->MMIO2D) 10637fe5393cSmrg { 10647fe5393cSmrg /* Write to CMDQ */ 1065621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 106615fb4814Smrg 106715fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 10687fe5393cSmrg pSingleCMD++; 106915fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 10707fe5393cSmrg pSingleCMD++; 107115fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 10727fe5393cSmrg pSingleCMD++; 10737fe5393cSmrg ASTSetupCMDReg(pSingleCMD, cmdreg); 10747fe5393cSmrg 107515fb4814Smrg /* Update Write Pointer */ 107615fb4814Smrg mUpdateWritePointer; 10777fe5393cSmrg 107815fb4814Smrg } 107915fb4814Smrg else 10807fe5393cSmrg { 108115fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 108215fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 108315fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 10847fe5393cSmrg ASTSetupCMDReg_MMIO(cmdreg); 10857fe5393cSmrg 1086621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 10877fe5393cSmrg } 108815fb4814Smrg 108915fb4814Smrg} /* end of ASTSubsequentMonoPatternFill */ 109015fb4814Smrg 109115fb4814Smrgstatic void 109215fb4814SmrgASTSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, 109315fb4814Smrg int rop, unsigned int planemask, int trans_col) 109415fb4814Smrg{ 10957fe5393cSmrg 109615fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 109715fb4814Smrg PKT_SC *pSingleCMD; 109815fb4814Smrg ULONG cmdreg; 109915fb4814Smrg CARD32 *pataddr; 110015fb4814Smrg ULONG ulPatSize; 110115fb4814Smrg int i, j, cpp; 11027fe5393cSmrg/* 110315fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForColor8x8PatternFill\n"); 11047fe5393cSmrg*/ 110515fb4814Smrg /* Modify Reg. Value */ 110615fb4814Smrg cmdreg = CMD_BITBLT | CMD_PAT_PATREG; 110715fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 110815fb4814Smrg { 110915fb4814Smrg case 8: 111015fb4814Smrg cmdreg |= CMD_COLOR_08; 111115fb4814Smrg break; 111215fb4814Smrg case 15: 111315fb4814Smrg case 16: 111415fb4814Smrg cmdreg |= CMD_COLOR_16; 11157fe5393cSmrg break; 111615fb4814Smrg case 24: 111715fb4814Smrg case 32: 111815fb4814Smrg cmdreg |= CMD_COLOR_32; 11197fe5393cSmrg break; 112015fb4814Smrg } 112115fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 112215fb4814Smrg pAST->ulCMDReg = cmdreg; 112315fb4814Smrg cpp = (pScrn->bitsPerPixel + 1) / 8; 112415fb4814Smrg pataddr = (CARD32 *)(pAST->FBVirtualAddr + 11257fe5393cSmrg (paty * pAST->VideoModeInfo.ScreenPitch) + (patx * cpp)); 112615fb4814Smrg ulPatSize = 8*8*cpp; 11277fe5393cSmrg 11287fe5393cSmrg if (!pAST->MMIO2D) 112915fb4814Smrg { 11307fe5393cSmrg /* Write to CMDQ */ 1131621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*(1 + ulPatSize/4)); 113215fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 113315fb4814Smrg pSingleCMD++; 113415fb4814Smrg for (i=0; i<8; i++) 113515fb4814Smrg { 113615fb4814Smrg for (j=0; j<8*cpp/4; j++) 113715fb4814Smrg { 113815fb4814Smrg ASTSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++))); 11397fe5393cSmrg pSingleCMD++; 11407fe5393cSmrg } 1141de78e416Smrg } 11427fe5393cSmrg 1143de78e416Smrg /* Update Write Pointer */ 1144de78e416Smrg mUpdateWritePointer; 11457fe5393cSmrg 114615fb4814Smrg } 114715fb4814Smrg else 11487fe5393cSmrg { 114915fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 115015fb4814Smrg for (i=0; i<8; i++) 115115fb4814Smrg { 115215fb4814Smrg for (j=0; j<8*cpp/4; j++) 115315fb4814Smrg { 115415fb4814Smrg ASTSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++))); 11557fe5393cSmrg } 11567fe5393cSmrg } 11577fe5393cSmrg 115815fb4814Smrg } 115915fb4814Smrg 116015fb4814Smrg} /* end of ASTSetupForColor8x8PatternFill */ 11617fe5393cSmrg 116215fb4814Smrgstatic void 116315fb4814SmrgASTSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty, 116415fb4814Smrg int dst_x, int dst_y, int width, int height) 116515fb4814Smrg{ 116615fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 116715fb4814Smrg PKT_SC *pSingleCMD; 1168de78e416Smrg ULONG dstbase, cmdreg; 1169de78e416Smrg int delta_y = 0; 11707fe5393cSmrg 11717fe5393cSmrg/* 117215fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentColor8x8PatternFillRect\n"); 117315fb4814Smrg*/ 11747fe5393cSmrg 117515fb4814Smrg /* Modify Reg. Value */ 117615fb4814Smrg cmdreg = pAST->ulCMDReg; 117715fb4814Smrg if (pAST->EnableClip) 1178de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1179de78e416Smrg else 11807fe5393cSmrg cmdreg &= ~CMD_ENABLE_CLIP; 118115fb4814Smrg dstbase = 0; 118215fb4814Smrg 11837fe5393cSmrg if (dst_y >= pScrn->virtualY) 11847fe5393cSmrg { 1185de78e416Smrg delta_y = dst_y; 118615fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 118715fb4814Smrg dst_y=0; 118815fb4814Smrg } 1189de78e416Smrg 11907fe5393cSmrg if (pAST->EnableClip) 1191de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 11927fe5393cSmrg 11937fe5393cSmrg if (!pAST->MMIO2D) 11947fe5393cSmrg { 11957fe5393cSmrg /* Write to CMDQ */ 1196621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*4); 119715fb4814Smrg 119815fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 11997fe5393cSmrg pSingleCMD++; 120015fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 12017fe5393cSmrg pSingleCMD++; 120215fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 12037fe5393cSmrg pSingleCMD++; 12047fe5393cSmrg ASTSetupCMDReg(pSingleCMD, cmdreg); 12057fe5393cSmrg 120615fb4814Smrg /* Update Write Pointer */ 120715fb4814Smrg mUpdateWritePointer; 12087fe5393cSmrg 120915fb4814Smrg } 121015fb4814Smrg else 12117fe5393cSmrg { 121215fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 121315fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 121415fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 12157fe5393cSmrg ASTSetupCMDReg_MMIO(cmdreg); 12167fe5393cSmrg 1217621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 12187fe5393cSmrg } 12197fe5393cSmrg 122015fb4814Smrg} /* ASTSubsequentColor8x8PatternFillRect */ 122115fb4814Smrg 122215fb4814Smrg/* CPU to Screen Expand */ 122315fb4814Smrgstatic void 122415fb4814SmrgASTSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 122515fb4814Smrg int fg, int bg, 122615fb4814Smrg int rop, unsigned int planemask) 122715fb4814Smrg{ 122815fb4814Smrg 122915fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 123015fb4814Smrg PKT_SC *pSingleCMD; 123115fb4814Smrg ULONG cmdreg; 123215fb4814Smrg 12337fe5393cSmrg/* 123415fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForCPUToScreenColorExpandFill\n"); 12357fe5393cSmrg*/ 123615fb4814Smrg /* Modify Reg. Value */ 123715fb4814Smrg cmdreg = CMD_COLOREXP; 123815fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 123915fb4814Smrg { 124015fb4814Smrg case 8: 124115fb4814Smrg cmdreg |= CMD_COLOR_08; 124215fb4814Smrg break; 124315fb4814Smrg case 15: 124415fb4814Smrg case 16: 124515fb4814Smrg cmdreg |= CMD_COLOR_16; 12467fe5393cSmrg break; 124715fb4814Smrg case 24: 124815fb4814Smrg case 32: 124915fb4814Smrg cmdreg |= CMD_COLOR_32; 12507fe5393cSmrg break; 125115fb4814Smrg } 125215fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 125315fb4814Smrg if(bg == -1) { 12547fe5393cSmrg cmdreg |= CMD_FONT_TRANSPARENT; 125515fb4814Smrg bg = 0; 12567fe5393cSmrg } 125715fb4814Smrg pAST->ulCMDReg = cmdreg; 12587fe5393cSmrg 12597fe5393cSmrg if (!pAST->MMIO2D) 126015fb4814Smrg { 126115fb4814Smrg /* Write to CMDQ */ 1262621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3); 126315fb4814Smrg 126415fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 126515fb4814Smrg pSingleCMD++; 12667fe5393cSmrg ASTSetupFG(pSingleCMD, fg); 126715fb4814Smrg pSingleCMD++; 12687fe5393cSmrg ASTSetupBG(pSingleCMD, bg); 1269de78e416Smrg 1270de78e416Smrg /* Update Write Pointer */ 1271de78e416Smrg mUpdateWritePointer; 12727fe5393cSmrg 127315fb4814Smrg } 127415fb4814Smrg else 127515fb4814Smrg { 127615fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 12777fe5393cSmrg ASTSetupFG_MMIO(fg); 12787fe5393cSmrg ASTSetupBG_MMIO(bg); 12797fe5393cSmrg 128015fb4814Smrg } 12817fe5393cSmrg 128215fb4814Smrg} 12837fe5393cSmrg 128415fb4814Smrgstatic void 128515fb4814SmrgASTSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 128615fb4814Smrg int dst_x, int dst_y, 128715fb4814Smrg int width, int height, int offset) 128815fb4814Smrg{ 128915fb4814Smrg 129015fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 129115fb4814Smrg PKT_SC *pSingleCMD; 129215fb4814Smrg ULONG dstbase, cmdreg; 1293de78e416Smrg int delta_y = 0; 129415fb4814Smrg 12957fe5393cSmrg/* 129615fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentCPUToScreenColorExpandFill\n"); 129715fb4814Smrg*/ 12987fe5393cSmrg 129915fb4814Smrg /* Modify Reg. Value */ 130015fb4814Smrg cmdreg = pAST->ulCMDReg; 130115fb4814Smrg if (pAST->EnableClip) 1302de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1303de78e416Smrg else 13047fe5393cSmrg cmdreg &= ~CMD_ENABLE_CLIP; 130515fb4814Smrg dstbase = 0; 130615fb4814Smrg 13077fe5393cSmrg if (dst_y >= pScrn->virtualY) 13087fe5393cSmrg { 1309de78e416Smrg delta_y = dst_y; 131015fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 131115fb4814Smrg dst_y=0; 131215fb4814Smrg } 1313de78e416Smrg 13147fe5393cSmrg if (pAST->EnableClip) 1315de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 13167fe5393cSmrg 13177fe5393cSmrg if (!pAST->MMIO2D) 13187fe5393cSmrg { 13197fe5393cSmrg /* Write to CMDQ */ 1320621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 132115fb4814Smrg 13227fe5393cSmrg ASTSetupSRCPitch(pSingleCMD, ((width+7)/8)); 13237fe5393cSmrg pSingleCMD++; 132415fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 13257fe5393cSmrg pSingleCMD++; 132615fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 13277fe5393cSmrg pSingleCMD++; 132815fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 13297fe5393cSmrg pSingleCMD++; 13307fe5393cSmrg ASTSetupCMDReg(pSingleCMD, cmdreg); 13317fe5393cSmrg 133215fb4814Smrg /* Update Write Pointer */ 133315fb4814Smrg mUpdateWritePointer; 13347fe5393cSmrg 133515fb4814Smrg } 133615fb4814Smrg else 13377fe5393cSmrg { 13387fe5393cSmrg ASTSetupSRCPitch_MMIO((width+7)/8); 133915fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 134015fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 134115fb4814Smrg ASTSetupSRCXY_MMIO(0, 0); 13427fe5393cSmrg 134315fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 13447fe5393cSmrg ASTSetupCMDReg_MMIO(cmdreg); 13457fe5393cSmrg 1346621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 13477fe5393cSmrg 134815fb4814Smrg } 13497fe5393cSmrg 135015fb4814Smrg} 135115fb4814Smrg 135215fb4814Smrg 135315fb4814Smrg/* Screen to Screen Color Expand */ 135415fb4814Smrgstatic void 135515fb4814SmrgASTSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 135615fb4814Smrg int fg, int bg, 135715fb4814Smrg int rop, unsigned int planemask) 135815fb4814Smrg{ 135915fb4814Smrg 136015fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 136115fb4814Smrg PKT_SC *pSingleCMD; 136215fb4814Smrg ULONG cmdreg; 136315fb4814Smrg 13647fe5393cSmrg/* 136515fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetupForScreenToScreenColorExpandFill\n"); 136615fb4814Smrg*/ 13677fe5393cSmrg 136815fb4814Smrg /* Modify Reg. Value */ 136915fb4814Smrg cmdreg = CMD_ENHCOLOREXP; 137015fb4814Smrg switch (pAST->VideoModeInfo.bitsPerPixel) 137115fb4814Smrg { 137215fb4814Smrg case 8: 137315fb4814Smrg cmdreg |= CMD_COLOR_08; 137415fb4814Smrg break; 137515fb4814Smrg case 15: 137615fb4814Smrg case 16: 137715fb4814Smrg cmdreg |= CMD_COLOR_16; 13787fe5393cSmrg break; 137915fb4814Smrg case 24: 138015fb4814Smrg case 32: 138115fb4814Smrg cmdreg |= CMD_COLOR_32; 13827fe5393cSmrg break; 138315fb4814Smrg } 138415fb4814Smrg cmdreg |= (ASTXAAPatternROP[rop] << 8); 138515fb4814Smrg if(bg == -1) { 13867fe5393cSmrg cmdreg |= CMD_FONT_TRANSPARENT; 138715fb4814Smrg bg = 0; 13887fe5393cSmrg } 138915fb4814Smrg pAST->ulCMDReg = cmdreg; 13907fe5393cSmrg 13917fe5393cSmrg if (!pAST->MMIO2D) 139215fb4814Smrg { 139315fb4814Smrg /* Write to CMDQ */ 1394621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*3); 139515fb4814Smrg 139615fb4814Smrg ASTSetupDSTPitchHeight(pSingleCMD, pAST->VideoModeInfo.ScreenPitch, -1); 139715fb4814Smrg pSingleCMD++; 13987fe5393cSmrg ASTSetupFG(pSingleCMD, fg); 139915fb4814Smrg pSingleCMD++; 14007fe5393cSmrg ASTSetupBG(pSingleCMD, bg); 1401de78e416Smrg 1402de78e416Smrg /* Update Write Pointer */ 1403de78e416Smrg mUpdateWritePointer; 14047fe5393cSmrg 140515fb4814Smrg } 140615fb4814Smrg else 140715fb4814Smrg { 140815fb4814Smrg ASTSetupDSTPitchHeight_MMIO(pAST->VideoModeInfo.ScreenPitch, -1); 14097fe5393cSmrg ASTSetupFG_MMIO(fg); 14107fe5393cSmrg ASTSetupBG_MMIO(bg); 14117fe5393cSmrg 141215fb4814Smrg } 14137fe5393cSmrg 141415fb4814Smrg} 141515fb4814Smrg 141615fb4814Smrg 141715fb4814Smrg 141815fb4814Smrgstatic void 141915fb4814SmrgASTSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, 142015fb4814Smrg int dst_x, int dst_y, int width, int height, 142115fb4814Smrg int src_x, int src_y, int offset) 142215fb4814Smrg{ 142315fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 142415fb4814Smrg PKT_SC *pSingleCMD; 142515fb4814Smrg ULONG srcbase, dstbase, cmdreg; 142615fb4814Smrg USHORT srcpitch; 1427de78e416Smrg int delta_y = 0; 142815fb4814Smrg 14297fe5393cSmrg/* 143015fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentScreenToScreenColorExpandFill\n"); 143115fb4814Smrg*/ 14327fe5393cSmrg 143315fb4814Smrg /* Modify Reg. Value */ 143415fb4814Smrg cmdreg = pAST->ulCMDReg; 143515fb4814Smrg if (pAST->EnableClip) 1436de78e416Smrg cmdreg |= CMD_ENABLE_CLIP; 1437de78e416Smrg else 14387fe5393cSmrg cmdreg &= ~CMD_ENABLE_CLIP; 143915fb4814Smrg dstbase = 0; 14407fe5393cSmrg if (dst_y >= pScrn->virtualY) 14417fe5393cSmrg { 1442de78e416Smrg delta_y = dst_y; 144315fb4814Smrg dstbase=pAST->VideoModeInfo.ScreenPitch*dst_y; 144415fb4814Smrg dst_y=0; 144515fb4814Smrg } 14467fe5393cSmrg srcbase = pAST->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x; 144715fb4814Smrg srcpitch = (pScrn->displayWidth+7)/8; 1448de78e416Smrg 14497fe5393cSmrg if (pAST->EnableClip) 1450de78e416Smrg ASTSetHWClipping(pScrn, delta_y); 14517fe5393cSmrg 14527fe5393cSmrg if (!pAST->MMIO2D) 14537fe5393cSmrg { 14547fe5393cSmrg /* Write to CMDQ */ 1455621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*6); 145615fb4814Smrg 145715fb4814Smrg ASTSetupSRCBase(pSingleCMD, srcbase); 14587fe5393cSmrg pSingleCMD++; 14597fe5393cSmrg ASTSetupSRCPitch(pSingleCMD,srcpitch); 14607fe5393cSmrg pSingleCMD++; 146115fb4814Smrg ASTSetupDSTBase(pSingleCMD, dstbase); 14627fe5393cSmrg pSingleCMD++; 146315fb4814Smrg ASTSetupDSTXY(pSingleCMD, dst_x, dst_y); 14647fe5393cSmrg pSingleCMD++; 146515fb4814Smrg ASTSetupRECTXY(pSingleCMD, width, height); 14667fe5393cSmrg pSingleCMD++; 14677fe5393cSmrg ASTSetupCMDReg(pSingleCMD, cmdreg); 14687fe5393cSmrg 146915fb4814Smrg /* Update Write Pointer */ 147015fb4814Smrg mUpdateWritePointer; 14717fe5393cSmrg 147215fb4814Smrg } 147315fb4814Smrg else 14747fe5393cSmrg { 14757fe5393cSmrg ASTSetupSRCBase_MMIO(srcbase); 14767fe5393cSmrg ASTSetupSRCPitch_MMIO(srcpitch); 147715fb4814Smrg ASTSetupDSTBase_MMIO(dstbase); 147815fb4814Smrg ASTSetupDSTXY_MMIO(dst_x, dst_y); 147915fb4814Smrg ASTSetupRECTXY_MMIO(width, height); 14807fe5393cSmrg ASTSetupCMDReg_MMIO(cmdreg); 14817fe5393cSmrg 1482621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 14837fe5393cSmrg 148415fb4814Smrg } 14857fe5393cSmrg 148615fb4814Smrg} 148715fb4814Smrg 14887fe5393cSmrg 148915fb4814Smrg/* Clipping */ 149015fb4814Smrgstatic void 1491de78e416SmrgASTSetHWClipping(ScrnInfoPtr pScrn, int delta_y) 149215fb4814Smrg{ 149315fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 149415fb4814Smrg PKT_SC *pSingleCMD; 1495de78e416Smrg 14967fe5393cSmrg if (!pAST->MMIO2D) 149715fb4814Smrg { 149815fb4814Smrg /* Write to CMDQ */ 1499621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*2); 150015fb4814Smrg 1501de78e416Smrg ASTSetupCLIP1(pSingleCMD, pAST->clip_left, pAST->clip_top - delta_y); 150215fb4814Smrg pSingleCMD++; 1503de78e416Smrg ASTSetupCLIP2(pSingleCMD, pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1); 15047fe5393cSmrg 1505de78e416Smrg /* Update Write Pointer */ 1506de78e416Smrg mUpdateWritePointer; 15077fe5393cSmrg 150815fb4814Smrg } 150915fb4814Smrg else 151015fb4814Smrg { 1511de78e416Smrg ASTSetupCLIP1_MMIO(pAST->clip_left, pAST->clip_top - delta_y); 15127fe5393cSmrg ASTSetupCLIP2_MMIO(pAST->clip_right + 1, pAST->clip_bottom - delta_y + 1); 151315fb4814Smrg } 15147fe5393cSmrg 15157fe5393cSmrg} 1516de78e416Smrg 1517de78e416Smrgstatic void 1518de78e416SmrgASTSetClippingRectangle(ScrnInfoPtr pScrn, 1519de78e416Smrg int left, int top, int right, int bottom) 1520de78e416Smrg{ 15217fe5393cSmrg 1522de78e416Smrg ASTRecPtr pAST = ASTPTR(pScrn); 1523de78e416Smrg PKT_SC *pSingleCMD; 15247fe5393cSmrg/* 1525de78e416Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSetClippingRectangle\n"); 15267fe5393cSmrg*/ 1527de78e416Smrg pAST->EnableClip = TRUE; 15287fe5393cSmrg 1529de78e416Smrg pAST->clip_left = left; 1530de78e416Smrg pAST->clip_top = top; 1531de78e416Smrg pAST->clip_right = right; 1532de78e416Smrg pAST->clip_bottom = bottom; 15337fe5393cSmrg 153415fb4814Smrg} 153515fb4814Smrg 153615fb4814Smrgstatic void 153715fb4814SmrgASTDisableClipping(ScrnInfoPtr pScrn) 153815fb4814Smrg{ 153915fb4814Smrg ASTRecPtr pAST = ASTPTR(pScrn); 15407fe5393cSmrg/* 154115fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTDisableClipping\n"); 15427fe5393cSmrg*/ 154315fb4814Smrg pAST->EnableClip = FALSE; 154415fb4814Smrg} 154515fb4814Smrg 1546b410ddbeSmrgstatic void AIPSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 1547b410ddbeSmrg int x1, int y1, int x2, int y2, int flags) 1548b410ddbeSmrg{ 15497fe5393cSmrg 1550b410ddbeSmrg ASTRecPtr pAST = ASTPTR(pScrn); 1551b410ddbeSmrg PKT_SC *pSingleCMD; 1552b410ddbeSmrg ULONG dstbase, ulCommand; 15537fe5393cSmrg ULONG miny, maxy; 1554b410ddbeSmrg/* 1555b410ddbeSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentSolidTwoPointLine\n"); 15567fe5393cSmrg*/ 1557b410ddbeSmrg 1558b410ddbeSmrg /* Modify Reg. Value */ 1559b410ddbeSmrg ulCommand = (pAST->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE; 1560b410ddbeSmrg if(flags & OMIT_LAST) 1561b410ddbeSmrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 1562b410ddbeSmrg else 1563b410ddbeSmrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 1564b410ddbeSmrg if (pAST->EnableClip) 1565b410ddbeSmrg ulCommand |= CMD_ENABLE_CLIP; 1566b410ddbeSmrg else 15677fe5393cSmrg ulCommand &= ~CMD_ENABLE_CLIP; 1568b410ddbeSmrg dstbase = 0; 1569b410ddbeSmrg miny = (y1 > y2) ? y2 : y1; 1570b410ddbeSmrg maxy = (y1 > y2) ? y1 : y2; 1571b410ddbeSmrg if(maxy >= pScrn->virtualY) { 1572b410ddbeSmrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 1573b410ddbeSmrg y1 -= miny; 1574b410ddbeSmrg y2 -= miny; 1575b410ddbeSmrg } 1576b410ddbeSmrg 15777fe5393cSmrg if (!pAST->MMIO2D) 15787fe5393cSmrg { 15797fe5393cSmrg /* Write to CMDQ */ 1580621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 1581b410ddbeSmrg 1582b410ddbeSmrg ASTSetupDSTBase(pSingleCMD, dstbase); 15837fe5393cSmrg pSingleCMD++; 1584b410ddbeSmrg AIPSetupLineXY(pSingleCMD, x1, y1); 1585b410ddbeSmrg pSingleCMD++; 1586b410ddbeSmrg AIPSetupLineXY2(pSingleCMD, x2, y2); 1587b410ddbeSmrg pSingleCMD++; 1588b410ddbeSmrg AIPSetupLineNumber(pSingleCMD, 0); 15897fe5393cSmrg pSingleCMD++; 15907fe5393cSmrg ASTSetupCMDReg(pSingleCMD, ulCommand); 15917fe5393cSmrg 1592b410ddbeSmrg /* Update Write Pointer */ 15937fe5393cSmrg mUpdateWritePointer; 1594b410ddbeSmrg 1595b410ddbeSmrg /* Patch KDE pass abnormal point, ycchen@052507 */ 1596621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 15977fe5393cSmrg 1598b410ddbeSmrg } 1599b410ddbeSmrg else 16007fe5393cSmrg { 1601b410ddbeSmrg ASTSetupDSTBase_MMIO(dstbase); 1602b410ddbeSmrg AIPSetupLineXY_MMIO(x1, y1); 1603b410ddbeSmrg AIPSetupLineXY2_MMIO(x2, y2); 1604b410ddbeSmrg AIPSetupLineNumber_MMIO(0); 16057fe5393cSmrg ASTSetupCMDReg_MMIO(ulCommand); 16067fe5393cSmrg 1607621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 16087fe5393cSmrg 1609b410ddbeSmrg } 1610b410ddbeSmrg 16117fe5393cSmrg 1612b410ddbeSmrg} /* end of AIPSubsequentSolidTwoPointLine */ 1613b410ddbeSmrg 1614b410ddbeSmrgstatic void 1615b410ddbeSmrgAIPSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 1616b410ddbeSmrg int x1, int y1, int x2, int y2, 1617b410ddbeSmrg int flags, int phase) 1618b410ddbeSmrg{ 16197fe5393cSmrg 1620b410ddbeSmrg ASTRecPtr pAST = ASTPTR(pScrn); 1621b410ddbeSmrg PKT_SC *pSingleCMD; 16227fe5393cSmrg ULONG dstbase, ulCommand; 16237fe5393cSmrg ULONG miny, maxy; 1624b410ddbeSmrg/* 1625b410ddbeSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ASTSubsequentDashedTwoPointLine\n"); 16267fe5393cSmrg*/ 1627b410ddbeSmrg 1628b410ddbeSmrg /* Modify Reg. Value */ 1629b410ddbeSmrg ulCommand = pAST->ulCMDReg | CMD_NORMAL_LINE; 1630b410ddbeSmrg if(flags & OMIT_LAST) 1631b410ddbeSmrg ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; 1632b410ddbeSmrg else 1633b410ddbeSmrg ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; 1634b410ddbeSmrg if (pAST->EnableClip) 1635b410ddbeSmrg ulCommand |= CMD_ENABLE_CLIP; 1636b410ddbeSmrg else 16377fe5393cSmrg ulCommand &= ~CMD_ENABLE_CLIP; 16387fe5393cSmrg dstbase = 0; 1639b410ddbeSmrg miny = (y1 > y2) ? y2 : y1; 1640b410ddbeSmrg maxy = (y1 > y2) ? y1 : y2; 1641b410ddbeSmrg if(maxy >= pScrn->virtualY) { 1642b410ddbeSmrg dstbase = pAST->VideoModeInfo.ScreenPitch * miny; 1643b410ddbeSmrg y1 -= miny; 1644b410ddbeSmrg y2 -= miny; 1645b410ddbeSmrg } 1646b410ddbeSmrg 16477fe5393cSmrg if (!pAST->MMIO2D) 16487fe5393cSmrg { 16497fe5393cSmrg /* Write to CMDQ */ 1650621ff18cSmrg pSingleCMD = (PKT_SC *) pASTjRequestCMDQ(pAST, PKT_SINGLE_LENGTH*5); 1651b410ddbeSmrg 1652b410ddbeSmrg ASTSetupDSTBase(pSingleCMD, dstbase); 16537fe5393cSmrg pSingleCMD++; 1654b410ddbeSmrg AIPSetupLineXY(pSingleCMD, x1, y1); 1655b410ddbeSmrg pSingleCMD++; 1656b410ddbeSmrg AIPSetupLineXY2(pSingleCMD, x2, y2); 1657b410ddbeSmrg pSingleCMD++; 1658b410ddbeSmrg AIPSetupLineNumber(pSingleCMD, 0); 16597fe5393cSmrg pSingleCMD++; 16607fe5393cSmrg ASTSetupCMDReg(pSingleCMD, ulCommand); 16617fe5393cSmrg 1662b410ddbeSmrg /* Update Write Pointer */ 1663b410ddbeSmrg mUpdateWritePointer; 1664b410ddbeSmrg 1665b410ddbeSmrg /* Patch KDE pass abnormal point, ycchen@052507 */ 1666621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 16677fe5393cSmrg 1668b410ddbeSmrg } 1669b410ddbeSmrg else 16707fe5393cSmrg { 1671b410ddbeSmrg ASTSetupDSTBase_MMIO(dstbase); 1672b410ddbeSmrg AIPSetupLineXY_MMIO(x1, y1); 1673b410ddbeSmrg AIPSetupLineXY2_MMIO(x2, y2); 1674b410ddbeSmrg AIPSetupLineNumber_MMIO(0); 1675b410ddbeSmrg ASTSetupCMDReg_MMIO(ulCommand); 16767fe5393cSmrg 1677621ff18cSmrg vASTWaitEngIdle(pScrn, pAST); 16787fe5393cSmrg 1679b410ddbeSmrg } 16807fe5393cSmrg 1681b410ddbeSmrg} 16827fe5393cSmrg#endif /* HAVE_XAA_H */ 1683b410ddbeSmrg 1684b534f209Smrg#ifdef AstVideo 1685b534f209Smrg/* 1686b534f209Smrg * Video Part 1687b534f209Smrg * by ic_yang 1688b534f209Smrg */ 1689b534f209Smrg#include "fourcc.h" 1690b534f209Smrg 1691b534f209Smrgvoid ASTDisplayVideo(ScrnInfoPtr pScrn, ASTPortPrivPtr pPriv, RegionPtr clipBoxes, int id) 1692b534f209Smrg{ 1693b534f209Smrg ASTPtr pAST = ASTPTR(pScrn); 16947fe5393cSmrg int nBoxs; 1695b534f209Smrg int ScaleFactorH, ScaleFactorV; 1696b534f209Smrg ULONG InitScaleFactorH, InitScaleFactorV; 1697b534f209Smrg BURSTSCALECMD CopyCmd = {0}; 1698b534f209Smrg PBURSTSCALECMD pCopyCmd = NULL; 1699b534f209Smrg float fScaleX = 0, fScaleY = 0; 1700b534f209Smrg xRectangle rect; 1701b534f209Smrg BoxPtr pBox = NULL; 1702b534f209Smrg short lSrcX, lSrcY; 1703b534f209Smrg ULONG dwCmd = 0; 1704b534f209Smrg int i; 17057fe5393cSmrg 1706b534f209Smrg pBox = REGION_RECTS(clipBoxes); 1707b534f209Smrg nBoxs = REGION_NUM_RECTS(clipBoxes); 1708b534f209Smrg 1709b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "MMIO=%x,pBox=%x, nBoxs=%x\n", pAST->MMIO2D, pBox, nBoxs); 17107fe5393cSmrg 1711b534f209Smrg if(0==pPriv->drw_w || 0==pPriv->drw_h) 1712b534f209Smrg { 1713b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drwx=%x, drwy=%x\n", pPriv->drw_w, pPriv->drw_h); 1714b534f209Smrg return; 1715b534f209Smrg } 1716b534f209Smrg 1717b534f209Smrg /* calc scaling factor */ 1718b534f209Smrg fScaleX = (float)pPriv->src_w /(float)pPriv->drw_w; 1719b534f209Smrg fScaleY = (float)pPriv->src_h /(float)pPriv->drw_h; 17207fe5393cSmrg 1721b534f209Smrg if (pPriv->src_w == pPriv->drw_w) 1722b534f209Smrg ScaleFactorH = 0x8000; 1723b534f209Smrg else 1724b534f209Smrg ScaleFactorH = (ULONG)((pPriv->src_w-1)*0x8000)/pPriv->drw_w; 1725b534f209Smrg 1726b534f209Smrg if (pPriv->src_h == pPriv->drw_h) 1727b534f209Smrg { 1728b534f209Smrg ScaleFactorV = 0x8000; 1729b534f209Smrg dwCmd |= SCALE_EQUAL_VER; /* Setting it save the bandwidtch */ 1730b534f209Smrg } 1731b534f209Smrg else 1732b534f209Smrg { 1733b534f209Smrg ScaleFactorV = (ULONG)((pPriv->src_h-1)*0x8000)/pPriv->drw_h; 1734b534f209Smrg } 1735b534f209Smrg 1736b534f209Smrg if (pPriv->drw_w >= pPriv->src_w) 1737b534f209Smrg InitScaleFactorH = 0; 1738b534f209Smrg else 1739b534f209Smrg InitScaleFactorH = 0x4000; 1740b534f209Smrg 1741b534f209Smrg if (pPriv->drw_h >= pPriv->src_h) 1742b534f209Smrg InitScaleFactorV = 0; 1743b534f209Smrg else 1744b534f209Smrg InitScaleFactorV = 0x4000; 1745b534f209Smrg 17467fe5393cSmrg switch(pScrn->bitsPerPixel) 1747b534f209Smrg { 1748b534f209Smrg case 32: 1749b534f209Smrg dwCmd = CMD_COLOR_32; 1750b534f209Smrg break; 1751b534f209Smrg case 16: 1752b534f209Smrg dwCmd = CMD_COLOR_16; 1753b534f209Smrg break; 1754b534f209Smrg case 8: 1755b534f209Smrg dwCmd = CMD_COLOR_08; 1756b534f209Smrg break; 1757b534f209Smrg } 1758b534f209Smrg 1759b534f209Smrg dwCmd |= CMD_TYPE_SCALE; 1760b534f209Smrg if (pPriv->drw_w >= pPriv->src_w) 1761b534f209Smrg dwCmd |= SCALE_SEG_NUM_1; 1762b534f209Smrg else 1763b534f209Smrg dwCmd |= SCALE_SEG_NUM_2; 1764b534f209Smrg 1765b534f209Smrg dwCmd |= SCALE_FORMAT_YUV2RGB; 1766b534f209Smrg switch(id) 1767b534f209Smrg { 1768b534f209Smrg case PIXEL_FMT_YUY2: 17697fe5393cSmrg dwCmd |= YUV_FORMAT_YUYV; 1770b534f209Smrg break; 17717fe5393cSmrg case PIXEL_FMT_UYVY: 17727fe5393cSmrg dwCmd |= YUV_FORMAT_UYVY; 1773b534f209Smrg break; 1774b534f209Smrg default: 1775b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Other pix format:%x\n", id); 1776b534f209Smrg break; 1777b534f209Smrg } 17787fe5393cSmrg 1779b534f209Smrg for(i = 0; i < nBoxs; i++, pBox++) 1780b534f209Smrg { 1781b534f209Smrg rect.x = pBox->x1 - pPriv->drw_x; 1782b534f209Smrg rect.y = pBox->y1 - pPriv->drw_y; 1783b534f209Smrg rect.width = pBox->x2 - pBox->x1; 17847fe5393cSmrg rect.height = pBox->y2 - pBox->y1; 17857fe5393cSmrg 1786b534f209Smrg lSrcX = (ULONG)((float)rect.x * fScaleX + pPriv->src_x + 0.5f); 1787b534f209Smrg lSrcY = (ULONG)((float)rect.y * fScaleY + pPriv->src_y + 0.5f); 17887fe5393cSmrg 1789621ff18cSmrg pCopyCmd = (BURSTSCALECMD*)pASTjRequestCMDQ(pAST, PKT_TYPESCALE_LENGTH); 17907fe5393cSmrg 17917fe5393cSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "pCopyCmd=%p, pBox=%x,%x,%x,%x\n", pCopyCmd, pBox->x1, pBox->y1, pBox->x2, pBox->y2); 17927fe5393cSmrg 1793b534f209Smrg CopyCmd.dwHeader0 = (ULONG) PKT_BURST_CMD_HEADER0 | 1794b534f209Smrg PKT_TYPESCALE_DATALENGTH | 1795b534f209Smrg PKT_TYPESCALE_ADDRSTART | 1796b534f209Smrg BURST_FORCE_CMD; 1797b534f209Smrg 1798b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CopyCmd.dwHeader0=%x\n", CopyCmd.dwHeader0); 1799b534f209Smrg 1800b534f209Smrg CopyCmd.dwSrcPitch = (ULONG)(pPriv->srcPitch << 16); 18017fe5393cSmrg 1802b534f209Smrg CopyCmd.dwDstHeightPitch = (ULONG) ((pAST->VideoModeInfo.ScreenPitch << 16) | 0xFFFF); 18037fe5393cSmrg 18047fe5393cSmrg CopyCmd.dwDstXY = (ULONG) ((pBox->x1 << 16) | (pBox->y1 & 0xFFFF)); 18057fe5393cSmrg CopyCmd.dwSrcXY = (ULONG) ((lSrcX << 16) | (lSrcY & 0xFFFF)); 18067fe5393cSmrg CopyCmd.dwRecHeightWidth = (ULONG) ((rect.width << 16) | rect.height); 18077fe5393cSmrg 1808b534f209Smrg CopyCmd.dwInitScaleFactorH = InitScaleFactorH; 1809b534f209Smrg CopyCmd.dwInitScaleFactorV = InitScaleFactorV; 18107fe5393cSmrg CopyCmd.dwScaleFactorH = ScaleFactorH; 1811b534f209Smrg CopyCmd.dwScaleFactorV = ScaleFactorV; 1812b534f209Smrg 1813b534f209Smrg CopyCmd.dwSrcBaseAddr = pPriv->bufAddr[pPriv->currentBuf]; 1814b534f209Smrg CopyCmd.dwDstBaseAddr = 0; 1815b534f209Smrg CopyCmd.dwCmd = dwCmd; 1816b534f209Smrg CopyCmd.NullData[0] = 0; /* for alignment */ 1817b534f209Smrg memcpy(pCopyCmd, &CopyCmd, sizeof(CopyCmd)); 18187fe5393cSmrg 1819b534f209Smrg mUpdateWritePointer; 18207fe5393cSmrg 18217fe5393cSmrg#if 0 1822b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1823b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8000), 1824b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8004), 1825b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8008), 1826b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x800C)); 1827b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1828b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8010), 1829b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8014), 1830b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8018), 1831b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x801C)); 1832b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1833b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8020), 1834b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8024), 1835b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8028), 1836b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x802C)); 1837b534f209Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%08x, %08x, %08x, %08x\n", 1838b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8030), 1839b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8034), 1840b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x8038), 1841b534f209Smrg *(ULONG *)(pAST->MMIOVirtualAddr+0x803C)); 1842b534f209Smrg#endif 1843b534f209Smrg 1844b534f209Smrg } /* End of for-loop */ 18457fe5393cSmrg 1846b534f209Smrg} /* ASTDisplayVideo */ 1847b534f209Smrg#endif /* AstVideo */ 1848b534f209Smrg 184915fb4814Smrg#endif /* end of Accel_2D */ 1850