/* * Leftover from VIA's code. */ static void viaInitPCIe(VIAPtr pVia) { VIASETREG(0x41c, 0x00100000); VIASETREG(0x420, 0x680A0000); VIASETREG(0x420, 0x02000000); }
/* hide the current cursor */ void viaHideCursor(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); CARD32 temp; switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: if (pVia->pBIOSInfo->FirstCRTC->IsActive) { temp = VIAGETREG(VIA_REG_HI_CONTROL0); VIASETREG(VIA_REG_HI_CONTROL0, temp & 0xFFFFFFFA); } if (pVia->pBIOSInfo->SecondCRTC->IsActive) { temp = VIAGETREG(VIA_REG_HI_CONTROL1); VIASETREG(VIA_REG_HI_CONTROL1, temp & 0xFFFFFFFA); } break; default: temp = VIAGETREG(VIA_REG_ALPHA_CONTROL); /* Hardware cursor disable [bit0] */ VIASETREG(VIA_REG_ALPHA_CONTROL, temp & 0xFFFFFFFA); } }
void viaShowCursor(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: if (pVia->pBIOSInfo->FirstCRTC->IsActive) { VIASETREG(VIA_REG_HI_CONTROL0, 0x36000005); } if (pVia->pBIOSInfo->SecondCRTC->IsActive) { VIASETREG(VIA_REG_HI_CONTROL1, 0xb6000005); } break; default: /*temp = 0x76000005; temp = (1 << 30) | (1 << 29) | (1 << 28) | (1 << 26) | (1 << 25) | (1 << 2) | (1 << 0); */ /* Duoview */ if (pVia->CursorPipe) { /* Mono Cursor Display Path [bit31]: Secondary */ /* FIXME For CLE266 and KM400 try to enable 32x32 cursor size [bit1] */ VIASETREG(VIA_REG_ALPHA_CONTROL, 0xF6000005); } else { /* Mono Cursor Display Path [bit31]: Primary */ VIASETREG(VIA_REG_ALPHA_CONTROL, 0x76000005); } } }
static void ViaXvMCDestroySubpicture(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); int i; volatile ViaXvMCSAreaPriv *sAPriv; XvMCContextPtr pContext = pSubp->context; XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr) pContext->port_priv; viaPortPrivPtr pPriv = (viaPortPrivPtr) portPriv->DevPriv.ptr; ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; for (i = 0; i < VIA_XVMC_MAX_SURFACES; i++) { if (vXvMC->surfaces[i] == pSubp->subpicture_id) { sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); { DRM_CAS_RESULT(__ret); DRM_CAS(&(sAPriv->XvMCSubPicOn[vx->xvmc_port]), i | VIA_XVMC_VALID, 0, __ret); if (!__ret) { /* Turn subpicture off. */ while (VIAGETREG(V_COMPOSE_MODE) & (V1_COMMAND_FIRE | V3_COMMAND_FIRE)) ; VIASETREG(SUBP_CONTROL_STRIDE, VIAGETREG(SUBP_CONTROL_STRIDE) & ~SUBP_HQV_ENABLE); } } drm_bo_free(pScrn, vXvMC->sPrivs[i]->memory_ref); free(vXvMC->sPrivs[i]); vXvMC->nSurfaces--; vXvMC->sPrivs[i] = 0; vXvMC->surfaces[i] = 0; return; } } return; }
/* * Tell XvMC clients that Xv is currently displaying; * return 1 if another client was displaying before. */ static int viaXvMCSetDisplayLock(ScrnInfoPtr pScrn, ViaXvMCXVPriv * vx) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCSAreaPriv *sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); if (vx->xvmc_port > 0) { if ((VIA_XVMC_MAX_SURFACES | VIA_XVMC_VALID) != sAPriv->XvMCDisplaying[vx->xvmc_port]) { sAPriv->XvMCDisplaying[vx->xvmc_port] = (VIA_XVMC_MAX_SURFACES | VIA_XVMC_VALID); } if (sAPriv->XvMCSubPicOn[vx->xvmc_port] & VIA_XVMC_VALID) { sAPriv->XvMCSubPicOn[vx->xvmc_port] = 0; while (VIAGETREG(V_COMPOSE_MODE) & (V1_COMMAND_FIRE | V3_COMMAND_FIRE)) ; VIASETREG(SUBP_CONTROL_STRIDE, VIAGETREG(SUBP_CONTROL_STRIDE) & ~SUBP_HQV_ENABLE); } } return 0; }
/* Set the cursor position to (x,y). X and/or y may be negative indicating that the cursor image is partially offscreen on the left and/or top edges of the screen. */ static void viaSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) { VIAPtr pVia = VIAPTR(pScrn); unsigned xoff, yoff; if (x < 0) { xoff = ((-x) & 0xFE); x = 0; } else { xoff = 0; } if (y < 0) { yoff = ((-y) & 0xFE); y = 0; } else { yoff = 0; } switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: if (pVia->pBIOSInfo->FirstCRTC->IsActive) { VIASETREG(VIA_REG_HI_POS0, ((x << 16) | (y & 0x07ff))); VIASETREG(VIA_REG_HI_OFFSET0, ((xoff << 16) | (yoff & 0x07ff))); } if (pVia->pBIOSInfo->SecondCRTC->IsActive) { VIASETREG(VIA_REG_HI_POS1, ((x << 16) | (y & 0x07ff))); VIASETREG(VIA_REG_HI_OFFSET1, ((xoff << 16) | (yoff & 0x07ff))); } break; default: VIASETREG(VIA_REG_ALPHA_POS, ((x << 16) | (y & 0x07ff))); VIASETREG(VIA_REG_ALPHA_OFFSET, ((xoff << 16) | (yoff & 0x07ff))); } }
Bool viaHWCursorInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); xf86CursorInfoPtr infoPtr; switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: /* FIXME Mono HW Cursors not working */ pVia->hwcursor = FALSE; pVia->CursorARGBSupported = FALSE; pVia->CursorMaxWidth = 32; pVia->CursorMaxHeight = 32; pVia->CursorSize = ((pVia->CursorMaxWidth * pVia->CursorMaxHeight) / 8) * 2; break; default: pVia->CursorARGBSupported = TRUE; pVia->CursorMaxWidth = 64; pVia->CursorMaxHeight = 64; pVia->CursorSize = pVia->CursorMaxWidth * (pVia->CursorMaxHeight + 1) << 2; break; } if (pVia->NoAccel) viaCursorSetFB(pScrn); pVia->cursorMap = pVia->FBBase + pVia->CursorStart; if (pVia->cursorMap == NULL) return FALSE; pVia->cursorOffset = pScrn->fbOffset + pVia->CursorStart; memset(pVia->cursorMap, 0x00, pVia->CursorSize); switch (pVia->Chipset) { case VIA_CX700: /* case VIA_CN750: */ case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: if (pVia->pBIOSInfo->FirstCRTC->IsActive) { pVia->CursorRegControl = VIA_REG_HI_CONTROL0; pVia->CursorRegBase = VIA_REG_HI_BASE0; pVia->CursorRegPos = VIA_REG_HI_POS0; pVia->CursorRegOffset = VIA_REG_HI_OFFSET0; pVia->CursorRegFifo = VIA_REG_HI_FIFO0; pVia->CursorRegTransKey = VIA_REG_HI_TRANSKEY0; } if (pVia->pBIOSInfo->SecondCRTC->IsActive) { pVia->CursorRegControl = VIA_REG_HI_CONTROL1; pVia->CursorRegBase = VIA_REG_HI_BASE1; pVia->CursorRegPos = VIA_REG_HI_POS1; pVia->CursorRegOffset = VIA_REG_HI_OFFSET1; pVia->CursorRegFifo = VIA_REG_HI_FIFO1; pVia->CursorRegTransKey = VIA_REG_HI_TRANSKEY1; } break; default: pVia->CursorRegControl = VIA_REG_ALPHA_CONTROL; pVia->CursorRegBase = VIA_REG_ALPHA_BASE; pVia->CursorRegPos = VIA_REG_ALPHA_POS; pVia->CursorRegOffset = VIA_REG_ALPHA_OFFSET; pVia->CursorRegFifo = VIA_REG_ALPHA_FIFO; pVia->CursorRegTransKey = VIA_REG_ALPHA_TRANSKEY; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAHWCursorInit\n")); infoPtr = xf86CreateCursorInfoRec(); if (!infoPtr) return FALSE; pVia->CursorInfoRec = infoPtr; infoPtr->MaxWidth = pVia->CursorMaxWidth; infoPtr->MaxHeight = pVia->CursorMaxHeight; infoPtr->Flags = (HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1 | HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | 0); infoPtr->SetCursorColors = viaSetCursorColors; infoPtr->SetCursorPosition = viaSetCursorPosition; infoPtr->LoadCursorImage = viaLoadCursorImage; infoPtr->HideCursor = viaHideCursor; infoPtr->ShowCursor = viaShowCursor; infoPtr->UseHWCursor = viaUseHWCursor; /* ARGB Cursor init */ infoPtr->UseHWCursorARGB = viaUseHWCursorARGB; if (pVia->CursorARGBSupported) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "HWCursor ARGB enabled\n")); infoPtr->LoadCursorARGB = viaLoadCursorARGB; } /* Set cursor location in frame buffer. */ VIASETREG(VIA_REG_CURSOR_MODE, pVia->cursorOffset); pVia->CursorPipe = (pVia->pBIOSInfo->Panel->IsActive) ? 1 : 0; /* Init HI_X0 */ VIASETREG(pVia->CursorRegControl, 0); VIASETREG(pVia->CursorRegBase, pVia->cursorOffset); VIASETREG(pVia->CursorRegTransKey, 0); switch (pVia->Chipset) { case VIA_CX700: /* case VIA_CN750: */ case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: if (pVia->pBIOSInfo->FirstCRTC->IsActive) { VIASETREG(VIA_REG_PRIM_HI_INVTCOLOR, 0x00FFFFFF); VIASETREG(VIA_REG_V327_HI_INVTCOLOR, 0x00FFFFFF); VIASETREG(pVia->CursorRegFifo, 0x0D000D0F); } if (pVia->pBIOSInfo->SecondCRTC->IsActive) { VIASETREG(VIA_REG_HI_INVTCOLOR, 0X00FFFFFF); VIASETREG(VIA_REG_ALPHA_PREFIFO, 0xE0000); VIASETREG(pVia->CursorRegFifo, 0xE0F0000); /* Just in case */ VIASETREG(VIA_REG_HI_BASE0, pVia->cursorOffset); } break; default: VIASETREG(VIA_REG_HI_INVTCOLOR, 0X00FFFFFF); VIASETREG(VIA_REG_ALPHA_PREFIFO, 0xE0000); VIASETREG(pVia->CursorRegFifo, 0xE0F0000); } return xf86InitCursor(pScreen, infoPtr); }
void viaCursorRestore(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaCursorRestore\n")); if (pVia->CursorPipe) { VIASETREG(pVia->CursorRegControl, pVia->CursorControl1); } else { VIASETREG(pVia->CursorRegControl, pVia->CursorControl0); } VIASETREG(pVia->CursorRegBase, pVia->cursorOffset); VIASETREG(pVia->CursorRegTransKey, pVia->CursorTransparentKey); switch (pVia->Chipset) { case VIA_CX700: /* case VIA_CN750: */ case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: if (pVia->pBIOSInfo->FirstCRTC->IsActive) { VIASETREG(VIA_REG_PRIM_HI_INVTCOLOR, pVia->CursorPrimHiInvtColor); VIASETREG(VIA_REG_V327_HI_INVTCOLOR, pVia->CursorV327HiInvtColor); } if (pVia->pBIOSInfo->SecondCRTC->IsActive) { /* TODO add real restores here */ VIASETREG(VIA_REG_HI_INVTCOLOR, 0X00FFFFFF); VIASETREG(VIA_REG_ALPHA_PREFIFO, 0xE0000); } VIASETREG(pVia->CursorRegFifo, pVia->CursorFifo); break; default: /* TODO add real restores here */ VIASETREG(VIA_REG_ALPHA_PREFIFO, 0xE0000); VIASETREG(pVia->CursorRegFifo, 0xE0F0000); } }
static void viaInitAgp(VIAPtr pVia) { VIASETREG(VIA_REG_TRANSET, 0x00100000); VIASETREG(VIA_REG_TRANSPACE, 0x00000000); VIASETREG(VIA_REG_TRANSPACE, 0x00333004); VIASETREG(VIA_REG_TRANSPACE, 0x60000000); VIASETREG(VIA_REG_TRANSPACE, 0x61000000); VIASETREG(VIA_REG_TRANSPACE, 0x62000000); VIASETREG(VIA_REG_TRANSPACE, 0x63000000); VIASETREG(VIA_REG_TRANSPACE, 0x64000000); VIASETREG(VIA_REG_TRANSPACE, 0x7D000000); VIASETREG(VIA_REG_TRANSET, 0xfe020000); VIASETREG(VIA_REG_TRANSPACE, 0x00000000); }