void SMI_GEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file) { SMIPtr pSmi = SMIPTR(pScrn); CARD8 tmp; ENTER_PROC("SMI_GEReset"); if (from_timeout) { if (pSmi->GEResetCnt++ < 10 || xf86GetVerbosity() > 1) { xf86DrvMsg(pScrn->scrnIndex,X_INFO,"\tSMI_GEReset called from %s line %d\n", file, line); } } else { WaitIdleEmpty(); } tmp = VGAIN8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x15); VGAOUT8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x15, tmp | 0x30); WaitIdleEmpty(); VGAOUT8_INDEX(pSmi, VGA_SEQ_INDEX, VGA_SEQ_DATA, 0x15, tmp); SMI_EngineReset(pScrn); LEAVE_PROC("SMI_GEReset"); }
static void SMI_SetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, int rop, unsigned int planemask, int trans_color) { SMIPtr pSmi = SMIPTR(pScrn); ENTER_PROC("SMI_SetupForColor8x8PatternFill"); DEBUG((VERBLEV, "patx=%d paty=%d rop=%02X trans_color=%08X\n", patx, paty, rop, trans_color)); pSmi->AccelCmd = XAAPatternROP[rop] | SMI_BITBLT | SMI_COLOR_PATTERN | SMI_START_ENGINE; if (pScrn->bitsPerPixel <= 16) { /* PDR#950 */ CARD8* pattern = pSmi->FBBase + (patx + paty * pSmi->Stride) * pSmi->Bpp; WaitIdleEmpty(); WRITE_DPR(pSmi, 0x0C, SMI_BITBLT | SMI_COLOR_PATTERN); memcpy(pSmi->DataPortBase, pattern, 8 * pSmi->Bpp * 8); } else { if (pScrn->bitsPerPixel == 24) { patx *= 3; if (pSmi->Chipset == SMI_LYNX) { paty *= 3; } } WaitQueue(1); WRITE_DPR(pSmi, 0x00, (patx << 16) | (paty & 0xFFFF)); } if (trans_color == -1) { pSmi->AccelCmd |= SMI_TRANSPARENT_SRC | SMI_TRANSPARENT_PXL; WaitQueue(1); WRITE_DPR(pSmi, 0x20, trans_color); } if (pSmi->ClipTurnedOn) { WaitQueue(1); WRITE_DPR(pSmi, 0x2C, pSmi->ScissorsLeft); pSmi->ClipTurnedOn = FALSE; } LEAVE_PROC("SMI_SetupForColor8x8PatternFill"); }
/* The sync function for the GE */ void SMI_AccelSync(ScrnInfoPtr pScrn) { SMIPtr pSmi = SMIPTR(pScrn); ENTER_PROC("SMI_AccelSync"); WaitIdleEmpty(); /* #161 */ LEAVE_PROC("SMI_AccelSync"); }
/******************************************************************************\ |* SMI_RefreshArea |*============================================================================= |* |* PARAMETERS: pScrn Pointer to ScrnInfo structure. |* num Number of boxes to refresh. |* pbox Pointer to an array of boxes to refresh. |* |* DESCRIPTION: Refresh a portion of the shadow buffer to the visual screen |* buffer. This is mainly used for rotation purposes. |* y |* RETURNS: Nothing. |* \******************************************************************************/ void SMI_RefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox) { SMIPtr pSmi = SMIPTR(pScrn); int width, height, srcX, srcY, destX, destY; ENTER_PROC("SMI_RefreshArea"); /* #671 */ if (pSmi->polyLines) { pSmi->polyLines = FALSE; return; } if (pSmi->rotate) { /* IF we need to do rotation, setup the hardware here. */ WaitIdleEmpty(); WRITE_DPR(pSmi, 0x10, pSmi->ShadowPitch); WRITE_DPR(pSmi, 0x3C, pSmi->ShadowPitch); WRITE_DPR(pSmi, 0x44, pSmi->FBOffset >> 3); }
void SMI_EngineReset(ScrnInfoPtr pScrn) { SMIPtr pSmi = SMIPTR(pScrn); CARD32 DEDataFormat = 0; int i; int xyAddress[] = { 320, 400, 512, 640, 800, 1024, 1280, 1600, 2048 }; ENTER_PROC("SMI_EngineReset"); pSmi->Stride = (pSmi->width * pSmi->Bpp + 15) & ~15; switch (pScrn->bitsPerPixel) { case 8: DEDataFormat = 0x00000000; break; case 16: pSmi->Stride >>= 1; DEDataFormat = 0x00100000; break; case 24: DEDataFormat = 0x00300000; break; case 32: pSmi->Stride >>= 2; DEDataFormat = 0x00200000; break; } for (i = 0; i < sizeof(xyAddress) / sizeof(xyAddress[0]); i++) { if (pSmi->rotate) { if (xyAddress[i] == pSmi->height) { DEDataFormat |= i << 16; break; } } else { if (xyAddress[i] == pSmi->width) { DEDataFormat |= i << 16; break; } } } WaitIdleEmpty(); WRITE_DPR(pSmi, 0x10, (pSmi->Stride << 16) | pSmi->Stride); WRITE_DPR(pSmi, 0x1C, DEDataFormat); WRITE_DPR(pSmi, 0x24, 0xFFFFFFFF); WRITE_DPR(pSmi, 0x28, 0xFFFFFFFF); WRITE_DPR(pSmi, 0x3C, (pSmi->Stride << 16) | pSmi->Stride); WRITE_DPR(pSmi, 0x40, 0); WRITE_DPR(pSmi, 0x44, 0); SMI_DisableClipping(pScrn); LEAVE_PROC("SMI_EngineReset"); }